{"version":3,"file":"index-a7fcbc09.js","sources":["../../../frontend/node_modules/@vue/shared/dist/shared.esm-bundler.js","../../../frontend/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","../../../frontend/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","../../../frontend/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","../../../frontend/node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js","../../../frontend/node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js","../../../frontend/node_modules/vue/dist/vue.esm-bundler.js","../../../frontend/src/util/vue/_createWebComponent.js","../../../frontend/src/util/vue/_getDataRefs.js","../../../frontend/src/includes/FhSection.vue","../../../frontend/src/transitions/TransitionExpand.vue","../../../frontend/src/components/icons/IconLeftArrow.vue","../../../frontend/src/components/icons/IconRightArrow.vue","../../../frontend/src/components/icons/IconUpArrow.vue","../../../frontend/src/components/icons/IconDownArrow.vue","../../../frontend/src/components/icons/IconDownLeftArrow.vue","../../../frontend/src/components/icons/IconUpLeftArrow.vue","../../../frontend/src/components/icons/IconUpRightArrow.vue","../../../frontend/src/components/icons/IconDownRightArrow.vue","../../../frontend/src/components/icons/IconDownChevron.vue","../../../frontend/src/components/icons/IconUpChevron.vue","../../../frontend/src/components/icons/IconLeftChevron.vue","../../../frontend/src/components/icons/IconRightChevron.vue","../../../frontend/src/components/icons/IconCornerDownLeft.vue","../../../frontend/src/components/icons/IconCornerDownRight.vue","../../../frontend/src/components/icons/IconCornerLeftDown.vue","../../../frontend/src/components/icons/IconCornerLeftUp.vue","../../../frontend/src/components/icons/IconCornerRightDown.vue","../../../frontend/src/components/icons/IconCornerRightUp.vue","../../../frontend/src/components/icons/IconCornerUpLeft.vue","../../../frontend/src/components/icons/IconCornerUpRight.vue","../../../frontend/src/components/icons/IconPlay.vue","../../../frontend/src/components/icons/IconShoppingBag.vue","../../../frontend/src/components/icons/IconShoppingCart.vue","../../../frontend/src/components/icons/IconPackage.vue","../../../frontend/src/components/icons/IconImage.vue","../../../frontend/src/components/icons/IconSolidHeart.vue","../../../frontend/src/components/icons/IconOutlineHeart.vue","../../../frontend/src/components/icons/IconHeartPlus.vue","../../../frontend/src/components/icons/IconShipping.vue","../../../frontend/src/components/icons/IconLock.vue","../../../frontend/src/components/icons/XIcon.vue","../../../frontend/src/components/icons/IconCheck.vue","../../../frontend/src/components/icons/IconSearch.vue","../../../frontend/src/components/icons/IconBrowse.vue","../../../frontend/src/components/icons/IconLightningBolt.vue","../../../frontend/src/components/icons/IconAlertCircle.vue","../../../frontend/src/components/icons/IconInformationCircle.vue","../../../frontend/src/components/icons/IconAlertTriangle.vue","../../../frontend/src/components/icons/IconUser.vue","../../../frontend/src/components/icons/IconMenu.vue","../../../frontend/src/components/icons/IconList.vue","../../../frontend/src/components/icons/IconGallery.vue","../../../frontend/src/components/icons/IconGrid.vue","../../../frontend/src/components/icons/IconPlusSign.vue","../../../frontend/src/components/icons/IconMinusSign.vue","../../../frontend/src/components/icons/IconSlash.vue","../../../frontend/src/components/icons/IconPasswordReveal.vue","../../../frontend/src/components/icons/IconHorizontalEllipse.vue","../../../frontend/src/components/icons/IconVerticalEllipse.vue","../../../frontend/src/components/icons/IconShare.vue","../../../frontend/src/components/icons/IconDownload.vue","../../../frontend/src/components/icons/IconFilter.vue","../../../frontend/src/components/icons/IconTextDocument.vue","../../../frontend/src/components/icons/IconOverlappingSquare.vue","../../../frontend/src/components/icons/IconPercentage.vue","../../../frontend/src/components/icons/IconVideoPlay.vue","../../../frontend/src/components/icons/IconVideoPause.vue","../../../frontend/src/components/icons/IconCalender.vue","../../../frontend/src/components/icons/IconInstagram.vue","../../../frontend/src/components/icons/IconPintrest.vue","../../../frontend/src/components/icons/IconLinkedIn.vue","../../../frontend/src/components/FhIcon.vue","../../../frontend/src/assets/icon-chevron-down.svg","../../../frontend/src/components/FHAccordion/FhAccordionItem.vue","../../../frontend/src/components/FHAccordion/FhAccordionItems.vue","../../../frontend/src/components/FhAccordion.vue","../../../frontend/src/components/FhHeading.vue","../../../frontend/src/components/FhLink.vue","../../../frontend/src/components/FhAccountSupport.vue","../../../frontend/src/components/FhAlert.vue","../../../frontend/src/components/FhArtistInfoBanner.vue","../../../frontend/src/components/FhLoader.vue","../../../frontend/src/components/FhButton.vue","../../../frontend/src/components/FhArtStudio.vue","../../../frontend/src/components/FhAwards.vue","../../../frontend/src/assets/four-hands-logo.svg","../../../frontend/src/components/FhBenefits.vue","../../../frontend/node_modules/axios/lib/helpers/bind.js","../../../frontend/node_modules/axios/lib/utils.js","../../../frontend/node_modules/axios/lib/core/AxiosError.js","../../../frontend/node_modules/axios/lib/helpers/null.js","../../../frontend/node_modules/axios/lib/helpers/toFormData.js","../../../frontend/node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../../../frontend/node_modules/axios/lib/helpers/buildURL.js","../../../frontend/node_modules/axios/lib/core/InterceptorManager.js","../../../frontend/node_modules/axios/lib/defaults/transitional.js","../../../frontend/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","../../../frontend/node_modules/axios/lib/platform/browser/classes/FormData.js","../../../frontend/node_modules/axios/lib/platform/browser/classes/Blob.js","../../../frontend/node_modules/axios/lib/platform/browser/index.js","../../../frontend/node_modules/axios/lib/platform/common/utils.js","../../../frontend/node_modules/axios/lib/platform/index.js","../../../frontend/node_modules/axios/lib/helpers/toURLEncodedForm.js","../../../frontend/node_modules/axios/lib/helpers/formDataToJSON.js","../../../frontend/node_modules/axios/lib/defaults/index.js","../../../frontend/node_modules/axios/lib/helpers/parseHeaders.js","../../../frontend/node_modules/axios/lib/core/AxiosHeaders.js","../../../frontend/node_modules/axios/lib/core/transformData.js","../../../frontend/node_modules/axios/lib/cancel/isCancel.js","../../../frontend/node_modules/axios/lib/cancel/CanceledError.js","../../../frontend/node_modules/axios/lib/core/settle.js","../../../frontend/node_modules/axios/lib/helpers/cookies.js","../../../frontend/node_modules/axios/lib/helpers/isAbsoluteURL.js","../../../frontend/node_modules/axios/lib/helpers/combineURLs.js","../../../frontend/node_modules/axios/lib/core/buildFullPath.js","../../../frontend/node_modules/axios/lib/helpers/isURLSameOrigin.js","../../../frontend/node_modules/axios/lib/helpers/parseProtocol.js","../../../frontend/node_modules/axios/lib/helpers/speedometer.js","../../../frontend/node_modules/axios/lib/adapters/xhr.js","../../../frontend/node_modules/axios/lib/adapters/adapters.js","../../../frontend/node_modules/axios/lib/core/dispatchRequest.js","../../../frontend/node_modules/axios/lib/core/mergeConfig.js","../../../frontend/node_modules/axios/lib/env/data.js","../../../frontend/node_modules/axios/lib/helpers/validator.js","../../../frontend/node_modules/axios/lib/core/Axios.js","../../../frontend/node_modules/axios/lib/cancel/CancelToken.js","../../../frontend/node_modules/axios/lib/helpers/spread.js","../../../frontend/node_modules/axios/lib/helpers/isAxiosError.js","../../../frontend/node_modules/axios/lib/helpers/HttpStatusCode.js","../../../frontend/node_modules/axios/lib/axios.js","../../../frontend/src/api/axiosClient.js","../../../frontend/node_modules/@tanstack/query-core/build/lib/subscribable.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/utils.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/focusManager.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/onlineManager.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/retryer.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/logger.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/notifyManager.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/removable.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/query.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/queryCache.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/mutation.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/mutationCache.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/infiniteQueryBehavior.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/queryClient.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/queryObserver.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/infiniteQueryObserver.mjs","../../../frontend/node_modules/@tanstack/query-core/build/lib/mutationObserver.mjs","../../../frontend/node_modules/@tanstack/vue-query/build/lib/utils.mjs","../../../frontend/node_modules/@tanstack/vue-query/build/lib/useQueryClient.mjs","../../../frontend/node_modules/@tanstack/vue-query/build/lib/queryCache.mjs","../../../frontend/node_modules/@tanstack/vue-query/build/lib/mutationCache.mjs","../../../frontend/node_modules/@tanstack/vue-query/build/lib/queryClient.mjs","../../../frontend/node_modules/@tanstack/vue-query/build/lib/vueQueryPlugin.mjs","../../../frontend/node_modules/@tanstack/vue-query/build/lib/useBaseQuery.mjs","../../../frontend/node_modules/@tanstack/vue-query/build/lib/useQuery.mjs","../../../frontend/node_modules/@tanstack/vue-query/build/lib/useInfiniteQuery.mjs","../../../frontend/node_modules/@tanstack/vue-query/build/lib/useMutation.mjs","../../../frontend/src/api/cartApi.js","../../../frontend/src/api/saveforlaterApi.js","../../../frontend/node_modules/pinia/node_modules/vue-demi/lib/index.mjs","../../../frontend/node_modules/pinia/dist/pinia.mjs","../../../frontend/src/stores/NotificationStore.js","../../../frontend/node_modules/@vueuse/shared/index.mjs","../../../frontend/node_modules/@vueuse/core/index.mjs","../../../frontend/src/constants/routes.js","../../../frontend/src/composables/usePaginatedList.js","../../../frontend/src/composables/useViewportSizes.js","../../../frontend/src/components/FhCartCheckoutLayout.vue","../../../frontend/node_modules/lodash/lodash.js","../../../frontend/src/util/formatPrice.js","../../../frontend/src/components/FhImage.vue","../../../frontend/src/components/FhQuantityInput.vue","../../../frontend/src/components/FhCartItem.vue","../../../frontend/node_modules/@headlessui/vue/dist/utils/micro-task.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/disposables.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/use-id.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/dom.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/match.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/env.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/owner.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/focus-management.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/platform.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/use-document-event.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/use-window-event.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/use-outside-click.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/use-resolve-button-type.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/render.js","../../../frontend/node_modules/@headlessui/vue/dist/internal/hidden.js","../../../frontend/node_modules/@headlessui/vue/dist/internal/open-closed.js","../../../frontend/node_modules/@headlessui/vue/dist/keyboard.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/document-ready.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/active-element-history.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/use-event-listener.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/use-tab-direction.js","../../../frontend/node_modules/@headlessui/vue/dist/components/focus-trap/focus-trap.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/use-store.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/store.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/document-overflow/adjust-scrollbar-padding.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/document-overflow/handle-ios-locking.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/document-overflow/prevent-scroll.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/document-overflow/overflow-store.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/document-overflow/use-document-overflow.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/use-inert.js","../../../frontend/node_modules/@headlessui/vue/dist/hooks/use-root-containers.js","../../../frontend/node_modules/@headlessui/vue/dist/internal/portal-force-root.js","../../../frontend/node_modules/@headlessui/vue/dist/internal/stack-context.js","../../../frontend/node_modules/@headlessui/vue/dist/components/description/description.js","../../../frontend/node_modules/@headlessui/vue/dist/components/portal/portal.js","../../../frontend/node_modules/@headlessui/vue/dist/components/dialog/dialog.js","../../../frontend/node_modules/@headlessui/vue/dist/internal/focus-sentinel.js","../../../frontend/node_modules/@headlessui/vue/dist/components/tabs/tabs.js","../../../frontend/node_modules/@headlessui/vue/dist/utils/once.js","../../../frontend/node_modules/@headlessui/vue/dist/components/transitions/utils/transition.js","../../../frontend/node_modules/@headlessui/vue/dist/components/transitions/transition.js","../../../frontend/src/components/FhModal.vue","../../../frontend/node_modules/vue3-popper/dist/popper.esm.js","../../../frontend/src/components/FhTooltip.vue","../../../frontend/src/components/FhCartSummaryLineItem.vue","../../../frontend/src/components/FhCartSummary.vue","../../../frontend/src/components/FhCartPresenter.vue","../../../frontend/src/components/FhPaginationNav.vue","../../../frontend/src/components/FhSaveForLaterPresenter.vue","../../../frontend/src/components/FhSaveForLater.vue","../../../frontend/src/components/FhCart.vue","../../../frontend/src/components/FhPageHeader.vue","../../../frontend/src/components/FhCategoryCard.vue","../../../frontend/src/components/FhCategoryListing.vue","../../../frontend/src/api/checkoutApi.js","../../../frontend/src/constants/strings.js","../../../frontend/src/constants/checkout.js","../../../frontend/src/util/googleAnalytics.js","../../../frontend/src/components/FhCard.vue","../../../frontend/src/constants/countries.js","../../../frontend/src/constants/measurements.js","../../../frontend/src/constants/payment.js","../../../frontend/src/constants/account.js","../../../frontend/src/components/Ecomm/FhPaymentCard/FhPaymentCard.vue","../../../frontend/src/components/FhCheckoutPaymentSectionSummary.vue","../../../frontend/node_modules/@vuelidate/core/dist/index.mjs","../../../frontend/node_modules/@vuelidate/validators/dist/index.mjs","../../../frontend/src/util/getId.js","../../../frontend/src/components/FhFormField.vue","../../../frontend/src/components/FhInput.vue","../../../frontend/src/components/FhCheckoutPoNumber.vue","../../../frontend/src/components/FhCheckoutSection.vue","../../../frontend/src/components/FhCheckoutSelectionSummary.vue","../../../frontend/src/components/FhShippingAddress.vue","../../../frontend/src/components/FhCheckoutShippingDetailsSummary.vue","../../../frontend/src/components/FhCheckoutShippingSectionSummary.vue","../../../frontend/node_modules/node-forge/lib/forge.js","../../../frontend/node_modules/node-forge/lib/baseN.js","../../../frontend/node_modules/node-forge/lib/util.js","../../../frontend/node_modules/node-forge/lib/cipher.js","../../../frontend/node_modules/node-forge/lib/cipherModes.js","../../../frontend/node_modules/node-forge/lib/aes.js","../../../frontend/node_modules/node-forge/lib/oids.js","../../../frontend/node_modules/node-forge/lib/asn1.js","../../../frontend/node_modules/node-forge/lib/md.js","../../../frontend/node_modules/node-forge/lib/hmac.js","../../../frontend/node_modules/node-forge/lib/md5.js","../../../frontend/node_modules/node-forge/lib/pem.js","../../../frontend/node_modules/node-forge/lib/des.js","../../../frontend/__vite-browser-external","../../../frontend/node_modules/node-forge/lib/pbkdf2.js","../../../frontend/node_modules/node-forge/lib/sha256.js","../../../frontend/node_modules/node-forge/lib/prng.js","../../../frontend/node_modules/node-forge/lib/random.js","../../../frontend/node_modules/node-forge/lib/rc2.js","../../../frontend/node_modules/node-forge/lib/jsbn.js","../../../frontend/node_modules/node-forge/lib/sha1.js","../../../frontend/node_modules/node-forge/lib/pkcs1.js","../../../frontend/node_modules/node-forge/lib/prime.js","../../../frontend/node_modules/node-forge/lib/rsa.js","../../../frontend/node_modules/node-forge/lib/pbe.js","../../../frontend/node_modules/node-forge/lib/pkcs7asn1.js","../../../frontend/node_modules/node-forge/lib/mgf1.js","../../../frontend/node_modules/node-forge/lib/mgf.js","../../../frontend/node_modules/node-forge/lib/pss.js","../../../frontend/node_modules/node-forge/lib/x509.js","../../../frontend/node_modules/node-forge/lib/pkcs12.js","../../../frontend/node_modules/node-forge/lib/pki.js","../../../frontend/node_modules/node-forge/lib/tls.js","../../../frontend/node_modules/node-forge/lib/aesCipherSuites.js","../../../frontend/node_modules/node-forge/lib/sha512.js","../../../frontend/node_modules/node-forge/lib/asn1-validator.js","../../../frontend/node_modules/node-forge/lib/ed25519.js","../../../frontend/node_modules/node-forge/lib/kem.js","../../../frontend/node_modules/node-forge/lib/log.js","../../../frontend/node_modules/node-forge/lib/pkcs7.js","../../../frontend/node_modules/node-forge/lib/ssh.js","../../../frontend/node_modules/node-forge/lib/index.js","../../../frontend/src/util/paytraceEncryption.js","../../../frontend/src/api/creditCardApi.js","../../../frontend/src/components/Ecomm/FhPaymentCardList/FhPaymentCardList.vue","../../../frontend/src/components/FhSelect.vue","../../../frontend/src/components/FhCheckbox.vue","../../../frontend/src/assets/digicert-seal-placeholder.png","../../../frontend/src/components/FhDigiCertSeal.vue","../../../frontend/node_modules/creditcardutils/dist/creditcardutils.js","../../../frontend/src/components/Ecomm/FhCreditCardForm/FhCreditCardForm.vue","../../../frontend/src/components/FhOptionCard.vue","../../../frontend/src/util/scrollToTopOf.js","../../../frontend/src/components/Ecomm/FhPaymentCardSelectList/FhPaymentCardSelectList.vue","../../../frontend/src/components/Partials/FhPaymentMethods/FhPaymentMethods.vue","../../../frontend/src/components/FhCheckoutStepPayment.vue","../../../frontend/src/components/FhCheckoutStepReview.vue","../../../frontend/src/api/shippingAddressApi.js","../../../frontend/src/stores/ShippingAddressStore.js","../../../frontend/node_modules/maska/dist/maska.js","../../../frontend/src/components/FhShippingAddressFormModal.vue","../../../frontend/src/components/FhShippingAddressListPresenter.vue","../../../frontend/src/components/FhShippingAddressList.vue","../../../frontend/src/components/FhCheckoutStepShipping.vue","../../../frontend/src/api/freightApi.js","../../../frontend/src/components/FhCheckoutFreightOptionPresenter.vue","../../../frontend/src/components/FhCheckoutFreightOption.vue","../../../frontend/src/components/FhCheckoutHoldDateSelect.vue","../../../frontend/src/util/dateFunctions.js","../../../frontend/src/components/FhCheckoutStepShippingDetails_FhCarriers.vue","../../../frontend/src/components/FhCheckoutStepShippingDetails_ThirdParty.vue","../../../frontend/src/components/FhCheckoutStepShippingDetails_PickUp.vue","../../../frontend/src/components/FhCheckoutStepShippingDetails.vue","../../../frontend/src/components/FhCheckout.vue","../../../frontend/src/assets/storybook/company-timeline/fh-company-timeline--mobile.png","../../../frontend/src/assets/storybook/company-timeline/fh-company-timeline--tablet.png","../../../frontend/src/assets/storybook/company-timeline/fh-company-timeline--desktop.png","../../../frontend/src/components/FhCompanyTimeline.vue","../../../frontend/src/components/FhContactUs.vue","../../../frontend/src/components/FhContentBlock.vue","../../../frontend/src/api/signUpApi.js","../../../frontend/src/api/authApi.js","../../../frontend/src/assets/four-hands-wordmark.svg","../../../frontend/src/components/FhFullscreenFocusedLayout.vue","../../../frontend/src/components/FhNewPassword.vue","../../../frontend/src/assets/img/trade_program_sidebar.jpg","../../../frontend/src/components/FhCreateAccountPresenter.vue","../../../frontend/src/components/FhCreateAccount.vue","../../../frontend/src/components/FhVideo.vue","../../../frontend/src/components/FhCtaBlock.vue","../../../frontend/src/components/FhCtaListing.vue","../../../frontend/src/components/FhDepartments.vue","../../../frontend/src/components/FhDownloads.vue","../../../frontend/src/components/FhFigure.vue","../../../frontend/src/stores/UserStore.js","../../../frontend/src/stores/FeaturesStore.js","../../../frontend/src/components/GlobalState/FHGlobalState.vue","../../../frontend/src/components/FhGuestAccountCard.vue","../../../frontend/src/components/FhGuestAccountListPresenter.vue","../../../frontend/src/components/FhGuestAccountForm.vue","../../../frontend/src/api/accountApi.js","../../../frontend/src/components/FhGuestAccountList.vue","../../../frontend/src/components/FhHero.vue","../../../frontend/src/components/FhHeroAboutUs.vue","../../../frontend/node_modules/swiper/shared/ssr-window.esm.mjs","../../../frontend/node_modules/swiper/shared/utils.mjs","../../../frontend/node_modules/swiper/modules/keyboard.mjs","../../../frontend/node_modules/swiper/shared/create-element-if-not-defined.mjs","../../../frontend/node_modules/swiper/modules/navigation.mjs","../../../frontend/node_modules/swiper/shared/classes-to-selector.mjs","../../../frontend/node_modules/swiper/modules/scrollbar.mjs","../../../frontend/node_modules/swiper/modules/thumbs.mjs","../../../frontend/node_modules/swiper/modules/free-mode.mjs","../../../frontend/node_modules/swiper/shared/swiper-core.mjs","../../../frontend/node_modules/swiper/shared/update-swiper.mjs","../../../frontend/node_modules/swiper/shared/update-on-virtual-data.mjs","../../../frontend/node_modules/swiper/swiper-vue.mjs","../../../frontend/src/components/FhImageCarousel.vue","../../../frontend/src/components/FhInteriorBanner.vue","../../../frontend/src/components/FhLocations/FhLocationsModal.vue","../../../frontend/src/components/FhLocations/FhLocation.vue","../../../frontend/src/components/FhLocations.vue","../../../frontend/src/components/FHLogin/FhLogin-Page-EmailSent.vue","../../../frontend/src/components/FHLogin/FhLogin-Page-ForgotPassword.vue","../../../frontend/src/components/FHLogin/FhLogin-Page-LogIn.vue","../../../frontend/src/components/FHLogin/FhLogin-Page-UpdatePassword.vue","../../../frontend/src/components/FhLogin.vue","../../../frontend/src/components/FhMailingList/FhMailingListModal.vue","../../../frontend/src/api/mailingListApi.js","../../../frontend/src/components/FhMailingList.vue","../../../frontend/src/components/FhMaterials/FhMaterial.vue","../../../frontend/src/components/FhMaterials.vue","../../../frontend/src/components/FhMediaListing.vue","../../../frontend/src/components/FhOrderHistory.vue","../../../frontend/src/components/FhOrderSummary.vue","../../../frontend/src/components/FhPeople/FhPersonModal.vue","../../../frontend/src/components/FhPeople/FhPerson.vue","../../../frontend/src/components/FhPeople.vue","../../../frontend/src/components/FhPressListing.vue","../../../frontend/src/components/FhPricingProgram/FhPricingProgress.vue","../../../frontend/src/components/FhPricingProgram/FhPricingTable.vue","../../../frontend/src/components/FhPricingProgram.vue","../../../frontend/src/components/FhProductBlock.vue","../../../frontend/src/components/FhAddToCart.vue","../../../frontend/src/constants/media.js","../../../frontend/src/components/FhProductDetailImageGallery.vue","../../../frontend/src/components/FhProductDetailMobileImageGallery.vue","../../../frontend/src/components/FhProductDetailSpec.vue","../../../frontend/src/components/FhProductDetailSpecList.vue","../../../frontend/src/components/FhProductOptionSelector.vue","../../../frontend/src/components/FhProductOptions.vue","../../../frontend/src/components/FhTabs.vue","../../../frontend/src/components/FhProductCareCard.vue","../../../frontend/src/components/FhProductDetailDownloadList.vue","../../../frontend/src/components/FhRadio.vue","../../../frontend/src/components/FhFilterSelect.vue","../../../frontend/src/api/shoppingListApi.js","../../../frontend/src/components/FhAddToShoppingListFormModal.vue","../../../frontend/src/components/FhTextarea.vue","../../../frontend/src/components/FhShoppingListForm.vue","../../../frontend/src/components/FhSlideOverPanel.vue","../../../frontend/src/components/FhWallpaperCalculator.vue","../../../frontend/src/components/FhProductDetail.vue","../../../frontend/src/components/FhOptionGroupItems.vue","../../../frontend/src/components/FhOptionGroup.vue","../../../frontend/src/components/FhProductFilterOptions.vue","../../../frontend/node_modules/vuetify/lib/util/propsFactory.mjs","../../../frontend/node_modules/vuetify/lib/composables/component.mjs","../../../frontend/node_modules/vuetify/lib/util/globals.mjs","../../../frontend/node_modules/vuetify/lib/util/helpers.mjs","../../../frontend/node_modules/vuetify/lib/util/color/APCA.mjs","../../../frontend/node_modules/vuetify/lib/util/color/transformCIELAB.mjs","../../../frontend/node_modules/vuetify/lib/util/color/transformSRGB.mjs","../../../frontend/node_modules/vuetify/lib/util/colorUtils.mjs","../../../frontend/node_modules/vuetify/lib/composables/defaults.mjs","../../../frontend/node_modules/vuetify/lib/util/defineComponent.mjs","../../../frontend/node_modules/vuetify/lib/util/getCurrentInstance.mjs","../../../frontend/node_modules/vuetify/lib/util/injectSelf.mjs","../../../frontend/node_modules/vuetify/lib/util/useRender.mjs","../../../frontend/node_modules/vuetify/lib/composables/toggleScope.mjs","../../../frontend/node_modules/vuetify/lib/composables/proxiedModel.mjs","../../../frontend/node_modules/vuetify/lib/locale/en.mjs","../../../frontend/node_modules/vuetify/lib/locale/adapters/vuetify.mjs","../../../frontend/node_modules/vuetify/lib/composables/locale.mjs","../../../frontend/node_modules/vuetify/lib/composables/theme.mjs","../../../frontend/node_modules/vuetify/lib/composables/tag.mjs","../../../frontend/node_modules/vuetify/lib/components/transitions/createTransition.mjs","../../../frontend/node_modules/vuetify/lib/components/transitions/expand-transition.mjs","../../../frontend/node_modules/vuetify/lib/components/transitions/index.mjs","../../../frontend/node_modules/vuetify/lib/composables/dimensions.mjs","../../../frontend/node_modules/vuetify/lib/composables/color.mjs","../../../frontend/node_modules/vuetify/lib/composables/rounded.mjs","../../../frontend/node_modules/vuetify/lib/composables/transition.mjs","../../../frontend/node_modules/vuetify/lib/composables/elevation.mjs","../../../frontend/node_modules/vuetify/lib/composables/density.mjs","../../../frontend/node_modules/vuetify/lib/iconsets/mdi.mjs","../../../frontend/node_modules/vuetify/lib/composables/icons.mjs","../../../frontend/node_modules/vuetify/lib/composables/size.mjs","../../../frontend/node_modules/vuetify/lib/components/VIcon/VIcon.mjs","../../../frontend/node_modules/vuetify/lib/directives/ripple/index.mjs","../../../frontend/node_modules/vuetify/lib/components/VLabel/VLabel.mjs","../../../frontend/node_modules/vuetify/lib/components/VInput/InputIcon.mjs","../../../frontend/node_modules/vuetify/lib/components/VMessages/VMessages.mjs","../../../frontend/node_modules/vuetify/lib/composables/focus.mjs","../../../frontend/node_modules/vuetify/lib/composables/form.mjs","../../../frontend/node_modules/vuetify/lib/composables/validation.mjs","../../../frontend/node_modules/vuetify/lib/components/VInput/VInput.mjs","../../../frontend/node_modules/vuetify/lib/composables/display.mjs","../../../frontend/node_modules/vuetify/lib/composables/goto.mjs","../../../frontend/node_modules/vuetify/lib/components/VSlider/slider.mjs","../../../frontend/node_modules/vuetify/lib/components/VSlider/VSliderThumb.mjs","../../../frontend/node_modules/vuetify/lib/components/VSlider/VSliderTrack.mjs","../../../frontend/node_modules/vuetify/lib/composables/date/adapters/vuetify.mjs","../../../frontend/node_modules/vuetify/lib/composables/date/date.mjs","../../../frontend/node_modules/vuetify/lib/components/VRangeSlider/VRangeSlider.mjs","../../../frontend/src/components/Form/FhMultiRangeSlider/FhMultiRangeSlider.vue","../../../frontend/src/components/FhProductFilterBarItem.vue","../../../frontend/src/composables/useURLState.js","../../../frontend/src/stores/ProductFiltersStore.js","../../../frontend/src/components/Products/FhProductFilterChips.vue","../../../frontend/src/components/Partials/FhSortFilter/FhSortFilter.vue","../../../frontend/src/components/Products/FhProductFilterNav/FhProductFilterNav.vue","../../../frontend/src/components/FhProductFilterBar.vue","../../../frontend/node_modules/mobile-device-detect/dist/index.js","../../../frontend/src/components/FhProductCard.vue","../../../frontend/src/components/FhProductGrid.vue","../../../frontend/src/components/FhProductListingPresenter.vue","../../../frontend/src/api/productServiceApi.js","../../../frontend/src/components/FhProductListing.vue","../../../frontend/src/components/FhProductSupport.vue","../../../frontend/src/components/FhPromoBanner.vue","../../../frontend/src/components/FhRepresentativeCards.vue","../../../frontend/src/components/FhRichText.vue","../../../frontend/src/transitions/TransitionFade.vue","../../../frontend/src/components/FhSectionNav.vue","../../../frontend/src/components/FhSecurity.vue","../../../frontend/src/components/FhShoppingListCard.vue","../../../frontend/src/components/FhShoppingListCardPresenter.vue","../../../frontend/src/components/FhShoppingList.vue","../../../frontend/src/components/FhShoppingListProductGrid.vue","../../../frontend/src/components/FhShareModal.vue","../../../frontend/src/assets/icons/icon-new-window.svg","../../../frontend/src/components/FhShoppingListDetail.vue","../../../frontend/src/components/FhShowroomCards.vue","../../../frontend/src/api/contactSubscriptionApi.js","../../../frontend/src/components/FhContactSubscriptionFormModal.vue","../../../frontend/src/components/FhSiteFooterBottom.vue","../../../frontend/src/components/FhNavCartPresenter.vue","../../../frontend/src/components/FhNavCart.vue","../../../frontend/src/components/icons/IconFhLogo.vue","../../../frontend/src/components/FhNav.vue","../../../frontend/src/components/FhSiteHeader.vue","../../../frontend/src/components/FhNotification.vue","../../../frontend/src/components/FhSiteNotifications.vue","../../../frontend/src/components/FhTabNavigation.vue","../../../frontend/src/components/FhTearSheetsDetail.vue","../../../frontend/src/components/FhTestimonial.vue","../../../frontend/src/components/FhTestimonialTabs.vue","../../../frontend/src/components/FhTipsToEarn.vue","../../../frontend/src/components/FhTitle.vue","../../../frontend/src/components/FhTitleFields.vue","../../../frontend/src/api/tradeApplicationApi.js","../../../frontend/src/components/FhTradeProgramApp/FhTPA-Progress.vue","../../../frontend/src/components/FhTradeProgramApp/FhTPA-Page-1.vue","../../../frontend/src/components/FhTradeProgramApp/FhTPA-Page-2.vue","../../../frontend/src/components/FhTradeProgramApp/FhTPA-Page-3.vue","../../../frontend/src/components/FhTradeProgramApp/FhTPA-Page-4.vue","../../../frontend/src/components/FhTradeProgramApp/FhTPA-Page-5.vue","../../../frontend/src/components/FhTradeProgramApp/FhTPA-Page-6.vue","../../../frontend/src/components/FhTradeProgramApp.vue","../../../frontend/src/components/FhValueProps.vue","../../../frontend/src/components/FhVideo/FhVideoModal.vue","../../../frontend/src/components/FhVideoSection.vue","../../../frontend/src/components/FhPriceMarkupModal.vue","../../../frontend/src/components/FhPriceMarkup.vue","../../../frontend/src/components/FhNewsletterSignup.vue","../../../frontend/src/components/FhQuoteBlock.vue","../../../frontend/src/components/FhColumnModule.vue","../../../frontend/src/components/FhPDPCtaBlock.vue","../../../frontend/src/components/FhPDPStoryBlock.vue","../../../frontend/node_modules/@vueuse/components/index.mjs","../../../frontend/src/components/FhSlideshow.vue","../../../frontend/src/components/FhShopByArtist.vue","../../../frontend/node_modules/vuetify/lib/framework.mjs","../../../frontend/src/plugins.js","../../../frontend/src/constants/envrionment.js","../../../frontend/node_modules/@sentry/utils/build/esm/is.js","../../../frontend/node_modules/@sentry/utils/build/esm/string.js","../../../frontend/node_modules/@sentry/utils/build/esm/aggregate-errors.js","../../../frontend/node_modules/@sentry/utils/build/esm/breadcrumb-log-level.js","../../../frontend/node_modules/@sentry/utils/build/esm/version.js","../../../frontend/node_modules/@sentry/utils/build/esm/worldwide.js","../../../frontend/node_modules/@sentry/utils/build/esm/browser.js","../../../frontend/node_modules/@sentry/utils/build/esm/debug-build.js","../../../frontend/node_modules/@sentry/utils/build/esm/logger.js","../../../frontend/node_modules/@sentry/utils/build/esm/dsn.js","../../../frontend/node_modules/@sentry/utils/build/esm/error.js","../../../frontend/node_modules/@sentry/utils/build/esm/object.js","../../../frontend/node_modules/@sentry/utils/build/esm/stacktrace.js","../../../frontend/node_modules/@sentry/utils/build/esm/instrument/handlers.js","../../../frontend/node_modules/@sentry/utils/build/esm/instrument/console.js","../../../frontend/node_modules/@sentry/utils/build/esm/supports.js","../../../frontend/node_modules/@sentry/utils/build/esm/time.js","../../../frontend/node_modules/@sentry/utils/build/esm/instrument/fetch.js","../../../frontend/node_modules/@sentry/utils/build/esm/instrument/globalError.js","../../../frontend/node_modules/@sentry/utils/build/esm/instrument/globalUnhandledRejection.js","../../../frontend/node_modules/@sentry/utils/build/esm/env.js","../../../frontend/node_modules/@sentry/utils/build/esm/memo.js","../../../frontend/node_modules/@sentry/utils/build/esm/misc.js","../../../frontend/node_modules/@sentry/utils/build/esm/normalize.js","../../../frontend/node_modules/@sentry/utils/build/esm/syncpromise.js","../../../frontend/node_modules/@sentry/utils/build/esm/promisebuffer.js","../../../frontend/node_modules/@sentry/utils/build/esm/url.js","../../../frontend/node_modules/@sentry/utils/build/esm/severity.js","../../../frontend/node_modules/@sentry/utils/build/esm/baggage.js","../../../frontend/node_modules/@sentry/utils/build/esm/envelope.js","../../../frontend/node_modules/@sentry/utils/build/esm/clientreport.js","../../../frontend/node_modules/@sentry/utils/build/esm/ratelimit.js","../../../frontend/node_modules/@sentry/utils/build/esm/propagationContext.js","../../../frontend/node_modules/@sentry/utils/build/esm/vendor/supportsHistory.js","../../../frontend/node_modules/@sentry/core/build/esm/debug-build.js","../../../frontend/node_modules/@sentry/core/build/esm/carrier.js","../../../frontend/node_modules/@sentry/core/build/esm/session.js","../../../frontend/node_modules/@sentry/core/build/esm/utils/spanOnScope.js","../../../frontend/node_modules/@sentry/core/build/esm/scope.js","../../../frontend/node_modules/@sentry/core/build/esm/defaultScopes.js","../../../frontend/node_modules/@sentry/core/build/esm/asyncContext/stackStrategy.js","../../../frontend/node_modules/@sentry/core/build/esm/asyncContext/index.js","../../../frontend/node_modules/@sentry/core/build/esm/currentScopes.js","../../../frontend/node_modules/@sentry/core/build/esm/metrics/metric-summary.js","../../../frontend/node_modules/@sentry/core/build/esm/semanticAttributes.js","../../../frontend/node_modules/@sentry/core/build/esm/tracing/spanstatus.js","../../../frontend/node_modules/@sentry/core/build/esm/utils/spanUtils.js","../../../frontend/node_modules/@sentry/core/build/esm/tracing/utils.js","../../../frontend/node_modules/@sentry/core/build/esm/utils/hasTracingEnabled.js","../../../frontend/node_modules/@sentry/core/build/esm/tracing/sentryNonRecordingSpan.js","../../../frontend/node_modules/@sentry/core/build/esm/constants.js","../../../frontend/node_modules/@sentry/core/build/esm/tracing/dynamicSamplingContext.js","../../../frontend/node_modules/@sentry/core/build/esm/tracing/logSpans.js","../../../frontend/node_modules/@sentry/core/build/esm/utils/parseSampleRate.js","../../../frontend/node_modules/@sentry/core/build/esm/tracing/sampling.js","../../../frontend/node_modules/@sentry/core/build/esm/envelope.js","../../../frontend/node_modules/@sentry/core/build/esm/tracing/measurement.js","../../../frontend/node_modules/@sentry/core/build/esm/tracing/sentrySpan.js","../../../frontend/node_modules/@sentry/core/build/esm/tracing/trace.js","../../../frontend/node_modules/@sentry/core/build/esm/eventProcessors.js","../../../frontend/node_modules/@sentry/core/build/esm/utils/applyScopeDataToEvent.js","../../../frontend/node_modules/@sentry/core/build/esm/utils/prepareEvent.js","../../../frontend/node_modules/@sentry/core/build/esm/exports.js","../../../frontend/node_modules/@sentry/core/build/esm/api.js","../../../frontend/node_modules/@sentry/core/build/esm/integration.js","../../../frontend/node_modules/@sentry/core/build/esm/baseclient.js","../../../frontend/node_modules/@sentry/core/build/esm/sdk.js","../../../frontend/node_modules/@sentry/core/build/esm/transports/base.js","../../../frontend/node_modules/@sentry/core/build/esm/utils/sdkMetadata.js","../../../frontend/node_modules/@sentry/core/build/esm/breadcrumbs.js","../../../frontend/node_modules/@sentry/core/build/esm/integrations/functiontostring.js","../../../frontend/node_modules/@sentry/core/build/esm/integrations/inboundfilters.js","../../../frontend/node_modules/@sentry/core/build/esm/integrations/dedupe.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/helpers.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/debug-build.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/eventbuilder.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/userfeedback.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/client.js","../../../frontend/node_modules/@sentry-internal/browser-utils/build/esm/debug-build.js","../../../frontend/node_modules/@sentry-internal/browser-utils/build/esm/types.js","../../../frontend/node_modules/@sentry-internal/browser-utils/build/esm/instrument/dom.js","../../../frontend/node_modules/@sentry-internal/browser-utils/build/esm/instrument/history.js","../../../frontend/node_modules/@sentry-internal/browser-utils/build/esm/getNativeImplementation.js","../../../frontend/node_modules/@sentry-internal/browser-utils/build/esm/instrument/xhr.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/transports/fetch.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/stack-parsers.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/integrations/breadcrumbs.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/integrations/browserapierrors.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/integrations/globalhandlers.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/integrations/httpcontext.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/integrations/linkederrors.js","../../../frontend/node_modules/@sentry/browser/build/npm/esm/sdk.js","../../../frontend/node_modules/@sentry/vue/build/esm/constants.js","../../../frontend/node_modules/@sentry/vue/build/esm/debug-build.js","../../../frontend/node_modules/@sentry/vue/build/esm/vendor/components.js","../../../frontend/node_modules/@sentry/vue/build/esm/errorhandler.js","../../../frontend/node_modules/@sentry/vue/build/esm/tracing.js","../../../frontend/node_modules/@sentry/vue/build/esm/integration.js","../../../frontend/node_modules/@sentry/vue/build/esm/sdk.js","../../../frontend/src/util/viewportSizes.js","../../../frontend/src/main.js"],"sourcesContent":["/**\n* @vue/shared v3.4.27\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str, expectsLowerCase) {\n  const set = new Set(str.split(\",\"));\n  return expectsLowerCase ? (val) => set.has(val.toLowerCase()) : (val) => set.has(val);\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n  const i = arr.indexOf(el);\n  if (i > -1) {\n    arr.splice(i, 1);\n  }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n  return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n  return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n  // the leading comma is intentional so empty string \"\" is also included\n  \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n  \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (str) => {\n    const hit = cache[str];\n    return hit || (cache[str] = fn(str));\n  };\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n  return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n  (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction((str) => {\n  const s = str ? `on${capitalize(str)}` : ``;\n  return s;\n});\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, arg) => {\n  for (let i = 0; i < fns.length; i++) {\n    fns[i](arg);\n  }\n};\nconst def = (obj, key, value, writable = false) => {\n  Object.defineProperty(obj, key, {\n    configurable: true,\n    enumerable: false,\n    writable,\n    value\n  });\n};\nconst looseToNumber = (val) => {\n  const n = parseFloat(val);\n  return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n  const n = isString(val) ? Number(val) : NaN;\n  return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n  return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n  return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\n\nconst PatchFlags = {\n  \"TEXT\": 1,\n  \"1\": \"TEXT\",\n  \"CLASS\": 2,\n  \"2\": \"CLASS\",\n  \"STYLE\": 4,\n  \"4\": \"STYLE\",\n  \"PROPS\": 8,\n  \"8\": \"PROPS\",\n  \"FULL_PROPS\": 16,\n  \"16\": \"FULL_PROPS\",\n  \"NEED_HYDRATION\": 32,\n  \"32\": \"NEED_HYDRATION\",\n  \"STABLE_FRAGMENT\": 64,\n  \"64\": \"STABLE_FRAGMENT\",\n  \"KEYED_FRAGMENT\": 128,\n  \"128\": \"KEYED_FRAGMENT\",\n  \"UNKEYED_FRAGMENT\": 256,\n  \"256\": \"UNKEYED_FRAGMENT\",\n  \"NEED_PATCH\": 512,\n  \"512\": \"NEED_PATCH\",\n  \"DYNAMIC_SLOTS\": 1024,\n  \"1024\": \"DYNAMIC_SLOTS\",\n  \"DEV_ROOT_FRAGMENT\": 2048,\n  \"2048\": \"DEV_ROOT_FRAGMENT\",\n  \"HOISTED\": -1,\n  \"-1\": \"HOISTED\",\n  \"BAIL\": -2,\n  \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n  [1]: `TEXT`,\n  [2]: `CLASS`,\n  [4]: `STYLE`,\n  [8]: `PROPS`,\n  [16]: `FULL_PROPS`,\n  [32]: `NEED_HYDRATION`,\n  [64]: `STABLE_FRAGMENT`,\n  [128]: `KEYED_FRAGMENT`,\n  [256]: `UNKEYED_FRAGMENT`,\n  [512]: `NEED_PATCH`,\n  [1024]: `DYNAMIC_SLOTS`,\n  [2048]: `DEV_ROOT_FRAGMENT`,\n  [-1]: `HOISTED`,\n  [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n  \"ELEMENT\": 1,\n  \"1\": \"ELEMENT\",\n  \"FUNCTIONAL_COMPONENT\": 2,\n  \"2\": \"FUNCTIONAL_COMPONENT\",\n  \"STATEFUL_COMPONENT\": 4,\n  \"4\": \"STATEFUL_COMPONENT\",\n  \"TEXT_CHILDREN\": 8,\n  \"8\": \"TEXT_CHILDREN\",\n  \"ARRAY_CHILDREN\": 16,\n  \"16\": \"ARRAY_CHILDREN\",\n  \"SLOTS_CHILDREN\": 32,\n  \"32\": \"SLOTS_CHILDREN\",\n  \"TELEPORT\": 64,\n  \"64\": \"TELEPORT\",\n  \"SUSPENSE\": 128,\n  \"128\": \"SUSPENSE\",\n  \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n  \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n  \"COMPONENT_KEPT_ALIVE\": 512,\n  \"512\": \"COMPONENT_KEPT_ALIVE\",\n  \"COMPONENT\": 6,\n  \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n  \"STABLE\": 1,\n  \"1\": \"STABLE\",\n  \"DYNAMIC\": 2,\n  \"2\": \"DYNAMIC\",\n  \"FORWARDED\": 3,\n  \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n  [1]: \"STABLE\",\n  [2]: \"DYNAMIC\",\n  [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n  let lines = source.split(/(\\r?\\n)/);\n  const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n  lines = lines.filter((_, idx) => idx % 2 === 0);\n  let count = 0;\n  const res = [];\n  for (let i = 0; i < lines.length; i++) {\n    count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n    if (count >= start) {\n      for (let j = i - range; j <= i + range || end > count; j++) {\n        if (j < 0 || j >= lines.length)\n          continue;\n        const line = j + 1;\n        res.push(\n          `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`\n        );\n        const lineLength = lines[j].length;\n        const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n        if (j === i) {\n          const pad = start - (count - (lineLength + newLineSeqLength));\n          const length = Math.max(\n            1,\n            end > count ? lineLength - pad : end - start\n          );\n          res.push(`   |  ` + \" \".repeat(pad) + \"^\".repeat(length));\n        } else if (j > i) {\n          if (end > count) {\n            const length = Math.max(Math.min(end - count, lineLength), 1);\n            res.push(`   |  ` + \"^\".repeat(length));\n          }\n          count += lineLength + newLineSeqLength;\n        }\n      }\n      break;\n    }\n  }\n  return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n  if (isArray(value)) {\n    const res = {};\n    for (let i = 0; i < value.length; i++) {\n      const item = value[i];\n      const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n      if (normalized) {\n        for (const key in normalized) {\n          res[key] = normalized[key];\n        }\n      }\n    }\n    return res;\n  } else if (isString(value) || isObject(value)) {\n    return value;\n  }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n  const ret = {};\n  cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n    if (item) {\n      const tmp = item.split(propertyDelimiterRE);\n      tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n    }\n  });\n  return ret;\n}\nfunction stringifyStyle(styles) {\n  let ret = \"\";\n  if (!styles || isString(styles)) {\n    return ret;\n  }\n  for (const key in styles) {\n    const value = styles[key];\n    if (isString(value) || typeof value === \"number\") {\n      const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n      ret += `${normalizedKey}:${value};`;\n    }\n  }\n  return ret;\n}\nfunction normalizeClass(value) {\n  let res = \"\";\n  if (isString(value)) {\n    res = value;\n  } else if (isArray(value)) {\n    for (let i = 0; i < value.length; i++) {\n      const normalized = normalizeClass(value[i]);\n      if (normalized) {\n        res += normalized + \" \";\n      }\n    }\n  } else if (isObject(value)) {\n    for (const name in value) {\n      if (value[name]) {\n        res += name + \" \";\n      }\n    }\n  }\n  return res.trim();\n}\nfunction normalizeProps(props) {\n  if (!props)\n    return null;\n  let { class: klass, style } = props;\n  if (klass && !isString(klass)) {\n    props.class = normalizeClass(klass);\n  }\n  if (style) {\n    props.style = normalizeStyle(style);\n  }\n  return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n  specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n  return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n  if (attrValidationCache.hasOwnProperty(name)) {\n    return attrValidationCache[name];\n  }\n  const isUnsafe = unsafeAttrCharRE.test(name);\n  if (isUnsafe) {\n    console.error(`unsafe attribute name: ${name}`);\n  }\n  return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n  acceptCharset: \"accept-charset\",\n  className: \"class\",\n  htmlFor: \"for\",\n  httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n  `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n  `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nfunction isRenderableAttrValue(value) {\n  if (value == null) {\n    return false;\n  }\n  const type = typeof value;\n  return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n  const str = \"\" + string;\n  const match = escapeRE.exec(str);\n  if (!match) {\n    return str;\n  }\n  let html = \"\";\n  let escaped;\n  let index;\n  let lastIndex = 0;\n  for (index = match.index; index < str.length; index++) {\n    switch (str.charCodeAt(index)) {\n      case 34:\n        escaped = \"&quot;\";\n        break;\n      case 38:\n        escaped = \"&amp;\";\n        break;\n      case 39:\n        escaped = \"&#39;\";\n        break;\n      case 60:\n        escaped = \"&lt;\";\n        break;\n      case 62:\n        escaped = \"&gt;\";\n        break;\n      default:\n        continue;\n    }\n    if (lastIndex !== index) {\n      html += str.slice(lastIndex, index);\n    }\n    lastIndex = index + 1;\n    html += escaped;\n  }\n  return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n  return src.replace(commentStripRE, \"\");\n}\n\nfunction looseCompareArrays(a, b) {\n  if (a.length !== b.length)\n    return false;\n  let equal = true;\n  for (let i = 0; equal && i < a.length; i++) {\n    equal = looseEqual(a[i], b[i]);\n  }\n  return equal;\n}\nfunction looseEqual(a, b) {\n  if (a === b)\n    return true;\n  let aValidType = isDate(a);\n  let bValidType = isDate(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n  }\n  aValidType = isSymbol(a);\n  bValidType = isSymbol(b);\n  if (aValidType || bValidType) {\n    return a === b;\n  }\n  aValidType = isArray(a);\n  bValidType = isArray(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n  }\n  aValidType = isObject(a);\n  bValidType = isObject(b);\n  if (aValidType || bValidType) {\n    if (!aValidType || !bValidType) {\n      return false;\n    }\n    const aKeysCount = Object.keys(a).length;\n    const bKeysCount = Object.keys(b).length;\n    if (aKeysCount !== bKeysCount) {\n      return false;\n    }\n    for (const key in a) {\n      const aHasKey = a.hasOwnProperty(key);\n      const bHasKey = b.hasOwnProperty(key);\n      if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n  }\n  return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n  return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst toDisplayString = (val) => {\n  return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n  if (val && val.__v_isRef) {\n    return replacer(_key, val.value);\n  } else if (isMap(val)) {\n    return {\n      [`Map(${val.size})`]: [...val.entries()].reduce(\n        (entries, [key, val2], i) => {\n          entries[stringifySymbol(key, i) + \" =>\"] = val2;\n          return entries;\n        },\n        {}\n      )\n    };\n  } else if (isSet(val)) {\n    return {\n      [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n    };\n  } else if (isSymbol(val)) {\n    return stringifySymbol(val);\n  } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n    return String(val);\n  }\n  return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n  var _a;\n  return (\n    // Symbol.description in es2019+ so we need to cast here to pass\n    // the lib: es2016 check\n    isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n  );\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, def, escapeHtml, escapeHtmlComment, extend, genPropsAccessExp, generateCodeFrame, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","/**\n* @vue/reactivity v3.4.27\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { NOOP, extend, isArray, isSymbol, isMap, isIntegerKey, hasOwn, hasChanged, isObject, makeMap, capitalize, toRawType, def, isFunction } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n  console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n  constructor(detached = false) {\n    this.detached = detached;\n    /**\n     * @internal\n     */\n    this._active = true;\n    /**\n     * @internal\n     */\n    this.effects = [];\n    /**\n     * @internal\n     */\n    this.cleanups = [];\n    this.parent = activeEffectScope;\n    if (!detached && activeEffectScope) {\n      this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n        this\n      ) - 1;\n    }\n  }\n  get active() {\n    return this._active;\n  }\n  run(fn) {\n    if (this._active) {\n      const currentEffectScope = activeEffectScope;\n      try {\n        activeEffectScope = this;\n        return fn();\n      } finally {\n        activeEffectScope = currentEffectScope;\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(`cannot run an inactive effect scope.`);\n    }\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  on() {\n    activeEffectScope = this;\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  off() {\n    activeEffectScope = this.parent;\n  }\n  stop(fromParent) {\n    if (this._active) {\n      let i, l;\n      for (i = 0, l = this.effects.length; i < l; i++) {\n        this.effects[i].stop();\n      }\n      for (i = 0, l = this.cleanups.length; i < l; i++) {\n        this.cleanups[i]();\n      }\n      if (this.scopes) {\n        for (i = 0, l = this.scopes.length; i < l; i++) {\n          this.scopes[i].stop(true);\n        }\n      }\n      if (!this.detached && this.parent && !fromParent) {\n        const last = this.parent.scopes.pop();\n        if (last && last !== this) {\n          this.parent.scopes[this.index] = last;\n          last.index = this.index;\n        }\n      }\n      this.parent = void 0;\n      this._active = false;\n    }\n  }\n}\nfunction effectScope(detached) {\n  return new EffectScope(detached);\n}\nfunction recordEffectScope(effect, scope = activeEffectScope) {\n  if (scope && scope.active) {\n    scope.effects.push(effect);\n  }\n}\nfunction getCurrentScope() {\n  return activeEffectScope;\n}\nfunction onScopeDispose(fn) {\n  if (activeEffectScope) {\n    activeEffectScope.cleanups.push(fn);\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn(\n      `onScopeDispose() is called when there is no active effect scope to be associated with.`\n    );\n  }\n}\n\nlet activeEffect;\nclass ReactiveEffect {\n  constructor(fn, trigger, scheduler, scope) {\n    this.fn = fn;\n    this.trigger = trigger;\n    this.scheduler = scheduler;\n    this.active = true;\n    this.deps = [];\n    /**\n     * @internal\n     */\n    this._dirtyLevel = 4;\n    /**\n     * @internal\n     */\n    this._trackId = 0;\n    /**\n     * @internal\n     */\n    this._runnings = 0;\n    /**\n     * @internal\n     */\n    this._shouldSchedule = false;\n    /**\n     * @internal\n     */\n    this._depsLength = 0;\n    recordEffectScope(this, scope);\n  }\n  get dirty() {\n    if (this._dirtyLevel === 2 || this._dirtyLevel === 3) {\n      this._dirtyLevel = 1;\n      pauseTracking();\n      for (let i = 0; i < this._depsLength; i++) {\n        const dep = this.deps[i];\n        if (dep.computed) {\n          triggerComputed(dep.computed);\n          if (this._dirtyLevel >= 4) {\n            break;\n          }\n        }\n      }\n      if (this._dirtyLevel === 1) {\n        this._dirtyLevel = 0;\n      }\n      resetTracking();\n    }\n    return this._dirtyLevel >= 4;\n  }\n  set dirty(v) {\n    this._dirtyLevel = v ? 4 : 0;\n  }\n  run() {\n    this._dirtyLevel = 0;\n    if (!this.active) {\n      return this.fn();\n    }\n    let lastShouldTrack = shouldTrack;\n    let lastEffect = activeEffect;\n    try {\n      shouldTrack = true;\n      activeEffect = this;\n      this._runnings++;\n      preCleanupEffect(this);\n      return this.fn();\n    } finally {\n      postCleanupEffect(this);\n      this._runnings--;\n      activeEffect = lastEffect;\n      shouldTrack = lastShouldTrack;\n    }\n  }\n  stop() {\n    if (this.active) {\n      preCleanupEffect(this);\n      postCleanupEffect(this);\n      this.onStop && this.onStop();\n      this.active = false;\n    }\n  }\n}\nfunction triggerComputed(computed) {\n  return computed.value;\n}\nfunction preCleanupEffect(effect2) {\n  effect2._trackId++;\n  effect2._depsLength = 0;\n}\nfunction postCleanupEffect(effect2) {\n  if (effect2.deps.length > effect2._depsLength) {\n    for (let i = effect2._depsLength; i < effect2.deps.length; i++) {\n      cleanupDepEffect(effect2.deps[i], effect2);\n    }\n    effect2.deps.length = effect2._depsLength;\n  }\n}\nfunction cleanupDepEffect(dep, effect2) {\n  const trackId = dep.get(effect2);\n  if (trackId !== void 0 && effect2._trackId !== trackId) {\n    dep.delete(effect2);\n    if (dep.size === 0) {\n      dep.cleanup();\n    }\n  }\n}\nfunction effect(fn, options) {\n  if (fn.effect instanceof ReactiveEffect) {\n    fn = fn.effect.fn;\n  }\n  const _effect = new ReactiveEffect(fn, NOOP, () => {\n    if (_effect.dirty) {\n      _effect.run();\n    }\n  });\n  if (options) {\n    extend(_effect, options);\n    if (options.scope)\n      recordEffectScope(_effect, options.scope);\n  }\n  if (!options || !options.lazy) {\n    _effect.run();\n  }\n  const runner = _effect.run.bind(_effect);\n  runner.effect = _effect;\n  return runner;\n}\nfunction stop(runner) {\n  runner.effect.stop();\n}\nlet shouldTrack = true;\nlet pauseScheduleStack = 0;\nconst trackStack = [];\nfunction pauseTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = false;\n}\nfunction enableTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = true;\n}\nfunction resetTracking() {\n  const last = trackStack.pop();\n  shouldTrack = last === void 0 ? true : last;\n}\nfunction pauseScheduling() {\n  pauseScheduleStack++;\n}\nfunction resetScheduling() {\n  pauseScheduleStack--;\n  while (!pauseScheduleStack && queueEffectSchedulers.length) {\n    queueEffectSchedulers.shift()();\n  }\n}\nfunction trackEffect(effect2, dep, debuggerEventExtraInfo) {\n  var _a;\n  if (dep.get(effect2) !== effect2._trackId) {\n    dep.set(effect2, effect2._trackId);\n    const oldDep = effect2.deps[effect2._depsLength];\n    if (oldDep !== dep) {\n      if (oldDep) {\n        cleanupDepEffect(oldDep, effect2);\n      }\n      effect2.deps[effect2._depsLength++] = dep;\n    } else {\n      effect2._depsLength++;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));\n    }\n  }\n}\nconst queueEffectSchedulers = [];\nfunction triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) {\n  var _a;\n  pauseScheduling();\n  for (const effect2 of dep.keys()) {\n    let tracking;\n    if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {\n      effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0);\n      effect2._dirtyLevel = dirtyLevel;\n    }\n    if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));\n      }\n      effect2.trigger();\n      if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) {\n        effect2._shouldSchedule = false;\n        if (effect2.scheduler) {\n          queueEffectSchedulers.push(effect2.scheduler);\n        }\n      }\n    }\n  }\n  resetScheduling();\n}\n\nconst createDep = (cleanup, computed) => {\n  const dep = /* @__PURE__ */ new Map();\n  dep.cleanup = cleanup;\n  dep.computed = computed;\n  return dep;\n};\n\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"iterate\" : \"\");\nconst MAP_KEY_ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"Map key iterate\" : \"\");\nfunction track(target, type, key) {\n  if (shouldTrack && activeEffect) {\n    let depsMap = targetMap.get(target);\n    if (!depsMap) {\n      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n    }\n    let dep = depsMap.get(key);\n    if (!dep) {\n      depsMap.set(key, dep = createDep(() => depsMap.delete(key)));\n    }\n    trackEffect(\n      activeEffect,\n      dep,\n      !!(process.env.NODE_ENV !== \"production\") ? {\n        target,\n        type,\n        key\n      } : void 0\n    );\n  }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n  const depsMap = targetMap.get(target);\n  if (!depsMap) {\n    return;\n  }\n  let deps = [];\n  if (type === \"clear\") {\n    deps = [...depsMap.values()];\n  } else if (key === \"length\" && isArray(target)) {\n    const newLength = Number(newValue);\n    depsMap.forEach((dep, key2) => {\n      if (key2 === \"length\" || !isSymbol(key2) && key2 >= newLength) {\n        deps.push(dep);\n      }\n    });\n  } else {\n    if (key !== void 0) {\n      deps.push(depsMap.get(key));\n    }\n    switch (type) {\n      case \"add\":\n        if (!isArray(target)) {\n          deps.push(depsMap.get(ITERATE_KEY));\n          if (isMap(target)) {\n            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n          }\n        } else if (isIntegerKey(key)) {\n          deps.push(depsMap.get(\"length\"));\n        }\n        break;\n      case \"delete\":\n        if (!isArray(target)) {\n          deps.push(depsMap.get(ITERATE_KEY));\n          if (isMap(target)) {\n            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n          }\n        }\n        break;\n      case \"set\":\n        if (isMap(target)) {\n          deps.push(depsMap.get(ITERATE_KEY));\n        }\n        break;\n    }\n  }\n  pauseScheduling();\n  for (const dep of deps) {\n    if (dep) {\n      triggerEffects(\n        dep,\n        4,\n        !!(process.env.NODE_ENV !== \"production\") ? {\n          target,\n          type,\n          key,\n          newValue,\n          oldValue,\n          oldTarget\n        } : void 0\n      );\n    }\n  }\n  resetScheduling();\n}\nfunction getDepFromReactive(object, key) {\n  const depsMap = targetMap.get(object);\n  return depsMap && depsMap.get(key);\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n  /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nconst arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n  const instrumentations = {};\n  [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n    instrumentations[key] = function(...args) {\n      const arr = toRaw(this);\n      for (let i = 0, l = this.length; i < l; i++) {\n        track(arr, \"get\", i + \"\");\n      }\n      const res = arr[key](...args);\n      if (res === -1 || res === false) {\n        return arr[key](...args.map(toRaw));\n      } else {\n        return res;\n      }\n    };\n  });\n  [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].forEach((key) => {\n    instrumentations[key] = function(...args) {\n      pauseTracking();\n      pauseScheduling();\n      const res = toRaw(this)[key].apply(this, args);\n      resetScheduling();\n      resetTracking();\n      return res;\n    };\n  });\n  return instrumentations;\n}\nfunction hasOwnProperty(key) {\n  if (!isSymbol(key))\n    key = String(key);\n  const obj = toRaw(this);\n  track(obj, \"has\", key);\n  return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n  constructor(_isReadonly = false, _isShallow = false) {\n    this._isReadonly = _isReadonly;\n    this._isShallow = _isShallow;\n  }\n  get(target, key, receiver) {\n    const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n    if (key === \"__v_isReactive\") {\n      return !isReadonly2;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly2;\n    } else if (key === \"__v_isShallow\") {\n      return isShallow2;\n    } else if (key === \"__v_raw\") {\n      if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n      // this means the reciever is a user proxy of the reactive proxy\n      Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n        return target;\n      }\n      return;\n    }\n    const targetIsArray = isArray(target);\n    if (!isReadonly2) {\n      if (targetIsArray && hasOwn(arrayInstrumentations, key)) {\n        return Reflect.get(arrayInstrumentations, key, receiver);\n      }\n      if (key === \"hasOwnProperty\") {\n        return hasOwnProperty;\n      }\n    }\n    const res = Reflect.get(target, key, receiver);\n    if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n      return res;\n    }\n    if (!isReadonly2) {\n      track(target, \"get\", key);\n    }\n    if (isShallow2) {\n      return res;\n    }\n    if (isRef(res)) {\n      return targetIsArray && isIntegerKey(key) ? res : res.value;\n    }\n    if (isObject(res)) {\n      return isReadonly2 ? readonly(res) : reactive(res);\n    }\n    return res;\n  }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n  constructor(isShallow2 = false) {\n    super(false, isShallow2);\n  }\n  set(target, key, value, receiver) {\n    let oldValue = target[key];\n    if (!this._isShallow) {\n      const isOldValueReadonly = isReadonly(oldValue);\n      if (!isShallow(value) && !isReadonly(value)) {\n        oldValue = toRaw(oldValue);\n        value = toRaw(value);\n      }\n      if (!isArray(target) && isRef(oldValue) && !isRef(value)) {\n        if (isOldValueReadonly) {\n          return false;\n        } else {\n          oldValue.value = value;\n          return true;\n        }\n      }\n    }\n    const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);\n    const result = Reflect.set(target, key, value, receiver);\n    if (target === toRaw(receiver)) {\n      if (!hadKey) {\n        trigger(target, \"add\", key, value);\n      } else if (hasChanged(value, oldValue)) {\n        trigger(target, \"set\", key, value, oldValue);\n      }\n    }\n    return result;\n  }\n  deleteProperty(target, key) {\n    const hadKey = hasOwn(target, key);\n    const oldValue = target[key];\n    const result = Reflect.deleteProperty(target, key);\n    if (result && hadKey) {\n      trigger(target, \"delete\", key, void 0, oldValue);\n    }\n    return result;\n  }\n  has(target, key) {\n    const result = Reflect.has(target, key);\n    if (!isSymbol(key) || !builtInSymbols.has(key)) {\n      track(target, \"has\", key);\n    }\n    return result;\n  }\n  ownKeys(target) {\n    track(\n      target,\n      \"iterate\",\n      isArray(target) ? \"length\" : ITERATE_KEY\n    );\n    return Reflect.ownKeys(target);\n  }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n  constructor(isShallow2 = false) {\n    super(true, isShallow2);\n  }\n  set(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  }\n  deleteProperty(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(\n  true\n);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction get(target, key, isReadonly = false, isShallow = false) {\n  target = target[\"__v_raw\"];\n  const rawTarget = toRaw(target);\n  const rawKey = toRaw(key);\n  if (!isReadonly) {\n    if (hasChanged(key, rawKey)) {\n      track(rawTarget, \"get\", key);\n    }\n    track(rawTarget, \"get\", rawKey);\n  }\n  const { has: has2 } = getProto(rawTarget);\n  const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n  if (has2.call(rawTarget, key)) {\n    return wrap(target.get(key));\n  } else if (has2.call(rawTarget, rawKey)) {\n    return wrap(target.get(rawKey));\n  } else if (target !== rawTarget) {\n    target.get(key);\n  }\n}\nfunction has(key, isReadonly = false) {\n  const target = this[\"__v_raw\"];\n  const rawTarget = toRaw(target);\n  const rawKey = toRaw(key);\n  if (!isReadonly) {\n    if (hasChanged(key, rawKey)) {\n      track(rawTarget, \"has\", key);\n    }\n    track(rawTarget, \"has\", rawKey);\n  }\n  return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n}\nfunction size(target, isReadonly = false) {\n  target = target[\"__v_raw\"];\n  !isReadonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n  return Reflect.get(target, \"size\", target);\n}\nfunction add(value) {\n  value = toRaw(value);\n  const target = toRaw(this);\n  const proto = getProto(target);\n  const hadKey = proto.has.call(target, value);\n  if (!hadKey) {\n    target.add(value);\n    trigger(target, \"add\", value, value);\n  }\n  return this;\n}\nfunction set(key, value) {\n  value = toRaw(value);\n  const target = toRaw(this);\n  const { has: has2, get: get2 } = getProto(target);\n  let hadKey = has2.call(target, key);\n  if (!hadKey) {\n    key = toRaw(key);\n    hadKey = has2.call(target, key);\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    checkIdentityKeys(target, has2, key);\n  }\n  const oldValue = get2.call(target, key);\n  target.set(key, value);\n  if (!hadKey) {\n    trigger(target, \"add\", key, value);\n  } else if (hasChanged(value, oldValue)) {\n    trigger(target, \"set\", key, value, oldValue);\n  }\n  return this;\n}\nfunction deleteEntry(key) {\n  const target = toRaw(this);\n  const { has: has2, get: get2 } = getProto(target);\n  let hadKey = has2.call(target, key);\n  if (!hadKey) {\n    key = toRaw(key);\n    hadKey = has2.call(target, key);\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    checkIdentityKeys(target, has2, key);\n  }\n  const oldValue = get2 ? get2.call(target, key) : void 0;\n  const result = target.delete(key);\n  if (hadKey) {\n    trigger(target, \"delete\", key, void 0, oldValue);\n  }\n  return result;\n}\nfunction clear() {\n  const target = toRaw(this);\n  const hadItems = target.size !== 0;\n  const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n  const result = target.clear();\n  if (hadItems) {\n    trigger(target, \"clear\", void 0, void 0, oldTarget);\n  }\n  return result;\n}\nfunction createForEach(isReadonly, isShallow) {\n  return function forEach(callback, thisArg) {\n    const observed = this;\n    const target = observed[\"__v_raw\"];\n    const rawTarget = toRaw(target);\n    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n    !isReadonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n    return target.forEach((value, key) => {\n      return callback.call(thisArg, wrap(value), wrap(key), observed);\n    });\n  };\n}\nfunction createIterableMethod(method, isReadonly, isShallow) {\n  return function(...args) {\n    const target = this[\"__v_raw\"];\n    const rawTarget = toRaw(target);\n    const targetIsMap = isMap(rawTarget);\n    const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n    const isKeyOnly = method === \"keys\" && targetIsMap;\n    const innerIterator = target[method](...args);\n    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n    !isReadonly && track(\n      rawTarget,\n      \"iterate\",\n      isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n    );\n    return {\n      // iterator protocol\n      next() {\n        const { value, done } = innerIterator.next();\n        return done ? { value, done } : {\n          value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n          done\n        };\n      },\n      // iterable protocol\n      [Symbol.iterator]() {\n        return this;\n      }\n    };\n  };\n}\nfunction createReadonlyMethod(type) {\n  return function(...args) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n      warn(\n        `${capitalize(type)} operation ${key}failed: target is readonly.`,\n        toRaw(this)\n      );\n    }\n    return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n  };\n}\nfunction createInstrumentations() {\n  const mutableInstrumentations2 = {\n    get(key) {\n      return get(this, key);\n    },\n    get size() {\n      return size(this);\n    },\n    has,\n    add,\n    set,\n    delete: deleteEntry,\n    clear,\n    forEach: createForEach(false, false)\n  };\n  const shallowInstrumentations2 = {\n    get(key) {\n      return get(this, key, false, true);\n    },\n    get size() {\n      return size(this);\n    },\n    has,\n    add,\n    set,\n    delete: deleteEntry,\n    clear,\n    forEach: createForEach(false, true)\n  };\n  const readonlyInstrumentations2 = {\n    get(key) {\n      return get(this, key, true);\n    },\n    get size() {\n      return size(this, true);\n    },\n    has(key) {\n      return has.call(this, key, true);\n    },\n    add: createReadonlyMethod(\"add\"),\n    set: createReadonlyMethod(\"set\"),\n    delete: createReadonlyMethod(\"delete\"),\n    clear: createReadonlyMethod(\"clear\"),\n    forEach: createForEach(true, false)\n  };\n  const shallowReadonlyInstrumentations2 = {\n    get(key) {\n      return get(this, key, true, true);\n    },\n    get size() {\n      return size(this, true);\n    },\n    has(key) {\n      return has.call(this, key, true);\n    },\n    add: createReadonlyMethod(\"add\"),\n    set: createReadonlyMethod(\"set\"),\n    delete: createReadonlyMethod(\"delete\"),\n    clear: createReadonlyMethod(\"clear\"),\n    forEach: createForEach(true, true)\n  };\n  const iteratorMethods = [\n    \"keys\",\n    \"values\",\n    \"entries\",\n    Symbol.iterator\n  ];\n  iteratorMethods.forEach((method) => {\n    mutableInstrumentations2[method] = createIterableMethod(method, false, false);\n    readonlyInstrumentations2[method] = createIterableMethod(method, true, false);\n    shallowInstrumentations2[method] = createIterableMethod(method, false, true);\n    shallowReadonlyInstrumentations2[method] = createIterableMethod(\n      method,\n      true,\n      true\n    );\n  });\n  return [\n    mutableInstrumentations2,\n    readonlyInstrumentations2,\n    shallowInstrumentations2,\n    shallowReadonlyInstrumentations2\n  ];\n}\nconst [\n  mutableInstrumentations,\n  readonlyInstrumentations,\n  shallowInstrumentations,\n  shallowReadonlyInstrumentations\n] = /* @__PURE__ */ createInstrumentations();\nfunction createInstrumentationGetter(isReadonly, shallow) {\n  const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;\n  return (target, key, receiver) => {\n    if (key === \"__v_isReactive\") {\n      return !isReadonly;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly;\n    } else if (key === \"__v_raw\") {\n      return target;\n    }\n    return Reflect.get(\n      hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n      key,\n      receiver\n    );\n  };\n}\nconst mutableCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has2, key) {\n  const rawKey = toRaw(key);\n  if (rawKey !== key && has2.call(target, rawKey)) {\n    const type = toRawType(target);\n    warn(\n      `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n    );\n  }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n  switch (rawType) {\n    case \"Object\":\n    case \"Array\":\n      return 1 /* COMMON */;\n    case \"Map\":\n    case \"Set\":\n    case \"WeakMap\":\n    case \"WeakSet\":\n      return 2 /* COLLECTION */;\n    default:\n      return 0 /* INVALID */;\n  }\n}\nfunction getTargetType(value) {\n  return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n  if (isReadonly(target)) {\n    return target;\n  }\n  return createReactiveObject(\n    target,\n    false,\n    mutableHandlers,\n    mutableCollectionHandlers,\n    reactiveMap\n  );\n}\nfunction shallowReactive(target) {\n  return createReactiveObject(\n    target,\n    false,\n    shallowReactiveHandlers,\n    shallowCollectionHandlers,\n    shallowReactiveMap\n  );\n}\nfunction readonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    readonlyHandlers,\n    readonlyCollectionHandlers,\n    readonlyMap\n  );\n}\nfunction shallowReadonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    shallowReadonlyHandlers,\n    shallowReadonlyCollectionHandlers,\n    shallowReadonlyMap\n  );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n  if (!isObject(target)) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(`value cannot be made reactive: ${String(target)}`);\n    }\n    return target;\n  }\n  if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n    return target;\n  }\n  const existingProxy = proxyMap.get(target);\n  if (existingProxy) {\n    return existingProxy;\n  }\n  const targetType = getTargetType(target);\n  if (targetType === 0 /* INVALID */) {\n    return target;\n  }\n  const proxy = new Proxy(\n    target,\n    targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n  );\n  proxyMap.set(target, proxy);\n  return proxy;\n}\nfunction isReactive(value) {\n  if (isReadonly(value)) {\n    return isReactive(value[\"__v_raw\"]);\n  }\n  return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n  return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n  return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n  return value ? !!value[\"__v_raw\"] : false;\n}\nfunction toRaw(observed) {\n  const raw = observed && observed[\"__v_raw\"];\n  return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n  if (Object.isExtensible(value)) {\n    def(value, \"__v_skip\", true);\n  }\n  return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nconst COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided.  Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`;\nclass ComputedRefImpl {\n  constructor(getter, _setter, isReadonly, isSSR) {\n    this.getter = getter;\n    this._setter = _setter;\n    this.dep = void 0;\n    this.__v_isRef = true;\n    this[\"__v_isReadonly\"] = false;\n    this.effect = new ReactiveEffect(\n      () => getter(this._value),\n      () => triggerRefValue(\n        this,\n        this.effect._dirtyLevel === 2 ? 2 : 3\n      )\n    );\n    this.effect.computed = this;\n    this.effect.active = this._cacheable = !isSSR;\n    this[\"__v_isReadonly\"] = isReadonly;\n  }\n  get value() {\n    const self = toRaw(this);\n    if ((!self._cacheable || self.effect.dirty) && hasChanged(self._value, self._value = self.effect.run())) {\n      triggerRefValue(self, 4);\n    }\n    trackRefValue(self);\n    if (self.effect._dirtyLevel >= 2) {\n      if (!!(process.env.NODE_ENV !== \"production\") && this._warnRecursive) {\n        warn(COMPUTED_SIDE_EFFECT_WARN, `\n\ngetter: `, this.getter);\n      }\n      triggerRefValue(self, 2);\n    }\n    return self._value;\n  }\n  set value(newValue) {\n    this._setter(newValue);\n  }\n  // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x\n  get _dirty() {\n    return this.effect.dirty;\n  }\n  set _dirty(v) {\n    this.effect.dirty = v;\n  }\n  // #endregion\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n  let getter;\n  let setter;\n  const onlyGetter = isFunction(getterOrOptions);\n  if (onlyGetter) {\n    getter = getterOrOptions;\n    setter = !!(process.env.NODE_ENV !== \"production\") ? () => {\n      warn(\"Write operation failed: computed value is readonly\");\n    } : NOOP;\n  } else {\n    getter = getterOrOptions.get;\n    setter = getterOrOptions.set;\n  }\n  const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);\n  if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n    cRef.effect.onTrack = debugOptions.onTrack;\n    cRef.effect.onTrigger = debugOptions.onTrigger;\n  }\n  return cRef;\n}\n\nfunction trackRefValue(ref2) {\n  var _a;\n  if (shouldTrack && activeEffect) {\n    ref2 = toRaw(ref2);\n    trackEffect(\n      activeEffect,\n      (_a = ref2.dep) != null ? _a : ref2.dep = createDep(\n        () => ref2.dep = void 0,\n        ref2 instanceof ComputedRefImpl ? ref2 : void 0\n      ),\n      !!(process.env.NODE_ENV !== \"production\") ? {\n        target: ref2,\n        type: \"get\",\n        key: \"value\"\n      } : void 0\n    );\n  }\n}\nfunction triggerRefValue(ref2, dirtyLevel = 4, newVal) {\n  ref2 = toRaw(ref2);\n  const dep = ref2.dep;\n  if (dep) {\n    triggerEffects(\n      dep,\n      dirtyLevel,\n      !!(process.env.NODE_ENV !== \"production\") ? {\n        target: ref2,\n        type: \"set\",\n        key: \"value\",\n        newValue: newVal\n      } : void 0\n    );\n  }\n}\nfunction isRef(r) {\n  return !!(r && r.__v_isRef === true);\n}\nfunction ref(value) {\n  return createRef(value, false);\n}\nfunction shallowRef(value) {\n  return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n  if (isRef(rawValue)) {\n    return rawValue;\n  }\n  return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n  constructor(value, __v_isShallow) {\n    this.__v_isShallow = __v_isShallow;\n    this.dep = void 0;\n    this.__v_isRef = true;\n    this._rawValue = __v_isShallow ? value : toRaw(value);\n    this._value = __v_isShallow ? value : toReactive(value);\n  }\n  get value() {\n    trackRefValue(this);\n    return this._value;\n  }\n  set value(newVal) {\n    const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);\n    newVal = useDirectValue ? newVal : toRaw(newVal);\n    if (hasChanged(newVal, this._rawValue)) {\n      this._rawValue = newVal;\n      this._value = useDirectValue ? newVal : toReactive(newVal);\n      triggerRefValue(this, 4, newVal);\n    }\n  }\n}\nfunction triggerRef(ref2) {\n  triggerRefValue(ref2, 4, !!(process.env.NODE_ENV !== \"production\") ? ref2.value : void 0);\n}\nfunction unref(ref2) {\n  return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n  return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n  get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),\n  set: (target, key, value, receiver) => {\n    const oldValue = target[key];\n    if (isRef(oldValue) && !isRef(value)) {\n      oldValue.value = value;\n      return true;\n    } else {\n      return Reflect.set(target, key, value, receiver);\n    }\n  }\n};\nfunction proxyRefs(objectWithRefs) {\n  return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n  constructor(factory) {\n    this.dep = void 0;\n    this.__v_isRef = true;\n    const { get, set } = factory(\n      () => trackRefValue(this),\n      () => triggerRefValue(this)\n    );\n    this._get = get;\n    this._set = set;\n  }\n  get value() {\n    return this._get();\n  }\n  set value(newVal) {\n    this._set(newVal);\n  }\n}\nfunction customRef(factory) {\n  return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n    warn(`toRefs() expects a reactive object but received a plain one.`);\n  }\n  const ret = isArray(object) ? new Array(object.length) : {};\n  for (const key in object) {\n    ret[key] = propertyToRef(object, key);\n  }\n  return ret;\n}\nclass ObjectRefImpl {\n  constructor(_object, _key, _defaultValue) {\n    this._object = _object;\n    this._key = _key;\n    this._defaultValue = _defaultValue;\n    this.__v_isRef = true;\n  }\n  get value() {\n    const val = this._object[this._key];\n    return val === void 0 ? this._defaultValue : val;\n  }\n  set value(newVal) {\n    this._object[this._key] = newVal;\n  }\n  get dep() {\n    return getDepFromReactive(toRaw(this._object), this._key);\n  }\n}\nclass GetterRefImpl {\n  constructor(_getter) {\n    this._getter = _getter;\n    this.__v_isRef = true;\n    this.__v_isReadonly = true;\n  }\n  get value() {\n    return this._getter();\n  }\n}\nfunction toRef(source, key, defaultValue) {\n  if (isRef(source)) {\n    return source;\n  } else if (isFunction(source)) {\n    return new GetterRefImpl(source);\n  } else if (isObject(source) && arguments.length > 1) {\n    return propertyToRef(source, key, defaultValue);\n  } else {\n    return ref(source);\n  }\n}\nfunction propertyToRef(source, key, defaultValue) {\n  const val = source[key];\n  return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);\n}\n\nconst deferredComputed = computed;\n\nconst TrackOpTypes = {\n  \"GET\": \"get\",\n  \"HAS\": \"has\",\n  \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n  \"SET\": \"set\",\n  \"ADD\": \"add\",\n  \"DELETE\": \"delete\",\n  \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n  \"SKIP\": \"__v_skip\",\n  \"IS_REACTIVE\": \"__v_isReactive\",\n  \"IS_READONLY\": \"__v_isReadonly\",\n  \"IS_SHALLOW\": \"__v_isShallow\",\n  \"RAW\": \"__v_raw\"\n};\n\nexport { EffectScope, ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, computed, customRef, deferredComputed, effect, effectScope, enableTracking, getCurrentScope, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, pauseScheduling, pauseTracking, proxyRefs, reactive, readonly, ref, resetScheduling, resetTracking, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, track, trigger, triggerRef, unref };\n","/**\n* @vue/runtime-core v3.4.27\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, shallowReadonly, isShallow, isReactive, ReactiveEffect, getCurrentScope, ref, track, reactive, shallowReactive, trigger, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1, customRef, isReadonly } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, isPromise, isArray, NOOP, getGlobalThis, extend, EMPTY_OBJ, toHandlerKey, looseToNumber, hyphenate, camelize, isObject, isOn, hasOwn, isModelListener, capitalize, toNumber, hasChanged, remove, isSet, isMap, isPlainObject, isBuiltInDirective, invokeArrayFns, isRegExp, isGloballyAllowed, NO, isReservedProp, EMPTY_ARR, toRawType, makeMap, def, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n  stack.push(vnode);\n}\nfunction popWarningContext() {\n  stack.pop();\n}\nfunction warn$1(msg, ...args) {\n  pauseTracking();\n  const instance = stack.length ? stack[stack.length - 1].component : null;\n  const appWarnHandler = instance && instance.appContext.config.warnHandler;\n  const trace = getComponentTrace();\n  if (appWarnHandler) {\n    callWithErrorHandling(\n      appWarnHandler,\n      instance,\n      11,\n      [\n        msg + args.map((a) => {\n          var _a, _b;\n          return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n        }).join(\"\"),\n        instance && instance.proxy,\n        trace.map(\n          ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n        ).join(\"\\n\"),\n        trace\n      ]\n    );\n  } else {\n    const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n    if (trace.length && // avoid spamming console during tests\n    true) {\n      warnArgs.push(`\n`, ...formatTrace(trace));\n    }\n    console.warn(...warnArgs);\n  }\n  resetTracking();\n}\nfunction getComponentTrace() {\n  let currentVNode = stack[stack.length - 1];\n  if (!currentVNode) {\n    return [];\n  }\n  const normalizedStack = [];\n  while (currentVNode) {\n    const last = normalizedStack[0];\n    if (last && last.vnode === currentVNode) {\n      last.recurseCount++;\n    } else {\n      normalizedStack.push({\n        vnode: currentVNode,\n        recurseCount: 0\n      });\n    }\n    const parentInstance = currentVNode.component && currentVNode.component.parent;\n    currentVNode = parentInstance && parentInstance.vnode;\n  }\n  return normalizedStack;\n}\nfunction formatTrace(trace) {\n  const logs = [];\n  trace.forEach((entry, i) => {\n    logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n  });\n  return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n  const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n  const isRoot = vnode.component ? vnode.component.parent == null : false;\n  const open = ` at <${formatComponentName(\n    vnode.component,\n    vnode.type,\n    isRoot\n  )}`;\n  const close = `>` + postfix;\n  return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n  const res = [];\n  const keys = Object.keys(props);\n  keys.slice(0, 3).forEach((key) => {\n    res.push(...formatProp(key, props[key]));\n  });\n  if (keys.length > 3) {\n    res.push(` ...`);\n  }\n  return res;\n}\nfunction formatProp(key, value, raw) {\n  if (isString(value)) {\n    value = JSON.stringify(value);\n    return raw ? value : [`${key}=${value}`];\n  } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n    return raw ? value : [`${key}=${value}`];\n  } else if (isRef(value)) {\n    value = formatProp(key, toRaw(value.value), true);\n    return raw ? value : [`${key}=Ref<`, value, `>`];\n  } else if (isFunction(value)) {\n    return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n  } else {\n    value = toRaw(value);\n    return raw ? value : [`${key}=`, value];\n  }\n}\nfunction assertNumber(val, type) {\n  if (!!!(process.env.NODE_ENV !== \"production\"))\n    return;\n  if (val === void 0) {\n    return;\n  } else if (typeof val !== \"number\") {\n    warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n  } else if (isNaN(val)) {\n    warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n  }\n}\n\nconst ErrorCodes = {\n  \"SETUP_FUNCTION\": 0,\n  \"0\": \"SETUP_FUNCTION\",\n  \"RENDER_FUNCTION\": 1,\n  \"1\": \"RENDER_FUNCTION\",\n  \"WATCH_GETTER\": 2,\n  \"2\": \"WATCH_GETTER\",\n  \"WATCH_CALLBACK\": 3,\n  \"3\": \"WATCH_CALLBACK\",\n  \"WATCH_CLEANUP\": 4,\n  \"4\": \"WATCH_CLEANUP\",\n  \"NATIVE_EVENT_HANDLER\": 5,\n  \"5\": \"NATIVE_EVENT_HANDLER\",\n  \"COMPONENT_EVENT_HANDLER\": 6,\n  \"6\": \"COMPONENT_EVENT_HANDLER\",\n  \"VNODE_HOOK\": 7,\n  \"7\": \"VNODE_HOOK\",\n  \"DIRECTIVE_HOOK\": 8,\n  \"8\": \"DIRECTIVE_HOOK\",\n  \"TRANSITION_HOOK\": 9,\n  \"9\": \"TRANSITION_HOOK\",\n  \"APP_ERROR_HANDLER\": 10,\n  \"10\": \"APP_ERROR_HANDLER\",\n  \"APP_WARN_HANDLER\": 11,\n  \"11\": \"APP_WARN_HANDLER\",\n  \"FUNCTION_REF\": 12,\n  \"12\": \"FUNCTION_REF\",\n  \"ASYNC_COMPONENT_LOADER\": 13,\n  \"13\": \"ASYNC_COMPONENT_LOADER\",\n  \"SCHEDULER\": 14,\n  \"14\": \"SCHEDULER\"\n};\nconst ErrorTypeStrings$1 = {\n  [\"sp\"]: \"serverPrefetch hook\",\n  [\"bc\"]: \"beforeCreate hook\",\n  [\"c\"]: \"created hook\",\n  [\"bm\"]: \"beforeMount hook\",\n  [\"m\"]: \"mounted hook\",\n  [\"bu\"]: \"beforeUpdate hook\",\n  [\"u\"]: \"updated\",\n  [\"bum\"]: \"beforeUnmount hook\",\n  [\"um\"]: \"unmounted hook\",\n  [\"a\"]: \"activated hook\",\n  [\"da\"]: \"deactivated hook\",\n  [\"ec\"]: \"errorCaptured hook\",\n  [\"rtc\"]: \"renderTracked hook\",\n  [\"rtg\"]: \"renderTriggered hook\",\n  [0]: \"setup function\",\n  [1]: \"render function\",\n  [2]: \"watcher getter\",\n  [3]: \"watcher callback\",\n  [4]: \"watcher cleanup function\",\n  [5]: \"native event handler\",\n  [6]: \"component event handler\",\n  [7]: \"vnode hook\",\n  [8]: \"directive hook\",\n  [9]: \"transition hook\",\n  [10]: \"app errorHandler\",\n  [11]: \"app warnHandler\",\n  [12]: \"ref function\",\n  [13]: \"async component loader\",\n  [14]: \"scheduler flush. This is likely a Vue internals bug. Please open an issue at https://github.com/vuejs/core .\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n  try {\n    return args ? fn(...args) : fn();\n  } catch (err) {\n    handleError(err, instance, type);\n  }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n  if (isFunction(fn)) {\n    const res = callWithErrorHandling(fn, instance, type, args);\n    if (res && isPromise(res)) {\n      res.catch((err) => {\n        handleError(err, instance, type);\n      });\n    }\n    return res;\n  }\n  if (isArray(fn)) {\n    const values = [];\n    for (let i = 0; i < fn.length; i++) {\n      values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n    }\n    return values;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n    );\n  }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n  const contextVNode = instance ? instance.vnode : null;\n  if (instance) {\n    let cur = instance.parent;\n    const exposedInstance = instance.proxy;\n    const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n    while (cur) {\n      const errorCapturedHooks = cur.ec;\n      if (errorCapturedHooks) {\n        for (let i = 0; i < errorCapturedHooks.length; i++) {\n          if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n            return;\n          }\n        }\n      }\n      cur = cur.parent;\n    }\n    const appErrorHandler = instance.appContext.config.errorHandler;\n    if (appErrorHandler) {\n      pauseTracking();\n      callWithErrorHandling(\n        appErrorHandler,\n        null,\n        10,\n        [err, exposedInstance, errorInfo]\n      );\n      resetTracking();\n      return;\n    }\n  }\n  logError(err, type, contextVNode, throwInDev);\n}\nfunction logError(err, type, contextVNode, throwInDev = true) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const info = ErrorTypeStrings$1[type];\n    if (contextVNode) {\n      pushWarningContext(contextVNode);\n    }\n    warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n    if (contextVNode) {\n      popWarningContext();\n    }\n    if (throwInDev) {\n      throw err;\n    } else {\n      console.error(err);\n    }\n  } else {\n    console.error(err);\n  }\n}\n\nlet isFlushing = false;\nlet isFlushPending = false;\nconst queue = [];\nlet flushIndex = 0;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n  const p = currentFlushPromise || resolvedPromise;\n  return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n  let start = flushIndex + 1;\n  let end = queue.length;\n  while (start < end) {\n    const middle = start + end >>> 1;\n    const middleJob = queue[middle];\n    const middleJobId = getId(middleJob);\n    if (middleJobId < id || middleJobId === id && middleJob.pre) {\n      start = middle + 1;\n    } else {\n      end = middle;\n    }\n  }\n  return start;\n}\nfunction queueJob(job) {\n  if (!queue.length || !queue.includes(\n    job,\n    isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex\n  )) {\n    if (job.id == null) {\n      queue.push(job);\n    } else {\n      queue.splice(findInsertionIndex(job.id), 0, job);\n    }\n    queueFlush();\n  }\n}\nfunction queueFlush() {\n  if (!isFlushing && !isFlushPending) {\n    isFlushPending = true;\n    currentFlushPromise = resolvedPromise.then(flushJobs);\n  }\n}\nfunction invalidateJob(job) {\n  const i = queue.indexOf(job);\n  if (i > flushIndex) {\n    queue.splice(i, 1);\n  }\n}\nfunction queuePostFlushCb(cb) {\n  if (!isArray(cb)) {\n    if (!activePostFlushCbs || !activePostFlushCbs.includes(\n      cb,\n      cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex\n    )) {\n      pendingPostFlushCbs.push(cb);\n    }\n  } else {\n    pendingPostFlushCbs.push(...cb);\n  }\n  queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = isFlushing ? flushIndex + 1 : 0) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    seen = seen || /* @__PURE__ */ new Map();\n  }\n  for (; i < queue.length; i++) {\n    const cb = queue[i];\n    if (cb && cb.pre) {\n      if (instance && cb.id !== instance.uid) {\n        continue;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n        continue;\n      }\n      queue.splice(i, 1);\n      i--;\n      cb();\n    }\n  }\n}\nfunction flushPostFlushCbs(seen) {\n  if (pendingPostFlushCbs.length) {\n    const deduped = [...new Set(pendingPostFlushCbs)].sort(\n      (a, b) => getId(a) - getId(b)\n    );\n    pendingPostFlushCbs.length = 0;\n    if (activePostFlushCbs) {\n      activePostFlushCbs.push(...deduped);\n      return;\n    }\n    activePostFlushCbs = deduped;\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      seen = seen || /* @__PURE__ */ new Map();\n    }\n    for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n      if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) {\n        continue;\n      }\n      activePostFlushCbs[postFlushIndex]();\n    }\n    activePostFlushCbs = null;\n    postFlushIndex = 0;\n  }\n}\nconst getId = (job) => job.id == null ? Infinity : job.id;\nconst comparator = (a, b) => {\n  const diff = getId(a) - getId(b);\n  if (diff === 0) {\n    if (a.pre && !b.pre)\n      return -1;\n    if (b.pre && !a.pre)\n      return 1;\n  }\n  return diff;\n};\nfunction flushJobs(seen) {\n  isFlushPending = false;\n  isFlushing = true;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    seen = seen || /* @__PURE__ */ new Map();\n  }\n  queue.sort(comparator);\n  const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n  try {\n    for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n      const job = queue[flushIndex];\n      if (job && job.active !== false) {\n        if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n          continue;\n        }\n        callWithErrorHandling(job, null, 14);\n      }\n    }\n  } finally {\n    flushIndex = 0;\n    queue.length = 0;\n    flushPostFlushCbs(seen);\n    isFlushing = false;\n    currentFlushPromise = null;\n    if (queue.length || pendingPostFlushCbs.length) {\n      flushJobs(seen);\n    }\n  }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n  if (!seen.has(fn)) {\n    seen.set(fn, 1);\n  } else {\n    const count = seen.get(fn);\n    if (count > RECURSION_LIMIT) {\n      const instance = fn.ownerInstance;\n      const componentName = instance && getComponentName(instance.type);\n      handleError(\n        `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n        null,\n        10\n      );\n      return true;\n    } else {\n      seen.set(fn, count + 1);\n    }\n  }\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Set();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n  getGlobalThis().__VUE_HMR_RUNTIME__ = {\n    createRecord: tryWrap(createRecord),\n    rerender: tryWrap(rerender),\n    reload: tryWrap(reload)\n  };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n  const id = instance.type.__hmrId;\n  let record = map.get(id);\n  if (!record) {\n    createRecord(id, instance.type);\n    record = map.get(id);\n  }\n  record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n  map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n  if (map.has(id)) {\n    return false;\n  }\n  map.set(id, {\n    initialDef: normalizeClassComponent(initialDef),\n    instances: /* @__PURE__ */ new Set()\n  });\n  return true;\n}\nfunction normalizeClassComponent(component) {\n  return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n  const record = map.get(id);\n  if (!record) {\n    return;\n  }\n  record.initialDef.render = newRender;\n  [...record.instances].forEach((instance) => {\n    if (newRender) {\n      instance.render = newRender;\n      normalizeClassComponent(instance.type).render = newRender;\n    }\n    instance.renderCache = [];\n    isHmrUpdating = true;\n    instance.effect.dirty = true;\n    instance.update();\n    isHmrUpdating = false;\n  });\n}\nfunction reload(id, newComp) {\n  const record = map.get(id);\n  if (!record)\n    return;\n  newComp = normalizeClassComponent(newComp);\n  updateComponentDef(record.initialDef, newComp);\n  const instances = [...record.instances];\n  for (const instance of instances) {\n    const oldComp = normalizeClassComponent(instance.type);\n    if (!hmrDirtyComponents.has(oldComp)) {\n      if (oldComp !== record.initialDef) {\n        updateComponentDef(oldComp, newComp);\n      }\n      hmrDirtyComponents.add(oldComp);\n    }\n    instance.appContext.propsCache.delete(instance.type);\n    instance.appContext.emitsCache.delete(instance.type);\n    instance.appContext.optionsCache.delete(instance.type);\n    if (instance.ceReload) {\n      hmrDirtyComponents.add(oldComp);\n      instance.ceReload(newComp.styles);\n      hmrDirtyComponents.delete(oldComp);\n    } else if (instance.parent) {\n      instance.parent.effect.dirty = true;\n      queueJob(instance.parent.update);\n    } else if (instance.appContext.reload) {\n      instance.appContext.reload();\n    } else if (typeof window !== \"undefined\") {\n      window.location.reload();\n    } else {\n      console.warn(\n        \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n      );\n    }\n  }\n  queuePostFlushCb(() => {\n    for (const instance of instances) {\n      hmrDirtyComponents.delete(\n        normalizeClassComponent(instance.type)\n      );\n    }\n  });\n}\nfunction updateComponentDef(oldComp, newComp) {\n  extend(oldComp, newComp);\n  for (const key in oldComp) {\n    if (key !== \"__file\" && !(key in newComp)) {\n      delete oldComp[key];\n    }\n  }\n}\nfunction tryWrap(fn) {\n  return (id, arg) => {\n    try {\n      return fn(id, arg);\n    } catch (e) {\n      console.error(e);\n      console.warn(\n        `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n      );\n    }\n  };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n  if (devtools$1) {\n    devtools$1.emit(event, ...args);\n  } else if (!devtoolsNotInstalled) {\n    buffer.push({ event, args });\n  }\n}\nfunction setDevtoolsHook$1(hook, target) {\n  var _a, _b;\n  devtools$1 = hook;\n  if (devtools$1) {\n    devtools$1.enabled = true;\n    buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n    buffer = [];\n  } else if (\n    // handle late devtools injection - only do this if we are in an actual\n    // browser environment to avoid the timer handle stalling test runner exit\n    // (#4815)\n    typeof window !== \"undefined\" && // some envs mock window but not fully\n    window.HTMLElement && // also exclude jsdom\n    !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n  ) {\n    const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n    replay.push((newHook) => {\n      setDevtoolsHook$1(newHook, target);\n    });\n    setTimeout(() => {\n      if (!devtools$1) {\n        target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n        devtoolsNotInstalled = true;\n        buffer = [];\n      }\n    }, 3e3);\n  } else {\n    devtoolsNotInstalled = true;\n    buffer = [];\n  }\n}\nfunction devtoolsInitApp(app, version) {\n  emit$1(\"app:init\" /* APP_INIT */, app, version, {\n    Fragment,\n    Text,\n    Comment,\n    Static\n  });\n}\nfunction devtoolsUnmountApp(app) {\n  emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\n  \"component:added\" /* COMPONENT_ADDED */\n);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n  \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n  if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n  !devtools$1.cleanupBuffer(component)) {\n    _devtoolsComponentRemoved(component);\n  }\n};\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n  return (component) => {\n    emit$1(\n      hook,\n      component.appContext.app,\n      component.uid,\n      component.parent ? component.parent.uid : void 0,\n      component\n    );\n  };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\n  \"perf:start\" /* PERFORMANCE_START */\n);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\n  \"perf:end\" /* PERFORMANCE_END */\n);\nfunction createDevtoolsPerformanceHook(hook) {\n  return (component, type, time) => {\n    emit$1(hook, component.appContext.app, component.uid, component, type, time);\n  };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n  emit$1(\n    \"component:emit\" /* COMPONENT_EMIT */,\n    component.appContext.app,\n    component,\n    event,\n    params\n  );\n}\n\nfunction emit(instance, event, ...rawArgs) {\n  if (instance.isUnmounted)\n    return;\n  const props = instance.vnode.props || EMPTY_OBJ;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const {\n      emitsOptions,\n      propsOptions: [propsOptions]\n    } = instance;\n    if (emitsOptions) {\n      if (!(event in emitsOptions) && true) {\n        if (!propsOptions || !(toHandlerKey(event) in propsOptions)) {\n          warn$1(\n            `Component emitted event \"${event}\" but it is neither declared in the emits option nor as an \"${toHandlerKey(event)}\" prop.`\n          );\n        }\n      } else {\n        const validator = emitsOptions[event];\n        if (isFunction(validator)) {\n          const isValid = validator(...rawArgs);\n          if (!isValid) {\n            warn$1(\n              `Invalid event arguments: event validation failed for event \"${event}\".`\n            );\n          }\n        }\n      }\n    }\n  }\n  let args = rawArgs;\n  const isModelListener = event.startsWith(\"update:\");\n  const modelArg = isModelListener && event.slice(7);\n  if (modelArg && modelArg in props) {\n    const modifiersKey = `${modelArg === \"modelValue\" ? \"model\" : modelArg}Modifiers`;\n    const { number, trim } = props[modifiersKey] || EMPTY_OBJ;\n    if (trim) {\n      args = rawArgs.map((a) => isString(a) ? a.trim() : a);\n    }\n    if (number) {\n      args = rawArgs.map(looseToNumber);\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsComponentEmit(instance, event, args);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const lowerCaseEvent = event.toLowerCase();\n    if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {\n      warn$1(\n        `Event \"${lowerCaseEvent}\" is emitted in component ${formatComponentName(\n          instance,\n          instance.type\n        )} but the handler is registered for \"${event}\". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use \"${hyphenate(\n          event\n        )}\" instead of \"${event}\".`\n      );\n    }\n  }\n  let handlerName;\n  let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)\n  props[handlerName = toHandlerKey(camelize(event))];\n  if (!handler && isModelListener) {\n    handler = props[handlerName = toHandlerKey(hyphenate(event))];\n  }\n  if (handler) {\n    callWithAsyncErrorHandling(\n      handler,\n      instance,\n      6,\n      args\n    );\n  }\n  const onceHandler = props[handlerName + `Once`];\n  if (onceHandler) {\n    if (!instance.emitted) {\n      instance.emitted = {};\n    } else if (instance.emitted[handlerName]) {\n      return;\n    }\n    instance.emitted[handlerName] = true;\n    callWithAsyncErrorHandling(\n      onceHandler,\n      instance,\n      6,\n      args\n    );\n  }\n}\nfunction normalizeEmitsOptions(comp, appContext, asMixin = false) {\n  const cache = appContext.emitsCache;\n  const cached = cache.get(comp);\n  if (cached !== void 0) {\n    return cached;\n  }\n  const raw = comp.emits;\n  let normalized = {};\n  let hasExtends = false;\n  if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n    const extendEmits = (raw2) => {\n      const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);\n      if (normalizedFromExtend) {\n        hasExtends = true;\n        extend(normalized, normalizedFromExtend);\n      }\n    };\n    if (!asMixin && appContext.mixins.length) {\n      appContext.mixins.forEach(extendEmits);\n    }\n    if (comp.extends) {\n      extendEmits(comp.extends);\n    }\n    if (comp.mixins) {\n      comp.mixins.forEach(extendEmits);\n    }\n  }\n  if (!raw && !hasExtends) {\n    if (isObject(comp)) {\n      cache.set(comp, null);\n    }\n    return null;\n  }\n  if (isArray(raw)) {\n    raw.forEach((key) => normalized[key] = null);\n  } else {\n    extend(normalized, raw);\n  }\n  if (isObject(comp)) {\n    cache.set(comp, normalized);\n  }\n  return normalized;\n}\nfunction isEmitListener(options, key) {\n  if (!options || !isOn(key)) {\n    return false;\n  }\n  key = key.slice(2).replace(/Once$/, \"\");\n  return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n  const prev = currentRenderingInstance;\n  currentRenderingInstance = instance;\n  currentScopeId = instance && instance.type.__scopeId || null;\n  return prev;\n}\nfunction pushScopeId(id) {\n  currentScopeId = id;\n}\nfunction popScopeId() {\n  currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n  if (!ctx)\n    return fn;\n  if (fn._n) {\n    return fn;\n  }\n  const renderFnWithContext = (...args) => {\n    if (renderFnWithContext._d) {\n      setBlockTracking(-1);\n    }\n    const prevInstance = setCurrentRenderingInstance(ctx);\n    let res;\n    try {\n      res = fn(...args);\n    } finally {\n      setCurrentRenderingInstance(prevInstance);\n      if (renderFnWithContext._d) {\n        setBlockTracking(1);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      devtoolsComponentUpdated(ctx);\n    }\n    return res;\n  };\n  renderFnWithContext._n = true;\n  renderFnWithContext._c = true;\n  renderFnWithContext._d = true;\n  return renderFnWithContext;\n}\n\nlet accessedAttrs = false;\nfunction markAttrsAccessed() {\n  accessedAttrs = true;\n}\nfunction renderComponentRoot(instance) {\n  const {\n    type: Component,\n    vnode,\n    proxy,\n    withProxy,\n    propsOptions: [propsOptions],\n    slots,\n    attrs,\n    emit,\n    render,\n    renderCache,\n    props,\n    data,\n    setupState,\n    ctx,\n    inheritAttrs\n  } = instance;\n  const prev = setCurrentRenderingInstance(instance);\n  let result;\n  let fallthroughAttrs;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    accessedAttrs = false;\n  }\n  try {\n    if (vnode.shapeFlag & 4) {\n      const proxyToUse = withProxy || proxy;\n      const thisProxy = !!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup ? new Proxy(proxyToUse, {\n        get(target, key, receiver) {\n          warn$1(\n            `Property '${String(\n              key\n            )}' was accessed via 'this'. Avoid using 'this' in templates.`\n          );\n          return Reflect.get(target, key, receiver);\n        }\n      }) : proxyToUse;\n      result = normalizeVNode(\n        render.call(\n          thisProxy,\n          proxyToUse,\n          renderCache,\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          setupState,\n          data,\n          ctx\n        )\n      );\n      fallthroughAttrs = attrs;\n    } else {\n      const render2 = Component;\n      if (!!(process.env.NODE_ENV !== \"production\") && attrs === props) {\n        markAttrsAccessed();\n      }\n      result = normalizeVNode(\n        render2.length > 1 ? render2(\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          !!(process.env.NODE_ENV !== \"production\") ? {\n            get attrs() {\n              markAttrsAccessed();\n              return shallowReadonly(attrs);\n            },\n            slots,\n            emit\n          } : { attrs, slots, emit }\n        ) : render2(\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          null\n        )\n      );\n      fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);\n    }\n  } catch (err) {\n    blockStack.length = 0;\n    handleError(err, instance, 1);\n    result = createVNode(Comment);\n  }\n  let root = result;\n  let setRoot = void 0;\n  if (!!(process.env.NODE_ENV !== \"production\") && result.patchFlag > 0 && result.patchFlag & 2048) {\n    [root, setRoot] = getChildRoot(result);\n  }\n  if (fallthroughAttrs && inheritAttrs !== false) {\n    const keys = Object.keys(fallthroughAttrs);\n    const { shapeFlag } = root;\n    if (keys.length) {\n      if (shapeFlag & (1 | 6)) {\n        if (propsOptions && keys.some(isModelListener)) {\n          fallthroughAttrs = filterModelListeners(\n            fallthroughAttrs,\n            propsOptions\n          );\n        }\n        root = cloneVNode(root, fallthroughAttrs, false, true);\n      } else if (!!(process.env.NODE_ENV !== \"production\") && !accessedAttrs && root.type !== Comment) {\n        const allAttrs = Object.keys(attrs);\n        const eventAttrs = [];\n        const extraAttrs = [];\n        for (let i = 0, l = allAttrs.length; i < l; i++) {\n          const key = allAttrs[i];\n          if (isOn(key)) {\n            if (!isModelListener(key)) {\n              eventAttrs.push(key[2].toLowerCase() + key.slice(3));\n            }\n          } else {\n            extraAttrs.push(key);\n          }\n        }\n        if (extraAttrs.length) {\n          warn$1(\n            `Extraneous non-props attributes (${extraAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.`\n          );\n        }\n        if (eventAttrs.length) {\n          warn$1(\n            `Extraneous non-emits event listeners (${eventAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the \"emits\" option.`\n          );\n        }\n      }\n    }\n  }\n  if (vnode.dirs) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n      warn$1(\n        `Runtime directive used on component with non-element root node. The directives will not function as intended.`\n      );\n    }\n    root = cloneVNode(root, null, false, true);\n    root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;\n  }\n  if (vnode.transition) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n      warn$1(\n        `Component inside <Transition> renders non-element root node that cannot be animated.`\n      );\n    }\n    root.transition = vnode.transition;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && setRoot) {\n    setRoot(root);\n  } else {\n    result = root;\n  }\n  setCurrentRenderingInstance(prev);\n  return result;\n}\nconst getChildRoot = (vnode) => {\n  const rawChildren = vnode.children;\n  const dynamicChildren = vnode.dynamicChildren;\n  const childRoot = filterSingleRoot(rawChildren, false);\n  if (!childRoot) {\n    return [vnode, void 0];\n  } else if (!!(process.env.NODE_ENV !== \"production\") && childRoot.patchFlag > 0 && childRoot.patchFlag & 2048) {\n    return getChildRoot(childRoot);\n  }\n  const index = rawChildren.indexOf(childRoot);\n  const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;\n  const setRoot = (updatedRoot) => {\n    rawChildren[index] = updatedRoot;\n    if (dynamicChildren) {\n      if (dynamicIndex > -1) {\n        dynamicChildren[dynamicIndex] = updatedRoot;\n      } else if (updatedRoot.patchFlag > 0) {\n        vnode.dynamicChildren = [...dynamicChildren, updatedRoot];\n      }\n    }\n  };\n  return [normalizeVNode(childRoot), setRoot];\n};\nfunction filterSingleRoot(children, recurse = true) {\n  let singleRoot;\n  for (let i = 0; i < children.length; i++) {\n    const child = children[i];\n    if (isVNode(child)) {\n      if (child.type !== Comment || child.children === \"v-if\") {\n        if (singleRoot) {\n          return;\n        } else {\n          singleRoot = child;\n          if (!!(process.env.NODE_ENV !== \"production\") && recurse && singleRoot.patchFlag > 0 && singleRoot.patchFlag & 2048) {\n            return filterSingleRoot(singleRoot.children);\n          }\n        }\n      }\n    } else {\n      return;\n    }\n  }\n  return singleRoot;\n}\nconst getFunctionalFallthrough = (attrs) => {\n  let res;\n  for (const key in attrs) {\n    if (key === \"class\" || key === \"style\" || isOn(key)) {\n      (res || (res = {}))[key] = attrs[key];\n    }\n  }\n  return res;\n};\nconst filterModelListeners = (attrs, props) => {\n  const res = {};\n  for (const key in attrs) {\n    if (!isModelListener(key) || !(key.slice(9) in props)) {\n      res[key] = attrs[key];\n    }\n  }\n  return res;\n};\nconst isElementRoot = (vnode) => {\n  return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;\n};\nfunction shouldUpdateComponent(prevVNode, nextVNode, optimized) {\n  const { props: prevProps, children: prevChildren, component } = prevVNode;\n  const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;\n  const emits = component.emitsOptions;\n  if (!!(process.env.NODE_ENV !== \"production\") && (prevChildren || nextChildren) && isHmrUpdating) {\n    return true;\n  }\n  if (nextVNode.dirs || nextVNode.transition) {\n    return true;\n  }\n  if (optimized && patchFlag >= 0) {\n    if (patchFlag & 1024) {\n      return true;\n    }\n    if (patchFlag & 16) {\n      if (!prevProps) {\n        return !!nextProps;\n      }\n      return hasPropsChanged(prevProps, nextProps, emits);\n    } else if (patchFlag & 8) {\n      const dynamicProps = nextVNode.dynamicProps;\n      for (let i = 0; i < dynamicProps.length; i++) {\n        const key = dynamicProps[i];\n        if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {\n          return true;\n        }\n      }\n    }\n  } else {\n    if (prevChildren || nextChildren) {\n      if (!nextChildren || !nextChildren.$stable) {\n        return true;\n      }\n    }\n    if (prevProps === nextProps) {\n      return false;\n    }\n    if (!prevProps) {\n      return !!nextProps;\n    }\n    if (!nextProps) {\n      return true;\n    }\n    return hasPropsChanged(prevProps, nextProps, emits);\n  }\n  return false;\n}\nfunction hasPropsChanged(prevProps, nextProps, emitsOptions) {\n  const nextKeys = Object.keys(nextProps);\n  if (nextKeys.length !== Object.keys(prevProps).length) {\n    return true;\n  }\n  for (let i = 0; i < nextKeys.length; i++) {\n    const key = nextKeys[i];\n    if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction updateHOCHostEl({ vnode, parent }, el) {\n  while (parent) {\n    const root = parent.subTree;\n    if (root.suspense && root.suspense.activeBranch === vnode) {\n      root.el = vnode.el;\n    }\n    if (root === vnode) {\n      (vnode = parent.vnode).el = el;\n      parent = parent.parent;\n    } else {\n      break;\n    }\n  }\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n  return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n  if (isString(component)) {\n    return resolveAsset(COMPONENTS, component, false) || component;\n  } else {\n    return component || NULL_DYNAMIC_COMPONENT;\n  }\n}\nfunction resolveDirective(name) {\n  return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n  const instance = currentRenderingInstance || currentInstance;\n  if (instance) {\n    const Component = instance.type;\n    if (type === COMPONENTS) {\n      const selfName = getComponentName(\n        Component,\n        false\n      );\n      if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n        return Component;\n      }\n    }\n    const res = (\n      // local registration\n      // check instance[type] first which is resolved for options API\n      resolve(instance[type] || Component[type], name) || // global registration\n      resolve(instance.appContext[type], name)\n    );\n    if (!res && maybeSelfReference) {\n      return Component;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n      const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n      warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n    }\n    return res;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n    );\n  }\n}\nfunction resolve(registry, name) {\n  return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nconst isSuspense = (type) => type.__isSuspense;\nlet suspenseId = 0;\nconst SuspenseImpl = {\n  name: \"Suspense\",\n  // In order to make Suspense tree-shakable, we need to avoid importing it\n  // directly in the renderer. The renderer checks for the __isSuspense flag\n  // on a vnode's type and calls the `process` method, passing in renderer\n  // internals.\n  __isSuspense: true,\n  process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {\n    if (n1 == null) {\n      mountSuspense(\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized,\n        rendererInternals\n      );\n    } else {\n      if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) {\n        n2.suspense = n1.suspense;\n        n2.suspense.vnode = n2;\n        n2.el = n1.el;\n        return;\n      }\n      patchSuspense(\n        n1,\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        namespace,\n        slotScopeIds,\n        optimized,\n        rendererInternals\n      );\n    }\n  },\n  hydrate: hydrateSuspense,\n  create: createSuspenseBoundary,\n  normalize: normalizeSuspenseChildren\n};\nconst Suspense = SuspenseImpl ;\nfunction triggerEvent(vnode, name) {\n  const eventListener = vnode.props && vnode.props[name];\n  if (isFunction(eventListener)) {\n    eventListener();\n  }\n}\nfunction mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {\n  const {\n    p: patch,\n    o: { createElement }\n  } = rendererInternals;\n  const hiddenContainer = createElement(\"div\");\n  const suspense = vnode.suspense = createSuspenseBoundary(\n    vnode,\n    parentSuspense,\n    parentComponent,\n    container,\n    hiddenContainer,\n    anchor,\n    namespace,\n    slotScopeIds,\n    optimized,\n    rendererInternals\n  );\n  patch(\n    null,\n    suspense.pendingBranch = vnode.ssContent,\n    hiddenContainer,\n    null,\n    parentComponent,\n    suspense,\n    namespace,\n    slotScopeIds\n  );\n  if (suspense.deps > 0) {\n    triggerEvent(vnode, \"onPending\");\n    triggerEvent(vnode, \"onFallback\");\n    patch(\n      null,\n      vnode.ssFallback,\n      container,\n      anchor,\n      parentComponent,\n      null,\n      // fallback tree will not have suspense context\n      namespace,\n      slotScopeIds\n    );\n    setActiveBranch(suspense, vnode.ssFallback);\n  } else {\n    suspense.resolve(false, true);\n  }\n}\nfunction patchSuspense(n1, n2, container, anchor, parentComponent, namespace, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {\n  const suspense = n2.suspense = n1.suspense;\n  suspense.vnode = n2;\n  n2.el = n1.el;\n  const newBranch = n2.ssContent;\n  const newFallback = n2.ssFallback;\n  const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;\n  if (pendingBranch) {\n    suspense.pendingBranch = newBranch;\n    if (isSameVNodeType(newBranch, pendingBranch)) {\n      patch(\n        pendingBranch,\n        newBranch,\n        suspense.hiddenContainer,\n        null,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      if (suspense.deps <= 0) {\n        suspense.resolve();\n      } else if (isInFallback) {\n        if (!isHydrating) {\n          patch(\n            activeBranch,\n            newFallback,\n            container,\n            anchor,\n            parentComponent,\n            null,\n            // fallback tree will not have suspense context\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          setActiveBranch(suspense, newFallback);\n        }\n      }\n    } else {\n      suspense.pendingId = suspenseId++;\n      if (isHydrating) {\n        suspense.isHydrating = false;\n        suspense.activeBranch = pendingBranch;\n      } else {\n        unmount(pendingBranch, parentComponent, suspense);\n      }\n      suspense.deps = 0;\n      suspense.effects.length = 0;\n      suspense.hiddenContainer = createElement(\"div\");\n      if (isInFallback) {\n        patch(\n          null,\n          newBranch,\n          suspense.hiddenContainer,\n          null,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        if (suspense.deps <= 0) {\n          suspense.resolve();\n        } else {\n          patch(\n            activeBranch,\n            newFallback,\n            container,\n            anchor,\n            parentComponent,\n            null,\n            // fallback tree will not have suspense context\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          setActiveBranch(suspense, newFallback);\n        }\n      } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n        patch(\n          activeBranch,\n          newBranch,\n          container,\n          anchor,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        suspense.resolve(true);\n      } else {\n        patch(\n          null,\n          newBranch,\n          suspense.hiddenContainer,\n          null,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        if (suspense.deps <= 0) {\n          suspense.resolve();\n        }\n      }\n    }\n  } else {\n    if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n      patch(\n        activeBranch,\n        newBranch,\n        container,\n        anchor,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      setActiveBranch(suspense, newBranch);\n    } else {\n      triggerEvent(n2, \"onPending\");\n      suspense.pendingBranch = newBranch;\n      if (newBranch.shapeFlag & 512) {\n        suspense.pendingId = newBranch.component.suspenseId;\n      } else {\n        suspense.pendingId = suspenseId++;\n      }\n      patch(\n        null,\n        newBranch,\n        suspense.hiddenContainer,\n        null,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      if (suspense.deps <= 0) {\n        suspense.resolve();\n      } else {\n        const { timeout, pendingId } = suspense;\n        if (timeout > 0) {\n          setTimeout(() => {\n            if (suspense.pendingId === pendingId) {\n              suspense.fallback(newFallback);\n            }\n          }, timeout);\n        } else if (timeout === 0) {\n          suspense.fallback(newFallback);\n        }\n      }\n    }\n  }\n}\nlet hasWarned = false;\nfunction createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace, slotScopeIds, optimized, rendererInternals, isHydrating = false) {\n  if (!!(process.env.NODE_ENV !== \"production\") && true && !hasWarned) {\n    hasWarned = true;\n    console[console.info ? \"info\" : \"log\"](\n      `<Suspense> is an experimental feature and its API will likely change.`\n    );\n  }\n  const {\n    p: patch,\n    m: move,\n    um: unmount,\n    n: next,\n    o: { parentNode, remove }\n  } = rendererInternals;\n  let parentSuspenseId;\n  const isSuspensible = isVNodeSuspensible(vnode);\n  if (isSuspensible) {\n    if (parentSuspense && parentSuspense.pendingBranch) {\n      parentSuspenseId = parentSuspense.pendingId;\n      parentSuspense.deps++;\n    }\n  }\n  const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    assertNumber(timeout, `Suspense timeout`);\n  }\n  const initialAnchor = anchor;\n  const suspense = {\n    vnode,\n    parent: parentSuspense,\n    parentComponent,\n    namespace,\n    container,\n    hiddenContainer,\n    deps: 0,\n    pendingId: suspenseId++,\n    timeout: typeof timeout === \"number\" ? timeout : -1,\n    activeBranch: null,\n    pendingBranch: null,\n    isInFallback: !isHydrating,\n    isHydrating,\n    isUnmounted: false,\n    effects: [],\n    resolve(resume = false, sync = false) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (!resume && !suspense.pendingBranch) {\n          throw new Error(\n            `suspense.resolve() is called without a pending branch.`\n          );\n        }\n        if (suspense.isUnmounted) {\n          throw new Error(\n            `suspense.resolve() is called on an already unmounted suspense boundary.`\n          );\n        }\n      }\n      const {\n        vnode: vnode2,\n        activeBranch,\n        pendingBranch,\n        pendingId,\n        effects,\n        parentComponent: parentComponent2,\n        container: container2\n      } = suspense;\n      let delayEnter = false;\n      if (suspense.isHydrating) {\n        suspense.isHydrating = false;\n      } else if (!resume) {\n        delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === \"out-in\";\n        if (delayEnter) {\n          activeBranch.transition.afterLeave = () => {\n            if (pendingId === suspense.pendingId) {\n              move(\n                pendingBranch,\n                container2,\n                anchor === initialAnchor ? next(activeBranch) : anchor,\n                0\n              );\n              queuePostFlushCb(effects);\n            }\n          };\n        }\n        if (activeBranch) {\n          if (parentNode(activeBranch.el) !== suspense.hiddenContainer) {\n            anchor = next(activeBranch);\n          }\n          unmount(activeBranch, parentComponent2, suspense, true);\n        }\n        if (!delayEnter) {\n          move(pendingBranch, container2, anchor, 0);\n        }\n      }\n      setActiveBranch(suspense, pendingBranch);\n      suspense.pendingBranch = null;\n      suspense.isInFallback = false;\n      let parent = suspense.parent;\n      let hasUnresolvedAncestor = false;\n      while (parent) {\n        if (parent.pendingBranch) {\n          parent.effects.push(...effects);\n          hasUnresolvedAncestor = true;\n          break;\n        }\n        parent = parent.parent;\n      }\n      if (!hasUnresolvedAncestor && !delayEnter) {\n        queuePostFlushCb(effects);\n      }\n      suspense.effects = [];\n      if (isSuspensible) {\n        if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {\n          parentSuspense.deps--;\n          if (parentSuspense.deps === 0 && !sync) {\n            parentSuspense.resolve();\n          }\n        }\n      }\n      triggerEvent(vnode2, \"onResolve\");\n    },\n    fallback(fallbackVNode) {\n      if (!suspense.pendingBranch) {\n        return;\n      }\n      const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace2 } = suspense;\n      triggerEvent(vnode2, \"onFallback\");\n      const anchor2 = next(activeBranch);\n      const mountFallback = () => {\n        if (!suspense.isInFallback) {\n          return;\n        }\n        patch(\n          null,\n          fallbackVNode,\n          container2,\n          anchor2,\n          parentComponent2,\n          null,\n          // fallback tree will not have suspense context\n          namespace2,\n          slotScopeIds,\n          optimized\n        );\n        setActiveBranch(suspense, fallbackVNode);\n      };\n      const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === \"out-in\";\n      if (delayEnter) {\n        activeBranch.transition.afterLeave = mountFallback;\n      }\n      suspense.isInFallback = true;\n      unmount(\n        activeBranch,\n        parentComponent2,\n        null,\n        // no suspense so unmount hooks fire now\n        true\n        // shouldRemove\n      );\n      if (!delayEnter) {\n        mountFallback();\n      }\n    },\n    move(container2, anchor2, type) {\n      suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);\n      suspense.container = container2;\n    },\n    next() {\n      return suspense.activeBranch && next(suspense.activeBranch);\n    },\n    registerDep(instance, setupRenderEffect) {\n      const isInPendingSuspense = !!suspense.pendingBranch;\n      if (isInPendingSuspense) {\n        suspense.deps++;\n      }\n      const hydratedEl = instance.vnode.el;\n      instance.asyncDep.catch((err) => {\n        handleError(err, instance, 0);\n      }).then((asyncSetupResult) => {\n        if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {\n          return;\n        }\n        instance.asyncResolved = true;\n        const { vnode: vnode2 } = instance;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(vnode2);\n        }\n        handleSetupResult(instance, asyncSetupResult, false);\n        if (hydratedEl) {\n          vnode2.el = hydratedEl;\n        }\n        const placeholder = !hydratedEl && instance.subTree.el;\n        setupRenderEffect(\n          instance,\n          vnode2,\n          // component may have been moved before resolve.\n          // if this is not a hydration, instance.subTree will be the comment\n          // placeholder.\n          parentNode(hydratedEl || instance.subTree.el),\n          // anchor will not be used if this is hydration, so only need to\n          // consider the comment placeholder case.\n          hydratedEl ? null : next(instance.subTree),\n          suspense,\n          namespace,\n          optimized\n        );\n        if (placeholder) {\n          remove(placeholder);\n        }\n        updateHOCHostEl(instance, vnode2.el);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n        if (isInPendingSuspense && --suspense.deps === 0) {\n          suspense.resolve();\n        }\n      });\n    },\n    unmount(parentSuspense2, doRemove) {\n      suspense.isUnmounted = true;\n      if (suspense.activeBranch) {\n        unmount(\n          suspense.activeBranch,\n          parentComponent,\n          parentSuspense2,\n          doRemove\n        );\n      }\n      if (suspense.pendingBranch) {\n        unmount(\n          suspense.pendingBranch,\n          parentComponent,\n          parentSuspense2,\n          doRemove\n        );\n      }\n    }\n  };\n  return suspense;\n}\nfunction hydrateSuspense(node, vnode, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals, hydrateNode) {\n  const suspense = vnode.suspense = createSuspenseBoundary(\n    vnode,\n    parentSuspense,\n    parentComponent,\n    node.parentNode,\n    // eslint-disable-next-line no-restricted-globals\n    document.createElement(\"div\"),\n    null,\n    namespace,\n    slotScopeIds,\n    optimized,\n    rendererInternals,\n    true\n  );\n  const result = hydrateNode(\n    node,\n    suspense.pendingBranch = vnode.ssContent,\n    parentComponent,\n    suspense,\n    slotScopeIds,\n    optimized\n  );\n  if (suspense.deps === 0) {\n    suspense.resolve(false, true);\n  }\n  return result;\n}\nfunction normalizeSuspenseChildren(vnode) {\n  const { shapeFlag, children } = vnode;\n  const isSlotChildren = shapeFlag & 32;\n  vnode.ssContent = normalizeSuspenseSlot(\n    isSlotChildren ? children.default : children\n  );\n  vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);\n}\nfunction normalizeSuspenseSlot(s) {\n  let block;\n  if (isFunction(s)) {\n    const trackBlock = isBlockTreeEnabled && s._c;\n    if (trackBlock) {\n      s._d = false;\n      openBlock();\n    }\n    s = s();\n    if (trackBlock) {\n      s._d = true;\n      block = currentBlock;\n      closeBlock();\n    }\n  }\n  if (isArray(s)) {\n    const singleChild = filterSingleRoot(s);\n    if (!!(process.env.NODE_ENV !== \"production\") && !singleChild && s.filter((child) => child !== NULL_DYNAMIC_COMPONENT).length > 0) {\n      warn$1(`<Suspense> slots expect a single root node.`);\n    }\n    s = singleChild;\n  }\n  s = normalizeVNode(s);\n  if (block && !s.dynamicChildren) {\n    s.dynamicChildren = block.filter((c) => c !== s);\n  }\n  return s;\n}\nfunction queueEffectWithSuspense(fn, suspense) {\n  if (suspense && suspense.pendingBranch) {\n    if (isArray(fn)) {\n      suspense.effects.push(...fn);\n    } else {\n      suspense.effects.push(fn);\n    }\n  } else {\n    queuePostFlushCb(fn);\n  }\n}\nfunction setActiveBranch(suspense, branch) {\n  suspense.activeBranch = branch;\n  const { vnode, parentComponent } = suspense;\n  let el = branch.el;\n  while (!el && branch.component) {\n    branch = branch.component.subTree;\n    el = branch.el;\n  }\n  vnode.el = el;\n  if (parentComponent && parentComponent.subTree === vnode) {\n    parentComponent.vnode.el = el;\n    updateHOCHostEl(parentComponent, el);\n  }\n}\nfunction isVNodeSuspensible(vnode) {\n  const suspensible = vnode.props && vnode.props.suspensible;\n  return suspensible != null && suspensible !== false;\n}\n\nconst ssrContextKey = Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n  {\n    const ctx = inject(ssrContextKey);\n    if (!ctx) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n      );\n    }\n    return ctx;\n  }\n};\n\nfunction watchEffect(effect, options) {\n  return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n  return doWatch(\n    effect,\n    null,\n    !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n  );\n}\nfunction watchSyncEffect(effect, options) {\n  return doWatch(\n    effect,\n    null,\n    !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n  );\n}\nconst INITIAL_WATCHER_VALUE = {};\nfunction watch(source, cb, options) {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n    warn$1(\n      `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n    );\n  }\n  return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, {\n  immediate,\n  deep,\n  flush,\n  once,\n  onTrack,\n  onTrigger\n} = EMPTY_OBJ) {\n  if (cb && once) {\n    const _cb = cb;\n    cb = (...args) => {\n      _cb(...args);\n      unwatch();\n    };\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && deep !== void 0 && typeof deep === \"number\") {\n    warn$1(\n      `watch() \"deep\" option with number value will be used as watch depth in future versions. Please use a boolean instead to avoid potential breakage.`\n    );\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n    if (immediate !== void 0) {\n      warn$1(\n        `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n    if (deep !== void 0) {\n      warn$1(\n        `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n    if (once !== void 0) {\n      warn$1(\n        `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n  }\n  const warnInvalidSource = (s) => {\n    warn$1(\n      `Invalid watch source: `,\n      s,\n      `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n    );\n  };\n  const instance = currentInstance;\n  const reactiveGetter = (source2) => deep === true ? source2 : (\n    // for deep: false, only traverse root-level properties\n    traverse(source2, deep === false ? 1 : void 0)\n  );\n  let getter;\n  let forceTrigger = false;\n  let isMultiSource = false;\n  if (isRef(source)) {\n    getter = () => source.value;\n    forceTrigger = isShallow(source);\n  } else if (isReactive(source)) {\n    getter = () => reactiveGetter(source);\n    forceTrigger = true;\n  } else if (isArray(source)) {\n    isMultiSource = true;\n    forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n    getter = () => source.map((s) => {\n      if (isRef(s)) {\n        return s.value;\n      } else if (isReactive(s)) {\n        return reactiveGetter(s);\n      } else if (isFunction(s)) {\n        return callWithErrorHandling(s, instance, 2);\n      } else {\n        !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n      }\n    });\n  } else if (isFunction(source)) {\n    if (cb) {\n      getter = () => callWithErrorHandling(source, instance, 2);\n    } else {\n      getter = () => {\n        if (cleanup) {\n          cleanup();\n        }\n        return callWithAsyncErrorHandling(\n          source,\n          instance,\n          3,\n          [onCleanup]\n        );\n      };\n    }\n  } else {\n    getter = NOOP;\n    !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n  }\n  if (cb && deep) {\n    const baseGetter = getter;\n    getter = () => traverse(baseGetter());\n  }\n  let cleanup;\n  let onCleanup = (fn) => {\n    cleanup = effect.onStop = () => {\n      callWithErrorHandling(fn, instance, 4);\n      cleanup = effect.onStop = void 0;\n    };\n  };\n  let ssrCleanup;\n  if (isInSSRComponentSetup) {\n    onCleanup = NOOP;\n    if (!cb) {\n      getter();\n    } else if (immediate) {\n      callWithAsyncErrorHandling(cb, instance, 3, [\n        getter(),\n        isMultiSource ? [] : void 0,\n        onCleanup\n      ]);\n    }\n    if (flush === \"sync\") {\n      const ctx = useSSRContext();\n      ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n    } else {\n      return NOOP;\n    }\n  }\n  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n  const job = () => {\n    if (!effect.active || !effect.dirty) {\n      return;\n    }\n    if (cb) {\n      const newValue = effect.run();\n      if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) {\n        if (cleanup) {\n          cleanup();\n        }\n        callWithAsyncErrorHandling(cb, instance, 3, [\n          newValue,\n          // pass undefined as the old value when it's changed for the first time\n          oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n          onCleanup\n        ]);\n        oldValue = newValue;\n      }\n    } else {\n      effect.run();\n    }\n  };\n  job.allowRecurse = !!cb;\n  let scheduler;\n  if (flush === \"sync\") {\n    scheduler = job;\n  } else if (flush === \"post\") {\n    scheduler = () => queuePostRenderEffect(job, instance && instance.suspense);\n  } else {\n    job.pre = true;\n    if (instance)\n      job.id = instance.uid;\n    scheduler = () => queueJob(job);\n  }\n  const effect = new ReactiveEffect(getter, NOOP, scheduler);\n  const scope = getCurrentScope();\n  const unwatch = () => {\n    effect.stop();\n    if (scope) {\n      remove(scope.effects, effect);\n    }\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    effect.onTrack = onTrack;\n    effect.onTrigger = onTrigger;\n  }\n  if (cb) {\n    if (immediate) {\n      job();\n    } else {\n      oldValue = effect.run();\n    }\n  } else if (flush === \"post\") {\n    queuePostRenderEffect(\n      effect.run.bind(effect),\n      instance && instance.suspense\n    );\n  } else {\n    effect.run();\n  }\n  if (ssrCleanup)\n    ssrCleanup.push(unwatch);\n  return unwatch;\n}\nfunction instanceWatch(source, value, options) {\n  const publicThis = this.proxy;\n  const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n  let cb;\n  if (isFunction(value)) {\n    cb = value;\n  } else {\n    cb = value.handler;\n    options = value;\n  }\n  const reset = setCurrentInstance(this);\n  const res = doWatch(getter, cb.bind(publicThis), options);\n  reset();\n  return res;\n}\nfunction createPathGetter(ctx, path) {\n  const segments = path.split(\".\");\n  return () => {\n    let cur = ctx;\n    for (let i = 0; i < segments.length && cur; i++) {\n      cur = cur[segments[i]];\n    }\n    return cur;\n  };\n}\nfunction traverse(value, depth = Infinity, seen) {\n  if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n    return value;\n  }\n  seen = seen || /* @__PURE__ */ new Set();\n  if (seen.has(value)) {\n    return value;\n  }\n  seen.add(value);\n  depth--;\n  if (isRef(value)) {\n    traverse(value.value, depth, seen);\n  } else if (isArray(value)) {\n    for (let i = 0; i < value.length; i++) {\n      traverse(value[i], depth, seen);\n    }\n  } else if (isSet(value) || isMap(value)) {\n    value.forEach((v) => {\n      traverse(v, depth, seen);\n    });\n  } else if (isPlainObject(value)) {\n    for (const key in value) {\n      traverse(value[key], depth, seen);\n    }\n  }\n  return value;\n}\n\nfunction validateDirectiveName(name) {\n  if (isBuiltInDirective(name)) {\n    warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n  }\n}\nfunction withDirectives(vnode, directives) {\n  if (currentRenderingInstance === null) {\n    !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n    return vnode;\n  }\n  const instance = getExposeProxy(currentRenderingInstance) || currentRenderingInstance.proxy;\n  const bindings = vnode.dirs || (vnode.dirs = []);\n  for (let i = 0; i < directives.length; i++) {\n    let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n    if (dir) {\n      if (isFunction(dir)) {\n        dir = {\n          mounted: dir,\n          updated: dir\n        };\n      }\n      if (dir.deep) {\n        traverse(value);\n      }\n      bindings.push({\n        dir,\n        instance,\n        value,\n        oldValue: void 0,\n        arg,\n        modifiers\n      });\n    }\n  }\n  return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n  const bindings = vnode.dirs;\n  const oldBindings = prevVNode && prevVNode.dirs;\n  for (let i = 0; i < bindings.length; i++) {\n    const binding = bindings[i];\n    if (oldBindings) {\n      binding.oldValue = oldBindings[i].value;\n    }\n    let hook = binding.dir[name];\n    if (hook) {\n      pauseTracking();\n      callWithAsyncErrorHandling(hook, instance, 8, [\n        vnode.el,\n        binding,\n        vnode,\n        prevVNode\n      ]);\n      resetTracking();\n    }\n  }\n}\n\nconst leaveCbKey = Symbol(\"_leaveCb\");\nconst enterCbKey = Symbol(\"_enterCb\");\nfunction useTransitionState() {\n  const state = {\n    isMounted: false,\n    isLeaving: false,\n    isUnmounting: false,\n    leavingVNodes: /* @__PURE__ */ new Map()\n  };\n  onMounted(() => {\n    state.isMounted = true;\n  });\n  onBeforeUnmount(() => {\n    state.isUnmounting = true;\n  });\n  return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n  mode: String,\n  appear: Boolean,\n  persisted: Boolean,\n  // enter\n  onBeforeEnter: TransitionHookValidator,\n  onEnter: TransitionHookValidator,\n  onAfterEnter: TransitionHookValidator,\n  onEnterCancelled: TransitionHookValidator,\n  // leave\n  onBeforeLeave: TransitionHookValidator,\n  onLeave: TransitionHookValidator,\n  onAfterLeave: TransitionHookValidator,\n  onLeaveCancelled: TransitionHookValidator,\n  // appear\n  onBeforeAppear: TransitionHookValidator,\n  onAppear: TransitionHookValidator,\n  onAfterAppear: TransitionHookValidator,\n  onAppearCancelled: TransitionHookValidator\n};\nconst BaseTransitionImpl = {\n  name: `BaseTransition`,\n  props: BaseTransitionPropsValidators,\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const state = useTransitionState();\n    return () => {\n      const children = slots.default && getTransitionRawChildren(slots.default(), true);\n      if (!children || !children.length) {\n        return;\n      }\n      let child = children[0];\n      if (children.length > 1) {\n        let hasFound = false;\n        for (const c of children) {\n          if (c.type !== Comment) {\n            if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n              warn$1(\n                \"<transition> can only be used on a single element or component. Use <transition-group> for lists.\"\n              );\n              break;\n            }\n            child = c;\n            hasFound = true;\n            if (!!!(process.env.NODE_ENV !== \"production\"))\n              break;\n          }\n        }\n      }\n      const rawProps = toRaw(props);\n      const { mode } = rawProps;\n      if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n        warn$1(`invalid <transition> mode: ${mode}`);\n      }\n      if (state.isLeaving) {\n        return emptyPlaceholder(child);\n      }\n      const innerChild = getKeepAliveChild(child);\n      if (!innerChild) {\n        return emptyPlaceholder(child);\n      }\n      const enterHooks = resolveTransitionHooks(\n        innerChild,\n        rawProps,\n        state,\n        instance\n      );\n      setTransitionHooks(innerChild, enterHooks);\n      const oldChild = instance.subTree;\n      const oldInnerChild = oldChild && getKeepAliveChild(oldChild);\n      if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild)) {\n        const leavingHooks = resolveTransitionHooks(\n          oldInnerChild,\n          rawProps,\n          state,\n          instance\n        );\n        setTransitionHooks(oldInnerChild, leavingHooks);\n        if (mode === \"out-in\" && innerChild.type !== Comment) {\n          state.isLeaving = true;\n          leavingHooks.afterLeave = () => {\n            state.isLeaving = false;\n            if (instance.update.active !== false) {\n              instance.effect.dirty = true;\n              instance.update();\n            }\n          };\n          return emptyPlaceholder(child);\n        } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n          leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n            const leavingVNodesCache = getLeavingNodesForType(\n              state,\n              oldInnerChild\n            );\n            leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n            el[leaveCbKey] = () => {\n              earlyRemove();\n              el[leaveCbKey] = void 0;\n              delete enterHooks.delayedLeave;\n            };\n            enterHooks.delayedLeave = delayedLeave;\n          };\n        }\n      }\n      return child;\n    };\n  }\n};\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n  const { leavingVNodes } = state;\n  let leavingVNodesCache = leavingVNodes.get(vnode.type);\n  if (!leavingVNodesCache) {\n    leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n    leavingVNodes.set(vnode.type, leavingVNodesCache);\n  }\n  return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance) {\n  const {\n    appear,\n    mode,\n    persisted = false,\n    onBeforeEnter,\n    onEnter,\n    onAfterEnter,\n    onEnterCancelled,\n    onBeforeLeave,\n    onLeave,\n    onAfterLeave,\n    onLeaveCancelled,\n    onBeforeAppear,\n    onAppear,\n    onAfterAppear,\n    onAppearCancelled\n  } = props;\n  const key = String(vnode.key);\n  const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n  const callHook = (hook, args) => {\n    hook && callWithAsyncErrorHandling(\n      hook,\n      instance,\n      9,\n      args\n    );\n  };\n  const callAsyncHook = (hook, args) => {\n    const done = args[1];\n    callHook(hook, args);\n    if (isArray(hook)) {\n      if (hook.every((hook2) => hook2.length <= 1))\n        done();\n    } else if (hook.length <= 1) {\n      done();\n    }\n  };\n  const hooks = {\n    mode,\n    persisted,\n    beforeEnter(el) {\n      let hook = onBeforeEnter;\n      if (!state.isMounted) {\n        if (appear) {\n          hook = onBeforeAppear || onBeforeEnter;\n        } else {\n          return;\n        }\n      }\n      if (el[leaveCbKey]) {\n        el[leaveCbKey](\n          true\n          /* cancelled */\n        );\n      }\n      const leavingVNode = leavingVNodesCache[key];\n      if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n        leavingVNode.el[leaveCbKey]();\n      }\n      callHook(hook, [el]);\n    },\n    enter(el) {\n      let hook = onEnter;\n      let afterHook = onAfterEnter;\n      let cancelHook = onEnterCancelled;\n      if (!state.isMounted) {\n        if (appear) {\n          hook = onAppear || onEnter;\n          afterHook = onAfterAppear || onAfterEnter;\n          cancelHook = onAppearCancelled || onEnterCancelled;\n        } else {\n          return;\n        }\n      }\n      let called = false;\n      const done = el[enterCbKey] = (cancelled) => {\n        if (called)\n          return;\n        called = true;\n        if (cancelled) {\n          callHook(cancelHook, [el]);\n        } else {\n          callHook(afterHook, [el]);\n        }\n        if (hooks.delayedLeave) {\n          hooks.delayedLeave();\n        }\n        el[enterCbKey] = void 0;\n      };\n      if (hook) {\n        callAsyncHook(hook, [el, done]);\n      } else {\n        done();\n      }\n    },\n    leave(el, remove) {\n      const key2 = String(vnode.key);\n      if (el[enterCbKey]) {\n        el[enterCbKey](\n          true\n          /* cancelled */\n        );\n      }\n      if (state.isUnmounting) {\n        return remove();\n      }\n      callHook(onBeforeLeave, [el]);\n      let called = false;\n      const done = el[leaveCbKey] = (cancelled) => {\n        if (called)\n          return;\n        called = true;\n        remove();\n        if (cancelled) {\n          callHook(onLeaveCancelled, [el]);\n        } else {\n          callHook(onAfterLeave, [el]);\n        }\n        el[leaveCbKey] = void 0;\n        if (leavingVNodesCache[key2] === vnode) {\n          delete leavingVNodesCache[key2];\n        }\n      };\n      leavingVNodesCache[key2] = vnode;\n      if (onLeave) {\n        callAsyncHook(onLeave, [el, done]);\n      } else {\n        done();\n      }\n    },\n    clone(vnode2) {\n      return resolveTransitionHooks(vnode2, props, state, instance);\n    }\n  };\n  return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n  if (isKeepAlive(vnode)) {\n    vnode = cloneVNode(vnode);\n    vnode.children = null;\n    return vnode;\n  }\n}\nfunction getKeepAliveChild(vnode) {\n  if (!isKeepAlive(vnode)) {\n    return vnode;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && vnode.component) {\n    return vnode.component.subTree;\n  }\n  const { shapeFlag, children } = vnode;\n  if (children) {\n    if (shapeFlag & 16) {\n      return children[0];\n    }\n    if (shapeFlag & 32 && isFunction(children.default)) {\n      return children.default();\n    }\n  }\n}\nfunction setTransitionHooks(vnode, hooks) {\n  if (vnode.shapeFlag & 6 && vnode.component) {\n    setTransitionHooks(vnode.component.subTree, hooks);\n  } else if (vnode.shapeFlag & 128) {\n    vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n    vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n  } else {\n    vnode.transition = hooks;\n  }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n  let ret = [];\n  let keyedFragmentCount = 0;\n  for (let i = 0; i < children.length; i++) {\n    let child = children[i];\n    const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n    if (child.type === Fragment) {\n      if (child.patchFlag & 128)\n        keyedFragmentCount++;\n      ret = ret.concat(\n        getTransitionRawChildren(child.children, keepComment, key)\n      );\n    } else if (keepComment || child.type !== Comment) {\n      ret.push(key != null ? cloneVNode(child, { key }) : child);\n    }\n  }\n  if (keyedFragmentCount > 1) {\n    for (let i = 0; i < ret.length; i++) {\n      ret[i].patchFlag = -2;\n    }\n  }\n  return ret;\n}\n\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n  return isFunction(options) ? (\n    // #8326: extend call and options.name access are considered side-effects\n    // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n    /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n  ) : options;\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n  if (isFunction(source)) {\n    source = { loader: source };\n  }\n  const {\n    loader,\n    loadingComponent,\n    errorComponent,\n    delay = 200,\n    timeout,\n    // undefined = never times out\n    suspensible = true,\n    onError: userOnError\n  } = source;\n  let pendingRequest = null;\n  let resolvedComp;\n  let retries = 0;\n  const retry = () => {\n    retries++;\n    pendingRequest = null;\n    return load();\n  };\n  const load = () => {\n    let thisRequest;\n    return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n      err = err instanceof Error ? err : new Error(String(err));\n      if (userOnError) {\n        return new Promise((resolve, reject) => {\n          const userRetry = () => resolve(retry());\n          const userFail = () => reject(err);\n          userOnError(err, userRetry, userFail, retries + 1);\n        });\n      } else {\n        throw err;\n      }\n    }).then((comp) => {\n      if (thisRequest !== pendingRequest && pendingRequest) {\n        return pendingRequest;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n        warn$1(\n          `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n        );\n      }\n      if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n        comp = comp.default;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n        throw new Error(`Invalid async component load result: ${comp}`);\n      }\n      resolvedComp = comp;\n      return comp;\n    }));\n  };\n  return defineComponent({\n    name: \"AsyncComponentWrapper\",\n    __asyncLoader: load,\n    get __asyncResolved() {\n      return resolvedComp;\n    },\n    setup() {\n      const instance = currentInstance;\n      if (resolvedComp) {\n        return () => createInnerComp(resolvedComp, instance);\n      }\n      const onError = (err) => {\n        pendingRequest = null;\n        handleError(\n          err,\n          instance,\n          13,\n          !errorComponent\n        );\n      };\n      if (suspensible && instance.suspense || isInSSRComponentSetup) {\n        return load().then((comp) => {\n          return () => createInnerComp(comp, instance);\n        }).catch((err) => {\n          onError(err);\n          return () => errorComponent ? createVNode(errorComponent, {\n            error: err\n          }) : null;\n        });\n      }\n      const loaded = ref(false);\n      const error = ref();\n      const delayed = ref(!!delay);\n      if (delay) {\n        setTimeout(() => {\n          delayed.value = false;\n        }, delay);\n      }\n      if (timeout != null) {\n        setTimeout(() => {\n          if (!loaded.value && !error.value) {\n            const err = new Error(\n              `Async component timed out after ${timeout}ms.`\n            );\n            onError(err);\n            error.value = err;\n          }\n        }, timeout);\n      }\n      load().then(() => {\n        loaded.value = true;\n        if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n          instance.parent.effect.dirty = true;\n          queueJob(instance.parent.update);\n        }\n      }).catch((err) => {\n        onError(err);\n        error.value = err;\n      });\n      return () => {\n        if (loaded.value && resolvedComp) {\n          return createInnerComp(resolvedComp, instance);\n        } else if (error.value && errorComponent) {\n          return createVNode(errorComponent, {\n            error: error.value\n          });\n        } else if (loadingComponent && !delayed.value) {\n          return createVNode(loadingComponent);\n        }\n      };\n    }\n  });\n}\nfunction createInnerComp(comp, parent) {\n  const { ref: ref2, props, children, ce } = parent.vnode;\n  const vnode = createVNode(comp, props, children);\n  vnode.ref = ref2;\n  vnode.ce = ce;\n  delete parent.vnode.ce;\n  return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n  name: `KeepAlive`,\n  // Marker for special handling inside the renderer. We are not using a ===\n  // check directly on KeepAlive in the renderer, because importing it directly\n  // would prevent it from being tree-shaken.\n  __isKeepAlive: true,\n  props: {\n    include: [String, RegExp, Array],\n    exclude: [String, RegExp, Array],\n    max: [String, Number]\n  },\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const sharedContext = instance.ctx;\n    if (!sharedContext.renderer) {\n      return () => {\n        const children = slots.default && slots.default();\n        return children && children.length === 1 ? children[0] : children;\n      };\n    }\n    const cache = /* @__PURE__ */ new Map();\n    const keys = /* @__PURE__ */ new Set();\n    let current = null;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      instance.__v_cache = cache;\n    }\n    const parentSuspense = instance.suspense;\n    const {\n      renderer: {\n        p: patch,\n        m: move,\n        um: _unmount,\n        o: { createElement }\n      }\n    } = sharedContext;\n    const storageContainer = createElement(\"div\");\n    sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n      const instance2 = vnode.component;\n      move(vnode, container, anchor, 0, parentSuspense);\n      patch(\n        instance2.vnode,\n        vnode,\n        container,\n        anchor,\n        instance2,\n        parentSuspense,\n        namespace,\n        vnode.slotScopeIds,\n        optimized\n      );\n      queuePostRenderEffect(() => {\n        instance2.isDeactivated = false;\n        if (instance2.a) {\n          invokeArrayFns(instance2.a);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n      }, parentSuspense);\n      if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n        devtoolsComponentAdded(instance2);\n      }\n    };\n    sharedContext.deactivate = (vnode) => {\n      const instance2 = vnode.component;\n      move(vnode, storageContainer, null, 1, parentSuspense);\n      queuePostRenderEffect(() => {\n        if (instance2.da) {\n          invokeArrayFns(instance2.da);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n        instance2.isDeactivated = true;\n      }, parentSuspense);\n      if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n        devtoolsComponentAdded(instance2);\n      }\n    };\n    function unmount(vnode) {\n      resetShapeFlag(vnode);\n      _unmount(vnode, instance, parentSuspense, true);\n    }\n    function pruneCache(filter) {\n      cache.forEach((vnode, key) => {\n        const name = getComponentName(vnode.type);\n        if (name && (!filter || !filter(name))) {\n          pruneCacheEntry(key);\n        }\n      });\n    }\n    function pruneCacheEntry(key) {\n      const cached = cache.get(key);\n      if (!current || !isSameVNodeType(cached, current)) {\n        unmount(cached);\n      } else if (current) {\n        resetShapeFlag(current);\n      }\n      cache.delete(key);\n      keys.delete(key);\n    }\n    watch(\n      () => [props.include, props.exclude],\n      ([include, exclude]) => {\n        include && pruneCache((name) => matches(include, name));\n        exclude && pruneCache((name) => !matches(exclude, name));\n      },\n      // prune post-render after `current` has been updated\n      { flush: \"post\", deep: true }\n    );\n    let pendingCacheKey = null;\n    const cacheSubtree = () => {\n      if (pendingCacheKey != null) {\n        cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n      }\n    };\n    onMounted(cacheSubtree);\n    onUpdated(cacheSubtree);\n    onBeforeUnmount(() => {\n      cache.forEach((cached) => {\n        const { subTree, suspense } = instance;\n        const vnode = getInnerChild(subTree);\n        if (cached.type === vnode.type && cached.key === vnode.key) {\n          resetShapeFlag(vnode);\n          const da = vnode.component.da;\n          da && queuePostRenderEffect(da, suspense);\n          return;\n        }\n        unmount(cached);\n      });\n    });\n    return () => {\n      pendingCacheKey = null;\n      if (!slots.default) {\n        return null;\n      }\n      const children = slots.default();\n      const rawVNode = children[0];\n      if (children.length > 1) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(`KeepAlive should contain exactly one component child.`);\n        }\n        current = null;\n        return children;\n      } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n        current = null;\n        return rawVNode;\n      }\n      let vnode = getInnerChild(rawVNode);\n      const comp = vnode.type;\n      const name = getComponentName(\n        isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n      );\n      const { include, exclude, max } = props;\n      if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n        current = vnode;\n        return rawVNode;\n      }\n      const key = vnode.key == null ? comp : vnode.key;\n      const cachedVNode = cache.get(key);\n      if (vnode.el) {\n        vnode = cloneVNode(vnode);\n        if (rawVNode.shapeFlag & 128) {\n          rawVNode.ssContent = vnode;\n        }\n      }\n      pendingCacheKey = key;\n      if (cachedVNode) {\n        vnode.el = cachedVNode.el;\n        vnode.component = cachedVNode.component;\n        if (vnode.transition) {\n          setTransitionHooks(vnode, vnode.transition);\n        }\n        vnode.shapeFlag |= 512;\n        keys.delete(key);\n        keys.add(key);\n      } else {\n        keys.add(key);\n        if (max && keys.size > parseInt(max, 10)) {\n          pruneCacheEntry(keys.values().next().value);\n        }\n      }\n      vnode.shapeFlag |= 256;\n      current = vnode;\n      return isSuspense(rawVNode.type) ? rawVNode : vnode;\n    };\n  }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n  if (isArray(pattern)) {\n    return pattern.some((p) => matches(p, name));\n  } else if (isString(pattern)) {\n    return pattern.split(\",\").includes(name);\n  } else if (isRegExp(pattern)) {\n    return pattern.test(name);\n  }\n  return false;\n}\nfunction onActivated(hook, target) {\n  registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n  registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n  const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n    let current = target;\n    while (current) {\n      if (current.isDeactivated) {\n        return;\n      }\n      current = current.parent;\n    }\n    return hook();\n  });\n  injectHook(type, wrappedHook, target);\n  if (target) {\n    let current = target.parent;\n    while (current && current.parent) {\n      if (isKeepAlive(current.parent.vnode)) {\n        injectToKeepAliveRoot(wrappedHook, type, target, current);\n      }\n      current = current.parent;\n    }\n  }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n  const injected = injectHook(\n    type,\n    hook,\n    keepAliveRoot,\n    true\n    /* prepend */\n  );\n  onUnmounted(() => {\n    remove(keepAliveRoot[type], injected);\n  }, target);\n}\nfunction resetShapeFlag(vnode) {\n  vnode.shapeFlag &= ~256;\n  vnode.shapeFlag &= ~512;\n}\nfunction getInnerChild(vnode) {\n  return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n  if (target) {\n    const hooks = target[type] || (target[type] = []);\n    const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n      if (target.isUnmounted) {\n        return;\n      }\n      pauseTracking();\n      const reset = setCurrentInstance(target);\n      const res = callWithAsyncErrorHandling(hook, target, type, args);\n      reset();\n      resetTracking();\n      return res;\n    });\n    if (prepend) {\n      hooks.unshift(wrappedHook);\n    } else {\n      hooks.push(wrappedHook);\n    }\n    return wrappedHook;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n    warn$1(\n      `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n    );\n  }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => (\n  // post-create lifecycle registrations are noops during SSR (except for serverPrefetch)\n  (!isInSSRComponentSetup || lifecycle === \"sp\") && injectHook(lifecycle, (...args) => hook(...args), target)\n);\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\"bu\");\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\"bum\");\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\"sp\");\nconst onRenderTriggered = createHook(\n  \"rtg\"\n);\nconst onRenderTracked = createHook(\n  \"rtc\"\n);\nfunction onErrorCaptured(hook, target = currentInstance) {\n  injectHook(\"ec\", hook, target);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n  let ret;\n  const cached = cache && cache[index];\n  if (isArray(source) || isString(source)) {\n    ret = new Array(source.length);\n    for (let i = 0, l = source.length; i < l; i++) {\n      ret[i] = renderItem(source[i], i, void 0, cached && cached[i]);\n    }\n  } else if (typeof source === \"number\") {\n    if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n      warn$1(`The v-for range expect an integer value but got ${source}.`);\n    }\n    ret = new Array(source);\n    for (let i = 0; i < source; i++) {\n      ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n    }\n  } else if (isObject(source)) {\n    if (source[Symbol.iterator]) {\n      ret = Array.from(\n        source,\n        (item, i) => renderItem(item, i, void 0, cached && cached[i])\n      );\n    } else {\n      const keys = Object.keys(source);\n      ret = new Array(keys.length);\n      for (let i = 0, l = keys.length; i < l; i++) {\n        const key = keys[i];\n        ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n      }\n    }\n  } else {\n    ret = [];\n  }\n  if (cache) {\n    cache[index] = ret;\n  }\n  return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n  for (let i = 0; i < dynamicSlots.length; i++) {\n    const slot = dynamicSlots[i];\n    if (isArray(slot)) {\n      for (let j = 0; j < slot.length; j++) {\n        slots[slot[j].name] = slot[j].fn;\n      }\n    } else if (slot) {\n      slots[slot.name] = slot.key ? (...args) => {\n        const res = slot.fn(...args);\n        if (res)\n          res.key = slot.key;\n        return res;\n      } : slot.fn;\n    }\n  }\n  return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n  if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) {\n    if (name !== \"default\")\n      props.name = name;\n    return createVNode(\"slot\", props, fallback && fallback());\n  }\n  let slot = slots[name];\n  if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n    warn$1(\n      `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n    );\n    slot = () => [];\n  }\n  if (slot && slot._c) {\n    slot._d = false;\n  }\n  openBlock();\n  const validSlotContent = slot && ensureValidVNode(slot(props));\n  const rendered = createBlock(\n    Fragment,\n    {\n      key: props.key || // slot content array of a dynamic conditional slot may have a branch\n      // key attached in the `createSlots` helper, respect that\n      validSlotContent && validSlotContent.key || `_${name}`\n    },\n    validSlotContent || (fallback ? fallback() : []),\n    validSlotContent && slots._ === 1 ? 64 : -2\n  );\n  if (!noSlotted && rendered.scopeId) {\n    rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n  }\n  if (slot && slot._c) {\n    slot._d = true;\n  }\n  return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n  return vnodes.some((child) => {\n    if (!isVNode(child))\n      return true;\n    if (child.type === Comment)\n      return false;\n    if (child.type === Fragment && !ensureValidVNode(child.children))\n      return false;\n    return true;\n  }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n  const ret = {};\n  if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n    warn$1(`v-on with no argument expects an object value.`);\n    return ret;\n  }\n  for (const key in obj) {\n    ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n  }\n  return ret;\n}\n\nconst getPublicInstance = (i) => {\n  if (!i)\n    return null;\n  if (isStatefulComponent(i))\n    return getExposeProxy(i) || i.proxy;\n  return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n  // Move PURE marker to new line to workaround compiler discarding it\n  // due to type annotation\n  /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n    $: (i) => i,\n    $el: (i) => i.vnode.el,\n    $data: (i) => i.data,\n    $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n    $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n    $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n    $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n    $parent: (i) => getPublicInstance(i.parent),\n    $root: (i) => getPublicInstance(i.root),\n    $emit: (i) => i.emit,\n    $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n    $forceUpdate: (i) => i.f || (i.f = () => {\n      i.effect.dirty = true;\n      queueJob(i.update);\n    }),\n    $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n    $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n  })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n  get({ _: instance }, key) {\n    if (key === \"__v_skip\") {\n      return true;\n    }\n    const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n    if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n      return true;\n    }\n    let normalizedProps;\n    if (key[0] !== \"$\") {\n      const n = accessCache[key];\n      if (n !== void 0) {\n        switch (n) {\n          case 1 /* SETUP */:\n            return setupState[key];\n          case 2 /* DATA */:\n            return data[key];\n          case 4 /* CONTEXT */:\n            return ctx[key];\n          case 3 /* PROPS */:\n            return props[key];\n        }\n      } else if (hasSetupBinding(setupState, key)) {\n        accessCache[key] = 1 /* SETUP */;\n        return setupState[key];\n      } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n        accessCache[key] = 2 /* DATA */;\n        return data[key];\n      } else if (\n        // only cache other properties when instance has declared (thus stable)\n        // props\n        (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)\n      ) {\n        accessCache[key] = 3 /* PROPS */;\n        return props[key];\n      } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n        accessCache[key] = 4 /* CONTEXT */;\n        return ctx[key];\n      } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n        accessCache[key] = 0 /* OTHER */;\n      }\n    }\n    const publicGetter = publicPropertiesMap[key];\n    let cssModule, globalProperties;\n    if (publicGetter) {\n      if (key === \"$attrs\") {\n        track(instance.attrs, \"get\", \"\");\n        !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n      } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n        track(instance, \"get\", key);\n      }\n      return publicGetter(instance);\n    } else if (\n      // css module (injected by vue-loader)\n      (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n    ) {\n      return cssModule;\n    } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n      accessCache[key] = 4 /* CONTEXT */;\n      return ctx[key];\n    } else if (\n      // global properties\n      globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n    ) {\n      {\n        return globalProperties[key];\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n    // to infinite warning loop\n    key.indexOf(\"__v\") !== 0)) {\n      if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n        warn$1(\n          `Property ${JSON.stringify(\n            key\n          )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n        );\n      } else if (instance === currentRenderingInstance) {\n        warn$1(\n          `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n        );\n      }\n    }\n  },\n  set({ _: instance }, key, value) {\n    const { data, setupState, ctx } = instance;\n    if (hasSetupBinding(setupState, key)) {\n      setupState[key] = value;\n      return true;\n    } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n      warn$1(`Cannot mutate <script setup> binding \"${key}\" from Options API.`);\n      return false;\n    } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n      data[key] = value;\n      return true;\n    } else if (hasOwn(instance.props, key)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`Attempting to mutate prop \"${key}\". Props are readonly.`);\n      return false;\n    }\n    if (key[0] === \"$\" && key.slice(1) in instance) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Attempting to mutate public property \"${key}\". Properties starting with $ are reserved and readonly.`\n      );\n      return false;\n    } else {\n      if (!!(process.env.NODE_ENV !== \"production\") && key in instance.appContext.config.globalProperties) {\n        Object.defineProperty(ctx, key, {\n          enumerable: true,\n          configurable: true,\n          value\n        });\n      } else {\n        ctx[key] = value;\n      }\n    }\n    return true;\n  },\n  has({\n    _: { data, setupState, accessCache, ctx, appContext, propsOptions }\n  }, key) {\n    let normalizedProps;\n    return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key);\n  },\n  defineProperty(target, key, descriptor) {\n    if (descriptor.get != null) {\n      target._.accessCache[key] = 0;\n    } else if (hasOwn(descriptor, \"value\")) {\n      this.set(target, key, descriptor.value, null);\n    }\n    return Reflect.defineProperty(target, key, descriptor);\n  }\n};\nif (!!(process.env.NODE_ENV !== \"production\") && true) {\n  PublicInstanceProxyHandlers.ownKeys = (target) => {\n    warn$1(\n      `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`\n    );\n    return Reflect.ownKeys(target);\n  };\n}\nconst RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend(\n  {},\n  PublicInstanceProxyHandlers,\n  {\n    get(target, key) {\n      if (key === Symbol.unscopables) {\n        return;\n      }\n      return PublicInstanceProxyHandlers.get(target, key, target);\n    },\n    has(_, key) {\n      const has = key[0] !== \"_\" && !isGloballyAllowed(key);\n      if (!!(process.env.NODE_ENV !== \"production\") && !has && PublicInstanceProxyHandlers.has(_, key)) {\n        warn$1(\n          `Property ${JSON.stringify(\n            key\n          )} should not start with _ which is a reserved prefix for Vue internals.`\n        );\n      }\n      return has;\n    }\n  }\n);\nfunction createDevRenderContext(instance) {\n  const target = {};\n  Object.defineProperty(target, `_`, {\n    configurable: true,\n    enumerable: false,\n    get: () => instance\n  });\n  Object.keys(publicPropertiesMap).forEach((key) => {\n    Object.defineProperty(target, key, {\n      configurable: true,\n      enumerable: false,\n      get: () => publicPropertiesMap[key](instance),\n      // intercepted by the proxy so no need for implementation,\n      // but needed to prevent set errors\n      set: NOOP\n    });\n  });\n  return target;\n}\nfunction exposePropsOnRenderContext(instance) {\n  const {\n    ctx,\n    propsOptions: [propsOptions]\n  } = instance;\n  if (propsOptions) {\n    Object.keys(propsOptions).forEach((key) => {\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => instance.props[key],\n        set: NOOP\n      });\n    });\n  }\n}\nfunction exposeSetupStateOnRenderContext(instance) {\n  const { ctx, setupState } = instance;\n  Object.keys(toRaw(setupState)).forEach((key) => {\n    if (!setupState.__isScriptSetup) {\n      if (isReservedPrefix(key[0])) {\n        warn$1(\n          `setup() return property ${JSON.stringify(\n            key\n          )} should not start with \"$\" or \"_\" which are reserved prefixes for Vue internals.`\n        );\n        return;\n      }\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => setupState[key],\n        set: NOOP\n      });\n    }\n  });\n}\n\nconst warnRuntimeUsage = (method) => warn$1(\n  `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.`\n);\nfunction defineProps() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineProps`);\n  }\n  return null;\n}\nfunction defineEmits() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineEmits`);\n  }\n  return null;\n}\nfunction defineExpose(exposed) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineExpose`);\n  }\n}\nfunction defineOptions(options) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineOptions`);\n  }\n}\nfunction defineSlots() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineSlots`);\n  }\n  return null;\n}\nfunction defineModel() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(\"defineModel\");\n  }\n}\nfunction withDefaults(props, defaults) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`withDefaults`);\n  }\n  return null;\n}\nfunction useSlots() {\n  return getContext().slots;\n}\nfunction useAttrs() {\n  return getContext().attrs;\n}\nfunction getContext() {\n  const i = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n    warn$1(`useContext() called without active instance.`);\n  }\n  return i.setupContext || (i.setupContext = createSetupContext(i));\n}\nfunction normalizePropsOrEmits(props) {\n  return isArray(props) ? props.reduce(\n    (normalized, p) => (normalized[p] = null, normalized),\n    {}\n  ) : props;\n}\nfunction mergeDefaults(raw, defaults) {\n  const props = normalizePropsOrEmits(raw);\n  for (const key in defaults) {\n    if (key.startsWith(\"__skip\"))\n      continue;\n    let opt = props[key];\n    if (opt) {\n      if (isArray(opt) || isFunction(opt)) {\n        opt = props[key] = { type: opt, default: defaults[key] };\n      } else {\n        opt.default = defaults[key];\n      }\n    } else if (opt === null) {\n      opt = props[key] = { default: defaults[key] };\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`props default key \"${key}\" has no corresponding declaration.`);\n    }\n    if (opt && defaults[`__skip_${key}`]) {\n      opt.skipFactory = true;\n    }\n  }\n  return props;\n}\nfunction mergeModels(a, b) {\n  if (!a || !b)\n    return a || b;\n  if (isArray(a) && isArray(b))\n    return a.concat(b);\n  return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b));\n}\nfunction createPropsRestProxy(props, excludedKeys) {\n  const ret = {};\n  for (const key in props) {\n    if (!excludedKeys.includes(key)) {\n      Object.defineProperty(ret, key, {\n        enumerable: true,\n        get: () => props[key]\n      });\n    }\n  }\n  return ret;\n}\nfunction withAsyncContext(getAwaitable) {\n  const ctx = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !ctx) {\n    warn$1(\n      `withAsyncContext called without active current instance. This is likely a bug.`\n    );\n  }\n  let awaitable = getAwaitable();\n  unsetCurrentInstance();\n  if (isPromise(awaitable)) {\n    awaitable = awaitable.catch((e) => {\n      setCurrentInstance(ctx);\n      throw e;\n    });\n  }\n  return [awaitable, () => setCurrentInstance(ctx)];\n}\n\nfunction createDuplicateChecker() {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (type, key) => {\n    if (cache[key]) {\n      warn$1(`${type} property \"${key}\" is already defined in ${cache[key]}.`);\n    } else {\n      cache[key] = type;\n    }\n  };\n}\nlet shouldCacheAccess = true;\nfunction applyOptions(instance) {\n  const options = resolveMergedOptions(instance);\n  const publicThis = instance.proxy;\n  const ctx = instance.ctx;\n  shouldCacheAccess = false;\n  if (options.beforeCreate) {\n    callHook(options.beforeCreate, instance, \"bc\");\n  }\n  const {\n    // state\n    data: dataOptions,\n    computed: computedOptions,\n    methods,\n    watch: watchOptions,\n    provide: provideOptions,\n    inject: injectOptions,\n    // lifecycle\n    created,\n    beforeMount,\n    mounted,\n    beforeUpdate,\n    updated,\n    activated,\n    deactivated,\n    beforeDestroy,\n    beforeUnmount,\n    destroyed,\n    unmounted,\n    render,\n    renderTracked,\n    renderTriggered,\n    errorCaptured,\n    serverPrefetch,\n    // public API\n    expose,\n    inheritAttrs,\n    // assets\n    components,\n    directives,\n    filters\n  } = options;\n  const checkDuplicateProperties = !!(process.env.NODE_ENV !== \"production\") ? createDuplicateChecker() : null;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const [propsOptions] = instance.propsOptions;\n    if (propsOptions) {\n      for (const key in propsOptions) {\n        checkDuplicateProperties(\"Props\" /* PROPS */, key);\n      }\n    }\n  }\n  if (injectOptions) {\n    resolveInjections(injectOptions, ctx, checkDuplicateProperties);\n  }\n  if (methods) {\n    for (const key in methods) {\n      const methodHandler = methods[key];\n      if (isFunction(methodHandler)) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          Object.defineProperty(ctx, key, {\n            value: methodHandler.bind(publicThis),\n            configurable: true,\n            enumerable: true,\n            writable: true\n          });\n        } else {\n          ctx[key] = methodHandler.bind(publicThis);\n        }\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          checkDuplicateProperties(\"Methods\" /* METHODS */, key);\n        }\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn$1(\n          `Method \"${key}\" has type \"${typeof methodHandler}\" in the component definition. Did you reference the function correctly?`\n        );\n      }\n    }\n  }\n  if (dataOptions) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(dataOptions)) {\n      warn$1(\n        `The data option must be a function. Plain object usage is no longer supported.`\n      );\n    }\n    const data = dataOptions.call(publicThis, publicThis);\n    if (!!(process.env.NODE_ENV !== \"production\") && isPromise(data)) {\n      warn$1(\n        `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`\n      );\n    }\n    if (!isObject(data)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`data() should return an object.`);\n    } else {\n      instance.data = reactive(data);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        for (const key in data) {\n          checkDuplicateProperties(\"Data\" /* DATA */, key);\n          if (!isReservedPrefix(key[0])) {\n            Object.defineProperty(ctx, key, {\n              configurable: true,\n              enumerable: true,\n              get: () => data[key],\n              set: NOOP\n            });\n          }\n        }\n      }\n    }\n  }\n  shouldCacheAccess = true;\n  if (computedOptions) {\n    for (const key in computedOptions) {\n      const opt = computedOptions[key];\n      const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP;\n      if (!!(process.env.NODE_ENV !== \"production\") && get === NOOP) {\n        warn$1(`Computed property \"${key}\" has no getter.`);\n      }\n      const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : !!(process.env.NODE_ENV !== \"production\") ? () => {\n        warn$1(\n          `Write operation failed: computed property \"${key}\" is readonly.`\n        );\n      } : NOOP;\n      const c = computed({\n        get,\n        set\n      });\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => c.value,\n        set: (v) => c.value = v\n      });\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        checkDuplicateProperties(\"Computed\" /* COMPUTED */, key);\n      }\n    }\n  }\n  if (watchOptions) {\n    for (const key in watchOptions) {\n      createWatcher(watchOptions[key], ctx, publicThis, key);\n    }\n  }\n  if (provideOptions) {\n    const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;\n    Reflect.ownKeys(provides).forEach((key) => {\n      provide(key, provides[key]);\n    });\n  }\n  if (created) {\n    callHook(created, instance, \"c\");\n  }\n  function registerLifecycleHook(register, hook) {\n    if (isArray(hook)) {\n      hook.forEach((_hook) => register(_hook.bind(publicThis)));\n    } else if (hook) {\n      register(hook.bind(publicThis));\n    }\n  }\n  registerLifecycleHook(onBeforeMount, beforeMount);\n  registerLifecycleHook(onMounted, mounted);\n  registerLifecycleHook(onBeforeUpdate, beforeUpdate);\n  registerLifecycleHook(onUpdated, updated);\n  registerLifecycleHook(onActivated, activated);\n  registerLifecycleHook(onDeactivated, deactivated);\n  registerLifecycleHook(onErrorCaptured, errorCaptured);\n  registerLifecycleHook(onRenderTracked, renderTracked);\n  registerLifecycleHook(onRenderTriggered, renderTriggered);\n  registerLifecycleHook(onBeforeUnmount, beforeUnmount);\n  registerLifecycleHook(onUnmounted, unmounted);\n  registerLifecycleHook(onServerPrefetch, serverPrefetch);\n  if (isArray(expose)) {\n    if (expose.length) {\n      const exposed = instance.exposed || (instance.exposed = {});\n      expose.forEach((key) => {\n        Object.defineProperty(exposed, key, {\n          get: () => publicThis[key],\n          set: (val) => publicThis[key] = val\n        });\n      });\n    } else if (!instance.exposed) {\n      instance.exposed = {};\n    }\n  }\n  if (render && instance.render === NOOP) {\n    instance.render = render;\n  }\n  if (inheritAttrs != null) {\n    instance.inheritAttrs = inheritAttrs;\n  }\n  if (components)\n    instance.components = components;\n  if (directives)\n    instance.directives = directives;\n}\nfunction resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {\n  if (isArray(injectOptions)) {\n    injectOptions = normalizeInject(injectOptions);\n  }\n  for (const key in injectOptions) {\n    const opt = injectOptions[key];\n    let injected;\n    if (isObject(opt)) {\n      if (\"default\" in opt) {\n        injected = inject(\n          opt.from || key,\n          opt.default,\n          true\n        );\n      } else {\n        injected = inject(opt.from || key);\n      }\n    } else {\n      injected = inject(opt);\n    }\n    if (isRef(injected)) {\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => injected.value,\n        set: (v) => injected.value = v\n      });\n    } else {\n      ctx[key] = injected;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      checkDuplicateProperties(\"Inject\" /* INJECT */, key);\n    }\n  }\n}\nfunction callHook(hook, instance, type) {\n  callWithAsyncErrorHandling(\n    isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy),\n    instance,\n    type\n  );\n}\nfunction createWatcher(raw, ctx, publicThis, key) {\n  const getter = key.includes(\".\") ? createPathGetter(publicThis, key) : () => publicThis[key];\n  if (isString(raw)) {\n    const handler = ctx[raw];\n    if (isFunction(handler)) {\n      watch(getter, handler);\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`Invalid watch handler specified by key \"${raw}\"`, handler);\n    }\n  } else if (isFunction(raw)) {\n    watch(getter, raw.bind(publicThis));\n  } else if (isObject(raw)) {\n    if (isArray(raw)) {\n      raw.forEach((r) => createWatcher(r, ctx, publicThis, key));\n    } else {\n      const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];\n      if (isFunction(handler)) {\n        watch(getter, handler, raw);\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn$1(`Invalid watch handler specified by key \"${raw.handler}\"`, handler);\n      }\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`Invalid watch option: \"${key}\"`, raw);\n  }\n}\nfunction resolveMergedOptions(instance) {\n  const base = instance.type;\n  const { mixins, extends: extendsOptions } = base;\n  const {\n    mixins: globalMixins,\n    optionsCache: cache,\n    config: { optionMergeStrategies }\n  } = instance.appContext;\n  const cached = cache.get(base);\n  let resolved;\n  if (cached) {\n    resolved = cached;\n  } else if (!globalMixins.length && !mixins && !extendsOptions) {\n    {\n      resolved = base;\n    }\n  } else {\n    resolved = {};\n    if (globalMixins.length) {\n      globalMixins.forEach(\n        (m) => mergeOptions(resolved, m, optionMergeStrategies, true)\n      );\n    }\n    mergeOptions(resolved, base, optionMergeStrategies);\n  }\n  if (isObject(base)) {\n    cache.set(base, resolved);\n  }\n  return resolved;\n}\nfunction mergeOptions(to, from, strats, asMixin = false) {\n  const { mixins, extends: extendsOptions } = from;\n  if (extendsOptions) {\n    mergeOptions(to, extendsOptions, strats, true);\n  }\n  if (mixins) {\n    mixins.forEach(\n      (m) => mergeOptions(to, m, strats, true)\n    );\n  }\n  for (const key in from) {\n    if (asMixin && key === \"expose\") {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `\"expose\" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`\n      );\n    } else {\n      const strat = internalOptionMergeStrats[key] || strats && strats[key];\n      to[key] = strat ? strat(to[key], from[key]) : from[key];\n    }\n  }\n  return to;\n}\nconst internalOptionMergeStrats = {\n  data: mergeDataFn,\n  props: mergeEmitsOrPropsOptions,\n  emits: mergeEmitsOrPropsOptions,\n  // objects\n  methods: mergeObjectOptions,\n  computed: mergeObjectOptions,\n  // lifecycle\n  beforeCreate: mergeAsArray,\n  created: mergeAsArray,\n  beforeMount: mergeAsArray,\n  mounted: mergeAsArray,\n  beforeUpdate: mergeAsArray,\n  updated: mergeAsArray,\n  beforeDestroy: mergeAsArray,\n  beforeUnmount: mergeAsArray,\n  destroyed: mergeAsArray,\n  unmounted: mergeAsArray,\n  activated: mergeAsArray,\n  deactivated: mergeAsArray,\n  errorCaptured: mergeAsArray,\n  serverPrefetch: mergeAsArray,\n  // assets\n  components: mergeObjectOptions,\n  directives: mergeObjectOptions,\n  // watch\n  watch: mergeWatchOptions,\n  // provide / inject\n  provide: mergeDataFn,\n  inject: mergeInject\n};\nfunction mergeDataFn(to, from) {\n  if (!from) {\n    return to;\n  }\n  if (!to) {\n    return from;\n  }\n  return function mergedDataFn() {\n    return (extend)(\n      isFunction(to) ? to.call(this, this) : to,\n      isFunction(from) ? from.call(this, this) : from\n    );\n  };\n}\nfunction mergeInject(to, from) {\n  return mergeObjectOptions(normalizeInject(to), normalizeInject(from));\n}\nfunction normalizeInject(raw) {\n  if (isArray(raw)) {\n    const res = {};\n    for (let i = 0; i < raw.length; i++) {\n      res[raw[i]] = raw[i];\n    }\n    return res;\n  }\n  return raw;\n}\nfunction mergeAsArray(to, from) {\n  return to ? [...new Set([].concat(to, from))] : from;\n}\nfunction mergeObjectOptions(to, from) {\n  return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from;\n}\nfunction mergeEmitsOrPropsOptions(to, from) {\n  if (to) {\n    if (isArray(to) && isArray(from)) {\n      return [.../* @__PURE__ */ new Set([...to, ...from])];\n    }\n    return extend(\n      /* @__PURE__ */ Object.create(null),\n      normalizePropsOrEmits(to),\n      normalizePropsOrEmits(from != null ? from : {})\n    );\n  } else {\n    return from;\n  }\n}\nfunction mergeWatchOptions(to, from) {\n  if (!to)\n    return from;\n  if (!from)\n    return to;\n  const merged = extend(/* @__PURE__ */ Object.create(null), to);\n  for (const key in from) {\n    merged[key] = mergeAsArray(to[key], from[key]);\n  }\n  return merged;\n}\n\nfunction createAppContext() {\n  return {\n    app: null,\n    config: {\n      isNativeTag: NO,\n      performance: false,\n      globalProperties: {},\n      optionMergeStrategies: {},\n      errorHandler: void 0,\n      warnHandler: void 0,\n      compilerOptions: {}\n    },\n    mixins: [],\n    components: {},\n    directives: {},\n    provides: /* @__PURE__ */ Object.create(null),\n    optionsCache: /* @__PURE__ */ new WeakMap(),\n    propsCache: /* @__PURE__ */ new WeakMap(),\n    emitsCache: /* @__PURE__ */ new WeakMap()\n  };\n}\nlet uid$1 = 0;\nfunction createAppAPI(render, hydrate) {\n  return function createApp(rootComponent, rootProps = null) {\n    if (!isFunction(rootComponent)) {\n      rootComponent = extend({}, rootComponent);\n    }\n    if (rootProps != null && !isObject(rootProps)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`root props passed to app.mount() must be an object.`);\n      rootProps = null;\n    }\n    const context = createAppContext();\n    const installedPlugins = /* @__PURE__ */ new WeakSet();\n    let isMounted = false;\n    const app = context.app = {\n      _uid: uid$1++,\n      _component: rootComponent,\n      _props: rootProps,\n      _container: null,\n      _context: context,\n      _instance: null,\n      version,\n      get config() {\n        return context.config;\n      },\n      set config(v) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `app.config cannot be replaced. Modify individual options instead.`\n          );\n        }\n      },\n      use(plugin, ...options) {\n        if (installedPlugins.has(plugin)) {\n          !!(process.env.NODE_ENV !== \"production\") && warn$1(`Plugin has already been applied to target app.`);\n        } else if (plugin && isFunction(plugin.install)) {\n          installedPlugins.add(plugin);\n          plugin.install(app, ...options);\n        } else if (isFunction(plugin)) {\n          installedPlugins.add(plugin);\n          plugin(app, ...options);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `A plugin must either be a function or an object with an \"install\" function.`\n          );\n        }\n        return app;\n      },\n      mixin(mixin) {\n        if (__VUE_OPTIONS_API__) {\n          if (!context.mixins.includes(mixin)) {\n            context.mixins.push(mixin);\n          } else if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn$1(\n              \"Mixin has already been applied to target app\" + (mixin.name ? `: ${mixin.name}` : \"\")\n            );\n          }\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Mixins are only available in builds supporting Options API\");\n        }\n        return app;\n      },\n      component(name, component) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          validateComponentName(name, context.config);\n        }\n        if (!component) {\n          return context.components[name];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") && context.components[name]) {\n          warn$1(`Component \"${name}\" has already been registered in target app.`);\n        }\n        context.components[name] = component;\n        return app;\n      },\n      directive(name, directive) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          validateDirectiveName(name);\n        }\n        if (!directive) {\n          return context.directives[name];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") && context.directives[name]) {\n          warn$1(`Directive \"${name}\" has already been registered in target app.`);\n        }\n        context.directives[name] = directive;\n        return app;\n      },\n      mount(rootContainer, isHydrate, namespace) {\n        if (!isMounted) {\n          if (!!(process.env.NODE_ENV !== \"production\") && rootContainer.__vue_app__) {\n            warn$1(\n              `There is already an app instance mounted on the host container.\n If you want to mount another app on the same host container, you need to unmount the previous app by calling \\`app.unmount()\\` first.`\n            );\n          }\n          const vnode = createVNode(rootComponent, rootProps);\n          vnode.appContext = context;\n          if (namespace === true) {\n            namespace = \"svg\";\n          } else if (namespace === false) {\n            namespace = void 0;\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            context.reload = () => {\n              render(\n                cloneVNode(vnode),\n                rootContainer,\n                namespace\n              );\n            };\n          }\n          if (isHydrate && hydrate) {\n            hydrate(vnode, rootContainer);\n          } else {\n            render(vnode, rootContainer, namespace);\n          }\n          isMounted = true;\n          app._container = rootContainer;\n          rootContainer.__vue_app__ = app;\n          if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n            app._instance = vnode.component;\n            devtoolsInitApp(app, version);\n          }\n          return getExposeProxy(vnode.component) || vnode.component.proxy;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `App has already been mounted.\nIf you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \\`const createMyApp = () => createApp(App)\\``\n          );\n        }\n      },\n      unmount() {\n        if (isMounted) {\n          render(null, app._container);\n          if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n            app._instance = null;\n            devtoolsUnmountApp(app);\n          }\n          delete app._container.__vue_app__;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(`Cannot unmount an app that is not mounted.`);\n        }\n      },\n      provide(key, value) {\n        if (!!(process.env.NODE_ENV !== \"production\") && key in context.provides) {\n          warn$1(\n            `App already provides property with key \"${String(key)}\". It will be overwritten with the new value.`\n          );\n        }\n        context.provides[key] = value;\n        return app;\n      },\n      runWithContext(fn) {\n        const lastApp = currentApp;\n        currentApp = app;\n        try {\n          return fn();\n        } finally {\n          currentApp = lastApp;\n        }\n      }\n    };\n    return app;\n  };\n}\nlet currentApp = null;\n\nfunction provide(key, value) {\n  if (!currentInstance) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`provide() can only be used inside setup().`);\n    }\n  } else {\n    let provides = currentInstance.provides;\n    const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n    if (parentProvides === provides) {\n      provides = currentInstance.provides = Object.create(parentProvides);\n    }\n    provides[key] = value;\n  }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n  const instance = currentInstance || currentRenderingInstance;\n  if (instance || currentApp) {\n    const provides = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides;\n    if (provides && key in provides) {\n      return provides[key];\n    } else if (arguments.length > 1) {\n      return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`injection \"${String(key)}\" not found.`);\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`inject() can only be used inside setup() or functional components.`);\n  }\n}\nfunction hasInjectionContext() {\n  return !!(currentInstance || currentRenderingInstance || currentApp);\n}\n\nconst internalObjectProto = {};\nconst createInternalObject = () => Object.create(internalObjectProto);\nconst isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto;\n\nfunction initProps(instance, rawProps, isStateful, isSSR = false) {\n  const props = {};\n  const attrs = createInternalObject();\n  instance.propsDefaults = /* @__PURE__ */ Object.create(null);\n  setFullProps(instance, rawProps, props, attrs);\n  for (const key in instance.propsOptions[0]) {\n    if (!(key in props)) {\n      props[key] = void 0;\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    validateProps(rawProps || {}, props, instance);\n  }\n  if (isStateful) {\n    instance.props = isSSR ? props : shallowReactive(props);\n  } else {\n    if (!instance.type.props) {\n      instance.props = attrs;\n    } else {\n      instance.props = props;\n    }\n  }\n  instance.attrs = attrs;\n}\nfunction isInHmrContext(instance) {\n  while (instance) {\n    if (instance.type.__hmrId)\n      return true;\n    instance = instance.parent;\n  }\n}\nfunction updateProps(instance, rawProps, rawPrevProps, optimized) {\n  const {\n    props,\n    attrs,\n    vnode: { patchFlag }\n  } = instance;\n  const rawCurrentProps = toRaw(props);\n  const [options] = instance.propsOptions;\n  let hasAttrsChanged = false;\n  if (\n    // always force full diff in dev\n    // - #1942 if hmr is enabled with sfc component\n    // - vite#872 non-sfc component used by sfc component\n    !(!!(process.env.NODE_ENV !== \"production\") && isInHmrContext(instance)) && (optimized || patchFlag > 0) && !(patchFlag & 16)\n  ) {\n    if (patchFlag & 8) {\n      const propsToUpdate = instance.vnode.dynamicProps;\n      for (let i = 0; i < propsToUpdate.length; i++) {\n        let key = propsToUpdate[i];\n        if (isEmitListener(instance.emitsOptions, key)) {\n          continue;\n        }\n        const value = rawProps[key];\n        if (options) {\n          if (hasOwn(attrs, key)) {\n            if (value !== attrs[key]) {\n              attrs[key] = value;\n              hasAttrsChanged = true;\n            }\n          } else {\n            const camelizedKey = camelize(key);\n            props[camelizedKey] = resolvePropValue(\n              options,\n              rawCurrentProps,\n              camelizedKey,\n              value,\n              instance,\n              false\n            );\n          }\n        } else {\n          if (value !== attrs[key]) {\n            attrs[key] = value;\n            hasAttrsChanged = true;\n          }\n        }\n      }\n    }\n  } else {\n    if (setFullProps(instance, rawProps, props, attrs)) {\n      hasAttrsChanged = true;\n    }\n    let kebabKey;\n    for (const key in rawCurrentProps) {\n      if (!rawProps || // for camelCase\n      !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case\n      // and converted to camelCase (#955)\n      ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {\n        if (options) {\n          if (rawPrevProps && // for camelCase\n          (rawPrevProps[key] !== void 0 || // for kebab-case\n          rawPrevProps[kebabKey] !== void 0)) {\n            props[key] = resolvePropValue(\n              options,\n              rawCurrentProps,\n              key,\n              void 0,\n              instance,\n              true\n            );\n          }\n        } else {\n          delete props[key];\n        }\n      }\n    }\n    if (attrs !== rawCurrentProps) {\n      for (const key in attrs) {\n        if (!rawProps || !hasOwn(rawProps, key) && true) {\n          delete attrs[key];\n          hasAttrsChanged = true;\n        }\n      }\n    }\n  }\n  if (hasAttrsChanged) {\n    trigger(instance.attrs, \"set\", \"\");\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    validateProps(rawProps || {}, props, instance);\n  }\n}\nfunction setFullProps(instance, rawProps, props, attrs) {\n  const [options, needCastKeys] = instance.propsOptions;\n  let hasAttrsChanged = false;\n  let rawCastValues;\n  if (rawProps) {\n    for (let key in rawProps) {\n      if (isReservedProp(key)) {\n        continue;\n      }\n      const value = rawProps[key];\n      let camelKey;\n      if (options && hasOwn(options, camelKey = camelize(key))) {\n        if (!needCastKeys || !needCastKeys.includes(camelKey)) {\n          props[camelKey] = value;\n        } else {\n          (rawCastValues || (rawCastValues = {}))[camelKey] = value;\n        }\n      } else if (!isEmitListener(instance.emitsOptions, key)) {\n        if (!(key in attrs) || value !== attrs[key]) {\n          attrs[key] = value;\n          hasAttrsChanged = true;\n        }\n      }\n    }\n  }\n  if (needCastKeys) {\n    const rawCurrentProps = toRaw(props);\n    const castValues = rawCastValues || EMPTY_OBJ;\n    for (let i = 0; i < needCastKeys.length; i++) {\n      const key = needCastKeys[i];\n      props[key] = resolvePropValue(\n        options,\n        rawCurrentProps,\n        key,\n        castValues[key],\n        instance,\n        !hasOwn(castValues, key)\n      );\n    }\n  }\n  return hasAttrsChanged;\n}\nfunction resolvePropValue(options, props, key, value, instance, isAbsent) {\n  const opt = options[key];\n  if (opt != null) {\n    const hasDefault = hasOwn(opt, \"default\");\n    if (hasDefault && value === void 0) {\n      const defaultValue = opt.default;\n      if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {\n        const { propsDefaults } = instance;\n        if (key in propsDefaults) {\n          value = propsDefaults[key];\n        } else {\n          const reset = setCurrentInstance(instance);\n          value = propsDefaults[key] = defaultValue.call(\n            null,\n            props\n          );\n          reset();\n        }\n      } else {\n        value = defaultValue;\n      }\n    }\n    if (opt[0 /* shouldCast */]) {\n      if (isAbsent && !hasDefault) {\n        value = false;\n      } else if (opt[1 /* shouldCastTrue */] && (value === \"\" || value === hyphenate(key))) {\n        value = true;\n      }\n    }\n  }\n  return value;\n}\nfunction normalizePropsOptions(comp, appContext, asMixin = false) {\n  const cache = appContext.propsCache;\n  const cached = cache.get(comp);\n  if (cached) {\n    return cached;\n  }\n  const raw = comp.props;\n  const normalized = {};\n  const needCastKeys = [];\n  let hasExtends = false;\n  if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n    const extendProps = (raw2) => {\n      hasExtends = true;\n      const [props, keys] = normalizePropsOptions(raw2, appContext, true);\n      extend(normalized, props);\n      if (keys)\n        needCastKeys.push(...keys);\n    };\n    if (!asMixin && appContext.mixins.length) {\n      appContext.mixins.forEach(extendProps);\n    }\n    if (comp.extends) {\n      extendProps(comp.extends);\n    }\n    if (comp.mixins) {\n      comp.mixins.forEach(extendProps);\n    }\n  }\n  if (!raw && !hasExtends) {\n    if (isObject(comp)) {\n      cache.set(comp, EMPTY_ARR);\n    }\n    return EMPTY_ARR;\n  }\n  if (isArray(raw)) {\n    for (let i = 0; i < raw.length; i++) {\n      if (!!(process.env.NODE_ENV !== \"production\") && !isString(raw[i])) {\n        warn$1(`props must be strings when using array syntax.`, raw[i]);\n      }\n      const normalizedKey = camelize(raw[i]);\n      if (validatePropName(normalizedKey)) {\n        normalized[normalizedKey] = EMPTY_OBJ;\n      }\n    }\n  } else if (raw) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isObject(raw)) {\n      warn$1(`invalid props options`, raw);\n    }\n    for (const key in raw) {\n      const normalizedKey = camelize(key);\n      if (validatePropName(normalizedKey)) {\n        const opt = raw[key];\n        const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);\n        if (prop) {\n          const booleanIndex = getTypeIndex(Boolean, prop.type);\n          const stringIndex = getTypeIndex(String, prop.type);\n          prop[0 /* shouldCast */] = booleanIndex > -1;\n          prop[1 /* shouldCastTrue */] = stringIndex < 0 || booleanIndex < stringIndex;\n          if (booleanIndex > -1 || hasOwn(prop, \"default\")) {\n            needCastKeys.push(normalizedKey);\n          }\n        }\n      }\n    }\n  }\n  const res = [normalized, needCastKeys];\n  if (isObject(comp)) {\n    cache.set(comp, res);\n  }\n  return res;\n}\nfunction validatePropName(key) {\n  if (key[0] !== \"$\" && !isReservedProp(key)) {\n    return true;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`Invalid prop name: \"${key}\" is a reserved property.`);\n  }\n  return false;\n}\nfunction getType(ctor) {\n  if (ctor === null) {\n    return \"null\";\n  }\n  if (typeof ctor === \"function\") {\n    return ctor.name || \"\";\n  } else if (typeof ctor === \"object\") {\n    const name = ctor.constructor && ctor.constructor.name;\n    return name || \"\";\n  }\n  return \"\";\n}\nfunction isSameType(a, b) {\n  return getType(a) === getType(b);\n}\nfunction getTypeIndex(type, expectedTypes) {\n  if (isArray(expectedTypes)) {\n    return expectedTypes.findIndex((t) => isSameType(t, type));\n  } else if (isFunction(expectedTypes)) {\n    return isSameType(expectedTypes, type) ? 0 : -1;\n  }\n  return -1;\n}\nfunction validateProps(rawProps, props, instance) {\n  const resolvedValues = toRaw(props);\n  const options = instance.propsOptions[0];\n  for (const key in options) {\n    let opt = options[key];\n    if (opt == null)\n      continue;\n    validateProp(\n      key,\n      resolvedValues[key],\n      opt,\n      !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(resolvedValues) : resolvedValues,\n      !hasOwn(rawProps, key) && !hasOwn(rawProps, hyphenate(key))\n    );\n  }\n}\nfunction validateProp(name, value, prop, props, isAbsent) {\n  const { type, required, validator, skipCheck } = prop;\n  if (required && isAbsent) {\n    warn$1('Missing required prop: \"' + name + '\"');\n    return;\n  }\n  if (value == null && !required) {\n    return;\n  }\n  if (type != null && type !== true && !skipCheck) {\n    let isValid = false;\n    const types = isArray(type) ? type : [type];\n    const expectedTypes = [];\n    for (let i = 0; i < types.length && !isValid; i++) {\n      const { valid, expectedType } = assertType(value, types[i]);\n      expectedTypes.push(expectedType || \"\");\n      isValid = valid;\n    }\n    if (!isValid) {\n      warn$1(getInvalidTypeMessage(name, value, expectedTypes));\n      return;\n    }\n  }\n  if (validator && !validator(value, props)) {\n    warn$1('Invalid prop: custom validator check failed for prop \"' + name + '\".');\n  }\n}\nconst isSimpleType = /* @__PURE__ */ makeMap(\n  \"String,Number,Boolean,Function,Symbol,BigInt\"\n);\nfunction assertType(value, type) {\n  let valid;\n  const expectedType = getType(type);\n  if (isSimpleType(expectedType)) {\n    const t = typeof value;\n    valid = t === expectedType.toLowerCase();\n    if (!valid && t === \"object\") {\n      valid = value instanceof type;\n    }\n  } else if (expectedType === \"Object\") {\n    valid = isObject(value);\n  } else if (expectedType === \"Array\") {\n    valid = isArray(value);\n  } else if (expectedType === \"null\") {\n    valid = value === null;\n  } else {\n    valid = value instanceof type;\n  }\n  return {\n    valid,\n    expectedType\n  };\n}\nfunction getInvalidTypeMessage(name, value, expectedTypes) {\n  if (expectedTypes.length === 0) {\n    return `Prop type [] for prop \"${name}\" won't match anything. Did you mean to use type Array instead?`;\n  }\n  let message = `Invalid prop: type check failed for prop \"${name}\". Expected ${expectedTypes.map(capitalize).join(\" | \")}`;\n  const expectedType = expectedTypes[0];\n  const receivedType = toRawType(value);\n  const expectedValue = styleValue(value, expectedType);\n  const receivedValue = styleValue(value, receivedType);\n  if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {\n    message += ` with value ${expectedValue}`;\n  }\n  message += `, got ${receivedType} `;\n  if (isExplicable(receivedType)) {\n    message += `with value ${receivedValue}.`;\n  }\n  return message;\n}\nfunction styleValue(value, type) {\n  if (type === \"String\") {\n    return `\"${value}\"`;\n  } else if (type === \"Number\") {\n    return `${Number(value)}`;\n  } else {\n    return `${value}`;\n  }\n}\nfunction isExplicable(type) {\n  const explicitTypes = [\"string\", \"number\", \"boolean\"];\n  return explicitTypes.some((elem) => type.toLowerCase() === elem);\n}\nfunction isBoolean(...args) {\n  return args.some((elem) => elem.toLowerCase() === \"boolean\");\n}\n\nconst isInternalKey = (key) => key[0] === \"_\" || key === \"$stable\";\nconst normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];\nconst normalizeSlot = (key, rawSlot, ctx) => {\n  if (rawSlot._n) {\n    return rawSlot;\n  }\n  const normalized = withCtx((...args) => {\n    if (!!(process.env.NODE_ENV !== \"production\") && currentInstance && (!ctx || ctx.root === currentInstance.root)) {\n      warn$1(\n        `Slot \"${key}\" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`\n      );\n    }\n    return normalizeSlotValue(rawSlot(...args));\n  }, ctx);\n  normalized._c = false;\n  return normalized;\n};\nconst normalizeObjectSlots = (rawSlots, slots, instance) => {\n  const ctx = rawSlots._ctx;\n  for (const key in rawSlots) {\n    if (isInternalKey(key))\n      continue;\n    const value = rawSlots[key];\n    if (isFunction(value)) {\n      slots[key] = normalizeSlot(key, value, ctx);\n    } else if (value != null) {\n      if (!!(process.env.NODE_ENV !== \"production\") && true) {\n        warn$1(\n          `Non-function value encountered for slot \"${key}\". Prefer function slots for better performance.`\n        );\n      }\n      const normalized = normalizeSlotValue(value);\n      slots[key] = () => normalized;\n    }\n  }\n};\nconst normalizeVNodeSlots = (instance, children) => {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isKeepAlive(instance.vnode) && true) {\n    warn$1(\n      `Non-function value encountered for default slot. Prefer function slots for better performance.`\n    );\n  }\n  const normalized = normalizeSlotValue(children);\n  instance.slots.default = () => normalized;\n};\nconst initSlots = (instance, children) => {\n  const slots = instance.slots = createInternalObject();\n  if (instance.vnode.shapeFlag & 32) {\n    const type = children._;\n    if (type) {\n      extend(slots, children);\n      def(slots, \"_\", type, true);\n    } else {\n      normalizeObjectSlots(children, slots);\n    }\n  } else if (children) {\n    normalizeVNodeSlots(instance, children);\n  }\n};\nconst updateSlots = (instance, children, optimized) => {\n  const { vnode, slots } = instance;\n  let needDeletionCheck = true;\n  let deletionComparisonTarget = EMPTY_OBJ;\n  if (vnode.shapeFlag & 32) {\n    const type = children._;\n    if (type) {\n      if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n        extend(slots, children);\n        trigger(instance, \"set\", \"$slots\");\n      } else if (optimized && type === 1) {\n        needDeletionCheck = false;\n      } else {\n        extend(slots, children);\n        if (!optimized && type === 1) {\n          delete slots._;\n        }\n      }\n    } else {\n      needDeletionCheck = !children.$stable;\n      normalizeObjectSlots(children, slots);\n    }\n    deletionComparisonTarget = children;\n  } else if (children) {\n    normalizeVNodeSlots(instance, children);\n    deletionComparisonTarget = { default: 1 };\n  }\n  if (needDeletionCheck) {\n    for (const key in slots) {\n      if (!isInternalKey(key) && deletionComparisonTarget[key] == null) {\n        delete slots[key];\n      }\n    }\n  }\n};\n\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n  if (isArray(rawRef)) {\n    rawRef.forEach(\n      (r, i) => setRef(\n        r,\n        oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n        parentSuspense,\n        vnode,\n        isUnmount\n      )\n    );\n    return;\n  }\n  if (isAsyncWrapper(vnode) && !isUnmount) {\n    return;\n  }\n  const refValue = vnode.shapeFlag & 4 ? getExposeProxy(vnode.component) || vnode.component.proxy : vnode.el;\n  const value = isUnmount ? null : refValue;\n  const { i: owner, r: ref } = rawRef;\n  if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n    warn$1(\n      `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n    );\n    return;\n  }\n  const oldRef = oldRawRef && oldRawRef.r;\n  const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n  const setupState = owner.setupState;\n  if (oldRef != null && oldRef !== ref) {\n    if (isString(oldRef)) {\n      refs[oldRef] = null;\n      if (hasOwn(setupState, oldRef)) {\n        setupState[oldRef] = null;\n      }\n    } else if (isRef(oldRef)) {\n      oldRef.value = null;\n    }\n  }\n  if (isFunction(ref)) {\n    callWithErrorHandling(ref, owner, 12, [value, refs]);\n  } else {\n    const _isString = isString(ref);\n    const _isRef = isRef(ref);\n    if (_isString || _isRef) {\n      const doSet = () => {\n        if (rawRef.f) {\n          const existing = _isString ? hasOwn(setupState, ref) ? setupState[ref] : refs[ref] : ref.value;\n          if (isUnmount) {\n            isArray(existing) && remove(existing, refValue);\n          } else {\n            if (!isArray(existing)) {\n              if (_isString) {\n                refs[ref] = [refValue];\n                if (hasOwn(setupState, ref)) {\n                  setupState[ref] = refs[ref];\n                }\n              } else {\n                ref.value = [refValue];\n                if (rawRef.k)\n                  refs[rawRef.k] = ref.value;\n              }\n            } else if (!existing.includes(refValue)) {\n              existing.push(refValue);\n            }\n          }\n        } else if (_isString) {\n          refs[ref] = value;\n          if (hasOwn(setupState, ref)) {\n            setupState[ref] = value;\n          }\n        } else if (_isRef) {\n          ref.value = value;\n          if (rawRef.k)\n            refs[rawRef.k] = value;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n        }\n      };\n      if (value) {\n        doSet.id = -1;\n        queuePostRenderEffect(doSet, parentSuspense);\n      } else {\n        doSet();\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n    }\n  }\n}\n\nlet hasMismatch = false;\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n  if (isSVGContainer(container))\n    return \"svg\";\n  if (isMathMLContainer(container))\n    return \"mathml\";\n  return void 0;\n};\nconst isComment = (node) => node.nodeType === 8 /* COMMENT */;\nfunction createHydrationFunctions(rendererInternals) {\n  const {\n    mt: mountComponent,\n    p: patch,\n    o: {\n      patchProp,\n      createText,\n      nextSibling,\n      parentNode,\n      remove,\n      insert,\n      createComment\n    }\n  } = rendererInternals;\n  const hydrate = (vnode, container) => {\n    if (!container.hasChildNodes()) {\n      (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n        `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n      );\n      patch(null, vnode, container);\n      flushPostFlushCbs();\n      container._vnode = vnode;\n      return;\n    }\n    hasMismatch = false;\n    hydrateNode(container.firstChild, vnode, null, null, null);\n    flushPostFlushCbs();\n    container._vnode = vnode;\n    if (hasMismatch && true) {\n      console.error(`Hydration completed but contains mismatches.`);\n    }\n  };\n  const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n    optimized = optimized || !!vnode.dynamicChildren;\n    const isFragmentStart = isComment(node) && node.data === \"[\";\n    const onMismatch = () => handleMismatch(\n      node,\n      vnode,\n      parentComponent,\n      parentSuspense,\n      slotScopeIds,\n      isFragmentStart\n    );\n    const { type, ref, shapeFlag, patchFlag } = vnode;\n    let domType = node.nodeType;\n    vnode.el = node;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      if (!(\"__vnode\" in node)) {\n        Object.defineProperty(node, \"__vnode\", {\n          value: vnode,\n          enumerable: false\n        });\n      }\n      if (!(\"__vueParentComponent\" in node)) {\n        Object.defineProperty(node, \"__vueParentComponent\", {\n          value: parentComponent,\n          enumerable: false\n        });\n      }\n    }\n    if (patchFlag === -2) {\n      optimized = false;\n      vnode.dynamicChildren = null;\n    }\n    let nextNode = null;\n    switch (type) {\n      case Text:\n        if (domType !== 3 /* TEXT */) {\n          if (vnode.children === \"\") {\n            insert(vnode.el = createText(\"\"), parentNode(node), node);\n            nextNode = node;\n          } else {\n            nextNode = onMismatch();\n          }\n        } else {\n          if (node.data !== vnode.children) {\n            hasMismatch = true;\n            (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n              `Hydration text mismatch in`,\n              node.parentNode,\n              `\n  - rendered on server: ${JSON.stringify(\n                node.data\n              )}\n  - expected on client: ${JSON.stringify(vnode.children)}`\n            );\n            node.data = vnode.children;\n          }\n          nextNode = nextSibling(node);\n        }\n        break;\n      case Comment:\n        if (isTemplateNode(node)) {\n          nextNode = nextSibling(node);\n          replaceNode(\n            vnode.el = node.content.firstChild,\n            node,\n            parentComponent\n          );\n        } else if (domType !== 8 /* COMMENT */ || isFragmentStart) {\n          nextNode = onMismatch();\n        } else {\n          nextNode = nextSibling(node);\n        }\n        break;\n      case Static:\n        if (isFragmentStart) {\n          node = nextSibling(node);\n          domType = node.nodeType;\n        }\n        if (domType === 1 /* ELEMENT */ || domType === 3 /* TEXT */) {\n          nextNode = node;\n          const needToAdoptContent = !vnode.children.length;\n          for (let i = 0; i < vnode.staticCount; i++) {\n            if (needToAdoptContent)\n              vnode.children += nextNode.nodeType === 1 /* ELEMENT */ ? nextNode.outerHTML : nextNode.data;\n            if (i === vnode.staticCount - 1) {\n              vnode.anchor = nextNode;\n            }\n            nextNode = nextSibling(nextNode);\n          }\n          return isFragmentStart ? nextSibling(nextNode) : nextNode;\n        } else {\n          onMismatch();\n        }\n        break;\n      case Fragment:\n        if (!isFragmentStart) {\n          nextNode = onMismatch();\n        } else {\n          nextNode = hydrateFragment(\n            node,\n            vnode,\n            parentComponent,\n            parentSuspense,\n            slotScopeIds,\n            optimized\n          );\n        }\n        break;\n      default:\n        if (shapeFlag & 1) {\n          if ((domType !== 1 /* ELEMENT */ || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n            nextNode = onMismatch();\n          } else {\n            nextNode = hydrateElement(\n              node,\n              vnode,\n              parentComponent,\n              parentSuspense,\n              slotScopeIds,\n              optimized\n            );\n          }\n        } else if (shapeFlag & 6) {\n          vnode.slotScopeIds = slotScopeIds;\n          const container = parentNode(node);\n          if (isFragmentStart) {\n            nextNode = locateClosingAnchor(node);\n          } else if (isComment(node) && node.data === \"teleport start\") {\n            nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n          } else {\n            nextNode = nextSibling(node);\n          }\n          mountComponent(\n            vnode,\n            container,\n            null,\n            parentComponent,\n            parentSuspense,\n            getContainerType(container),\n            optimized\n          );\n          if (isAsyncWrapper(vnode)) {\n            let subTree;\n            if (isFragmentStart) {\n              subTree = createVNode(Fragment);\n              subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n            } else {\n              subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n            }\n            subTree.el = node;\n            vnode.component.subTree = subTree;\n          }\n        } else if (shapeFlag & 64) {\n          if (domType !== 8 /* COMMENT */) {\n            nextNode = onMismatch();\n          } else {\n            nextNode = vnode.type.hydrate(\n              node,\n              vnode,\n              parentComponent,\n              parentSuspense,\n              slotScopeIds,\n              optimized,\n              rendererInternals,\n              hydrateChildren\n            );\n          }\n        } else if (shapeFlag & 128) {\n          nextNode = vnode.type.hydrate(\n            node,\n            vnode,\n            parentComponent,\n            parentSuspense,\n            getContainerType(parentNode(node)),\n            slotScopeIds,\n            optimized,\n            rendererInternals,\n            hydrateNode\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n          warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n        }\n    }\n    if (ref != null) {\n      setRef(ref, null, parentSuspense, vnode);\n    }\n    return nextNode;\n  };\n  const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    optimized = optimized || !!vnode.dynamicChildren;\n    const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n    const forcePatch = type === \"input\" || type === \"option\";\n    if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n      if (dirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n      }\n      let needCallTransitionHooks = false;\n      if (isTemplateNode(el)) {\n        needCallTransitionHooks = needTransition(parentSuspense, transition) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n        const content = el.content.firstChild;\n        if (needCallTransitionHooks) {\n          transition.beforeEnter(content);\n        }\n        replaceNode(content, el, parentComponent);\n        vnode.el = el = content;\n      }\n      if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n      !(props && (props.innerHTML || props.textContent))) {\n        let next = hydrateChildren(\n          el.firstChild,\n          vnode,\n          el,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n        let hasWarned = false;\n        while (next) {\n          hasMismatch = true;\n          if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n            warn$1(\n              `Hydration children mismatch on`,\n              el,\n              `\nServer rendered element contains more child nodes than client vdom.`\n            );\n            hasWarned = true;\n          }\n          const cur = next;\n          next = next.nextSibling;\n          remove(cur);\n        }\n      } else if (shapeFlag & 8) {\n        if (el.textContent !== vnode.children) {\n          hasMismatch = true;\n          (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n            `Hydration text content mismatch on`,\n            el,\n            `\n  - rendered on server: ${el.textContent}\n  - expected on client: ${vnode.children}`\n          );\n          el.textContent = vnode.children;\n        }\n      }\n      if (props) {\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n          for (const key in props) {\n            if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n              hasMismatch = true;\n            }\n            if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n            key[0] === \".\") {\n              patchProp(\n                el,\n                key,\n                null,\n                props[key],\n                void 0,\n                void 0,\n                parentComponent\n              );\n            }\n          }\n        } else if (props.onClick) {\n          patchProp(\n            el,\n            \"onClick\",\n            null,\n            props.onClick,\n            void 0,\n            void 0,\n            parentComponent\n          );\n        }\n      }\n      let vnodeHooks;\n      if (vnodeHooks = props && props.onVnodeBeforeMount) {\n        invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n      }\n      if (dirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n      }\n      if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n        queueEffectWithSuspense(() => {\n          vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n          needCallTransitionHooks && transition.enter(el);\n          dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n        }, parentSuspense);\n      }\n    }\n    return el.nextSibling;\n  };\n  const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    optimized = optimized || !!parentVNode.dynamicChildren;\n    const children = parentVNode.children;\n    const l = children.length;\n    let hasWarned = false;\n    for (let i = 0; i < l; i++) {\n      const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n      if (node) {\n        node = hydrateNode(\n          node,\n          vnode,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n      } else if (vnode.type === Text && !vnode.children) {\n        continue;\n      } else {\n        hasMismatch = true;\n        if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n          warn$1(\n            `Hydration children mismatch on`,\n            container,\n            `\nServer rendered element contains fewer child nodes than client vdom.`\n          );\n          hasWarned = true;\n        }\n        patch(\n          null,\n          vnode,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          getContainerType(container),\n          slotScopeIds\n        );\n      }\n    }\n    return node;\n  };\n  const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n    if (fragmentSlotScopeIds) {\n      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n    }\n    const container = parentNode(node);\n    const next = hydrateChildren(\n      nextSibling(node),\n      vnode,\n      container,\n      parentComponent,\n      parentSuspense,\n      slotScopeIds,\n      optimized\n    );\n    if (next && isComment(next) && next.data === \"]\") {\n      return nextSibling(vnode.anchor = next);\n    } else {\n      hasMismatch = true;\n      insert(vnode.anchor = createComment(`]`), container, next);\n      return next;\n    }\n  };\n  const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n    hasMismatch = true;\n    (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n      `Hydration node mismatch:\n- rendered on server:`,\n      node,\n      node.nodeType === 3 /* TEXT */ ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n      `\n- expected on client:`,\n      vnode.type\n    );\n    vnode.el = null;\n    if (isFragment) {\n      const end = locateClosingAnchor(node);\n      while (true) {\n        const next2 = nextSibling(node);\n        if (next2 && next2 !== end) {\n          remove(next2);\n        } else {\n          break;\n        }\n      }\n    }\n    const next = nextSibling(node);\n    const container = parentNode(node);\n    remove(node);\n    patch(\n      null,\n      vnode,\n      container,\n      next,\n      parentComponent,\n      parentSuspense,\n      getContainerType(container),\n      slotScopeIds\n    );\n    return next;\n  };\n  const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n    let match = 0;\n    while (node) {\n      node = nextSibling(node);\n      if (node && isComment(node)) {\n        if (node.data === open)\n          match++;\n        if (node.data === close) {\n          if (match === 0) {\n            return nextSibling(node);\n          } else {\n            match--;\n          }\n        }\n      }\n    }\n    return node;\n  };\n  const replaceNode = (newNode, oldNode, parentComponent) => {\n    const parentNode2 = oldNode.parentNode;\n    if (parentNode2) {\n      parentNode2.replaceChild(newNode, oldNode);\n    }\n    let parent = parentComponent;\n    while (parent) {\n      if (parent.vnode.el === oldNode) {\n        parent.vnode.el = parent.subTree.el = newNode;\n      }\n      parent = parent.parent;\n    }\n  };\n  const isTemplateNode = (node) => {\n    return node.nodeType === 1 /* ELEMENT */ && node.tagName.toLowerCase() === \"template\";\n  };\n  return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n  var _a;\n  let mismatchType;\n  let mismatchKey;\n  let actual;\n  let expected;\n  if (key === \"class\") {\n    actual = el.getAttribute(\"class\");\n    expected = normalizeClass(clientValue);\n    if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n      mismatchType = mismatchKey = `class`;\n    }\n  } else if (key === \"style\") {\n    actual = el.getAttribute(\"style\") || \"\";\n    expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n    const actualMap = toStyleMap(actual);\n    const expectedMap = toStyleMap(expected);\n    if (vnode.dirs) {\n      for (const { dir, value } of vnode.dirs) {\n        if (dir.name === \"show\" && !value) {\n          expectedMap.set(\"display\", \"none\");\n        }\n      }\n    }\n    const root = instance == null ? void 0 : instance.subTree;\n    if (vnode === root || (root == null ? void 0 : root.type) === Fragment && root.children.includes(vnode)) {\n      const cssVars = (_a = instance == null ? void 0 : instance.getCssVars) == null ? void 0 : _a.call(instance);\n      for (const key2 in cssVars) {\n        expectedMap.set(`--${key2}`, String(cssVars[key2]));\n      }\n    }\n    if (!isMapEqual(actualMap, expectedMap)) {\n      mismatchType = mismatchKey = \"style\";\n    }\n  } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n    if (isBooleanAttr(key)) {\n      actual = el.hasAttribute(key);\n      expected = includeBooleanAttr(clientValue);\n    } else if (clientValue == null) {\n      actual = el.hasAttribute(key);\n      expected = false;\n    } else {\n      if (el.hasAttribute(key)) {\n        actual = el.getAttribute(key);\n      } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n        actual = el.value;\n      } else {\n        actual = false;\n      }\n      expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n    }\n    if (actual !== expected) {\n      mismatchType = `attribute`;\n      mismatchKey = key;\n    }\n  }\n  if (mismatchType) {\n    const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n    const preSegment = `Hydration ${mismatchType} mismatch on`;\n    const postSegment = `\n  - rendered on server: ${format(actual)}\n  - expected on client: ${format(expected)}\n  Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n  You should fix the source of the mismatch.`;\n    {\n      warn$1(preSegment, el, postSegment);\n    }\n    return true;\n  }\n  return false;\n}\nfunction toClassSet(str) {\n  return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const s of a) {\n    if (!b.has(s)) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction toStyleMap(str) {\n  const styleMap = /* @__PURE__ */ new Map();\n  for (const item of str.split(\";\")) {\n    let [key, value] = item.split(\":\");\n    key = key == null ? void 0 : key.trim();\n    value = value == null ? void 0 : value.trim();\n    if (key && value) {\n      styleMap.set(key, value);\n    }\n  }\n  return styleMap;\n}\nfunction isMapEqual(a, b) {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const [key, value] of a) {\n    if (value !== b.get(key)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nlet supported;\nlet perf;\nfunction startMeasure(instance, type) {\n  if (instance.appContext.config.performance && isSupported()) {\n    perf.mark(`vue-${type}-${instance.uid}`);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());\n  }\n}\nfunction endMeasure(instance, type) {\n  if (instance.appContext.config.performance && isSupported()) {\n    const startTag = `vue-${type}-${instance.uid}`;\n    const endTag = startTag + `:end`;\n    perf.mark(endTag);\n    perf.measure(\n      `<${formatComponentName(instance, instance.type)}> ${type}`,\n      startTag,\n      endTag\n    );\n    perf.clearMarks(startTag);\n    perf.clearMarks(endTag);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());\n  }\n}\nfunction isSupported() {\n  if (supported !== void 0) {\n    return supported;\n  }\n  if (typeof window !== \"undefined\" && window.performance) {\n    supported = true;\n    perf = window.performance;\n  } else {\n    supported = false;\n  }\n  return supported;\n}\n\nfunction initFeatureFlags() {\n  const needWarn = [];\n  if (typeof __VUE_OPTIONS_API__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_OPTIONS_API__`);\n    getGlobalThis().__VUE_OPTIONS_API__ = true;\n  }\n  if (typeof __VUE_PROD_DEVTOOLS__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_PROD_DEVTOOLS__`);\n    getGlobalThis().__VUE_PROD_DEVTOOLS__ = false;\n  }\n  if (typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`);\n    getGlobalThis().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = false;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && needWarn.length) {\n    const multi = needWarn.length > 1;\n    console.warn(\n      `Feature flag${multi ? `s` : ``} ${needWarn.join(\", \")} ${multi ? `are` : `is`} not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to get better tree-shaking in the production bundle.\n\nFor more details, see https://link.vuejs.org/feature-flags.`\n    );\n  }\n}\n\nconst queuePostRenderEffect = queueEffectWithSuspense ;\nfunction createRenderer(options) {\n  return baseCreateRenderer(options);\n}\nfunction createHydrationRenderer(options) {\n  return baseCreateRenderer(options, createHydrationFunctions);\n}\nfunction baseCreateRenderer(options, createHydrationFns) {\n  {\n    initFeatureFlags();\n  }\n  const target = getGlobalThis();\n  target.__VUE__ = true;\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    setDevtoolsHook$1(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);\n  }\n  const {\n    insert: hostInsert,\n    remove: hostRemove,\n    patchProp: hostPatchProp,\n    createElement: hostCreateElement,\n    createText: hostCreateText,\n    createComment: hostCreateComment,\n    setText: hostSetText,\n    setElementText: hostSetElementText,\n    parentNode: hostParentNode,\n    nextSibling: hostNextSibling,\n    setScopeId: hostSetScopeId = NOOP,\n    insertStaticContent: hostInsertStaticContent\n  } = options;\n  const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = !!(process.env.NODE_ENV !== \"production\") && isHmrUpdating ? false : !!n2.dynamicChildren) => {\n    if (n1 === n2) {\n      return;\n    }\n    if (n1 && !isSameVNodeType(n1, n2)) {\n      anchor = getNextHostNode(n1);\n      unmount(n1, parentComponent, parentSuspense, true);\n      n1 = null;\n    }\n    if (n2.patchFlag === -2) {\n      optimized = false;\n      n2.dynamicChildren = null;\n    }\n    const { type, ref, shapeFlag } = n2;\n    switch (type) {\n      case Text:\n        processText(n1, n2, container, anchor);\n        break;\n      case Comment:\n        processCommentNode(n1, n2, container, anchor);\n        break;\n      case Static:\n        if (n1 == null) {\n          mountStaticNode(n2, container, anchor, namespace);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          patchStaticNode(n1, n2, container, namespace);\n        }\n        break;\n      case Fragment:\n        processFragment(\n          n1,\n          n2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        break;\n      default:\n        if (shapeFlag & 1) {\n          processElement(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (shapeFlag & 6) {\n          processComponent(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (shapeFlag & 64) {\n          type.process(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized,\n            internals\n          );\n        } else if (shapeFlag & 128) {\n          type.process(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized,\n            internals\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Invalid VNode type:\", type, `(${typeof type})`);\n        }\n    }\n    if (ref != null && parentComponent) {\n      setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);\n    }\n  };\n  const processText = (n1, n2, container, anchor) => {\n    if (n1 == null) {\n      hostInsert(\n        n2.el = hostCreateText(n2.children),\n        container,\n        anchor\n      );\n    } else {\n      const el = n2.el = n1.el;\n      if (n2.children !== n1.children) {\n        hostSetText(el, n2.children);\n      }\n    }\n  };\n  const processCommentNode = (n1, n2, container, anchor) => {\n    if (n1 == null) {\n      hostInsert(\n        n2.el = hostCreateComment(n2.children || \"\"),\n        container,\n        anchor\n      );\n    } else {\n      n2.el = n1.el;\n    }\n  };\n  const mountStaticNode = (n2, container, anchor, namespace) => {\n    [n2.el, n2.anchor] = hostInsertStaticContent(\n      n2.children,\n      container,\n      anchor,\n      namespace,\n      n2.el,\n      n2.anchor\n    );\n  };\n  const patchStaticNode = (n1, n2, container, namespace) => {\n    if (n2.children !== n1.children) {\n      const anchor = hostNextSibling(n1.anchor);\n      removeStaticNode(n1);\n      [n2.el, n2.anchor] = hostInsertStaticContent(\n        n2.children,\n        container,\n        anchor,\n        namespace\n      );\n    } else {\n      n2.el = n1.el;\n      n2.anchor = n1.anchor;\n    }\n  };\n  const moveStaticNode = ({ el, anchor }, container, nextSibling) => {\n    let next;\n    while (el && el !== anchor) {\n      next = hostNextSibling(el);\n      hostInsert(el, container, nextSibling);\n      el = next;\n    }\n    hostInsert(anchor, container, nextSibling);\n  };\n  const removeStaticNode = ({ el, anchor }) => {\n    let next;\n    while (el && el !== anchor) {\n      next = hostNextSibling(el);\n      hostRemove(el);\n      el = next;\n    }\n    hostRemove(anchor);\n  };\n  const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    if (n2.type === \"svg\") {\n      namespace = \"svg\";\n    } else if (n2.type === \"math\") {\n      namespace = \"mathml\";\n    }\n    if (n1 == null) {\n      mountElement(\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    } else {\n      patchElement(\n        n1,\n        n2,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    }\n  };\n  const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    let el;\n    let vnodeHook;\n    const { props, shapeFlag, transition, dirs } = vnode;\n    el = vnode.el = hostCreateElement(\n      vnode.type,\n      namespace,\n      props && props.is,\n      props\n    );\n    if (shapeFlag & 8) {\n      hostSetElementText(el, vnode.children);\n    } else if (shapeFlag & 16) {\n      mountChildren(\n        vnode.children,\n        el,\n        null,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(vnode, namespace),\n        slotScopeIds,\n        optimized\n      );\n    }\n    if (dirs) {\n      invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n    }\n    setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);\n    if (props) {\n      for (const key in props) {\n        if (key !== \"value\" && !isReservedProp(key)) {\n          hostPatchProp(\n            el,\n            key,\n            null,\n            props[key],\n            namespace,\n            vnode.children,\n            parentComponent,\n            parentSuspense,\n            unmountChildren\n          );\n        }\n      }\n      if (\"value\" in props) {\n        hostPatchProp(el, \"value\", null, props.value, namespace);\n      }\n      if (vnodeHook = props.onVnodeBeforeMount) {\n        invokeVNodeHook(vnodeHook, parentComponent, vnode);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      Object.defineProperty(el, \"__vnode\", {\n        value: vnode,\n        enumerable: false\n      });\n      Object.defineProperty(el, \"__vueParentComponent\", {\n        value: parentComponent,\n        enumerable: false\n      });\n    }\n    if (dirs) {\n      invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n    }\n    const needCallTransitionHooks = needTransition(parentSuspense, transition);\n    if (needCallTransitionHooks) {\n      transition.beforeEnter(el);\n    }\n    hostInsert(el, container, anchor);\n    if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n        needCallTransitionHooks && transition.enter(el);\n        dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n      }, parentSuspense);\n    }\n  };\n  const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {\n    if (scopeId) {\n      hostSetScopeId(el, scopeId);\n    }\n    if (slotScopeIds) {\n      for (let i = 0; i < slotScopeIds.length; i++) {\n        hostSetScopeId(el, slotScopeIds[i]);\n      }\n    }\n    if (parentComponent) {\n      let subTree = parentComponent.subTree;\n      if (!!(process.env.NODE_ENV !== \"production\") && subTree.patchFlag > 0 && subTree.patchFlag & 2048) {\n        subTree = filterSingleRoot(subTree.children) || subTree;\n      }\n      if (vnode === subTree) {\n        const parentVNode = parentComponent.vnode;\n        setScopeId(\n          el,\n          parentVNode,\n          parentVNode.scopeId,\n          parentVNode.slotScopeIds,\n          parentComponent.parent\n        );\n      }\n    }\n  };\n  const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => {\n    for (let i = start; i < children.length; i++) {\n      const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);\n      patch(\n        null,\n        child,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    }\n  };\n  const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    const el = n2.el = n1.el;\n    let { patchFlag, dynamicChildren, dirs } = n2;\n    patchFlag |= n1.patchFlag & 16;\n    const oldProps = n1.props || EMPTY_OBJ;\n    const newProps = n2.props || EMPTY_OBJ;\n    let vnodeHook;\n    parentComponent && toggleRecurse(parentComponent, false);\n    if (vnodeHook = newProps.onVnodeBeforeUpdate) {\n      invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n    }\n    if (dirs) {\n      invokeDirectiveHook(n2, n1, parentComponent, \"beforeUpdate\");\n    }\n    parentComponent && toggleRecurse(parentComponent, true);\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n      patchFlag = 0;\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (dynamicChildren) {\n      patchBlockChildren(\n        n1.dynamicChildren,\n        dynamicChildren,\n        el,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(n2, namespace),\n        slotScopeIds\n      );\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        traverseStaticChildren(n1, n2);\n      }\n    } else if (!optimized) {\n      patchChildren(\n        n1,\n        n2,\n        el,\n        null,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(n2, namespace),\n        slotScopeIds,\n        false\n      );\n    }\n    if (patchFlag > 0) {\n      if (patchFlag & 16) {\n        patchProps(\n          el,\n          n2,\n          oldProps,\n          newProps,\n          parentComponent,\n          parentSuspense,\n          namespace\n        );\n      } else {\n        if (patchFlag & 2) {\n          if (oldProps.class !== newProps.class) {\n            hostPatchProp(el, \"class\", null, newProps.class, namespace);\n          }\n        }\n        if (patchFlag & 4) {\n          hostPatchProp(el, \"style\", oldProps.style, newProps.style, namespace);\n        }\n        if (patchFlag & 8) {\n          const propsToUpdate = n2.dynamicProps;\n          for (let i = 0; i < propsToUpdate.length; i++) {\n            const key = propsToUpdate[i];\n            const prev = oldProps[key];\n            const next = newProps[key];\n            if (next !== prev || key === \"value\") {\n              hostPatchProp(\n                el,\n                key,\n                prev,\n                next,\n                namespace,\n                n1.children,\n                parentComponent,\n                parentSuspense,\n                unmountChildren\n              );\n            }\n          }\n        }\n      }\n      if (patchFlag & 1) {\n        if (n1.children !== n2.children) {\n          hostSetElementText(el, n2.children);\n        }\n      }\n    } else if (!optimized && dynamicChildren == null) {\n      patchProps(\n        el,\n        n2,\n        oldProps,\n        newProps,\n        parentComponent,\n        parentSuspense,\n        namespace\n      );\n    }\n    if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n        dirs && invokeDirectiveHook(n2, n1, parentComponent, \"updated\");\n      }, parentSuspense);\n    }\n  };\n  const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => {\n    for (let i = 0; i < newChildren.length; i++) {\n      const oldVNode = oldChildren[i];\n      const newVNode = newChildren[i];\n      const container = (\n        // oldVNode may be an errored async setup() component inside Suspense\n        // which will not have a mounted element\n        oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent\n        // of the Fragment itself so it can move its children.\n        (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement\n        // which also requires the correct parent container\n        !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything.\n        oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : (\n          // In other cases, the parent container is not actually used so we\n          // just pass the block element here to avoid a DOM parentNode call.\n          fallbackContainer\n        )\n      );\n      patch(\n        oldVNode,\n        newVNode,\n        container,\n        null,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        true\n      );\n    }\n  };\n  const patchProps = (el, vnode, oldProps, newProps, parentComponent, parentSuspense, namespace) => {\n    if (oldProps !== newProps) {\n      if (oldProps !== EMPTY_OBJ) {\n        for (const key in oldProps) {\n          if (!isReservedProp(key) && !(key in newProps)) {\n            hostPatchProp(\n              el,\n              key,\n              oldProps[key],\n              null,\n              namespace,\n              vnode.children,\n              parentComponent,\n              parentSuspense,\n              unmountChildren\n            );\n          }\n        }\n      }\n      for (const key in newProps) {\n        if (isReservedProp(key))\n          continue;\n        const next = newProps[key];\n        const prev = oldProps[key];\n        if (next !== prev && key !== \"value\") {\n          hostPatchProp(\n            el,\n            key,\n            prev,\n            next,\n            namespace,\n            vnode.children,\n            parentComponent,\n            parentSuspense,\n            unmountChildren\n          );\n        }\n      }\n      if (\"value\" in newProps) {\n        hostPatchProp(el, \"value\", oldProps.value, newProps.value, namespace);\n      }\n    }\n  };\n  const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(\"\");\n    const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(\"\");\n    let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;\n    if (!!(process.env.NODE_ENV !== \"production\") && // #5523 dev root fragment may inherit directives\n    (isHmrUpdating || patchFlag & 2048)) {\n      patchFlag = 0;\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (fragmentSlotScopeIds) {\n      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n    }\n    if (n1 == null) {\n      hostInsert(fragmentStartAnchor, container, anchor);\n      hostInsert(fragmentEndAnchor, container, anchor);\n      mountChildren(\n        // #10007\n        // such fragment like `<></>` will be compiled into\n        // a fragment which doesn't have a children.\n        // In this case fallback to an empty array\n        n2.children || [],\n        container,\n        fragmentEndAnchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    } else {\n      if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result\n      // of renderSlot() with no valid children\n      n1.dynamicChildren) {\n        patchBlockChildren(\n          n1.dynamicChildren,\n          dynamicChildren,\n          container,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds\n        );\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          traverseStaticChildren(n1, n2);\n        } else if (\n          // #2080 if the stable fragment has a key, it's a <template v-for> that may\n          //  get moved around. Make sure all root level vnodes inherit el.\n          // #2134 or if it's a component root, it may also get moved around\n          // as the component is being moved.\n          n2.key != null || parentComponent && n2 === parentComponent.subTree\n        ) {\n          traverseStaticChildren(\n            n1,\n            n2,\n            true\n            /* shallow */\n          );\n        }\n      } else {\n        patchChildren(\n          n1,\n          n2,\n          container,\n          fragmentEndAnchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      }\n    }\n  };\n  const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    n2.slotScopeIds = slotScopeIds;\n    if (n1 == null) {\n      if (n2.shapeFlag & 512) {\n        parentComponent.ctx.activate(\n          n2,\n          container,\n          anchor,\n          namespace,\n          optimized\n        );\n      } else {\n        mountComponent(\n          n2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          optimized\n        );\n      }\n    } else {\n      updateComponent(n1, n2, optimized);\n    }\n  };\n  const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => {\n    const instance = (initialVNode.component = createComponentInstance(\n      initialVNode,\n      parentComponent,\n      parentSuspense\n    ));\n    if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n      registerHMR(instance);\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      pushWarningContext(initialVNode);\n      startMeasure(instance, `mount`);\n    }\n    if (isKeepAlive(initialVNode)) {\n      instance.ctx.renderer = internals;\n    }\n    {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        startMeasure(instance, `init`);\n      }\n      setupComponent(instance);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        endMeasure(instance, `init`);\n      }\n    }\n    if (instance.asyncDep) {\n      parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect);\n      if (!initialVNode.el) {\n        const placeholder = instance.subTree = createVNode(Comment);\n        processCommentNode(null, placeholder, container, anchor);\n      }\n    } else {\n      setupRenderEffect(\n        instance,\n        initialVNode,\n        container,\n        anchor,\n        parentSuspense,\n        namespace,\n        optimized\n      );\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      popWarningContext();\n      endMeasure(instance, `mount`);\n    }\n  };\n  const updateComponent = (n1, n2, optimized) => {\n    const instance = n2.component = n1.component;\n    if (shouldUpdateComponent(n1, n2, optimized)) {\n      if (instance.asyncDep && !instance.asyncResolved) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(n2);\n        }\n        updateComponentPreRender(instance, n2, optimized);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n        return;\n      } else {\n        instance.next = n2;\n        invalidateJob(instance.update);\n        instance.effect.dirty = true;\n        instance.update();\n      }\n    } else {\n      n2.el = n1.el;\n      instance.vnode = n2;\n    }\n  };\n  const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => {\n    const componentUpdateFn = () => {\n      if (!instance.isMounted) {\n        let vnodeHook;\n        const { el, props } = initialVNode;\n        const { bm, m, parent } = instance;\n        const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);\n        toggleRecurse(instance, false);\n        if (bm) {\n          invokeArrayFns(bm);\n        }\n        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) {\n          invokeVNodeHook(vnodeHook, parent, initialVNode);\n        }\n        toggleRecurse(instance, true);\n        if (el && hydrateNode) {\n          const hydrateSubTree = () => {\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              startMeasure(instance, `render`);\n            }\n            instance.subTree = renderComponentRoot(instance);\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              endMeasure(instance, `render`);\n            }\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              startMeasure(instance, `hydrate`);\n            }\n            hydrateNode(\n              el,\n              instance.subTree,\n              instance,\n              parentSuspense,\n              null\n            );\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              endMeasure(instance, `hydrate`);\n            }\n          };\n          if (isAsyncWrapperVNode) {\n            initialVNode.type.__asyncLoader().then(\n              // note: we are moving the render call into an async callback,\n              // which means it won't track dependencies - but it's ok because\n              // a server-rendered async wrapper is already in resolved state\n              // and it will never need to change.\n              () => !instance.isUnmounted && hydrateSubTree()\n            );\n          } else {\n            hydrateSubTree();\n          }\n        } else {\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            startMeasure(instance, `render`);\n          }\n          const subTree = instance.subTree = renderComponentRoot(instance);\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            endMeasure(instance, `render`);\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            startMeasure(instance, `patch`);\n          }\n          patch(\n            null,\n            subTree,\n            container,\n            anchor,\n            instance,\n            parentSuspense,\n            namespace\n          );\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            endMeasure(instance, `patch`);\n          }\n          initialVNode.el = subTree.el;\n        }\n        if (m) {\n          queuePostRenderEffect(m, parentSuspense);\n        }\n        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {\n          const scopedInitialVNode = initialVNode;\n          queuePostRenderEffect(\n            () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode),\n            parentSuspense\n          );\n        }\n        if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) {\n          instance.a && queuePostRenderEffect(instance.a, parentSuspense);\n        }\n        instance.isMounted = true;\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n          devtoolsComponentAdded(instance);\n        }\n        initialVNode = container = anchor = null;\n      } else {\n        let { next, bu, u, parent, vnode } = instance;\n        {\n          const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance);\n          if (nonHydratedAsyncRoot) {\n            if (next) {\n              next.el = vnode.el;\n              updateComponentPreRender(instance, next, optimized);\n            }\n            nonHydratedAsyncRoot.asyncDep.then(() => {\n              if (!instance.isUnmounted) {\n                componentUpdateFn();\n              }\n            });\n            return;\n          }\n        }\n        let originNext = next;\n        let vnodeHook;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(next || instance.vnode);\n        }\n        toggleRecurse(instance, false);\n        if (next) {\n          next.el = vnode.el;\n          updateComponentPreRender(instance, next, optimized);\n        } else {\n          next = vnode;\n        }\n        if (bu) {\n          invokeArrayFns(bu);\n        }\n        if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) {\n          invokeVNodeHook(vnodeHook, parent, next, vnode);\n        }\n        toggleRecurse(instance, true);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `render`);\n        }\n        const nextTree = renderComponentRoot(instance);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `render`);\n        }\n        const prevTree = instance.subTree;\n        instance.subTree = nextTree;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `patch`);\n        }\n        patch(\n          prevTree,\n          nextTree,\n          // parent may have changed if it's in a teleport\n          hostParentNode(prevTree.el),\n          // anchor may have changed if it's in a fragment\n          getNextHostNode(prevTree),\n          instance,\n          parentSuspense,\n          namespace\n        );\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `patch`);\n        }\n        next.el = nextTree.el;\n        if (originNext === null) {\n          updateHOCHostEl(instance, nextTree.el);\n        }\n        if (u) {\n          queuePostRenderEffect(u, parentSuspense);\n        }\n        if (vnodeHook = next.props && next.props.onVnodeUpdated) {\n          queuePostRenderEffect(\n            () => invokeVNodeHook(vnodeHook, parent, next, vnode),\n            parentSuspense\n          );\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n          devtoolsComponentUpdated(instance);\n        }\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n      }\n    };\n    const effect = instance.effect = new ReactiveEffect(\n      componentUpdateFn,\n      NOOP,\n      () => queueJob(update),\n      instance.scope\n      // track it in component's effect scope\n    );\n    const update = instance.update = () => {\n      if (effect.dirty) {\n        effect.run();\n      }\n    };\n    update.id = instance.uid;\n    toggleRecurse(instance, true);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      effect.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0;\n      effect.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0;\n      update.ownerInstance = instance;\n    }\n    update();\n  };\n  const updateComponentPreRender = (instance, nextVNode, optimized) => {\n    nextVNode.component = instance;\n    const prevProps = instance.vnode.props;\n    instance.vnode = nextVNode;\n    instance.next = null;\n    updateProps(instance, nextVNode.props, prevProps, optimized);\n    updateSlots(instance, nextVNode.children, optimized);\n    pauseTracking();\n    flushPreFlushCbs(instance);\n    resetTracking();\n  };\n  const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => {\n    const c1 = n1 && n1.children;\n    const prevShapeFlag = n1 ? n1.shapeFlag : 0;\n    const c2 = n2.children;\n    const { patchFlag, shapeFlag } = n2;\n    if (patchFlag > 0) {\n      if (patchFlag & 128) {\n        patchKeyedChildren(\n          c1,\n          c2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        return;\n      } else if (patchFlag & 256) {\n        patchUnkeyedChildren(\n          c1,\n          c2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        return;\n      }\n    }\n    if (shapeFlag & 8) {\n      if (prevShapeFlag & 16) {\n        unmountChildren(c1, parentComponent, parentSuspense);\n      }\n      if (c2 !== c1) {\n        hostSetElementText(container, c2);\n      }\n    } else {\n      if (prevShapeFlag & 16) {\n        if (shapeFlag & 16) {\n          patchKeyedChildren(\n            c1,\n            c2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else {\n          unmountChildren(c1, parentComponent, parentSuspense, true);\n        }\n      } else {\n        if (prevShapeFlag & 8) {\n          hostSetElementText(container, \"\");\n        }\n        if (shapeFlag & 16) {\n          mountChildren(\n            c2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        }\n      }\n    }\n  };\n  const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    c1 = c1 || EMPTY_ARR;\n    c2 = c2 || EMPTY_ARR;\n    const oldLength = c1.length;\n    const newLength = c2.length;\n    const commonLength = Math.min(oldLength, newLength);\n    let i;\n    for (i = 0; i < commonLength; i++) {\n      const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n      patch(\n        c1[i],\n        nextChild,\n        container,\n        null,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    }\n    if (oldLength > newLength) {\n      unmountChildren(\n        c1,\n        parentComponent,\n        parentSuspense,\n        true,\n        false,\n        commonLength\n      );\n    } else {\n      mountChildren(\n        c2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized,\n        commonLength\n      );\n    }\n  };\n  const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    let i = 0;\n    const l2 = c2.length;\n    let e1 = c1.length - 1;\n    let e2 = l2 - 1;\n    while (i <= e1 && i <= e2) {\n      const n1 = c1[i];\n      const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n      if (isSameVNodeType(n1, n2)) {\n        patch(\n          n1,\n          n2,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      } else {\n        break;\n      }\n      i++;\n    }\n    while (i <= e1 && i <= e2) {\n      const n1 = c1[e1];\n      const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);\n      if (isSameVNodeType(n1, n2)) {\n        patch(\n          n1,\n          n2,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      } else {\n        break;\n      }\n      e1--;\n      e2--;\n    }\n    if (i > e1) {\n      if (i <= e2) {\n        const nextPos = e2 + 1;\n        const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;\n        while (i <= e2) {\n          patch(\n            null,\n            c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]),\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          i++;\n        }\n      }\n    } else if (i > e2) {\n      while (i <= e1) {\n        unmount(c1[i], parentComponent, parentSuspense, true);\n        i++;\n      }\n    } else {\n      const s1 = i;\n      const s2 = i;\n      const keyToNewIndexMap = /* @__PURE__ */ new Map();\n      for (i = s2; i <= e2; i++) {\n        const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n        if (nextChild.key != null) {\n          if (!!(process.env.NODE_ENV !== \"production\") && keyToNewIndexMap.has(nextChild.key)) {\n            warn$1(\n              `Duplicate keys found during update:`,\n              JSON.stringify(nextChild.key),\n              `Make sure keys are unique.`\n            );\n          }\n          keyToNewIndexMap.set(nextChild.key, i);\n        }\n      }\n      let j;\n      let patched = 0;\n      const toBePatched = e2 - s2 + 1;\n      let moved = false;\n      let maxNewIndexSoFar = 0;\n      const newIndexToOldIndexMap = new Array(toBePatched);\n      for (i = 0; i < toBePatched; i++)\n        newIndexToOldIndexMap[i] = 0;\n      for (i = s1; i <= e1; i++) {\n        const prevChild = c1[i];\n        if (patched >= toBePatched) {\n          unmount(prevChild, parentComponent, parentSuspense, true);\n          continue;\n        }\n        let newIndex;\n        if (prevChild.key != null) {\n          newIndex = keyToNewIndexMap.get(prevChild.key);\n        } else {\n          for (j = s2; j <= e2; j++) {\n            if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {\n              newIndex = j;\n              break;\n            }\n          }\n        }\n        if (newIndex === void 0) {\n          unmount(prevChild, parentComponent, parentSuspense, true);\n        } else {\n          newIndexToOldIndexMap[newIndex - s2] = i + 1;\n          if (newIndex >= maxNewIndexSoFar) {\n            maxNewIndexSoFar = newIndex;\n          } else {\n            moved = true;\n          }\n          patch(\n            prevChild,\n            c2[newIndex],\n            container,\n            null,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          patched++;\n        }\n      }\n      const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;\n      j = increasingNewIndexSequence.length - 1;\n      for (i = toBePatched - 1; i >= 0; i--) {\n        const nextIndex = s2 + i;\n        const nextChild = c2[nextIndex];\n        const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor;\n        if (newIndexToOldIndexMap[i] === 0) {\n          patch(\n            null,\n            nextChild,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (moved) {\n          if (j < 0 || i !== increasingNewIndexSequence[j]) {\n            move(nextChild, container, anchor, 2);\n          } else {\n            j--;\n          }\n        }\n      }\n    }\n  };\n  const move = (vnode, container, anchor, moveType, parentSuspense = null) => {\n    const { el, type, transition, children, shapeFlag } = vnode;\n    if (shapeFlag & 6) {\n      move(vnode.component.subTree, container, anchor, moveType);\n      return;\n    }\n    if (shapeFlag & 128) {\n      vnode.suspense.move(container, anchor, moveType);\n      return;\n    }\n    if (shapeFlag & 64) {\n      type.move(vnode, container, anchor, internals);\n      return;\n    }\n    if (type === Fragment) {\n      hostInsert(el, container, anchor);\n      for (let i = 0; i < children.length; i++) {\n        move(children[i], container, anchor, moveType);\n      }\n      hostInsert(vnode.anchor, container, anchor);\n      return;\n    }\n    if (type === Static) {\n      moveStaticNode(vnode, container, anchor);\n      return;\n    }\n    const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition;\n    if (needTransition2) {\n      if (moveType === 0) {\n        transition.beforeEnter(el);\n        hostInsert(el, container, anchor);\n        queuePostRenderEffect(() => transition.enter(el), parentSuspense);\n      } else {\n        const { leave, delayLeave, afterLeave } = transition;\n        const remove2 = () => hostInsert(el, container, anchor);\n        const performLeave = () => {\n          leave(el, () => {\n            remove2();\n            afterLeave && afterLeave();\n          });\n        };\n        if (delayLeave) {\n          delayLeave(el, remove2, performLeave);\n        } else {\n          performLeave();\n        }\n      }\n    } else {\n      hostInsert(el, container, anchor);\n    }\n  };\n  const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {\n    const {\n      type,\n      props,\n      ref,\n      children,\n      dynamicChildren,\n      shapeFlag,\n      patchFlag,\n      dirs\n    } = vnode;\n    if (ref != null) {\n      setRef(ref, null, parentSuspense, vnode, true);\n    }\n    if (shapeFlag & 256) {\n      parentComponent.ctx.deactivate(vnode);\n      return;\n    }\n    const shouldInvokeDirs = shapeFlag & 1 && dirs;\n    const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);\n    let vnodeHook;\n    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) {\n      invokeVNodeHook(vnodeHook, parentComponent, vnode);\n    }\n    if (shapeFlag & 6) {\n      unmountComponent(vnode.component, parentSuspense, doRemove);\n    } else {\n      if (shapeFlag & 128) {\n        vnode.suspense.unmount(parentSuspense, doRemove);\n        return;\n      }\n      if (shouldInvokeDirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"beforeUnmount\");\n      }\n      if (shapeFlag & 64) {\n        vnode.type.remove(\n          vnode,\n          parentComponent,\n          parentSuspense,\n          optimized,\n          internals,\n          doRemove\n        );\n      } else if (dynamicChildren && // #1153: fast path should not be taken for non-stable (v-for) fragments\n      (type !== Fragment || patchFlag > 0 && patchFlag & 64)) {\n        unmountChildren(\n          dynamicChildren,\n          parentComponent,\n          parentSuspense,\n          false,\n          true\n        );\n      } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) {\n        unmountChildren(children, parentComponent, parentSuspense);\n      }\n      if (doRemove) {\n        remove(vnode);\n      }\n    }\n    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n        shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, \"unmounted\");\n      }, parentSuspense);\n    }\n  };\n  const remove = (vnode) => {\n    const { type, el, anchor, transition } = vnode;\n    if (type === Fragment) {\n      if (!!(process.env.NODE_ENV !== \"production\") && vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) {\n        vnode.children.forEach((child) => {\n          if (child.type === Comment) {\n            hostRemove(child.el);\n          } else {\n            remove(child);\n          }\n        });\n      } else {\n        removeFragment(el, anchor);\n      }\n      return;\n    }\n    if (type === Static) {\n      removeStaticNode(vnode);\n      return;\n    }\n    const performRemove = () => {\n      hostRemove(el);\n      if (transition && !transition.persisted && transition.afterLeave) {\n        transition.afterLeave();\n      }\n    };\n    if (vnode.shapeFlag & 1 && transition && !transition.persisted) {\n      const { leave, delayLeave } = transition;\n      const performLeave = () => leave(el, performRemove);\n      if (delayLeave) {\n        delayLeave(vnode.el, performRemove, performLeave);\n      } else {\n        performLeave();\n      }\n    } else {\n      performRemove();\n    }\n  };\n  const removeFragment = (cur, end) => {\n    let next;\n    while (cur !== end) {\n      next = hostNextSibling(cur);\n      hostRemove(cur);\n      cur = next;\n    }\n    hostRemove(end);\n  };\n  const unmountComponent = (instance, parentSuspense, doRemove) => {\n    if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n      unregisterHMR(instance);\n    }\n    const { bum, scope, update, subTree, um } = instance;\n    if (bum) {\n      invokeArrayFns(bum);\n    }\n    scope.stop();\n    if (update) {\n      update.active = false;\n      unmount(subTree, instance, parentSuspense, doRemove);\n    }\n    if (um) {\n      queuePostRenderEffect(um, parentSuspense);\n    }\n    queuePostRenderEffect(() => {\n      instance.isUnmounted = true;\n    }, parentSuspense);\n    if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) {\n      parentSuspense.deps--;\n      if (parentSuspense.deps === 0) {\n        parentSuspense.resolve();\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      devtoolsComponentRemoved(instance);\n    }\n  };\n  const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {\n    for (let i = start; i < children.length; i++) {\n      unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);\n    }\n  };\n  const getNextHostNode = (vnode) => {\n    if (vnode.shapeFlag & 6) {\n      return getNextHostNode(vnode.component.subTree);\n    }\n    if (vnode.shapeFlag & 128) {\n      return vnode.suspense.next();\n    }\n    return hostNextSibling(vnode.anchor || vnode.el);\n  };\n  let isFlushing = false;\n  const render = (vnode, container, namespace) => {\n    if (vnode == null) {\n      if (container._vnode) {\n        unmount(container._vnode, null, null, true);\n      }\n    } else {\n      patch(\n        container._vnode || null,\n        vnode,\n        container,\n        null,\n        null,\n        null,\n        namespace\n      );\n    }\n    if (!isFlushing) {\n      isFlushing = true;\n      flushPreFlushCbs();\n      flushPostFlushCbs();\n      isFlushing = false;\n    }\n    container._vnode = vnode;\n  };\n  const internals = {\n    p: patch,\n    um: unmount,\n    m: move,\n    r: remove,\n    mt: mountComponent,\n    mc: mountChildren,\n    pc: patchChildren,\n    pbc: patchBlockChildren,\n    n: getNextHostNode,\n    o: options\n  };\n  let hydrate;\n  let hydrateNode;\n  if (createHydrationFns) {\n    [hydrate, hydrateNode] = createHydrationFns(\n      internals\n    );\n  }\n  return {\n    render,\n    hydrate,\n    createApp: createAppAPI(render, hydrate)\n  };\n}\nfunction resolveChildrenNamespace({ type, props }, currentNamespace) {\n  return currentNamespace === \"svg\" && type === \"foreignObject\" || currentNamespace === \"mathml\" && type === \"annotation-xml\" && props && props.encoding && props.encoding.includes(\"html\") ? void 0 : currentNamespace;\n}\nfunction toggleRecurse({ effect, update }, allowed) {\n  effect.allowRecurse = update.allowRecurse = allowed;\n}\nfunction needTransition(parentSuspense, transition) {\n  return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;\n}\nfunction traverseStaticChildren(n1, n2, shallow = false) {\n  const ch1 = n1.children;\n  const ch2 = n2.children;\n  if (isArray(ch1) && isArray(ch2)) {\n    for (let i = 0; i < ch1.length; i++) {\n      const c1 = ch1[i];\n      let c2 = ch2[i];\n      if (c2.shapeFlag & 1 && !c2.dynamicChildren) {\n        if (c2.patchFlag <= 0 || c2.patchFlag === 32) {\n          c2 = ch2[i] = cloneIfMounted(ch2[i]);\n          c2.el = c1.el;\n        }\n        if (!shallow)\n          traverseStaticChildren(c1, c2);\n      }\n      if (c2.type === Text) {\n        c2.el = c1.el;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && c2.type === Comment && !c2.el) {\n        c2.el = c1.el;\n      }\n    }\n  }\n}\nfunction getSequence(arr) {\n  const p = arr.slice();\n  const result = [0];\n  let i, j, u, v, c;\n  const len = arr.length;\n  for (i = 0; i < len; i++) {\n    const arrI = arr[i];\n    if (arrI !== 0) {\n      j = result[result.length - 1];\n      if (arr[j] < arrI) {\n        p[i] = j;\n        result.push(i);\n        continue;\n      }\n      u = 0;\n      v = result.length - 1;\n      while (u < v) {\n        c = u + v >> 1;\n        if (arr[result[c]] < arrI) {\n          u = c + 1;\n        } else {\n          v = c;\n        }\n      }\n      if (arrI < arr[result[u]]) {\n        if (u > 0) {\n          p[i] = result[u - 1];\n        }\n        result[u] = i;\n      }\n    }\n  }\n  u = result.length;\n  v = result[u - 1];\n  while (u-- > 0) {\n    result[u] = v;\n    v = p[v];\n  }\n  return result;\n}\nfunction locateNonHydratedAsyncRoot(instance) {\n  const subComponent = instance.subTree.component;\n  if (subComponent) {\n    if (subComponent.asyncDep && !subComponent.asyncResolved) {\n      return subComponent;\n    } else {\n      return locateNonHydratedAsyncRoot(subComponent);\n    }\n  }\n}\n\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n  const targetSelector = props && props.to;\n  if (isString(targetSelector)) {\n    if (!select) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n      );\n      return null;\n    } else {\n      const target = select(targetSelector);\n      if (!target) {\n        !!(process.env.NODE_ENV !== \"production\") && warn$1(\n          `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n        );\n      }\n      return target;\n    }\n  } else {\n    if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n      warn$1(`Invalid Teleport target: ${targetSelector}`);\n    }\n    return targetSelector;\n  }\n};\nconst TeleportImpl = {\n  name: \"Teleport\",\n  __isTeleport: true,\n  process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n    const {\n      mc: mountChildren,\n      pc: patchChildren,\n      pbc: patchBlockChildren,\n      o: { insert, querySelector, createText, createComment }\n    } = internals;\n    const disabled = isTeleportDisabled(n2.props);\n    let { shapeFlag, children, dynamicChildren } = n2;\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (n1 == null) {\n      const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n      const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n      insert(placeholder, container, anchor);\n      insert(mainAnchor, container, anchor);\n      const target = n2.target = resolveTarget(n2.props, querySelector);\n      const targetAnchor = n2.targetAnchor = createText(\"\");\n      if (target) {\n        insert(targetAnchor, target);\n        if (namespace === \"svg\" || isTargetSVG(target)) {\n          namespace = \"svg\";\n        } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n          namespace = \"mathml\";\n        }\n      } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n        warn$1(\"Invalid Teleport target on mount:\", target, `(${typeof target})`);\n      }\n      const mount = (container2, anchor2) => {\n        if (shapeFlag & 16) {\n          mountChildren(\n            children,\n            container2,\n            anchor2,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        }\n      };\n      if (disabled) {\n        mount(container, mainAnchor);\n      } else if (target) {\n        mount(target, targetAnchor);\n      }\n    } else {\n      n2.el = n1.el;\n      const mainAnchor = n2.anchor = n1.anchor;\n      const target = n2.target = n1.target;\n      const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n      const wasDisabled = isTeleportDisabled(n1.props);\n      const currentContainer = wasDisabled ? container : target;\n      const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n      if (namespace === \"svg\" || isTargetSVG(target)) {\n        namespace = \"svg\";\n      } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n        namespace = \"mathml\";\n      }\n      if (dynamicChildren) {\n        patchBlockChildren(\n          n1.dynamicChildren,\n          dynamicChildren,\n          currentContainer,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds\n        );\n        traverseStaticChildren(n1, n2, true);\n      } else if (!optimized) {\n        patchChildren(\n          n1,\n          n2,\n          currentContainer,\n          currentAnchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          false\n        );\n      }\n      if (disabled) {\n        if (!wasDisabled) {\n          moveTeleport(\n            n2,\n            container,\n            mainAnchor,\n            internals,\n            1\n          );\n        } else {\n          if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n            n2.props.to = n1.props.to;\n          }\n        }\n      } else {\n        if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n          const nextTarget = n2.target = resolveTarget(\n            n2.props,\n            querySelector\n          );\n          if (nextTarget) {\n            moveTeleport(\n              n2,\n              nextTarget,\n              null,\n              internals,\n              0\n            );\n          } else if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn$1(\n              \"Invalid Teleport target on update:\",\n              target,\n              `(${typeof target})`\n            );\n          }\n        } else if (wasDisabled) {\n          moveTeleport(\n            n2,\n            target,\n            targetAnchor,\n            internals,\n            1\n          );\n        }\n      }\n    }\n    updateCssVars(n2);\n  },\n  remove(vnode, parentComponent, parentSuspense, optimized, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n    const { shapeFlag, children, anchor, targetAnchor, target, props } = vnode;\n    if (target) {\n      hostRemove(targetAnchor);\n    }\n    doRemove && hostRemove(anchor);\n    if (shapeFlag & 16) {\n      const shouldRemove = doRemove || !isTeleportDisabled(props);\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        unmount(\n          child,\n          parentComponent,\n          parentSuspense,\n          shouldRemove,\n          !!child.dynamicChildren\n        );\n      }\n    }\n  },\n  move: moveTeleport,\n  hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n  if (moveType === 0) {\n    insert(vnode.targetAnchor, container, parentAnchor);\n  }\n  const { el, anchor, shapeFlag, children, props } = vnode;\n  const isReorder = moveType === 2;\n  if (isReorder) {\n    insert(el, container, parentAnchor);\n  }\n  if (!isReorder || isTeleportDisabled(props)) {\n    if (shapeFlag & 16) {\n      for (let i = 0; i < children.length; i++) {\n        move(\n          children[i],\n          container,\n          parentAnchor,\n          2\n        );\n      }\n    }\n  }\n  if (isReorder) {\n    insert(anchor, container, parentAnchor);\n  }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n  o: { nextSibling, parentNode, querySelector }\n}, hydrateChildren) {\n  const target = vnode.target = resolveTarget(\n    vnode.props,\n    querySelector\n  );\n  if (target) {\n    const targetNode = target._lpa || target.firstChild;\n    if (vnode.shapeFlag & 16) {\n      if (isTeleportDisabled(vnode.props)) {\n        vnode.anchor = hydrateChildren(\n          nextSibling(node),\n          vnode,\n          parentNode(node),\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n        vnode.targetAnchor = targetNode;\n      } else {\n        vnode.anchor = nextSibling(node);\n        let targetAnchor = targetNode;\n        while (targetAnchor) {\n          targetAnchor = nextSibling(targetAnchor);\n          if (targetAnchor && targetAnchor.nodeType === 8 && targetAnchor.data === \"teleport anchor\") {\n            vnode.targetAnchor = targetAnchor;\n            target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n            break;\n          }\n        }\n        hydrateChildren(\n          targetNode,\n          vnode,\n          target,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n      }\n    }\n    updateCssVars(vnode);\n  }\n  return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode) {\n  const ctx = vnode.ctx;\n  if (ctx && ctx.ut) {\n    let node = vnode.children[0].el;\n    while (node && node !== vnode.targetAnchor) {\n      if (node.nodeType === 1)\n        node.setAttribute(\"data-v-owner\", ctx.uid);\n      node = node.nextSibling;\n    }\n    ctx.ut();\n  }\n}\n\nconst Fragment = Symbol.for(\"v-fgt\");\nconst Text = Symbol.for(\"v-txt\");\nconst Comment = Symbol.for(\"v-cmt\");\nconst Static = Symbol.for(\"v-stc\");\nconst blockStack = [];\nlet currentBlock = null;\nfunction openBlock(disableTracking = false) {\n  blockStack.push(currentBlock = disableTracking ? null : []);\n}\nfunction closeBlock() {\n  blockStack.pop();\n  currentBlock = blockStack[blockStack.length - 1] || null;\n}\nlet isBlockTreeEnabled = 1;\nfunction setBlockTracking(value) {\n  isBlockTreeEnabled += value;\n}\nfunction setupBlock(vnode) {\n  vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;\n  closeBlock();\n  if (isBlockTreeEnabled > 0 && currentBlock) {\n    currentBlock.push(vnode);\n  }\n  return vnode;\n}\nfunction createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {\n  return setupBlock(\n    createBaseVNode(\n      type,\n      props,\n      children,\n      patchFlag,\n      dynamicProps,\n      shapeFlag,\n      true\n    )\n  );\n}\nfunction createBlock(type, props, children, patchFlag, dynamicProps) {\n  return setupBlock(\n    createVNode(\n      type,\n      props,\n      children,\n      patchFlag,\n      dynamicProps,\n      true\n    )\n  );\n}\nfunction isVNode(value) {\n  return value ? value.__v_isVNode === true : false;\n}\nfunction isSameVNodeType(n1, n2) {\n  if (!!(process.env.NODE_ENV !== \"production\") && n2.shapeFlag & 6 && hmrDirtyComponents.has(n2.type)) {\n    n1.shapeFlag &= ~256;\n    n2.shapeFlag &= ~512;\n    return false;\n  }\n  return n1.type === n2.type && n1.key === n2.key;\n}\nlet vnodeArgsTransformer;\nfunction transformVNodeArgs(transformer) {\n  vnodeArgsTransformer = transformer;\n}\nconst createVNodeWithArgsTransform = (...args) => {\n  return _createVNode(\n    ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args\n  );\n};\nconst normalizeKey = ({ key }) => key != null ? key : null;\nconst normalizeRef = ({\n  ref,\n  ref_key,\n  ref_for\n}) => {\n  if (typeof ref === \"number\") {\n    ref = \"\" + ref;\n  }\n  return ref != null ? isString(ref) || isRef(ref) || isFunction(ref) ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for } : ref : null;\n};\nfunction createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {\n  const vnode = {\n    __v_isVNode: true,\n    __v_skip: true,\n    type,\n    props,\n    key: props && normalizeKey(props),\n    ref: props && normalizeRef(props),\n    scopeId: currentScopeId,\n    slotScopeIds: null,\n    children,\n    component: null,\n    suspense: null,\n    ssContent: null,\n    ssFallback: null,\n    dirs: null,\n    transition: null,\n    el: null,\n    anchor: null,\n    target: null,\n    targetAnchor: null,\n    staticCount: 0,\n    shapeFlag,\n    patchFlag,\n    dynamicProps,\n    dynamicChildren: null,\n    appContext: null,\n    ctx: currentRenderingInstance\n  };\n  if (needFullChildrenNormalization) {\n    normalizeChildren(vnode, children);\n    if (shapeFlag & 128) {\n      type.normalize(vnode);\n    }\n  } else if (children) {\n    vnode.shapeFlag |= isString(children) ? 8 : 16;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && vnode.key !== vnode.key) {\n    warn$1(`VNode created with invalid key (NaN). VNode type:`, vnode.type);\n  }\n  if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself\n  !isBlockNode && // has current parent block\n  currentBlock && // presence of a patch flag indicates this node needs patching on updates.\n  // component nodes also should always be patched, because even if the\n  // component doesn't need to update, it needs to persist the instance on to\n  // the next vnode so that it can be properly unmounted later.\n  (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the\n  // vnode should not be considered dynamic due to handler caching.\n  vnode.patchFlag !== 32) {\n    currentBlock.push(vnode);\n  }\n  return vnode;\n}\nconst createVNode = !!(process.env.NODE_ENV !== \"production\") ? createVNodeWithArgsTransform : _createVNode;\nfunction _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {\n  if (!type || type === NULL_DYNAMIC_COMPONENT) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !type) {\n      warn$1(`Invalid vnode type when creating vnode: ${type}.`);\n    }\n    type = Comment;\n  }\n  if (isVNode(type)) {\n    const cloned = cloneVNode(\n      type,\n      props,\n      true\n      /* mergeRef: true */\n    );\n    if (children) {\n      normalizeChildren(cloned, children);\n    }\n    if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {\n      if (cloned.shapeFlag & 6) {\n        currentBlock[currentBlock.indexOf(type)] = cloned;\n      } else {\n        currentBlock.push(cloned);\n      }\n    }\n    cloned.patchFlag |= -2;\n    return cloned;\n  }\n  if (isClassComponent(type)) {\n    type = type.__vccOpts;\n  }\n  if (props) {\n    props = guardReactiveProps(props);\n    let { class: klass, style } = props;\n    if (klass && !isString(klass)) {\n      props.class = normalizeClass(klass);\n    }\n    if (isObject(style)) {\n      if (isProxy(style) && !isArray(style)) {\n        style = extend({}, style);\n      }\n      props.style = normalizeStyle(style);\n    }\n  }\n  const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;\n  if (!!(process.env.NODE_ENV !== \"production\") && shapeFlag & 4 && isProxy(type)) {\n    type = toRaw(type);\n    warn$1(\n      `Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with \\`markRaw\\` or using \\`shallowRef\\` instead of \\`ref\\`.`,\n      `\nComponent that was made reactive: `,\n      type\n    );\n  }\n  return createBaseVNode(\n    type,\n    props,\n    children,\n    patchFlag,\n    dynamicProps,\n    shapeFlag,\n    isBlockNode,\n    true\n  );\n}\nfunction guardReactiveProps(props) {\n  if (!props)\n    return null;\n  return isProxy(props) || isInternalObject(props) ? extend({}, props) : props;\n}\nfunction cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) {\n  const { props, ref, patchFlag, children, transition } = vnode;\n  const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;\n  const cloned = {\n    __v_isVNode: true,\n    __v_skip: true,\n    type: vnode.type,\n    props: mergedProps,\n    key: mergedProps && normalizeKey(mergedProps),\n    ref: extraProps && extraProps.ref ? (\n      // #2078 in the case of <component :is=\"vnode\" ref=\"extra\"/>\n      // if the vnode itself already has a ref, cloneVNode will need to merge\n      // the refs so the single vnode can be set on multiple refs\n      mergeRef && ref ? isArray(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps)\n    ) : ref,\n    scopeId: vnode.scopeId,\n    slotScopeIds: vnode.slotScopeIds,\n    children: !!(process.env.NODE_ENV !== \"production\") && patchFlag === -1 && isArray(children) ? children.map(deepCloneVNode) : children,\n    target: vnode.target,\n    targetAnchor: vnode.targetAnchor,\n    staticCount: vnode.staticCount,\n    shapeFlag: vnode.shapeFlag,\n    // if the vnode is cloned with extra props, we can no longer assume its\n    // existing patch flag to be reliable and need to add the FULL_PROPS flag.\n    // note: preserve flag for fragments since they use the flag for children\n    // fast paths only.\n    patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,\n    dynamicProps: vnode.dynamicProps,\n    dynamicChildren: vnode.dynamicChildren,\n    appContext: vnode.appContext,\n    dirs: vnode.dirs,\n    transition,\n    // These should technically only be non-null on mounted VNodes. However,\n    // they *should* be copied for kept-alive vnodes. So we just always copy\n    // them since them being non-null during a mount doesn't affect the logic as\n    // they will simply be overwritten.\n    component: vnode.component,\n    suspense: vnode.suspense,\n    ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),\n    ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),\n    el: vnode.el,\n    anchor: vnode.anchor,\n    ctx: vnode.ctx,\n    ce: vnode.ce\n  };\n  if (transition && cloneTransition) {\n    cloned.transition = transition.clone(cloned);\n  }\n  return cloned;\n}\nfunction deepCloneVNode(vnode) {\n  const cloned = cloneVNode(vnode);\n  if (isArray(vnode.children)) {\n    cloned.children = vnode.children.map(deepCloneVNode);\n  }\n  return cloned;\n}\nfunction createTextVNode(text = \" \", flag = 0) {\n  return createVNode(Text, null, text, flag);\n}\nfunction createStaticVNode(content, numberOfNodes) {\n  const vnode = createVNode(Static, null, content);\n  vnode.staticCount = numberOfNodes;\n  return vnode;\n}\nfunction createCommentVNode(text = \"\", asBlock = false) {\n  return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);\n}\nfunction normalizeVNode(child) {\n  if (child == null || typeof child === \"boolean\") {\n    return createVNode(Comment);\n  } else if (isArray(child)) {\n    return createVNode(\n      Fragment,\n      null,\n      // #3666, avoid reference pollution when reusing vnode\n      child.slice()\n    );\n  } else if (typeof child === \"object\") {\n    return cloneIfMounted(child);\n  } else {\n    return createVNode(Text, null, String(child));\n  }\n}\nfunction cloneIfMounted(child) {\n  return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);\n}\nfunction normalizeChildren(vnode, children) {\n  let type = 0;\n  const { shapeFlag } = vnode;\n  if (children == null) {\n    children = null;\n  } else if (isArray(children)) {\n    type = 16;\n  } else if (typeof children === \"object\") {\n    if (shapeFlag & (1 | 64)) {\n      const slot = children.default;\n      if (slot) {\n        slot._c && (slot._d = false);\n        normalizeChildren(vnode, slot());\n        slot._c && (slot._d = true);\n      }\n      return;\n    } else {\n      type = 32;\n      const slotFlag = children._;\n      if (!slotFlag && !isInternalObject(children)) {\n        children._ctx = currentRenderingInstance;\n      } else if (slotFlag === 3 && currentRenderingInstance) {\n        if (currentRenderingInstance.slots._ === 1) {\n          children._ = 1;\n        } else {\n          children._ = 2;\n          vnode.patchFlag |= 1024;\n        }\n      }\n    }\n  } else if (isFunction(children)) {\n    children = { default: children, _ctx: currentRenderingInstance };\n    type = 32;\n  } else {\n    children = String(children);\n    if (shapeFlag & 64) {\n      type = 16;\n      children = [createTextVNode(children)];\n    } else {\n      type = 8;\n    }\n  }\n  vnode.children = children;\n  vnode.shapeFlag |= type;\n}\nfunction mergeProps(...args) {\n  const ret = {};\n  for (let i = 0; i < args.length; i++) {\n    const toMerge = args[i];\n    for (const key in toMerge) {\n      if (key === \"class\") {\n        if (ret.class !== toMerge.class) {\n          ret.class = normalizeClass([ret.class, toMerge.class]);\n        }\n      } else if (key === \"style\") {\n        ret.style = normalizeStyle([ret.style, toMerge.style]);\n      } else if (isOn(key)) {\n        const existing = ret[key];\n        const incoming = toMerge[key];\n        if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) {\n          ret[key] = existing ? [].concat(existing, incoming) : incoming;\n        }\n      } else if (key !== \"\") {\n        ret[key] = toMerge[key];\n      }\n    }\n  }\n  return ret;\n}\nfunction invokeVNodeHook(hook, instance, vnode, prevVNode = null) {\n  callWithAsyncErrorHandling(hook, instance, 7, [\n    vnode,\n    prevVNode\n  ]);\n}\n\nconst emptyAppContext = createAppContext();\nlet uid = 0;\nfunction createComponentInstance(vnode, parent, suspense) {\n  const type = vnode.type;\n  const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;\n  const instance = {\n    uid: uid++,\n    vnode,\n    type,\n    parent,\n    appContext,\n    root: null,\n    // to be immediately set\n    next: null,\n    subTree: null,\n    // will be set synchronously right after creation\n    effect: null,\n    update: null,\n    // will be set synchronously right after creation\n    scope: new EffectScope(\n      true\n      /* detached */\n    ),\n    render: null,\n    proxy: null,\n    exposed: null,\n    exposeProxy: null,\n    withProxy: null,\n    provides: parent ? parent.provides : Object.create(appContext.provides),\n    accessCache: null,\n    renderCache: [],\n    // local resolved assets\n    components: null,\n    directives: null,\n    // resolved props and emits options\n    propsOptions: normalizePropsOptions(type, appContext),\n    emitsOptions: normalizeEmitsOptions(type, appContext),\n    // emit\n    emit: null,\n    // to be set immediately\n    emitted: null,\n    // props default value\n    propsDefaults: EMPTY_OBJ,\n    // inheritAttrs\n    inheritAttrs: type.inheritAttrs,\n    // state\n    ctx: EMPTY_OBJ,\n    data: EMPTY_OBJ,\n    props: EMPTY_OBJ,\n    attrs: EMPTY_OBJ,\n    slots: EMPTY_OBJ,\n    refs: EMPTY_OBJ,\n    setupState: EMPTY_OBJ,\n    setupContext: null,\n    attrsProxy: null,\n    slotsProxy: null,\n    // suspense related\n    suspense,\n    suspenseId: suspense ? suspense.pendingId : 0,\n    asyncDep: null,\n    asyncResolved: false,\n    // lifecycle hooks\n    // not using enums here because it results in computed properties\n    isMounted: false,\n    isUnmounted: false,\n    isDeactivated: false,\n    bc: null,\n    c: null,\n    bm: null,\n    m: null,\n    bu: null,\n    u: null,\n    um: null,\n    bum: null,\n    da: null,\n    a: null,\n    rtg: null,\n    rtc: null,\n    ec: null,\n    sp: null\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    instance.ctx = createDevRenderContext(instance);\n  } else {\n    instance.ctx = { _: instance };\n  }\n  instance.root = parent ? parent.root : instance;\n  instance.emit = emit.bind(null, instance);\n  if (vnode.ce) {\n    vnode.ce(instance);\n  }\n  return instance;\n}\nlet currentInstance = null;\nconst getCurrentInstance = () => currentInstance || currentRenderingInstance;\nlet internalSetCurrentInstance;\nlet setInSSRSetupState;\n{\n  const g = getGlobalThis();\n  const registerGlobalSetter = (key, setter) => {\n    let setters;\n    if (!(setters = g[key]))\n      setters = g[key] = [];\n    setters.push(setter);\n    return (v) => {\n      if (setters.length > 1)\n        setters.forEach((set) => set(v));\n      else\n        setters[0](v);\n    };\n  };\n  internalSetCurrentInstance = registerGlobalSetter(\n    `__VUE_INSTANCE_SETTERS__`,\n    (v) => currentInstance = v\n  );\n  setInSSRSetupState = registerGlobalSetter(\n    `__VUE_SSR_SETTERS__`,\n    (v) => isInSSRComponentSetup = v\n  );\n}\nconst setCurrentInstance = (instance) => {\n  const prev = currentInstance;\n  internalSetCurrentInstance(instance);\n  instance.scope.on();\n  return () => {\n    instance.scope.off();\n    internalSetCurrentInstance(prev);\n  };\n};\nconst unsetCurrentInstance = () => {\n  currentInstance && currentInstance.scope.off();\n  internalSetCurrentInstance(null);\n};\nconst isBuiltInTag = /* @__PURE__ */ makeMap(\"slot,component\");\nfunction validateComponentName(name, { isNativeTag }) {\n  if (isBuiltInTag(name) || isNativeTag(name)) {\n    warn$1(\n      \"Do not use built-in or reserved HTML elements as component id: \" + name\n    );\n  }\n}\nfunction isStatefulComponent(instance) {\n  return instance.vnode.shapeFlag & 4;\n}\nlet isInSSRComponentSetup = false;\nfunction setupComponent(instance, isSSR = false) {\n  isSSR && setInSSRSetupState(isSSR);\n  const { props, children } = instance.vnode;\n  const isStateful = isStatefulComponent(instance);\n  initProps(instance, props, isStateful, isSSR);\n  initSlots(instance, children);\n  const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;\n  isSSR && setInSSRSetupState(false);\n  return setupResult;\n}\nfunction setupStatefulComponent(instance, isSSR) {\n  var _a;\n  const Component = instance.type;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    if (Component.name) {\n      validateComponentName(Component.name, instance.appContext.config);\n    }\n    if (Component.components) {\n      const names = Object.keys(Component.components);\n      for (let i = 0; i < names.length; i++) {\n        validateComponentName(names[i], instance.appContext.config);\n      }\n    }\n    if (Component.directives) {\n      const names = Object.keys(Component.directives);\n      for (let i = 0; i < names.length; i++) {\n        validateDirectiveName(names[i]);\n      }\n    }\n    if (Component.compilerOptions && isRuntimeOnly()) {\n      warn$1(\n        `\"compilerOptions\" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`\n      );\n    }\n  }\n  instance.accessCache = /* @__PURE__ */ Object.create(null);\n  instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    exposePropsOnRenderContext(instance);\n  }\n  const { setup } = Component;\n  if (setup) {\n    const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;\n    const reset = setCurrentInstance(instance);\n    pauseTracking();\n    const setupResult = callWithErrorHandling(\n      setup,\n      instance,\n      0,\n      [\n        !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(instance.props) : instance.props,\n        setupContext\n      ]\n    );\n    resetTracking();\n    reset();\n    if (isPromise(setupResult)) {\n      setupResult.then(unsetCurrentInstance, unsetCurrentInstance);\n      if (isSSR) {\n        return setupResult.then((resolvedResult) => {\n          handleSetupResult(instance, resolvedResult, isSSR);\n        }).catch((e) => {\n          handleError(e, instance, 0);\n        });\n      } else {\n        instance.asyncDep = setupResult;\n        if (!!(process.env.NODE_ENV !== \"production\") && !instance.suspense) {\n          const name = (_a = Component.name) != null ? _a : \"Anonymous\";\n          warn$1(\n            `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`\n          );\n        }\n      }\n    } else {\n      handleSetupResult(instance, setupResult, isSSR);\n    }\n  } else {\n    finishComponentSetup(instance, isSSR);\n  }\n}\nfunction handleSetupResult(instance, setupResult, isSSR) {\n  if (isFunction(setupResult)) {\n    if (instance.type.__ssrInlineRender) {\n      instance.ssrRender = setupResult;\n    } else {\n      instance.render = setupResult;\n    }\n  } else if (isObject(setupResult)) {\n    if (!!(process.env.NODE_ENV !== \"production\") && isVNode(setupResult)) {\n      warn$1(\n        `setup() should not return VNodes directly - return a render function instead.`\n      );\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      instance.devtoolsRawSetupState = setupResult;\n    }\n    instance.setupState = proxyRefs(setupResult);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      exposeSetupStateOnRenderContext(instance);\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\") && setupResult !== void 0) {\n    warn$1(\n      `setup() should return an object. Received: ${setupResult === null ? \"null\" : typeof setupResult}`\n    );\n  }\n  finishComponentSetup(instance, isSSR);\n}\nlet compile;\nlet installWithProxy;\nfunction registerRuntimeCompiler(_compile) {\n  compile = _compile;\n  installWithProxy = (i) => {\n    if (i.render._rc) {\n      i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);\n    }\n  };\n}\nconst isRuntimeOnly = () => !compile;\nfunction finishComponentSetup(instance, isSSR, skipOptions) {\n  const Component = instance.type;\n  if (!instance.render) {\n    if (!isSSR && compile && !Component.render) {\n      const template = Component.template || resolveMergedOptions(instance).template;\n      if (template) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `compile`);\n        }\n        const { isCustomElement, compilerOptions } = instance.appContext.config;\n        const { delimiters, compilerOptions: componentCompilerOptions } = Component;\n        const finalCompilerOptions = extend(\n          extend(\n            {\n              isCustomElement,\n              delimiters\n            },\n            compilerOptions\n          ),\n          componentCompilerOptions\n        );\n        Component.render = compile(template, finalCompilerOptions);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `compile`);\n        }\n      }\n    }\n    instance.render = Component.render || NOOP;\n    if (installWithProxy) {\n      installWithProxy(instance);\n    }\n  }\n  if (__VUE_OPTIONS_API__ && true) {\n    const reset = setCurrentInstance(instance);\n    pauseTracking();\n    try {\n      applyOptions(instance);\n    } finally {\n      resetTracking();\n      reset();\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && !Component.render && instance.render === NOOP && !isSSR) {\n    if (!compile && Component.template) {\n      warn$1(\n        `Component provided template option but runtime compilation is not supported in this build of Vue.` + (` Configure your bundler to alias \"vue\" to \"vue/dist/vue.esm-bundler.js\".` )\n      );\n    } else {\n      warn$1(`Component is missing template or render function.`);\n    }\n  }\n}\nconst attrsProxyHandlers = !!(process.env.NODE_ENV !== \"production\") ? {\n  get(target, key) {\n    markAttrsAccessed();\n    track(target, \"get\", \"\");\n    return target[key];\n  },\n  set() {\n    warn$1(`setupContext.attrs is readonly.`);\n    return false;\n  },\n  deleteProperty() {\n    warn$1(`setupContext.attrs is readonly.`);\n    return false;\n  }\n} : {\n  get(target, key) {\n    track(target, \"get\", \"\");\n    return target[key];\n  }\n};\nfunction getSlotsProxy(instance) {\n  return instance.slotsProxy || (instance.slotsProxy = new Proxy(instance.slots, {\n    get(target, key) {\n      track(instance, \"get\", \"$slots\");\n      return target[key];\n    }\n  }));\n}\nfunction createSetupContext(instance) {\n  const expose = (exposed) => {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (instance.exposed) {\n        warn$1(`expose() should be called only once per setup().`);\n      }\n      if (exposed != null) {\n        let exposedType = typeof exposed;\n        if (exposedType === \"object\") {\n          if (isArray(exposed)) {\n            exposedType = \"array\";\n          } else if (isRef(exposed)) {\n            exposedType = \"ref\";\n          }\n        }\n        if (exposedType !== \"object\") {\n          warn$1(\n            `expose() should be passed a plain object, received ${exposedType}.`\n          );\n        }\n      }\n    }\n    instance.exposed = exposed || {};\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    let attrsProxy;\n    return Object.freeze({\n      get attrs() {\n        return attrsProxy || (attrsProxy = new Proxy(instance.attrs, attrsProxyHandlers));\n      },\n      get slots() {\n        return getSlotsProxy(instance);\n      },\n      get emit() {\n        return (event, ...args) => instance.emit(event, ...args);\n      },\n      expose\n    });\n  } else {\n    return {\n      attrs: new Proxy(instance.attrs, attrsProxyHandlers),\n      slots: instance.slots,\n      emit: instance.emit,\n      expose\n    };\n  }\n}\nfunction getExposeProxy(instance) {\n  if (instance.exposed) {\n    return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {\n      get(target, key) {\n        if (key in target) {\n          return target[key];\n        } else if (key in publicPropertiesMap) {\n          return publicPropertiesMap[key](instance);\n        }\n      },\n      has(target, key) {\n        return key in target || key in publicPropertiesMap;\n      }\n    }));\n  }\n}\nconst classifyRE = /(?:^|[-_])(\\w)/g;\nconst classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, \"\");\nfunction getComponentName(Component, includeInferred = true) {\n  return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;\n}\nfunction formatComponentName(instance, Component, isRoot = false) {\n  let name = getComponentName(Component);\n  if (!name && Component.__file) {\n    const match = Component.__file.match(/([^/\\\\]+)\\.\\w+$/);\n    if (match) {\n      name = match[1];\n    }\n  }\n  if (!name && instance && instance.parent) {\n    const inferFromRegistry = (registry) => {\n      for (const key in registry) {\n        if (registry[key] === Component) {\n          return key;\n        }\n      }\n    };\n    name = inferFromRegistry(\n      instance.components || instance.parent.type.components\n    ) || inferFromRegistry(instance.appContext.components);\n  }\n  return name ? classify(name) : isRoot ? `App` : `Anonymous`;\n}\nfunction isClassComponent(value) {\n  return isFunction(value) && \"__vccOpts\" in value;\n}\n\nconst computed = (getterOrOptions, debugOptions) => {\n  const c = computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const i = getCurrentInstance();\n    if (i && i.appContext.config.warnRecursiveComputed) {\n      c._warnRecursive = true;\n    }\n  }\n  return c;\n};\n\nfunction useModel(props, name, options = EMPTY_OBJ) {\n  const i = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n    warn$1(`useModel() called without active instance.`);\n    return ref();\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && !i.propsOptions[0][name]) {\n    warn$1(`useModel() called with prop \"${name}\" which is not declared.`);\n    return ref();\n  }\n  const camelizedName = camelize(name);\n  const hyphenatedName = hyphenate(name);\n  const res = customRef((track, trigger) => {\n    let localValue;\n    watchSyncEffect(() => {\n      const propValue = props[name];\n      if (hasChanged(localValue, propValue)) {\n        localValue = propValue;\n        trigger();\n      }\n    });\n    return {\n      get() {\n        track();\n        return options.get ? options.get(localValue) : localValue;\n      },\n      set(value) {\n        const rawProps = i.vnode.props;\n        if (!(rawProps && // check if parent has passed v-model\n        (name in rawProps || camelizedName in rawProps || hyphenatedName in rawProps) && (`onUpdate:${name}` in rawProps || `onUpdate:${camelizedName}` in rawProps || `onUpdate:${hyphenatedName}` in rawProps)) && hasChanged(value, localValue)) {\n          localValue = value;\n          trigger();\n        }\n        i.emit(`update:${name}`, options.set ? options.set(value) : value);\n      }\n    };\n  });\n  const modifierKey = name === \"modelValue\" ? \"modelModifiers\" : `${name}Modifiers`;\n  res[Symbol.iterator] = () => {\n    let i2 = 0;\n    return {\n      next() {\n        if (i2 < 2) {\n          return { value: i2++ ? props[modifierKey] || {} : res, done: false };\n        } else {\n          return { done: true };\n        }\n      }\n    };\n  };\n  return res;\n}\n\nfunction h(type, propsOrChildren, children) {\n  const l = arguments.length;\n  if (l === 2) {\n    if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {\n      if (isVNode(propsOrChildren)) {\n        return createVNode(type, null, [propsOrChildren]);\n      }\n      return createVNode(type, propsOrChildren);\n    } else {\n      return createVNode(type, null, propsOrChildren);\n    }\n  } else {\n    if (l > 3) {\n      children = Array.prototype.slice.call(arguments, 2);\n    } else if (l === 3 && isVNode(children)) {\n      children = [children];\n    }\n    return createVNode(type, propsOrChildren, children);\n  }\n}\n\nfunction initCustomFormatter() {\n  if (!!!(process.env.NODE_ENV !== \"production\") || typeof window === \"undefined\") {\n    return;\n  }\n  const vueStyle = { style: \"color:#3ba776\" };\n  const numberStyle = { style: \"color:#1677ff\" };\n  const stringStyle = { style: \"color:#f5222d\" };\n  const keywordStyle = { style: \"color:#eb2f96\" };\n  const formatter = {\n    header(obj) {\n      if (!isObject(obj)) {\n        return null;\n      }\n      if (obj.__isVue) {\n        return [\"div\", vueStyle, `VueInstance`];\n      } else if (isRef(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, genRefFlag(obj)],\n          \"<\",\n          formatValue(obj.value),\n          `>`\n        ];\n      } else if (isReactive(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, isShallow(obj) ? \"ShallowReactive\" : \"Reactive\"],\n          \"<\",\n          formatValue(obj),\n          `>${isReadonly(obj) ? ` (readonly)` : ``}`\n        ];\n      } else if (isReadonly(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, isShallow(obj) ? \"ShallowReadonly\" : \"Readonly\"],\n          \"<\",\n          formatValue(obj),\n          \">\"\n        ];\n      }\n      return null;\n    },\n    hasBody(obj) {\n      return obj && obj.__isVue;\n    },\n    body(obj) {\n      if (obj && obj.__isVue) {\n        return [\n          \"div\",\n          {},\n          ...formatInstance(obj.$)\n        ];\n      }\n    }\n  };\n  function formatInstance(instance) {\n    const blocks = [];\n    if (instance.type.props && instance.props) {\n      blocks.push(createInstanceBlock(\"props\", toRaw(instance.props)));\n    }\n    if (instance.setupState !== EMPTY_OBJ) {\n      blocks.push(createInstanceBlock(\"setup\", instance.setupState));\n    }\n    if (instance.data !== EMPTY_OBJ) {\n      blocks.push(createInstanceBlock(\"data\", toRaw(instance.data)));\n    }\n    const computed = extractKeys(instance, \"computed\");\n    if (computed) {\n      blocks.push(createInstanceBlock(\"computed\", computed));\n    }\n    const injected = extractKeys(instance, \"inject\");\n    if (injected) {\n      blocks.push(createInstanceBlock(\"injected\", injected));\n    }\n    blocks.push([\n      \"div\",\n      {},\n      [\n        \"span\",\n        {\n          style: keywordStyle.style + \";opacity:0.66\"\n        },\n        \"$ (internal): \"\n      ],\n      [\"object\", { object: instance }]\n    ]);\n    return blocks;\n  }\n  function createInstanceBlock(type, target) {\n    target = extend({}, target);\n    if (!Object.keys(target).length) {\n      return [\"span\", {}];\n    }\n    return [\n      \"div\",\n      { style: \"line-height:1.25em;margin-bottom:0.6em\" },\n      [\n        \"div\",\n        {\n          style: \"color:#476582\"\n        },\n        type\n      ],\n      [\n        \"div\",\n        {\n          style: \"padding-left:1.25em\"\n        },\n        ...Object.keys(target).map((key) => {\n          return [\n            \"div\",\n            {},\n            [\"span\", keywordStyle, key + \": \"],\n            formatValue(target[key], false)\n          ];\n        })\n      ]\n    ];\n  }\n  function formatValue(v, asRaw = true) {\n    if (typeof v === \"number\") {\n      return [\"span\", numberStyle, v];\n    } else if (typeof v === \"string\") {\n      return [\"span\", stringStyle, JSON.stringify(v)];\n    } else if (typeof v === \"boolean\") {\n      return [\"span\", keywordStyle, v];\n    } else if (isObject(v)) {\n      return [\"object\", { object: asRaw ? toRaw(v) : v }];\n    } else {\n      return [\"span\", stringStyle, String(v)];\n    }\n  }\n  function extractKeys(instance, type) {\n    const Comp = instance.type;\n    if (isFunction(Comp)) {\n      return;\n    }\n    const extracted = {};\n    for (const key in instance.ctx) {\n      if (isKeyOfType(Comp, key, type)) {\n        extracted[key] = instance.ctx[key];\n      }\n    }\n    return extracted;\n  }\n  function isKeyOfType(Comp, key, type) {\n    const opts = Comp[type];\n    if (isArray(opts) && opts.includes(key) || isObject(opts) && key in opts) {\n      return true;\n    }\n    if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {\n      return true;\n    }\n    if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) {\n      return true;\n    }\n  }\n  function genRefFlag(v) {\n    if (isShallow(v)) {\n      return `ShallowRef`;\n    }\n    if (v.effect) {\n      return `ComputedRef`;\n    }\n    return `Ref`;\n  }\n  if (window.devtoolsFormatters) {\n    window.devtoolsFormatters.push(formatter);\n  } else {\n    window.devtoolsFormatters = [formatter];\n  }\n}\n\nfunction withMemo(memo, render, cache, index) {\n  const cached = cache[index];\n  if (cached && isMemoSame(cached, memo)) {\n    return cached;\n  }\n  const ret = render();\n  ret.memo = memo.slice();\n  return cache[index] = ret;\n}\nfunction isMemoSame(cached, memo) {\n  const prev = cached.memo;\n  if (prev.length != memo.length) {\n    return false;\n  }\n  for (let i = 0; i < prev.length; i++) {\n    if (hasChanged(prev[i], memo[i])) {\n      return false;\n    }\n  }\n  if (isBlockTreeEnabled > 0 && currentBlock) {\n    currentBlock.push(cached);\n  }\n  return true;\n}\n\nconst version = \"3.4.27\";\nconst warn = !!(process.env.NODE_ENV !== \"production\") ? warn$1 : NOOP;\nconst ErrorTypeStrings = ErrorTypeStrings$1 ;\nconst devtools = !!(process.env.NODE_ENV !== \"production\") || true ? devtools$1 : void 0;\nconst setDevtoolsHook = !!(process.env.NODE_ENV !== \"production\") || true ? setDevtoolsHook$1 : NOOP;\nconst _ssrUtils = {\n  createComponentInstance,\n  setupComponent,\n  renderComponentRoot,\n  setCurrentRenderingInstance,\n  isVNode: isVNode,\n  normalizeVNode\n};\nconst ssrUtils = _ssrUtils ;\nconst resolveFilter = null;\nconst compatUtils = null;\nconst DeprecationTypes = null;\n\nexport { BaseTransition, BaseTransitionPropsValidators, Comment, DeprecationTypes, ErrorCodes, ErrorTypeStrings, Fragment, KeepAlive, Static, Suspense, Teleport, Text, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, cloneVNode, compatUtils, computed, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSlots, devtools, getCurrentInstance, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, initCustomFormatter, inject, isMemoSame, isRuntimeOnly, isVNode, mergeDefaults, mergeModels, mergeProps, nextTick, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onServerPrefetch, onUnmounted, onUpdated, openBlock, popScopeId, provide, pushScopeId, queuePostFlushCb, registerRuntimeCompiler, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, ssrContextKey, ssrUtils, toHandlers, transformVNodeArgs, useAttrs, useModel, useSSRContext, useSlots, useTransitionState, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withMemo, withScopeId };\n","/**\n* @vue/runtime-dom v3.4.27\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { h, BaseTransition, BaseTransitionPropsValidators, assertNumber, getCurrentInstance, warn, onMounted, watchPostEffect, onUnmounted, Fragment, Static, camelize, callWithAsyncErrorHandling, defineComponent, nextTick, createVNode, useTransitionState, onUpdated, toRaw, getTransitionRawChildren, setTransitionHooks, resolveTransitionHooks, isRuntimeOnly, createRenderer, createHydrationRenderer } from '@vue/runtime-core';\nexport * from '@vue/runtime-core';\nimport { extend, isObject, toNumber, isArray, isString, hyphenate, capitalize, isSpecialBooleanAttr, includeBooleanAttr, isFunction, NOOP, isOn, isModelListener, camelize as camelize$1, EMPTY_OBJ, looseToNumber, looseIndexOf, isSet, looseEqual, invokeArrayFns, isHTMLTag, isSVGTag, isMathMLTag } from '@vue/shared';\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\nconst mathmlNS = \"http://www.w3.org/1998/Math/MathML\";\nconst doc = typeof document !== \"undefined\" ? document : null;\nconst templateContainer = doc && /* @__PURE__ */ doc.createElement(\"template\");\nconst nodeOps = {\n  insert: (child, parent, anchor) => {\n    parent.insertBefore(child, anchor || null);\n  },\n  remove: (child) => {\n    const parent = child.parentNode;\n    if (parent) {\n      parent.removeChild(child);\n    }\n  },\n  createElement: (tag, namespace, is, props) => {\n    const el = namespace === \"svg\" ? doc.createElementNS(svgNS, tag) : namespace === \"mathml\" ? doc.createElementNS(mathmlNS, tag) : doc.createElement(tag, is ? { is } : void 0);\n    if (tag === \"select\" && props && props.multiple != null) {\n      el.setAttribute(\"multiple\", props.multiple);\n    }\n    return el;\n  },\n  createText: (text) => doc.createTextNode(text),\n  createComment: (text) => doc.createComment(text),\n  setText: (node, text) => {\n    node.nodeValue = text;\n  },\n  setElementText: (el, text) => {\n    el.textContent = text;\n  },\n  parentNode: (node) => node.parentNode,\n  nextSibling: (node) => node.nextSibling,\n  querySelector: (selector) => doc.querySelector(selector),\n  setScopeId(el, id) {\n    el.setAttribute(id, \"\");\n  },\n  // __UNSAFE__\n  // Reason: innerHTML.\n  // Static content here can only come from compiled templates.\n  // As long as the user only uses trusted templates, this is safe.\n  insertStaticContent(content, parent, anchor, namespace, start, end) {\n    const before = anchor ? anchor.previousSibling : parent.lastChild;\n    if (start && (start === end || start.nextSibling)) {\n      while (true) {\n        parent.insertBefore(start.cloneNode(true), anchor);\n        if (start === end || !(start = start.nextSibling))\n          break;\n      }\n    } else {\n      templateContainer.innerHTML = namespace === \"svg\" ? `<svg>${content}</svg>` : namespace === \"mathml\" ? `<math>${content}</math>` : content;\n      const template = templateContainer.content;\n      if (namespace === \"svg\" || namespace === \"mathml\") {\n        const wrapper = template.firstChild;\n        while (wrapper.firstChild) {\n          template.appendChild(wrapper.firstChild);\n        }\n        template.removeChild(wrapper);\n      }\n      parent.insertBefore(template, anchor);\n    }\n    return [\n      // first\n      before ? before.nextSibling : parent.firstChild,\n      // last\n      anchor ? anchor.previousSibling : parent.lastChild\n    ];\n  }\n};\n\nconst TRANSITION = \"transition\";\nconst ANIMATION = \"animation\";\nconst vtcKey = Symbol(\"_vtc\");\nconst Transition = (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots);\nTransition.displayName = \"Transition\";\nconst DOMTransitionPropsValidators = {\n  name: String,\n  type: String,\n  css: {\n    type: Boolean,\n    default: true\n  },\n  duration: [String, Number, Object],\n  enterFromClass: String,\n  enterActiveClass: String,\n  enterToClass: String,\n  appearFromClass: String,\n  appearActiveClass: String,\n  appearToClass: String,\n  leaveFromClass: String,\n  leaveActiveClass: String,\n  leaveToClass: String\n};\nconst TransitionPropsValidators = Transition.props = /* @__PURE__ */ extend(\n  {},\n  BaseTransitionPropsValidators,\n  DOMTransitionPropsValidators\n);\nconst callHook = (hook, args = []) => {\n  if (isArray(hook)) {\n    hook.forEach((h2) => h2(...args));\n  } else if (hook) {\n    hook(...args);\n  }\n};\nconst hasExplicitCallback = (hook) => {\n  return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;\n};\nfunction resolveTransitionProps(rawProps) {\n  const baseProps = {};\n  for (const key in rawProps) {\n    if (!(key in DOMTransitionPropsValidators)) {\n      baseProps[key] = rawProps[key];\n    }\n  }\n  if (rawProps.css === false) {\n    return baseProps;\n  }\n  const {\n    name = \"v\",\n    type,\n    duration,\n    enterFromClass = `${name}-enter-from`,\n    enterActiveClass = `${name}-enter-active`,\n    enterToClass = `${name}-enter-to`,\n    appearFromClass = enterFromClass,\n    appearActiveClass = enterActiveClass,\n    appearToClass = enterToClass,\n    leaveFromClass = `${name}-leave-from`,\n    leaveActiveClass = `${name}-leave-active`,\n    leaveToClass = `${name}-leave-to`\n  } = rawProps;\n  const durations = normalizeDuration(duration);\n  const enterDuration = durations && durations[0];\n  const leaveDuration = durations && durations[1];\n  const {\n    onBeforeEnter,\n    onEnter,\n    onEnterCancelled,\n    onLeave,\n    onLeaveCancelled,\n    onBeforeAppear = onBeforeEnter,\n    onAppear = onEnter,\n    onAppearCancelled = onEnterCancelled\n  } = baseProps;\n  const finishEnter = (el, isAppear, done) => {\n    removeTransitionClass(el, isAppear ? appearToClass : enterToClass);\n    removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);\n    done && done();\n  };\n  const finishLeave = (el, done) => {\n    el._isLeaving = false;\n    removeTransitionClass(el, leaveFromClass);\n    removeTransitionClass(el, leaveToClass);\n    removeTransitionClass(el, leaveActiveClass);\n    done && done();\n  };\n  const makeEnterHook = (isAppear) => {\n    return (el, done) => {\n      const hook = isAppear ? onAppear : onEnter;\n      const resolve = () => finishEnter(el, isAppear, done);\n      callHook(hook, [el, resolve]);\n      nextFrame(() => {\n        removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);\n        addTransitionClass(el, isAppear ? appearToClass : enterToClass);\n        if (!hasExplicitCallback(hook)) {\n          whenTransitionEnds(el, type, enterDuration, resolve);\n        }\n      });\n    };\n  };\n  return extend(baseProps, {\n    onBeforeEnter(el) {\n      callHook(onBeforeEnter, [el]);\n      addTransitionClass(el, enterFromClass);\n      addTransitionClass(el, enterActiveClass);\n    },\n    onBeforeAppear(el) {\n      callHook(onBeforeAppear, [el]);\n      addTransitionClass(el, appearFromClass);\n      addTransitionClass(el, appearActiveClass);\n    },\n    onEnter: makeEnterHook(false),\n    onAppear: makeEnterHook(true),\n    onLeave(el, done) {\n      el._isLeaving = true;\n      const resolve = () => finishLeave(el, done);\n      addTransitionClass(el, leaveFromClass);\n      addTransitionClass(el, leaveActiveClass);\n      forceReflow();\n      nextFrame(() => {\n        if (!el._isLeaving) {\n          return;\n        }\n        removeTransitionClass(el, leaveFromClass);\n        addTransitionClass(el, leaveToClass);\n        if (!hasExplicitCallback(onLeave)) {\n          whenTransitionEnds(el, type, leaveDuration, resolve);\n        }\n      });\n      callHook(onLeave, [el, resolve]);\n    },\n    onEnterCancelled(el) {\n      finishEnter(el, false);\n      callHook(onEnterCancelled, [el]);\n    },\n    onAppearCancelled(el) {\n      finishEnter(el, true);\n      callHook(onAppearCancelled, [el]);\n    },\n    onLeaveCancelled(el) {\n      finishLeave(el);\n      callHook(onLeaveCancelled, [el]);\n    }\n  });\n}\nfunction normalizeDuration(duration) {\n  if (duration == null) {\n    return null;\n  } else if (isObject(duration)) {\n    return [NumberOf(duration.enter), NumberOf(duration.leave)];\n  } else {\n    const n = NumberOf(duration);\n    return [n, n];\n  }\n}\nfunction NumberOf(val) {\n  const res = toNumber(val);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    assertNumber(res, \"<transition> explicit duration\");\n  }\n  return res;\n}\nfunction addTransitionClass(el, cls) {\n  cls.split(/\\s+/).forEach((c) => c && el.classList.add(c));\n  (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls);\n}\nfunction removeTransitionClass(el, cls) {\n  cls.split(/\\s+/).forEach((c) => c && el.classList.remove(c));\n  const _vtc = el[vtcKey];\n  if (_vtc) {\n    _vtc.delete(cls);\n    if (!_vtc.size) {\n      el[vtcKey] = void 0;\n    }\n  }\n}\nfunction nextFrame(cb) {\n  requestAnimationFrame(() => {\n    requestAnimationFrame(cb);\n  });\n}\nlet endId = 0;\nfunction whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {\n  const id = el._endId = ++endId;\n  const resolveIfNotStale = () => {\n    if (id === el._endId) {\n      resolve();\n    }\n  };\n  if (explicitTimeout) {\n    return setTimeout(resolveIfNotStale, explicitTimeout);\n  }\n  const { type, timeout, propCount } = getTransitionInfo(el, expectedType);\n  if (!type) {\n    return resolve();\n  }\n  const endEvent = type + \"end\";\n  let ended = 0;\n  const end = () => {\n    el.removeEventListener(endEvent, onEnd);\n    resolveIfNotStale();\n  };\n  const onEnd = (e) => {\n    if (e.target === el && ++ended >= propCount) {\n      end();\n    }\n  };\n  setTimeout(() => {\n    if (ended < propCount) {\n      end();\n    }\n  }, timeout + 1);\n  el.addEventListener(endEvent, onEnd);\n}\nfunction getTransitionInfo(el, expectedType) {\n  const styles = window.getComputedStyle(el);\n  const getStyleProperties = (key) => (styles[key] || \"\").split(\", \");\n  const transitionDelays = getStyleProperties(`${TRANSITION}Delay`);\n  const transitionDurations = getStyleProperties(`${TRANSITION}Duration`);\n  const transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n  const animationDelays = getStyleProperties(`${ANIMATION}Delay`);\n  const animationDurations = getStyleProperties(`${ANIMATION}Duration`);\n  const animationTimeout = getTimeout(animationDelays, animationDurations);\n  let type = null;\n  let timeout = 0;\n  let propCount = 0;\n  if (expectedType === TRANSITION) {\n    if (transitionTimeout > 0) {\n      type = TRANSITION;\n      timeout = transitionTimeout;\n      propCount = transitionDurations.length;\n    }\n  } else if (expectedType === ANIMATION) {\n    if (animationTimeout > 0) {\n      type = ANIMATION;\n      timeout = animationTimeout;\n      propCount = animationDurations.length;\n    }\n  } else {\n    timeout = Math.max(transitionTimeout, animationTimeout);\n    type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null;\n    propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0;\n  }\n  const hasTransform = type === TRANSITION && /\\b(transform|all)(,|$)/.test(\n    getStyleProperties(`${TRANSITION}Property`).toString()\n  );\n  return {\n    type,\n    timeout,\n    propCount,\n    hasTransform\n  };\n}\nfunction getTimeout(delays, durations) {\n  while (delays.length < durations.length) {\n    delays = delays.concat(delays);\n  }\n  return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));\n}\nfunction toMs(s) {\n  if (s === \"auto\")\n    return 0;\n  return Number(s.slice(0, -1).replace(\",\", \".\")) * 1e3;\n}\nfunction forceReflow() {\n  return document.body.offsetHeight;\n}\n\nfunction patchClass(el, value, isSVG) {\n  const transitionClasses = el[vtcKey];\n  if (transitionClasses) {\n    value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(\" \");\n  }\n  if (value == null) {\n    el.removeAttribute(\"class\");\n  } else if (isSVG) {\n    el.setAttribute(\"class\", value);\n  } else {\n    el.className = value;\n  }\n}\n\nconst vShowOriginalDisplay = Symbol(\"_vod\");\nconst vShowHidden = Symbol(\"_vsh\");\nconst vShow = {\n  beforeMount(el, { value }, { transition }) {\n    el[vShowOriginalDisplay] = el.style.display === \"none\" ? \"\" : el.style.display;\n    if (transition && value) {\n      transition.beforeEnter(el);\n    } else {\n      setDisplay(el, value);\n    }\n  },\n  mounted(el, { value }, { transition }) {\n    if (transition && value) {\n      transition.enter(el);\n    }\n  },\n  updated(el, { value, oldValue }, { transition }) {\n    if (!value === !oldValue)\n      return;\n    if (transition) {\n      if (value) {\n        transition.beforeEnter(el);\n        setDisplay(el, true);\n        transition.enter(el);\n      } else {\n        transition.leave(el, () => {\n          setDisplay(el, false);\n        });\n      }\n    } else {\n      setDisplay(el, value);\n    }\n  },\n  beforeUnmount(el, { value }) {\n    setDisplay(el, value);\n  }\n};\nif (!!(process.env.NODE_ENV !== \"production\")) {\n  vShow.name = \"show\";\n}\nfunction setDisplay(el, value) {\n  el.style.display = value ? el[vShowOriginalDisplay] : \"none\";\n  el[vShowHidden] = !value;\n}\nfunction initVShowForSSR() {\n  vShow.getSSRProps = ({ value }) => {\n    if (!value) {\n      return { style: { display: \"none\" } };\n    }\n  };\n}\n\nconst CSS_VAR_TEXT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"CSS_VAR_TEXT\" : \"\");\nfunction useCssVars(getter) {\n  const instance = getCurrentInstance();\n  if (!instance) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(`useCssVars is called without current active component instance.`);\n    return;\n  }\n  const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => {\n    Array.from(\n      document.querySelectorAll(`[data-v-owner=\"${instance.uid}\"]`)\n    ).forEach((node) => setVarsOnNode(node, vars));\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    instance.getCssVars = () => getter(instance.proxy);\n  }\n  const setVars = () => {\n    const vars = getter(instance.proxy);\n    setVarsOnVNode(instance.subTree, vars);\n    updateTeleports(vars);\n  };\n  onMounted(() => {\n    watchPostEffect(setVars);\n    const ob = new MutationObserver(setVars);\n    ob.observe(instance.subTree.el.parentNode, { childList: true });\n    onUnmounted(() => ob.disconnect());\n  });\n}\nfunction setVarsOnVNode(vnode, vars) {\n  if (vnode.shapeFlag & 128) {\n    const suspense = vnode.suspense;\n    vnode = suspense.activeBranch;\n    if (suspense.pendingBranch && !suspense.isHydrating) {\n      suspense.effects.push(() => {\n        setVarsOnVNode(suspense.activeBranch, vars);\n      });\n    }\n  }\n  while (vnode.component) {\n    vnode = vnode.component.subTree;\n  }\n  if (vnode.shapeFlag & 1 && vnode.el) {\n    setVarsOnNode(vnode.el, vars);\n  } else if (vnode.type === Fragment) {\n    vnode.children.forEach((c) => setVarsOnVNode(c, vars));\n  } else if (vnode.type === Static) {\n    let { el, anchor } = vnode;\n    while (el) {\n      setVarsOnNode(el, vars);\n      if (el === anchor)\n        break;\n      el = el.nextSibling;\n    }\n  }\n}\nfunction setVarsOnNode(el, vars) {\n  if (el.nodeType === 1) {\n    const style = el.style;\n    let cssText = \"\";\n    for (const key in vars) {\n      style.setProperty(`--${key}`, vars[key]);\n      cssText += `--${key}: ${vars[key]};`;\n    }\n    style[CSS_VAR_TEXT] = cssText;\n  }\n}\n\nconst displayRE = /(^|;)\\s*display\\s*:/;\nfunction patchStyle(el, prev, next) {\n  const style = el.style;\n  const isCssString = isString(next);\n  let hasControlledDisplay = false;\n  if (next && !isCssString) {\n    if (prev) {\n      if (!isString(prev)) {\n        for (const key in prev) {\n          if (next[key] == null) {\n            setStyle(style, key, \"\");\n          }\n        }\n      } else {\n        for (const prevStyle of prev.split(\";\")) {\n          const key = prevStyle.slice(0, prevStyle.indexOf(\":\")).trim();\n          if (next[key] == null) {\n            setStyle(style, key, \"\");\n          }\n        }\n      }\n    }\n    for (const key in next) {\n      if (key === \"display\") {\n        hasControlledDisplay = true;\n      }\n      setStyle(style, key, next[key]);\n    }\n  } else {\n    if (isCssString) {\n      if (prev !== next) {\n        const cssVarText = style[CSS_VAR_TEXT];\n        if (cssVarText) {\n          next += \";\" + cssVarText;\n        }\n        style.cssText = next;\n        hasControlledDisplay = displayRE.test(next);\n      }\n    } else if (prev) {\n      el.removeAttribute(\"style\");\n    }\n  }\n  if (vShowOriginalDisplay in el) {\n    el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : \"\";\n    if (el[vShowHidden]) {\n      style.display = \"none\";\n    }\n  }\n}\nconst semicolonRE = /[^\\\\];\\s*$/;\nconst importantRE = /\\s*!important$/;\nfunction setStyle(style, name, val) {\n  if (isArray(val)) {\n    val.forEach((v) => setStyle(style, name, v));\n  } else {\n    if (val == null)\n      val = \"\";\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (semicolonRE.test(val)) {\n        warn(\n          `Unexpected semicolon at the end of '${name}' style value: '${val}'`\n        );\n      }\n    }\n    if (name.startsWith(\"--\")) {\n      style.setProperty(name, val);\n    } else {\n      const prefixed = autoPrefix(style, name);\n      if (importantRE.test(val)) {\n        style.setProperty(\n          hyphenate(prefixed),\n          val.replace(importantRE, \"\"),\n          \"important\"\n        );\n      } else {\n        style[prefixed] = val;\n      }\n    }\n  }\n}\nconst prefixes = [\"Webkit\", \"Moz\", \"ms\"];\nconst prefixCache = {};\nfunction autoPrefix(style, rawName) {\n  const cached = prefixCache[rawName];\n  if (cached) {\n    return cached;\n  }\n  let name = camelize(rawName);\n  if (name !== \"filter\" && name in style) {\n    return prefixCache[rawName] = name;\n  }\n  name = capitalize(name);\n  for (let i = 0; i < prefixes.length; i++) {\n    const prefixed = prefixes[i] + name;\n    if (prefixed in style) {\n      return prefixCache[rawName] = prefixed;\n    }\n  }\n  return rawName;\n}\n\nconst xlinkNS = \"http://www.w3.org/1999/xlink\";\nfunction patchAttr(el, key, value, isSVG, instance) {\n  if (isSVG && key.startsWith(\"xlink:\")) {\n    if (value == null) {\n      el.removeAttributeNS(xlinkNS, key.slice(6, key.length));\n    } else {\n      el.setAttributeNS(xlinkNS, key, value);\n    }\n  } else {\n    const isBoolean = isSpecialBooleanAttr(key);\n    if (value == null || isBoolean && !includeBooleanAttr(value)) {\n      el.removeAttribute(key);\n    } else {\n      el.setAttribute(key, isBoolean ? \"\" : value);\n    }\n  }\n}\n\nfunction patchDOMProp(el, key, value, prevChildren, parentComponent, parentSuspense, unmountChildren) {\n  if (key === \"innerHTML\" || key === \"textContent\") {\n    if (prevChildren) {\n      unmountChildren(prevChildren, parentComponent, parentSuspense);\n    }\n    el[key] = value == null ? \"\" : value;\n    return;\n  }\n  const tag = el.tagName;\n  if (key === \"value\" && tag !== \"PROGRESS\" && // custom elements may use _value internally\n  !tag.includes(\"-\")) {\n    const oldValue = tag === \"OPTION\" ? el.getAttribute(\"value\") || \"\" : el.value;\n    const newValue = value == null ? \"\" : value;\n    if (oldValue !== newValue || !(\"_value\" in el)) {\n      el.value = newValue;\n    }\n    if (value == null) {\n      el.removeAttribute(key);\n    }\n    el._value = value;\n    return;\n  }\n  let needRemove = false;\n  if (value === \"\" || value == null) {\n    const type = typeof el[key];\n    if (type === \"boolean\") {\n      value = includeBooleanAttr(value);\n    } else if (value == null && type === \"string\") {\n      value = \"\";\n      needRemove = true;\n    } else if (type === \"number\") {\n      value = 0;\n      needRemove = true;\n    }\n  }\n  try {\n    el[key] = value;\n  } catch (e) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !needRemove) {\n      warn(\n        `Failed setting prop \"${key}\" on <${tag.toLowerCase()}>: value ${value} is invalid.`,\n        e\n      );\n    }\n  }\n  needRemove && el.removeAttribute(key);\n}\n\nfunction addEventListener(el, event, handler, options) {\n  el.addEventListener(event, handler, options);\n}\nfunction removeEventListener(el, event, handler, options) {\n  el.removeEventListener(event, handler, options);\n}\nconst veiKey = Symbol(\"_vei\");\nfunction patchEvent(el, rawName, prevValue, nextValue, instance = null) {\n  const invokers = el[veiKey] || (el[veiKey] = {});\n  const existingInvoker = invokers[rawName];\n  if (nextValue && existingInvoker) {\n    existingInvoker.value = !!(process.env.NODE_ENV !== \"production\") ? sanitizeEventValue(nextValue, rawName) : nextValue;\n  } else {\n    const [name, options] = parseName(rawName);\n    if (nextValue) {\n      const invoker = invokers[rawName] = createInvoker(\n        !!(process.env.NODE_ENV !== \"production\") ? sanitizeEventValue(nextValue, rawName) : nextValue,\n        instance\n      );\n      addEventListener(el, name, invoker, options);\n    } else if (existingInvoker) {\n      removeEventListener(el, name, existingInvoker, options);\n      invokers[rawName] = void 0;\n    }\n  }\n}\nconst optionsModifierRE = /(?:Once|Passive|Capture)$/;\nfunction parseName(name) {\n  let options;\n  if (optionsModifierRE.test(name)) {\n    options = {};\n    let m;\n    while (m = name.match(optionsModifierRE)) {\n      name = name.slice(0, name.length - m[0].length);\n      options[m[0].toLowerCase()] = true;\n    }\n  }\n  const event = name[2] === \":\" ? name.slice(3) : hyphenate(name.slice(2));\n  return [event, options];\n}\nlet cachedNow = 0;\nconst p = /* @__PURE__ */ Promise.resolve();\nconst getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());\nfunction createInvoker(initialValue, instance) {\n  const invoker = (e) => {\n    if (!e._vts) {\n      e._vts = Date.now();\n    } else if (e._vts <= invoker.attached) {\n      return;\n    }\n    callWithAsyncErrorHandling(\n      patchStopImmediatePropagation(e, invoker.value),\n      instance,\n      5,\n      [e]\n    );\n  };\n  invoker.value = initialValue;\n  invoker.attached = getNow();\n  return invoker;\n}\nfunction sanitizeEventValue(value, propName) {\n  if (isFunction(value) || isArray(value)) {\n    return value;\n  }\n  warn(\n    `Wrong type passed as event handler to ${propName} - did you forget @ or : in front of your prop?\nExpected function or array of functions, received type ${typeof value}.`\n  );\n  return NOOP;\n}\nfunction patchStopImmediatePropagation(e, value) {\n  if (isArray(value)) {\n    const originalStop = e.stopImmediatePropagation;\n    e.stopImmediatePropagation = () => {\n      originalStop.call(e);\n      e._stopped = true;\n    };\n    return value.map(\n      (fn) => (e2) => !e2._stopped && fn && fn(e2)\n    );\n  } else {\n    return value;\n  }\n}\n\nconst isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // lowercase letter\nkey.charCodeAt(2) > 96 && key.charCodeAt(2) < 123;\nconst patchProp = (el, key, prevValue, nextValue, namespace, prevChildren, parentComponent, parentSuspense, unmountChildren) => {\n  const isSVG = namespace === \"svg\";\n  if (key === \"class\") {\n    patchClass(el, nextValue, isSVG);\n  } else if (key === \"style\") {\n    patchStyle(el, prevValue, nextValue);\n  } else if (isOn(key)) {\n    if (!isModelListener(key)) {\n      patchEvent(el, key, prevValue, nextValue, parentComponent);\n    }\n  } else if (key[0] === \".\" ? (key = key.slice(1), true) : key[0] === \"^\" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {\n    patchDOMProp(\n      el,\n      key,\n      nextValue,\n      prevChildren,\n      parentComponent,\n      parentSuspense,\n      unmountChildren\n    );\n  } else {\n    if (key === \"true-value\") {\n      el._trueValue = nextValue;\n    } else if (key === \"false-value\") {\n      el._falseValue = nextValue;\n    }\n    patchAttr(el, key, nextValue, isSVG);\n  }\n};\nfunction shouldSetAsProp(el, key, value, isSVG) {\n  if (isSVG) {\n    if (key === \"innerHTML\" || key === \"textContent\") {\n      return true;\n    }\n    if (key in el && isNativeOn(key) && isFunction(value)) {\n      return true;\n    }\n    return false;\n  }\n  if (key === \"spellcheck\" || key === \"draggable\" || key === \"translate\") {\n    return false;\n  }\n  if (key === \"form\") {\n    return false;\n  }\n  if (key === \"list\" && el.tagName === \"INPUT\") {\n    return false;\n  }\n  if (key === \"type\" && el.tagName === \"TEXTAREA\") {\n    return false;\n  }\n  if (key === \"width\" || key === \"height\") {\n    const tag = el.tagName;\n    if (tag === \"IMG\" || tag === \"VIDEO\" || tag === \"CANVAS\" || tag === \"SOURCE\") {\n      return false;\n    }\n  }\n  if (isNativeOn(key) && isString(value)) {\n    return false;\n  }\n  return key in el;\n}\n\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineCustomElement(options, hydrate2) {\n  const Comp = defineComponent(options);\n  class VueCustomElement extends VueElement {\n    constructor(initialProps) {\n      super(Comp, initialProps, hydrate2);\n    }\n  }\n  VueCustomElement.def = Comp;\n  return VueCustomElement;\n}\n/*! #__NO_SIDE_EFFECTS__ */\nconst defineSSRCustomElement = /* @__NO_SIDE_EFFECTS__ */ (options) => {\n  return /* @__PURE__ */ defineCustomElement(options, hydrate);\n};\nconst BaseClass = typeof HTMLElement !== \"undefined\" ? HTMLElement : class {\n};\nclass VueElement extends BaseClass {\n  constructor(_def, _props = {}, hydrate2) {\n    super();\n    this._def = _def;\n    this._props = _props;\n    /**\n     * @internal\n     */\n    this._instance = null;\n    this._connected = false;\n    this._resolved = false;\n    this._numberProps = null;\n    this._ob = null;\n    if (this.shadowRoot && hydrate2) {\n      hydrate2(this._createVNode(), this.shadowRoot);\n    } else {\n      if (!!(process.env.NODE_ENV !== \"production\") && this.shadowRoot) {\n        warn(\n          `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \\`defineSSRCustomElement\\`.`\n        );\n      }\n      this.attachShadow({ mode: \"open\" });\n      if (!this._def.__asyncLoader) {\n        this._resolveProps(this._def);\n      }\n    }\n  }\n  connectedCallback() {\n    this._connected = true;\n    if (!this._instance) {\n      if (this._resolved) {\n        this._update();\n      } else {\n        this._resolveDef();\n      }\n    }\n  }\n  disconnectedCallback() {\n    this._connected = false;\n    if (this._ob) {\n      this._ob.disconnect();\n      this._ob = null;\n    }\n    nextTick(() => {\n      if (!this._connected) {\n        render(null, this.shadowRoot);\n        this._instance = null;\n      }\n    });\n  }\n  /**\n   * resolve inner component definition (handle possible async component)\n   */\n  _resolveDef() {\n    this._resolved = true;\n    for (let i = 0; i < this.attributes.length; i++) {\n      this._setAttr(this.attributes[i].name);\n    }\n    this._ob = new MutationObserver((mutations) => {\n      for (const m of mutations) {\n        this._setAttr(m.attributeName);\n      }\n    });\n    this._ob.observe(this, { attributes: true });\n    const resolve = (def, isAsync = false) => {\n      const { props, styles } = def;\n      let numberProps;\n      if (props && !isArray(props)) {\n        for (const key in props) {\n          const opt = props[key];\n          if (opt === Number || opt && opt.type === Number) {\n            if (key in this._props) {\n              this._props[key] = toNumber(this._props[key]);\n            }\n            (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[camelize$1(key)] = true;\n          }\n        }\n      }\n      this._numberProps = numberProps;\n      if (isAsync) {\n        this._resolveProps(def);\n      }\n      this._applyStyles(styles);\n      this._update();\n    };\n    const asyncDef = this._def.__asyncLoader;\n    if (asyncDef) {\n      asyncDef().then((def) => resolve(def, true));\n    } else {\n      resolve(this._def);\n    }\n  }\n  _resolveProps(def) {\n    const { props } = def;\n    const declaredPropKeys = isArray(props) ? props : Object.keys(props || {});\n    for (const key of Object.keys(this)) {\n      if (key[0] !== \"_\" && declaredPropKeys.includes(key)) {\n        this._setProp(key, this[key], true, false);\n      }\n    }\n    for (const key of declaredPropKeys.map(camelize$1)) {\n      Object.defineProperty(this, key, {\n        get() {\n          return this._getProp(key);\n        },\n        set(val) {\n          this._setProp(key, val);\n        }\n      });\n    }\n  }\n  _setAttr(key) {\n    let value = this.hasAttribute(key) ? this.getAttribute(key) : void 0;\n    const camelKey = camelize$1(key);\n    if (this._numberProps && this._numberProps[camelKey]) {\n      value = toNumber(value);\n    }\n    this._setProp(camelKey, value, false);\n  }\n  /**\n   * @internal\n   */\n  _getProp(key) {\n    return this._props[key];\n  }\n  /**\n   * @internal\n   */\n  _setProp(key, val, shouldReflect = true, shouldUpdate = true) {\n    if (val !== this._props[key]) {\n      this._props[key] = val;\n      if (shouldUpdate && this._instance) {\n        this._update();\n      }\n      if (shouldReflect) {\n        if (val === true) {\n          this.setAttribute(hyphenate(key), \"\");\n        } else if (typeof val === \"string\" || typeof val === \"number\") {\n          this.setAttribute(hyphenate(key), val + \"\");\n        } else if (!val) {\n          this.removeAttribute(hyphenate(key));\n        }\n      }\n    }\n  }\n  _update() {\n    render(this._createVNode(), this.shadowRoot);\n  }\n  _createVNode() {\n    const vnode = createVNode(this._def, extend({}, this._props));\n    if (!this._instance) {\n      vnode.ce = (instance) => {\n        this._instance = instance;\n        instance.isCE = true;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          instance.ceReload = (newStyles) => {\n            if (this._styles) {\n              this._styles.forEach((s) => this.shadowRoot.removeChild(s));\n              this._styles.length = 0;\n            }\n            this._applyStyles(newStyles);\n            this._instance = null;\n            this._update();\n          };\n        }\n        const dispatch = (event, args) => {\n          this.dispatchEvent(\n            new CustomEvent(event, {\n              detail: args\n            })\n          );\n        };\n        instance.emit = (event, ...args) => {\n          dispatch(event, args);\n          if (hyphenate(event) !== event) {\n            dispatch(hyphenate(event), args);\n          }\n        };\n        let parent = this;\n        while (parent = parent && (parent.parentNode || parent.host)) {\n          if (parent instanceof VueElement) {\n            instance.parent = parent._instance;\n            instance.provides = parent._instance.provides;\n            break;\n          }\n        }\n      };\n    }\n    return vnode;\n  }\n  _applyStyles(styles) {\n    if (styles) {\n      styles.forEach((css) => {\n        const s = document.createElement(\"style\");\n        s.textContent = css;\n        this.shadowRoot.appendChild(s);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          (this._styles || (this._styles = [])).push(s);\n        }\n      });\n    }\n  }\n}\n\nfunction useCssModule(name = \"$style\") {\n  {\n    const instance = getCurrentInstance();\n    if (!instance) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`useCssModule must be called inside setup()`);\n      return EMPTY_OBJ;\n    }\n    const modules = instance.type.__cssModules;\n    if (!modules) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS modules injected.`);\n      return EMPTY_OBJ;\n    }\n    const mod = modules[name];\n    if (!mod) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS module named \"${name}\".`);\n      return EMPTY_OBJ;\n    }\n    return mod;\n  }\n}\n\nconst positionMap = /* @__PURE__ */ new WeakMap();\nconst newPositionMap = /* @__PURE__ */ new WeakMap();\nconst moveCbKey = Symbol(\"_moveCb\");\nconst enterCbKey = Symbol(\"_enterCb\");\nconst TransitionGroupImpl = {\n  name: \"TransitionGroup\",\n  props: /* @__PURE__ */ extend({}, TransitionPropsValidators, {\n    tag: String,\n    moveClass: String\n  }),\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const state = useTransitionState();\n    let prevChildren;\n    let children;\n    onUpdated(() => {\n      if (!prevChildren.length) {\n        return;\n      }\n      const moveClass = props.moveClass || `${props.name || \"v\"}-move`;\n      if (!hasCSSTransform(\n        prevChildren[0].el,\n        instance.vnode.el,\n        moveClass\n      )) {\n        return;\n      }\n      prevChildren.forEach(callPendingCbs);\n      prevChildren.forEach(recordPosition);\n      const movedChildren = prevChildren.filter(applyTranslation);\n      forceReflow();\n      movedChildren.forEach((c) => {\n        const el = c.el;\n        const style = el.style;\n        addTransitionClass(el, moveClass);\n        style.transform = style.webkitTransform = style.transitionDuration = \"\";\n        const cb = el[moveCbKey] = (e) => {\n          if (e && e.target !== el) {\n            return;\n          }\n          if (!e || /transform$/.test(e.propertyName)) {\n            el.removeEventListener(\"transitionend\", cb);\n            el[moveCbKey] = null;\n            removeTransitionClass(el, moveClass);\n          }\n        };\n        el.addEventListener(\"transitionend\", cb);\n      });\n    });\n    return () => {\n      const rawProps = toRaw(props);\n      const cssTransitionProps = resolveTransitionProps(rawProps);\n      let tag = rawProps.tag || Fragment;\n      prevChildren = [];\n      if (children) {\n        for (let i = 0; i < children.length; i++) {\n          const child = children[i];\n          if (child.el && child.el instanceof Element) {\n            prevChildren.push(child);\n            setTransitionHooks(\n              child,\n              resolveTransitionHooks(\n                child,\n                cssTransitionProps,\n                state,\n                instance\n              )\n            );\n            positionMap.set(\n              child,\n              child.el.getBoundingClientRect()\n            );\n          }\n        }\n      }\n      children = slots.default ? getTransitionRawChildren(slots.default()) : [];\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        if (child.key != null) {\n          setTransitionHooks(\n            child,\n            resolveTransitionHooks(child, cssTransitionProps, state, instance)\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn(`<TransitionGroup> children must be keyed.`);\n        }\n      }\n      return createVNode(tag, null, children);\n    };\n  }\n};\nconst removeMode = (props) => delete props.mode;\n/* @__PURE__ */ removeMode(TransitionGroupImpl.props);\nconst TransitionGroup = TransitionGroupImpl;\nfunction callPendingCbs(c) {\n  const el = c.el;\n  if (el[moveCbKey]) {\n    el[moveCbKey]();\n  }\n  if (el[enterCbKey]) {\n    el[enterCbKey]();\n  }\n}\nfunction recordPosition(c) {\n  newPositionMap.set(c, c.el.getBoundingClientRect());\n}\nfunction applyTranslation(c) {\n  const oldPos = positionMap.get(c);\n  const newPos = newPositionMap.get(c);\n  const dx = oldPos.left - newPos.left;\n  const dy = oldPos.top - newPos.top;\n  if (dx || dy) {\n    const s = c.el.style;\n    s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;\n    s.transitionDuration = \"0s\";\n    return c;\n  }\n}\nfunction hasCSSTransform(el, root, moveClass) {\n  const clone = el.cloneNode();\n  const _vtc = el[vtcKey];\n  if (_vtc) {\n    _vtc.forEach((cls) => {\n      cls.split(/\\s+/).forEach((c) => c && clone.classList.remove(c));\n    });\n  }\n  moveClass.split(/\\s+/).forEach((c) => c && clone.classList.add(c));\n  clone.style.display = \"none\";\n  const container = root.nodeType === 1 ? root : root.parentNode;\n  container.appendChild(clone);\n  const { hasTransform } = getTransitionInfo(clone);\n  container.removeChild(clone);\n  return hasTransform;\n}\n\nconst getModelAssigner = (vnode) => {\n  const fn = vnode.props[\"onUpdate:modelValue\"] || false;\n  return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn;\n};\nfunction onCompositionStart(e) {\n  e.target.composing = true;\n}\nfunction onCompositionEnd(e) {\n  const target = e.target;\n  if (target.composing) {\n    target.composing = false;\n    target.dispatchEvent(new Event(\"input\"));\n  }\n}\nconst assignKey = Symbol(\"_assign\");\nconst vModelText = {\n  created(el, { modifiers: { lazy, trim, number } }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    const castToNumber = number || vnode.props && vnode.props.type === \"number\";\n    addEventListener(el, lazy ? \"change\" : \"input\", (e) => {\n      if (e.target.composing)\n        return;\n      let domValue = el.value;\n      if (trim) {\n        domValue = domValue.trim();\n      }\n      if (castToNumber) {\n        domValue = looseToNumber(domValue);\n      }\n      el[assignKey](domValue);\n    });\n    if (trim) {\n      addEventListener(el, \"change\", () => {\n        el.value = el.value.trim();\n      });\n    }\n    if (!lazy) {\n      addEventListener(el, \"compositionstart\", onCompositionStart);\n      addEventListener(el, \"compositionend\", onCompositionEnd);\n      addEventListener(el, \"change\", onCompositionEnd);\n    }\n  },\n  // set value on mounted so it's after min/max for type=\"range\"\n  mounted(el, { value }) {\n    el.value = value == null ? \"\" : value;\n  },\n  beforeUpdate(el, { value, modifiers: { lazy, trim, number } }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    if (el.composing)\n      return;\n    const elValue = (number || el.type === \"number\") && !/^0\\d/.test(el.value) ? looseToNumber(el.value) : el.value;\n    const newValue = value == null ? \"\" : value;\n    if (elValue === newValue) {\n      return;\n    }\n    if (document.activeElement === el && el.type !== \"range\") {\n      if (lazy) {\n        return;\n      }\n      if (trim && el.value.trim() === newValue) {\n        return;\n      }\n    }\n    el.value = newValue;\n  }\n};\nconst vModelCheckbox = {\n  // #4096 array checkboxes need to be deep traversed\n  deep: true,\n  created(el, _, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    addEventListener(el, \"change\", () => {\n      const modelValue = el._modelValue;\n      const elementValue = getValue(el);\n      const checked = el.checked;\n      const assign = el[assignKey];\n      if (isArray(modelValue)) {\n        const index = looseIndexOf(modelValue, elementValue);\n        const found = index !== -1;\n        if (checked && !found) {\n          assign(modelValue.concat(elementValue));\n        } else if (!checked && found) {\n          const filtered = [...modelValue];\n          filtered.splice(index, 1);\n          assign(filtered);\n        }\n      } else if (isSet(modelValue)) {\n        const cloned = new Set(modelValue);\n        if (checked) {\n          cloned.add(elementValue);\n        } else {\n          cloned.delete(elementValue);\n        }\n        assign(cloned);\n      } else {\n        assign(getCheckboxValue(el, checked));\n      }\n    });\n  },\n  // set initial checked on mount to wait for true-value/false-value\n  mounted: setChecked,\n  beforeUpdate(el, binding, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    setChecked(el, binding, vnode);\n  }\n};\nfunction setChecked(el, { value, oldValue }, vnode) {\n  el._modelValue = value;\n  if (isArray(value)) {\n    el.checked = looseIndexOf(value, vnode.props.value) > -1;\n  } else if (isSet(value)) {\n    el.checked = value.has(vnode.props.value);\n  } else if (value !== oldValue) {\n    el.checked = looseEqual(value, getCheckboxValue(el, true));\n  }\n}\nconst vModelRadio = {\n  created(el, { value }, vnode) {\n    el.checked = looseEqual(value, vnode.props.value);\n    el[assignKey] = getModelAssigner(vnode);\n    addEventListener(el, \"change\", () => {\n      el[assignKey](getValue(el));\n    });\n  },\n  beforeUpdate(el, { value, oldValue }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    if (value !== oldValue) {\n      el.checked = looseEqual(value, vnode.props.value);\n    }\n  }\n};\nconst vModelSelect = {\n  // <select multiple> value need to be deep traversed\n  deep: true,\n  created(el, { value, modifiers: { number } }, vnode) {\n    const isSetModel = isSet(value);\n    addEventListener(el, \"change\", () => {\n      const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(\n        (o) => number ? looseToNumber(getValue(o)) : getValue(o)\n      );\n      el[assignKey](\n        el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]\n      );\n      el._assigning = true;\n      nextTick(() => {\n        el._assigning = false;\n      });\n    });\n    el[assignKey] = getModelAssigner(vnode);\n  },\n  // set value in mounted & updated because <select> relies on its children\n  // <option>s.\n  mounted(el, { value, modifiers: { number } }) {\n    setSelected(el, value);\n  },\n  beforeUpdate(el, _binding, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n  },\n  updated(el, { value, modifiers: { number } }) {\n    if (!el._assigning) {\n      setSelected(el, value);\n    }\n  }\n};\nfunction setSelected(el, value, number) {\n  const isMultiple = el.multiple;\n  const isArrayValue = isArray(value);\n  if (isMultiple && !isArrayValue && !isSet(value)) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(\n      `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`\n    );\n    return;\n  }\n  for (let i = 0, l = el.options.length; i < l; i++) {\n    const option = el.options[i];\n    const optionValue = getValue(option);\n    if (isMultiple) {\n      if (isArrayValue) {\n        const optionType = typeof optionValue;\n        if (optionType === \"string\" || optionType === \"number\") {\n          option.selected = value.some((v) => String(v) === String(optionValue));\n        } else {\n          option.selected = looseIndexOf(value, optionValue) > -1;\n        }\n      } else {\n        option.selected = value.has(optionValue);\n      }\n    } else if (looseEqual(getValue(option), value)) {\n      if (el.selectedIndex !== i)\n        el.selectedIndex = i;\n      return;\n    }\n  }\n  if (!isMultiple && el.selectedIndex !== -1) {\n    el.selectedIndex = -1;\n  }\n}\nfunction getValue(el) {\n  return \"_value\" in el ? el._value : el.value;\n}\nfunction getCheckboxValue(el, checked) {\n  const key = checked ? \"_trueValue\" : \"_falseValue\";\n  return key in el ? el[key] : checked;\n}\nconst vModelDynamic = {\n  created(el, binding, vnode) {\n    callModelHook(el, binding, vnode, null, \"created\");\n  },\n  mounted(el, binding, vnode) {\n    callModelHook(el, binding, vnode, null, \"mounted\");\n  },\n  beforeUpdate(el, binding, vnode, prevVNode) {\n    callModelHook(el, binding, vnode, prevVNode, \"beforeUpdate\");\n  },\n  updated(el, binding, vnode, prevVNode) {\n    callModelHook(el, binding, vnode, prevVNode, \"updated\");\n  }\n};\nfunction resolveDynamicModel(tagName, type) {\n  switch (tagName) {\n    case \"SELECT\":\n      return vModelSelect;\n    case \"TEXTAREA\":\n      return vModelText;\n    default:\n      switch (type) {\n        case \"checkbox\":\n          return vModelCheckbox;\n        case \"radio\":\n          return vModelRadio;\n        default:\n          return vModelText;\n      }\n  }\n}\nfunction callModelHook(el, binding, vnode, prevVNode, hook) {\n  const modelToUse = resolveDynamicModel(\n    el.tagName,\n    vnode.props && vnode.props.type\n  );\n  const fn = modelToUse[hook];\n  fn && fn(el, binding, vnode, prevVNode);\n}\nfunction initVModelForSSR() {\n  vModelText.getSSRProps = ({ value }) => ({ value });\n  vModelRadio.getSSRProps = ({ value }, vnode) => {\n    if (vnode.props && looseEqual(vnode.props.value, value)) {\n      return { checked: true };\n    }\n  };\n  vModelCheckbox.getSSRProps = ({ value }, vnode) => {\n    if (isArray(value)) {\n      if (vnode.props && looseIndexOf(value, vnode.props.value) > -1) {\n        return { checked: true };\n      }\n    } else if (isSet(value)) {\n      if (vnode.props && value.has(vnode.props.value)) {\n        return { checked: true };\n      }\n    } else if (value) {\n      return { checked: true };\n    }\n  };\n  vModelDynamic.getSSRProps = (binding, vnode) => {\n    if (typeof vnode.type !== \"string\") {\n      return;\n    }\n    const modelToUse = resolveDynamicModel(\n      // resolveDynamicModel expects an uppercase tag name, but vnode.type is lowercase\n      vnode.type.toUpperCase(),\n      vnode.props && vnode.props.type\n    );\n    if (modelToUse.getSSRProps) {\n      return modelToUse.getSSRProps(binding, vnode);\n    }\n  };\n}\n\nconst systemModifiers = [\"ctrl\", \"shift\", \"alt\", \"meta\"];\nconst modifierGuards = {\n  stop: (e) => e.stopPropagation(),\n  prevent: (e) => e.preventDefault(),\n  self: (e) => e.target !== e.currentTarget,\n  ctrl: (e) => !e.ctrlKey,\n  shift: (e) => !e.shiftKey,\n  alt: (e) => !e.altKey,\n  meta: (e) => !e.metaKey,\n  left: (e) => \"button\" in e && e.button !== 0,\n  middle: (e) => \"button\" in e && e.button !== 1,\n  right: (e) => \"button\" in e && e.button !== 2,\n  exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))\n};\nconst withModifiers = (fn, modifiers) => {\n  const cache = fn._withMods || (fn._withMods = {});\n  const cacheKey = modifiers.join(\".\");\n  return cache[cacheKey] || (cache[cacheKey] = (event, ...args) => {\n    for (let i = 0; i < modifiers.length; i++) {\n      const guard = modifierGuards[modifiers[i]];\n      if (guard && guard(event, modifiers))\n        return;\n    }\n    return fn(event, ...args);\n  });\n};\nconst keyNames = {\n  esc: \"escape\",\n  space: \" \",\n  up: \"arrow-up\",\n  left: \"arrow-left\",\n  right: \"arrow-right\",\n  down: \"arrow-down\",\n  delete: \"backspace\"\n};\nconst withKeys = (fn, modifiers) => {\n  const cache = fn._withKeys || (fn._withKeys = {});\n  const cacheKey = modifiers.join(\".\");\n  return cache[cacheKey] || (cache[cacheKey] = (event) => {\n    if (!(\"key\" in event)) {\n      return;\n    }\n    const eventKey = hyphenate(event.key);\n    if (modifiers.some((k) => k === eventKey || keyNames[k] === eventKey)) {\n      return fn(event);\n    }\n  });\n};\n\nconst rendererOptions = /* @__PURE__ */ extend({ patchProp }, nodeOps);\nlet renderer;\nlet enabledHydration = false;\nfunction ensureRenderer() {\n  return renderer || (renderer = createRenderer(rendererOptions));\n}\nfunction ensureHydrationRenderer() {\n  renderer = enabledHydration ? renderer : createHydrationRenderer(rendererOptions);\n  enabledHydration = true;\n  return renderer;\n}\nconst render = (...args) => {\n  ensureRenderer().render(...args);\n};\nconst hydrate = (...args) => {\n  ensureHydrationRenderer().hydrate(...args);\n};\nconst createApp = (...args) => {\n  const app = ensureRenderer().createApp(...args);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    injectNativeTagCheck(app);\n    injectCompilerOptionsCheck(app);\n  }\n  const { mount } = app;\n  app.mount = (containerOrSelector) => {\n    const container = normalizeContainer(containerOrSelector);\n    if (!container)\n      return;\n    const component = app._component;\n    if (!isFunction(component) && !component.render && !component.template) {\n      component.template = container.innerHTML;\n    }\n    container.innerHTML = \"\";\n    const proxy = mount(container, false, resolveRootNamespace(container));\n    if (container instanceof Element) {\n      container.removeAttribute(\"v-cloak\");\n      container.setAttribute(\"data-v-app\", \"\");\n    }\n    return proxy;\n  };\n  return app;\n};\nconst createSSRApp = (...args) => {\n  const app = ensureHydrationRenderer().createApp(...args);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    injectNativeTagCheck(app);\n    injectCompilerOptionsCheck(app);\n  }\n  const { mount } = app;\n  app.mount = (containerOrSelector) => {\n    const container = normalizeContainer(containerOrSelector);\n    if (container) {\n      return mount(container, true, resolveRootNamespace(container));\n    }\n  };\n  return app;\n};\nfunction resolveRootNamespace(container) {\n  if (container instanceof SVGElement) {\n    return \"svg\";\n  }\n  if (typeof MathMLElement === \"function\" && container instanceof MathMLElement) {\n    return \"mathml\";\n  }\n}\nfunction injectNativeTagCheck(app) {\n  Object.defineProperty(app.config, \"isNativeTag\", {\n    value: (tag) => isHTMLTag(tag) || isSVGTag(tag) || isMathMLTag(tag),\n    writable: false\n  });\n}\nfunction injectCompilerOptionsCheck(app) {\n  if (isRuntimeOnly()) {\n    const isCustomElement = app.config.isCustomElement;\n    Object.defineProperty(app.config, \"isCustomElement\", {\n      get() {\n        return isCustomElement;\n      },\n      set() {\n        warn(\n          `The \\`isCustomElement\\` config option is deprecated. Use \\`compilerOptions.isCustomElement\\` instead.`\n        );\n      }\n    });\n    const compilerOptions = app.config.compilerOptions;\n    const msg = `The \\`compilerOptions\\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka \"full build\"). Since you are using the runtime-only build, \\`compilerOptions\\` must be passed to \\`@vue/compiler-dom\\` in the build setup instead.\n- For vue-loader: pass it via vue-loader's \\`compilerOptions\\` loader option.\n- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader\n- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;\n    Object.defineProperty(app.config, \"compilerOptions\", {\n      get() {\n        warn(msg);\n        return compilerOptions;\n      },\n      set() {\n        warn(msg);\n      }\n    });\n  }\n}\nfunction normalizeContainer(container) {\n  if (isString(container)) {\n    const res = document.querySelector(container);\n    if (!!(process.env.NODE_ENV !== \"production\") && !res) {\n      warn(\n        `Failed to mount app: mount target selector \"${container}\" returned null.`\n      );\n    }\n    return res;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === \"closed\") {\n    warn(\n      `mounting on a ShadowRoot with \\`{mode: \"closed\"}\\` may lead to unpredictable bugs`\n    );\n  }\n  return container;\n}\nlet ssrDirectiveInitialized = false;\nconst initDirectivesForSSR = () => {\n  if (!ssrDirectiveInitialized) {\n    ssrDirectiveInitialized = true;\n    initVModelForSSR();\n    initVShowForSSR();\n  }\n} ;\n\nexport { Transition, TransitionGroup, VueElement, createApp, createSSRApp, defineCustomElement, defineSSRCustomElement, hydrate, initDirectivesForSSR, render, useCssModule, useCssVars, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, withKeys, withModifiers };\n","/**\n* @vue/compiler-core v3.4.27\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { isString, NOOP, isObject, NO, extend, isSymbol, isArray, capitalize, camelize, EMPTY_OBJ, PatchFlagNames, slotFlagsText, isOn, isBuiltInDirective, isReservedProp, toHandlerKey } from '@vue/shared';\nexport { generateCodeFrame } from '@vue/shared';\n\nconst FRAGMENT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `Fragment` : ``);\nconst TELEPORT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `Teleport` : ``);\nconst SUSPENSE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `Suspense` : ``);\nconst KEEP_ALIVE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `KeepAlive` : ``);\nconst BASE_TRANSITION = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `BaseTransition` : ``);\nconst OPEN_BLOCK = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `openBlock` : ``);\nconst CREATE_BLOCK = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createBlock` : ``);\nconst CREATE_ELEMENT_BLOCK = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createElementBlock` : ``);\nconst CREATE_VNODE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createVNode` : ``);\nconst CREATE_ELEMENT_VNODE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createElementVNode` : ``);\nconst CREATE_COMMENT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createCommentVNode` : ``);\nconst CREATE_TEXT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createTextVNode` : ``);\nconst CREATE_STATIC = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createStaticVNode` : ``);\nconst RESOLVE_COMPONENT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `resolveComponent` : ``);\nconst RESOLVE_DYNAMIC_COMPONENT = Symbol(\n  !!(process.env.NODE_ENV !== \"production\") ? `resolveDynamicComponent` : ``\n);\nconst RESOLVE_DIRECTIVE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `resolveDirective` : ``);\nconst RESOLVE_FILTER = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `resolveFilter` : ``);\nconst WITH_DIRECTIVES = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `withDirectives` : ``);\nconst RENDER_LIST = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `renderList` : ``);\nconst RENDER_SLOT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `renderSlot` : ``);\nconst CREATE_SLOTS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `createSlots` : ``);\nconst TO_DISPLAY_STRING = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `toDisplayString` : ``);\nconst MERGE_PROPS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `mergeProps` : ``);\nconst NORMALIZE_CLASS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `normalizeClass` : ``);\nconst NORMALIZE_STYLE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `normalizeStyle` : ``);\nconst NORMALIZE_PROPS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `normalizeProps` : ``);\nconst GUARD_REACTIVE_PROPS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `guardReactiveProps` : ``);\nconst TO_HANDLERS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `toHandlers` : ``);\nconst CAMELIZE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `camelize` : ``);\nconst CAPITALIZE = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `capitalize` : ``);\nconst TO_HANDLER_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `toHandlerKey` : ``);\nconst SET_BLOCK_TRACKING = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `setBlockTracking` : ``);\nconst PUSH_SCOPE_ID = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `pushScopeId` : ``);\nconst POP_SCOPE_ID = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `popScopeId` : ``);\nconst WITH_CTX = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `withCtx` : ``);\nconst UNREF = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `unref` : ``);\nconst IS_REF = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `isRef` : ``);\nconst WITH_MEMO = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `withMemo` : ``);\nconst IS_MEMO_SAME = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `isMemoSame` : ``);\nconst helperNameMap = {\n  [FRAGMENT]: `Fragment`,\n  [TELEPORT]: `Teleport`,\n  [SUSPENSE]: `Suspense`,\n  [KEEP_ALIVE]: `KeepAlive`,\n  [BASE_TRANSITION]: `BaseTransition`,\n  [OPEN_BLOCK]: `openBlock`,\n  [CREATE_BLOCK]: `createBlock`,\n  [CREATE_ELEMENT_BLOCK]: `createElementBlock`,\n  [CREATE_VNODE]: `createVNode`,\n  [CREATE_ELEMENT_VNODE]: `createElementVNode`,\n  [CREATE_COMMENT]: `createCommentVNode`,\n  [CREATE_TEXT]: `createTextVNode`,\n  [CREATE_STATIC]: `createStaticVNode`,\n  [RESOLVE_COMPONENT]: `resolveComponent`,\n  [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`,\n  [RESOLVE_DIRECTIVE]: `resolveDirective`,\n  [RESOLVE_FILTER]: `resolveFilter`,\n  [WITH_DIRECTIVES]: `withDirectives`,\n  [RENDER_LIST]: `renderList`,\n  [RENDER_SLOT]: `renderSlot`,\n  [CREATE_SLOTS]: `createSlots`,\n  [TO_DISPLAY_STRING]: `toDisplayString`,\n  [MERGE_PROPS]: `mergeProps`,\n  [NORMALIZE_CLASS]: `normalizeClass`,\n  [NORMALIZE_STYLE]: `normalizeStyle`,\n  [NORMALIZE_PROPS]: `normalizeProps`,\n  [GUARD_REACTIVE_PROPS]: `guardReactiveProps`,\n  [TO_HANDLERS]: `toHandlers`,\n  [CAMELIZE]: `camelize`,\n  [CAPITALIZE]: `capitalize`,\n  [TO_HANDLER_KEY]: `toHandlerKey`,\n  [SET_BLOCK_TRACKING]: `setBlockTracking`,\n  [PUSH_SCOPE_ID]: `pushScopeId`,\n  [POP_SCOPE_ID]: `popScopeId`,\n  [WITH_CTX]: `withCtx`,\n  [UNREF]: `unref`,\n  [IS_REF]: `isRef`,\n  [WITH_MEMO]: `withMemo`,\n  [IS_MEMO_SAME]: `isMemoSame`\n};\nfunction registerRuntimeHelpers(helpers) {\n  Object.getOwnPropertySymbols(helpers).forEach((s) => {\n    helperNameMap[s] = helpers[s];\n  });\n}\n\nconst Namespaces = {\n  \"HTML\": 0,\n  \"0\": \"HTML\",\n  \"SVG\": 1,\n  \"1\": \"SVG\",\n  \"MATH_ML\": 2,\n  \"2\": \"MATH_ML\"\n};\nconst NodeTypes = {\n  \"ROOT\": 0,\n  \"0\": \"ROOT\",\n  \"ELEMENT\": 1,\n  \"1\": \"ELEMENT\",\n  \"TEXT\": 2,\n  \"2\": \"TEXT\",\n  \"COMMENT\": 3,\n  \"3\": \"COMMENT\",\n  \"SIMPLE_EXPRESSION\": 4,\n  \"4\": \"SIMPLE_EXPRESSION\",\n  \"INTERPOLATION\": 5,\n  \"5\": \"INTERPOLATION\",\n  \"ATTRIBUTE\": 6,\n  \"6\": \"ATTRIBUTE\",\n  \"DIRECTIVE\": 7,\n  \"7\": \"DIRECTIVE\",\n  \"COMPOUND_EXPRESSION\": 8,\n  \"8\": \"COMPOUND_EXPRESSION\",\n  \"IF\": 9,\n  \"9\": \"IF\",\n  \"IF_BRANCH\": 10,\n  \"10\": \"IF_BRANCH\",\n  \"FOR\": 11,\n  \"11\": \"FOR\",\n  \"TEXT_CALL\": 12,\n  \"12\": \"TEXT_CALL\",\n  \"VNODE_CALL\": 13,\n  \"13\": \"VNODE_CALL\",\n  \"JS_CALL_EXPRESSION\": 14,\n  \"14\": \"JS_CALL_EXPRESSION\",\n  \"JS_OBJECT_EXPRESSION\": 15,\n  \"15\": \"JS_OBJECT_EXPRESSION\",\n  \"JS_PROPERTY\": 16,\n  \"16\": \"JS_PROPERTY\",\n  \"JS_ARRAY_EXPRESSION\": 17,\n  \"17\": \"JS_ARRAY_EXPRESSION\",\n  \"JS_FUNCTION_EXPRESSION\": 18,\n  \"18\": \"JS_FUNCTION_EXPRESSION\",\n  \"JS_CONDITIONAL_EXPRESSION\": 19,\n  \"19\": \"JS_CONDITIONAL_EXPRESSION\",\n  \"JS_CACHE_EXPRESSION\": 20,\n  \"20\": \"JS_CACHE_EXPRESSION\",\n  \"JS_BLOCK_STATEMENT\": 21,\n  \"21\": \"JS_BLOCK_STATEMENT\",\n  \"JS_TEMPLATE_LITERAL\": 22,\n  \"22\": \"JS_TEMPLATE_LITERAL\",\n  \"JS_IF_STATEMENT\": 23,\n  \"23\": \"JS_IF_STATEMENT\",\n  \"JS_ASSIGNMENT_EXPRESSION\": 24,\n  \"24\": \"JS_ASSIGNMENT_EXPRESSION\",\n  \"JS_SEQUENCE_EXPRESSION\": 25,\n  \"25\": \"JS_SEQUENCE_EXPRESSION\",\n  \"JS_RETURN_STATEMENT\": 26,\n  \"26\": \"JS_RETURN_STATEMENT\"\n};\nconst ElementTypes = {\n  \"ELEMENT\": 0,\n  \"0\": \"ELEMENT\",\n  \"COMPONENT\": 1,\n  \"1\": \"COMPONENT\",\n  \"SLOT\": 2,\n  \"2\": \"SLOT\",\n  \"TEMPLATE\": 3,\n  \"3\": \"TEMPLATE\"\n};\nconst ConstantTypes = {\n  \"NOT_CONSTANT\": 0,\n  \"0\": \"NOT_CONSTANT\",\n  \"CAN_SKIP_PATCH\": 1,\n  \"1\": \"CAN_SKIP_PATCH\",\n  \"CAN_HOIST\": 2,\n  \"2\": \"CAN_HOIST\",\n  \"CAN_STRINGIFY\": 3,\n  \"3\": \"CAN_STRINGIFY\"\n};\nconst locStub = {\n  start: { line: 1, column: 1, offset: 0 },\n  end: { line: 1, column: 1, offset: 0 },\n  source: \"\"\n};\nfunction createRoot(children, source = \"\") {\n  return {\n    type: 0,\n    source,\n    children,\n    helpers: /* @__PURE__ */ new Set(),\n    components: [],\n    directives: [],\n    hoists: [],\n    imports: [],\n    cached: 0,\n    temps: 0,\n    codegenNode: void 0,\n    loc: locStub\n  };\n}\nfunction createVNodeCall(context, tag, props, children, patchFlag, dynamicProps, directives, isBlock = false, disableTracking = false, isComponent = false, loc = locStub) {\n  if (context) {\n    if (isBlock) {\n      context.helper(OPEN_BLOCK);\n      context.helper(getVNodeBlockHelper(context.inSSR, isComponent));\n    } else {\n      context.helper(getVNodeHelper(context.inSSR, isComponent));\n    }\n    if (directives) {\n      context.helper(WITH_DIRECTIVES);\n    }\n  }\n  return {\n    type: 13,\n    tag,\n    props,\n    children,\n    patchFlag,\n    dynamicProps,\n    directives,\n    isBlock,\n    disableTracking,\n    isComponent,\n    loc\n  };\n}\nfunction createArrayExpression(elements, loc = locStub) {\n  return {\n    type: 17,\n    loc,\n    elements\n  };\n}\nfunction createObjectExpression(properties, loc = locStub) {\n  return {\n    type: 15,\n    loc,\n    properties\n  };\n}\nfunction createObjectProperty(key, value) {\n  return {\n    type: 16,\n    loc: locStub,\n    key: isString(key) ? createSimpleExpression(key, true) : key,\n    value\n  };\n}\nfunction createSimpleExpression(content, isStatic = false, loc = locStub, constType = 0) {\n  return {\n    type: 4,\n    loc,\n    content,\n    isStatic,\n    constType: isStatic ? 3 : constType\n  };\n}\nfunction createInterpolation(content, loc) {\n  return {\n    type: 5,\n    loc,\n    content: isString(content) ? createSimpleExpression(content, false, loc) : content\n  };\n}\nfunction createCompoundExpression(children, loc = locStub) {\n  return {\n    type: 8,\n    loc,\n    children\n  };\n}\nfunction createCallExpression(callee, args = [], loc = locStub) {\n  return {\n    type: 14,\n    loc,\n    callee,\n    arguments: args\n  };\n}\nfunction createFunctionExpression(params, returns = void 0, newline = false, isSlot = false, loc = locStub) {\n  return {\n    type: 18,\n    params,\n    returns,\n    newline,\n    isSlot,\n    loc\n  };\n}\nfunction createConditionalExpression(test, consequent, alternate, newline = true) {\n  return {\n    type: 19,\n    test,\n    consequent,\n    alternate,\n    newline,\n    loc: locStub\n  };\n}\nfunction createCacheExpression(index, value, isVNode = false) {\n  return {\n    type: 20,\n    index,\n    value,\n    isVNode,\n    loc: locStub\n  };\n}\nfunction createBlockStatement(body) {\n  return {\n    type: 21,\n    body,\n    loc: locStub\n  };\n}\nfunction createTemplateLiteral(elements) {\n  return {\n    type: 22,\n    elements,\n    loc: locStub\n  };\n}\nfunction createIfStatement(test, consequent, alternate) {\n  return {\n    type: 23,\n    test,\n    consequent,\n    alternate,\n    loc: locStub\n  };\n}\nfunction createAssignmentExpression(left, right) {\n  return {\n    type: 24,\n    left,\n    right,\n    loc: locStub\n  };\n}\nfunction createSequenceExpression(expressions) {\n  return {\n    type: 25,\n    expressions,\n    loc: locStub\n  };\n}\nfunction createReturnStatement(returns) {\n  return {\n    type: 26,\n    returns,\n    loc: locStub\n  };\n}\nfunction getVNodeHelper(ssr, isComponent) {\n  return ssr || isComponent ? CREATE_VNODE : CREATE_ELEMENT_VNODE;\n}\nfunction getVNodeBlockHelper(ssr, isComponent) {\n  return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK;\n}\nfunction convertToBlock(node, { helper, removeHelper, inSSR }) {\n  if (!node.isBlock) {\n    node.isBlock = true;\n    removeHelper(getVNodeHelper(inSSR, node.isComponent));\n    helper(OPEN_BLOCK);\n    helper(getVNodeBlockHelper(inSSR, node.isComponent));\n  }\n}\n\nconst defaultDelimitersOpen = new Uint8Array([123, 123]);\nconst defaultDelimitersClose = new Uint8Array([125, 125]);\nfunction isTagStartChar(c) {\n  return c >= 97 && c <= 122 || c >= 65 && c <= 90;\n}\nfunction isWhitespace(c) {\n  return c === 32 || c === 10 || c === 9 || c === 12 || c === 13;\n}\nfunction isEndOfTagSection(c) {\n  return c === 47 || c === 62 || isWhitespace(c);\n}\nfunction toCharCodes(str) {\n  const ret = new Uint8Array(str.length);\n  for (let i = 0; i < str.length; i++) {\n    ret[i] = str.charCodeAt(i);\n  }\n  return ret;\n}\nconst Sequences = {\n  Cdata: new Uint8Array([67, 68, 65, 84, 65, 91]),\n  // CDATA[\n  CdataEnd: new Uint8Array([93, 93, 62]),\n  // ]]>\n  CommentEnd: new Uint8Array([45, 45, 62]),\n  // `-->`\n  ScriptEnd: new Uint8Array([60, 47, 115, 99, 114, 105, 112, 116]),\n  // `<\\/script`\n  StyleEnd: new Uint8Array([60, 47, 115, 116, 121, 108, 101]),\n  // `</style`\n  TitleEnd: new Uint8Array([60, 47, 116, 105, 116, 108, 101]),\n  // `</title`\n  TextareaEnd: new Uint8Array([\n    60,\n    47,\n    116,\n    101,\n    120,\n    116,\n    97,\n    114,\n    101,\n    97\n  ])\n  // `</textarea\n};\nclass Tokenizer {\n  constructor(stack, cbs) {\n    this.stack = stack;\n    this.cbs = cbs;\n    /** The current state the tokenizer is in. */\n    this.state = 1;\n    /** The read buffer. */\n    this.buffer = \"\";\n    /** The beginning of the section that is currently being read. */\n    this.sectionStart = 0;\n    /** The index within the buffer that we are currently looking at. */\n    this.index = 0;\n    /** The start of the last entity. */\n    this.entityStart = 0;\n    /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */\n    this.baseState = 1;\n    /** For special parsing behavior inside of script and style tags. */\n    this.inRCDATA = false;\n    /** For disabling RCDATA tags handling */\n    this.inXML = false;\n    /** For disabling interpolation parsing in v-pre */\n    this.inVPre = false;\n    /** Record newline positions for fast line / column calculation */\n    this.newlines = [];\n    this.mode = 0;\n    this.delimiterOpen = defaultDelimitersOpen;\n    this.delimiterClose = defaultDelimitersClose;\n    this.delimiterIndex = -1;\n    this.currentSequence = void 0;\n    this.sequenceIndex = 0;\n  }\n  get inSFCRoot() {\n    return this.mode === 2 && this.stack.length === 0;\n  }\n  reset() {\n    this.state = 1;\n    this.mode = 0;\n    this.buffer = \"\";\n    this.sectionStart = 0;\n    this.index = 0;\n    this.baseState = 1;\n    this.inRCDATA = false;\n    this.currentSequence = void 0;\n    this.newlines.length = 0;\n    this.delimiterOpen = defaultDelimitersOpen;\n    this.delimiterClose = defaultDelimitersClose;\n  }\n  /**\n   * Generate Position object with line / column information using recorded\n   * newline positions. We know the index is always going to be an already\n   * processed index, so all the newlines up to this index should have been\n   * recorded.\n   */\n  getPos(index) {\n    let line = 1;\n    let column = index + 1;\n    for (let i = this.newlines.length - 1; i >= 0; i--) {\n      const newlineIndex = this.newlines[i];\n      if (index > newlineIndex) {\n        line = i + 2;\n        column = index - newlineIndex;\n        break;\n      }\n    }\n    return {\n      column,\n      line,\n      offset: index\n    };\n  }\n  peek() {\n    return this.buffer.charCodeAt(this.index + 1);\n  }\n  stateText(c) {\n    if (c === 60) {\n      if (this.index > this.sectionStart) {\n        this.cbs.ontext(this.sectionStart, this.index);\n      }\n      this.state = 5;\n      this.sectionStart = this.index;\n    } else if (!this.inVPre && c === this.delimiterOpen[0]) {\n      this.state = 2;\n      this.delimiterIndex = 0;\n      this.stateInterpolationOpen(c);\n    }\n  }\n  stateInterpolationOpen(c) {\n    if (c === this.delimiterOpen[this.delimiterIndex]) {\n      if (this.delimiterIndex === this.delimiterOpen.length - 1) {\n        const start = this.index + 1 - this.delimiterOpen.length;\n        if (start > this.sectionStart) {\n          this.cbs.ontext(this.sectionStart, start);\n        }\n        this.state = 3;\n        this.sectionStart = start;\n      } else {\n        this.delimiterIndex++;\n      }\n    } else if (this.inRCDATA) {\n      this.state = 32;\n      this.stateInRCDATA(c);\n    } else {\n      this.state = 1;\n      this.stateText(c);\n    }\n  }\n  stateInterpolation(c) {\n    if (c === this.delimiterClose[0]) {\n      this.state = 4;\n      this.delimiterIndex = 0;\n      this.stateInterpolationClose(c);\n    }\n  }\n  stateInterpolationClose(c) {\n    if (c === this.delimiterClose[this.delimiterIndex]) {\n      if (this.delimiterIndex === this.delimiterClose.length - 1) {\n        this.cbs.oninterpolation(this.sectionStart, this.index + 1);\n        if (this.inRCDATA) {\n          this.state = 32;\n        } else {\n          this.state = 1;\n        }\n        this.sectionStart = this.index + 1;\n      } else {\n        this.delimiterIndex++;\n      }\n    } else {\n      this.state = 3;\n      this.stateInterpolation(c);\n    }\n  }\n  stateSpecialStartSequence(c) {\n    const isEnd = this.sequenceIndex === this.currentSequence.length;\n    const isMatch = isEnd ? (\n      // If we are at the end of the sequence, make sure the tag name has ended\n      isEndOfTagSection(c)\n    ) : (\n      // Otherwise, do a case-insensitive comparison\n      (c | 32) === this.currentSequence[this.sequenceIndex]\n    );\n    if (!isMatch) {\n      this.inRCDATA = false;\n    } else if (!isEnd) {\n      this.sequenceIndex++;\n      return;\n    }\n    this.sequenceIndex = 0;\n    this.state = 6;\n    this.stateInTagName(c);\n  }\n  /** Look for an end tag. For <title> and <textarea>, also decode entities. */\n  stateInRCDATA(c) {\n    if (this.sequenceIndex === this.currentSequence.length) {\n      if (c === 62 || isWhitespace(c)) {\n        const endOfText = this.index - this.currentSequence.length;\n        if (this.sectionStart < endOfText) {\n          const actualIndex = this.index;\n          this.index = endOfText;\n          this.cbs.ontext(this.sectionStart, endOfText);\n          this.index = actualIndex;\n        }\n        this.sectionStart = endOfText + 2;\n        this.stateInClosingTagName(c);\n        this.inRCDATA = false;\n        return;\n      }\n      this.sequenceIndex = 0;\n    }\n    if ((c | 32) === this.currentSequence[this.sequenceIndex]) {\n      this.sequenceIndex += 1;\n    } else if (this.sequenceIndex === 0) {\n      if (this.currentSequence === Sequences.TitleEnd || this.currentSequence === Sequences.TextareaEnd && !this.inSFCRoot) {\n        if (c === this.delimiterOpen[0]) {\n          this.state = 2;\n          this.delimiterIndex = 0;\n          this.stateInterpolationOpen(c);\n        }\n      } else if (this.fastForwardTo(60)) {\n        this.sequenceIndex = 1;\n      }\n    } else {\n      this.sequenceIndex = Number(c === 60);\n    }\n  }\n  stateCDATASequence(c) {\n    if (c === Sequences.Cdata[this.sequenceIndex]) {\n      if (++this.sequenceIndex === Sequences.Cdata.length) {\n        this.state = 28;\n        this.currentSequence = Sequences.CdataEnd;\n        this.sequenceIndex = 0;\n        this.sectionStart = this.index + 1;\n      }\n    } else {\n      this.sequenceIndex = 0;\n      this.state = 23;\n      this.stateInDeclaration(c);\n    }\n  }\n  /**\n   * When we wait for one specific character, we can speed things up\n   * by skipping through the buffer until we find it.\n   *\n   * @returns Whether the character was found.\n   */\n  fastForwardTo(c) {\n    while (++this.index < this.buffer.length) {\n      const cc = this.buffer.charCodeAt(this.index);\n      if (cc === 10) {\n        this.newlines.push(this.index);\n      }\n      if (cc === c) {\n        return true;\n      }\n    }\n    this.index = this.buffer.length - 1;\n    return false;\n  }\n  /**\n   * Comments and CDATA end with `-->` and `]]>`.\n   *\n   * Their common qualities are:\n   * - Their end sequences have a distinct character they start with.\n   * - That character is then repeated, so we have to check multiple repeats.\n   * - All characters but the start character of the sequence can be skipped.\n   */\n  stateInCommentLike(c) {\n    if (c === this.currentSequence[this.sequenceIndex]) {\n      if (++this.sequenceIndex === this.currentSequence.length) {\n        if (this.currentSequence === Sequences.CdataEnd) {\n          this.cbs.oncdata(this.sectionStart, this.index - 2);\n        } else {\n          this.cbs.oncomment(this.sectionStart, this.index - 2);\n        }\n        this.sequenceIndex = 0;\n        this.sectionStart = this.index + 1;\n        this.state = 1;\n      }\n    } else if (this.sequenceIndex === 0) {\n      if (this.fastForwardTo(this.currentSequence[0])) {\n        this.sequenceIndex = 1;\n      }\n    } else if (c !== this.currentSequence[this.sequenceIndex - 1]) {\n      this.sequenceIndex = 0;\n    }\n  }\n  startSpecial(sequence, offset) {\n    this.enterRCDATA(sequence, offset);\n    this.state = 31;\n  }\n  enterRCDATA(sequence, offset) {\n    this.inRCDATA = true;\n    this.currentSequence = sequence;\n    this.sequenceIndex = offset;\n  }\n  stateBeforeTagName(c) {\n    if (c === 33) {\n      this.state = 22;\n      this.sectionStart = this.index + 1;\n    } else if (c === 63) {\n      this.state = 24;\n      this.sectionStart = this.index + 1;\n    } else if (isTagStartChar(c)) {\n      this.sectionStart = this.index;\n      if (this.mode === 0) {\n        this.state = 6;\n      } else if (this.inSFCRoot) {\n        this.state = 34;\n      } else if (!this.inXML) {\n        if (c === 116) {\n          this.state = 30;\n        } else {\n          this.state = c === 115 ? 29 : 6;\n        }\n      } else {\n        this.state = 6;\n      }\n    } else if (c === 47) {\n      this.state = 8;\n    } else {\n      this.state = 1;\n      this.stateText(c);\n    }\n  }\n  stateInTagName(c) {\n    if (isEndOfTagSection(c)) {\n      this.handleTagName(c);\n    }\n  }\n  stateInSFCRootTagName(c) {\n    if (isEndOfTagSection(c)) {\n      const tag = this.buffer.slice(this.sectionStart, this.index);\n      if (tag !== \"template\") {\n        this.enterRCDATA(toCharCodes(`</` + tag), 0);\n      }\n      this.handleTagName(c);\n    }\n  }\n  handleTagName(c) {\n    this.cbs.onopentagname(this.sectionStart, this.index);\n    this.sectionStart = -1;\n    this.state = 11;\n    this.stateBeforeAttrName(c);\n  }\n  stateBeforeClosingTagName(c) {\n    if (isWhitespace(c)) ; else if (c === 62) {\n      if (!!(process.env.NODE_ENV !== \"production\") || false) {\n        this.cbs.onerr(14, this.index);\n      }\n      this.state = 1;\n      this.sectionStart = this.index + 1;\n    } else {\n      this.state = isTagStartChar(c) ? 9 : 27;\n      this.sectionStart = this.index;\n    }\n  }\n  stateInClosingTagName(c) {\n    if (c === 62 || isWhitespace(c)) {\n      this.cbs.onclosetag(this.sectionStart, this.index);\n      this.sectionStart = -1;\n      this.state = 10;\n      this.stateAfterClosingTagName(c);\n    }\n  }\n  stateAfterClosingTagName(c) {\n    if (c === 62) {\n      this.state = 1;\n      this.sectionStart = this.index + 1;\n    }\n  }\n  stateBeforeAttrName(c) {\n    if (c === 62) {\n      this.cbs.onopentagend(this.index);\n      if (this.inRCDATA) {\n        this.state = 32;\n      } else {\n        this.state = 1;\n      }\n      this.sectionStart = this.index + 1;\n    } else if (c === 47) {\n      this.state = 7;\n      if ((!!(process.env.NODE_ENV !== \"production\") || false) && this.peek() !== 62) {\n        this.cbs.onerr(22, this.index);\n      }\n    } else if (c === 60 && this.peek() === 47) {\n      this.cbs.onopentagend(this.index);\n      this.state = 5;\n      this.sectionStart = this.index;\n    } else if (!isWhitespace(c)) {\n      if ((!!(process.env.NODE_ENV !== \"production\") || false) && c === 61) {\n        this.cbs.onerr(\n          19,\n          this.index\n        );\n      }\n      this.handleAttrStart(c);\n    }\n  }\n  handleAttrStart(c) {\n    if (c === 118 && this.peek() === 45) {\n      this.state = 13;\n      this.sectionStart = this.index;\n    } else if (c === 46 || c === 58 || c === 64 || c === 35) {\n      this.cbs.ondirname(this.index, this.index + 1);\n      this.state = 14;\n      this.sectionStart = this.index + 1;\n    } else {\n      this.state = 12;\n      this.sectionStart = this.index;\n    }\n  }\n  stateInSelfClosingTag(c) {\n    if (c === 62) {\n      this.cbs.onselfclosingtag(this.index);\n      this.state = 1;\n      this.sectionStart = this.index + 1;\n      this.inRCDATA = false;\n    } else if (!isWhitespace(c)) {\n      this.state = 11;\n      this.stateBeforeAttrName(c);\n    }\n  }\n  stateInAttrName(c) {\n    if (c === 61 || isEndOfTagSection(c)) {\n      this.cbs.onattribname(this.sectionStart, this.index);\n      this.handleAttrNameEnd(c);\n    } else if ((!!(process.env.NODE_ENV !== \"production\") || false) && (c === 34 || c === 39 || c === 60)) {\n      this.cbs.onerr(\n        17,\n        this.index\n      );\n    }\n  }\n  stateInDirName(c) {\n    if (c === 61 || isEndOfTagSection(c)) {\n      this.cbs.ondirname(this.sectionStart, this.index);\n      this.handleAttrNameEnd(c);\n    } else if (c === 58) {\n      this.cbs.ondirname(this.sectionStart, this.index);\n      this.state = 14;\n      this.sectionStart = this.index + 1;\n    } else if (c === 46) {\n      this.cbs.ondirname(this.sectionStart, this.index);\n      this.state = 16;\n      this.sectionStart = this.index + 1;\n    }\n  }\n  stateInDirArg(c) {\n    if (c === 61 || isEndOfTagSection(c)) {\n      this.cbs.ondirarg(this.sectionStart, this.index);\n      this.handleAttrNameEnd(c);\n    } else if (c === 91) {\n      this.state = 15;\n    } else if (c === 46) {\n      this.cbs.ondirarg(this.sectionStart, this.index);\n      this.state = 16;\n      this.sectionStart = this.index + 1;\n    }\n  }\n  stateInDynamicDirArg(c) {\n    if (c === 93) {\n      this.state = 14;\n    } else if (c === 61 || isEndOfTagSection(c)) {\n      this.cbs.ondirarg(this.sectionStart, this.index + 1);\n      this.handleAttrNameEnd(c);\n      if (!!(process.env.NODE_ENV !== \"production\") || false) {\n        this.cbs.onerr(\n          27,\n          this.index\n        );\n      }\n    }\n  }\n  stateInDirModifier(c) {\n    if (c === 61 || isEndOfTagSection(c)) {\n      this.cbs.ondirmodifier(this.sectionStart, this.index);\n      this.handleAttrNameEnd(c);\n    } else if (c === 46) {\n      this.cbs.ondirmodifier(this.sectionStart, this.index);\n      this.sectionStart = this.index + 1;\n    }\n  }\n  handleAttrNameEnd(c) {\n    this.sectionStart = this.index;\n    this.state = 17;\n    this.cbs.onattribnameend(this.index);\n    this.stateAfterAttrName(c);\n  }\n  stateAfterAttrName(c) {\n    if (c === 61) {\n      this.state = 18;\n    } else if (c === 47 || c === 62) {\n      this.cbs.onattribend(0, this.sectionStart);\n      this.sectionStart = -1;\n      this.state = 11;\n      this.stateBeforeAttrName(c);\n    } else if (!isWhitespace(c)) {\n      this.cbs.onattribend(0, this.sectionStart);\n      this.handleAttrStart(c);\n    }\n  }\n  stateBeforeAttrValue(c) {\n    if (c === 34) {\n      this.state = 19;\n      this.sectionStart = this.index + 1;\n    } else if (c === 39) {\n      this.state = 20;\n      this.sectionStart = this.index + 1;\n    } else if (!isWhitespace(c)) {\n      this.sectionStart = this.index;\n      this.state = 21;\n      this.stateInAttrValueNoQuotes(c);\n    }\n  }\n  handleInAttrValue(c, quote) {\n    if (c === quote || this.fastForwardTo(quote)) {\n      this.cbs.onattribdata(this.sectionStart, this.index);\n      this.sectionStart = -1;\n      this.cbs.onattribend(\n        quote === 34 ? 3 : 2,\n        this.index + 1\n      );\n      this.state = 11;\n    }\n  }\n  stateInAttrValueDoubleQuotes(c) {\n    this.handleInAttrValue(c, 34);\n  }\n  stateInAttrValueSingleQuotes(c) {\n    this.handleInAttrValue(c, 39);\n  }\n  stateInAttrValueNoQuotes(c) {\n    if (isWhitespace(c) || c === 62) {\n      this.cbs.onattribdata(this.sectionStart, this.index);\n      this.sectionStart = -1;\n      this.cbs.onattribend(1, this.index);\n      this.state = 11;\n      this.stateBeforeAttrName(c);\n    } else if ((!!(process.env.NODE_ENV !== \"production\") || false) && c === 34 || c === 39 || c === 60 || c === 61 || c === 96) {\n      this.cbs.onerr(\n        18,\n        this.index\n      );\n    } else ;\n  }\n  stateBeforeDeclaration(c) {\n    if (c === 91) {\n      this.state = 26;\n      this.sequenceIndex = 0;\n    } else {\n      this.state = c === 45 ? 25 : 23;\n    }\n  }\n  stateInDeclaration(c) {\n    if (c === 62 || this.fastForwardTo(62)) {\n      this.state = 1;\n      this.sectionStart = this.index + 1;\n    }\n  }\n  stateInProcessingInstruction(c) {\n    if (c === 62 || this.fastForwardTo(62)) {\n      this.cbs.onprocessinginstruction(this.sectionStart, this.index);\n      this.state = 1;\n      this.sectionStart = this.index + 1;\n    }\n  }\n  stateBeforeComment(c) {\n    if (c === 45) {\n      this.state = 28;\n      this.currentSequence = Sequences.CommentEnd;\n      this.sequenceIndex = 2;\n      this.sectionStart = this.index + 1;\n    } else {\n      this.state = 23;\n    }\n  }\n  stateInSpecialComment(c) {\n    if (c === 62 || this.fastForwardTo(62)) {\n      this.cbs.oncomment(this.sectionStart, this.index);\n      this.state = 1;\n      this.sectionStart = this.index + 1;\n    }\n  }\n  stateBeforeSpecialS(c) {\n    if (c === Sequences.ScriptEnd[3]) {\n      this.startSpecial(Sequences.ScriptEnd, 4);\n    } else if (c === Sequences.StyleEnd[3]) {\n      this.startSpecial(Sequences.StyleEnd, 4);\n    } else {\n      this.state = 6;\n      this.stateInTagName(c);\n    }\n  }\n  stateBeforeSpecialT(c) {\n    if (c === Sequences.TitleEnd[3]) {\n      this.startSpecial(Sequences.TitleEnd, 4);\n    } else if (c === Sequences.TextareaEnd[3]) {\n      this.startSpecial(Sequences.TextareaEnd, 4);\n    } else {\n      this.state = 6;\n      this.stateInTagName(c);\n    }\n  }\n  startEntity() {\n  }\n  stateInEntity() {\n  }\n  /**\n   * Iterates through the buffer, calling the function corresponding to the current state.\n   *\n   * States that are more likely to be hit are higher up, as a performance improvement.\n   */\n  parse(input) {\n    this.buffer = input;\n    while (this.index < this.buffer.length) {\n      const c = this.buffer.charCodeAt(this.index);\n      if (c === 10) {\n        this.newlines.push(this.index);\n      }\n      switch (this.state) {\n        case 1: {\n          this.stateText(c);\n          break;\n        }\n        case 2: {\n          this.stateInterpolationOpen(c);\n          break;\n        }\n        case 3: {\n          this.stateInterpolation(c);\n          break;\n        }\n        case 4: {\n          this.stateInterpolationClose(c);\n          break;\n        }\n        case 31: {\n          this.stateSpecialStartSequence(c);\n          break;\n        }\n        case 32: {\n          this.stateInRCDATA(c);\n          break;\n        }\n        case 26: {\n          this.stateCDATASequence(c);\n          break;\n        }\n        case 19: {\n          this.stateInAttrValueDoubleQuotes(c);\n          break;\n        }\n        case 12: {\n          this.stateInAttrName(c);\n          break;\n        }\n        case 13: {\n          this.stateInDirName(c);\n          break;\n        }\n        case 14: {\n          this.stateInDirArg(c);\n          break;\n        }\n        case 15: {\n          this.stateInDynamicDirArg(c);\n          break;\n        }\n        case 16: {\n          this.stateInDirModifier(c);\n          break;\n        }\n        case 28: {\n          this.stateInCommentLike(c);\n          break;\n        }\n        case 27: {\n          this.stateInSpecialComment(c);\n          break;\n        }\n        case 11: {\n          this.stateBeforeAttrName(c);\n          break;\n        }\n        case 6: {\n          this.stateInTagName(c);\n          break;\n        }\n        case 34: {\n          this.stateInSFCRootTagName(c);\n          break;\n        }\n        case 9: {\n          this.stateInClosingTagName(c);\n          break;\n        }\n        case 5: {\n          this.stateBeforeTagName(c);\n          break;\n        }\n        case 17: {\n          this.stateAfterAttrName(c);\n          break;\n        }\n        case 20: {\n          this.stateInAttrValueSingleQuotes(c);\n          break;\n        }\n        case 18: {\n          this.stateBeforeAttrValue(c);\n          break;\n        }\n        case 8: {\n          this.stateBeforeClosingTagName(c);\n          break;\n        }\n        case 10: {\n          this.stateAfterClosingTagName(c);\n          break;\n        }\n        case 29: {\n          this.stateBeforeSpecialS(c);\n          break;\n        }\n        case 30: {\n          this.stateBeforeSpecialT(c);\n          break;\n        }\n        case 21: {\n          this.stateInAttrValueNoQuotes(c);\n          break;\n        }\n        case 7: {\n          this.stateInSelfClosingTag(c);\n          break;\n        }\n        case 23: {\n          this.stateInDeclaration(c);\n          break;\n        }\n        case 22: {\n          this.stateBeforeDeclaration(c);\n          break;\n        }\n        case 25: {\n          this.stateBeforeComment(c);\n          break;\n        }\n        case 24: {\n          this.stateInProcessingInstruction(c);\n          break;\n        }\n        case 33: {\n          this.stateInEntity();\n          break;\n        }\n      }\n      this.index++;\n    }\n    this.cleanup();\n    this.finish();\n  }\n  /**\n   * Remove data that has already been consumed from the buffer.\n   */\n  cleanup() {\n    if (this.sectionStart !== this.index) {\n      if (this.state === 1 || this.state === 32 && this.sequenceIndex === 0) {\n        this.cbs.ontext(this.sectionStart, this.index);\n        this.sectionStart = this.index;\n      } else if (this.state === 19 || this.state === 20 || this.state === 21) {\n        this.cbs.onattribdata(this.sectionStart, this.index);\n        this.sectionStart = this.index;\n      }\n    }\n  }\n  finish() {\n    this.handleTrailingData();\n    this.cbs.onend();\n  }\n  /** Handle any trailing data. */\n  handleTrailingData() {\n    const endIndex = this.buffer.length;\n    if (this.sectionStart >= endIndex) {\n      return;\n    }\n    if (this.state === 28) {\n      if (this.currentSequence === Sequences.CdataEnd) {\n        this.cbs.oncdata(this.sectionStart, endIndex);\n      } else {\n        this.cbs.oncomment(this.sectionStart, endIndex);\n      }\n    } else if (this.state === 6 || this.state === 11 || this.state === 18 || this.state === 17 || this.state === 12 || this.state === 13 || this.state === 14 || this.state === 15 || this.state === 16 || this.state === 20 || this.state === 19 || this.state === 21 || this.state === 9) ; else {\n      this.cbs.ontext(this.sectionStart, endIndex);\n    }\n  }\n  emitCodePoint(cp, consumed) {\n  }\n}\n\nconst CompilerDeprecationTypes = {\n  \"COMPILER_IS_ON_ELEMENT\": \"COMPILER_IS_ON_ELEMENT\",\n  \"COMPILER_V_BIND_SYNC\": \"COMPILER_V_BIND_SYNC\",\n  \"COMPILER_V_BIND_OBJECT_ORDER\": \"COMPILER_V_BIND_OBJECT_ORDER\",\n  \"COMPILER_V_ON_NATIVE\": \"COMPILER_V_ON_NATIVE\",\n  \"COMPILER_V_IF_V_FOR_PRECEDENCE\": \"COMPILER_V_IF_V_FOR_PRECEDENCE\",\n  \"COMPILER_NATIVE_TEMPLATE\": \"COMPILER_NATIVE_TEMPLATE\",\n  \"COMPILER_INLINE_TEMPLATE\": \"COMPILER_INLINE_TEMPLATE\",\n  \"COMPILER_FILTERS\": \"COMPILER_FILTERS\"\n};\nconst deprecationData = {\n  [\"COMPILER_IS_ON_ELEMENT\"]: {\n    message: `Platform-native elements with \"is\" prop will no longer be treated as components in Vue 3 unless the \"is\" value is explicitly prefixed with \"vue:\".`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/custom-elements-interop.html`\n  },\n  [\"COMPILER_V_BIND_SYNC\"]: {\n    message: (key) => `.sync modifier for v-bind has been removed. Use v-model with argument instead. \\`v-bind:${key}.sync\\` should be changed to \\`v-model:${key}\\`.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/v-model.html`\n  },\n  [\"COMPILER_V_BIND_OBJECT_ORDER\"]: {\n    message: `v-bind=\"obj\" usage is now order sensitive and behaves like JavaScript object spread: it will now overwrite an existing non-mergeable attribute that appears before v-bind in the case of conflict. To retain 2.x behavior, move v-bind to make it the first attribute. You can also suppress this warning if the usage is intended.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/v-bind.html`\n  },\n  [\"COMPILER_V_ON_NATIVE\"]: {\n    message: `.native modifier for v-on has been removed as is no longer necessary.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/v-on-native-modifier-removed.html`\n  },\n  [\"COMPILER_V_IF_V_FOR_PRECEDENCE\"]: {\n    message: `v-if / v-for precedence when used on the same element has changed in Vue 3: v-if now takes higher precedence and will no longer have access to v-for scope variables. It is best to avoid the ambiguity with <template> tags or use a computed property that filters v-for data source.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/v-if-v-for.html`\n  },\n  [\"COMPILER_NATIVE_TEMPLATE\"]: {\n    message: `<template> with no special directives will render as a native template element instead of its inner content in Vue 3.`\n  },\n  [\"COMPILER_INLINE_TEMPLATE\"]: {\n    message: `\"inline-template\" has been removed in Vue 3.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/inline-template-attribute.html`\n  },\n  [\"COMPILER_FILTERS\"]: {\n    message: `filters have been removed in Vue 3. The \"|\" symbol will be treated as native JavaScript bitwise OR operator. Use method calls or computed properties instead.`,\n    link: `https://v3-migration.vuejs.org/breaking-changes/filters.html`\n  }\n};\nfunction getCompatValue(key, { compatConfig }) {\n  const value = compatConfig && compatConfig[key];\n  if (key === \"MODE\") {\n    return value || 3;\n  } else {\n    return value;\n  }\n}\nfunction isCompatEnabled(key, context) {\n  const mode = getCompatValue(\"MODE\", context);\n  const value = getCompatValue(key, context);\n  return mode === 3 ? value === true : value !== false;\n}\nfunction checkCompatEnabled(key, context, loc, ...args) {\n  const enabled = isCompatEnabled(key, context);\n  if (!!(process.env.NODE_ENV !== \"production\") && enabled) {\n    warnDeprecation(key, context, loc, ...args);\n  }\n  return enabled;\n}\nfunction warnDeprecation(key, context, loc, ...args) {\n  const val = getCompatValue(key, context);\n  if (val === \"suppress-warning\") {\n    return;\n  }\n  const { message, link } = deprecationData[key];\n  const msg = `(deprecation ${key}) ${typeof message === \"function\" ? message(...args) : message}${link ? `\n  Details: ${link}` : ``}`;\n  const err = new SyntaxError(msg);\n  err.code = key;\n  if (loc)\n    err.loc = loc;\n  context.onWarn(err);\n}\n\nfunction defaultOnError(error) {\n  throw error;\n}\nfunction defaultOnWarn(msg) {\n  !!(process.env.NODE_ENV !== \"production\") && console.warn(`[Vue warn] ${msg.message}`);\n}\nfunction createCompilerError(code, loc, messages, additionalMessage) {\n  const msg = !!(process.env.NODE_ENV !== \"production\") || false ? (messages || errorMessages)[code] + (additionalMessage || ``) : `https://vuejs.org/error-reference/#compiler-${code}`;\n  const error = new SyntaxError(String(msg));\n  error.code = code;\n  error.loc = loc;\n  return error;\n}\nconst ErrorCodes = {\n  \"ABRUPT_CLOSING_OF_EMPTY_COMMENT\": 0,\n  \"0\": \"ABRUPT_CLOSING_OF_EMPTY_COMMENT\",\n  \"CDATA_IN_HTML_CONTENT\": 1,\n  \"1\": \"CDATA_IN_HTML_CONTENT\",\n  \"DUPLICATE_ATTRIBUTE\": 2,\n  \"2\": \"DUPLICATE_ATTRIBUTE\",\n  \"END_TAG_WITH_ATTRIBUTES\": 3,\n  \"3\": \"END_TAG_WITH_ATTRIBUTES\",\n  \"END_TAG_WITH_TRAILING_SOLIDUS\": 4,\n  \"4\": \"END_TAG_WITH_TRAILING_SOLIDUS\",\n  \"EOF_BEFORE_TAG_NAME\": 5,\n  \"5\": \"EOF_BEFORE_TAG_NAME\",\n  \"EOF_IN_CDATA\": 6,\n  \"6\": \"EOF_IN_CDATA\",\n  \"EOF_IN_COMMENT\": 7,\n  \"7\": \"EOF_IN_COMMENT\",\n  \"EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT\": 8,\n  \"8\": \"EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT\",\n  \"EOF_IN_TAG\": 9,\n  \"9\": \"EOF_IN_TAG\",\n  \"INCORRECTLY_CLOSED_COMMENT\": 10,\n  \"10\": \"INCORRECTLY_CLOSED_COMMENT\",\n  \"INCORRECTLY_OPENED_COMMENT\": 11,\n  \"11\": \"INCORRECTLY_OPENED_COMMENT\",\n  \"INVALID_FIRST_CHARACTER_OF_TAG_NAME\": 12,\n  \"12\": \"INVALID_FIRST_CHARACTER_OF_TAG_NAME\",\n  \"MISSING_ATTRIBUTE_VALUE\": 13,\n  \"13\": \"MISSING_ATTRIBUTE_VALUE\",\n  \"MISSING_END_TAG_NAME\": 14,\n  \"14\": \"MISSING_END_TAG_NAME\",\n  \"MISSING_WHITESPACE_BETWEEN_ATTRIBUTES\": 15,\n  \"15\": \"MISSING_WHITESPACE_BETWEEN_ATTRIBUTES\",\n  \"NESTED_COMMENT\": 16,\n  \"16\": \"NESTED_COMMENT\",\n  \"UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME\": 17,\n  \"17\": \"UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME\",\n  \"UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE\": 18,\n  \"18\": \"UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE\",\n  \"UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME\": 19,\n  \"19\": \"UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME\",\n  \"UNEXPECTED_NULL_CHARACTER\": 20,\n  \"20\": \"UNEXPECTED_NULL_CHARACTER\",\n  \"UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME\": 21,\n  \"21\": \"UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME\",\n  \"UNEXPECTED_SOLIDUS_IN_TAG\": 22,\n  \"22\": \"UNEXPECTED_SOLIDUS_IN_TAG\",\n  \"X_INVALID_END_TAG\": 23,\n  \"23\": \"X_INVALID_END_TAG\",\n  \"X_MISSING_END_TAG\": 24,\n  \"24\": \"X_MISSING_END_TAG\",\n  \"X_MISSING_INTERPOLATION_END\": 25,\n  \"25\": \"X_MISSING_INTERPOLATION_END\",\n  \"X_MISSING_DIRECTIVE_NAME\": 26,\n  \"26\": \"X_MISSING_DIRECTIVE_NAME\",\n  \"X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END\": 27,\n  \"27\": \"X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END\",\n  \"X_V_IF_NO_EXPRESSION\": 28,\n  \"28\": \"X_V_IF_NO_EXPRESSION\",\n  \"X_V_IF_SAME_KEY\": 29,\n  \"29\": \"X_V_IF_SAME_KEY\",\n  \"X_V_ELSE_NO_ADJACENT_IF\": 30,\n  \"30\": \"X_V_ELSE_NO_ADJACENT_IF\",\n  \"X_V_FOR_NO_EXPRESSION\": 31,\n  \"31\": \"X_V_FOR_NO_EXPRESSION\",\n  \"X_V_FOR_MALFORMED_EXPRESSION\": 32,\n  \"32\": \"X_V_FOR_MALFORMED_EXPRESSION\",\n  \"X_V_FOR_TEMPLATE_KEY_PLACEMENT\": 33,\n  \"33\": \"X_V_FOR_TEMPLATE_KEY_PLACEMENT\",\n  \"X_V_BIND_NO_EXPRESSION\": 34,\n  \"34\": \"X_V_BIND_NO_EXPRESSION\",\n  \"X_V_ON_NO_EXPRESSION\": 35,\n  \"35\": \"X_V_ON_NO_EXPRESSION\",\n  \"X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET\": 36,\n  \"36\": \"X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET\",\n  \"X_V_SLOT_MIXED_SLOT_USAGE\": 37,\n  \"37\": \"X_V_SLOT_MIXED_SLOT_USAGE\",\n  \"X_V_SLOT_DUPLICATE_SLOT_NAMES\": 38,\n  \"38\": \"X_V_SLOT_DUPLICATE_SLOT_NAMES\",\n  \"X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN\": 39,\n  \"39\": \"X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN\",\n  \"X_V_SLOT_MISPLACED\": 40,\n  \"40\": \"X_V_SLOT_MISPLACED\",\n  \"X_V_MODEL_NO_EXPRESSION\": 41,\n  \"41\": \"X_V_MODEL_NO_EXPRESSION\",\n  \"X_V_MODEL_MALFORMED_EXPRESSION\": 42,\n  \"42\": \"X_V_MODEL_MALFORMED_EXPRESSION\",\n  \"X_V_MODEL_ON_SCOPE_VARIABLE\": 43,\n  \"43\": \"X_V_MODEL_ON_SCOPE_VARIABLE\",\n  \"X_V_MODEL_ON_PROPS\": 44,\n  \"44\": \"X_V_MODEL_ON_PROPS\",\n  \"X_INVALID_EXPRESSION\": 45,\n  \"45\": \"X_INVALID_EXPRESSION\",\n  \"X_KEEP_ALIVE_INVALID_CHILDREN\": 46,\n  \"46\": \"X_KEEP_ALIVE_INVALID_CHILDREN\",\n  \"X_PREFIX_ID_NOT_SUPPORTED\": 47,\n  \"47\": \"X_PREFIX_ID_NOT_SUPPORTED\",\n  \"X_MODULE_MODE_NOT_SUPPORTED\": 48,\n  \"48\": \"X_MODULE_MODE_NOT_SUPPORTED\",\n  \"X_CACHE_HANDLER_NOT_SUPPORTED\": 49,\n  \"49\": \"X_CACHE_HANDLER_NOT_SUPPORTED\",\n  \"X_SCOPE_ID_NOT_SUPPORTED\": 50,\n  \"50\": \"X_SCOPE_ID_NOT_SUPPORTED\",\n  \"X_VNODE_HOOKS\": 51,\n  \"51\": \"X_VNODE_HOOKS\",\n  \"X_V_BIND_INVALID_SAME_NAME_ARGUMENT\": 52,\n  \"52\": \"X_V_BIND_INVALID_SAME_NAME_ARGUMENT\",\n  \"__EXTEND_POINT__\": 53,\n  \"53\": \"__EXTEND_POINT__\"\n};\nconst errorMessages = {\n  // parse errors\n  [0]: \"Illegal comment.\",\n  [1]: \"CDATA section is allowed only in XML context.\",\n  [2]: \"Duplicate attribute.\",\n  [3]: \"End tag cannot have attributes.\",\n  [4]: \"Illegal '/' in tags.\",\n  [5]: \"Unexpected EOF in tag.\",\n  [6]: \"Unexpected EOF in CDATA section.\",\n  [7]: \"Unexpected EOF in comment.\",\n  [8]: \"Unexpected EOF in script.\",\n  [9]: \"Unexpected EOF in tag.\",\n  [10]: \"Incorrectly closed comment.\",\n  [11]: \"Incorrectly opened comment.\",\n  [12]: \"Illegal tag name. Use '&lt;' to print '<'.\",\n  [13]: \"Attribute value was expected.\",\n  [14]: \"End tag name was expected.\",\n  [15]: \"Whitespace was expected.\",\n  [16]: \"Unexpected '<!--' in comment.\",\n  [17]: `Attribute name cannot contain U+0022 (\"), U+0027 ('), and U+003C (<).`,\n  [18]: \"Unquoted attribute value cannot contain U+0022 (\\\"), U+0027 ('), U+003C (<), U+003D (=), and U+0060 (`).\",\n  [19]: \"Attribute name cannot start with '='.\",\n  [21]: \"'<?' is allowed only in XML context.\",\n  [20]: `Unexpected null character.`,\n  [22]: \"Illegal '/' in tags.\",\n  // Vue-specific parse errors\n  [23]: \"Invalid end tag.\",\n  [24]: \"Element is missing end tag.\",\n  [25]: \"Interpolation end sign was not found.\",\n  [27]: \"End bracket for dynamic directive argument was not found. Note that dynamic directive argument cannot contain spaces.\",\n  [26]: \"Legal directive name was expected.\",\n  // transform errors\n  [28]: `v-if/v-else-if is missing expression.`,\n  [29]: `v-if/else branches must use unique keys.`,\n  [30]: `v-else/v-else-if has no adjacent v-if or v-else-if.`,\n  [31]: `v-for is missing expression.`,\n  [32]: `v-for has invalid expression.`,\n  [33]: `<template v-for> key should be placed on the <template> tag.`,\n  [34]: `v-bind is missing expression.`,\n  [52]: `v-bind with same-name shorthand only allows static argument.`,\n  [35]: `v-on is missing expression.`,\n  [36]: `Unexpected custom directive on <slot> outlet.`,\n  [37]: `Mixed v-slot usage on both the component and nested <template>. When there are multiple named slots, all slots should use <template> syntax to avoid scope ambiguity.`,\n  [38]: `Duplicate slot names found. `,\n  [39]: `Extraneous children found when component already has explicitly named default slot. These children will be ignored.`,\n  [40]: `v-slot can only be used on components or <template> tags.`,\n  [41]: `v-model is missing expression.`,\n  [42]: `v-model value must be a valid JavaScript member expression.`,\n  [43]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`,\n  [44]: `v-model cannot be used on a prop, because local prop bindings are not writable.\nUse a v-bind binding combined with a v-on listener that emits update:x event instead.`,\n  [45]: `Error parsing JavaScript expression: `,\n  [46]: `<KeepAlive> expects exactly one child component.`,\n  [51]: `@vnode-* hooks in templates are no longer supported. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support has been removed in 3.4.`,\n  // generic errors\n  [47]: `\"prefixIdentifiers\" option is not supported in this build of compiler.`,\n  [48]: `ES module mode is not supported in this build of compiler.`,\n  [49]: `\"cacheHandlers\" option is only supported when the \"prefixIdentifiers\" option is enabled.`,\n  [50]: `\"scopeId\" option is only supported in module mode.`,\n  // just to fulfill types\n  [53]: ``\n};\n\nfunction walkIdentifiers(root, onIdentifier, includeAll = false, parentStack = [], knownIds = /* @__PURE__ */ Object.create(null)) {\n  {\n    return;\n  }\n}\nfunction isReferencedIdentifier(id, parent, parentStack) {\n  {\n    return false;\n  }\n}\nfunction isInDestructureAssignment(parent, parentStack) {\n  if (parent && (parent.type === \"ObjectProperty\" || parent.type === \"ArrayPattern\")) {\n    let i = parentStack.length;\n    while (i--) {\n      const p = parentStack[i];\n      if (p.type === \"AssignmentExpression\") {\n        return true;\n      } else if (p.type !== \"ObjectProperty\" && !p.type.endsWith(\"Pattern\")) {\n        break;\n      }\n    }\n  }\n  return false;\n}\nfunction isInNewExpression(parentStack) {\n  let i = parentStack.length;\n  while (i--) {\n    const p = parentStack[i];\n    if (p.type === \"NewExpression\") {\n      return true;\n    } else if (p.type !== \"MemberExpression\") {\n      break;\n    }\n  }\n  return false;\n}\nfunction walkFunctionParams(node, onIdent) {\n  for (const p of node.params) {\n    for (const id of extractIdentifiers(p)) {\n      onIdent(id);\n    }\n  }\n}\nfunction walkBlockDeclarations(block, onIdent) {\n  for (const stmt of block.body) {\n    if (stmt.type === \"VariableDeclaration\") {\n      if (stmt.declare)\n        continue;\n      for (const decl of stmt.declarations) {\n        for (const id of extractIdentifiers(decl.id)) {\n          onIdent(id);\n        }\n      }\n    } else if (stmt.type === \"FunctionDeclaration\" || stmt.type === \"ClassDeclaration\") {\n      if (stmt.declare || !stmt.id)\n        continue;\n      onIdent(stmt.id);\n    } else if (stmt.type === \"ForOfStatement\" || stmt.type === \"ForInStatement\" || stmt.type === \"ForStatement\") {\n      const variable = stmt.type === \"ForStatement\" ? stmt.init : stmt.left;\n      if (variable && variable.type === \"VariableDeclaration\") {\n        for (const decl of variable.declarations) {\n          for (const id of extractIdentifiers(decl.id)) {\n            onIdent(id);\n          }\n        }\n      }\n    }\n  }\n}\nfunction extractIdentifiers(param, nodes = []) {\n  switch (param.type) {\n    case \"Identifier\":\n      nodes.push(param);\n      break;\n    case \"MemberExpression\":\n      let object = param;\n      while (object.type === \"MemberExpression\") {\n        object = object.object;\n      }\n      nodes.push(object);\n      break;\n    case \"ObjectPattern\":\n      for (const prop of param.properties) {\n        if (prop.type === \"RestElement\") {\n          extractIdentifiers(prop.argument, nodes);\n        } else {\n          extractIdentifiers(prop.value, nodes);\n        }\n      }\n      break;\n    case \"ArrayPattern\":\n      param.elements.forEach((element) => {\n        if (element)\n          extractIdentifiers(element, nodes);\n      });\n      break;\n    case \"RestElement\":\n      extractIdentifiers(param.argument, nodes);\n      break;\n    case \"AssignmentPattern\":\n      extractIdentifiers(param.left, nodes);\n      break;\n  }\n  return nodes;\n}\nconst isFunctionType = (node) => {\n  return /Function(?:Expression|Declaration)$|Method$/.test(node.type);\n};\nconst isStaticProperty = (node) => node && (node.type === \"ObjectProperty\" || node.type === \"ObjectMethod\") && !node.computed;\nconst isStaticPropertyKey = (node, parent) => isStaticProperty(parent) && parent.key === node;\nconst TS_NODE_TYPES = [\n  \"TSAsExpression\",\n  // foo as number\n  \"TSTypeAssertion\",\n  // (<number>foo)\n  \"TSNonNullExpression\",\n  // foo!\n  \"TSInstantiationExpression\",\n  // foo<string>\n  \"TSSatisfiesExpression\"\n  // foo satisfies T\n];\nfunction unwrapTSNode(node) {\n  if (TS_NODE_TYPES.includes(node.type)) {\n    return unwrapTSNode(node.expression);\n  } else {\n    return node;\n  }\n}\n\nconst isStaticExp = (p) => p.type === 4 && p.isStatic;\nfunction isCoreComponent(tag) {\n  switch (tag) {\n    case \"Teleport\":\n    case \"teleport\":\n      return TELEPORT;\n    case \"Suspense\":\n    case \"suspense\":\n      return SUSPENSE;\n    case \"KeepAlive\":\n    case \"keep-alive\":\n      return KEEP_ALIVE;\n    case \"BaseTransition\":\n    case \"base-transition\":\n      return BASE_TRANSITION;\n  }\n}\nconst nonIdentifierRE = /^\\d|[^\\$\\w]/;\nconst isSimpleIdentifier = (name) => !nonIdentifierRE.test(name);\nconst validFirstIdentCharRE = /[A-Za-z_$\\xA0-\\uFFFF]/;\nconst validIdentCharRE = /[\\.\\?\\w$\\xA0-\\uFFFF]/;\nconst whitespaceRE = /\\s+[.[]\\s*|\\s*[.[]\\s+/g;\nconst isMemberExpressionBrowser = (path) => {\n  path = path.trim().replace(whitespaceRE, (s) => s.trim());\n  let state = 0 /* inMemberExp */;\n  let stateStack = [];\n  let currentOpenBracketCount = 0;\n  let currentOpenParensCount = 0;\n  let currentStringType = null;\n  for (let i = 0; i < path.length; i++) {\n    const char = path.charAt(i);\n    switch (state) {\n      case 0 /* inMemberExp */:\n        if (char === \"[\") {\n          stateStack.push(state);\n          state = 1 /* inBrackets */;\n          currentOpenBracketCount++;\n        } else if (char === \"(\") {\n          stateStack.push(state);\n          state = 2 /* inParens */;\n          currentOpenParensCount++;\n        } else if (!(i === 0 ? validFirstIdentCharRE : validIdentCharRE).test(char)) {\n          return false;\n        }\n        break;\n      case 1 /* inBrackets */:\n        if (char === `'` || char === `\"` || char === \"`\") {\n          stateStack.push(state);\n          state = 3 /* inString */;\n          currentStringType = char;\n        } else if (char === `[`) {\n          currentOpenBracketCount++;\n        } else if (char === `]`) {\n          if (!--currentOpenBracketCount) {\n            state = stateStack.pop();\n          }\n        }\n        break;\n      case 2 /* inParens */:\n        if (char === `'` || char === `\"` || char === \"`\") {\n          stateStack.push(state);\n          state = 3 /* inString */;\n          currentStringType = char;\n        } else if (char === `(`) {\n          currentOpenParensCount++;\n        } else if (char === `)`) {\n          if (i === path.length - 1) {\n            return false;\n          }\n          if (!--currentOpenParensCount) {\n            state = stateStack.pop();\n          }\n        }\n        break;\n      case 3 /* inString */:\n        if (char === currentStringType) {\n          state = stateStack.pop();\n          currentStringType = null;\n        }\n        break;\n    }\n  }\n  return !currentOpenBracketCount && !currentOpenParensCount;\n};\nconst isMemberExpressionNode = NOOP ;\nconst isMemberExpression = isMemberExpressionBrowser ;\nfunction advancePositionWithClone(pos, source, numberOfCharacters = source.length) {\n  return advancePositionWithMutation(\n    {\n      offset: pos.offset,\n      line: pos.line,\n      column: pos.column\n    },\n    source,\n    numberOfCharacters\n  );\n}\nfunction advancePositionWithMutation(pos, source, numberOfCharacters = source.length) {\n  let linesCount = 0;\n  let lastNewLinePos = -1;\n  for (let i = 0; i < numberOfCharacters; i++) {\n    if (source.charCodeAt(i) === 10) {\n      linesCount++;\n      lastNewLinePos = i;\n    }\n  }\n  pos.offset += numberOfCharacters;\n  pos.line += linesCount;\n  pos.column = lastNewLinePos === -1 ? pos.column + numberOfCharacters : numberOfCharacters - lastNewLinePos;\n  return pos;\n}\nfunction assert(condition, msg) {\n  if (!condition) {\n    throw new Error(msg || `unexpected compiler condition`);\n  }\n}\nfunction findDir(node, name, allowEmpty = false) {\n  for (let i = 0; i < node.props.length; i++) {\n    const p = node.props[i];\n    if (p.type === 7 && (allowEmpty || p.exp) && (isString(name) ? p.name === name : name.test(p.name))) {\n      return p;\n    }\n  }\n}\nfunction findProp(node, name, dynamicOnly = false, allowEmpty = false) {\n  for (let i = 0; i < node.props.length; i++) {\n    const p = node.props[i];\n    if (p.type === 6) {\n      if (dynamicOnly)\n        continue;\n      if (p.name === name && (p.value || allowEmpty)) {\n        return p;\n      }\n    } else if (p.name === \"bind\" && (p.exp || allowEmpty) && isStaticArgOf(p.arg, name)) {\n      return p;\n    }\n  }\n}\nfunction isStaticArgOf(arg, name) {\n  return !!(arg && isStaticExp(arg) && arg.content === name);\n}\nfunction hasDynamicKeyVBind(node) {\n  return node.props.some(\n    (p) => p.type === 7 && p.name === \"bind\" && (!p.arg || // v-bind=\"obj\"\n    p.arg.type !== 4 || // v-bind:[_ctx.foo]\n    !p.arg.isStatic)\n    // v-bind:[foo]\n  );\n}\nfunction isText$1(node) {\n  return node.type === 5 || node.type === 2;\n}\nfunction isVSlot(p) {\n  return p.type === 7 && p.name === \"slot\";\n}\nfunction isTemplateNode(node) {\n  return node.type === 1 && node.tagType === 3;\n}\nfunction isSlotOutlet(node) {\n  return node.type === 1 && node.tagType === 2;\n}\nconst propsHelperSet = /* @__PURE__ */ new Set([NORMALIZE_PROPS, GUARD_REACTIVE_PROPS]);\nfunction getUnnormalizedProps(props, callPath = []) {\n  if (props && !isString(props) && props.type === 14) {\n    const callee = props.callee;\n    if (!isString(callee) && propsHelperSet.has(callee)) {\n      return getUnnormalizedProps(\n        props.arguments[0],\n        callPath.concat(props)\n      );\n    }\n  }\n  return [props, callPath];\n}\nfunction injectProp(node, prop, context) {\n  let propsWithInjection;\n  let props = node.type === 13 ? node.props : node.arguments[2];\n  let callPath = [];\n  let parentCall;\n  if (props && !isString(props) && props.type === 14) {\n    const ret = getUnnormalizedProps(props);\n    props = ret[0];\n    callPath = ret[1];\n    parentCall = callPath[callPath.length - 1];\n  }\n  if (props == null || isString(props)) {\n    propsWithInjection = createObjectExpression([prop]);\n  } else if (props.type === 14) {\n    const first = props.arguments[0];\n    if (!isString(first) && first.type === 15) {\n      if (!hasProp(prop, first)) {\n        first.properties.unshift(prop);\n      }\n    } else {\n      if (props.callee === TO_HANDLERS) {\n        propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [\n          createObjectExpression([prop]),\n          props\n        ]);\n      } else {\n        props.arguments.unshift(createObjectExpression([prop]));\n      }\n    }\n    !propsWithInjection && (propsWithInjection = props);\n  } else if (props.type === 15) {\n    if (!hasProp(prop, props)) {\n      props.properties.unshift(prop);\n    }\n    propsWithInjection = props;\n  } else {\n    propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [\n      createObjectExpression([prop]),\n      props\n    ]);\n    if (parentCall && parentCall.callee === GUARD_REACTIVE_PROPS) {\n      parentCall = callPath[callPath.length - 2];\n    }\n  }\n  if (node.type === 13) {\n    if (parentCall) {\n      parentCall.arguments[0] = propsWithInjection;\n    } else {\n      node.props = propsWithInjection;\n    }\n  } else {\n    if (parentCall) {\n      parentCall.arguments[0] = propsWithInjection;\n    } else {\n      node.arguments[2] = propsWithInjection;\n    }\n  }\n}\nfunction hasProp(prop, props) {\n  let result = false;\n  if (prop.key.type === 4) {\n    const propKeyName = prop.key.content;\n    result = props.properties.some(\n      (p) => p.key.type === 4 && p.key.content === propKeyName\n    );\n  }\n  return result;\n}\nfunction toValidAssetId(name, type) {\n  return `_${type}_${name.replace(/[^\\w]/g, (searchValue, replaceValue) => {\n    return searchValue === \"-\" ? \"_\" : name.charCodeAt(replaceValue).toString();\n  })}`;\n}\nfunction hasScopeRef(node, ids) {\n  if (!node || Object.keys(ids).length === 0) {\n    return false;\n  }\n  switch (node.type) {\n    case 1:\n      for (let i = 0; i < node.props.length; i++) {\n        const p = node.props[i];\n        if (p.type === 7 && (hasScopeRef(p.arg, ids) || hasScopeRef(p.exp, ids))) {\n          return true;\n        }\n      }\n      return node.children.some((c) => hasScopeRef(c, ids));\n    case 11:\n      if (hasScopeRef(node.source, ids)) {\n        return true;\n      }\n      return node.children.some((c) => hasScopeRef(c, ids));\n    case 9:\n      return node.branches.some((b) => hasScopeRef(b, ids));\n    case 10:\n      if (hasScopeRef(node.condition, ids)) {\n        return true;\n      }\n      return node.children.some((c) => hasScopeRef(c, ids));\n    case 4:\n      return !node.isStatic && isSimpleIdentifier(node.content) && !!ids[node.content];\n    case 8:\n      return node.children.some((c) => isObject(c) && hasScopeRef(c, ids));\n    case 5:\n    case 12:\n      return hasScopeRef(node.content, ids);\n    case 2:\n    case 3:\n      return false;\n    default:\n      if (!!(process.env.NODE_ENV !== \"production\")) ;\n      return false;\n  }\n}\nfunction getMemoedVNodeCall(node) {\n  if (node.type === 14 && node.callee === WITH_MEMO) {\n    return node.arguments[1].returns;\n  } else {\n    return node;\n  }\n}\nconst forAliasRE = /([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/;\n\nconst defaultParserOptions = {\n  parseMode: \"base\",\n  ns: 0,\n  delimiters: [`{{`, `}}`],\n  getNamespace: () => 0,\n  isVoidTag: NO,\n  isPreTag: NO,\n  isCustomElement: NO,\n  onError: defaultOnError,\n  onWarn: defaultOnWarn,\n  comments: !!(process.env.NODE_ENV !== \"production\"),\n  prefixIdentifiers: false\n};\nlet currentOptions = defaultParserOptions;\nlet currentRoot = null;\nlet currentInput = \"\";\nlet currentOpenTag = null;\nlet currentProp = null;\nlet currentAttrValue = \"\";\nlet currentAttrStartIndex = -1;\nlet currentAttrEndIndex = -1;\nlet inPre = 0;\nlet inVPre = false;\nlet currentVPreBoundary = null;\nconst stack = [];\nconst tokenizer = new Tokenizer(stack, {\n  onerr: emitError,\n  ontext(start, end) {\n    onText(getSlice(start, end), start, end);\n  },\n  ontextentity(char, start, end) {\n    onText(char, start, end);\n  },\n  oninterpolation(start, end) {\n    if (inVPre) {\n      return onText(getSlice(start, end), start, end);\n    }\n    let innerStart = start + tokenizer.delimiterOpen.length;\n    let innerEnd = end - tokenizer.delimiterClose.length;\n    while (isWhitespace(currentInput.charCodeAt(innerStart))) {\n      innerStart++;\n    }\n    while (isWhitespace(currentInput.charCodeAt(innerEnd - 1))) {\n      innerEnd--;\n    }\n    let exp = getSlice(innerStart, innerEnd);\n    if (exp.includes(\"&\")) {\n      {\n        exp = currentOptions.decodeEntities(exp, false);\n      }\n    }\n    addNode({\n      type: 5,\n      content: createExp(exp, false, getLoc(innerStart, innerEnd)),\n      loc: getLoc(start, end)\n    });\n  },\n  onopentagname(start, end) {\n    const name = getSlice(start, end);\n    currentOpenTag = {\n      type: 1,\n      tag: name,\n      ns: currentOptions.getNamespace(name, stack[0], currentOptions.ns),\n      tagType: 0,\n      // will be refined on tag close\n      props: [],\n      children: [],\n      loc: getLoc(start - 1, end),\n      codegenNode: void 0\n    };\n  },\n  onopentagend(end) {\n    endOpenTag(end);\n  },\n  onclosetag(start, end) {\n    const name = getSlice(start, end);\n    if (!currentOptions.isVoidTag(name)) {\n      let found = false;\n      for (let i = 0; i < stack.length; i++) {\n        const e = stack[i];\n        if (e.tag.toLowerCase() === name.toLowerCase()) {\n          found = true;\n          if (i > 0) {\n            emitError(24, stack[0].loc.start.offset);\n          }\n          for (let j = 0; j <= i; j++) {\n            const el = stack.shift();\n            onCloseTag(el, end, j < i);\n          }\n          break;\n        }\n      }\n      if (!found) {\n        emitError(23, backTrack(start, 60));\n      }\n    }\n  },\n  onselfclosingtag(end) {\n    const name = currentOpenTag.tag;\n    currentOpenTag.isSelfClosing = true;\n    endOpenTag(end);\n    if (stack[0] && stack[0].tag === name) {\n      onCloseTag(stack.shift(), end);\n    }\n  },\n  onattribname(start, end) {\n    currentProp = {\n      type: 6,\n      name: getSlice(start, end),\n      nameLoc: getLoc(start, end),\n      value: void 0,\n      loc: getLoc(start)\n    };\n  },\n  ondirname(start, end) {\n    const raw = getSlice(start, end);\n    const name = raw === \".\" || raw === \":\" ? \"bind\" : raw === \"@\" ? \"on\" : raw === \"#\" ? \"slot\" : raw.slice(2);\n    if (!inVPre && name === \"\") {\n      emitError(26, start);\n    }\n    if (inVPre || name === \"\") {\n      currentProp = {\n        type: 6,\n        name: raw,\n        nameLoc: getLoc(start, end),\n        value: void 0,\n        loc: getLoc(start)\n      };\n    } else {\n      currentProp = {\n        type: 7,\n        name,\n        rawName: raw,\n        exp: void 0,\n        arg: void 0,\n        modifiers: raw === \".\" ? [\"prop\"] : [],\n        loc: getLoc(start)\n      };\n      if (name === \"pre\") {\n        inVPre = tokenizer.inVPre = true;\n        currentVPreBoundary = currentOpenTag;\n        const props = currentOpenTag.props;\n        for (let i = 0; i < props.length; i++) {\n          if (props[i].type === 7) {\n            props[i] = dirToAttr(props[i]);\n          }\n        }\n      }\n    }\n  },\n  ondirarg(start, end) {\n    if (start === end)\n      return;\n    const arg = getSlice(start, end);\n    if (inVPre) {\n      currentProp.name += arg;\n      setLocEnd(currentProp.nameLoc, end);\n    } else {\n      const isStatic = arg[0] !== `[`;\n      currentProp.arg = createExp(\n        isStatic ? arg : arg.slice(1, -1),\n        isStatic,\n        getLoc(start, end),\n        isStatic ? 3 : 0\n      );\n    }\n  },\n  ondirmodifier(start, end) {\n    const mod = getSlice(start, end);\n    if (inVPre) {\n      currentProp.name += \".\" + mod;\n      setLocEnd(currentProp.nameLoc, end);\n    } else if (currentProp.name === \"slot\") {\n      const arg = currentProp.arg;\n      if (arg) {\n        arg.content += \".\" + mod;\n        setLocEnd(arg.loc, end);\n      }\n    } else {\n      currentProp.modifiers.push(mod);\n    }\n  },\n  onattribdata(start, end) {\n    currentAttrValue += getSlice(start, end);\n    if (currentAttrStartIndex < 0)\n      currentAttrStartIndex = start;\n    currentAttrEndIndex = end;\n  },\n  onattribentity(char, start, end) {\n    currentAttrValue += char;\n    if (currentAttrStartIndex < 0)\n      currentAttrStartIndex = start;\n    currentAttrEndIndex = end;\n  },\n  onattribnameend(end) {\n    const start = currentProp.loc.start.offset;\n    const name = getSlice(start, end);\n    if (currentProp.type === 7) {\n      currentProp.rawName = name;\n    }\n    if (currentOpenTag.props.some(\n      (p) => (p.type === 7 ? p.rawName : p.name) === name\n    )) {\n      emitError(2, start);\n    }\n  },\n  onattribend(quote, end) {\n    if (currentOpenTag && currentProp) {\n      setLocEnd(currentProp.loc, end);\n      if (quote !== 0) {\n        if (currentAttrValue.includes(\"&\")) {\n          currentAttrValue = currentOptions.decodeEntities(\n            currentAttrValue,\n            true\n          );\n        }\n        if (currentProp.type === 6) {\n          if (currentProp.name === \"class\") {\n            currentAttrValue = condense(currentAttrValue).trim();\n          }\n          if (quote === 1 && !currentAttrValue) {\n            emitError(13, end);\n          }\n          currentProp.value = {\n            type: 2,\n            content: currentAttrValue,\n            loc: quote === 1 ? getLoc(currentAttrStartIndex, currentAttrEndIndex) : getLoc(currentAttrStartIndex - 1, currentAttrEndIndex + 1)\n          };\n          if (tokenizer.inSFCRoot && currentOpenTag.tag === \"template\" && currentProp.name === \"lang\" && currentAttrValue && currentAttrValue !== \"html\") {\n            tokenizer.enterRCDATA(toCharCodes(`</template`), 0);\n          }\n        } else {\n          let expParseMode = 0 /* Normal */;\n          currentProp.exp = createExp(\n            currentAttrValue,\n            false,\n            getLoc(currentAttrStartIndex, currentAttrEndIndex),\n            0,\n            expParseMode\n          );\n          if (currentProp.name === \"for\") {\n            currentProp.forParseResult = parseForExpression(currentProp.exp);\n          }\n          let syncIndex = -1;\n          if (currentProp.name === \"bind\" && (syncIndex = currentProp.modifiers.indexOf(\"sync\")) > -1 && checkCompatEnabled(\n            \"COMPILER_V_BIND_SYNC\",\n            currentOptions,\n            currentProp.loc,\n            currentProp.rawName\n          )) {\n            currentProp.name = \"model\";\n            currentProp.modifiers.splice(syncIndex, 1);\n          }\n        }\n      }\n      if (currentProp.type !== 7 || currentProp.name !== \"pre\") {\n        currentOpenTag.props.push(currentProp);\n      }\n    }\n    currentAttrValue = \"\";\n    currentAttrStartIndex = currentAttrEndIndex = -1;\n  },\n  oncomment(start, end) {\n    if (currentOptions.comments) {\n      addNode({\n        type: 3,\n        content: getSlice(start, end),\n        loc: getLoc(start - 4, end + 3)\n      });\n    }\n  },\n  onend() {\n    const end = currentInput.length;\n    if ((!!(process.env.NODE_ENV !== \"production\") || false) && tokenizer.state !== 1) {\n      switch (tokenizer.state) {\n        case 5:\n        case 8:\n          emitError(5, end);\n          break;\n        case 3:\n        case 4:\n          emitError(\n            25,\n            tokenizer.sectionStart\n          );\n          break;\n        case 28:\n          if (tokenizer.currentSequence === Sequences.CdataEnd) {\n            emitError(6, end);\n          } else {\n            emitError(7, end);\n          }\n          break;\n        case 6:\n        case 7:\n        case 9:\n        case 11:\n        case 12:\n        case 13:\n        case 14:\n        case 15:\n        case 16:\n        case 17:\n        case 18:\n        case 19:\n        case 20:\n        case 21:\n          emitError(9, end);\n          break;\n      }\n    }\n    for (let index = 0; index < stack.length; index++) {\n      onCloseTag(stack[index], end - 1);\n      emitError(24, stack[index].loc.start.offset);\n    }\n  },\n  oncdata(start, end) {\n    if (stack[0].ns !== 0) {\n      onText(getSlice(start, end), start, end);\n    } else {\n      emitError(1, start - 9);\n    }\n  },\n  onprocessinginstruction(start) {\n    if ((stack[0] ? stack[0].ns : currentOptions.ns) === 0) {\n      emitError(\n        21,\n        start - 1\n      );\n    }\n  }\n});\nconst forIteratorRE = /,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/;\nconst stripParensRE = /^\\(|\\)$/g;\nfunction parseForExpression(input) {\n  const loc = input.loc;\n  const exp = input.content;\n  const inMatch = exp.match(forAliasRE);\n  if (!inMatch)\n    return;\n  const [, LHS, RHS] = inMatch;\n  const createAliasExpression = (content, offset, asParam = false) => {\n    const start = loc.start.offset + offset;\n    const end = start + content.length;\n    return createExp(\n      content,\n      false,\n      getLoc(start, end),\n      0,\n      asParam ? 1 /* Params */ : 0 /* Normal */\n    );\n  };\n  const result = {\n    source: createAliasExpression(RHS.trim(), exp.indexOf(RHS, LHS.length)),\n    value: void 0,\n    key: void 0,\n    index: void 0,\n    finalized: false\n  };\n  let valueContent = LHS.trim().replace(stripParensRE, \"\").trim();\n  const trimmedOffset = LHS.indexOf(valueContent);\n  const iteratorMatch = valueContent.match(forIteratorRE);\n  if (iteratorMatch) {\n    valueContent = valueContent.replace(forIteratorRE, \"\").trim();\n    const keyContent = iteratorMatch[1].trim();\n    let keyOffset;\n    if (keyContent) {\n      keyOffset = exp.indexOf(keyContent, trimmedOffset + valueContent.length);\n      result.key = createAliasExpression(keyContent, keyOffset, true);\n    }\n    if (iteratorMatch[2]) {\n      const indexContent = iteratorMatch[2].trim();\n      if (indexContent) {\n        result.index = createAliasExpression(\n          indexContent,\n          exp.indexOf(\n            indexContent,\n            result.key ? keyOffset + keyContent.length : trimmedOffset + valueContent.length\n          ),\n          true\n        );\n      }\n    }\n  }\n  if (valueContent) {\n    result.value = createAliasExpression(valueContent, trimmedOffset, true);\n  }\n  return result;\n}\nfunction getSlice(start, end) {\n  return currentInput.slice(start, end);\n}\nfunction endOpenTag(end) {\n  if (tokenizer.inSFCRoot) {\n    currentOpenTag.innerLoc = getLoc(end + 1, end + 1);\n  }\n  addNode(currentOpenTag);\n  const { tag, ns } = currentOpenTag;\n  if (ns === 0 && currentOptions.isPreTag(tag)) {\n    inPre++;\n  }\n  if (currentOptions.isVoidTag(tag)) {\n    onCloseTag(currentOpenTag, end);\n  } else {\n    stack.unshift(currentOpenTag);\n    if (ns === 1 || ns === 2) {\n      tokenizer.inXML = true;\n    }\n  }\n  currentOpenTag = null;\n}\nfunction onText(content, start, end) {\n  {\n    const tag = stack[0] && stack[0].tag;\n    if (tag !== \"script\" && tag !== \"style\" && content.includes(\"&\")) {\n      content = currentOptions.decodeEntities(content, false);\n    }\n  }\n  const parent = stack[0] || currentRoot;\n  const lastNode = parent.children[parent.children.length - 1];\n  if (lastNode && lastNode.type === 2) {\n    lastNode.content += content;\n    setLocEnd(lastNode.loc, end);\n  } else {\n    parent.children.push({\n      type: 2,\n      content,\n      loc: getLoc(start, end)\n    });\n  }\n}\nfunction onCloseTag(el, end, isImplied = false) {\n  if (isImplied) {\n    setLocEnd(el.loc, backTrack(end, 60));\n  } else {\n    setLocEnd(el.loc, lookAhead(end, 62) + 1);\n  }\n  if (tokenizer.inSFCRoot) {\n    if (el.children.length) {\n      el.innerLoc.end = extend({}, el.children[el.children.length - 1].loc.end);\n    } else {\n      el.innerLoc.end = extend({}, el.innerLoc.start);\n    }\n    el.innerLoc.source = getSlice(\n      el.innerLoc.start.offset,\n      el.innerLoc.end.offset\n    );\n  }\n  const { tag, ns } = el;\n  if (!inVPre) {\n    if (tag === \"slot\") {\n      el.tagType = 2;\n    } else if (isFragmentTemplate(el)) {\n      el.tagType = 3;\n    } else if (isComponent(el)) {\n      el.tagType = 1;\n    }\n  }\n  if (!tokenizer.inRCDATA) {\n    el.children = condenseWhitespace(el.children, el.tag);\n  }\n  if (ns === 0 && currentOptions.isPreTag(tag)) {\n    inPre--;\n  }\n  if (currentVPreBoundary === el) {\n    inVPre = tokenizer.inVPre = false;\n    currentVPreBoundary = null;\n  }\n  if (tokenizer.inXML && (stack[0] ? stack[0].ns : currentOptions.ns) === 0) {\n    tokenizer.inXML = false;\n  }\n  {\n    const props = el.props;\n    if (!!(process.env.NODE_ENV !== \"production\") && isCompatEnabled(\n      \"COMPILER_V_IF_V_FOR_PRECEDENCE\",\n      currentOptions\n    )) {\n      let hasIf = false;\n      let hasFor = false;\n      for (let i = 0; i < props.length; i++) {\n        const p = props[i];\n        if (p.type === 7) {\n          if (p.name === \"if\") {\n            hasIf = true;\n          } else if (p.name === \"for\") {\n            hasFor = true;\n          }\n        }\n        if (hasIf && hasFor) {\n          warnDeprecation(\n            \"COMPILER_V_IF_V_FOR_PRECEDENCE\",\n            currentOptions,\n            el.loc\n          );\n          break;\n        }\n      }\n    }\n    if (!tokenizer.inSFCRoot && isCompatEnabled(\n      \"COMPILER_NATIVE_TEMPLATE\",\n      currentOptions\n    ) && el.tag === \"template\" && !isFragmentTemplate(el)) {\n      !!(process.env.NODE_ENV !== \"production\") && warnDeprecation(\n        \"COMPILER_NATIVE_TEMPLATE\",\n        currentOptions,\n        el.loc\n      );\n      const parent = stack[0] || currentRoot;\n      const index = parent.children.indexOf(el);\n      parent.children.splice(index, 1, ...el.children);\n    }\n    const inlineTemplateProp = props.find(\n      (p) => p.type === 6 && p.name === \"inline-template\"\n    );\n    if (inlineTemplateProp && checkCompatEnabled(\n      \"COMPILER_INLINE_TEMPLATE\",\n      currentOptions,\n      inlineTemplateProp.loc\n    ) && el.children.length) {\n      inlineTemplateProp.value = {\n        type: 2,\n        content: getSlice(\n          el.children[0].loc.start.offset,\n          el.children[el.children.length - 1].loc.end.offset\n        ),\n        loc: inlineTemplateProp.loc\n      };\n    }\n  }\n}\nfunction lookAhead(index, c) {\n  let i = index;\n  while (currentInput.charCodeAt(i) !== c && i < currentInput.length - 1)\n    i++;\n  return i;\n}\nfunction backTrack(index, c) {\n  let i = index;\n  while (currentInput.charCodeAt(i) !== c && i >= 0)\n    i--;\n  return i;\n}\nconst specialTemplateDir = /* @__PURE__ */ new Set([\"if\", \"else\", \"else-if\", \"for\", \"slot\"]);\nfunction isFragmentTemplate({ tag, props }) {\n  if (tag === \"template\") {\n    for (let i = 0; i < props.length; i++) {\n      if (props[i].type === 7 && specialTemplateDir.has(props[i].name)) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\nfunction isComponent({ tag, props }) {\n  if (currentOptions.isCustomElement(tag)) {\n    return false;\n  }\n  if (tag === \"component\" || isUpperCase(tag.charCodeAt(0)) || isCoreComponent(tag) || currentOptions.isBuiltInComponent && currentOptions.isBuiltInComponent(tag) || currentOptions.isNativeTag && !currentOptions.isNativeTag(tag)) {\n    return true;\n  }\n  for (let i = 0; i < props.length; i++) {\n    const p = props[i];\n    if (p.type === 6) {\n      if (p.name === \"is\" && p.value) {\n        if (p.value.content.startsWith(\"vue:\")) {\n          return true;\n        } else if (checkCompatEnabled(\n          \"COMPILER_IS_ON_ELEMENT\",\n          currentOptions,\n          p.loc\n        )) {\n          return true;\n        }\n      }\n    } else if (// :is on plain element - only treat as component in compat mode\n    p.name === \"bind\" && isStaticArgOf(p.arg, \"is\") && checkCompatEnabled(\n      \"COMPILER_IS_ON_ELEMENT\",\n      currentOptions,\n      p.loc\n    )) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction isUpperCase(c) {\n  return c > 64 && c < 91;\n}\nconst windowsNewlineRE = /\\r\\n/g;\nfunction condenseWhitespace(nodes, tag) {\n  const shouldCondense = currentOptions.whitespace !== \"preserve\";\n  let removedWhitespace = false;\n  for (let i = 0; i < nodes.length; i++) {\n    const node = nodes[i];\n    if (node.type === 2) {\n      if (!inPre) {\n        if (isAllWhitespace(node.content)) {\n          const prev = nodes[i - 1] && nodes[i - 1].type;\n          const next = nodes[i + 1] && nodes[i + 1].type;\n          if (!prev || !next || shouldCondense && (prev === 3 && (next === 3 || next === 1) || prev === 1 && (next === 3 || next === 1 && hasNewlineChar(node.content)))) {\n            removedWhitespace = true;\n            nodes[i] = null;\n          } else {\n            node.content = \" \";\n          }\n        } else if (shouldCondense) {\n          node.content = condense(node.content);\n        }\n      } else {\n        node.content = node.content.replace(windowsNewlineRE, \"\\n\");\n      }\n    }\n  }\n  if (inPre && tag && currentOptions.isPreTag(tag)) {\n    const first = nodes[0];\n    if (first && first.type === 2) {\n      first.content = first.content.replace(/^\\r?\\n/, \"\");\n    }\n  }\n  return removedWhitespace ? nodes.filter(Boolean) : nodes;\n}\nfunction isAllWhitespace(str) {\n  for (let i = 0; i < str.length; i++) {\n    if (!isWhitespace(str.charCodeAt(i))) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction hasNewlineChar(str) {\n  for (let i = 0; i < str.length; i++) {\n    const c = str.charCodeAt(i);\n    if (c === 10 || c === 13) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction condense(str) {\n  let ret = \"\";\n  let prevCharIsWhitespace = false;\n  for (let i = 0; i < str.length; i++) {\n    if (isWhitespace(str.charCodeAt(i))) {\n      if (!prevCharIsWhitespace) {\n        ret += \" \";\n        prevCharIsWhitespace = true;\n      }\n    } else {\n      ret += str[i];\n      prevCharIsWhitespace = false;\n    }\n  }\n  return ret;\n}\nfunction addNode(node) {\n  (stack[0] || currentRoot).children.push(node);\n}\nfunction getLoc(start, end) {\n  return {\n    start: tokenizer.getPos(start),\n    // @ts-expect-error allow late attachment\n    end: end == null ? end : tokenizer.getPos(end),\n    // @ts-expect-error allow late attachment\n    source: end == null ? end : getSlice(start, end)\n  };\n}\nfunction setLocEnd(loc, end) {\n  loc.end = tokenizer.getPos(end);\n  loc.source = getSlice(loc.start.offset, end);\n}\nfunction dirToAttr(dir) {\n  const attr = {\n    type: 6,\n    name: dir.rawName,\n    nameLoc: getLoc(\n      dir.loc.start.offset,\n      dir.loc.start.offset + dir.rawName.length\n    ),\n    value: void 0,\n    loc: dir.loc\n  };\n  if (dir.exp) {\n    const loc = dir.exp.loc;\n    if (loc.end.offset < dir.loc.end.offset) {\n      loc.start.offset--;\n      loc.start.column--;\n      loc.end.offset++;\n      loc.end.column++;\n    }\n    attr.value = {\n      type: 2,\n      content: dir.exp.content,\n      loc\n    };\n  }\n  return attr;\n}\nfunction createExp(content, isStatic = false, loc, constType = 0, parseMode = 0 /* Normal */) {\n  const exp = createSimpleExpression(content, isStatic, loc, constType);\n  return exp;\n}\nfunction emitError(code, index, message) {\n  currentOptions.onError(\n    createCompilerError(code, getLoc(index, index), void 0, message)\n  );\n}\nfunction reset() {\n  tokenizer.reset();\n  currentOpenTag = null;\n  currentProp = null;\n  currentAttrValue = \"\";\n  currentAttrStartIndex = -1;\n  currentAttrEndIndex = -1;\n  stack.length = 0;\n}\nfunction baseParse(input, options) {\n  reset();\n  currentInput = input;\n  currentOptions = extend({}, defaultParserOptions);\n  if (options) {\n    let key;\n    for (key in options) {\n      if (options[key] != null) {\n        currentOptions[key] = options[key];\n      }\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    if (!currentOptions.decodeEntities) {\n      throw new Error(\n        `[@vue/compiler-core] decodeEntities option is required in browser builds.`\n      );\n    }\n  }\n  tokenizer.mode = currentOptions.parseMode === \"html\" ? 1 : currentOptions.parseMode === \"sfc\" ? 2 : 0;\n  tokenizer.inXML = currentOptions.ns === 1 || currentOptions.ns === 2;\n  const delimiters = options && options.delimiters;\n  if (delimiters) {\n    tokenizer.delimiterOpen = toCharCodes(delimiters[0]);\n    tokenizer.delimiterClose = toCharCodes(delimiters[1]);\n  }\n  const root = currentRoot = createRoot([], input);\n  tokenizer.parse(currentInput);\n  root.loc = getLoc(0, input.length);\n  root.children = condenseWhitespace(root.children);\n  currentRoot = null;\n  return root;\n}\n\nfunction hoistStatic(root, context) {\n  walk(\n    root,\n    context,\n    // Root node is unfortunately non-hoistable due to potential parent\n    // fallthrough attributes.\n    isSingleElementRoot(root, root.children[0])\n  );\n}\nfunction isSingleElementRoot(root, child) {\n  const { children } = root;\n  return children.length === 1 && child.type === 1 && !isSlotOutlet(child);\n}\nfunction walk(node, context, doNotHoistNode = false) {\n  const { children } = node;\n  const originalCount = children.length;\n  let hoistedCount = 0;\n  for (let i = 0; i < children.length; i++) {\n    const child = children[i];\n    if (child.type === 1 && child.tagType === 0) {\n      const constantType = doNotHoistNode ? 0 : getConstantType(child, context);\n      if (constantType > 0) {\n        if (constantType >= 2) {\n          child.codegenNode.patchFlag = -1 + (!!(process.env.NODE_ENV !== \"production\") ? ` /* HOISTED */` : ``);\n          child.codegenNode = context.hoist(child.codegenNode);\n          hoistedCount++;\n          continue;\n        }\n      } else {\n        const codegenNode = child.codegenNode;\n        if (codegenNode.type === 13) {\n          const flag = getPatchFlag(codegenNode);\n          if ((!flag || flag === 512 || flag === 1) && getGeneratedPropsConstantType(child, context) >= 2) {\n            const props = getNodeProps(child);\n            if (props) {\n              codegenNode.props = context.hoist(props);\n            }\n          }\n          if (codegenNode.dynamicProps) {\n            codegenNode.dynamicProps = context.hoist(codegenNode.dynamicProps);\n          }\n        }\n      }\n    }\n    if (child.type === 1) {\n      const isComponent = child.tagType === 1;\n      if (isComponent) {\n        context.scopes.vSlot++;\n      }\n      walk(child, context);\n      if (isComponent) {\n        context.scopes.vSlot--;\n      }\n    } else if (child.type === 11) {\n      walk(child, context, child.children.length === 1);\n    } else if (child.type === 9) {\n      for (let i2 = 0; i2 < child.branches.length; i2++) {\n        walk(\n          child.branches[i2],\n          context,\n          child.branches[i2].children.length === 1\n        );\n      }\n    }\n  }\n  if (hoistedCount && context.transformHoist) {\n    context.transformHoist(children, context, node);\n  }\n  if (hoistedCount && hoistedCount === originalCount && node.type === 1 && node.tagType === 0 && node.codegenNode && node.codegenNode.type === 13 && isArray(node.codegenNode.children)) {\n    const hoisted = context.hoist(\n      createArrayExpression(node.codegenNode.children)\n    );\n    if (context.hmr) {\n      hoisted.content = `[...${hoisted.content}]`;\n    }\n    node.codegenNode.children = hoisted;\n  }\n}\nfunction getConstantType(node, context) {\n  const { constantCache } = context;\n  switch (node.type) {\n    case 1:\n      if (node.tagType !== 0) {\n        return 0;\n      }\n      const cached = constantCache.get(node);\n      if (cached !== void 0) {\n        return cached;\n      }\n      const codegenNode = node.codegenNode;\n      if (codegenNode.type !== 13) {\n        return 0;\n      }\n      if (codegenNode.isBlock && node.tag !== \"svg\" && node.tag !== \"foreignObject\") {\n        return 0;\n      }\n      const flag = getPatchFlag(codegenNode);\n      if (!flag) {\n        let returnType2 = 3;\n        const generatedPropsType = getGeneratedPropsConstantType(node, context);\n        if (generatedPropsType === 0) {\n          constantCache.set(node, 0);\n          return 0;\n        }\n        if (generatedPropsType < returnType2) {\n          returnType2 = generatedPropsType;\n        }\n        for (let i = 0; i < node.children.length; i++) {\n          const childType = getConstantType(node.children[i], context);\n          if (childType === 0) {\n            constantCache.set(node, 0);\n            return 0;\n          }\n          if (childType < returnType2) {\n            returnType2 = childType;\n          }\n        }\n        if (returnType2 > 1) {\n          for (let i = 0; i < node.props.length; i++) {\n            const p = node.props[i];\n            if (p.type === 7 && p.name === \"bind\" && p.exp) {\n              const expType = getConstantType(p.exp, context);\n              if (expType === 0) {\n                constantCache.set(node, 0);\n                return 0;\n              }\n              if (expType < returnType2) {\n                returnType2 = expType;\n              }\n            }\n          }\n        }\n        if (codegenNode.isBlock) {\n          for (let i = 0; i < node.props.length; i++) {\n            const p = node.props[i];\n            if (p.type === 7) {\n              constantCache.set(node, 0);\n              return 0;\n            }\n          }\n          context.removeHelper(OPEN_BLOCK);\n          context.removeHelper(\n            getVNodeBlockHelper(context.inSSR, codegenNode.isComponent)\n          );\n          codegenNode.isBlock = false;\n          context.helper(getVNodeHelper(context.inSSR, codegenNode.isComponent));\n        }\n        constantCache.set(node, returnType2);\n        return returnType2;\n      } else {\n        constantCache.set(node, 0);\n        return 0;\n      }\n    case 2:\n    case 3:\n      return 3;\n    case 9:\n    case 11:\n    case 10:\n      return 0;\n    case 5:\n    case 12:\n      return getConstantType(node.content, context);\n    case 4:\n      return node.constType;\n    case 8:\n      let returnType = 3;\n      for (let i = 0; i < node.children.length; i++) {\n        const child = node.children[i];\n        if (isString(child) || isSymbol(child)) {\n          continue;\n        }\n        const childType = getConstantType(child, context);\n        if (childType === 0) {\n          return 0;\n        } else if (childType < returnType) {\n          returnType = childType;\n        }\n      }\n      return returnType;\n    default:\n      if (!!(process.env.NODE_ENV !== \"production\")) ;\n      return 0;\n  }\n}\nconst allowHoistedHelperSet = /* @__PURE__ */ new Set([\n  NORMALIZE_CLASS,\n  NORMALIZE_STYLE,\n  NORMALIZE_PROPS,\n  GUARD_REACTIVE_PROPS\n]);\nfunction getConstantTypeOfHelperCall(value, context) {\n  if (value.type === 14 && !isString(value.callee) && allowHoistedHelperSet.has(value.callee)) {\n    const arg = value.arguments[0];\n    if (arg.type === 4) {\n      return getConstantType(arg, context);\n    } else if (arg.type === 14) {\n      return getConstantTypeOfHelperCall(arg, context);\n    }\n  }\n  return 0;\n}\nfunction getGeneratedPropsConstantType(node, context) {\n  let returnType = 3;\n  const props = getNodeProps(node);\n  if (props && props.type === 15) {\n    const { properties } = props;\n    for (let i = 0; i < properties.length; i++) {\n      const { key, value } = properties[i];\n      const keyType = getConstantType(key, context);\n      if (keyType === 0) {\n        return keyType;\n      }\n      if (keyType < returnType) {\n        returnType = keyType;\n      }\n      let valueType;\n      if (value.type === 4) {\n        valueType = getConstantType(value, context);\n      } else if (value.type === 14) {\n        valueType = getConstantTypeOfHelperCall(value, context);\n      } else {\n        valueType = 0;\n      }\n      if (valueType === 0) {\n        return valueType;\n      }\n      if (valueType < returnType) {\n        returnType = valueType;\n      }\n    }\n  }\n  return returnType;\n}\nfunction getNodeProps(node) {\n  const codegenNode = node.codegenNode;\n  if (codegenNode.type === 13) {\n    return codegenNode.props;\n  }\n}\nfunction getPatchFlag(node) {\n  const flag = node.patchFlag;\n  return flag ? parseInt(flag, 10) : void 0;\n}\n\nfunction createTransformContext(root, {\n  filename = \"\",\n  prefixIdentifiers = false,\n  hoistStatic: hoistStatic2 = false,\n  hmr = false,\n  cacheHandlers = false,\n  nodeTransforms = [],\n  directiveTransforms = {},\n  transformHoist = null,\n  isBuiltInComponent = NOOP,\n  isCustomElement = NOOP,\n  expressionPlugins = [],\n  scopeId = null,\n  slotted = true,\n  ssr = false,\n  inSSR = false,\n  ssrCssVars = ``,\n  bindingMetadata = EMPTY_OBJ,\n  inline = false,\n  isTS = false,\n  onError = defaultOnError,\n  onWarn = defaultOnWarn,\n  compatConfig\n}) {\n  const nameMatch = filename.replace(/\\?.*$/, \"\").match(/([^/\\\\]+)\\.\\w+$/);\n  const context = {\n    // options\n    filename,\n    selfName: nameMatch && capitalize(camelize(nameMatch[1])),\n    prefixIdentifiers,\n    hoistStatic: hoistStatic2,\n    hmr,\n    cacheHandlers,\n    nodeTransforms,\n    directiveTransforms,\n    transformHoist,\n    isBuiltInComponent,\n    isCustomElement,\n    expressionPlugins,\n    scopeId,\n    slotted,\n    ssr,\n    inSSR,\n    ssrCssVars,\n    bindingMetadata,\n    inline,\n    isTS,\n    onError,\n    onWarn,\n    compatConfig,\n    // state\n    root,\n    helpers: /* @__PURE__ */ new Map(),\n    components: /* @__PURE__ */ new Set(),\n    directives: /* @__PURE__ */ new Set(),\n    hoists: [],\n    imports: [],\n    constantCache: /* @__PURE__ */ new WeakMap(),\n    temps: 0,\n    cached: 0,\n    identifiers: /* @__PURE__ */ Object.create(null),\n    scopes: {\n      vFor: 0,\n      vSlot: 0,\n      vPre: 0,\n      vOnce: 0\n    },\n    parent: null,\n    grandParent: null,\n    currentNode: root,\n    childIndex: 0,\n    inVOnce: false,\n    // methods\n    helper(name) {\n      const count = context.helpers.get(name) || 0;\n      context.helpers.set(name, count + 1);\n      return name;\n    },\n    removeHelper(name) {\n      const count = context.helpers.get(name);\n      if (count) {\n        const currentCount = count - 1;\n        if (!currentCount) {\n          context.helpers.delete(name);\n        } else {\n          context.helpers.set(name, currentCount);\n        }\n      }\n    },\n    helperString(name) {\n      return `_${helperNameMap[context.helper(name)]}`;\n    },\n    replaceNode(node) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (!context.currentNode) {\n          throw new Error(`Node being replaced is already removed.`);\n        }\n        if (!context.parent) {\n          throw new Error(`Cannot replace root node.`);\n        }\n      }\n      context.parent.children[context.childIndex] = context.currentNode = node;\n    },\n    removeNode(node) {\n      if (!!(process.env.NODE_ENV !== \"production\") && !context.parent) {\n        throw new Error(`Cannot remove root node.`);\n      }\n      const list = context.parent.children;\n      const removalIndex = node ? list.indexOf(node) : context.currentNode ? context.childIndex : -1;\n      if (!!(process.env.NODE_ENV !== \"production\") && removalIndex < 0) {\n        throw new Error(`node being removed is not a child of current parent`);\n      }\n      if (!node || node === context.currentNode) {\n        context.currentNode = null;\n        context.onNodeRemoved();\n      } else {\n        if (context.childIndex > removalIndex) {\n          context.childIndex--;\n          context.onNodeRemoved();\n        }\n      }\n      context.parent.children.splice(removalIndex, 1);\n    },\n    onNodeRemoved: NOOP,\n    addIdentifiers(exp) {\n    },\n    removeIdentifiers(exp) {\n    },\n    hoist(exp) {\n      if (isString(exp))\n        exp = createSimpleExpression(exp);\n      context.hoists.push(exp);\n      const identifier = createSimpleExpression(\n        `_hoisted_${context.hoists.length}`,\n        false,\n        exp.loc,\n        2\n      );\n      identifier.hoisted = exp;\n      return identifier;\n    },\n    cache(exp, isVNode = false) {\n      return createCacheExpression(context.cached++, exp, isVNode);\n    }\n  };\n  {\n    context.filters = /* @__PURE__ */ new Set();\n  }\n  return context;\n}\nfunction transform(root, options) {\n  const context = createTransformContext(root, options);\n  traverseNode(root, context);\n  if (options.hoistStatic) {\n    hoistStatic(root, context);\n  }\n  if (!options.ssr) {\n    createRootCodegen(root, context);\n  }\n  root.helpers = /* @__PURE__ */ new Set([...context.helpers.keys()]);\n  root.components = [...context.components];\n  root.directives = [...context.directives];\n  root.imports = context.imports;\n  root.hoists = context.hoists;\n  root.temps = context.temps;\n  root.cached = context.cached;\n  root.transformed = true;\n  {\n    root.filters = [...context.filters];\n  }\n}\nfunction createRootCodegen(root, context) {\n  const { helper } = context;\n  const { children } = root;\n  if (children.length === 1) {\n    const child = children[0];\n    if (isSingleElementRoot(root, child) && child.codegenNode) {\n      const codegenNode = child.codegenNode;\n      if (codegenNode.type === 13) {\n        convertToBlock(codegenNode, context);\n      }\n      root.codegenNode = codegenNode;\n    } else {\n      root.codegenNode = child;\n    }\n  } else if (children.length > 1) {\n    let patchFlag = 64;\n    let patchFlagText = PatchFlagNames[64];\n    if (!!(process.env.NODE_ENV !== \"production\") && children.filter((c) => c.type !== 3).length === 1) {\n      patchFlag |= 2048;\n      patchFlagText += `, ${PatchFlagNames[2048]}`;\n    }\n    root.codegenNode = createVNodeCall(\n      context,\n      helper(FRAGMENT),\n      void 0,\n      root.children,\n      patchFlag + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${patchFlagText} */` : ``),\n      void 0,\n      void 0,\n      true,\n      void 0,\n      false\n    );\n  } else ;\n}\nfunction traverseChildren(parent, context) {\n  let i = 0;\n  const nodeRemoved = () => {\n    i--;\n  };\n  for (; i < parent.children.length; i++) {\n    const child = parent.children[i];\n    if (isString(child))\n      continue;\n    context.grandParent = context.parent;\n    context.parent = parent;\n    context.childIndex = i;\n    context.onNodeRemoved = nodeRemoved;\n    traverseNode(child, context);\n  }\n}\nfunction traverseNode(node, context) {\n  context.currentNode = node;\n  const { nodeTransforms } = context;\n  const exitFns = [];\n  for (let i2 = 0; i2 < nodeTransforms.length; i2++) {\n    const onExit = nodeTransforms[i2](node, context);\n    if (onExit) {\n      if (isArray(onExit)) {\n        exitFns.push(...onExit);\n      } else {\n        exitFns.push(onExit);\n      }\n    }\n    if (!context.currentNode) {\n      return;\n    } else {\n      node = context.currentNode;\n    }\n  }\n  switch (node.type) {\n    case 3:\n      if (!context.ssr) {\n        context.helper(CREATE_COMMENT);\n      }\n      break;\n    case 5:\n      if (!context.ssr) {\n        context.helper(TO_DISPLAY_STRING);\n      }\n      break;\n    case 9:\n      for (let i2 = 0; i2 < node.branches.length; i2++) {\n        traverseNode(node.branches[i2], context);\n      }\n      break;\n    case 10:\n    case 11:\n    case 1:\n    case 0:\n      traverseChildren(node, context);\n      break;\n  }\n  context.currentNode = node;\n  let i = exitFns.length;\n  while (i--) {\n    exitFns[i]();\n  }\n}\nfunction createStructuralDirectiveTransform(name, fn) {\n  const matches = isString(name) ? (n) => n === name : (n) => name.test(n);\n  return (node, context) => {\n    if (node.type === 1) {\n      const { props } = node;\n      if (node.tagType === 3 && props.some(isVSlot)) {\n        return;\n      }\n      const exitFns = [];\n      for (let i = 0; i < props.length; i++) {\n        const prop = props[i];\n        if (prop.type === 7 && matches(prop.name)) {\n          props.splice(i, 1);\n          i--;\n          const onExit = fn(node, prop, context);\n          if (onExit)\n            exitFns.push(onExit);\n        }\n      }\n      return exitFns;\n    }\n  };\n}\n\nconst PURE_ANNOTATION = `/*#__PURE__*/`;\nconst aliasHelper = (s) => `${helperNameMap[s]}: _${helperNameMap[s]}`;\nfunction createCodegenContext(ast, {\n  mode = \"function\",\n  prefixIdentifiers = mode === \"module\",\n  sourceMap = false,\n  filename = `template.vue.html`,\n  scopeId = null,\n  optimizeImports = false,\n  runtimeGlobalName = `Vue`,\n  runtimeModuleName = `vue`,\n  ssrRuntimeModuleName = \"vue/server-renderer\",\n  ssr = false,\n  isTS = false,\n  inSSR = false\n}) {\n  const context = {\n    mode,\n    prefixIdentifiers,\n    sourceMap,\n    filename,\n    scopeId,\n    optimizeImports,\n    runtimeGlobalName,\n    runtimeModuleName,\n    ssrRuntimeModuleName,\n    ssr,\n    isTS,\n    inSSR,\n    source: ast.source,\n    code: ``,\n    column: 1,\n    line: 1,\n    offset: 0,\n    indentLevel: 0,\n    pure: false,\n    map: void 0,\n    helper(key) {\n      return `_${helperNameMap[key]}`;\n    },\n    push(code, newlineIndex = -2 /* None */, node) {\n      context.code += code;\n    },\n    indent() {\n      newline(++context.indentLevel);\n    },\n    deindent(withoutNewLine = false) {\n      if (withoutNewLine) {\n        --context.indentLevel;\n      } else {\n        newline(--context.indentLevel);\n      }\n    },\n    newline() {\n      newline(context.indentLevel);\n    }\n  };\n  function newline(n) {\n    context.push(\"\\n\" + `  `.repeat(n), 0 /* Start */);\n  }\n  return context;\n}\nfunction generate(ast, options = {}) {\n  const context = createCodegenContext(ast, options);\n  if (options.onContextCreated)\n    options.onContextCreated(context);\n  const {\n    mode,\n    push,\n    prefixIdentifiers,\n    indent,\n    deindent,\n    newline,\n    scopeId,\n    ssr\n  } = context;\n  const helpers = Array.from(ast.helpers);\n  const hasHelpers = helpers.length > 0;\n  const useWithBlock = !prefixIdentifiers && mode !== \"module\";\n  const preambleContext = context;\n  {\n    genFunctionPreamble(ast, preambleContext);\n  }\n  const functionName = ssr ? `ssrRender` : `render`;\n  const args = ssr ? [\"_ctx\", \"_push\", \"_parent\", \"_attrs\"] : [\"_ctx\", \"_cache\"];\n  const signature = args.join(\", \");\n  {\n    push(`function ${functionName}(${signature}) {`);\n  }\n  indent();\n  if (useWithBlock) {\n    push(`with (_ctx) {`);\n    indent();\n    if (hasHelpers) {\n      push(\n        `const { ${helpers.map(aliasHelper).join(\", \")} } = _Vue\n`,\n        -1 /* End */\n      );\n      newline();\n    }\n  }\n  if (ast.components.length) {\n    genAssets(ast.components, \"component\", context);\n    if (ast.directives.length || ast.temps > 0) {\n      newline();\n    }\n  }\n  if (ast.directives.length) {\n    genAssets(ast.directives, \"directive\", context);\n    if (ast.temps > 0) {\n      newline();\n    }\n  }\n  if (ast.filters && ast.filters.length) {\n    newline();\n    genAssets(ast.filters, \"filter\", context);\n    newline();\n  }\n  if (ast.temps > 0) {\n    push(`let `);\n    for (let i = 0; i < ast.temps; i++) {\n      push(`${i > 0 ? `, ` : ``}_temp${i}`);\n    }\n  }\n  if (ast.components.length || ast.directives.length || ast.temps) {\n    push(`\n`, 0 /* Start */);\n    newline();\n  }\n  if (!ssr) {\n    push(`return `);\n  }\n  if (ast.codegenNode) {\n    genNode(ast.codegenNode, context);\n  } else {\n    push(`null`);\n  }\n  if (useWithBlock) {\n    deindent();\n    push(`}`);\n  }\n  deindent();\n  push(`}`);\n  return {\n    ast,\n    code: context.code,\n    preamble: ``,\n    map: context.map ? context.map.toJSON() : void 0\n  };\n}\nfunction genFunctionPreamble(ast, context) {\n  const {\n    ssr,\n    prefixIdentifiers,\n    push,\n    newline,\n    runtimeModuleName,\n    runtimeGlobalName,\n    ssrRuntimeModuleName\n  } = context;\n  const VueBinding = runtimeGlobalName;\n  const helpers = Array.from(ast.helpers);\n  if (helpers.length > 0) {\n    {\n      push(`const _Vue = ${VueBinding}\n`, -1 /* End */);\n      if (ast.hoists.length) {\n        const staticHelpers = [\n          CREATE_VNODE,\n          CREATE_ELEMENT_VNODE,\n          CREATE_COMMENT,\n          CREATE_TEXT,\n          CREATE_STATIC\n        ].filter((helper) => helpers.includes(helper)).map(aliasHelper).join(\", \");\n        push(`const { ${staticHelpers} } = _Vue\n`, -1 /* End */);\n      }\n    }\n  }\n  genHoists(ast.hoists, context);\n  newline();\n  push(`return `);\n}\nfunction genAssets(assets, type, { helper, push, newline, isTS }) {\n  const resolver = helper(\n    type === \"filter\" ? RESOLVE_FILTER : type === \"component\" ? RESOLVE_COMPONENT : RESOLVE_DIRECTIVE\n  );\n  for (let i = 0; i < assets.length; i++) {\n    let id = assets[i];\n    const maybeSelfReference = id.endsWith(\"__self\");\n    if (maybeSelfReference) {\n      id = id.slice(0, -6);\n    }\n    push(\n      `const ${toValidAssetId(id, type)} = ${resolver}(${JSON.stringify(id)}${maybeSelfReference ? `, true` : ``})${isTS ? `!` : ``}`\n    );\n    if (i < assets.length - 1) {\n      newline();\n    }\n  }\n}\nfunction genHoists(hoists, context) {\n  if (!hoists.length) {\n    return;\n  }\n  context.pure = true;\n  const { push, newline, helper, scopeId, mode } = context;\n  newline();\n  for (let i = 0; i < hoists.length; i++) {\n    const exp = hoists[i];\n    if (exp) {\n      push(\n        `const _hoisted_${i + 1} = ${``}`\n      );\n      genNode(exp, context);\n      newline();\n    }\n  }\n  context.pure = false;\n}\nfunction isText(n) {\n  return isString(n) || n.type === 4 || n.type === 2 || n.type === 5 || n.type === 8;\n}\nfunction genNodeListAsArray(nodes, context) {\n  const multilines = nodes.length > 3 || !!(process.env.NODE_ENV !== \"production\") && nodes.some((n) => isArray(n) || !isText(n));\n  context.push(`[`);\n  multilines && context.indent();\n  genNodeList(nodes, context, multilines);\n  multilines && context.deindent();\n  context.push(`]`);\n}\nfunction genNodeList(nodes, context, multilines = false, comma = true) {\n  const { push, newline } = context;\n  for (let i = 0; i < nodes.length; i++) {\n    const node = nodes[i];\n    if (isString(node)) {\n      push(node, -3 /* Unknown */);\n    } else if (isArray(node)) {\n      genNodeListAsArray(node, context);\n    } else {\n      genNode(node, context);\n    }\n    if (i < nodes.length - 1) {\n      if (multilines) {\n        comma && push(\",\");\n        newline();\n      } else {\n        comma && push(\", \");\n      }\n    }\n  }\n}\nfunction genNode(node, context) {\n  if (isString(node)) {\n    context.push(node, -3 /* Unknown */);\n    return;\n  }\n  if (isSymbol(node)) {\n    context.push(context.helper(node));\n    return;\n  }\n  switch (node.type) {\n    case 1:\n    case 9:\n    case 11:\n      !!(process.env.NODE_ENV !== \"production\") && assert(\n        node.codegenNode != null,\n        `Codegen node is missing for element/if/for node. Apply appropriate transforms first.`\n      );\n      genNode(node.codegenNode, context);\n      break;\n    case 2:\n      genText(node, context);\n      break;\n    case 4:\n      genExpression(node, context);\n      break;\n    case 5:\n      genInterpolation(node, context);\n      break;\n    case 12:\n      genNode(node.codegenNode, context);\n      break;\n    case 8:\n      genCompoundExpression(node, context);\n      break;\n    case 3:\n      genComment(node, context);\n      break;\n    case 13:\n      genVNodeCall(node, context);\n      break;\n    case 14:\n      genCallExpression(node, context);\n      break;\n    case 15:\n      genObjectExpression(node, context);\n      break;\n    case 17:\n      genArrayExpression(node, context);\n      break;\n    case 18:\n      genFunctionExpression(node, context);\n      break;\n    case 19:\n      genConditionalExpression(node, context);\n      break;\n    case 20:\n      genCacheExpression(node, context);\n      break;\n    case 21:\n      genNodeList(node.body, context, true, false);\n      break;\n    case 22:\n      break;\n    case 23:\n      break;\n    case 24:\n      break;\n    case 25:\n      break;\n    case 26:\n      break;\n    case 10:\n      break;\n    default:\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        assert(false, `unhandled codegen node type: ${node.type}`);\n        const exhaustiveCheck = node;\n        return exhaustiveCheck;\n      }\n  }\n}\nfunction genText(node, context) {\n  context.push(JSON.stringify(node.content), -3 /* Unknown */, node);\n}\nfunction genExpression(node, context) {\n  const { content, isStatic } = node;\n  context.push(\n    isStatic ? JSON.stringify(content) : content,\n    -3 /* Unknown */,\n    node\n  );\n}\nfunction genInterpolation(node, context) {\n  const { push, helper, pure } = context;\n  if (pure)\n    push(PURE_ANNOTATION);\n  push(`${helper(TO_DISPLAY_STRING)}(`);\n  genNode(node.content, context);\n  push(`)`);\n}\nfunction genCompoundExpression(node, context) {\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i];\n    if (isString(child)) {\n      context.push(child, -3 /* Unknown */);\n    } else {\n      genNode(child, context);\n    }\n  }\n}\nfunction genExpressionAsPropertyKey(node, context) {\n  const { push } = context;\n  if (node.type === 8) {\n    push(`[`);\n    genCompoundExpression(node, context);\n    push(`]`);\n  } else if (node.isStatic) {\n    const text = isSimpleIdentifier(node.content) ? node.content : JSON.stringify(node.content);\n    push(text, -2 /* None */, node);\n  } else {\n    push(`[${node.content}]`, -3 /* Unknown */, node);\n  }\n}\nfunction genComment(node, context) {\n  const { push, helper, pure } = context;\n  if (pure) {\n    push(PURE_ANNOTATION);\n  }\n  push(\n    `${helper(CREATE_COMMENT)}(${JSON.stringify(node.content)})`,\n    -3 /* Unknown */,\n    node\n  );\n}\nfunction genVNodeCall(node, context) {\n  const { push, helper, pure } = context;\n  const {\n    tag,\n    props,\n    children,\n    patchFlag,\n    dynamicProps,\n    directives,\n    isBlock,\n    disableTracking,\n    isComponent\n  } = node;\n  if (directives) {\n    push(helper(WITH_DIRECTIVES) + `(`);\n  }\n  if (isBlock) {\n    push(`(${helper(OPEN_BLOCK)}(${disableTracking ? `true` : ``}), `);\n  }\n  if (pure) {\n    push(PURE_ANNOTATION);\n  }\n  const callHelper = isBlock ? getVNodeBlockHelper(context.inSSR, isComponent) : getVNodeHelper(context.inSSR, isComponent);\n  push(helper(callHelper) + `(`, -2 /* None */, node);\n  genNodeList(\n    genNullableArgs([tag, props, children, patchFlag, dynamicProps]),\n    context\n  );\n  push(`)`);\n  if (isBlock) {\n    push(`)`);\n  }\n  if (directives) {\n    push(`, `);\n    genNode(directives, context);\n    push(`)`);\n  }\n}\nfunction genNullableArgs(args) {\n  let i = args.length;\n  while (i--) {\n    if (args[i] != null)\n      break;\n  }\n  return args.slice(0, i + 1).map((arg) => arg || `null`);\n}\nfunction genCallExpression(node, context) {\n  const { push, helper, pure } = context;\n  const callee = isString(node.callee) ? node.callee : helper(node.callee);\n  if (pure) {\n    push(PURE_ANNOTATION);\n  }\n  push(callee + `(`, -2 /* None */, node);\n  genNodeList(node.arguments, context);\n  push(`)`);\n}\nfunction genObjectExpression(node, context) {\n  const { push, indent, deindent, newline } = context;\n  const { properties } = node;\n  if (!properties.length) {\n    push(`{}`, -2 /* None */, node);\n    return;\n  }\n  const multilines = properties.length > 1 || !!(process.env.NODE_ENV !== \"production\") && properties.some((p) => p.value.type !== 4);\n  push(multilines ? `{` : `{ `);\n  multilines && indent();\n  for (let i = 0; i < properties.length; i++) {\n    const { key, value } = properties[i];\n    genExpressionAsPropertyKey(key, context);\n    push(`: `);\n    genNode(value, context);\n    if (i < properties.length - 1) {\n      push(`,`);\n      newline();\n    }\n  }\n  multilines && deindent();\n  push(multilines ? `}` : ` }`);\n}\nfunction genArrayExpression(node, context) {\n  genNodeListAsArray(node.elements, context);\n}\nfunction genFunctionExpression(node, context) {\n  const { push, indent, deindent } = context;\n  const { params, returns, body, newline, isSlot } = node;\n  if (isSlot) {\n    push(`_${helperNameMap[WITH_CTX]}(`);\n  }\n  push(`(`, -2 /* None */, node);\n  if (isArray(params)) {\n    genNodeList(params, context);\n  } else if (params) {\n    genNode(params, context);\n  }\n  push(`) => `);\n  if (newline || body) {\n    push(`{`);\n    indent();\n  }\n  if (returns) {\n    if (newline) {\n      push(`return `);\n    }\n    if (isArray(returns)) {\n      genNodeListAsArray(returns, context);\n    } else {\n      genNode(returns, context);\n    }\n  } else if (body) {\n    genNode(body, context);\n  }\n  if (newline || body) {\n    deindent();\n    push(`}`);\n  }\n  if (isSlot) {\n    if (node.isNonScopedSlot) {\n      push(`, undefined, true`);\n    }\n    push(`)`);\n  }\n}\nfunction genConditionalExpression(node, context) {\n  const { test, consequent, alternate, newline: needNewline } = node;\n  const { push, indent, deindent, newline } = context;\n  if (test.type === 4) {\n    const needsParens = !isSimpleIdentifier(test.content);\n    needsParens && push(`(`);\n    genExpression(test, context);\n    needsParens && push(`)`);\n  } else {\n    push(`(`);\n    genNode(test, context);\n    push(`)`);\n  }\n  needNewline && indent();\n  context.indentLevel++;\n  needNewline || push(` `);\n  push(`? `);\n  genNode(consequent, context);\n  context.indentLevel--;\n  needNewline && newline();\n  needNewline || push(` `);\n  push(`: `);\n  const isNested = alternate.type === 19;\n  if (!isNested) {\n    context.indentLevel++;\n  }\n  genNode(alternate, context);\n  if (!isNested) {\n    context.indentLevel--;\n  }\n  needNewline && deindent(\n    true\n    /* without newline */\n  );\n}\nfunction genCacheExpression(node, context) {\n  const { push, helper, indent, deindent, newline } = context;\n  push(`_cache[${node.index}] || (`);\n  if (node.isVNode) {\n    indent();\n    push(`${helper(SET_BLOCK_TRACKING)}(-1),`);\n    newline();\n  }\n  push(`_cache[${node.index}] = `);\n  genNode(node.value, context);\n  if (node.isVNode) {\n    push(`,`);\n    newline();\n    push(`${helper(SET_BLOCK_TRACKING)}(1),`);\n    newline();\n    push(`_cache[${node.index}]`);\n    deindent();\n  }\n  push(`)`);\n}\n\nconst prohibitedKeywordRE = new RegExp(\n  \"\\\\b\" + \"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield\".split(\",\").join(\"\\\\b|\\\\b\") + \"\\\\b\"\n);\nconst stripStringRE = /'(?:[^'\\\\]|\\\\.)*'|\"(?:[^\"\\\\]|\\\\.)*\"|`(?:[^`\\\\]|\\\\.)*\\$\\{|\\}(?:[^`\\\\]|\\\\.)*`|`(?:[^`\\\\]|\\\\.)*`/g;\nfunction validateBrowserExpression(node, context, asParams = false, asRawStatements = false) {\n  const exp = node.content;\n  if (!exp.trim()) {\n    return;\n  }\n  try {\n    new Function(\n      asRawStatements ? ` ${exp} ` : `return ${asParams ? `(${exp}) => {}` : `(${exp})`}`\n    );\n  } catch (e) {\n    let message = e.message;\n    const keywordMatch = exp.replace(stripStringRE, \"\").match(prohibitedKeywordRE);\n    if (keywordMatch) {\n      message = `avoid using JavaScript keyword as property name: \"${keywordMatch[0]}\"`;\n    }\n    context.onError(\n      createCompilerError(\n        45,\n        node.loc,\n        void 0,\n        message\n      )\n    );\n  }\n}\n\nconst transformExpression = (node, context) => {\n  if (node.type === 5) {\n    node.content = processExpression(\n      node.content,\n      context\n    );\n  } else if (node.type === 1) {\n    for (let i = 0; i < node.props.length; i++) {\n      const dir = node.props[i];\n      if (dir.type === 7 && dir.name !== \"for\") {\n        const exp = dir.exp;\n        const arg = dir.arg;\n        if (exp && exp.type === 4 && !(dir.name === \"on\" && arg)) {\n          dir.exp = processExpression(\n            exp,\n            context,\n            // slot args must be processed as function params\n            dir.name === \"slot\"\n          );\n        }\n        if (arg && arg.type === 4 && !arg.isStatic) {\n          dir.arg = processExpression(arg, context);\n        }\n      }\n    }\n  }\n};\nfunction processExpression(node, context, asParams = false, asRawStatements = false, localVars = Object.create(context.identifiers)) {\n  {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      validateBrowserExpression(node, context, asParams, asRawStatements);\n    }\n    return node;\n  }\n}\nfunction stringifyExpression(exp) {\n  if (isString(exp)) {\n    return exp;\n  } else if (exp.type === 4) {\n    return exp.content;\n  } else {\n    return exp.children.map(stringifyExpression).join(\"\");\n  }\n}\n\nconst transformIf = createStructuralDirectiveTransform(\n  /^(if|else|else-if)$/,\n  (node, dir, context) => {\n    return processIf(node, dir, context, (ifNode, branch, isRoot) => {\n      const siblings = context.parent.children;\n      let i = siblings.indexOf(ifNode);\n      let key = 0;\n      while (i-- >= 0) {\n        const sibling = siblings[i];\n        if (sibling && sibling.type === 9) {\n          key += sibling.branches.length;\n        }\n      }\n      return () => {\n        if (isRoot) {\n          ifNode.codegenNode = createCodegenNodeForBranch(\n            branch,\n            key,\n            context\n          );\n        } else {\n          const parentCondition = getParentCondition(ifNode.codegenNode);\n          parentCondition.alternate = createCodegenNodeForBranch(\n            branch,\n            key + ifNode.branches.length - 1,\n            context\n          );\n        }\n      };\n    });\n  }\n);\nfunction processIf(node, dir, context, processCodegen) {\n  if (dir.name !== \"else\" && (!dir.exp || !dir.exp.content.trim())) {\n    const loc = dir.exp ? dir.exp.loc : node.loc;\n    context.onError(\n      createCompilerError(28, dir.loc)\n    );\n    dir.exp = createSimpleExpression(`true`, false, loc);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && true && dir.exp) {\n    validateBrowserExpression(dir.exp, context);\n  }\n  if (dir.name === \"if\") {\n    const branch = createIfBranch(node, dir);\n    const ifNode = {\n      type: 9,\n      loc: node.loc,\n      branches: [branch]\n    };\n    context.replaceNode(ifNode);\n    if (processCodegen) {\n      return processCodegen(ifNode, branch, true);\n    }\n  } else {\n    const siblings = context.parent.children;\n    const comments = [];\n    let i = siblings.indexOf(node);\n    while (i-- >= -1) {\n      const sibling = siblings[i];\n      if (sibling && sibling.type === 3) {\n        context.removeNode(sibling);\n        !!(process.env.NODE_ENV !== \"production\") && comments.unshift(sibling);\n        continue;\n      }\n      if (sibling && sibling.type === 2 && !sibling.content.trim().length) {\n        context.removeNode(sibling);\n        continue;\n      }\n      if (sibling && sibling.type === 9) {\n        if (dir.name === \"else-if\" && sibling.branches[sibling.branches.length - 1].condition === void 0) {\n          context.onError(\n            createCompilerError(30, node.loc)\n          );\n        }\n        context.removeNode();\n        const branch = createIfBranch(node, dir);\n        if (!!(process.env.NODE_ENV !== \"production\") && comments.length && // #3619 ignore comments if the v-if is direct child of <transition>\n        !(context.parent && context.parent.type === 1 && (context.parent.tag === \"transition\" || context.parent.tag === \"Transition\"))) {\n          branch.children = [...comments, ...branch.children];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") || false) {\n          const key = branch.userKey;\n          if (key) {\n            sibling.branches.forEach(({ userKey }) => {\n              if (isSameKey(userKey, key)) {\n                context.onError(\n                  createCompilerError(\n                    29,\n                    branch.userKey.loc\n                  )\n                );\n              }\n            });\n          }\n        }\n        sibling.branches.push(branch);\n        const onExit = processCodegen && processCodegen(sibling, branch, false);\n        traverseNode(branch, context);\n        if (onExit)\n          onExit();\n        context.currentNode = null;\n      } else {\n        context.onError(\n          createCompilerError(30, node.loc)\n        );\n      }\n      break;\n    }\n  }\n}\nfunction createIfBranch(node, dir) {\n  const isTemplateIf = node.tagType === 3;\n  return {\n    type: 10,\n    loc: node.loc,\n    condition: dir.name === \"else\" ? void 0 : dir.exp,\n    children: isTemplateIf && !findDir(node, \"for\") ? node.children : [node],\n    userKey: findProp(node, `key`),\n    isTemplateIf\n  };\n}\nfunction createCodegenNodeForBranch(branch, keyIndex, context) {\n  if (branch.condition) {\n    return createConditionalExpression(\n      branch.condition,\n      createChildrenCodegenNode(branch, keyIndex, context),\n      // make sure to pass in asBlock: true so that the comment node call\n      // closes the current block.\n      createCallExpression(context.helper(CREATE_COMMENT), [\n        !!(process.env.NODE_ENV !== \"production\") ? '\"v-if\"' : '\"\"',\n        \"true\"\n      ])\n    );\n  } else {\n    return createChildrenCodegenNode(branch, keyIndex, context);\n  }\n}\nfunction createChildrenCodegenNode(branch, keyIndex, context) {\n  const { helper } = context;\n  const keyProperty = createObjectProperty(\n    `key`,\n    createSimpleExpression(\n      `${keyIndex}`,\n      false,\n      locStub,\n      2\n    )\n  );\n  const { children } = branch;\n  const firstChild = children[0];\n  const needFragmentWrapper = children.length !== 1 || firstChild.type !== 1;\n  if (needFragmentWrapper) {\n    if (children.length === 1 && firstChild.type === 11) {\n      const vnodeCall = firstChild.codegenNode;\n      injectProp(vnodeCall, keyProperty, context);\n      return vnodeCall;\n    } else {\n      let patchFlag = 64;\n      let patchFlagText = PatchFlagNames[64];\n      if (!!(process.env.NODE_ENV !== \"production\") && !branch.isTemplateIf && children.filter((c) => c.type !== 3).length === 1) {\n        patchFlag |= 2048;\n        patchFlagText += `, ${PatchFlagNames[2048]}`;\n      }\n      return createVNodeCall(\n        context,\n        helper(FRAGMENT),\n        createObjectExpression([keyProperty]),\n        children,\n        patchFlag + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${patchFlagText} */` : ``),\n        void 0,\n        void 0,\n        true,\n        false,\n        false,\n        branch.loc\n      );\n    }\n  } else {\n    const ret = firstChild.codegenNode;\n    const vnodeCall = getMemoedVNodeCall(ret);\n    if (vnodeCall.type === 13) {\n      convertToBlock(vnodeCall, context);\n    }\n    injectProp(vnodeCall, keyProperty, context);\n    return ret;\n  }\n}\nfunction isSameKey(a, b) {\n  if (!a || a.type !== b.type) {\n    return false;\n  }\n  if (a.type === 6) {\n    if (a.value.content !== b.value.content) {\n      return false;\n    }\n  } else {\n    const exp = a.exp;\n    const branchExp = b.exp;\n    if (exp.type !== branchExp.type) {\n      return false;\n    }\n    if (exp.type !== 4 || exp.isStatic !== branchExp.isStatic || exp.content !== branchExp.content) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction getParentCondition(node) {\n  while (true) {\n    if (node.type === 19) {\n      if (node.alternate.type === 19) {\n        node = node.alternate;\n      } else {\n        return node;\n      }\n    } else if (node.type === 20) {\n      node = node.value;\n    }\n  }\n}\n\nconst transformFor = createStructuralDirectiveTransform(\n  \"for\",\n  (node, dir, context) => {\n    const { helper, removeHelper } = context;\n    return processFor(node, dir, context, (forNode) => {\n      const renderExp = createCallExpression(helper(RENDER_LIST), [\n        forNode.source\n      ]);\n      const isTemplate = isTemplateNode(node);\n      const memo = findDir(node, \"memo\");\n      const keyProp = findProp(node, `key`);\n      const keyExp = keyProp && (keyProp.type === 6 ? createSimpleExpression(keyProp.value.content, true) : keyProp.exp);\n      const keyProperty = keyProp ? createObjectProperty(`key`, keyExp) : null;\n      const isStableFragment = forNode.source.type === 4 && forNode.source.constType > 0;\n      const fragmentFlag = isStableFragment ? 64 : keyProp ? 128 : 256;\n      forNode.codegenNode = createVNodeCall(\n        context,\n        helper(FRAGMENT),\n        void 0,\n        renderExp,\n        fragmentFlag + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${PatchFlagNames[fragmentFlag]} */` : ``),\n        void 0,\n        void 0,\n        true,\n        !isStableFragment,\n        false,\n        node.loc\n      );\n      return () => {\n        let childBlock;\n        const { children } = forNode;\n        if ((!!(process.env.NODE_ENV !== \"production\") || false) && isTemplate) {\n          node.children.some((c) => {\n            if (c.type === 1) {\n              const key = findProp(c, \"key\");\n              if (key) {\n                context.onError(\n                  createCompilerError(\n                    33,\n                    key.loc\n                  )\n                );\n                return true;\n              }\n            }\n          });\n        }\n        const needFragmentWrapper = children.length !== 1 || children[0].type !== 1;\n        const slotOutlet = isSlotOutlet(node) ? node : isTemplate && node.children.length === 1 && isSlotOutlet(node.children[0]) ? node.children[0] : null;\n        if (slotOutlet) {\n          childBlock = slotOutlet.codegenNode;\n          if (isTemplate && keyProperty) {\n            injectProp(childBlock, keyProperty, context);\n          }\n        } else if (needFragmentWrapper) {\n          childBlock = createVNodeCall(\n            context,\n            helper(FRAGMENT),\n            keyProperty ? createObjectExpression([keyProperty]) : void 0,\n            node.children,\n            64 + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${PatchFlagNames[64]} */` : ``),\n            void 0,\n            void 0,\n            true,\n            void 0,\n            false\n          );\n        } else {\n          childBlock = children[0].codegenNode;\n          if (isTemplate && keyProperty) {\n            injectProp(childBlock, keyProperty, context);\n          }\n          if (childBlock.isBlock !== !isStableFragment) {\n            if (childBlock.isBlock) {\n              removeHelper(OPEN_BLOCK);\n              removeHelper(\n                getVNodeBlockHelper(context.inSSR, childBlock.isComponent)\n              );\n            } else {\n              removeHelper(\n                getVNodeHelper(context.inSSR, childBlock.isComponent)\n              );\n            }\n          }\n          childBlock.isBlock = !isStableFragment;\n          if (childBlock.isBlock) {\n            helper(OPEN_BLOCK);\n            helper(getVNodeBlockHelper(context.inSSR, childBlock.isComponent));\n          } else {\n            helper(getVNodeHelper(context.inSSR, childBlock.isComponent));\n          }\n        }\n        if (memo) {\n          const loop = createFunctionExpression(\n            createForLoopParams(forNode.parseResult, [\n              createSimpleExpression(`_cached`)\n            ])\n          );\n          loop.body = createBlockStatement([\n            createCompoundExpression([`const _memo = (`, memo.exp, `)`]),\n            createCompoundExpression([\n              `if (_cached`,\n              ...keyExp ? [` && _cached.key === `, keyExp] : [],\n              ` && ${context.helperString(\n                IS_MEMO_SAME\n              )}(_cached, _memo)) return _cached`\n            ]),\n            createCompoundExpression([`const _item = `, childBlock]),\n            createSimpleExpression(`_item.memo = _memo`),\n            createSimpleExpression(`return _item`)\n          ]);\n          renderExp.arguments.push(\n            loop,\n            createSimpleExpression(`_cache`),\n            createSimpleExpression(String(context.cached++))\n          );\n        } else {\n          renderExp.arguments.push(\n            createFunctionExpression(\n              createForLoopParams(forNode.parseResult),\n              childBlock,\n              true\n            )\n          );\n        }\n      };\n    });\n  }\n);\nfunction processFor(node, dir, context, processCodegen) {\n  if (!dir.exp) {\n    context.onError(\n      createCompilerError(31, dir.loc)\n    );\n    return;\n  }\n  const parseResult = dir.forParseResult;\n  if (!parseResult) {\n    context.onError(\n      createCompilerError(32, dir.loc)\n    );\n    return;\n  }\n  finalizeForParseResult(parseResult, context);\n  const { addIdentifiers, removeIdentifiers, scopes } = context;\n  const { source, value, key, index } = parseResult;\n  const forNode = {\n    type: 11,\n    loc: dir.loc,\n    source,\n    valueAlias: value,\n    keyAlias: key,\n    objectIndexAlias: index,\n    parseResult,\n    children: isTemplateNode(node) ? node.children : [node]\n  };\n  context.replaceNode(forNode);\n  scopes.vFor++;\n  const onExit = processCodegen && processCodegen(forNode);\n  return () => {\n    scopes.vFor--;\n    if (onExit)\n      onExit();\n  };\n}\nfunction finalizeForParseResult(result, context) {\n  if (result.finalized)\n    return;\n  if (!!(process.env.NODE_ENV !== \"production\") && true) {\n    validateBrowserExpression(result.source, context);\n    if (result.key) {\n      validateBrowserExpression(\n        result.key,\n        context,\n        true\n      );\n    }\n    if (result.index) {\n      validateBrowserExpression(\n        result.index,\n        context,\n        true\n      );\n    }\n    if (result.value) {\n      validateBrowserExpression(\n        result.value,\n        context,\n        true\n      );\n    }\n  }\n  result.finalized = true;\n}\nfunction createForLoopParams({ value, key, index }, memoArgs = []) {\n  return createParamsList([value, key, index, ...memoArgs]);\n}\nfunction createParamsList(args) {\n  let i = args.length;\n  while (i--) {\n    if (args[i])\n      break;\n  }\n  return args.slice(0, i + 1).map((arg, i2) => arg || createSimpleExpression(`_`.repeat(i2 + 1), false));\n}\n\nconst defaultFallback = createSimpleExpression(`undefined`, false);\nconst trackSlotScopes = (node, context) => {\n  if (node.type === 1 && (node.tagType === 1 || node.tagType === 3)) {\n    const vSlot = findDir(node, \"slot\");\n    if (vSlot) {\n      vSlot.exp;\n      context.scopes.vSlot++;\n      return () => {\n        context.scopes.vSlot--;\n      };\n    }\n  }\n};\nconst trackVForSlotScopes = (node, context) => {\n  let vFor;\n  if (isTemplateNode(node) && node.props.some(isVSlot) && (vFor = findDir(node, \"for\"))) {\n    const result = vFor.forParseResult;\n    if (result) {\n      finalizeForParseResult(result, context);\n      const { value, key, index } = result;\n      const { addIdentifiers, removeIdentifiers } = context;\n      value && addIdentifiers(value);\n      key && addIdentifiers(key);\n      index && addIdentifiers(index);\n      return () => {\n        value && removeIdentifiers(value);\n        key && removeIdentifiers(key);\n        index && removeIdentifiers(index);\n      };\n    }\n  }\n};\nconst buildClientSlotFn = (props, _vForExp, children, loc) => createFunctionExpression(\n  props,\n  children,\n  false,\n  true,\n  children.length ? children[0].loc : loc\n);\nfunction buildSlots(node, context, buildSlotFn = buildClientSlotFn) {\n  context.helper(WITH_CTX);\n  const { children, loc } = node;\n  const slotsProperties = [];\n  const dynamicSlots = [];\n  let hasDynamicSlots = context.scopes.vSlot > 0 || context.scopes.vFor > 0;\n  const onComponentSlot = findDir(node, \"slot\", true);\n  if (onComponentSlot) {\n    const { arg, exp } = onComponentSlot;\n    if (arg && !isStaticExp(arg)) {\n      hasDynamicSlots = true;\n    }\n    slotsProperties.push(\n      createObjectProperty(\n        arg || createSimpleExpression(\"default\", true),\n        buildSlotFn(exp, void 0, children, loc)\n      )\n    );\n  }\n  let hasTemplateSlots = false;\n  let hasNamedDefaultSlot = false;\n  const implicitDefaultChildren = [];\n  const seenSlotNames = /* @__PURE__ */ new Set();\n  let conditionalBranchIndex = 0;\n  for (let i = 0; i < children.length; i++) {\n    const slotElement = children[i];\n    let slotDir;\n    if (!isTemplateNode(slotElement) || !(slotDir = findDir(slotElement, \"slot\", true))) {\n      if (slotElement.type !== 3) {\n        implicitDefaultChildren.push(slotElement);\n      }\n      continue;\n    }\n    if (onComponentSlot) {\n      context.onError(\n        createCompilerError(37, slotDir.loc)\n      );\n      break;\n    }\n    hasTemplateSlots = true;\n    const { children: slotChildren, loc: slotLoc } = slotElement;\n    const {\n      arg: slotName = createSimpleExpression(`default`, true),\n      exp: slotProps,\n      loc: dirLoc\n    } = slotDir;\n    let staticSlotName;\n    if (isStaticExp(slotName)) {\n      staticSlotName = slotName ? slotName.content : `default`;\n    } else {\n      hasDynamicSlots = true;\n    }\n    const vFor = findDir(slotElement, \"for\");\n    const slotFunction = buildSlotFn(slotProps, vFor, slotChildren, slotLoc);\n    let vIf;\n    let vElse;\n    if (vIf = findDir(slotElement, \"if\")) {\n      hasDynamicSlots = true;\n      dynamicSlots.push(\n        createConditionalExpression(\n          vIf.exp,\n          buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++),\n          defaultFallback\n        )\n      );\n    } else if (vElse = findDir(\n      slotElement,\n      /^else(-if)?$/,\n      true\n      /* allowEmpty */\n    )) {\n      let j = i;\n      let prev;\n      while (j--) {\n        prev = children[j];\n        if (prev.type !== 3) {\n          break;\n        }\n      }\n      if (prev && isTemplateNode(prev) && findDir(prev, \"if\")) {\n        children.splice(i, 1);\n        i--;\n        let conditional = dynamicSlots[dynamicSlots.length - 1];\n        while (conditional.alternate.type === 19) {\n          conditional = conditional.alternate;\n        }\n        conditional.alternate = vElse.exp ? createConditionalExpression(\n          vElse.exp,\n          buildDynamicSlot(\n            slotName,\n            slotFunction,\n            conditionalBranchIndex++\n          ),\n          defaultFallback\n        ) : buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++);\n      } else {\n        context.onError(\n          createCompilerError(30, vElse.loc)\n        );\n      }\n    } else if (vFor) {\n      hasDynamicSlots = true;\n      const parseResult = vFor.forParseResult;\n      if (parseResult) {\n        finalizeForParseResult(parseResult, context);\n        dynamicSlots.push(\n          createCallExpression(context.helper(RENDER_LIST), [\n            parseResult.source,\n            createFunctionExpression(\n              createForLoopParams(parseResult),\n              buildDynamicSlot(slotName, slotFunction),\n              true\n            )\n          ])\n        );\n      } else {\n        context.onError(\n          createCompilerError(\n            32,\n            vFor.loc\n          )\n        );\n      }\n    } else {\n      if (staticSlotName) {\n        if (seenSlotNames.has(staticSlotName)) {\n          context.onError(\n            createCompilerError(\n              38,\n              dirLoc\n            )\n          );\n          continue;\n        }\n        seenSlotNames.add(staticSlotName);\n        if (staticSlotName === \"default\") {\n          hasNamedDefaultSlot = true;\n        }\n      }\n      slotsProperties.push(createObjectProperty(slotName, slotFunction));\n    }\n  }\n  if (!onComponentSlot) {\n    const buildDefaultSlotProperty = (props, children2) => {\n      const fn = buildSlotFn(props, void 0, children2, loc);\n      if (context.compatConfig) {\n        fn.isNonScopedSlot = true;\n      }\n      return createObjectProperty(`default`, fn);\n    };\n    if (!hasTemplateSlots) {\n      slotsProperties.push(buildDefaultSlotProperty(void 0, children));\n    } else if (implicitDefaultChildren.length && // #3766\n    // with whitespace: 'preserve', whitespaces between slots will end up in\n    // implicitDefaultChildren. Ignore if all implicit children are whitespaces.\n    implicitDefaultChildren.some((node2) => isNonWhitespaceContent(node2))) {\n      if (hasNamedDefaultSlot) {\n        context.onError(\n          createCompilerError(\n            39,\n            implicitDefaultChildren[0].loc\n          )\n        );\n      } else {\n        slotsProperties.push(\n          buildDefaultSlotProperty(void 0, implicitDefaultChildren)\n        );\n      }\n    }\n  }\n  const slotFlag = hasDynamicSlots ? 2 : hasForwardedSlots(node.children) ? 3 : 1;\n  let slots = createObjectExpression(\n    slotsProperties.concat(\n      createObjectProperty(\n        `_`,\n        // 2 = compiled but dynamic = can skip normalization, but must run diff\n        // 1 = compiled and static = can skip normalization AND diff as optimized\n        createSimpleExpression(\n          slotFlag + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${slotFlagsText[slotFlag]} */` : ``),\n          false\n        )\n      )\n    ),\n    loc\n  );\n  if (dynamicSlots.length) {\n    slots = createCallExpression(context.helper(CREATE_SLOTS), [\n      slots,\n      createArrayExpression(dynamicSlots)\n    ]);\n  }\n  return {\n    slots,\n    hasDynamicSlots\n  };\n}\nfunction buildDynamicSlot(name, fn, index) {\n  const props = [\n    createObjectProperty(`name`, name),\n    createObjectProperty(`fn`, fn)\n  ];\n  if (index != null) {\n    props.push(\n      createObjectProperty(`key`, createSimpleExpression(String(index), true))\n    );\n  }\n  return createObjectExpression(props);\n}\nfunction hasForwardedSlots(children) {\n  for (let i = 0; i < children.length; i++) {\n    const child = children[i];\n    switch (child.type) {\n      case 1:\n        if (child.tagType === 2 || hasForwardedSlots(child.children)) {\n          return true;\n        }\n        break;\n      case 9:\n        if (hasForwardedSlots(child.branches))\n          return true;\n        break;\n      case 10:\n      case 11:\n        if (hasForwardedSlots(child.children))\n          return true;\n        break;\n    }\n  }\n  return false;\n}\nfunction isNonWhitespaceContent(node) {\n  if (node.type !== 2 && node.type !== 12)\n    return true;\n  return node.type === 2 ? !!node.content.trim() : isNonWhitespaceContent(node.content);\n}\n\nconst directiveImportMap = /* @__PURE__ */ new WeakMap();\nconst transformElement = (node, context) => {\n  return function postTransformElement() {\n    node = context.currentNode;\n    if (!(node.type === 1 && (node.tagType === 0 || node.tagType === 1))) {\n      return;\n    }\n    const { tag, props } = node;\n    const isComponent = node.tagType === 1;\n    let vnodeTag = isComponent ? resolveComponentType(node, context) : `\"${tag}\"`;\n    const isDynamicComponent = isObject(vnodeTag) && vnodeTag.callee === RESOLVE_DYNAMIC_COMPONENT;\n    let vnodeProps;\n    let vnodeChildren;\n    let vnodePatchFlag;\n    let patchFlag = 0;\n    let vnodeDynamicProps;\n    let dynamicPropNames;\n    let vnodeDirectives;\n    let shouldUseBlock = (\n      // dynamic component may resolve to plain elements\n      isDynamicComponent || vnodeTag === TELEPORT || vnodeTag === SUSPENSE || !isComponent && // <svg> and <foreignObject> must be forced into blocks so that block\n      // updates inside get proper isSVG flag at runtime. (#639, #643)\n      // This is technically web-specific, but splitting the logic out of core\n      // leads to too much unnecessary complexity.\n      (tag === \"svg\" || tag === \"foreignObject\")\n    );\n    if (props.length > 0) {\n      const propsBuildResult = buildProps(\n        node,\n        context,\n        void 0,\n        isComponent,\n        isDynamicComponent\n      );\n      vnodeProps = propsBuildResult.props;\n      patchFlag = propsBuildResult.patchFlag;\n      dynamicPropNames = propsBuildResult.dynamicPropNames;\n      const directives = propsBuildResult.directives;\n      vnodeDirectives = directives && directives.length ? createArrayExpression(\n        directives.map((dir) => buildDirectiveArgs(dir, context))\n      ) : void 0;\n      if (propsBuildResult.shouldUseBlock) {\n        shouldUseBlock = true;\n      }\n    }\n    if (node.children.length > 0) {\n      if (vnodeTag === KEEP_ALIVE) {\n        shouldUseBlock = true;\n        patchFlag |= 1024;\n        if (!!(process.env.NODE_ENV !== \"production\") && node.children.length > 1) {\n          context.onError(\n            createCompilerError(46, {\n              start: node.children[0].loc.start,\n              end: node.children[node.children.length - 1].loc.end,\n              source: \"\"\n            })\n          );\n        }\n      }\n      const shouldBuildAsSlots = isComponent && // Teleport is not a real component and has dedicated runtime handling\n      vnodeTag !== TELEPORT && // explained above.\n      vnodeTag !== KEEP_ALIVE;\n      if (shouldBuildAsSlots) {\n        const { slots, hasDynamicSlots } = buildSlots(node, context);\n        vnodeChildren = slots;\n        if (hasDynamicSlots) {\n          patchFlag |= 1024;\n        }\n      } else if (node.children.length === 1 && vnodeTag !== TELEPORT) {\n        const child = node.children[0];\n        const type = child.type;\n        const hasDynamicTextChild = type === 5 || type === 8;\n        if (hasDynamicTextChild && getConstantType(child, context) === 0) {\n          patchFlag |= 1;\n        }\n        if (hasDynamicTextChild || type === 2) {\n          vnodeChildren = child;\n        } else {\n          vnodeChildren = node.children;\n        }\n      } else {\n        vnodeChildren = node.children;\n      }\n    }\n    if (patchFlag !== 0) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (patchFlag < 0) {\n          vnodePatchFlag = patchFlag + ` /* ${PatchFlagNames[patchFlag]} */`;\n        } else {\n          const flagNames = Object.keys(PatchFlagNames).map(Number).filter((n) => n > 0 && patchFlag & n).map((n) => PatchFlagNames[n]).join(`, `);\n          vnodePatchFlag = patchFlag + ` /* ${flagNames} */`;\n        }\n      } else {\n        vnodePatchFlag = String(patchFlag);\n      }\n      if (dynamicPropNames && dynamicPropNames.length) {\n        vnodeDynamicProps = stringifyDynamicPropNames(dynamicPropNames);\n      }\n    }\n    node.codegenNode = createVNodeCall(\n      context,\n      vnodeTag,\n      vnodeProps,\n      vnodeChildren,\n      vnodePatchFlag,\n      vnodeDynamicProps,\n      vnodeDirectives,\n      !!shouldUseBlock,\n      false,\n      isComponent,\n      node.loc\n    );\n  };\n};\nfunction resolveComponentType(node, context, ssr = false) {\n  let { tag } = node;\n  const isExplicitDynamic = isComponentTag(tag);\n  const isProp = findProp(\n    node,\n    \"is\",\n    false,\n    true\n    /* allow empty */\n  );\n  if (isProp) {\n    if (isExplicitDynamic || isCompatEnabled(\n      \"COMPILER_IS_ON_ELEMENT\",\n      context\n    )) {\n      let exp;\n      if (isProp.type === 6) {\n        exp = isProp.value && createSimpleExpression(isProp.value.content, true);\n      } else {\n        exp = isProp.exp;\n        if (!exp) {\n          exp = createSimpleExpression(`is`, false, isProp.loc);\n        }\n      }\n      if (exp) {\n        return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [\n          exp\n        ]);\n      }\n    } else if (isProp.type === 6 && isProp.value.content.startsWith(\"vue:\")) {\n      tag = isProp.value.content.slice(4);\n    }\n  }\n  const builtIn = isCoreComponent(tag) || context.isBuiltInComponent(tag);\n  if (builtIn) {\n    if (!ssr)\n      context.helper(builtIn);\n    return builtIn;\n  }\n  context.helper(RESOLVE_COMPONENT);\n  context.components.add(tag);\n  return toValidAssetId(tag, `component`);\n}\nfunction buildProps(node, context, props = node.props, isComponent, isDynamicComponent, ssr = false) {\n  const { tag, loc: elementLoc, children } = node;\n  let properties = [];\n  const mergeArgs = [];\n  const runtimeDirectives = [];\n  const hasChildren = children.length > 0;\n  let shouldUseBlock = false;\n  let patchFlag = 0;\n  let hasRef = false;\n  let hasClassBinding = false;\n  let hasStyleBinding = false;\n  let hasHydrationEventBinding = false;\n  let hasDynamicKeys = false;\n  let hasVnodeHook = false;\n  const dynamicPropNames = [];\n  const pushMergeArg = (arg) => {\n    if (properties.length) {\n      mergeArgs.push(\n        createObjectExpression(dedupeProperties(properties), elementLoc)\n      );\n      properties = [];\n    }\n    if (arg)\n      mergeArgs.push(arg);\n  };\n  const pushRefVForMarker = () => {\n    if (context.scopes.vFor > 0) {\n      properties.push(\n        createObjectProperty(\n          createSimpleExpression(\"ref_for\", true),\n          createSimpleExpression(\"true\")\n        )\n      );\n    }\n  };\n  const analyzePatchFlag = ({ key, value }) => {\n    if (isStaticExp(key)) {\n      const name = key.content;\n      const isEventHandler = isOn(name);\n      if (isEventHandler && (!isComponent || isDynamicComponent) && // omit the flag for click handlers because hydration gives click\n      // dedicated fast path.\n      name.toLowerCase() !== \"onclick\" && // omit v-model handlers\n      name !== \"onUpdate:modelValue\" && // omit onVnodeXXX hooks\n      !isReservedProp(name)) {\n        hasHydrationEventBinding = true;\n      }\n      if (isEventHandler && isReservedProp(name)) {\n        hasVnodeHook = true;\n      }\n      if (isEventHandler && value.type === 14) {\n        value = value.arguments[0];\n      }\n      if (value.type === 20 || (value.type === 4 || value.type === 8) && getConstantType(value, context) > 0) {\n        return;\n      }\n      if (name === \"ref\") {\n        hasRef = true;\n      } else if (name === \"class\") {\n        hasClassBinding = true;\n      } else if (name === \"style\") {\n        hasStyleBinding = true;\n      } else if (name !== \"key\" && !dynamicPropNames.includes(name)) {\n        dynamicPropNames.push(name);\n      }\n      if (isComponent && (name === \"class\" || name === \"style\") && !dynamicPropNames.includes(name)) {\n        dynamicPropNames.push(name);\n      }\n    } else {\n      hasDynamicKeys = true;\n    }\n  };\n  for (let i = 0; i < props.length; i++) {\n    const prop = props[i];\n    if (prop.type === 6) {\n      const { loc, name, nameLoc, value } = prop;\n      let isStatic = true;\n      if (name === \"ref\") {\n        hasRef = true;\n        pushRefVForMarker();\n      }\n      if (name === \"is\" && (isComponentTag(tag) || value && value.content.startsWith(\"vue:\") || isCompatEnabled(\n        \"COMPILER_IS_ON_ELEMENT\",\n        context\n      ))) {\n        continue;\n      }\n      properties.push(\n        createObjectProperty(\n          createSimpleExpression(name, true, nameLoc),\n          createSimpleExpression(\n            value ? value.content : \"\",\n            isStatic,\n            value ? value.loc : loc\n          )\n        )\n      );\n    } else {\n      const { name, arg, exp, loc, modifiers } = prop;\n      const isVBind = name === \"bind\";\n      const isVOn = name === \"on\";\n      if (name === \"slot\") {\n        if (!isComponent) {\n          context.onError(\n            createCompilerError(40, loc)\n          );\n        }\n        continue;\n      }\n      if (name === \"once\" || name === \"memo\") {\n        continue;\n      }\n      if (name === \"is\" || isVBind && isStaticArgOf(arg, \"is\") && (isComponentTag(tag) || isCompatEnabled(\n        \"COMPILER_IS_ON_ELEMENT\",\n        context\n      ))) {\n        continue;\n      }\n      if (isVOn && ssr) {\n        continue;\n      }\n      if (\n        // #938: elements with dynamic keys should be forced into blocks\n        isVBind && isStaticArgOf(arg, \"key\") || // inline before-update hooks need to force block so that it is invoked\n        // before children\n        isVOn && hasChildren && isStaticArgOf(arg, \"vue:before-update\")\n      ) {\n        shouldUseBlock = true;\n      }\n      if (isVBind && isStaticArgOf(arg, \"ref\")) {\n        pushRefVForMarker();\n      }\n      if (!arg && (isVBind || isVOn)) {\n        hasDynamicKeys = true;\n        if (exp) {\n          if (isVBind) {\n            pushRefVForMarker();\n            pushMergeArg();\n            {\n              if (!!(process.env.NODE_ENV !== \"production\")) {\n                const hasOverridableKeys = mergeArgs.some((arg2) => {\n                  if (arg2.type === 15) {\n                    return arg2.properties.some(({ key }) => {\n                      if (key.type !== 4 || !key.isStatic) {\n                        return true;\n                      }\n                      return key.content !== \"class\" && key.content !== \"style\" && !isOn(key.content);\n                    });\n                  } else {\n                    return true;\n                  }\n                });\n                if (hasOverridableKeys) {\n                  checkCompatEnabled(\n                    \"COMPILER_V_BIND_OBJECT_ORDER\",\n                    context,\n                    loc\n                  );\n                }\n              }\n              if (isCompatEnabled(\n                \"COMPILER_V_BIND_OBJECT_ORDER\",\n                context\n              )) {\n                mergeArgs.unshift(exp);\n                continue;\n              }\n            }\n            mergeArgs.push(exp);\n          } else {\n            pushMergeArg({\n              type: 14,\n              loc,\n              callee: context.helper(TO_HANDLERS),\n              arguments: isComponent ? [exp] : [exp, `true`]\n            });\n          }\n        } else {\n          context.onError(\n            createCompilerError(\n              isVBind ? 34 : 35,\n              loc\n            )\n          );\n        }\n        continue;\n      }\n      if (isVBind && modifiers.includes(\"prop\")) {\n        patchFlag |= 32;\n      }\n      const directiveTransform = context.directiveTransforms[name];\n      if (directiveTransform) {\n        const { props: props2, needRuntime } = directiveTransform(prop, node, context);\n        !ssr && props2.forEach(analyzePatchFlag);\n        if (isVOn && arg && !isStaticExp(arg)) {\n          pushMergeArg(createObjectExpression(props2, elementLoc));\n        } else {\n          properties.push(...props2);\n        }\n        if (needRuntime) {\n          runtimeDirectives.push(prop);\n          if (isSymbol(needRuntime)) {\n            directiveImportMap.set(prop, needRuntime);\n          }\n        }\n      } else if (!isBuiltInDirective(name)) {\n        runtimeDirectives.push(prop);\n        if (hasChildren) {\n          shouldUseBlock = true;\n        }\n      }\n    }\n  }\n  let propsExpression = void 0;\n  if (mergeArgs.length) {\n    pushMergeArg();\n    if (mergeArgs.length > 1) {\n      propsExpression = createCallExpression(\n        context.helper(MERGE_PROPS),\n        mergeArgs,\n        elementLoc\n      );\n    } else {\n      propsExpression = mergeArgs[0];\n    }\n  } else if (properties.length) {\n    propsExpression = createObjectExpression(\n      dedupeProperties(properties),\n      elementLoc\n    );\n  }\n  if (hasDynamicKeys) {\n    patchFlag |= 16;\n  } else {\n    if (hasClassBinding && !isComponent) {\n      patchFlag |= 2;\n    }\n    if (hasStyleBinding && !isComponent) {\n      patchFlag |= 4;\n    }\n    if (dynamicPropNames.length) {\n      patchFlag |= 8;\n    }\n    if (hasHydrationEventBinding) {\n      patchFlag |= 32;\n    }\n  }\n  if (!shouldUseBlock && (patchFlag === 0 || patchFlag === 32) && (hasRef || hasVnodeHook || runtimeDirectives.length > 0)) {\n    patchFlag |= 512;\n  }\n  if (!context.inSSR && propsExpression) {\n    switch (propsExpression.type) {\n      case 15:\n        let classKeyIndex = -1;\n        let styleKeyIndex = -1;\n        let hasDynamicKey = false;\n        for (let i = 0; i < propsExpression.properties.length; i++) {\n          const key = propsExpression.properties[i].key;\n          if (isStaticExp(key)) {\n            if (key.content === \"class\") {\n              classKeyIndex = i;\n            } else if (key.content === \"style\") {\n              styleKeyIndex = i;\n            }\n          } else if (!key.isHandlerKey) {\n            hasDynamicKey = true;\n          }\n        }\n        const classProp = propsExpression.properties[classKeyIndex];\n        const styleProp = propsExpression.properties[styleKeyIndex];\n        if (!hasDynamicKey) {\n          if (classProp && !isStaticExp(classProp.value)) {\n            classProp.value = createCallExpression(\n              context.helper(NORMALIZE_CLASS),\n              [classProp.value]\n            );\n          }\n          if (styleProp && // the static style is compiled into an object,\n          // so use `hasStyleBinding` to ensure that it is a dynamic style binding\n          (hasStyleBinding || styleProp.value.type === 4 && styleProp.value.content.trim()[0] === `[` || // v-bind:style and style both exist,\n          // v-bind:style with static literal object\n          styleProp.value.type === 17)) {\n            styleProp.value = createCallExpression(\n              context.helper(NORMALIZE_STYLE),\n              [styleProp.value]\n            );\n          }\n        } else {\n          propsExpression = createCallExpression(\n            context.helper(NORMALIZE_PROPS),\n            [propsExpression]\n          );\n        }\n        break;\n      case 14:\n        break;\n      default:\n        propsExpression = createCallExpression(\n          context.helper(NORMALIZE_PROPS),\n          [\n            createCallExpression(context.helper(GUARD_REACTIVE_PROPS), [\n              propsExpression\n            ])\n          ]\n        );\n        break;\n    }\n  }\n  return {\n    props: propsExpression,\n    directives: runtimeDirectives,\n    patchFlag,\n    dynamicPropNames,\n    shouldUseBlock\n  };\n}\nfunction dedupeProperties(properties) {\n  const knownProps = /* @__PURE__ */ new Map();\n  const deduped = [];\n  for (let i = 0; i < properties.length; i++) {\n    const prop = properties[i];\n    if (prop.key.type === 8 || !prop.key.isStatic) {\n      deduped.push(prop);\n      continue;\n    }\n    const name = prop.key.content;\n    const existing = knownProps.get(name);\n    if (existing) {\n      if (name === \"style\" || name === \"class\" || isOn(name)) {\n        mergeAsArray(existing, prop);\n      }\n    } else {\n      knownProps.set(name, prop);\n      deduped.push(prop);\n    }\n  }\n  return deduped;\n}\nfunction mergeAsArray(existing, incoming) {\n  if (existing.value.type === 17) {\n    existing.value.elements.push(incoming.value);\n  } else {\n    existing.value = createArrayExpression(\n      [existing.value, incoming.value],\n      existing.loc\n    );\n  }\n}\nfunction buildDirectiveArgs(dir, context) {\n  const dirArgs = [];\n  const runtime = directiveImportMap.get(dir);\n  if (runtime) {\n    dirArgs.push(context.helperString(runtime));\n  } else {\n    {\n      context.helper(RESOLVE_DIRECTIVE);\n      context.directives.add(dir.name);\n      dirArgs.push(toValidAssetId(dir.name, `directive`));\n    }\n  }\n  const { loc } = dir;\n  if (dir.exp)\n    dirArgs.push(dir.exp);\n  if (dir.arg) {\n    if (!dir.exp) {\n      dirArgs.push(`void 0`);\n    }\n    dirArgs.push(dir.arg);\n  }\n  if (Object.keys(dir.modifiers).length) {\n    if (!dir.arg) {\n      if (!dir.exp) {\n        dirArgs.push(`void 0`);\n      }\n      dirArgs.push(`void 0`);\n    }\n    const trueExpression = createSimpleExpression(`true`, false, loc);\n    dirArgs.push(\n      createObjectExpression(\n        dir.modifiers.map(\n          (modifier) => createObjectProperty(modifier, trueExpression)\n        ),\n        loc\n      )\n    );\n  }\n  return createArrayExpression(dirArgs, dir.loc);\n}\nfunction stringifyDynamicPropNames(props) {\n  let propsNamesString = `[`;\n  for (let i = 0, l = props.length; i < l; i++) {\n    propsNamesString += JSON.stringify(props[i]);\n    if (i < l - 1)\n      propsNamesString += \", \";\n  }\n  return propsNamesString + `]`;\n}\nfunction isComponentTag(tag) {\n  return tag === \"component\" || tag === \"Component\";\n}\n\nconst transformSlotOutlet = (node, context) => {\n  if (isSlotOutlet(node)) {\n    const { children, loc } = node;\n    const { slotName, slotProps } = processSlotOutlet(node, context);\n    const slotArgs = [\n      context.prefixIdentifiers ? `_ctx.$slots` : `$slots`,\n      slotName,\n      \"{}\",\n      \"undefined\",\n      \"true\"\n    ];\n    let expectedLen = 2;\n    if (slotProps) {\n      slotArgs[2] = slotProps;\n      expectedLen = 3;\n    }\n    if (children.length) {\n      slotArgs[3] = createFunctionExpression([], children, false, false, loc);\n      expectedLen = 4;\n    }\n    if (context.scopeId && !context.slotted) {\n      expectedLen = 5;\n    }\n    slotArgs.splice(expectedLen);\n    node.codegenNode = createCallExpression(\n      context.helper(RENDER_SLOT),\n      slotArgs,\n      loc\n    );\n  }\n};\nfunction processSlotOutlet(node, context) {\n  let slotName = `\"default\"`;\n  let slotProps = void 0;\n  const nonNameProps = [];\n  for (let i = 0; i < node.props.length; i++) {\n    const p = node.props[i];\n    if (p.type === 6) {\n      if (p.value) {\n        if (p.name === \"name\") {\n          slotName = JSON.stringify(p.value.content);\n        } else {\n          p.name = camelize(p.name);\n          nonNameProps.push(p);\n        }\n      }\n    } else {\n      if (p.name === \"bind\" && isStaticArgOf(p.arg, \"name\")) {\n        if (p.exp) {\n          slotName = p.exp;\n        } else if (p.arg && p.arg.type === 4) {\n          const name = camelize(p.arg.content);\n          slotName = p.exp = createSimpleExpression(name, false, p.arg.loc);\n        }\n      } else {\n        if (p.name === \"bind\" && p.arg && isStaticExp(p.arg)) {\n          p.arg.content = camelize(p.arg.content);\n        }\n        nonNameProps.push(p);\n      }\n    }\n  }\n  if (nonNameProps.length > 0) {\n    const { props, directives } = buildProps(\n      node,\n      context,\n      nonNameProps,\n      false,\n      false\n    );\n    slotProps = props;\n    if (directives.length) {\n      context.onError(\n        createCompilerError(\n          36,\n          directives[0].loc\n        )\n      );\n    }\n  }\n  return {\n    slotName,\n    slotProps\n  };\n}\n\nconst fnExpRE = /^\\s*(async\\s*)?(\\([^)]*?\\)|[\\w$_]+)\\s*(:[^=]+)?=>|^\\s*(async\\s+)?function(?:\\s+[\\w$]+)?\\s*\\(/;\nconst transformOn = (dir, node, context, augmentor) => {\n  const { loc, modifiers, arg } = dir;\n  if (!dir.exp && !modifiers.length) {\n    context.onError(createCompilerError(35, loc));\n  }\n  let eventName;\n  if (arg.type === 4) {\n    if (arg.isStatic) {\n      let rawName = arg.content;\n      if (!!(process.env.NODE_ENV !== \"production\") && rawName.startsWith(\"vnode\")) {\n        context.onError(createCompilerError(51, arg.loc));\n      }\n      if (rawName.startsWith(\"vue:\")) {\n        rawName = `vnode-${rawName.slice(4)}`;\n      }\n      const eventString = node.tagType !== 0 || rawName.startsWith(\"vnode\") || !/[A-Z]/.test(rawName) ? (\n        // for non-element and vnode lifecycle event listeners, auto convert\n        // it to camelCase. See issue #2249\n        toHandlerKey(camelize(rawName))\n      ) : (\n        // preserve case for plain element listeners that have uppercase\n        // letters, as these may be custom elements' custom events\n        `on:${rawName}`\n      );\n      eventName = createSimpleExpression(eventString, true, arg.loc);\n    } else {\n      eventName = createCompoundExpression([\n        `${context.helperString(TO_HANDLER_KEY)}(`,\n        arg,\n        `)`\n      ]);\n    }\n  } else {\n    eventName = arg;\n    eventName.children.unshift(`${context.helperString(TO_HANDLER_KEY)}(`);\n    eventName.children.push(`)`);\n  }\n  let exp = dir.exp;\n  if (exp && !exp.content.trim()) {\n    exp = void 0;\n  }\n  let shouldCache = context.cacheHandlers && !exp && !context.inVOnce;\n  if (exp) {\n    const isMemberExp = isMemberExpression(exp.content);\n    const isInlineStatement = !(isMemberExp || fnExpRE.test(exp.content));\n    const hasMultipleStatements = exp.content.includes(`;`);\n    if (!!(process.env.NODE_ENV !== \"production\") && true) {\n      validateBrowserExpression(\n        exp,\n        context,\n        false,\n        hasMultipleStatements\n      );\n    }\n    if (isInlineStatement || shouldCache && isMemberExp) {\n      exp = createCompoundExpression([\n        `${isInlineStatement ? `$event` : `${``}(...args)`} => ${hasMultipleStatements ? `{` : `(`}`,\n        exp,\n        hasMultipleStatements ? `}` : `)`\n      ]);\n    }\n  }\n  let ret = {\n    props: [\n      createObjectProperty(\n        eventName,\n        exp || createSimpleExpression(`() => {}`, false, loc)\n      )\n    ]\n  };\n  if (augmentor) {\n    ret = augmentor(ret);\n  }\n  if (shouldCache) {\n    ret.props[0].value = context.cache(ret.props[0].value);\n  }\n  ret.props.forEach((p) => p.key.isHandlerKey = true);\n  return ret;\n};\n\nconst transformBind = (dir, _node, context) => {\n  const { modifiers, loc } = dir;\n  const arg = dir.arg;\n  let { exp } = dir;\n  if (exp && exp.type === 4 && !exp.content.trim()) {\n    {\n      exp = void 0;\n    }\n  }\n  if (!exp) {\n    if (arg.type !== 4 || !arg.isStatic) {\n      context.onError(\n        createCompilerError(\n          52,\n          arg.loc\n        )\n      );\n      return {\n        props: [\n          createObjectProperty(arg, createSimpleExpression(\"\", true, loc))\n        ]\n      };\n    }\n    const propName = camelize(arg.content);\n    exp = dir.exp = createSimpleExpression(propName, false, arg.loc);\n  }\n  if (arg.type !== 4) {\n    arg.children.unshift(`(`);\n    arg.children.push(`) || \"\"`);\n  } else if (!arg.isStatic) {\n    arg.content = `${arg.content} || \"\"`;\n  }\n  if (modifiers.includes(\"camel\")) {\n    if (arg.type === 4) {\n      if (arg.isStatic) {\n        arg.content = camelize(arg.content);\n      } else {\n        arg.content = `${context.helperString(CAMELIZE)}(${arg.content})`;\n      }\n    } else {\n      arg.children.unshift(`${context.helperString(CAMELIZE)}(`);\n      arg.children.push(`)`);\n    }\n  }\n  if (!context.inSSR) {\n    if (modifiers.includes(\"prop\")) {\n      injectPrefix(arg, \".\");\n    }\n    if (modifiers.includes(\"attr\")) {\n      injectPrefix(arg, \"^\");\n    }\n  }\n  return {\n    props: [createObjectProperty(arg, exp)]\n  };\n};\nconst injectPrefix = (arg, prefix) => {\n  if (arg.type === 4) {\n    if (arg.isStatic) {\n      arg.content = prefix + arg.content;\n    } else {\n      arg.content = `\\`${prefix}\\${${arg.content}}\\``;\n    }\n  } else {\n    arg.children.unshift(`'${prefix}' + (`);\n    arg.children.push(`)`);\n  }\n};\n\nconst transformText = (node, context) => {\n  if (node.type === 0 || node.type === 1 || node.type === 11 || node.type === 10) {\n    return () => {\n      const children = node.children;\n      let currentContainer = void 0;\n      let hasText = false;\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        if (isText$1(child)) {\n          hasText = true;\n          for (let j = i + 1; j < children.length; j++) {\n            const next = children[j];\n            if (isText$1(next)) {\n              if (!currentContainer) {\n                currentContainer = children[i] = createCompoundExpression(\n                  [child],\n                  child.loc\n                );\n              }\n              currentContainer.children.push(` + `, next);\n              children.splice(j, 1);\n              j--;\n            } else {\n              currentContainer = void 0;\n              break;\n            }\n          }\n        }\n      }\n      if (!hasText || // if this is a plain element with a single text child, leave it\n      // as-is since the runtime has dedicated fast path for this by directly\n      // setting textContent of the element.\n      // for component root it's always normalized anyway.\n      children.length === 1 && (node.type === 0 || node.type === 1 && node.tagType === 0 && // #3756\n      // custom directives can potentially add DOM elements arbitrarily,\n      // we need to avoid setting textContent of the element at runtime\n      // to avoid accidentally overwriting the DOM elements added\n      // by the user through custom directives.\n      !node.props.find(\n        (p) => p.type === 7 && !context.directiveTransforms[p.name]\n      ) && // in compat mode, <template> tags with no special directives\n      // will be rendered as a fragment so its children must be\n      // converted into vnodes.\n      !(node.tag === \"template\"))) {\n        return;\n      }\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        if (isText$1(child) || child.type === 8) {\n          const callArgs = [];\n          if (child.type !== 2 || child.content !== \" \") {\n            callArgs.push(child);\n          }\n          if (!context.ssr && getConstantType(child, context) === 0) {\n            callArgs.push(\n              1 + (!!(process.env.NODE_ENV !== \"production\") ? ` /* ${PatchFlagNames[1]} */` : ``)\n            );\n          }\n          children[i] = {\n            type: 12,\n            content: child,\n            loc: child.loc,\n            codegenNode: createCallExpression(\n              context.helper(CREATE_TEXT),\n              callArgs\n            )\n          };\n        }\n      }\n    };\n  }\n};\n\nconst seen$1 = /* @__PURE__ */ new WeakSet();\nconst transformOnce = (node, context) => {\n  if (node.type === 1 && findDir(node, \"once\", true)) {\n    if (seen$1.has(node) || context.inVOnce || context.inSSR) {\n      return;\n    }\n    seen$1.add(node);\n    context.inVOnce = true;\n    context.helper(SET_BLOCK_TRACKING);\n    return () => {\n      context.inVOnce = false;\n      const cur = context.currentNode;\n      if (cur.codegenNode) {\n        cur.codegenNode = context.cache(\n          cur.codegenNode,\n          true\n          /* isVNode */\n        );\n      }\n    };\n  }\n};\n\nconst transformModel = (dir, node, context) => {\n  const { exp, arg } = dir;\n  if (!exp) {\n    context.onError(\n      createCompilerError(41, dir.loc)\n    );\n    return createTransformProps();\n  }\n  const rawExp = exp.loc.source;\n  const expString = exp.type === 4 ? exp.content : rawExp;\n  const bindingType = context.bindingMetadata[rawExp];\n  if (bindingType === \"props\" || bindingType === \"props-aliased\") {\n    context.onError(createCompilerError(44, exp.loc));\n    return createTransformProps();\n  }\n  const maybeRef = false;\n  if (!expString.trim() || !isMemberExpression(expString) && !maybeRef) {\n    context.onError(\n      createCompilerError(42, exp.loc)\n    );\n    return createTransformProps();\n  }\n  const propName = arg ? arg : createSimpleExpression(\"modelValue\", true);\n  const eventName = arg ? isStaticExp(arg) ? `onUpdate:${camelize(arg.content)}` : createCompoundExpression(['\"onUpdate:\" + ', arg]) : `onUpdate:modelValue`;\n  let assignmentExp;\n  const eventArg = context.isTS ? `($event: any)` : `$event`;\n  {\n    assignmentExp = createCompoundExpression([\n      `${eventArg} => ((`,\n      exp,\n      `) = $event)`\n    ]);\n  }\n  const props = [\n    // modelValue: foo\n    createObjectProperty(propName, dir.exp),\n    // \"onUpdate:modelValue\": $event => (foo = $event)\n    createObjectProperty(eventName, assignmentExp)\n  ];\n  if (dir.modifiers.length && node.tagType === 1) {\n    const modifiers = dir.modifiers.map((m) => (isSimpleIdentifier(m) ? m : JSON.stringify(m)) + `: true`).join(`, `);\n    const modifiersKey = arg ? isStaticExp(arg) ? `${arg.content}Modifiers` : createCompoundExpression([arg, ' + \"Modifiers\"']) : `modelModifiers`;\n    props.push(\n      createObjectProperty(\n        modifiersKey,\n        createSimpleExpression(\n          `{ ${modifiers} }`,\n          false,\n          dir.loc,\n          2\n        )\n      )\n    );\n  }\n  return createTransformProps(props);\n};\nfunction createTransformProps(props = []) {\n  return { props };\n}\n\nconst validDivisionCharRE = /[\\w).+\\-_$\\]]/;\nconst transformFilter = (node, context) => {\n  if (!isCompatEnabled(\"COMPILER_FILTERS\", context)) {\n    return;\n  }\n  if (node.type === 5) {\n    rewriteFilter(node.content, context);\n  }\n  if (node.type === 1) {\n    node.props.forEach((prop) => {\n      if (prop.type === 7 && prop.name !== \"for\" && prop.exp) {\n        rewriteFilter(prop.exp, context);\n      }\n    });\n  }\n};\nfunction rewriteFilter(node, context) {\n  if (node.type === 4) {\n    parseFilter(node, context);\n  } else {\n    for (let i = 0; i < node.children.length; i++) {\n      const child = node.children[i];\n      if (typeof child !== \"object\")\n        continue;\n      if (child.type === 4) {\n        parseFilter(child, context);\n      } else if (child.type === 8) {\n        rewriteFilter(node, context);\n      } else if (child.type === 5) {\n        rewriteFilter(child.content, context);\n      }\n    }\n  }\n}\nfunction parseFilter(node, context) {\n  const exp = node.content;\n  let inSingle = false;\n  let inDouble = false;\n  let inTemplateString = false;\n  let inRegex = false;\n  let curly = 0;\n  let square = 0;\n  let paren = 0;\n  let lastFilterIndex = 0;\n  let c, prev, i, expression, filters = [];\n  for (i = 0; i < exp.length; i++) {\n    prev = c;\n    c = exp.charCodeAt(i);\n    if (inSingle) {\n      if (c === 39 && prev !== 92)\n        inSingle = false;\n    } else if (inDouble) {\n      if (c === 34 && prev !== 92)\n        inDouble = false;\n    } else if (inTemplateString) {\n      if (c === 96 && prev !== 92)\n        inTemplateString = false;\n    } else if (inRegex) {\n      if (c === 47 && prev !== 92)\n        inRegex = false;\n    } else if (c === 124 && // pipe\n    exp.charCodeAt(i + 1) !== 124 && exp.charCodeAt(i - 1) !== 124 && !curly && !square && !paren) {\n      if (expression === void 0) {\n        lastFilterIndex = i + 1;\n        expression = exp.slice(0, i).trim();\n      } else {\n        pushFilter();\n      }\n    } else {\n      switch (c) {\n        case 34:\n          inDouble = true;\n          break;\n        case 39:\n          inSingle = true;\n          break;\n        case 96:\n          inTemplateString = true;\n          break;\n        case 40:\n          paren++;\n          break;\n        case 41:\n          paren--;\n          break;\n        case 91:\n          square++;\n          break;\n        case 93:\n          square--;\n          break;\n        case 123:\n          curly++;\n          break;\n        case 125:\n          curly--;\n          break;\n      }\n      if (c === 47) {\n        let j = i - 1;\n        let p;\n        for (; j >= 0; j--) {\n          p = exp.charAt(j);\n          if (p !== \" \")\n            break;\n        }\n        if (!p || !validDivisionCharRE.test(p)) {\n          inRegex = true;\n        }\n      }\n    }\n  }\n  if (expression === void 0) {\n    expression = exp.slice(0, i).trim();\n  } else if (lastFilterIndex !== 0) {\n    pushFilter();\n  }\n  function pushFilter() {\n    filters.push(exp.slice(lastFilterIndex, i).trim());\n    lastFilterIndex = i + 1;\n  }\n  if (filters.length) {\n    !!(process.env.NODE_ENV !== \"production\") && warnDeprecation(\n      \"COMPILER_FILTERS\",\n      context,\n      node.loc\n    );\n    for (i = 0; i < filters.length; i++) {\n      expression = wrapFilter(expression, filters[i], context);\n    }\n    node.content = expression;\n  }\n}\nfunction wrapFilter(exp, filter, context) {\n  context.helper(RESOLVE_FILTER);\n  const i = filter.indexOf(\"(\");\n  if (i < 0) {\n    context.filters.add(filter);\n    return `${toValidAssetId(filter, \"filter\")}(${exp})`;\n  } else {\n    const name = filter.slice(0, i);\n    const args = filter.slice(i + 1);\n    context.filters.add(name);\n    return `${toValidAssetId(name, \"filter\")}(${exp}${args !== \")\" ? \",\" + args : args}`;\n  }\n}\n\nconst seen = /* @__PURE__ */ new WeakSet();\nconst transformMemo = (node, context) => {\n  if (node.type === 1) {\n    const dir = findDir(node, \"memo\");\n    if (!dir || seen.has(node)) {\n      return;\n    }\n    seen.add(node);\n    return () => {\n      const codegenNode = node.codegenNode || context.currentNode.codegenNode;\n      if (codegenNode && codegenNode.type === 13) {\n        if (node.tagType !== 1) {\n          convertToBlock(codegenNode, context);\n        }\n        node.codegenNode = createCallExpression(context.helper(WITH_MEMO), [\n          dir.exp,\n          createFunctionExpression(void 0, codegenNode),\n          `_cache`,\n          String(context.cached++)\n        ]);\n      }\n    };\n  }\n};\n\nfunction getBaseTransformPreset(prefixIdentifiers) {\n  return [\n    [\n      transformOnce,\n      transformIf,\n      transformMemo,\n      transformFor,\n      ...[transformFilter] ,\n      ...!!(process.env.NODE_ENV !== \"production\") ? [transformExpression] : [],\n      transformSlotOutlet,\n      transformElement,\n      trackSlotScopes,\n      transformText\n    ],\n    {\n      on: transformOn,\n      bind: transformBind,\n      model: transformModel\n    }\n  ];\n}\nfunction baseCompile(source, options = {}) {\n  const onError = options.onError || defaultOnError;\n  const isModuleMode = options.mode === \"module\";\n  {\n    if (options.prefixIdentifiers === true) {\n      onError(createCompilerError(47));\n    } else if (isModuleMode) {\n      onError(createCompilerError(48));\n    }\n  }\n  const prefixIdentifiers = false;\n  if (options.cacheHandlers) {\n    onError(createCompilerError(49));\n  }\n  if (options.scopeId && !isModuleMode) {\n    onError(createCompilerError(50));\n  }\n  const resolvedOptions = extend({}, options, {\n    prefixIdentifiers\n  });\n  const ast = isString(source) ? baseParse(source, resolvedOptions) : source;\n  const [nodeTransforms, directiveTransforms] = getBaseTransformPreset();\n  transform(\n    ast,\n    extend({}, resolvedOptions, {\n      nodeTransforms: [\n        ...nodeTransforms,\n        ...options.nodeTransforms || []\n        // user transforms\n      ],\n      directiveTransforms: extend(\n        {},\n        directiveTransforms,\n        options.directiveTransforms || {}\n        // user transforms\n      )\n    })\n  );\n  return generate(ast, resolvedOptions);\n}\n\nconst BindingTypes = {\n  \"DATA\": \"data\",\n  \"PROPS\": \"props\",\n  \"PROPS_ALIASED\": \"props-aliased\",\n  \"SETUP_LET\": \"setup-let\",\n  \"SETUP_CONST\": \"setup-const\",\n  \"SETUP_REACTIVE_CONST\": \"setup-reactive-const\",\n  \"SETUP_MAYBE_REF\": \"setup-maybe-ref\",\n  \"SETUP_REF\": \"setup-ref\",\n  \"OPTIONS\": \"options\",\n  \"LITERAL_CONST\": \"literal-const\"\n};\n\nconst noopDirectiveTransform = () => ({ props: [] });\n\nexport { BASE_TRANSITION, BindingTypes, CAMELIZE, CAPITALIZE, CREATE_BLOCK, CREATE_COMMENT, CREATE_ELEMENT_BLOCK, CREATE_ELEMENT_VNODE, CREATE_SLOTS, CREATE_STATIC, CREATE_TEXT, CREATE_VNODE, CompilerDeprecationTypes, ConstantTypes, ElementTypes, ErrorCodes, FRAGMENT, GUARD_REACTIVE_PROPS, IS_MEMO_SAME, IS_REF, KEEP_ALIVE, MERGE_PROPS, NORMALIZE_CLASS, NORMALIZE_PROPS, NORMALIZE_STYLE, Namespaces, NodeTypes, OPEN_BLOCK, POP_SCOPE_ID, PUSH_SCOPE_ID, RENDER_LIST, RENDER_SLOT, RESOLVE_COMPONENT, RESOLVE_DIRECTIVE, RESOLVE_DYNAMIC_COMPONENT, RESOLVE_FILTER, SET_BLOCK_TRACKING, SUSPENSE, TELEPORT, TO_DISPLAY_STRING, TO_HANDLERS, TO_HANDLER_KEY, TS_NODE_TYPES, UNREF, WITH_CTX, WITH_DIRECTIVES, WITH_MEMO, advancePositionWithClone, advancePositionWithMutation, assert, baseCompile, baseParse, buildDirectiveArgs, buildProps, buildSlots, checkCompatEnabled, convertToBlock, createArrayExpression, createAssignmentExpression, createBlockStatement, createCacheExpression, createCallExpression, createCompilerError, createCompoundExpression, createConditionalExpression, createForLoopParams, createFunctionExpression, createIfStatement, createInterpolation, createObjectExpression, createObjectProperty, createReturnStatement, createRoot, createSequenceExpression, createSimpleExpression, createStructuralDirectiveTransform, createTemplateLiteral, createTransformContext, createVNodeCall, errorMessages, extractIdentifiers, findDir, findProp, forAliasRE, generate, getBaseTransformPreset, getConstantType, getMemoedVNodeCall, getVNodeBlockHelper, getVNodeHelper, hasDynamicKeyVBind, hasScopeRef, helperNameMap, injectProp, isCoreComponent, isFunctionType, isInDestructureAssignment, isInNewExpression, isMemberExpression, isMemberExpressionBrowser, isMemberExpressionNode, isReferencedIdentifier, isSimpleIdentifier, isSlotOutlet, isStaticArgOf, isStaticExp, isStaticProperty, isStaticPropertyKey, isTemplateNode, isText$1 as isText, isVSlot, locStub, noopDirectiveTransform, processExpression, processFor, processIf, processSlotOutlet, registerRuntimeHelpers, resolveComponentType, stringifyExpression, toValidAssetId, trackSlotScopes, trackVForSlotScopes, transform, transformBind, transformElement, transformExpression, transformModel, transformOn, traverseNode, unwrapTSNode, walkBlockDeclarations, walkFunctionParams, walkIdentifiers, warnDeprecation };\n","/**\n* @vue/compiler-dom v3.4.27\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { registerRuntimeHelpers, createSimpleExpression, createCompilerError, createObjectProperty, getConstantType, createCallExpression, TO_DISPLAY_STRING, transformModel as transformModel$1, findProp, hasDynamicKeyVBind, findDir, isStaticArgOf, transformOn as transformOn$1, isStaticExp, createCompoundExpression, checkCompatEnabled, noopDirectiveTransform, baseCompile, baseParse } from '@vue/compiler-core';\nexport * from '@vue/compiler-core';\nimport { isVoidTag, isHTMLTag, isSVGTag, isMathMLTag, parseStringStyle, capitalize, makeMap, extend } from '@vue/shared';\n\nconst V_MODEL_RADIO = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vModelRadio` : ``);\nconst V_MODEL_CHECKBOX = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vModelCheckbox` : ``);\nconst V_MODEL_TEXT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vModelText` : ``);\nconst V_MODEL_SELECT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vModelSelect` : ``);\nconst V_MODEL_DYNAMIC = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vModelDynamic` : ``);\nconst V_ON_WITH_MODIFIERS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vOnModifiersGuard` : ``);\nconst V_ON_WITH_KEYS = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vOnKeysGuard` : ``);\nconst V_SHOW = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `vShow` : ``);\nconst TRANSITION = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `Transition` : ``);\nconst TRANSITION_GROUP = Symbol(!!(process.env.NODE_ENV !== \"production\") ? `TransitionGroup` : ``);\nregisterRuntimeHelpers({\n  [V_MODEL_RADIO]: `vModelRadio`,\n  [V_MODEL_CHECKBOX]: `vModelCheckbox`,\n  [V_MODEL_TEXT]: `vModelText`,\n  [V_MODEL_SELECT]: `vModelSelect`,\n  [V_MODEL_DYNAMIC]: `vModelDynamic`,\n  [V_ON_WITH_MODIFIERS]: `withModifiers`,\n  [V_ON_WITH_KEYS]: `withKeys`,\n  [V_SHOW]: `vShow`,\n  [TRANSITION]: `Transition`,\n  [TRANSITION_GROUP]: `TransitionGroup`\n});\n\nlet decoder;\nfunction decodeHtmlBrowser(raw, asAttr = false) {\n  if (!decoder) {\n    decoder = document.createElement(\"div\");\n  }\n  if (asAttr) {\n    decoder.innerHTML = `<div foo=\"${raw.replace(/\"/g, \"&quot;\")}\">`;\n    return decoder.children[0].getAttribute(\"foo\");\n  } else {\n    decoder.innerHTML = raw;\n    return decoder.textContent;\n  }\n}\n\nconst parserOptions = {\n  parseMode: \"html\",\n  isVoidTag,\n  isNativeTag: (tag) => isHTMLTag(tag) || isSVGTag(tag) || isMathMLTag(tag),\n  isPreTag: (tag) => tag === \"pre\",\n  decodeEntities: decodeHtmlBrowser ,\n  isBuiltInComponent: (tag) => {\n    if (tag === \"Transition\" || tag === \"transition\") {\n      return TRANSITION;\n    } else if (tag === \"TransitionGroup\" || tag === \"transition-group\") {\n      return TRANSITION_GROUP;\n    }\n  },\n  // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher\n  getNamespace(tag, parent, rootNamespace) {\n    let ns = parent ? parent.ns : rootNamespace;\n    if (parent && ns === 2) {\n      if (parent.tag === \"annotation-xml\") {\n        if (tag === \"svg\") {\n          return 1;\n        }\n        if (parent.props.some(\n          (a) => a.type === 6 && a.name === \"encoding\" && a.value != null && (a.value.content === \"text/html\" || a.value.content === \"application/xhtml+xml\")\n        )) {\n          ns = 0;\n        }\n      } else if (/^m(?:[ions]|text)$/.test(parent.tag) && tag !== \"mglyph\" && tag !== \"malignmark\") {\n        ns = 0;\n      }\n    } else if (parent && ns === 1) {\n      if (parent.tag === \"foreignObject\" || parent.tag === \"desc\" || parent.tag === \"title\") {\n        ns = 0;\n      }\n    }\n    if (ns === 0) {\n      if (tag === \"svg\") {\n        return 1;\n      }\n      if (tag === \"math\") {\n        return 2;\n      }\n    }\n    return ns;\n  }\n};\n\nconst transformStyle = (node) => {\n  if (node.type === 1) {\n    node.props.forEach((p, i) => {\n      if (p.type === 6 && p.name === \"style\" && p.value) {\n        node.props[i] = {\n          type: 7,\n          name: `bind`,\n          arg: createSimpleExpression(`style`, true, p.loc),\n          exp: parseInlineCSS(p.value.content, p.loc),\n          modifiers: [],\n          loc: p.loc\n        };\n      }\n    });\n  }\n};\nconst parseInlineCSS = (cssText, loc) => {\n  const normalized = parseStringStyle(cssText);\n  return createSimpleExpression(\n    JSON.stringify(normalized),\n    false,\n    loc,\n    3\n  );\n};\n\nfunction createDOMCompilerError(code, loc) {\n  return createCompilerError(\n    code,\n    loc,\n    !!(process.env.NODE_ENV !== \"production\") || false ? DOMErrorMessages : void 0\n  );\n}\nconst DOMErrorCodes = {\n  \"X_V_HTML_NO_EXPRESSION\": 53,\n  \"53\": \"X_V_HTML_NO_EXPRESSION\",\n  \"X_V_HTML_WITH_CHILDREN\": 54,\n  \"54\": \"X_V_HTML_WITH_CHILDREN\",\n  \"X_V_TEXT_NO_EXPRESSION\": 55,\n  \"55\": \"X_V_TEXT_NO_EXPRESSION\",\n  \"X_V_TEXT_WITH_CHILDREN\": 56,\n  \"56\": \"X_V_TEXT_WITH_CHILDREN\",\n  \"X_V_MODEL_ON_INVALID_ELEMENT\": 57,\n  \"57\": \"X_V_MODEL_ON_INVALID_ELEMENT\",\n  \"X_V_MODEL_ARG_ON_ELEMENT\": 58,\n  \"58\": \"X_V_MODEL_ARG_ON_ELEMENT\",\n  \"X_V_MODEL_ON_FILE_INPUT_ELEMENT\": 59,\n  \"59\": \"X_V_MODEL_ON_FILE_INPUT_ELEMENT\",\n  \"X_V_MODEL_UNNECESSARY_VALUE\": 60,\n  \"60\": \"X_V_MODEL_UNNECESSARY_VALUE\",\n  \"X_V_SHOW_NO_EXPRESSION\": 61,\n  \"61\": \"X_V_SHOW_NO_EXPRESSION\",\n  \"X_TRANSITION_INVALID_CHILDREN\": 62,\n  \"62\": \"X_TRANSITION_INVALID_CHILDREN\",\n  \"X_IGNORED_SIDE_EFFECT_TAG\": 63,\n  \"63\": \"X_IGNORED_SIDE_EFFECT_TAG\",\n  \"__EXTEND_POINT__\": 64,\n  \"64\": \"__EXTEND_POINT__\"\n};\nconst DOMErrorMessages = {\n  [53]: `v-html is missing expression.`,\n  [54]: `v-html will override element children.`,\n  [55]: `v-text is missing expression.`,\n  [56]: `v-text will override element children.`,\n  [57]: `v-model can only be used on <input>, <textarea> and <select> elements.`,\n  [58]: `v-model argument is not supported on plain elements.`,\n  [59]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,\n  [60]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,\n  [61]: `v-show is missing expression.`,\n  [62]: `<Transition> expects exactly one child element or component.`,\n  [63]: `Tags with side effect (<script> and <style>) are ignored in client component templates.`\n};\n\nconst transformVHtml = (dir, node, context) => {\n  const { exp, loc } = dir;\n  if (!exp) {\n    context.onError(\n      createDOMCompilerError(53, loc)\n    );\n  }\n  if (node.children.length) {\n    context.onError(\n      createDOMCompilerError(54, loc)\n    );\n    node.children.length = 0;\n  }\n  return {\n    props: [\n      createObjectProperty(\n        createSimpleExpression(`innerHTML`, true, loc),\n        exp || createSimpleExpression(\"\", true)\n      )\n    ]\n  };\n};\n\nconst transformVText = (dir, node, context) => {\n  const { exp, loc } = dir;\n  if (!exp) {\n    context.onError(\n      createDOMCompilerError(55, loc)\n    );\n  }\n  if (node.children.length) {\n    context.onError(\n      createDOMCompilerError(56, loc)\n    );\n    node.children.length = 0;\n  }\n  return {\n    props: [\n      createObjectProperty(\n        createSimpleExpression(`textContent`, true),\n        exp ? getConstantType(exp, context) > 0 ? exp : createCallExpression(\n          context.helperString(TO_DISPLAY_STRING),\n          [exp],\n          loc\n        ) : createSimpleExpression(\"\", true)\n      )\n    ]\n  };\n};\n\nconst transformModel = (dir, node, context) => {\n  const baseResult = transformModel$1(dir, node, context);\n  if (!baseResult.props.length || node.tagType === 1) {\n    return baseResult;\n  }\n  if (dir.arg) {\n    context.onError(\n      createDOMCompilerError(\n        58,\n        dir.arg.loc\n      )\n    );\n  }\n  function checkDuplicatedValue() {\n    const value = findDir(node, \"bind\");\n    if (value && isStaticArgOf(value.arg, \"value\")) {\n      context.onError(\n        createDOMCompilerError(\n          60,\n          value.loc\n        )\n      );\n    }\n  }\n  const { tag } = node;\n  const isCustomElement = context.isCustomElement(tag);\n  if (tag === \"input\" || tag === \"textarea\" || tag === \"select\" || isCustomElement) {\n    let directiveToUse = V_MODEL_TEXT;\n    let isInvalidType = false;\n    if (tag === \"input\" || isCustomElement) {\n      const type = findProp(node, `type`);\n      if (type) {\n        if (type.type === 7) {\n          directiveToUse = V_MODEL_DYNAMIC;\n        } else if (type.value) {\n          switch (type.value.content) {\n            case \"radio\":\n              directiveToUse = V_MODEL_RADIO;\n              break;\n            case \"checkbox\":\n              directiveToUse = V_MODEL_CHECKBOX;\n              break;\n            case \"file\":\n              isInvalidType = true;\n              context.onError(\n                createDOMCompilerError(\n                  59,\n                  dir.loc\n                )\n              );\n              break;\n            default:\n              !!(process.env.NODE_ENV !== \"production\") && checkDuplicatedValue();\n              break;\n          }\n        }\n      } else if (hasDynamicKeyVBind(node)) {\n        directiveToUse = V_MODEL_DYNAMIC;\n      } else {\n        !!(process.env.NODE_ENV !== \"production\") && checkDuplicatedValue();\n      }\n    } else if (tag === \"select\") {\n      directiveToUse = V_MODEL_SELECT;\n    } else {\n      !!(process.env.NODE_ENV !== \"production\") && checkDuplicatedValue();\n    }\n    if (!isInvalidType) {\n      baseResult.needRuntime = context.helper(directiveToUse);\n    }\n  } else {\n    context.onError(\n      createDOMCompilerError(\n        57,\n        dir.loc\n      )\n    );\n  }\n  baseResult.props = baseResult.props.filter(\n    (p) => !(p.key.type === 4 && p.key.content === \"modelValue\")\n  );\n  return baseResult;\n};\n\nconst isEventOptionModifier = /* @__PURE__ */ makeMap(`passive,once,capture`);\nconst isNonKeyModifier = /* @__PURE__ */ makeMap(\n  // event propagation management\n  `stop,prevent,self,ctrl,shift,alt,meta,exact,middle`\n);\nconst maybeKeyModifier = /* @__PURE__ */ makeMap(\"left,right\");\nconst isKeyboardEvent = /* @__PURE__ */ makeMap(\n  `onkeyup,onkeydown,onkeypress`,\n  true\n);\nconst resolveModifiers = (key, modifiers, context, loc) => {\n  const keyModifiers = [];\n  const nonKeyModifiers = [];\n  const eventOptionModifiers = [];\n  for (let i = 0; i < modifiers.length; i++) {\n    const modifier = modifiers[i];\n    if (modifier === \"native\" && checkCompatEnabled(\n      \"COMPILER_V_ON_NATIVE\",\n      context,\n      loc\n    )) {\n      eventOptionModifiers.push(modifier);\n    } else if (isEventOptionModifier(modifier)) {\n      eventOptionModifiers.push(modifier);\n    } else {\n      if (maybeKeyModifier(modifier)) {\n        if (isStaticExp(key)) {\n          if (isKeyboardEvent(key.content)) {\n            keyModifiers.push(modifier);\n          } else {\n            nonKeyModifiers.push(modifier);\n          }\n        } else {\n          keyModifiers.push(modifier);\n          nonKeyModifiers.push(modifier);\n        }\n      } else {\n        if (isNonKeyModifier(modifier)) {\n          nonKeyModifiers.push(modifier);\n        } else {\n          keyModifiers.push(modifier);\n        }\n      }\n    }\n  }\n  return {\n    keyModifiers,\n    nonKeyModifiers,\n    eventOptionModifiers\n  };\n};\nconst transformClick = (key, event) => {\n  const isStaticClick = isStaticExp(key) && key.content.toLowerCase() === \"onclick\";\n  return isStaticClick ? createSimpleExpression(event, true) : key.type !== 4 ? createCompoundExpression([\n    `(`,\n    key,\n    `) === \"onClick\" ? \"${event}\" : (`,\n    key,\n    `)`\n  ]) : key;\n};\nconst transformOn = (dir, node, context) => {\n  return transformOn$1(dir, node, context, (baseResult) => {\n    const { modifiers } = dir;\n    if (!modifiers.length)\n      return baseResult;\n    let { key, value: handlerExp } = baseResult.props[0];\n    const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers, context, dir.loc);\n    if (nonKeyModifiers.includes(\"right\")) {\n      key = transformClick(key, `onContextmenu`);\n    }\n    if (nonKeyModifiers.includes(\"middle\")) {\n      key = transformClick(key, `onMouseup`);\n    }\n    if (nonKeyModifiers.length) {\n      handlerExp = createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [\n        handlerExp,\n        JSON.stringify(nonKeyModifiers)\n      ]);\n    }\n    if (keyModifiers.length && // if event name is dynamic, always wrap with keys guard\n    (!isStaticExp(key) || isKeyboardEvent(key.content))) {\n      handlerExp = createCallExpression(context.helper(V_ON_WITH_KEYS), [\n        handlerExp,\n        JSON.stringify(keyModifiers)\n      ]);\n    }\n    if (eventOptionModifiers.length) {\n      const modifierPostfix = eventOptionModifiers.map(capitalize).join(\"\");\n      key = isStaticExp(key) ? createSimpleExpression(`${key.content}${modifierPostfix}`, true) : createCompoundExpression([`(`, key, `) + \"${modifierPostfix}\"`]);\n    }\n    return {\n      props: [createObjectProperty(key, handlerExp)]\n    };\n  });\n};\n\nconst transformShow = (dir, node, context) => {\n  const { exp, loc } = dir;\n  if (!exp) {\n    context.onError(\n      createDOMCompilerError(61, loc)\n    );\n  }\n  return {\n    props: [],\n    needRuntime: context.helper(V_SHOW)\n  };\n};\n\nconst transformTransition = (node, context) => {\n  if (node.type === 1 && node.tagType === 1) {\n    const component = context.isBuiltInComponent(node.tag);\n    if (component === TRANSITION) {\n      return () => {\n        if (!node.children.length) {\n          return;\n        }\n        if (hasMultipleChildren(node)) {\n          context.onError(\n            createDOMCompilerError(\n              62,\n              {\n                start: node.children[0].loc.start,\n                end: node.children[node.children.length - 1].loc.end,\n                source: \"\"\n              }\n            )\n          );\n        }\n        const child = node.children[0];\n        if (child.type === 1) {\n          for (const p of child.props) {\n            if (p.type === 7 && p.name === \"show\") {\n              node.props.push({\n                type: 6,\n                name: \"persisted\",\n                nameLoc: node.loc,\n                value: void 0,\n                loc: node.loc\n              });\n            }\n          }\n        }\n      };\n    }\n  }\n};\nfunction hasMultipleChildren(node) {\n  const children = node.children = node.children.filter(\n    (c) => c.type !== 3 && !(c.type === 2 && !c.content.trim())\n  );\n  const child = children[0];\n  return children.length !== 1 || child.type === 11 || child.type === 9 && child.branches.some(hasMultipleChildren);\n}\n\nconst ignoreSideEffectTags = (node, context) => {\n  if (node.type === 1 && node.tagType === 0 && (node.tag === \"script\" || node.tag === \"style\")) {\n    !!(process.env.NODE_ENV !== \"production\") && context.onError(\n      createDOMCompilerError(\n        63,\n        node.loc\n      )\n    );\n    context.removeNode();\n  }\n};\n\nconst DOMNodeTransforms = [\n  transformStyle,\n  ...!!(process.env.NODE_ENV !== \"production\") ? [transformTransition] : []\n];\nconst DOMDirectiveTransforms = {\n  cloak: noopDirectiveTransform,\n  html: transformVHtml,\n  text: transformVText,\n  model: transformModel,\n  // override compiler-core\n  on: transformOn,\n  // override compiler-core\n  show: transformShow\n};\nfunction compile(src, options = {}) {\n  return baseCompile(\n    src,\n    extend({}, parserOptions, options, {\n      nodeTransforms: [\n        // ignore <script> and <tag>\n        // this is not put inside DOMNodeTransforms because that list is used\n        // by compiler-ssr to generate vnode fallback branches\n        ignoreSideEffectTags,\n        ...DOMNodeTransforms,\n        ...options.nodeTransforms || []\n      ],\n      directiveTransforms: extend(\n        {},\n        DOMDirectiveTransforms,\n        options.directiveTransforms || {}\n      ),\n      transformHoist: null \n    })\n  );\n}\nfunction parse(template, options = {}) {\n  return baseParse(template, extend({}, parserOptions, options));\n}\n\nexport { DOMDirectiveTransforms, DOMErrorCodes, DOMErrorMessages, DOMNodeTransforms, TRANSITION, TRANSITION_GROUP, V_MODEL_CHECKBOX, V_MODEL_DYNAMIC, V_MODEL_RADIO, V_MODEL_SELECT, V_MODEL_TEXT, V_ON_WITH_KEYS, V_ON_WITH_MODIFIERS, V_SHOW, compile, createDOMCompilerError, parse, parserOptions, transformStyle };\n","/**\n* vue v3.4.27\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport * as runtimeDom from '@vue/runtime-dom';\nimport { initCustomFormatter, registerRuntimeCompiler, warn } from '@vue/runtime-dom';\nexport * from '@vue/runtime-dom';\nimport { compile } from '@vue/compiler-dom';\nimport { isString, NOOP, extend, generateCodeFrame, EMPTY_OBJ } from '@vue/shared';\n\nfunction initDev() {\n  {\n    initCustomFormatter();\n  }\n}\n\nif (!!(process.env.NODE_ENV !== \"production\")) {\n  initDev();\n}\nconst compileCache = /* @__PURE__ */ new WeakMap();\nfunction getCache(options) {\n  let c = compileCache.get(options != null ? options : EMPTY_OBJ);\n  if (!c) {\n    c = /* @__PURE__ */ Object.create(null);\n    compileCache.set(options != null ? options : EMPTY_OBJ, c);\n  }\n  return c;\n}\nfunction compileToFunction(template, options) {\n  if (!isString(template)) {\n    if (template.nodeType) {\n      template = template.innerHTML;\n    } else {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`invalid template option: `, template);\n      return NOOP;\n    }\n  }\n  const key = template;\n  const cache = getCache(options);\n  const cached = cache[key];\n  if (cached) {\n    return cached;\n  }\n  if (template[0] === \"#\") {\n    const el = document.querySelector(template);\n    if (!!(process.env.NODE_ENV !== \"production\") && !el) {\n      warn(`Template element not found or is empty: ${template}`);\n    }\n    template = el ? el.innerHTML : ``;\n  }\n  const opts = extend(\n    {\n      hoistStatic: true,\n      onError: !!(process.env.NODE_ENV !== \"production\") ? onError : void 0,\n      onWarn: !!(process.env.NODE_ENV !== \"production\") ? (e) => onError(e, true) : NOOP\n    },\n    options\n  );\n  if (!opts.isCustomElement && typeof customElements !== \"undefined\") {\n    opts.isCustomElement = (tag) => !!customElements.get(tag);\n  }\n  const { code } = compile(template, opts);\n  function onError(err, asWarning = false) {\n    const message = asWarning ? err.message : `Template compilation error: ${err.message}`;\n    const codeFrame = err.loc && generateCodeFrame(\n      template,\n      err.loc.start.offset,\n      err.loc.end.offset\n    );\n    warn(codeFrame ? `${message}\n${codeFrame}` : message);\n  }\n  const render = new Function(\"Vue\", code)(runtimeDom);\n  render._rc = true;\n  return cache[key] = render;\n}\nregisterRuntimeCompiler(compileToFunction);\n\nexport { compileToFunction as compile };\n","import { createApp } from \"vue\";\r\n\r\n/**\r\n * Wraps a Vue component in Web Component of that same name that bootstraps itself as a standalone Vue app when added to the DOM.\r\n * This is used to render Vue components within Kentico page builder, where the markup is injected after page load.\r\n */\r\nexport default class CreateWebComponent {\r\n  constructor(name, component, initVueApp) {\r\n    name = name\r\n      .replace(/([a-z])([A-Z])/g, \"$1-$2\")\r\n      .replace(/[\\s_]+/g, \"-\")\r\n      .toLowerCase();\r\n\r\n    this.registerComponent(name, component, initVueApp);\r\n  }\r\n  registerComponent(name, component, initVueApp) {\r\n    customElements.define(\r\n      name,\r\n      class extends HTMLElement {\r\n        constructor() {\r\n          super();\r\n        }\r\n        async connectedCallback() {\r\n          const vueComponentTagName = `${name}-vue`;\r\n          const vueComponentTag = document.createElement(vueComponentTagName);\r\n          Array.from(this.attributes).forEach(({ name, value }) => {\r\n            vueComponentTag.setAttribute(name, value);\r\n          });\r\n          this.insertAdjacentElement(\"afterbegin\", vueComponentTag);\r\n\r\n          const app = createApp();\r\n          if (typeof initVueApp === \"function\") {\r\n            initVueApp.call(null, app);\r\n          }\r\n          app.component(vueComponentTagName, component);\r\n          app.mount(this);\r\n        }\r\n      }\r\n    );\r\n  }\r\n}\r\n","import { ref } from \"vue\";\r\n\r\nexport default function (data) {\r\n  const refs = {};\r\n\r\n  try {\r\n    Object.entries(data).forEach(([key, value]) => (refs[key] = ref(value)));\r\n    return refs;\r\n  } catch (error) {\r\n    return {};\r\n  }\r\n}\r\n","<script setup>\r\nimport { computed, ref } from \"vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  base: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nconst {\r\n  header = ref(null),\r\n  subheader = ref(null),\r\n  headerAlignment = ref(null),\r\n  headerSize = ref(null),\r\n  background = ref(null),\r\n  padding = ref(null),\r\n  margin = ref(null),\r\n  width = ref(null),\r\n  fontOptions = ref(null)\r\n} = getDataRefs(props.base || {});\r\n\r\nconst headerAlignmentClasses = computed(() =>\r\n  headerAlignment.value\r\n    ? headerAlignment.value === \"center\"\r\n      ? `text-${headerAlignment.value} mx-auto`\r\n      : headerAlignment.value === \"left\"\r\n      ? `text-${headerAlignment.value} mr-auto`\r\n      : headerAlignment.value === \"right\"\r\n      ? `text-${headerAlignment.value} ml-auto`\r\n      : \"\"\r\n    : \"\"\r\n);\r\n\r\nconst headerFontSizeClass = computed(() =>\r\n  headerSize.value ? (headerSize.value === \"large\" ? \"text-f-3xl-8xl\" : headerSize.value === \"medium\" ? \"text-f-2xl-5xl\" : \"text-f-xl-3xl\") : \"text-f-3xl-8xl\"\r\n);\r\n\r\nconst backgroundClass = computed(() => (background.value ? `widget--bg-${background.value}` : \"\"));\r\nconst widthClass = computed(() => (width.value ? `widget--width-${width.value}` : \"\"));\r\nconst fontClass = computed(() => (fontOptions.value ? fontOptions.value : \"\"));\r\n\r\nconst paddingClass = computed(() => {\r\n  if (!padding.value || !Array.isArray(padding.value)) return \"\";\r\n\r\n  let classString = \"\";\r\n\r\n  const appendClass = (str) => (classString += `widget--padding-${str} `);\r\n\r\n  if (padding.value[0] && padding.value[0].trim().length) appendClass(padding.value[0]);\r\n  if (padding.value[1] && padding.value[1].trim().length) appendClass(padding.value[1]);\r\n  return classString;\r\n});\r\n\r\nconst marginClass = computed(() => {\r\n  if (!margin.value || !Array.isArray(margin.value)) return \"\";\r\n\r\n  let classString = \"\";\r\n\r\n  const appendClass = (str) => (classString += `widget--margin-${str} `);\r\n\r\n  if (margin.value[0] && margin.value[0].trim().length) appendClass(margin.value[0]);\r\n  if (margin.value[1] && margin.value[1].trim().length) appendClass(margin.value[1]);\r\n  return classString;\r\n});\r\n</script>\r\n\r\n<template>\r\n  <!-- eslint-disable vue/no-v-html -->\r\n  <section :class=\"['widget', backgroundClass, paddingClass, marginClass, widthClass, fontClass]\">\r\n    <header v-if=\"header || subheader\" class=\"\">\r\n      <h2\r\n        v-if=\"header\"\r\n        :class=\"[\r\n          'w-full max-w-[675px] whitespace-pre-line font-serif font-light leading-[1.25]',\r\n          headerAlignmentClasses,\r\n          subheader ? 'mb-f3' : 'mb-f5',\r\n          headerFontSizeClass\r\n        ]\"\r\n        role=\"heading\"\r\n        aria-level=\"2\"\r\n        v-html=\"header\"\r\n      ></h2>\r\n      <h3\r\n        v-if=\"subheader\"\r\n        :class=\"['mb-f5 w-full max-w-[450px] whitespace-pre-line text-f-base-lg font-light leading-[1.25]', headerAlignmentClasses]\"\r\n        role=\"heading\"\r\n        aria-level=\"3\"\r\n        v-html=\"subheader\"\r\n      ></h3>\r\n    </header>\r\n    <div class=\"widget__inner\">\r\n      <slot></slot>\r\n    </div>\r\n  </section>\r\n</template>\r\n\r\n<style scoped></style>\r\n","<script setup>\r\nconst emit = defineEmits([\"expanded\", \"collapsed\"]);\r\nconst props = defineProps({\r\n  animation: {\r\n    type: String,\r\n    required: false,\r\n    default: () => \"height\"\r\n  },\r\n  control: {\r\n    type: String,\r\n    required: false,\r\n    default: () => \"width\"\r\n  }\r\n});\r\n\r\nconst onEnter = (element) => {\r\n  const control = getComputedStyle(element)[props.control];\r\n  element.style[props.control] = control;\r\n  element.style.position = \"absolute\";\r\n  element.style.visibility = \"hidden\";\r\n  element.style[props.animation] = \"auto\";\r\n  const animation = getComputedStyle(element)[props.animation];\r\n  element.style[props.control] = null;\r\n  element.style.position = null;\r\n  element.style.visibility = null;\r\n  element.style[props.animation] = 0;\r\n  getComputedStyle(element)[props.animation];\r\n  requestAnimationFrame(() => {\r\n    element.style[props.animation] = animation;\r\n  });\r\n};\r\n\r\nconst onAfterEnter = (element) => {\r\n  element.style[props.animation] = \"auto\";\r\n  emit(\"expanded\");\r\n};\r\n\r\nconst onLeave = (element) => {\r\n  const animation = getComputedStyle(element)[props.animation];\r\n  element.style[props.animation] = animation;\r\n  getComputedStyle(element)[props.animation];\r\n  requestAnimationFrame(() => {\r\n    element.style[props.animation] = 0;\r\n  });\r\n};\r\n\r\nconst onAfterLeave = () => {\r\n  emit(\"collapsed\");\r\n};\r\n</script>\r\n\r\n<template>\r\n  <div :class=\"['transition-expand', animation]\">\r\n    <Transition name=\"expand\" @enter=\"onEnter\" @after-enter=\"onAfterEnter\" @leave=\"onLeave\" @after-leave=\"onAfterLeave\">\r\n      <slot></slot>\r\n    </Transition>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n\r\n.transition-expand {\r\n  display: contents;\r\n  &:deep(.expand-enter-active),\r\n  &:deep(.expand-leave-active) {\r\n    overflow: hidden;\r\n    transition: v-bind(\"props.animation\") 350ms ease, opacity 350ms ease;\r\n    will-change: v-bind(\"props.animation\") opacity;\r\n    transform: translateZ(0);\r\n    backface-visibility: hidden;\r\n    perspective: 1000px;\r\n  }\r\n\r\n  &.height {\r\n    &:deep(.expand-enter-from),\r\n    &:deep(.expand-leave-to) {\r\n      height: 0;\r\n      opacity: 0;\r\n    }\r\n\r\n    &:deep(.expand-enter-to),\r\n    &:deep(.expand-leave-from) {\r\n      height: auto;\r\n      opacity: 1;\r\n    }\r\n  }\r\n\r\n  &.width {\r\n    &:deep(.expand-enter-from),\r\n    &:deep(.expand-leave-to) {\r\n      width: 0;\r\n      opacity: 0;\r\n    }\r\n\r\n    &:deep(.expand-enter-to),\r\n    &:deep(.expand-leave-from) {\r\n      width: auto;\r\n      opacity: 1;\r\n    }\r\n  }\r\n}\r\n</style>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M7.7233 11.0001L13.2367 5.70718L11.7636 4.29297L3.73535 12.0001L11.7636 19.7072L13.2367 18.293L7.7233 13.0001H19.7918V11.0001H7.7233Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M21.2645 12.0001L13.2362 4.29297L11.7631 5.70718L17.2765 11.0001H5.20801V13.0001H17.2765L11.7631 18.293L13.2362 19.7072L21.2645 12.0001Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M13.0001 7.41436L18.293 12.7073L19.7072 11.293L12.0001 3.58594L4.29297 11.293L5.70718 12.7073L11.0001 7.41437L11.0001 19.0002H13.0001L13.0001 7.41436Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M13.0001 16.5858L18.293 11.2929L19.7072 12.7071L12.0001 20.4142L4.29297 12.7071L5.70718 11.2929L11.0001 16.5858L11.0001 5H13.0001L13.0001 16.5858Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M10.3807 16.1574L18.1779 16.1574L18.1779 18.1574L6.82422 18.1574L6.82422 7.25788L8.90755 7.25789L8.90755 14.7432L17.4413 6.55078L18.9144 7.96499L10.3807 16.1574Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M8.90755 10.672L8.90755 18.1573L6.82422 18.1573L6.82422 7.25781L18.1779 7.25781L18.1779 9.25781L10.3807 9.25781L18.9144 17.4502L17.4413 18.8644L8.90755 10.672Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M14.0361 9.25781L6.55086 9.25781L6.55086 7.25781L17.4504 7.25781L17.4504 18.1573L15.4504 18.1573L15.4504 10.672L7.25796 18.8644L5.84375 17.4502L14.0361 9.25781Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M15.4503 14.7432L15.4504 7.25789L17.4503 7.25789L17.4503 18.1574L6.55085 18.1574L6.55085 16.1574L14.0361 16.1574L5.84375 7.96499L7.25796 6.55078L15.4503 14.7432Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M5.51367 9.70718L6.98681 8.29297L12.5002 13.5859L18.0137 8.29297L19.4868 9.70718L12.5002 16.4143L5.51367 9.70718Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M12.5002 7.58594L19.4868 14.293L18.0137 15.7073L12.5002 10.4144L6.98681 15.7073L5.51367 14.293L12.5002 7.58594Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M14.293 5.29297L15.7073 6.70718L10.4144 12.0001L15.7073 17.293L14.293 18.7072L7.58594 12.0001L14.293 5.29297Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M9.70718 18.7072L8.29297 17.293L13.5859 12.0001L8.29297 6.70718L9.70718 5.29297L16.4143 12.0001L9.70718 18.7072Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M9 10L4 15L9 20\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    <path d=\"M20 4V11C20 13.2091 18.2091 15 16 15H4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M15 10L20 15L15 20\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    <path d=\"M4 4V11C4 13.2091 5.79086 15 8 15H20\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M14 15L9 20L4 15\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    <path d=\"M20 4H13C10.7909 4 9 5.79086 9 8V20\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M14 9L9 4L4 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    <path d=\"M20 20H13C10.7909 20 9 18.2091 9 16V4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M10 15L15 20L20 15\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    <path d=\"M4 4H11C13.2091 4 15 5.79086 15 8V20\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M10 9L15 4L20 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    <path d=\"M4 20H11C13.2091 20 15 18.2091 15 16V4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M9 14L4 9L9 4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    <path d=\"M20 20V13C20 10.7909 18.2091 9 16 9H4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M15 14L20 9L15 4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    <path d=\"M4 20V13C4 10.7909 5.79086 9 8 9H20\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"35\" height=\"39\" viewBox=\"0 0 35 39\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M34.5 19.5117L0.749998 38.9973L0.75 0.0261464L34.5 19.5117Z\" fill=\"white\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M16 7V13H18V7C18 3.68629 15.3137 1 12 1C8.68629 1 6 3.68629 6 7V13H8V7C8 4.79086 9.79086 3 12 3C14.2091 3 16 4.79086 16 7Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n    <path d=\"M3 8H21V19C21 20.6569 19.6569 22 18 22H6C4.34315 22 3 20.6569 3 19V8Z\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M4.6343 4H2V2H6.27479L7.13907 6.33323H22.2079L20.5992 14.7986C20.4748 15.4269 20.134 15.9921 19.6355 16.3948C19.1397 16.7953 18.5195 17.0094 17.8823 16.9997H9.50493C8.86776 17.0094 8.24754 16.7953 7.75176 16.3948C7.25356 15.9923 6.91286 15.4275 6.78832 14.7995L6.78812 14.7985L4.6343 4ZM7.53798 8.33323L8.75006 14.4102C8.78363 14.5798 8.87545 14.7315 9.00854 14.839C9.14156 14.9464 9.30744 15.0031 9.47714 14.9999L9.48675 14.9997H17.9005L17.9101 14.9999C18.0798 15.0031 18.2457 14.9464 18.3787 14.839C18.5111 14.7321 18.6026 14.5816 18.6366 14.4131L18.6372 14.4102L19.7921 8.33323H7.53798ZM7 20.5C7 19.6716 7.67157 19 8.5 19C9.32843 19 10 19.6716 10 20.5C10 21.3284 9.32843 22 8.5 22C7.67157 22 7 21.3284 7 20.5ZM18.5 19C17.6716 19 17 19.6716 17 20.5C17 21.3284 17.6716 22 18.5 22C19.3284 22 20 21.3284 20 20.5C20 19.6716 19.3284 19 18.5 19Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M22.563 6.4211L12.5003 0.84375L2.4375 6.4211V17.5758L12.5003 23.1532L22.563 17.5758V6.4211ZM10.2473 4.40186L12.5003 3.15315L19.4398 6.99946L17.1932 8.24709L10.2473 4.40186ZM8.16337 5.5569L5.56068 6.99946L12.5003 10.8532L15.1112 9.40325L8.16337 5.5569ZM4.52083 8.73252V16.4211L11.4586 20.2664V12.5852L4.52083 8.73252ZM13.5419 20.2664L20.4797 16.4211V8.73252L13.5419 12.5852V20.2664Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M6.24967 8C6.24967 6.89543 7.18242 6 8.33301 6C9.4836 6 10.4163 6.89543 10.4163 8C10.4163 9.10457 9.4836 10 8.33301 10C7.18242 10 6.24967 9.10457 6.24967 8Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M2.08301 5C2.08301 3.34315 3.48212 2 5.20801 2H19.7913C21.5172 2 22.9163 3.34315 22.9163 5V19C22.9163 20.6569 21.5172 22 19.7913 22H5.20801C3.48212 22 2.08301 20.6569 2.08301 19V5ZM5.20801 4C4.63271 4 4.16634 4.44772 4.16634 5V19C4.16634 19.4288 4.44749 19.7946 4.84247 19.9367L16.6663 8.58578L20.833 12.5858V5C20.833 4.44772 20.3666 4 19.7913 4H5.20801ZM20.833 15.4142L16.6663 11.4142L7.72281 20H19.7913C20.3666 20 20.833 19.5523 20.833 19V15.4142Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M7.5 4C4.4172 4 2 6.31629 2 9.28C2 11.0894 2.84975 12.7357 4.34375 14.4904C5.83742 16.2447 7.97552 18.1076 10.55 20.3488L12 21.616L13.4506 20.3483C16.0251 18.1071 18.1626 16.2447 19.6562 14.4904C21.1502 12.7357 22 11.0894 22 9.28C22 6.31629 19.5828 4 16.5 4C14.76 4 13.09 4.77757 12 5.9968C10.91 4.77757 9.23996 4 7.5 4Z\"\r\n      fill=\"#363636\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M7.5 6C5.44721 6 4 7.49397 4 9.28C4 10.4052 4.5106 11.6013 5.86655 13.1938C7.24178 14.809 9.2474 16.5632 11.8632 18.8403L11.8646 18.8416L12 18.9599L12.1368 18.8403C14.7526 16.5632 16.7582 14.809 18.1334 13.1938C19.4894 11.6013 20 10.4052 20 9.28C20 7.49397 18.5528 6 16.5 6C15.3349 6 14.2053 6.53083 13.491 7.3298L12.7455 8.16367H11.2545L10.509 7.3298C9.79469 6.53083 8.66515 6 7.5 6ZM2 9.28C2 6.31629 4.4172 4 7.5 4C9.23996 4 10.91 4.77757 12 5.9968C13.09 4.77757 14.76 4 16.5 4C19.5828 4 22 6.31629 22 9.28C22 11.0894 21.1502 12.7357 19.6562 14.4904C18.1626 16.2447 16.0251 18.1071 13.4506 20.3483C13.4504 20.3485 13.4508 20.3481 13.4506 20.3483L12 21.616L10.55 20.3488C10.5498 20.3486 10.5502 20.349 10.55 20.3488C7.97552 18.1076 5.83742 16.2447 4.34375 14.4904C2.84975 12.7357 2 11.0894 2 9.28Z\"\r\n      fill=\"#363636\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M12.67 20.74L12 21.35L10.55 20.03C5.4 15.36 2 12.27 2 8.5C2 5.41 4.42 3 7.5 3C9.24 3 10.91 3.81 12 5.08C13.09 3.81 14.76 3 16.5 3C19.58 3 22 5.41 22 8.5C22 9.93 21.5 11.26 20.62 12.61C20 12.31 19.31 12.11 18.59 12.04C19.5 10.8 20 9.65 20 8.5C20 6.5 18.5 5 16.5 5C14.96 5 13.46 6 12.93 7.36H11.07C10.54 6 9.04 5 7.5 5C5.5 5 4 6.5 4 8.5C4 11.39 7.14 14.24 11.89 18.55L12 18.65L12.04 18.61C12.12 19.37 12.34 20.09 12.67 20.74ZM17 14V17H14V19H17V22H19V19H22V17H19V14H17Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M0 2.12924H2.48402C2.57807 2.12924 2.66816 2.16662 2.73474 2.23319C2.80132 2.29977 2.8387 2.38986 2.8387 2.48416V15.0656C1.72021 15.4158 0.846694 16.2957 0.504914 17.4169C0.163103 18.538 0.397001 19.7558 1.12988 20.6703C1.86274 21.5851 3.0001 22.0788 4.16883 21.9897C5.33756 21.9004 6.38678 21.24 6.97264 20.2248H19.516C19.6103 20.2248 19.7004 20.2622 19.7669 20.3285C19.8335 20.3951 19.8709 20.4854 19.8709 20.5795V21.644H22V20.5795C22 19.9208 21.7381 19.289 21.2723 18.8232C20.8065 18.3574 20.1749 18.0958 19.516 18.0958H19.1328C19.1509 17.9782 19.1603 17.8597 19.1613 17.7409V7.09635C19.1613 6.43772 18.8997 5.80589 18.4339 5.34006C17.9681 4.87426 17.3362 4.61268 16.6775 4.61268H5.32291C5.2041 4.61367 5.08555 4.62308 4.96822 4.64115V2.48392C4.96822 1.8251 4.7066 1.19346 4.24082 0.727631C3.775 0.26183 3.14312 0 2.48446 0H0.000444747L0 2.12924ZM3.90328 19.8701C3.52682 19.8701 3.16593 19.7207 2.89961 19.4543C2.63354 19.1883 2.48404 18.8272 2.48404 18.451C2.48404 18.0745 2.63354 17.7134 2.89961 17.4473C3.16593 17.181 3.5268 17.0315 3.90328 17.0315C4.27976 17.0315 4.64063 17.181 4.90695 17.4473C5.17302 17.7134 5.32252 18.0745 5.32252 18.451C5.32252 18.8272 5.17302 19.1883 4.90695 19.4543C4.64063 19.7207 4.27976 19.8701 3.90328 19.8701ZM5.32248 6.74188H9.93536V10.9996H12.0645V6.74188H16.6774C16.7714 6.74188 16.8615 6.77925 16.9281 6.84583C16.9947 6.91241 17.032 7.0025 17.032 7.09654V17.7411C17.032 17.8354 16.9947 17.9255 16.9281 17.9921C16.8615 18.0586 16.7714 18.096 16.6774 18.096H7.43399C7.36468 17.405 7.09391 16.7496 6.65557 16.211C6.21723 15.6722 5.63036 15.2742 4.96803 15.0659V7.09639C4.96803 6.90061 5.1267 6.74188 5.32248 6.74188Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"2\" stroke=\"currentColor\">\r\n    <path\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n      d=\"M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M11.0271 12.0001L5.51367 17.293L6.98681 18.7072L12.5002 13.4143L18.0137 18.7072L19.4868 17.293L13.9734 12.0001L19.4868 6.70718L18.0137 5.29297L12.5002 10.5859L6.98681 5.29297L5.51367 6.70718L11.0271 12.0001Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M9.37459 15.5859L20.0964 5.29297L21.5695 6.70718L9.37459 18.4143L3.42969 12.7072L4.90283 11.293L9.37459 15.5859Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M16.6177 18.0319C15.078 19.2635 13.125 20 11 20C6.02944 20 2 15.9706 2 11C2 6.02944 6.02944 2 11 2C15.9706 2 20 6.02944 20 11C20 13.125 19.2635 15.078 18.0319 16.6177L22.4142 21L21 22.4142L16.6177 18.0319ZM4 11C4 7.13401 7.13401 4 11 4C14.866 4 18 7.13401 18 11C18 12.8 17.3206 14.4413 16.2042 15.6815L15.6815 16.2042C14.4413 17.3206 12.8 18 11 18C7.13401 18 4 14.866 4 11Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M18.6881 14.2084C20.0713 13.3179 20.9997 11.7642 20.9997 10.0021C20.9997 7.23579 18.745 5 15.9976 5C13.2502 5 10.9766 7.23579 10.9766 10.0021C10.9766 12.7684 13.2313 15.0042 15.9787 15.0042C16.3766 15.0042 16.7555 14.9474 17.1345 14.8716L18.745 18.6611C18.8776 18.9832 19.1997 19.1726 19.5218 19.1726C19.6355 19.1726 19.7492 19.1537 19.8439 19.0969C20.2797 18.9074 20.4692 18.4147 20.2987 17.9979L18.6881 14.2084ZM12.6629 10.0021C12.6629 8.16421 14.1597 6.68632 15.9787 6.68632C17.8166 6.68632 19.2945 8.18316 19.2945 10.0021C19.2945 11.8211 17.7976 13.3179 15.9787 13.3179C14.1597 13.3179 12.6629 11.84 12.6629 10.0021Z\"\r\n      fill=\"#212121\"\r\n    />\r\n    <path d=\"M10 6.68642L3 6.68641V5.01904L10 5.01905V6.68642Z\" fill=\"#212121\" />\r\n    <path d=\"M9 10.8358H3V9.16846H9V10.8358Z\" fill=\"#212121\" />\r\n    <path d=\"M10.3516 15.0043H3V13.3369H10.3516V15.0043Z\" fill=\"#212121\" />\r\n    <path d=\"M3 17.4863H16.5V19.1537H3V17.4863Z\" fill=\"#212121\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"12\" height=\"18\" viewBox=\"0 0 12 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M8.52627 0L0 10.9286L5.68418 10.909L3.47372 18L12 7.09084H6.31582L8.52627 0Z\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M13.542 7V13H11.4587V7H13.542Z\" fill=\"currentColor\" />\r\n    <path d=\"M13.5524 15H11.4587V17H13.5524V15Z\" fill=\"currentColor\" />\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M1.04199 12C1.04199 5.92487 6.17206 1 12.5003 1C18.8286 1 23.9587 5.92487 23.9587 12C23.9587 18.0751 18.8286 23 12.5003 23C6.17206 23 1.04199 18.0751 1.04199 12ZM12.5003 3C7.32266 3 3.12533 7.02944 3.12533 12C3.12533 16.9706 7.32266 21 12.5003 21C17.678 21 21.8753 16.9706 21.8753 12C21.8753 7.02944 17.678 3 12.5003 3Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M13 11V17H11V11H13Z\" fill=\"currentColor\" />\r\n    <path d=\"M13.01 7H11V9H13.01V7Z\" fill=\"currentColor\" />\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M1 12C1 5.92487 5.92487 1 12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12ZM12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M9.8988 3.49351C11.0964 1.50216 14.0904 1.50216 15.288 3.49351L23.7233 17.5195C24.9209 19.5108 23.4239 22 21.0287 22H4.15811C1.76289 22 0.265886 19.5108 1.46349 17.5195L9.8988 3.49351ZM13.6478 4.4026C13.1792 3.62338 12.0076 3.62338 11.539 4.4026L3.10369 18.4286C2.63506 19.2078 3.22085 20.1818 4.15811 20.1818H21.0287C21.966 20.1818 22.5518 19.2078 22.0831 18.4286L13.6478 4.4026Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n    <path d=\"M13.5413 8V14H11.458V8H13.5413Z\" fill=\"currentColor\" />\r\n    <path d=\"M13.5518 16H11.458V18H13.5518V16Z\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M12.5 2C9.62352 2 7.29167 4.23858 7.29167 7C7.29167 9.76142 9.62352 12 12.5 12C15.3765 12 17.7083 9.76142 17.7083 7C17.7083 4.23858 15.3765 2 12.5 2ZM9.375 7C9.375 5.34315 10.7741 4 12.5 4C14.2259 4 15.625 5.34315 15.625 7C15.625 8.65685 14.2259 10 12.5 10C10.7741 10 9.375 8.65685 9.375 7Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n    <path\r\n      d=\"M8.33333 14C6.952 14 5.62724 14.5268 4.65049 15.4645C3.67373 16.4021 3.125 17.6739 3.125 19V22H5.20833V19C5.20833 18.2043 5.53757 17.4413 6.12362 16.8787C6.70968 16.3161 7.50453 16 8.33333 16H16.6667C17.4955 16 18.2903 16.3161 18.8764 16.8787C19.4624 17.4413 19.7917 18.2044 19.7917 19V22H21.875V19C21.875 17.6739 21.3263 16.4021 20.3495 15.4645C19.3728 14.5268 18.048 14 16.6667 14H8.33333Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M2 5H22V7H2V5Z\" fill=\"currentColor\" />\r\n    <path d=\"M2 11H22V13H2V11Z\" fill=\"currentColor\" />\r\n    <path d=\"M22 17H2V19H22V17Z\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M2 5H5V7H2V5Z\" fill=\"currentColor\" />\r\n    <path d=\"M22 5H8V7H22V5Z\" fill=\"currentColor\" />\r\n    <path d=\"M22 11H8V13H22V11Z\" fill=\"currentColor\" />\r\n    <path d=\"M5 11H2V13H5V11Z\" fill=\"currentColor\" />\r\n    <path d=\"M2 17H5V19H2V17Z\" fill=\"currentColor\" />\r\n    <path d=\"M22 17H8V19H22V17Z\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <rect x=\"7\" y=\"3\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n    <rect x=\"2\" y=\"4\" width=\"2\" height=\"18\" fill=\"currentColor\" />\r\n    <rect x=\"20\" y=\"20\" width=\"2\" height=\"18\" transform=\"rotate(90 20 20)\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2 2H11V11H2V2ZM4 4V9H9V4H4Z\" fill=\"currentColor\" />\r\n    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M13 2H22V11H13V2ZM15 4V9H20V4H15Z\" fill=\"currentColor\" />\r\n    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M13 13H22V22H13V13ZM15 15V20H20V15H15Z\" fill=\"currentColor\" />\r\n    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2 13H11V22H2V13ZM4 15V20H9V15H4Z\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M11.458 13V19H13.5413V13H19.7913V11H13.5413V5H11.458V11H5.20801V13H11.458Z\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <rect x=\"5\" y=\"11\" width=\"14\" height=\"2\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M13.5417 4H15.625L11.4583 20H9.375L13.5417 4Z\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M21.9826 12C19.6634 15.7688 16.0223 18.125 12 18.125C7.97768 18.125 4.3366 15.7688 2.01741 12C4.3366 8.23115 7.97768 5.875 12 5.875C16.0223 5.875 19.6634 8.23115 21.9826 12Z\"\r\n      stroke=\"currentColor\"\r\n      stroke-width=\"1.75\"\r\n    />\r\n    <circle cx=\"12\" cy=\"12\" r=\"3\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <circle cx=\"12\" cy=\"12\" r=\"2\" fill=\"currentColor\" />\r\n    <circle cx=\"20\" cy=\"12\" r=\"2\" fill=\"currentColor\" />\r\n    <circle cx=\"4\" cy=\"12\" r=\"2\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <circle cx=\"12\" cy=\"12\" r=\"2\" transform=\"rotate(90 12 12)\" fill=\"currentColor\" />\r\n    <circle cx=\"12\" cy=\"20\" r=\"2\" transform=\"rotate(90 12 20)\" fill=\"currentColor\" />\r\n    <circle cx=\"12\" cy=\"4\" r=\"2\" transform=\"rotate(90 12 4)\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M3 19.0002V11.0002H5V19.0002C5 19.2654 5.10536 19.5197 5.29289 19.7073C5.48043 19.8948 5.73478 20.0002 6 20.0002H18C18.2652 20.0002 18.5196 19.8948 18.7071 19.7073C18.8946 19.5197 19 19.2654 19 19.0002V11.0002H21V19.0002C21 19.7958 20.6839 20.5589 20.1213 21.1215C19.5587 21.6841 18.7957 22.0002 18 22.0002H6C5.20435 22.0002 4.44129 21.6841 3.87868 21.1215C3.31607 20.5589 3 19.7958 3 19.0002Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M12 1.58594L16.7071 6.29304L15.2929 7.70726L12 4.41436L8.70711 7.70726L7.29289 6.29304L12 1.58594Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11 16.0002V3.00015H13V16.0002H11Z\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M13 11.5858V2H11V11.5858L7.70711 8.29289L6.29289 9.70711L12 15.4142L17.7071 9.70711L16.2929 8.29289L13 11.5858Z\" fill=\"currentColor\" />\r\n    <path\r\n      d=\"M4 14V19C4 19.2652 4.10536 19.5196 4.29289 19.7071C4.48043 19.8946 4.73478 20 5 20H19C19.2652 20 19.5196 19.8946 19.7071 19.7071C19.8946 19.5196 20 19.2652 20 19V14H22V19C22 19.7956 21.6839 20.5587 21.1213 21.1213C20.5587 21.6839 19.7957 22 19 22H5C4.20435 22 3.44129 21.6839 2.87868 21.1213C2.31607 20.5587 2 19.7956 2 19V14H4Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <rect x=\"6\" y=\"7\" width=\"2\" height=\"4\" fill=\"currentColor\" />\r\n    <rect x=\"16\" y=\"14\" width=\"2\" height=\"4\" fill=\"currentColor\" />\r\n    <rect x=\"3\" y=\"15\" width=\"18\" height=\"2\" fill=\"currentColor\" />\r\n    <rect x=\"3\" y=\"8\" width=\"18\" height=\"2\" fill=\"currentColor\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M3.79416 0C3.34733 0.00323409 3.00279 0.461141 3 0.818227V23.1818C3 23.6102 3.37833 24 3.79416 24H20.2058C20.6217 24 21 23.6102 21 23.1818V5.7273C21 5.5129 20.9152 5.29964 20.7685 5.14785L16.0038 0.238781C15.8564 0.0875402 15.6494 -0.000350622 15.4414 0.000224051L3.79416 0ZM4.58832 1.63645H14.6471V5.72735C14.6471 6.15577 15.0254 6.54557 15.4412 6.54557H19.4118V22.3637H4.58837L4.58832 1.63645ZM16.2353 2.78702L18.295 4.90912H16.2353V2.78702ZM6.70596 9.27303C6.26743 9.27303 5.9118 9.63924 5.9118 10.0913C5.9118 10.5431 6.26742 10.9095 6.70596 10.9095H15.1765C15.615 10.9095 15.9707 10.5431 15.9707 10.0913C15.9707 9.63944 15.615 9.27303 15.1765 9.27303H6.70596ZM6.70596 13.6367C6.26743 13.6367 5.9118 14.003 5.9118 14.455C5.9118 14.9068 6.26742 15.2732 6.70596 15.2732H17.2941C17.7327 15.2732 18.0883 14.9068 18.0883 14.455C18.0883 14.0031 17.7329 13.6367 17.2941 13.6367H6.70596ZM6.70596 18.0005C6.26743 18.0005 5.9118 18.3667 5.9118 18.8187C5.9118 19.2705 6.26742 19.6369 6.70596 19.6369H17.2941C17.7327 19.6369 18.0883 19.2705 18.0883 18.8187C18.0883 18.3669 17.7329 18.0005 17.2941 18.0005H6.70596Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M5.75295 1.25H22.7529V18.25H5.75295V1.25ZM4.50295 0H5.75295H22.7529H24.0029V1.25V18.25V19.5H22.7529H5.75295H4.50295V18.25V1.25V0ZM0.274414 5.10059V23.1006V23.7256H0.899414H18.8994V22.4756H1.52441V5.10059H0.274414Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\" style=\"width: 5em; height: 5em\">\r\n    <text x=\"50%\" y=\"50%\" font-size=\"40\" text-anchor=\"middle\" dy=\".3em\">%</text>\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 105 105\" fill=\"none\">\r\n    <circle cx=\"52.5\" cy=\"52.5\" r=\"52.5\" fill=\"#333333\" />\r\n    <path\r\n      fill=\"#fff\"\r\n      d=\"M68.947 50.362 45.205 33.42a1.332 1.332 0 0 0-1.586 0c-.493.349-.79.994-.79 1.692v33.884c0 .699.304 1.344.79 1.693.246.17.521.26.79.26.268 0 .543-.09.79-.26l23.74-16.942c.493-.35.79-.994.79-1.693 0-.698-.304-1.343-.79-1.692h.008Zm-22.952 15.24V38.498l18.989 13.548-18.989 13.549v.009Z\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg viewBox=\"0 0 68 68\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <circle cx=\"34\" cy=\"34\" r=\"34\" fill=\"#363636\" />\r\n    <rect x=\"37.373\" y=\"22\" width=\"3.27711\" height=\"23.759\" fill=\"white\" />\r\n    <rect x=\"28\" y=\"22\" width=\"3.27711\" height=\"23.759\" fill=\"white\" />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      fill-rule=\"evenodd\"\r\n      clip-rule=\"evenodd\"\r\n      d=\"M12,19a1,1,0,1,0-1-1A1,1,0,0,0,12,19Zm5,0a1,1,0,1,0-1-1A1,1,0,0,0,17,19Zm0-4a1,1,0,1,0-1-1A1,1,0,0,0,17,15Zm-5,0a1,1,0,1,0-1-1A1,1,0,0,0,12,15ZM19,3H18V2a1,1,0,0,0-2,0V3H8V2A1,1,0,0,0,6,2V3H5A3,3,0,0,0,2,6V20a3,3,0,0,0,3,3H19a3,3,0,0,0,3-3V6A3,3,0,0,0,19,3Zm1,17a1,1,0,0,1-1,1H5a1,1,0,0,1-1-1V11H20ZM20,9H4V6A1,1,0,0,1,5,5H6V6A1,1,0,0,0,8,6V5h8V6a1,1,0,0,0,2,0V5h1a1,1,0,0,1,1,1ZM7,15a1,1,0,1,0-1-1A1,1,0,0,0,7,15Zm0,4a1,1,0,1,0-1-1A1,1,0,0,0,7,19Z\"\r\n      fill=\"currentColor\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M30 60C46.5685 60 60 46.5685 60 30C60 13.4315 46.5685 0 30 0C13.4315 0 0 13.4315 0 30C0 46.5685 13.4315 60 30 60Z\" fill=\"#363636\" />\r\n    <path\r\n      d=\"M29.8667 17.12C34.0667 17.12 34.56 17.1333 36.2133 17.2133C37.7467 17.28 38.5733 17.5333 39.1333 17.76C39.8667 18.04 40.3867 18.3867 40.9333 18.9333C41.48 19.48 41.8267 20 42.1067 20.7333C42.32 21.2933 42.5733 22.12 42.6533 23.6533C42.7333 25.3067 42.7467 25.8 42.7467 30C42.7467 34.2 42.7333 34.6933 42.6533 36.3467C42.5867 37.88 42.3333 38.7067 42.1067 39.2667C41.8267 40 41.48 40.52 40.9333 41.0667C40.3867 41.6133 39.8667 41.96 39.1333 42.24C38.5733 42.4533 37.7467 42.7067 36.2133 42.7867C34.56 42.8667 34.0667 42.88 29.8667 42.88C25.6667 42.88 25.1733 42.8667 23.52 42.7867C21.9867 42.72 21.16 42.4667 20.6 42.24C19.8667 41.96 19.3467 41.6133 18.8 41.0667C18.2533 40.52 17.9067 40 17.6267 39.2667C17.4133 38.7067 17.16 37.88 17.08 36.3467C17 34.6933 16.9867 34.2 16.9867 30C16.9867 25.8 17 25.3067 17.08 23.6533C17.1467 22.12 17.4 21.2933 17.6267 20.7333C17.9067 20 18.2533 19.48 18.8 18.9333C19.3467 18.3867 19.8667 18.04 20.6 17.76C21.16 17.5467 21.9867 17.2933 23.52 17.2133C25.1733 17.1333 25.6667 17.12 29.8667 17.12ZM29.8667 14.2933C25.6 14.2933 25.0667 14.3067 23.3867 14.3867C21.72 14.4667 20.5733 14.7333 19.5733 15.12C18.5467 15.52 17.6667 16.0533 16.7867 16.9333C15.92 17.8 15.3733 18.68 14.9733 19.72C14.5867 20.72 14.32 21.8667 14.24 23.5333C14.16 25.2133 14.1467 25.7467 14.1467 30.0133C14.1467 34.28 14.16 34.8133 14.24 36.4933C14.32 38.16 14.5867 39.3067 14.9733 40.3067C15.3733 41.3333 15.9067 42.2133 16.7867 43.0933C17.6533 43.96 18.5333 44.5067 19.5733 44.9067C20.5733 45.2933 21.72 45.56 23.3867 45.64C25.0667 45.72 25.6 45.7333 29.8667 45.7333C34.1333 45.7333 34.6667 45.72 36.3467 45.64C38.0133 45.56 39.16 45.2933 40.16 44.9067C41.1867 44.5067 42.0667 43.9733 42.9467 43.0933C43.8133 42.2267 44.36 41.3467 44.76 40.3067C45.1467 39.3067 45.4133 38.16 45.4933 36.4933C45.5733 34.8133 45.5867 34.28 45.5867 30.0133C45.5867 25.7467 45.5733 25.2133 45.4933 23.5333C45.4133 21.8667 45.1467 20.72 44.76 19.72C44.36 18.6933 43.8267 17.8133 42.9467 16.9333C42.08 16.0667 41.2 15.52 40.16 15.12C39.16 14.7333 38.0133 14.4667 36.3467 14.3867C34.6667 14.3067 34.1333 14.2933 29.8667 14.2933ZM29.8667 21.9333C25.4133 21.9333 21.8 25.5467 21.8 30C21.8 34.4533 25.4133 38.0667 29.8667 38.0667C34.32 38.0667 37.9333 34.4533 37.9333 30C37.9333 25.5467 34.32 21.9333 29.8667 21.9333ZM29.8667 35.24C26.9733 35.24 24.6267 32.8933 24.6267 30C24.6267 27.1067 26.9733 24.76 29.8667 24.76C32.76 24.76 35.1067 27.1067 35.1067 30C35.1067 32.8933 32.76 35.24 29.8667 35.24ZM40.1333 21.6267C40.1333 22.6667 39.2933 23.5067 38.2533 23.5067C37.2133 23.5067 36.3733 22.6667 36.3733 21.6267C36.3733 20.5867 37.2133 19.7467 38.2533 19.7467C39.2933 19.7467 40.1333 20.5867 40.1333 21.6267Z\"\r\n      fill=\"#F6F0E9\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"59\" height=\"60\" viewBox=\"0 0 59 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M29.5 60C45.7924 60 59 46.5685 59 30C59 13.4315 45.7924 0 29.5 0C13.2076 0 0 13.4315 0 30C0 46.5685 13.2076 60 29.5 60Z\" fill=\"#363636\" />\r\n    <path\r\n      d=\"M22.538 33.6533C22.8789 33.7733 23.2067 33.6533 23.3247 33.2C23.4427 32.8533 23.5476 32.1733 23.6656 31.84C23.7836 31.3867 23.7836 31.2667 23.4427 30.9333C22.774 30.1333 22.4331 29.12 22.4331 27.76C22.4331 23.68 25.4487 19.9333 30.3522 19.9333C34.5871 19.9333 37.0389 22.6533 37.0389 26.1733C37.0389 30.8267 35.0329 34.7867 32.0173 34.7867C30.3391 34.7867 29.1198 33.4267 29.4476 31.6133C29.8933 29.5733 30.9029 27.3067 30.9029 25.8267C30.9029 24.4667 30.2342 23.3333 28.7789 23.3333C27.1007 23.3333 25.6584 25.1467 25.6584 27.5333C25.6584 29.12 26.2222 30.1467 26.2222 30.1467C26.2222 30.1467 24.4391 37.6267 24.2162 38.9867C23.6524 41.6 24.0982 44.88 24.2162 45.1067C24.2162 45.3333 24.4391 45.3333 24.5571 45.2267C24.6751 45 26.786 42.5067 27.4547 39.8933C27.6776 39.2133 28.5691 35.4667 28.5691 35.4667C29.1329 36.4933 30.798 37.5067 32.4762 37.5067C37.6027 37.5067 41.064 32.7467 41.064 26.4C41.064 21.64 37.052 17.1067 30.916 17.1067C23.3378 17.1067 19.5487 22.6667 19.5487 27.2C19.2078 30.1467 20.3353 32.64 22.5642 33.6667L22.538 33.6533Z\"\r\n      fill=\"#F6F0E9\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <svg width=\"59\" height=\"60\" viewBox=\"0 0 59 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M29.5 60C45.7924 60 59 46.5685 59 30C59 13.4315 45.7924 0 29.5 0C13.2076 0 0 13.4315 0 30C0 46.5685 13.2076 60 29.5 60Z\" fill=\"#363636\" />\r\n    <path\r\n      d=\"M18.5129 20.56C18.5129 19.7867 18.7751 19.16 19.2996 18.6533C19.824 18.16 20.5189 17.9067 21.358 17.9067C22.1971 17.9067 22.8658 18.1467 23.3771 18.64C23.9016 19.1467 24.1638 19.8133 24.1638 20.6267C24.1638 21.36 23.9016 21.9733 23.3902 22.4667C22.8658 22.9733 22.1709 23.2267 21.3056 23.2267H21.2793C20.4533 23.2267 19.7716 22.9733 19.2602 22.4667C18.7489 21.96 18.4867 21.32 18.4867 20.56H18.5129ZM18.8013 40.72V25.3333H23.836V40.72H18.8013ZM26.6156 40.72H31.6502V32.1333C31.6502 31.6 31.7158 31.1867 31.8338 30.8933C32.0436 30.3733 32.3713 29.9333 32.7909 29.5733C33.2236 29.2133 33.7611 29.0267 34.4167 29.0267C36.108 29.0267 36.9602 30.1867 36.9602 32.5067V40.7333H41.9949V31.9067C41.9949 29.64 41.4704 27.9067 40.4084 26.7333C39.3464 25.56 37.9567 24.9733 36.2129 24.9733C34.2593 24.9733 32.7516 25.8267 31.6633 27.5333V27.5733H31.6371L31.6633 27.5333V25.3467H26.6287C26.6549 25.84 26.668 27.36 26.668 29.9333C26.668 32.5067 26.6549 36.0933 26.6287 40.7333L26.6156 40.72Z\"\r\n      fill=\"#F6F0E9\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<template>\r\n  <component :is=\"iconComponent\" role=\"img\" class=\"icon fill-current inline-block h-[1em] w-[1em] flex-none\" />\r\n</template>\r\n\r\n<script>\r\n///Arrows\r\nimport LeftArrow from \"@/components/icons/IconLeftArrow.vue\";\r\nimport RightArrow from \"@/components/icons/IconRightArrow.vue\";\r\nimport UpArrow from \"@/components/icons/IconUpArrow.vue\";\r\nimport DownArrow from \"@/components/icons/IconDownArrow.vue\";\r\nimport DownLeftArrow from \"@/components/icons/IconDownLeftArrow.vue\";\r\nimport UpLeftArrow from \"@/components/icons/IconUpLeftArrow.vue\";\r\nimport UpRightArrow from \"@/components/icons/IconUpRightArrow.vue\";\r\nimport DownRightArrow from \"@/components/icons/IconDownRightArrow.vue\";\r\nimport DownChevron from \"@/components/icons/IconDownChevron.vue\";\r\nimport UpChevron from \"@/components/icons/IconUpChevron.vue\";\r\nimport LeftChevron from \"@/components/icons/IconLeftChevron.vue\";\r\nimport RightChevron from \"@/components/icons/IconRightChevron.vue\";\r\nimport CornerDownLeft from \"@/components/icons/IconCornerDownLeft.vue\";\r\nimport CornerDownRight from \"@/components/icons/IconCornerDownRight.vue\";\r\nimport CornerLeftDown from \"@/components/icons/IconCornerLeftDown.vue\";\r\nimport CornerLeftUp from \"@/components/icons/IconCornerLeftUp.vue\";\r\nimport CornerRightDown from \"@/components/icons/IconCornerRightDown.vue\";\r\nimport CornerRightUp from \"@/components/icons/IconCornerRightUp.vue\";\r\nimport CornerUpLeft from \"@/components/icons/IconCornerUpLeft.vue\";\r\nimport CornerUpRight from \"@/components/icons/IconCornerUpRight.vue\";\r\nimport Play from \"@/components/icons/IconPlay.vue\";\r\n\r\n//Shopping\r\nimport ShoppingBag from \"@/components/icons/IconShoppingBag.vue\";\r\nimport ShoppingCart from \"@/components/icons/IconShoppingCart.vue\";\r\nimport Package from \"@/components/icons/IconPackage.vue\";\r\nimport Image from \"@/components/icons/IconImage.vue\";\r\nimport SolidHeart from \"@/components/icons/IconSolidHeart.vue\";\r\nimport OutlineHeart from \"@/components/icons/IconOutlineHeart.vue\";\r\nimport HeartPlus from \"@/components/icons/IconHeartPlus.vue\";\r\nimport Shipping from \"@/components/icons/IconShipping.vue\";\r\nimport Lock from \"@/components/icons/IconLock.vue\";\r\n\r\n//Utility\r\nimport XIcon from \"@/components/icons/XIcon.vue\";\r\nimport Check from \"@/components/icons/IconCheck.vue\";\r\nimport Search from \"@/components/icons/IconSearch.vue\";\r\nimport Browse from \"@/components/icons/IconBrowse.vue\";\r\nimport LightningBolt from \"@/components/icons/IconLightningBolt.vue\";\r\nimport AlertCircle from \"@/components/icons/IconAlertCircle.vue\";\r\nimport InformationCircle from \"@/components/icons/IconInformationCircle.vue\";\r\nimport AlertTriangle from \"@/components/icons/IconAlertTriangle.vue\";\r\nimport User from \"@/components/icons/IconUser.vue\";\r\nimport Menu from \"@/components/icons/IconMenu.vue\";\r\nimport List from \"@/components/icons/IconList.vue\";\r\nimport Gallery from \"@/components/icons/IconGallery.vue\";\r\nimport Grid from \"@/components/icons/IconGrid.vue\";\r\nimport PlusSign from \"@/components/icons/IconPlusSign.vue\";\r\nimport MinusSign from \"@/components/icons/IconMinusSign.vue\";\r\nimport Slash from \"@/components/icons/IconSlash.vue\";\r\nimport PasswordReveal from \"@/components/icons/IconPasswordReveal.vue\";\r\nimport HorizontalEllipse from \"@/components/icons/IconHorizontalEllipse.vue\";\r\nimport VerticalEllipse from \"@/components/icons/IconVerticalEllipse.vue\";\r\nimport Share from \"@/components/icons/IconShare.vue\";\r\nimport Download from \"@/components/icons/IconDownload.vue\";\r\nimport Filter from \"@/components/icons/IconFilter.vue\";\r\nimport TextDocument from \"@/components/icons/IconTextDocument.vue\";\r\nimport OverlappingSquare from \"@/components/icons/IconOverlappingSquare.vue\";\r\nimport IconPercentage from \"@/components/icons/IconPercentage.vue\";\r\nimport VideoPlay from \"@/components/icons/IconVideoPlay.vue\";\r\nimport VideoPause from \"@/components/icons/IconVideoPause.vue\";\r\nimport Calender from \"@/components/icons/IconCalender.vue\";\r\n\r\n//Social\r\nimport Instagram from \"@/components/icons/IconInstagram.vue\";\r\nimport Pintrest from \"@/components/icons/IconPintrest.vue\";\r\nimport LinkedIn from \"@/components/icons/IconLinkedIn.vue\";\r\n\r\nconst icons = {\r\n  //Arrows\r\n  LeftArrow,\r\n  RightArrow,\r\n  UpArrow,\r\n  DownArrow,\r\n  DownLeftArrow,\r\n  UpLeftArrow,\r\n  UpRightArrow,\r\n  DownRightArrow,\r\n  DownChevron,\r\n  UpChevron,\r\n  LeftChevron,\r\n  RightChevron,\r\n  CornerDownLeft,\r\n  CornerDownRight,\r\n  CornerLeftDown,\r\n  CornerLeftUp,\r\n  CornerRightDown,\r\n  CornerRightUp,\r\n  CornerUpLeft,\r\n  CornerUpRight,\r\n  Play,\r\n  //Shopping\r\n  ShoppingBag,\r\n  ShoppingCart,\r\n  Package,\r\n  Image,\r\n  SolidHeart,\r\n  OutlineHeart,\r\n  HeartPlus,\r\n  Shipping,\r\n  Lock,\r\n  //Utility\r\n  XIcon,\r\n  Check,\r\n  Search,\r\n  Browse,\r\n  LightningBolt,\r\n  AlertCircle,\r\n  InformationCircle,\r\n  AlertTriangle,\r\n  User,\r\n  Menu,\r\n  List,\r\n  Gallery,\r\n  Grid,\r\n  PlusSign,\r\n  MinusSign,\r\n  Slash,\r\n  PasswordReveal,\r\n  HorizontalEllipse,\r\n  VerticalEllipse,\r\n  Share,\r\n  Download,\r\n  Filter,\r\n  TextDocument,\r\n  OverlappingSquare,\r\n  IconPercentage,\r\n  VideoPlay,\r\n  VideoPause,\r\n  Calender,\r\n  //Social\r\n  Instagram,\r\n  Pintrest,\r\n  LinkedIn\r\n};\r\n\r\nexport default {\r\n  props: {\r\n    name: {\r\n      type: String,\r\n      required: true,\r\n      validator(value) {\r\n        return Object.prototype.hasOwnProperty.call(icons, value);\r\n      }\r\n    }\r\n  },\r\n  computed: {\r\n    iconComponent() {\r\n      return icons[this.name];\r\n    }\r\n  }\r\n};\r\n</script>\r\n","export default \"__VITE_ASSET__46c8caad__\"","<script setup>\r\nimport { computed, watch, onMounted, onUnmounted, ref } from \"vue\";\r\nimport TransitionExpand from \"../../transitions/TransitionExpand.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport IconChevronDown from \"../../assets/icon-chevron-down.svg\";\r\nimport FhWysiwyg from \"@/includes/FhWysiwyg.vue\";\r\n\r\nconst props = defineProps({\r\n  item: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isNavItem: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  viewAllLink: {\r\n    default: () => ({ url: \"\", title: \"\" }),\r\n    validator: (value) => {\r\n      return value && typeof value.url === \"string\" && typeof value.title === \"string\";\r\n    }\r\n  }\r\n});\r\n\r\nconst isActive = ref(false);\r\n\r\nconst anchorTitle = computed(() => {\r\n  const aText = props.item.title?.toLowerCase().replace(/[^\\w\\s]/gi, \"\");\r\n  return aText?.split(\" \").join(\"-\").toLowerCase() ?? \"\";\r\n});\r\n\r\nconst windowHash = ref(window.location.hash);\r\n\r\nwatch(windowHash, (newHash) => {\r\n  if (newHash.replace(\"#\", \"\") === anchorTitle.value) {\r\n    scrollToFaq();\r\n  }\r\n});\r\n\r\nconst scrollToFaq = () => {\r\n  const element = document.querySelector(windowHash.value);\r\n  if (element) {\r\n    element.scrollIntoView({ behavior: \"smooth\" });\r\n    const openAnimation = setTimeout(() => {\r\n      isActive.value = true;\r\n      clearTimeout(openAnimation);\r\n    }, 300);\r\n  }\r\n};\r\n\r\nonMounted(() => {\r\n  const isFaq = computed(() => window.location.pathname.includes(\"faq\"));\r\n  if (isFaq.value) {\r\n    document.body.classList.add(\"smooth-scroll\");\r\n  }\r\n\r\n  if (window.location.hash.length > 0 && window.location.hash.replace(\"#\", \"\") === anchorTitle.value) {\r\n    scrollToFaq();\r\n  }\r\n  window.addEventListener(\"hashchange\", () => {\r\n    windowHash.value = window.location.hash;\r\n  });\r\n});\r\n\r\nonUnmounted(() => {\r\n  window.removeEventListener(\"hashchange\", () => {\r\n    windowHash.value = window.location.hash;\r\n  });\r\n});\r\n</script>\r\n\r\n<template>\r\n  <!-- ACCORDION ITEM -->\r\n  <div :class=\"[!isNavItem ? 'border-b border-neutral-20' : 'border-b-[1px] border-neutral-30']\">\r\n    <!-- ACCORDION title -->\r\n    <button\r\n      :id=\"anchorTitle\"\r\n      :aria-expanded=\"isActive\"\r\n      :class=\"[\r\n        isNavItem\r\n          ? 'flex w-full items-center text-xl px-5 leading-tight bg-white py-6'\r\n          : 'flex w-full cursor-pointer list-none items-start py-f4 text-neutral-70 focus:outline-none'\r\n      ]\"\r\n      @click=\"isActive = !isActive\"\r\n    >\r\n      <!-- title TITLE -->\r\n      <span class=\"pointer-events-none w-full grow basis-auto text-left\" :class=\"[!isNavItem ? 'text-f-base-2xl' : '']\">\r\n        {{ item.title }}\r\n      </span>\r\n      <template v-if=\"isNavItem\">\r\n        <FhIcon v-if=\"!isActive\" name=\"PlusSign\" />\r\n        <FhIcon v-else name=\"MinusSign\" />\r\n      </template>\r\n      <template v-else>\r\n        <span class=\"pointer-events-none ml-8 shrink pt-1.5 pr-6\">\r\n          <img\r\n            :src=\"IconChevronDown\"\r\n            alt=\"Chevron Down\"\r\n            class=\"ChevronDown h-2 w-3.5 transition-transform duration-200 ease-linear lg:h-3 lg:w-5\"\r\n            :class=\"{ 'rotate-180': isActive }\"\r\n          />\r\n        </span>\r\n      </template>\r\n    </button>\r\n    <TransitionExpand>\r\n      <!-- ACCORDION CONTENT -->\r\n      <div v-show=\"isActive\" :aria-hidden=\"!isActive\" :class=\"[isNavItem ? 'border-t-[1px] border-neutral-30' : '']\">\r\n        <template v-if=\"isNavItem\">\r\n          <div class=\"py-2.5\">\r\n            <div v-for=\"(copyItem, index) in item.copy\" :key=\"index\">\r\n              <a :href=\"copyItem.url\" class=\"flex items-center text-xl px-10 leading-tight bg-white py-5\">{{ copyItem.content }}</a>\r\n            </div>\r\n            <a :href=\"viewAllLink.url\" class=\"flex items-center text-xl px-10 leading-tight bg-white py-5\">{{ viewAllLink.title }}</a>\r\n          </div>\r\n        </template>\r\n        <template v-else>\r\n          <div :class=\"['mb-f5 ml-1 flex flex-col pl-f5 text-f-sm-xl text-neutral-50 md:ml-1.5 md:pr-f25 lg:ml-0']\">\r\n            <FhWysiwyg>\r\n              <!-- eslint-disable-next-line vue/no-v-html -->\r\n              <!-- Does this need to be rendered like this? Can we refactor to avoid the eslint warning? -->\r\n              <p class=\"text-inherit\" v-html=\"item.copy\"></p>\r\n            </FhWysiwyg>\r\n          </div>\r\n        </template>\r\n      </div>\r\n    </TransitionExpand>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\">\r\nhtml:has(body.smooth-scroll) {\r\n  scroll-behavior: smooth;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed, onMounted, onUnmounted, ref, watch } from \"vue\";\r\nimport TransitionExpand from \"../../transitions/TransitionExpand.vue\";\r\nimport IconChevronDown from \"../../assets/icon-chevron-down.svg\";\r\nimport FhWysiwyg from \"@/includes/FhWysiwyg.vue\";\r\n\r\nconst props = defineProps({\r\n  items: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  title: {\r\n    type: String,\r\n    default: \"\"\r\n  }\r\n});\r\n\r\nconst isActive = ref(false);\r\n\r\nconst isFaq = computed(() => window.location.pathname.includes(\"faq\"));\r\nif (isFaq.value) {\r\n  document.body.classList.add(\"smooth-scroll\");\r\n}\r\n\r\nconst anchorTitle = computed(() => {\r\n  let aText = props.title?.toLowerCase().replace(/[^\\w\\s]/gi, \"\");\r\n  aText = aText.replace(/\\s+/g, \" \");\r\n  return aText?.split(\" \").join(\"-\").toLowerCase() ?? \"\";\r\n});\r\n\r\nconst windowHash = ref(window.location.hash);\r\n\r\nwatch(windowHash, (newHash) => {\r\n  if (newHash.replace(\"#\", \"\") === anchorTitle.value) {\r\n    scrollToFaq();\r\n  }\r\n});\r\n\r\nconst scrollToFaq = () => {\r\n  const element = document.querySelector(windowHash.value);\r\n  if (element) {\r\n    element.scrollIntoView({ behavior: \"smooth\" });\r\n    const openAnimation = setTimeout(() => {\r\n      isActive.value = true;\r\n      clearTimeout(openAnimation);\r\n    }, 300);\r\n  }\r\n};\r\n\r\nonMounted(() => {\r\n  if (window.location.hash.length > 0 && window.location.hash.replace(\"#\", \"\") === anchorTitle.value) {\r\n    scrollToFaq();\r\n  }\r\n  window.addEventListener(\"hashchange\", () => {\r\n    windowHash.value = window.location.hash;\r\n  });\r\n});\r\n\r\nonUnmounted(() => {\r\n  window.removeEventListener(\"hashchange\", () => {\r\n    windowHash.value = window.location.hash;\r\n  });\r\n});\r\n</script>\r\n\r\n<template>\r\n  <!-- ACCORDION ITEM -->\r\n  <div class=\"border-b border-neutral-20\">\r\n    <!-- ACCORDION title -->\r\n    <button\r\n      :id=\"anchorTitle\"\r\n      class=\"flex w-full cursor-pointer list-none items-start py-f4 text-neutral-70 focus:outline-none\"\r\n      :aria-expanded=\"isActive\"\r\n      :aria-controls=\"`content-${title}`\"\r\n      @click.prevent=\"isActive = !isActive\"\r\n    >\r\n      <!-- title TITLE -->\r\n      <span class=\"pointer-events-none w-full grow basis-auto text-left text-f-base-2xl\">\r\n        {{ title }}\r\n      </span>\r\n      <span class=\"pointer-events-none ml-8 shrink pt-1.5 pr-6\">\r\n        <img\r\n          :src=\"IconChevronDown\"\r\n          alt=\"Chevron Down\"\r\n          class=\"ChevronDown h-2 w-3.5 transition-transform duration-200 ease-linear lg:h-3 lg:w-5\"\r\n          :class=\"{ 'rotate-180': isActive }\"\r\n        />\r\n      </span>\r\n    </button>\r\n    <TransitionExpand>\r\n      <!-- ACCORDION CONTENT -->\r\n      <div v-if=\"isActive\" :id=\"`content-${title}`\" :aria-hidden=\"!isActive\">\r\n        <div :class=\"['mb-f5 ml-1 flex flex-col pl-f5 text-f-sm-xl md:ml-1.5 md:pr-f25 lg:ml-0']\">\r\n          <FhWysiwyg>\r\n            <template v-for=\"(item, i) in items\" :key=\"`${i}-${item.title}`\">\r\n              <strong class=\"mb-4 block text-f-sm-base text-inherit\">{{ item.title }}</strong>\r\n              <!-- eslint-disable-next-line vue/no-v-html -->\r\n              <p class=\"mb-8 text-f-sm-base text-inherit last:mb-0\" v-html=\"item.copy\"></p>\r\n            </template>\r\n          </FhWysiwyg>\r\n        </div>\r\n      </div>\r\n    </TransitionExpand>\r\n  </div>\r\n</template>\r\n<style lang=\"pcss\">\r\nhtml:has(body.smooth-scroll) {\r\n  scroll-behavior: smooth;\r\n}\r\n</style>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nimport FhAccordionItem from \"./FHAccordion/FhAccordionItem.vue\";\r\nimport FhAccordionItems from \"./FHAccordion/FhAccordionItems.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isNavItem: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  viewAllLink: {\r\n    default: () => ({ url: \"\", title: \"\" }),\r\n    validator: (value) => {\r\n      return value && typeof value.url === \"string\" && typeof value.title === \"string\";\r\n    }\r\n  }\r\n});\r\n\r\nconst { version, title, items } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <a id=\"accordion-top\" />\r\n  <FhSection aria-label=\"Accordion Control Group\" :base=\"style.base\">\r\n    <template v-if=\"version === 'single'\">\r\n      <fh-accordion-item v-for=\"item in items\" :key=\"item.id\" :item=\"item\" :is-nav-item=\"props.isNavItem\" :view-all-link=\"props.viewAllLink\" />\r\n    </template>\r\n    <template v-else-if=\"version === 'grouped'\">\r\n      <fh-accordion-items\r\n        :items=\"items\"\r\n        :title=\"title\"\r\n        :class=\"[\r\n          props.style.base?.background !== 'limestone' && props.style.base?.background !== null && props.style.base?.background !== '' ? 'text-white' : ''\r\n        ]\"\r\n      >\r\n      </fh-accordion-items>\r\n    </template>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n::v-deep .text-white * {\r\n  color: white !important;\r\n}\r\n/* Apply filter invert(100%) conditionally */\r\n.text-white :deep(.ChevronDown) {\r\n  filter: invert(100%) brightness(10000%) contrast(1000%);\r\n}\r\n</style>\r\n","<script setup>\r\nconst props = defineProps({\r\n  heading: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  subheading: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  tag: {\r\n    type: String,\r\n    default: \"h1\",\r\n    validator: (val) => [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"div\"].includes(val)\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col gap-f1\" :class=\"{ 'mb-f6': !$attrs.class?.match(/mb\\-/) }\">\r\n    <component :is=\"tag\" class=\"font-serif text-f-2xl-5xl\">\r\n      <slot name=\"default\">{{ props.heading }}</slot>\r\n    </component>\r\n    <div v-if=\"props.subheading || $slots.subheading\" class=\"max-w-prose\">\r\n      <slot name=\"subheading\">{{ props.subheading }}</slot>\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nconst props = defineProps({\r\n  href: {\r\n    type: String,\r\n    required: true\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <a :href=\"props.href\" class=\"cursor-pointer underline\">\r\n    <slot></slot>\r\n  </a>\r\n</template>\r\n","<script setup>\r\nimport { getDataRefs } from \"@/util/vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhLink from \"@/components/FhLink.vue\";\r\nimport FhSection from \"@/includes/FhSection.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { heading, repsTitle, reps } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection :base=\"style.base\">\r\n    <!-- PRODUCT SUPPORT -->\r\n    <div class=\"mb-f10 flex flex-col text-neutral-70 md:border-b md:border-solid md:border-neutral-70 md:border-opacity-10 md:pb-f10\">\r\n      <FhHeading tag=\"h2\">{{ heading }}</FhHeading>\r\n      <div class=\"mb-4 flex flex-col md:flex-row\">\r\n        <template v-if=\"repsTitle != null\">\r\n          <span class=\"mb-2 font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\">\r\n            {{ repsTitle }}\r\n          </span>\r\n        </template>\r\n        <div class=\"grid shrink basis-8/12 gap-f6 lg:grid-cols-2\">\r\n          <div v-for=\"(rep, i) in reps\" :key=\"i\" class=\"flex flex-col gap-f1\">\r\n            <div class=\"text-body-sm text-neutral-60\">{{ rep.category }}</div>\r\n            <div class=\"font-bold\">{{ rep.name }}</div>\r\n            <FhLink v-if=\"rep.phone\" :href=\"`tel:${rep.phone}`\">{{ rep.phone }}</FhLink>\r\n            <FhLink v-if=\"rep.email\" :href=\"`mailto:${rep.email}`\" class=\"break-all\">{{ rep.email }}</FhLink>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n","<script setup>\r\nimport FhIcon from \"./FhIcon.vue\";\r\n\r\nconst props = defineProps({\r\n  icon: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"bg-limestone p-f5\">\r\n    <div class=\"flex gap-f2\">\r\n      <FhIcon v-if=\"props.icon\" :name=\"props.icon\" class=\"text-body-xl flex-none\" />\r\n      <div>\r\n        <slot></slot>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { name, basedIn, medium, descriptionBio } = getDataRefs(props.data);\r\n\r\nconst missingBasedIn = computed(() => {\r\n  if (basedIn.value === undefined || basedIn.value === null) return \"mt-[32px]\";\r\n  return \"\";\r\n});\r\nconst missingBasedInAndMedium = computed(() => {\r\n  if ((medium.value === undefined || medium.value === null) && (basedIn.value === undefined || basedIn.value === null)) return \"mt-[32px]\";\r\n  return \"mt-[16px]\";\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"bg-limestone font-sans py-f6 px-f5\">\r\n    <h1 class=\"font-serif text-f-4xl-8xl max-w-[752px] mb-8\">{{ name }}</h1>\r\n    <div class=\"grid text-f-sm-base\">\r\n      <div v-if=\"basedIn\" class=\"flex\">\r\n        Based:\r\n        <div class=\"ml-1 font-semibold\">{{ basedIn }}</div>\r\n      </div>\r\n      <div v-if=\"medium\" class=\"flex\" :class=\"missingBasedIn\">\r\n        Medium:\r\n        <div class=\"ml-1 font-semibold\">{{ medium }}</div>\r\n      </div>\r\n    </div>\r\n    <div v-if=\"descriptionBio\" class=\"max-w-[752px] w-full text-f-lg-xl\" :class=\"missingBasedInAndMedium\">\r\n      {{ descriptionBio }}\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup></script>\r\n<template>\r\n  <div class=\"mx-auto h-6 w-6 animate-spin rounded-full border-2 border-solid border-neutral-70 border-t-transparent\"></div>\r\n</template>\r\n","<script setup>\r\nimport { computed, useAttrs } from \"vue\";\r\nimport FhLoader from \"@/components/FhLoader.vue\";\r\n\r\nconst props = defineProps({\r\n  variant: {\r\n    type: String,\r\n    default: \"standard\",\r\n    validator: (val) => [\"standard\", \"pill\", \"round\", \"text\", \"link\"].includes(val)\r\n  },\r\n  color: {\r\n    type: String,\r\n    default: \"secondary\",\r\n    validator: (val) => [\"primary\", \"secondary\", \"selected\"].includes(val)\r\n  },\r\n  inverse: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  size: {\r\n    type: String,\r\n    default: \"medium\",\r\n    validator: (val) => [\"small\", \"medium\", \"large\"].includes(val)\r\n  },\r\n  wide: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  href: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  disabled: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isLoading: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst attrs = useAttrs();\r\n\r\nconst tag = computed(() => (props.href && !props.disabled ? \"a\" : \"button\")); // <a> tags can't be properly disabled, so we still render a <button> in that case\r\nconst type = computed(() => (attrs.type ?? tag.value === \"button\" ? \"button\" : undefined));\r\n\r\nconst isTextStyle = computed(() => props.variant === \"text\" || props.variant === \"link\");\r\nconst isButtonStyle = computed(() => !isTextStyle.value);\r\n\r\nconst classObj = computed(() => [\r\n  \"btn inline-flex items-center justify-center gap-[0.35em] cursor-pointer disabled:cursor-default text-center\",\r\n  `btn--${props.variant}`,\r\n  `btn--${props.size}`,\r\n  {\r\n    \"btn--wide\": props.wide && props.variant === \"standard\",\r\n    \"btn--primary\": isButtonStyle.value && props.color === \"primary\" && !props.inverse,\r\n    \"btn--primary-inverse\": isButtonStyle.value && props.color === \"primary\" && props.inverse,\r\n    \"btn--secondary\": isButtonStyle.value && props.color === \"secondary\" && !props.inverse,\r\n    \"btn--secondary-inverse\": isButtonStyle.value && props.color === \"secondary\" && props.inverse,\r\n    \"btn--selected\": isButtonStyle.value && props.color === \"selected\",\r\n    \"btn--text-inverse\": isTextStyle.value && props.inverse,\r\n    \"hover-underline-with-transition\": props.variant === \"text\" && !props.disabled,\r\n    \"hover-underline-with-transition--inverse\": props.variant === \"text\" && !props.disabled && props.inverse\r\n  }\r\n]);\r\n</script>\r\n\r\n<template>\r\n  <component :is=\"tag\" :type=\"type\" :href=\"props.href\" :class=\"classObj\" :disabled=\"disabled\">\r\n    <slot v-if=\"!isLoading\"></slot>\r\n    <fh-loader v-if=\"isLoading\" />\r\n  </component>\r\n</template>\r\n\r\n<style scoped lang=\"pcss\">\r\n.btn {\r\n  &:focus-visible {\r\n    @apply outline outline-2 outline-offset-4 outline-neutral-70;\r\n  }\r\n  &:focus:not(:focus-visible) {\r\n    outline: none;\r\n  }\r\n\r\n  /* Increase default icon size within buttons, with an extra large bump for size:large (non-text) buttons */\r\n  &:deep(.icon) {\r\n    font-size: 125%;\r\n  }\r\n  &.btn--large:not(.btn--text, .btn--link):deep(.icon) {\r\n    font-size: 150%;\r\n  }\r\n}\r\n\r\n.btn:not(.btn--text, .btn--link) {\r\n  @apply font-bold;\r\n}\r\n\r\n.btn--small:not(.btn--text, .btn--link) {\r\n  @apply px-4 py-2.5 text-sm;\r\n}\r\n\r\n.btn--medium:not(.btn--text, .btn--link) {\r\n  @apply px-6 py-3.5 text-base;\r\n}\r\n\r\n.btn--large:not(.btn--text, .btn--link) {\r\n  @apply px-8 py-5 text-base;\r\n}\r\n\r\n.btn--wide {\r\n  &.btn--small {\r\n    @apply px-8;\r\n  }\r\n\r\n  &.btn--medium {\r\n    @apply px-12;\r\n  }\r\n\r\n  &.btn--large {\r\n    @apply px-16;\r\n  }\r\n}\r\n\r\n.btn--text,\r\n.btn--link {\r\n  @apply disabled:text-neutral-50;\r\n\r\n  &.btn--small {\r\n    @apply text-f-xs-sm;\r\n  }\r\n\r\n  &.btn--medium {\r\n    @apply text-f-sm-base;\r\n  }\r\n\r\n  &.btn--large {\r\n    @apply text-f-base-lg;\r\n  }\r\n\r\n  &.btn--text-inverse {\r\n    @apply text-white disabled:text-white disabled:opacity-50;\r\n  }\r\n}\r\n\r\n.btn--text {\r\n  @apply py-0.5;\r\n}\r\n\r\n.btn--link {\r\n  @apply underline;\r\n}\r\n\r\n.btn--pill {\r\n  @apply rounded-full;\r\n\r\n  &.btn--small {\r\n    @apply px-5;\r\n  }\r\n\r\n  &.btn--medium {\r\n    @apply py-3;\r\n  }\r\n}\r\n\r\n.btn--round {\r\n  @apply overflow-hidden whitespace-nowrap rounded-full !p-0;\r\n\r\n  &.btn--small {\r\n    width: 2.25rem;\r\n    height: 2.25rem;\r\n  }\r\n\r\n  &.btn--medium {\r\n    width: 3.25rem;\r\n    height: 3.25rem;\r\n  }\r\n\r\n  &.btn--large {\r\n    width: 3.75rem;\r\n    height: 3.75rem;\r\n  }\r\n}\r\n\r\n.btn--primary {\r\n  @apply bg-neutral-70 text-white hover:bg-neutral-80 disabled:bg-neutral-30 disabled:text-neutral-50;\r\n}\r\n\r\n.btn--primary-inverse {\r\n  @apply bg-white text-neutral-70 disabled:opacity-50;\r\n}\r\n\r\n.btn--secondary,\r\n.btn--selected {\r\n  @apply border border-neutral-40  hover:border-neutral-50 active:border-neutral-70 disabled:border-neutral-40 disabled:text-neutral-50;\r\n}\r\n\r\n.btn--secondary {\r\n  @apply bg-transparent;\r\n}\r\n\r\n.btn--selected {\r\n  @apply bg-neutral-30;\r\n}\r\n\r\n.btn--secondary-inverse {\r\n  @apply border border-white bg-transparent text-white disabled:opacity-50;\r\n}\r\n</style>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { linkUrl, linkTarget, linkAltText, linkText, items } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection :base=\"style.base\">\r\n    <div\r\n      class=\"relative left-[50%] flex w-[100vw] translate-x-[-50%] flex-wrap gap-x-[1rem] md:static md:-mx-2 md:mb-3 md:w-[calc(100%+1rem)] md:min-w-[calc(100%+1rem)] md:translate-x-0 md:gap-x-0\"\r\n    >\r\n      <div v-for=\"item in items\" :key=\"item.id\" class=\"flex flex-[0_0_calc(50%-0.5rem)] flex-col gap-[0.5rem] pb-f8 md:flex-[0_0_33.33%] md:px-2\">\r\n        <img :src=\"item.image\" :alt=\"item.imageAltText\" class=\"m-0 aspect-square object-cover object-center\" />\r\n        <p>{{ item.imageTitle }}</p>\r\n      </div>\r\n    </div>\r\n    <div class=\"flex items-center justify-center\">\r\n      <fh-button :wide=\"true\" :aria-label=\"linkAltText\" :target=\"linkTarget\" :href=\"linkUrl\">{{ linkText }}</fh-button>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { linkUrl, linkTarget, linkAltText, linkText, items } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div class=\"flex flex-wrap gap-[1.25rem] md:gap-[2rem]\">\r\n      <div\r\n        v-for=\"item in items\"\r\n        :key=\"item.id\"\r\n        class=\"award gird-rows-[1fr] grid flex-[0_0_100%] grid-cols-[1fr] bg-neutral-10 p-f10 pb-f8 md:flex-[0_0_calc(50%-1rem)]\"\r\n      >\r\n        <div class=\"col-span-full row-span-full flex flex-col gap-[0.5rem]\">\r\n          <img\r\n            :src=\"item.logo\"\r\n            :alt=\"item.logoAltText\"\r\n            class=\"m-0 mb-f4 max-w-[120px] self-start md:h-[80px] md:w-[120px] md:object-contain md:object-left-top\"\r\n          />\r\n          <h5 class=\"mb-f3 w-full font-serif text-f-xl-6xl font-light\">\r\n            {{ item.title }}\r\n          </h5>\r\n          <p class=\"text-f-base-xl text-neutral-50\">{{ item.copy }}</p>\r\n          <a\r\n            v-if=\"item.linkText\"\r\n            class=\"mt-f3 cursor-pointer text-left text-f-base-xl underline\"\r\n            :variant=\"'text'\"\r\n            :aria-label=\"item.linkAltText\"\r\n            :target=\"item.linkTarget\"\r\n            :href=\"item.linkUrl\"\r\n            >{{ item.linkText }}</a\r\n          >\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <div v-if=\"linkText\" class=\"mt-f8 flex flex-col justify-center md:items-center\">\r\n      <fh-button :wide=\"true\" :aria-label=\"linkAltText\" :target=\"linkTarget\" :href=\"linkUrl\">{{ linkText }}</fh-button>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.award {\r\n  &::before {\r\n    @apply row-span-full col-span-full md:pt-[100%] z-[-1];\r\n    content: \"\";\r\n  }\r\n}\r\n\r\n.text-white .award {\r\n  color: black;\r\n}\r\n</style>\r\n","export default \"__VITE_ASSET__c80b8e78__\"","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhWysiwyg from \"@/includes/FhWysiwyg.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { benefits } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    aria-label=\"Benefits\"\r\n    :base=\"style.base\"\r\n    :class=\"{ 'text-white': props.style.base?.background !== 'limestone' && props.style.base?.background !== null && props.style.base?.background !== '' }\"\r\n  >\r\n    <div class=\"grid grid-cols-1 pt-f8 md:grid-cols-2 lg:grid-cols-3\">\r\n      <!-- BENEFIT ITEM -->\r\n      <div v-for=\"item in benefits\" :key=\"item.id\" class=\"-mt-px flex flex-col items-center border border-neutral-30 py-f15 px-f10 text-center md:-ml-px\">\r\n        <img src=\"../assets/four-hands-logo.svg\" class=\"mb-f4 logo\" alt=\"Four Hands Logo\" />\r\n        <h3 class=\"mb-f4 font-serif text-f-2xl-5xl\">{{ item.title }}</h3>\r\n        <FhWysiwyg>\r\n          <!-- eslint-disable-next-line vue/no-v-html -->\r\n          <div\r\n            class=\"text-f-sm-lg text-neutral-50\"\r\n            :class=\"[\r\n              props.style.base?.background !== 'limestone' && props.style.base?.background !== null && props.style.base?.background !== '' ? 'text-white' : ''\r\n            ]\"\r\n            v-html=\"item.copy\"\r\n          ></div>\r\n        </FhWysiwyg>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n/* Apply filter invert(100%) conditionally */\r\n.text-white :deep(.logo) {\r\n  filter: invert(100%) brightness(10000%) contrast(1000%);\r\n}\r\n</style>\r\n","'use strict';\n\nexport default function bind(fn, thisArg) {\n  return function wrap() {\n    return fn.apply(thisArg, arguments);\n  };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n    const str = toString.call(thing);\n    return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n  type = type.toLowerCase();\n  return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n    && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n  let result;\n  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n    result = ArrayBuffer.isView(val);\n  } else {\n    result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n  }\n  return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n  if (kindOf(val) !== 'object') {\n    return false;\n  }\n\n  const prototype = getPrototypeOf(val);\n  return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n  let kind;\n  return thing && (\n    (typeof FormData === 'function' && thing instanceof FormData) || (\n      isFunction(thing.append) && (\n        (kind = kindOf(thing)) === 'formdata' ||\n        // detect form-data instance\n        (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n      )\n    )\n  )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n  str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n  // Don't bother if no value provided\n  if (obj === null || typeof obj === 'undefined') {\n    return;\n  }\n\n  let i;\n  let l;\n\n  // Force an array if not already something iterable\n  if (typeof obj !== 'object') {\n    /*eslint no-param-reassign:0*/\n    obj = [obj];\n  }\n\n  if (isArray(obj)) {\n    // Iterate over array values\n    for (i = 0, l = obj.length; i < l; i++) {\n      fn.call(null, obj[i], i, obj);\n    }\n  } else {\n    // Iterate over object keys\n    const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n    const len = keys.length;\n    let key;\n\n    for (i = 0; i < len; i++) {\n      key = keys[i];\n      fn.call(null, obj[key], key, obj);\n    }\n  }\n}\n\nfunction findKey(obj, key) {\n  key = key.toLowerCase();\n  const keys = Object.keys(obj);\n  let i = keys.length;\n  let _key;\n  while (i-- > 0) {\n    _key = keys[i];\n    if (key === _key.toLowerCase()) {\n      return _key;\n    }\n  }\n  return null;\n}\n\nconst _global = (() => {\n  /*eslint no-undef:0*/\n  if (typeof globalThis !== \"undefined\") return globalThis;\n  return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n  const {caseless} = isContextDefined(this) && this || {};\n  const result = {};\n  const assignValue = (val, key) => {\n    const targetKey = caseless && findKey(result, key) || key;\n    if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n      result[targetKey] = merge(result[targetKey], val);\n    } else if (isPlainObject(val)) {\n      result[targetKey] = merge({}, val);\n    } else if (isArray(val)) {\n      result[targetKey] = val.slice();\n    } else {\n      result[targetKey] = val;\n    }\n  }\n\n  for (let i = 0, l = arguments.length; i < l; i++) {\n    arguments[i] && forEach(arguments[i], assignValue);\n  }\n  return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n  forEach(b, (val, key) => {\n    if (thisArg && isFunction(val)) {\n      a[key] = bind(val, thisArg);\n    } else {\n      a[key] = val;\n    }\n  }, {allOwnKeys});\n  return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n  if (content.charCodeAt(0) === 0xFEFF) {\n    content = content.slice(1);\n  }\n  return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n  constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n  constructor.prototype.constructor = constructor;\n  Object.defineProperty(constructor, 'super', {\n    value: superConstructor.prototype\n  });\n  props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n  let props;\n  let i;\n  let prop;\n  const merged = {};\n\n  destObj = destObj || {};\n  // eslint-disable-next-line no-eq-null,eqeqeq\n  if (sourceObj == null) return destObj;\n\n  do {\n    props = Object.getOwnPropertyNames(sourceObj);\n    i = props.length;\n    while (i-- > 0) {\n      prop = props[i];\n      if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n        destObj[prop] = sourceObj[prop];\n        merged[prop] = true;\n      }\n    }\n    sourceObj = filter !== false && getPrototypeOf(sourceObj);\n  } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n  return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n  str = String(str);\n  if (position === undefined || position > str.length) {\n    position = str.length;\n  }\n  position -= searchString.length;\n  const lastIndex = str.indexOf(searchString, position);\n  return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n  if (!thing) return null;\n  if (isArray(thing)) return thing;\n  let i = thing.length;\n  if (!isNumber(i)) return null;\n  const arr = new Array(i);\n  while (i-- > 0) {\n    arr[i] = thing[i];\n  }\n  return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n  // eslint-disable-next-line func-names\n  return thing => {\n    return TypedArray && thing instanceof TypedArray;\n  };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n  const generator = obj && obj[Symbol.iterator];\n\n  const iterator = generator.call(obj);\n\n  let result;\n\n  while ((result = iterator.next()) && !result.done) {\n    const pair = result.value;\n    fn.call(obj, pair[0], pair[1]);\n  }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n  let matches;\n  const arr = [];\n\n  while ((matches = regExp.exec(str)) !== null) {\n    arr.push(matches);\n  }\n\n  return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n  return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n    function replacer(m, p1, p2) {\n      return p1.toUpperCase() + p2;\n    }\n  );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n  const descriptors = Object.getOwnPropertyDescriptors(obj);\n  const reducedDescriptors = {};\n\n  forEach(descriptors, (descriptor, name) => {\n    let ret;\n    if ((ret = reducer(descriptor, name, obj)) !== false) {\n      reducedDescriptors[name] = ret || descriptor;\n    }\n  });\n\n  Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n  reduceDescriptors(obj, (descriptor, name) => {\n    // skip restricted props in strict mode\n    if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n      return false;\n    }\n\n    const value = obj[name];\n\n    if (!isFunction(value)) return;\n\n    descriptor.enumerable = false;\n\n    if ('writable' in descriptor) {\n      descriptor.writable = false;\n      return;\n    }\n\n    if (!descriptor.set) {\n      descriptor.set = () => {\n        throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n      };\n    }\n  });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n  const obj = {};\n\n  const define = (arr) => {\n    arr.forEach(value => {\n      obj[value] = true;\n    });\n  }\n\n  isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n  return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n  value = +value;\n  return Number.isFinite(value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n  DIGIT,\n  ALPHA,\n  ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n  let str = '';\n  const {length} = alphabet;\n  while (size--) {\n    str += alphabet[Math.random() * length|0]\n  }\n\n  return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n  return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n  const stack = new Array(10);\n\n  const visit = (source, i) => {\n\n    if (isObject(source)) {\n      if (stack.indexOf(source) >= 0) {\n        return;\n      }\n\n      if(!('toJSON' in source)) {\n        stack[i] = source;\n        const target = isArray(source) ? [] : {};\n\n        forEach(source, (value, key) => {\n          const reducedValue = visit(value, i + 1);\n          !isUndefined(reducedValue) && (target[key] = reducedValue);\n        });\n\n        stack[i] = undefined;\n\n        return target;\n      }\n    }\n\n    return source;\n  }\n\n  return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n  thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\nexport default {\n  isArray,\n  isArrayBuffer,\n  isBuffer,\n  isFormData,\n  isArrayBufferView,\n  isString,\n  isNumber,\n  isBoolean,\n  isObject,\n  isPlainObject,\n  isUndefined,\n  isDate,\n  isFile,\n  isBlob,\n  isRegExp,\n  isFunction,\n  isStream,\n  isURLSearchParams,\n  isTypedArray,\n  isFileList,\n  forEach,\n  merge,\n  extend,\n  trim,\n  stripBOM,\n  inherits,\n  toFlatObject,\n  kindOf,\n  kindOfTest,\n  endsWith,\n  toArray,\n  forEachEntry,\n  matchAll,\n  isHTMLForm,\n  hasOwnProperty,\n  hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n  reduceDescriptors,\n  freezeMethods,\n  toObjectSet,\n  toCamelCase,\n  noop,\n  toFiniteNumber,\n  findKey,\n  global: _global,\n  isContextDefined,\n  ALPHABET,\n  generateString,\n  isSpecCompliantForm,\n  toJSONObject,\n  isAsyncFn,\n  isThenable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n  Error.call(this);\n\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, this.constructor);\n  } else {\n    this.stack = (new Error()).stack;\n  }\n\n  this.message = message;\n  this.name = 'AxiosError';\n  code && (this.code = code);\n  config && (this.config = config);\n  request && (this.request = request);\n  response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n  toJSON: function toJSON() {\n    return {\n      // Standard\n      message: this.message,\n      name: this.name,\n      // Microsoft\n      description: this.description,\n      number: this.number,\n      // Mozilla\n      fileName: this.fileName,\n      lineNumber: this.lineNumber,\n      columnNumber: this.columnNumber,\n      stack: this.stack,\n      // Axios\n      config: utils.toJSONObject(this.config),\n      code: this.code,\n      status: this.response && this.response.status ? this.response.status : null\n    };\n  }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n  'ERR_BAD_OPTION_VALUE',\n  'ERR_BAD_OPTION',\n  'ECONNABORTED',\n  'ETIMEDOUT',\n  'ERR_NETWORK',\n  'ERR_FR_TOO_MANY_REDIRECTS',\n  'ERR_DEPRECATED',\n  'ERR_BAD_RESPONSE',\n  'ERR_BAD_REQUEST',\n  'ERR_CANCELED',\n  'ERR_NOT_SUPPORT',\n  'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n  descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n  const axiosError = Object.create(prototype);\n\n  utils.toFlatObject(error, axiosError, function filter(obj) {\n    return obj !== Error.prototype;\n  }, prop => {\n    return prop !== 'isAxiosError';\n  });\n\n  AxiosError.call(axiosError, error.message, code, config, request, response);\n\n  axiosError.cause = error;\n\n  axiosError.name = error.name;\n\n  customProps && Object.assign(axiosError, customProps);\n\n  return axiosError;\n};\n\nexport default AxiosError;\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n  return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n  return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n  if (!path) return key;\n  return path.concat(key).map(function each(token, i) {\n    // eslint-disable-next-line no-param-reassign\n    token = removeBrackets(token);\n    return !dots && i ? '[' + token + ']' : token;\n  }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n  return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n  return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n  if (!utils.isObject(obj)) {\n    throw new TypeError('target must be an object');\n  }\n\n  // eslint-disable-next-line no-param-reassign\n  formData = formData || new (PlatformFormData || FormData)();\n\n  // eslint-disable-next-line no-param-reassign\n  options = utils.toFlatObject(options, {\n    metaTokens: true,\n    dots: false,\n    indexes: false\n  }, false, function defined(option, source) {\n    // eslint-disable-next-line no-eq-null,eqeqeq\n    return !utils.isUndefined(source[option]);\n  });\n\n  const metaTokens = options.metaTokens;\n  // eslint-disable-next-line no-use-before-define\n  const visitor = options.visitor || defaultVisitor;\n  const dots = options.dots;\n  const indexes = options.indexes;\n  const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n  const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n  if (!utils.isFunction(visitor)) {\n    throw new TypeError('visitor must be a function');\n  }\n\n  function convertValue(value) {\n    if (value === null) return '';\n\n    if (utils.isDate(value)) {\n      return value.toISOString();\n    }\n\n    if (!useBlob && utils.isBlob(value)) {\n      throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n    }\n\n    if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n      return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n    }\n\n    return value;\n  }\n\n  /**\n   * Default visitor.\n   *\n   * @param {*} value\n   * @param {String|Number} key\n   * @param {Array<String|Number>} path\n   * @this {FormData}\n   *\n   * @returns {boolean} return true to visit the each prop of the value recursively\n   */\n  function defaultVisitor(value, key, path) {\n    let arr = value;\n\n    if (value && !path && typeof value === 'object') {\n      if (utils.endsWith(key, '{}')) {\n        // eslint-disable-next-line no-param-reassign\n        key = metaTokens ? key : key.slice(0, -2);\n        // eslint-disable-next-line no-param-reassign\n        value = JSON.stringify(value);\n      } else if (\n        (utils.isArray(value) && isFlatArray(value)) ||\n        ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n        )) {\n        // eslint-disable-next-line no-param-reassign\n        key = removeBrackets(key);\n\n        arr.forEach(function each(el, index) {\n          !(utils.isUndefined(el) || el === null) && formData.append(\n            // eslint-disable-next-line no-nested-ternary\n            indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n            convertValue(el)\n          );\n        });\n        return false;\n      }\n    }\n\n    if (isVisitable(value)) {\n      return true;\n    }\n\n    formData.append(renderKey(path, key, dots), convertValue(value));\n\n    return false;\n  }\n\n  const stack = [];\n\n  const exposedHelpers = Object.assign(predicates, {\n    defaultVisitor,\n    convertValue,\n    isVisitable\n  });\n\n  function build(value, path) {\n    if (utils.isUndefined(value)) return;\n\n    if (stack.indexOf(value) !== -1) {\n      throw Error('Circular reference detected in ' + path.join('.'));\n    }\n\n    stack.push(value);\n\n    utils.forEach(value, function each(el, key) {\n      const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n        formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n      );\n\n      if (result === true) {\n        build(el, path ? path.concat(key) : [key]);\n      }\n    });\n\n    stack.pop();\n  }\n\n  if (!utils.isObject(obj)) {\n    throw new TypeError('data must be an object');\n  }\n\n  build(obj);\n\n  return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n  const charMap = {\n    '!': '%21',\n    \"'\": '%27',\n    '(': '%28',\n    ')': '%29',\n    '~': '%7E',\n    '%20': '+',\n    '%00': '\\x00'\n  };\n  return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n    return charMap[match];\n  });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n  this._pairs = [];\n\n  params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n  this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n  const _encode = encoder ? function(value) {\n    return encoder.call(this, value, encode);\n  } : encode;\n\n  return this._pairs.map(function each(pair) {\n    return _encode(pair[0]) + '=' + _encode(pair[1]);\n  }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n  return encodeURIComponent(val).\n    replace(/%3A/gi, ':').\n    replace(/%24/g, '$').\n    replace(/%2C/gi, ',').\n    replace(/%20/g, '+').\n    replace(/%5B/gi, '[').\n    replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n  /*eslint no-param-reassign:0*/\n  if (!params) {\n    return url;\n  }\n  \n  const _encode = options && options.encode || encode;\n\n  const serializeFn = options && options.serialize;\n\n  let serializedParams;\n\n  if (serializeFn) {\n    serializedParams = serializeFn(params, options);\n  } else {\n    serializedParams = utils.isURLSearchParams(params) ?\n      params.toString() :\n      new AxiosURLSearchParams(params, options).toString(_encode);\n  }\n\n  if (serializedParams) {\n    const hashmarkIndex = url.indexOf(\"#\");\n\n    if (hashmarkIndex !== -1) {\n      url = url.slice(0, hashmarkIndex);\n    }\n    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n  }\n\n  return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n  constructor() {\n    this.handlers = [];\n  }\n\n  /**\n   * Add a new interceptor to the stack\n   *\n   * @param {Function} fulfilled The function to handle `then` for a `Promise`\n   * @param {Function} rejected The function to handle `reject` for a `Promise`\n   *\n   * @return {Number} An ID used to remove interceptor later\n   */\n  use(fulfilled, rejected, options) {\n    this.handlers.push({\n      fulfilled,\n      rejected,\n      synchronous: options ? options.synchronous : false,\n      runWhen: options ? options.runWhen : null\n    });\n    return this.handlers.length - 1;\n  }\n\n  /**\n   * Remove an interceptor from the stack\n   *\n   * @param {Number} id The ID that was returned by `use`\n   *\n   * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n   */\n  eject(id) {\n    if (this.handlers[id]) {\n      this.handlers[id] = null;\n    }\n  }\n\n  /**\n   * Clear all interceptors from the stack\n   *\n   * @returns {void}\n   */\n  clear() {\n    if (this.handlers) {\n      this.handlers = [];\n    }\n  }\n\n  /**\n   * Iterate over all the registered interceptors\n   *\n   * This method is particularly useful for skipping over any\n   * interceptors that may have become `null` calling `eject`.\n   *\n   * @param {Function} fn The function to call for each interceptor\n   *\n   * @returns {void}\n   */\n  forEach(fn) {\n    utils.forEach(this.handlers, function forEachHandler(h) {\n      if (h !== null) {\n        fn(h);\n      }\n    });\n  }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n  silentJSONParsing: true,\n  forcedJSONParsing: true,\n  clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n  isBrowser: true,\n  classes: {\n    URLSearchParams,\n    FormData,\n    Blob\n  },\n  protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n *  typeof window -> undefined\n *  typeof document -> undefined\n *\n * react-native:\n *  navigator.product -> 'ReactNative'\n * nativescript\n *  navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = (\n  (product) => {\n    return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0\n  })(typeof navigator !== 'undefined' && navigator.product);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n  return (\n    typeof WorkerGlobalScope !== 'undefined' &&\n    // eslint-disable-next-line no-undef\n    self instanceof WorkerGlobalScope &&\n    typeof self.importScripts === 'function'\n  );\n})();\n\nexport {\n  hasBrowserEnv,\n  hasStandardBrowserWebWorkerEnv,\n  hasStandardBrowserEnv\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n  ...utils,\n  ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n  return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n    visitor: function(value, key, path, helpers) {\n      if (platform.isNode && utils.isBuffer(value)) {\n        this.append(key, value.toString('base64'));\n        return false;\n      }\n\n      return helpers.defaultVisitor.apply(this, arguments);\n    }\n  }, options));\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n  // foo[x][y][z]\n  // foo.x.y.z\n  // foo-x-y-z\n  // foo x y z\n  return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n    return match[0] === '[]' ? '' : match[1] || match[0];\n  });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n  const obj = {};\n  const keys = Object.keys(arr);\n  let i;\n  const len = keys.length;\n  let key;\n  for (i = 0; i < len; i++) {\n    key = keys[i];\n    obj[key] = arr[key];\n  }\n  return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n  function buildPath(path, value, target, index) {\n    let name = path[index++];\n\n    if (name === '__proto__') return true;\n\n    const isNumericKey = Number.isFinite(+name);\n    const isLast = index >= path.length;\n    name = !name && utils.isArray(target) ? target.length : name;\n\n    if (isLast) {\n      if (utils.hasOwnProp(target, name)) {\n        target[name] = [target[name], value];\n      } else {\n        target[name] = value;\n      }\n\n      return !isNumericKey;\n    }\n\n    if (!target[name] || !utils.isObject(target[name])) {\n      target[name] = [];\n    }\n\n    const result = buildPath(path, value, target[name], index);\n\n    if (result && utils.isArray(target[name])) {\n      target[name] = arrayToObject(target[name]);\n    }\n\n    return !isNumericKey;\n  }\n\n  if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n    const obj = {};\n\n    utils.forEachEntry(formData, (name, value) => {\n      buildPath(parsePropPath(name), value, obj, 0);\n    });\n\n    return obj;\n  }\n\n  return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n  if (utils.isString(rawValue)) {\n    try {\n      (parser || JSON.parse)(rawValue);\n      return utils.trim(rawValue);\n    } catch (e) {\n      if (e.name !== 'SyntaxError') {\n        throw e;\n      }\n    }\n  }\n\n  return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n  transitional: transitionalDefaults,\n\n  adapter: ['xhr', 'http'],\n\n  transformRequest: [function transformRequest(data, headers) {\n    const contentType = headers.getContentType() || '';\n    const hasJSONContentType = contentType.indexOf('application/json') > -1;\n    const isObjectPayload = utils.isObject(data);\n\n    if (isObjectPayload && utils.isHTMLForm(data)) {\n      data = new FormData(data);\n    }\n\n    const isFormData = utils.isFormData(data);\n\n    if (isFormData) {\n      return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n    }\n\n    if (utils.isArrayBuffer(data) ||\n      utils.isBuffer(data) ||\n      utils.isStream(data) ||\n      utils.isFile(data) ||\n      utils.isBlob(data)\n    ) {\n      return data;\n    }\n    if (utils.isArrayBufferView(data)) {\n      return data.buffer;\n    }\n    if (utils.isURLSearchParams(data)) {\n      headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n      return data.toString();\n    }\n\n    let isFileList;\n\n    if (isObjectPayload) {\n      if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n        return toURLEncodedForm(data, this.formSerializer).toString();\n      }\n\n      if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n        const _FormData = this.env && this.env.FormData;\n\n        return toFormData(\n          isFileList ? {'files[]': data} : data,\n          _FormData && new _FormData(),\n          this.formSerializer\n        );\n      }\n    }\n\n    if (isObjectPayload || hasJSONContentType ) {\n      headers.setContentType('application/json', false);\n      return stringifySafely(data);\n    }\n\n    return data;\n  }],\n\n  transformResponse: [function transformResponse(data) {\n    const transitional = this.transitional || defaults.transitional;\n    const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n    const JSONRequested = this.responseType === 'json';\n\n    if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n      const silentJSONParsing = transitional && transitional.silentJSONParsing;\n      const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n      try {\n        return JSON.parse(data);\n      } catch (e) {\n        if (strictJSONParsing) {\n          if (e.name === 'SyntaxError') {\n            throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n          }\n          throw e;\n        }\n      }\n    }\n\n    return data;\n  }],\n\n  /**\n   * A timeout in milliseconds to abort a request. If set to 0 (default) a\n   * timeout is not created.\n   */\n  timeout: 0,\n\n  xsrfCookieName: 'XSRF-TOKEN',\n  xsrfHeaderName: 'X-XSRF-TOKEN',\n\n  maxContentLength: -1,\n  maxBodyLength: -1,\n\n  env: {\n    FormData: platform.classes.FormData,\n    Blob: platform.classes.Blob\n  },\n\n  validateStatus: function validateStatus(status) {\n    return status >= 200 && status < 300;\n  },\n\n  headers: {\n    common: {\n      'Accept': 'application/json, text/plain, */*',\n      'Content-Type': undefined\n    }\n  }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n  defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n  'age', 'authorization', 'content-length', 'content-type', 'etag',\n  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n  'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n  'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n  const parsed = {};\n  let key;\n  let val;\n  let i;\n\n  rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n    i = line.indexOf(':');\n    key = line.substring(0, i).trim().toLowerCase();\n    val = line.substring(i + 1).trim();\n\n    if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n      return;\n    }\n\n    if (key === 'set-cookie') {\n      if (parsed[key]) {\n        parsed[key].push(val);\n      } else {\n        parsed[key] = [val];\n      }\n    } else {\n      parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n    }\n  });\n\n  return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n  return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n  if (value === false || value == null) {\n    return value;\n  }\n\n  return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n  const tokens = Object.create(null);\n  const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n  let match;\n\n  while ((match = tokensRE.exec(str))) {\n    tokens[match[1]] = match[2];\n  }\n\n  return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n  if (utils.isFunction(filter)) {\n    return filter.call(this, value, header);\n  }\n\n  if (isHeaderNameFilter) {\n    value = header;\n  }\n\n  if (!utils.isString(value)) return;\n\n  if (utils.isString(filter)) {\n    return value.indexOf(filter) !== -1;\n  }\n\n  if (utils.isRegExp(filter)) {\n    return filter.test(value);\n  }\n}\n\nfunction formatHeader(header) {\n  return header.trim()\n    .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n      return char.toUpperCase() + str;\n    });\n}\n\nfunction buildAccessors(obj, header) {\n  const accessorName = utils.toCamelCase(' ' + header);\n\n  ['get', 'set', 'has'].forEach(methodName => {\n    Object.defineProperty(obj, methodName + accessorName, {\n      value: function(arg1, arg2, arg3) {\n        return this[methodName].call(this, header, arg1, arg2, arg3);\n      },\n      configurable: true\n    });\n  });\n}\n\nclass AxiosHeaders {\n  constructor(headers) {\n    headers && this.set(headers);\n  }\n\n  set(header, valueOrRewrite, rewrite) {\n    const self = this;\n\n    function setHeader(_value, _header, _rewrite) {\n      const lHeader = normalizeHeader(_header);\n\n      if (!lHeader) {\n        throw new Error('header name must be a non-empty string');\n      }\n\n      const key = utils.findKey(self, lHeader);\n\n      if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n        self[key || _header] = normalizeValue(_value);\n      }\n    }\n\n    const setHeaders = (headers, _rewrite) =>\n      utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n    if (utils.isPlainObject(header) || header instanceof this.constructor) {\n      setHeaders(header, valueOrRewrite)\n    } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n      setHeaders(parseHeaders(header), valueOrRewrite);\n    } else {\n      header != null && setHeader(valueOrRewrite, header, rewrite);\n    }\n\n    return this;\n  }\n\n  get(header, parser) {\n    header = normalizeHeader(header);\n\n    if (header) {\n      const key = utils.findKey(this, header);\n\n      if (key) {\n        const value = this[key];\n\n        if (!parser) {\n          return value;\n        }\n\n        if (parser === true) {\n          return parseTokens(value);\n        }\n\n        if (utils.isFunction(parser)) {\n          return parser.call(this, value, key);\n        }\n\n        if (utils.isRegExp(parser)) {\n          return parser.exec(value);\n        }\n\n        throw new TypeError('parser must be boolean|regexp|function');\n      }\n    }\n  }\n\n  has(header, matcher) {\n    header = normalizeHeader(header);\n\n    if (header) {\n      const key = utils.findKey(this, header);\n\n      return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n    }\n\n    return false;\n  }\n\n  delete(header, matcher) {\n    const self = this;\n    let deleted = false;\n\n    function deleteHeader(_header) {\n      _header = normalizeHeader(_header);\n\n      if (_header) {\n        const key = utils.findKey(self, _header);\n\n        if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n          delete self[key];\n\n          deleted = true;\n        }\n      }\n    }\n\n    if (utils.isArray(header)) {\n      header.forEach(deleteHeader);\n    } else {\n      deleteHeader(header);\n    }\n\n    return deleted;\n  }\n\n  clear(matcher) {\n    const keys = Object.keys(this);\n    let i = keys.length;\n    let deleted = false;\n\n    while (i--) {\n      const key = keys[i];\n      if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n        delete this[key];\n        deleted = true;\n      }\n    }\n\n    return deleted;\n  }\n\n  normalize(format) {\n    const self = this;\n    const headers = {};\n\n    utils.forEach(this, (value, header) => {\n      const key = utils.findKey(headers, header);\n\n      if (key) {\n        self[key] = normalizeValue(value);\n        delete self[header];\n        return;\n      }\n\n      const normalized = format ? formatHeader(header) : String(header).trim();\n\n      if (normalized !== header) {\n        delete self[header];\n      }\n\n      self[normalized] = normalizeValue(value);\n\n      headers[normalized] = true;\n    });\n\n    return this;\n  }\n\n  concat(...targets) {\n    return this.constructor.concat(this, ...targets);\n  }\n\n  toJSON(asStrings) {\n    const obj = Object.create(null);\n\n    utils.forEach(this, (value, header) => {\n      value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n    });\n\n    return obj;\n  }\n\n  [Symbol.iterator]() {\n    return Object.entries(this.toJSON())[Symbol.iterator]();\n  }\n\n  toString() {\n    return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n  }\n\n  get [Symbol.toStringTag]() {\n    return 'AxiosHeaders';\n  }\n\n  static from(thing) {\n    return thing instanceof this ? thing : new this(thing);\n  }\n\n  static concat(first, ...targets) {\n    const computed = new this(first);\n\n    targets.forEach((target) => computed.set(target));\n\n    return computed;\n  }\n\n  static accessor(header) {\n    const internals = this[$internals] = (this[$internals] = {\n      accessors: {}\n    });\n\n    const accessors = internals.accessors;\n    const prototype = this.prototype;\n\n    function defineAccessor(_header) {\n      const lHeader = normalizeHeader(_header);\n\n      if (!accessors[lHeader]) {\n        buildAccessors(prototype, _header);\n        accessors[lHeader] = true;\n      }\n    }\n\n    utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n    return this;\n  }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n  let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n  return {\n    get: () => value,\n    set(headerValue) {\n      this[mapped] = headerValue;\n    }\n  }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n  const config = this || defaults;\n  const context = response || config;\n  const headers = AxiosHeaders.from(context.headers);\n  let data = context.data;\n\n  utils.forEach(fns, function transform(fn) {\n    data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n  });\n\n  headers.normalize();\n\n  return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n  return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n  // eslint-disable-next-line no-eq-null,eqeqeq\n  AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n  this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n  __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n  const validateStatus = response.config.validateStatus;\n  if (!response.status || !validateStatus || validateStatus(response.status)) {\n    resolve(response);\n  } else {\n    reject(new AxiosError(\n      'Request failed with status code ' + response.status,\n      [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n      response.config,\n      response.request,\n      response\n    ));\n  }\n}\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n  // Standard browser envs support document.cookie\n  {\n    write(name, value, expires, path, domain, secure) {\n      const cookie = [name + '=' + encodeURIComponent(value)];\n\n      utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n      utils.isString(path) && cookie.push('path=' + path);\n\n      utils.isString(domain) && cookie.push('domain=' + domain);\n\n      secure === true && cookie.push('secure');\n\n      document.cookie = cookie.join('; ');\n    },\n\n    read(name) {\n      const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n      return (match ? decodeURIComponent(match[3]) : null);\n    },\n\n    remove(name) {\n      this.write(name, '', Date.now() - 86400000);\n    }\n  }\n\n  :\n\n  // Non-standard browser env (web workers, react-native) lack needed support.\n  {\n    write() {},\n    read() {\n      return null;\n    },\n    remove() {}\n  };\n\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n  // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n  // by any combination of letters, digits, plus, period, or hyphen.\n  return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n  return relativeURL\n    ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n    : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n  if (baseURL && !isAbsoluteURL(requestedURL)) {\n    return combineURLs(baseURL, requestedURL);\n  }\n  return requestedURL;\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n  (function standardBrowserEnv() {\n    const msie = /(msie|trident)/i.test(navigator.userAgent);\n    const urlParsingNode = document.createElement('a');\n    let originURL;\n\n    /**\n    * Parse a URL to discover its components\n    *\n    * @param {String} url The URL to be parsed\n    * @returns {Object}\n    */\n    function resolveURL(url) {\n      let href = url;\n\n      if (msie) {\n        // IE needs attribute set twice to normalize properties\n        urlParsingNode.setAttribute('href', href);\n        href = urlParsingNode.href;\n      }\n\n      urlParsingNode.setAttribute('href', href);\n\n      // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n      return {\n        href: urlParsingNode.href,\n        protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n        host: urlParsingNode.host,\n        search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n        hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n        hostname: urlParsingNode.hostname,\n        port: urlParsingNode.port,\n        pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n          urlParsingNode.pathname :\n          '/' + urlParsingNode.pathname\n      };\n    }\n\n    originURL = resolveURL(window.location.href);\n\n    /**\n    * Determine if a URL shares the same origin as the current location\n    *\n    * @param {String} requestURL The URL to test\n    * @returns {boolean} True if URL shares the same origin, otherwise false\n    */\n    return function isURLSameOrigin(requestURL) {\n      const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n      return (parsed.protocol === originURL.protocol &&\n          parsed.host === originURL.host);\n    };\n  })() :\n\n  // Non standard browser envs (web workers, react-native) lack needed support.\n  (function nonStandardBrowserEnv() {\n    return function isURLSameOrigin() {\n      return true;\n    };\n  })();\n","'use strict';\n\nexport default function parseProtocol(url) {\n  const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n  return match && match[1] || '';\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n  samplesCount = samplesCount || 10;\n  const bytes = new Array(samplesCount);\n  const timestamps = new Array(samplesCount);\n  let head = 0;\n  let tail = 0;\n  let firstSampleTS;\n\n  min = min !== undefined ? min : 1000;\n\n  return function push(chunkLength) {\n    const now = Date.now();\n\n    const startedAt = timestamps[tail];\n\n    if (!firstSampleTS) {\n      firstSampleTS = now;\n    }\n\n    bytes[head] = chunkLength;\n    timestamps[head] = now;\n\n    let i = tail;\n    let bytesCount = 0;\n\n    while (i !== head) {\n      bytesCount += bytes[i++];\n      i = i % samplesCount;\n    }\n\n    head = (head + 1) % samplesCount;\n\n    if (head === tail) {\n      tail = (tail + 1) % samplesCount;\n    }\n\n    if (now - firstSampleTS < min) {\n      return;\n    }\n\n    const passed = startedAt && now - startedAt;\n\n    return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n  };\n}\n\nexport default speedometer;\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n  let bytesNotified = 0;\n  const _speedometer = speedometer(50, 250);\n\n  return e => {\n    const loaded = e.loaded;\n    const total = e.lengthComputable ? e.total : undefined;\n    const progressBytes = loaded - bytesNotified;\n    const rate = _speedometer(progressBytes);\n    const inRange = loaded <= total;\n\n    bytesNotified = loaded;\n\n    const data = {\n      loaded,\n      total,\n      progress: total ? (loaded / total) : undefined,\n      bytes: progressBytes,\n      rate: rate ? rate : undefined,\n      estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n      event: e\n    };\n\n    data[isDownloadStream ? 'download' : 'upload'] = true;\n\n    listener(data);\n  };\n}\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n  return new Promise(function dispatchXhrRequest(resolve, reject) {\n    let requestData = config.data;\n    const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n    let {responseType, withXSRFToken} = config;\n    let onCanceled;\n    function done() {\n      if (config.cancelToken) {\n        config.cancelToken.unsubscribe(onCanceled);\n      }\n\n      if (config.signal) {\n        config.signal.removeEventListener('abort', onCanceled);\n      }\n    }\n\n    let contentType;\n\n    if (utils.isFormData(requestData)) {\n      if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n        requestHeaders.setContentType(false); // Let the browser set it\n      } else if ((contentType = requestHeaders.getContentType()) !== false) {\n        // fix semicolon duplication issue for ReactNative FormData implementation\n        const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n        requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n      }\n    }\n\n    let request = new XMLHttpRequest();\n\n    // HTTP basic authentication\n    if (config.auth) {\n      const username = config.auth.username || '';\n      const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n      requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n    }\n\n    const fullPath = buildFullPath(config.baseURL, config.url);\n\n    request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n    // Set the request timeout in MS\n    request.timeout = config.timeout;\n\n    function onloadend() {\n      if (!request) {\n        return;\n      }\n      // Prepare the response\n      const responseHeaders = AxiosHeaders.from(\n        'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n      );\n      const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n        request.responseText : request.response;\n      const response = {\n        data: responseData,\n        status: request.status,\n        statusText: request.statusText,\n        headers: responseHeaders,\n        config,\n        request\n      };\n\n      settle(function _resolve(value) {\n        resolve(value);\n        done();\n      }, function _reject(err) {\n        reject(err);\n        done();\n      }, response);\n\n      // Clean up request\n      request = null;\n    }\n\n    if ('onloadend' in request) {\n      // Use onloadend if available\n      request.onloadend = onloadend;\n    } else {\n      // Listen for ready state to emulate onloadend\n      request.onreadystatechange = function handleLoad() {\n        if (!request || request.readyState !== 4) {\n          return;\n        }\n\n        // The request errored out and we didn't get a response, this will be\n        // handled by onerror instead\n        // With one exception: request that using file: protocol, most browsers\n        // will return status as 0 even though it's a successful request\n        if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n          return;\n        }\n        // readystate handler is calling before onerror or ontimeout handlers,\n        // so we should call onloadend on the next 'tick'\n        setTimeout(onloadend);\n      };\n    }\n\n    // Handle browser request cancellation (as opposed to a manual cancellation)\n    request.onabort = function handleAbort() {\n      if (!request) {\n        return;\n      }\n\n      reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle low level network errors\n    request.onerror = function handleError() {\n      // Real errors are hidden from us by the browser\n      // onerror should only fire if it's a network error\n      reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle timeout\n    request.ontimeout = function handleTimeout() {\n      let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n      const transitional = config.transitional || transitionalDefaults;\n      if (config.timeoutErrorMessage) {\n        timeoutErrorMessage = config.timeoutErrorMessage;\n      }\n      reject(new AxiosError(\n        timeoutErrorMessage,\n        transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n        config,\n        request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Add xsrf header\n    // This is only done if running in a standard browser environment.\n    // Specifically not if we're in a web worker, or react-native.\n    if(platform.hasStandardBrowserEnv) {\n      withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config));\n\n      if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) {\n        // Add xsrf header\n        const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n        if (xsrfValue) {\n          requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n        }\n      }\n    }\n\n    // Remove Content-Type if data is undefined\n    requestData === undefined && requestHeaders.setContentType(null);\n\n    // Add headers to the request\n    if ('setRequestHeader' in request) {\n      utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n        request.setRequestHeader(key, val);\n      });\n    }\n\n    // Add withCredentials to request if needed\n    if (!utils.isUndefined(config.withCredentials)) {\n      request.withCredentials = !!config.withCredentials;\n    }\n\n    // Add responseType to request if needed\n    if (responseType && responseType !== 'json') {\n      request.responseType = config.responseType;\n    }\n\n    // Handle progress if needed\n    if (typeof config.onDownloadProgress === 'function') {\n      request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n    }\n\n    // Not all browsers support upload events\n    if (typeof config.onUploadProgress === 'function' && request.upload) {\n      request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n    }\n\n    if (config.cancelToken || config.signal) {\n      // Handle cancellation\n      // eslint-disable-next-line func-names\n      onCanceled = cancel => {\n        if (!request) {\n          return;\n        }\n        reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n        request.abort();\n        request = null;\n      };\n\n      config.cancelToken && config.cancelToken.subscribe(onCanceled);\n      if (config.signal) {\n        config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n      }\n    }\n\n    const protocol = parseProtocol(fullPath);\n\n    if (protocol && platform.protocols.indexOf(protocol) === -1) {\n      reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n      return;\n    }\n\n\n    // Send the request\n    request.send(requestData || null);\n  });\n}\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n  http: httpAdapter,\n  xhr: xhrAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n  if (fn) {\n    try {\n      Object.defineProperty(fn, 'name', {value});\n    } catch (e) {\n      // eslint-disable-next-line no-empty\n    }\n    Object.defineProperty(fn, 'adapterName', {value});\n  }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n  getAdapter: (adapters) => {\n    adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n    const {length} = adapters;\n    let nameOrAdapter;\n    let adapter;\n\n    const rejectedReasons = {};\n\n    for (let i = 0; i < length; i++) {\n      nameOrAdapter = adapters[i];\n      let id;\n\n      adapter = nameOrAdapter;\n\n      if (!isResolvedHandle(nameOrAdapter)) {\n        adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n        if (adapter === undefined) {\n          throw new AxiosError(`Unknown adapter '${id}'`);\n        }\n      }\n\n      if (adapter) {\n        break;\n      }\n\n      rejectedReasons[id || '#' + i] = adapter;\n    }\n\n    if (!adapter) {\n\n      const reasons = Object.entries(rejectedReasons)\n        .map(([id, state]) => `adapter ${id} ` +\n          (state === false ? 'is not supported by the environment' : 'is not available in the build')\n        );\n\n      let s = length ?\n        (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n        'as no adapter specified';\n\n      throw new AxiosError(\n        `There is no suitable adapter to dispatch the request ` + s,\n        'ERR_NOT_SUPPORT'\n      );\n    }\n\n    return adapter;\n  },\n  adapters: knownAdapters\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n  if (config.cancelToken) {\n    config.cancelToken.throwIfRequested();\n  }\n\n  if (config.signal && config.signal.aborted) {\n    throw new CanceledError(null, config);\n  }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n  throwIfCancellationRequested(config);\n\n  config.headers = AxiosHeaders.from(config.headers);\n\n  // Transform request data\n  config.data = transformData.call(\n    config,\n    config.transformRequest\n  );\n\n  if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n    config.headers.setContentType('application/x-www-form-urlencoded', false);\n  }\n\n  const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n  return adapter(config).then(function onAdapterResolution(response) {\n    throwIfCancellationRequested(config);\n\n    // Transform response data\n    response.data = transformData.call(\n      config,\n      config.transformResponse,\n      response\n    );\n\n    response.headers = AxiosHeaders.from(response.headers);\n\n    return response;\n  }, function onAdapterRejection(reason) {\n    if (!isCancel(reason)) {\n      throwIfCancellationRequested(config);\n\n      // Transform response data\n      if (reason && reason.response) {\n        reason.response.data = transformData.call(\n          config,\n          config.transformResponse,\n          reason.response\n        );\n        reason.response.headers = AxiosHeaders.from(reason.response.headers);\n      }\n    }\n\n    return Promise.reject(reason);\n  });\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n  // eslint-disable-next-line no-param-reassign\n  config2 = config2 || {};\n  const config = {};\n\n  function getMergedValue(target, source, caseless) {\n    if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n      return utils.merge.call({caseless}, target, source);\n    } else if (utils.isPlainObject(source)) {\n      return utils.merge({}, source);\n    } else if (utils.isArray(source)) {\n      return source.slice();\n    }\n    return source;\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDeepProperties(a, b, caseless) {\n    if (!utils.isUndefined(b)) {\n      return getMergedValue(a, b, caseless);\n    } else if (!utils.isUndefined(a)) {\n      return getMergedValue(undefined, a, caseless);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function valueFromConfig2(a, b) {\n    if (!utils.isUndefined(b)) {\n      return getMergedValue(undefined, b);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function defaultToConfig2(a, b) {\n    if (!utils.isUndefined(b)) {\n      return getMergedValue(undefined, b);\n    } else if (!utils.isUndefined(a)) {\n      return getMergedValue(undefined, a);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDirectKeys(a, b, prop) {\n    if (prop in config2) {\n      return getMergedValue(a, b);\n    } else if (prop in config1) {\n      return getMergedValue(undefined, a);\n    }\n  }\n\n  const mergeMap = {\n    url: valueFromConfig2,\n    method: valueFromConfig2,\n    data: valueFromConfig2,\n    baseURL: defaultToConfig2,\n    transformRequest: defaultToConfig2,\n    transformResponse: defaultToConfig2,\n    paramsSerializer: defaultToConfig2,\n    timeout: defaultToConfig2,\n    timeoutMessage: defaultToConfig2,\n    withCredentials: defaultToConfig2,\n    withXSRFToken: defaultToConfig2,\n    adapter: defaultToConfig2,\n    responseType: defaultToConfig2,\n    xsrfCookieName: defaultToConfig2,\n    xsrfHeaderName: defaultToConfig2,\n    onUploadProgress: defaultToConfig2,\n    onDownloadProgress: defaultToConfig2,\n    decompress: defaultToConfig2,\n    maxContentLength: defaultToConfig2,\n    maxBodyLength: defaultToConfig2,\n    beforeRedirect: defaultToConfig2,\n    transport: defaultToConfig2,\n    httpAgent: defaultToConfig2,\n    httpsAgent: defaultToConfig2,\n    cancelToken: defaultToConfig2,\n    socketPath: defaultToConfig2,\n    responseEncoding: defaultToConfig2,\n    validateStatus: mergeDirectKeys,\n    headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n  };\n\n  utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n    const merge = mergeMap[prop] || mergeDeepProperties;\n    const configValue = merge(config1[prop], config2[prop], prop);\n    (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n  });\n\n  return config;\n}\n","export const VERSION = \"1.6.8\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n  validators[type] = function validator(thing) {\n    return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n  };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n  function formatMessage(opt, desc) {\n    return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n  }\n\n  // eslint-disable-next-line func-names\n  return (value, opt, opts) => {\n    if (validator === false) {\n      throw new AxiosError(\n        formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n        AxiosError.ERR_DEPRECATED\n      );\n    }\n\n    if (version && !deprecatedWarnings[opt]) {\n      deprecatedWarnings[opt] = true;\n      // eslint-disable-next-line no-console\n      console.warn(\n        formatMessage(\n          opt,\n          ' has been deprecated since v' + version + ' and will be removed in the near future'\n        )\n      );\n    }\n\n    return validator ? validator(value, opt, opts) : true;\n  };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n  if (typeof options !== 'object') {\n    throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n  }\n  const keys = Object.keys(options);\n  let i = keys.length;\n  while (i-- > 0) {\n    const opt = keys[i];\n    const validator = schema[opt];\n    if (validator) {\n      const value = options[opt];\n      const result = value === undefined || validator(value, opt, options);\n      if (result !== true) {\n        throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n      }\n      continue;\n    }\n    if (allowUnknown !== true) {\n      throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n    }\n  }\n}\n\nexport default {\n  assertOptions,\n  validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n  constructor(instanceConfig) {\n    this.defaults = instanceConfig;\n    this.interceptors = {\n      request: new InterceptorManager(),\n      response: new InterceptorManager()\n    };\n  }\n\n  /**\n   * Dispatch a request\n   *\n   * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n   * @param {?Object} config\n   *\n   * @returns {Promise} The Promise to be fulfilled\n   */\n  async request(configOrUrl, config) {\n    try {\n      return await this._request(configOrUrl, config);\n    } catch (err) {\n      if (err instanceof Error) {\n        let dummy;\n\n        Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : (dummy = new Error());\n\n        // slice off the Error: ... line\n        const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n\n        if (!err.stack) {\n          err.stack = stack;\n          // match without the 2 top stack lines\n        } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n          err.stack += '\\n' + stack\n        }\n      }\n\n      throw err;\n    }\n  }\n\n  _request(configOrUrl, config) {\n    /*eslint no-param-reassign:0*/\n    // Allow for axios('example/url'[, config]) a la fetch API\n    if (typeof configOrUrl === 'string') {\n      config = config || {};\n      config.url = configOrUrl;\n    } else {\n      config = configOrUrl || {};\n    }\n\n    config = mergeConfig(this.defaults, config);\n\n    const {transitional, paramsSerializer, headers} = config;\n\n    if (transitional !== undefined) {\n      validator.assertOptions(transitional, {\n        silentJSONParsing: validators.transitional(validators.boolean),\n        forcedJSONParsing: validators.transitional(validators.boolean),\n        clarifyTimeoutError: validators.transitional(validators.boolean)\n      }, false);\n    }\n\n    if (paramsSerializer != null) {\n      if (utils.isFunction(paramsSerializer)) {\n        config.paramsSerializer = {\n          serialize: paramsSerializer\n        }\n      } else {\n        validator.assertOptions(paramsSerializer, {\n          encode: validators.function,\n          serialize: validators.function\n        }, true);\n      }\n    }\n\n    // Set config.method\n    config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n    // Flatten headers\n    let contextHeaders = headers && utils.merge(\n      headers.common,\n      headers[config.method]\n    );\n\n    headers && utils.forEach(\n      ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n      (method) => {\n        delete headers[method];\n      }\n    );\n\n    config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n    // filter out skipped interceptors\n    const requestInterceptorChain = [];\n    let synchronousRequestInterceptors = true;\n    this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n      if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n        return;\n      }\n\n      synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n      requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n    });\n\n    const responseInterceptorChain = [];\n    this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n      responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n    });\n\n    let promise;\n    let i = 0;\n    let len;\n\n    if (!synchronousRequestInterceptors) {\n      const chain = [dispatchRequest.bind(this), undefined];\n      chain.unshift.apply(chain, requestInterceptorChain);\n      chain.push.apply(chain, responseInterceptorChain);\n      len = chain.length;\n\n      promise = Promise.resolve(config);\n\n      while (i < len) {\n        promise = promise.then(chain[i++], chain[i++]);\n      }\n\n      return promise;\n    }\n\n    len = requestInterceptorChain.length;\n\n    let newConfig = config;\n\n    i = 0;\n\n    while (i < len) {\n      const onFulfilled = requestInterceptorChain[i++];\n      const onRejected = requestInterceptorChain[i++];\n      try {\n        newConfig = onFulfilled(newConfig);\n      } catch (error) {\n        onRejected.call(this, error);\n        break;\n      }\n    }\n\n    try {\n      promise = dispatchRequest.call(this, newConfig);\n    } catch (error) {\n      return Promise.reject(error);\n    }\n\n    i = 0;\n    len = responseInterceptorChain.length;\n\n    while (i < len) {\n      promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n    }\n\n    return promise;\n  }\n\n  getUri(config) {\n    config = mergeConfig(this.defaults, config);\n    const fullPath = buildFullPath(config.baseURL, config.url);\n    return buildURL(fullPath, config.params, config.paramsSerializer);\n  }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n  /*eslint func-names:0*/\n  Axios.prototype[method] = function(url, config) {\n    return this.request(mergeConfig(config || {}, {\n      method,\n      url,\n      data: (config || {}).data\n    }));\n  };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n  /*eslint func-names:0*/\n\n  function generateHTTPMethod(isForm) {\n    return function httpMethod(url, data, config) {\n      return this.request(mergeConfig(config || {}, {\n        method,\n        headers: isForm ? {\n          'Content-Type': 'multipart/form-data'\n        } : {},\n        url,\n        data\n      }));\n    };\n  }\n\n  Axios.prototype[method] = generateHTTPMethod();\n\n  Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n  constructor(executor) {\n    if (typeof executor !== 'function') {\n      throw new TypeError('executor must be a function.');\n    }\n\n    let resolvePromise;\n\n    this.promise = new Promise(function promiseExecutor(resolve) {\n      resolvePromise = resolve;\n    });\n\n    const token = this;\n\n    // eslint-disable-next-line func-names\n    this.promise.then(cancel => {\n      if (!token._listeners) return;\n\n      let i = token._listeners.length;\n\n      while (i-- > 0) {\n        token._listeners[i](cancel);\n      }\n      token._listeners = null;\n    });\n\n    // eslint-disable-next-line func-names\n    this.promise.then = onfulfilled => {\n      let _resolve;\n      // eslint-disable-next-line func-names\n      const promise = new Promise(resolve => {\n        token.subscribe(resolve);\n        _resolve = resolve;\n      }).then(onfulfilled);\n\n      promise.cancel = function reject() {\n        token.unsubscribe(_resolve);\n      };\n\n      return promise;\n    };\n\n    executor(function cancel(message, config, request) {\n      if (token.reason) {\n        // Cancellation has already been requested\n        return;\n      }\n\n      token.reason = new CanceledError(message, config, request);\n      resolvePromise(token.reason);\n    });\n  }\n\n  /**\n   * Throws a `CanceledError` if cancellation has been requested.\n   */\n  throwIfRequested() {\n    if (this.reason) {\n      throw this.reason;\n    }\n  }\n\n  /**\n   * Subscribe to the cancel signal\n   */\n\n  subscribe(listener) {\n    if (this.reason) {\n      listener(this.reason);\n      return;\n    }\n\n    if (this._listeners) {\n      this._listeners.push(listener);\n    } else {\n      this._listeners = [listener];\n    }\n  }\n\n  /**\n   * Unsubscribe from the cancel signal\n   */\n\n  unsubscribe(listener) {\n    if (!this._listeners) {\n      return;\n    }\n    const index = this._listeners.indexOf(listener);\n    if (index !== -1) {\n      this._listeners.splice(index, 1);\n    }\n  }\n\n  /**\n   * Returns an object that contains a new `CancelToken` and a function that, when called,\n   * cancels the `CancelToken`.\n   */\n  static source() {\n    let cancel;\n    const token = new CancelToken(function executor(c) {\n      cancel = c;\n    });\n    return {\n      token,\n      cancel\n    };\n  }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n *  ```js\n *  function f(x, y, z) {}\n *  var args = [1, 2, 3];\n *  f.apply(null, args);\n *  ```\n *\n * With `spread` this example can be re-written.\n *\n *  ```js\n *  spread(function(x, y, z) {})([1, 2, 3]);\n *  ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n  return function wrap(arr) {\n    return callback.apply(null, arr);\n  };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n  return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n  Continue: 100,\n  SwitchingProtocols: 101,\n  Processing: 102,\n  EarlyHints: 103,\n  Ok: 200,\n  Created: 201,\n  Accepted: 202,\n  NonAuthoritativeInformation: 203,\n  NoContent: 204,\n  ResetContent: 205,\n  PartialContent: 206,\n  MultiStatus: 207,\n  AlreadyReported: 208,\n  ImUsed: 226,\n  MultipleChoices: 300,\n  MovedPermanently: 301,\n  Found: 302,\n  SeeOther: 303,\n  NotModified: 304,\n  UseProxy: 305,\n  Unused: 306,\n  TemporaryRedirect: 307,\n  PermanentRedirect: 308,\n  BadRequest: 400,\n  Unauthorized: 401,\n  PaymentRequired: 402,\n  Forbidden: 403,\n  NotFound: 404,\n  MethodNotAllowed: 405,\n  NotAcceptable: 406,\n  ProxyAuthenticationRequired: 407,\n  RequestTimeout: 408,\n  Conflict: 409,\n  Gone: 410,\n  LengthRequired: 411,\n  PreconditionFailed: 412,\n  PayloadTooLarge: 413,\n  UriTooLong: 414,\n  UnsupportedMediaType: 415,\n  RangeNotSatisfiable: 416,\n  ExpectationFailed: 417,\n  ImATeapot: 418,\n  MisdirectedRequest: 421,\n  UnprocessableEntity: 422,\n  Locked: 423,\n  FailedDependency: 424,\n  TooEarly: 425,\n  UpgradeRequired: 426,\n  PreconditionRequired: 428,\n  TooManyRequests: 429,\n  RequestHeaderFieldsTooLarge: 431,\n  UnavailableForLegalReasons: 451,\n  InternalServerError: 500,\n  NotImplemented: 501,\n  BadGateway: 502,\n  ServiceUnavailable: 503,\n  GatewayTimeout: 504,\n  HttpVersionNotSupported: 505,\n  VariantAlsoNegotiates: 506,\n  InsufficientStorage: 507,\n  LoopDetected: 508,\n  NotExtended: 510,\n  NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n  HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n  const context = new Axios(defaultConfig);\n  const instance = bind(Axios.prototype.request, context);\n\n  // Copy axios.prototype to instance\n  utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n  // Copy context to instance\n  utils.extend(instance, context, null, {allOwnKeys: true});\n\n  // Factory for creating new instances\n  instance.create = function create(instanceConfig) {\n    return createInstance(mergeConfig(defaultConfig, instanceConfig));\n  };\n\n  return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n  return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","import axios from \"axios\";\r\n\r\n// const BASE_URL = \"https://localhost:5001/api\";\r\nconst BASE_URL = \"/api\";\r\n\r\nconst axiosClient = axios.create({\r\n  baseURL: BASE_URL,\r\n  headers: {\r\n    Accept: \"application/json\",\r\n    \"Content-Type\": \"application/json\"\r\n  }\r\n});\r\n\r\naxiosClient.interceptors.response.use((response) => response.data);\r\n\r\nexport default axiosClient;\r\n","class Subscribable {\n  constructor() {\n    this.listeners = new Set();\n    this.subscribe = this.subscribe.bind(this);\n  }\n\n  subscribe(listener) {\n    const identity = {\n      listener\n    };\n    this.listeners.add(identity);\n    this.onSubscribe();\n    return () => {\n      this.listeners.delete(identity);\n      this.onUnsubscribe();\n    };\n  }\n\n  hasListeners() {\n    return this.listeners.size > 0;\n  }\n\n  onSubscribe() {// Do nothing\n  }\n\n  onUnsubscribe() {// Do nothing\n  }\n\n}\n\nexport { Subscribable };\n//# sourceMappingURL=subscribable.mjs.map\n","// TYPES\n// UTILS\nconst isServer = typeof window === 'undefined' || 'Deno' in window;\nfunction noop() {\n  return undefined;\n}\nfunction functionalUpdate(updater, input) {\n  return typeof updater === 'function' ? updater(input) : updater;\n}\nfunction isValidTimeout(value) {\n  return typeof value === 'number' && value >= 0 && value !== Infinity;\n}\nfunction difference(array1, array2) {\n  return array1.filter(x => !array2.includes(x));\n}\nfunction replaceAt(array, index, value) {\n  const copy = array.slice(0);\n  copy[index] = value;\n  return copy;\n}\nfunction timeUntilStale(updatedAt, staleTime) {\n  return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);\n}\nfunction parseQueryArgs(arg1, arg2, arg3) {\n  if (!isQueryKey(arg1)) {\n    return arg1;\n  }\n\n  if (typeof arg2 === 'function') {\n    return { ...arg3,\n      queryKey: arg1,\n      queryFn: arg2\n    };\n  }\n\n  return { ...arg2,\n    queryKey: arg1\n  };\n}\nfunction parseMutationArgs(arg1, arg2, arg3) {\n  if (isQueryKey(arg1)) {\n    if (typeof arg2 === 'function') {\n      return { ...arg3,\n        mutationKey: arg1,\n        mutationFn: arg2\n      };\n    }\n\n    return { ...arg2,\n      mutationKey: arg1\n    };\n  }\n\n  if (typeof arg1 === 'function') {\n    return { ...arg2,\n      mutationFn: arg1\n    };\n  }\n\n  return { ...arg1\n  };\n}\nfunction parseFilterArgs(arg1, arg2, arg3) {\n  return isQueryKey(arg1) ? [{ ...arg2,\n    queryKey: arg1\n  }, arg3] : [arg1 || {}, arg2];\n}\nfunction parseMutationFilterArgs(arg1, arg2, arg3) {\n  return isQueryKey(arg1) ? [{ ...arg2,\n    mutationKey: arg1\n  }, arg3] : [arg1 || {}, arg2];\n}\nfunction matchQuery(filters, query) {\n  const {\n    type = 'all',\n    exact,\n    fetchStatus,\n    predicate,\n    queryKey,\n    stale\n  } = filters;\n\n  if (isQueryKey(queryKey)) {\n    if (exact) {\n      if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n        return false;\n      }\n    } else if (!partialMatchKey(query.queryKey, queryKey)) {\n      return false;\n    }\n  }\n\n  if (type !== 'all') {\n    const isActive = query.isActive();\n\n    if (type === 'active' && !isActive) {\n      return false;\n    }\n\n    if (type === 'inactive' && isActive) {\n      return false;\n    }\n  }\n\n  if (typeof stale === 'boolean' && query.isStale() !== stale) {\n    return false;\n  }\n\n  if (typeof fetchStatus !== 'undefined' && fetchStatus !== query.state.fetchStatus) {\n    return false;\n  }\n\n  if (predicate && !predicate(query)) {\n    return false;\n  }\n\n  return true;\n}\nfunction matchMutation(filters, mutation) {\n  const {\n    exact,\n    fetching,\n    predicate,\n    mutationKey\n  } = filters;\n\n  if (isQueryKey(mutationKey)) {\n    if (!mutation.options.mutationKey) {\n      return false;\n    }\n\n    if (exact) {\n      if (hashQueryKey(mutation.options.mutationKey) !== hashQueryKey(mutationKey)) {\n        return false;\n      }\n    } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n      return false;\n    }\n  }\n\n  if (typeof fetching === 'boolean' && mutation.state.status === 'loading' !== fetching) {\n    return false;\n  }\n\n  if (predicate && !predicate(mutation)) {\n    return false;\n  }\n\n  return true;\n}\nfunction hashQueryKeyByOptions(queryKey, options) {\n  const hashFn = (options == null ? void 0 : options.queryKeyHashFn) || hashQueryKey;\n  return hashFn(queryKey);\n}\n/**\n * Default query keys hash function.\n * Hashes the value into a stable hash.\n */\n\nfunction hashQueryKey(queryKey) {\n  return JSON.stringify(queryKey, (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {\n    result[key] = val[key];\n    return result;\n  }, {}) : val);\n}\n/**\n * Checks if key `b` partially matches with key `a`.\n */\n\nfunction partialMatchKey(a, b) {\n  return partialDeepEqual(a, b);\n}\n/**\n * Checks if `b` partially matches with `a`.\n */\n\nfunction partialDeepEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n\n  if (typeof a !== typeof b) {\n    return false;\n  }\n\n  if (a && b && typeof a === 'object' && typeof b === 'object') {\n    return !Object.keys(b).some(key => !partialDeepEqual(a[key], b[key]));\n  }\n\n  return false;\n}\n/**\n * This function returns `a` if `b` is deeply equal.\n * If not, it will replace any deeply equal children of `b` with those of `a`.\n * This can be used for structural sharing between JSON values for example.\n */\n\nfunction replaceEqualDeep(a, b) {\n  if (a === b) {\n    return a;\n  }\n\n  const array = isPlainArray(a) && isPlainArray(b);\n\n  if (array || isPlainObject(a) && isPlainObject(b)) {\n    const aSize = array ? a.length : Object.keys(a).length;\n    const bItems = array ? b : Object.keys(b);\n    const bSize = bItems.length;\n    const copy = array ? [] : {};\n    let equalItems = 0;\n\n    for (let i = 0; i < bSize; i++) {\n      const key = array ? i : bItems[i];\n      copy[key] = replaceEqualDeep(a[key], b[key]);\n\n      if (copy[key] === a[key]) {\n        equalItems++;\n      }\n    }\n\n    return aSize === bSize && equalItems === aSize ? a : copy;\n  }\n\n  return b;\n}\n/**\n * Shallow compare objects. Only works with objects that always have the same properties.\n */\n\nfunction shallowEqualObjects(a, b) {\n  if (a && !b || b && !a) {\n    return false;\n  }\n\n  for (const key in a) {\n    if (a[key] !== b[key]) {\n      return false;\n    }\n  }\n\n  return true;\n}\nfunction isPlainArray(value) {\n  return Array.isArray(value) && value.length === Object.keys(value).length;\n} // Copied from: https://github.com/jonschlinkert/is-plain-object\n\nfunction isPlainObject(o) {\n  if (!hasObjectPrototype(o)) {\n    return false;\n  } // If has modified constructor\n\n\n  const ctor = o.constructor;\n\n  if (typeof ctor === 'undefined') {\n    return true;\n  } // If has modified prototype\n\n\n  const prot = ctor.prototype;\n\n  if (!hasObjectPrototype(prot)) {\n    return false;\n  } // If constructor does not have an Object-specific method\n\n\n  if (!prot.hasOwnProperty('isPrototypeOf')) {\n    return false;\n  } // Most likely a plain Object\n\n\n  return true;\n}\n\nfunction hasObjectPrototype(o) {\n  return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction isQueryKey(value) {\n  return Array.isArray(value);\n}\nfunction isError(value) {\n  return value instanceof Error;\n}\nfunction sleep(timeout) {\n  return new Promise(resolve => {\n    setTimeout(resolve, timeout);\n  });\n}\n/**\n * Schedules a microtask.\n * This can be useful to schedule state updates after rendering.\n */\n\nfunction scheduleMicrotask(callback) {\n  sleep(0).then(callback);\n}\nfunction getAbortController() {\n  if (typeof AbortController === 'function') {\n    return new AbortController();\n  }\n\n  return;\n}\nfunction replaceData(prevData, data, options) {\n  // Use prev data if an isDataEqual function is defined and returns `true`\n  if (options.isDataEqual != null && options.isDataEqual(prevData, data)) {\n    return prevData;\n  } else if (typeof options.structuralSharing === 'function') {\n    return options.structuralSharing(prevData, data);\n  } else if (options.structuralSharing !== false) {\n    // Structurally share data between prev and new data if needed\n    return replaceEqualDeep(prevData, data);\n  }\n\n  return data;\n}\n\nexport { difference, functionalUpdate, getAbortController, hashQueryKey, hashQueryKeyByOptions, isError, isPlainArray, isPlainObject, isQueryKey, isServer, isValidTimeout, matchMutation, matchQuery, noop, parseFilterArgs, parseMutationArgs, parseMutationFilterArgs, parseQueryArgs, partialDeepEqual, partialMatchKey, replaceAt, replaceData, replaceEqualDeep, scheduleMicrotask, shallowEqualObjects, sleep, timeUntilStale };\n//# sourceMappingURL=utils.mjs.map\n","import { Subscribable } from './subscribable.mjs';\nimport { isServer } from './utils.mjs';\n\nclass FocusManager extends Subscribable {\n  constructor() {\n    super();\n\n    this.setup = onFocus => {\n      // addEventListener does not exist in React Native, but window does\n      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n      if (!isServer && window.addEventListener) {\n        const listener = () => onFocus(); // Listen to visibillitychange and focus\n\n\n        window.addEventListener('visibilitychange', listener, false);\n        window.addEventListener('focus', listener, false);\n        return () => {\n          // Be sure to unsubscribe if a new handler is set\n          window.removeEventListener('visibilitychange', listener);\n          window.removeEventListener('focus', listener);\n        };\n      }\n\n      return;\n    };\n  }\n\n  onSubscribe() {\n    if (!this.cleanup) {\n      this.setEventListener(this.setup);\n    }\n  }\n\n  onUnsubscribe() {\n    if (!this.hasListeners()) {\n      var _this$cleanup;\n\n      (_this$cleanup = this.cleanup) == null ? void 0 : _this$cleanup.call(this);\n      this.cleanup = undefined;\n    }\n  }\n\n  setEventListener(setup) {\n    var _this$cleanup2;\n\n    this.setup = setup;\n    (_this$cleanup2 = this.cleanup) == null ? void 0 : _this$cleanup2.call(this);\n    this.cleanup = setup(focused => {\n      if (typeof focused === 'boolean') {\n        this.setFocused(focused);\n      } else {\n        this.onFocus();\n      }\n    });\n  }\n\n  setFocused(focused) {\n    const changed = this.focused !== focused;\n\n    if (changed) {\n      this.focused = focused;\n      this.onFocus();\n    }\n  }\n\n  onFocus() {\n    this.listeners.forEach(({\n      listener\n    }) => {\n      listener();\n    });\n  }\n\n  isFocused() {\n    if (typeof this.focused === 'boolean') {\n      return this.focused;\n    } // document global can be unavailable in react native\n\n\n    if (typeof document === 'undefined') {\n      return true;\n    }\n\n    return [undefined, 'visible', 'prerender'].includes(document.visibilityState);\n  }\n\n}\nconst focusManager = new FocusManager();\n\nexport { FocusManager, focusManager };\n//# sourceMappingURL=focusManager.mjs.map\n","import { Subscribable } from './subscribable.mjs';\nimport { isServer } from './utils.mjs';\n\nconst onlineEvents = ['online', 'offline'];\nclass OnlineManager extends Subscribable {\n  constructor() {\n    super();\n\n    this.setup = onOnline => {\n      // addEventListener does not exist in React Native, but window does\n      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n      if (!isServer && window.addEventListener) {\n        const listener = () => onOnline(); // Listen to online\n\n\n        onlineEvents.forEach(event => {\n          window.addEventListener(event, listener, false);\n        });\n        return () => {\n          // Be sure to unsubscribe if a new handler is set\n          onlineEvents.forEach(event => {\n            window.removeEventListener(event, listener);\n          });\n        };\n      }\n\n      return;\n    };\n  }\n\n  onSubscribe() {\n    if (!this.cleanup) {\n      this.setEventListener(this.setup);\n    }\n  }\n\n  onUnsubscribe() {\n    if (!this.hasListeners()) {\n      var _this$cleanup;\n\n      (_this$cleanup = this.cleanup) == null ? void 0 : _this$cleanup.call(this);\n      this.cleanup = undefined;\n    }\n  }\n\n  setEventListener(setup) {\n    var _this$cleanup2;\n\n    this.setup = setup;\n    (_this$cleanup2 = this.cleanup) == null ? void 0 : _this$cleanup2.call(this);\n    this.cleanup = setup(online => {\n      if (typeof online === 'boolean') {\n        this.setOnline(online);\n      } else {\n        this.onOnline();\n      }\n    });\n  }\n\n  setOnline(online) {\n    const changed = this.online !== online;\n\n    if (changed) {\n      this.online = online;\n      this.onOnline();\n    }\n  }\n\n  onOnline() {\n    this.listeners.forEach(({\n      listener\n    }) => {\n      listener();\n    });\n  }\n\n  isOnline() {\n    if (typeof this.online === 'boolean') {\n      return this.online;\n    }\n\n    if (typeof navigator === 'undefined' || typeof navigator.onLine === 'undefined') {\n      return true;\n    }\n\n    return navigator.onLine;\n  }\n\n}\nconst onlineManager = new OnlineManager();\n\nexport { OnlineManager, onlineManager };\n//# sourceMappingURL=onlineManager.mjs.map\n","import { focusManager } from './focusManager.mjs';\nimport { onlineManager } from './onlineManager.mjs';\nimport { sleep } from './utils.mjs';\n\nfunction defaultRetryDelay(failureCount) {\n  return Math.min(1000 * 2 ** failureCount, 30000);\n}\n\nfunction canFetch(networkMode) {\n  return (networkMode != null ? networkMode : 'online') === 'online' ? onlineManager.isOnline() : true;\n}\nclass CancelledError {\n  constructor(options) {\n    this.revert = options == null ? void 0 : options.revert;\n    this.silent = options == null ? void 0 : options.silent;\n  }\n\n}\nfunction isCancelledError(value) {\n  return value instanceof CancelledError;\n}\nfunction createRetryer(config) {\n  let isRetryCancelled = false;\n  let failureCount = 0;\n  let isResolved = false;\n  let continueFn;\n  let promiseResolve;\n  let promiseReject;\n  const promise = new Promise((outerResolve, outerReject) => {\n    promiseResolve = outerResolve;\n    promiseReject = outerReject;\n  });\n\n  const cancel = cancelOptions => {\n    if (!isResolved) {\n      reject(new CancelledError(cancelOptions));\n      config.abort == null ? void 0 : config.abort();\n    }\n  };\n\n  const cancelRetry = () => {\n    isRetryCancelled = true;\n  };\n\n  const continueRetry = () => {\n    isRetryCancelled = false;\n  };\n\n  const shouldPause = () => !focusManager.isFocused() || config.networkMode !== 'always' && !onlineManager.isOnline();\n\n  const resolve = value => {\n    if (!isResolved) {\n      isResolved = true;\n      config.onSuccess == null ? void 0 : config.onSuccess(value);\n      continueFn == null ? void 0 : continueFn();\n      promiseResolve(value);\n    }\n  };\n\n  const reject = value => {\n    if (!isResolved) {\n      isResolved = true;\n      config.onError == null ? void 0 : config.onError(value);\n      continueFn == null ? void 0 : continueFn();\n      promiseReject(value);\n    }\n  };\n\n  const pause = () => {\n    return new Promise(continueResolve => {\n      continueFn = value => {\n        const canContinue = isResolved || !shouldPause();\n\n        if (canContinue) {\n          continueResolve(value);\n        }\n\n        return canContinue;\n      };\n\n      config.onPause == null ? void 0 : config.onPause();\n    }).then(() => {\n      continueFn = undefined;\n\n      if (!isResolved) {\n        config.onContinue == null ? void 0 : config.onContinue();\n      }\n    });\n  }; // Create loop function\n\n\n  const run = () => {\n    // Do nothing if already resolved\n    if (isResolved) {\n      return;\n    }\n\n    let promiseOrValue; // Execute query\n\n    try {\n      promiseOrValue = config.fn();\n    } catch (error) {\n      promiseOrValue = Promise.reject(error);\n    }\n\n    Promise.resolve(promiseOrValue).then(resolve).catch(error => {\n      var _config$retry, _config$retryDelay;\n\n      // Stop if the fetch is already resolved\n      if (isResolved) {\n        return;\n      } // Do we need to retry the request?\n\n\n      const retry = (_config$retry = config.retry) != null ? _config$retry : 3;\n      const retryDelay = (_config$retryDelay = config.retryDelay) != null ? _config$retryDelay : defaultRetryDelay;\n      const delay = typeof retryDelay === 'function' ? retryDelay(failureCount, error) : retryDelay;\n      const shouldRetry = retry === true || typeof retry === 'number' && failureCount < retry || typeof retry === 'function' && retry(failureCount, error);\n\n      if (isRetryCancelled || !shouldRetry) {\n        // We are done if the query does not need to be retried\n        reject(error);\n        return;\n      }\n\n      failureCount++; // Notify on fail\n\n      config.onFail == null ? void 0 : config.onFail(failureCount, error); // Delay\n\n      sleep(delay) // Pause if the document is not visible or when the device is offline\n      .then(() => {\n        if (shouldPause()) {\n          return pause();\n        }\n\n        return;\n      }).then(() => {\n        if (isRetryCancelled) {\n          reject(error);\n        } else {\n          run();\n        }\n      });\n    });\n  }; // Start loop\n\n\n  if (canFetch(config.networkMode)) {\n    run();\n  } else {\n    pause().then(run);\n  }\n\n  return {\n    promise,\n    cancel,\n    continue: () => {\n      const didContinue = continueFn == null ? void 0 : continueFn();\n      return didContinue ? promise : Promise.resolve();\n    },\n    cancelRetry,\n    continueRetry\n  };\n}\n\nexport { CancelledError, canFetch, createRetryer, isCancelledError };\n//# sourceMappingURL=retryer.mjs.map\n","const defaultLogger = console;\n\nexport { defaultLogger };\n//# sourceMappingURL=logger.mjs.map\n","import { scheduleMicrotask } from './utils.mjs';\n\nfunction createNotifyManager() {\n  let queue = [];\n  let transactions = 0;\n\n  let notifyFn = callback => {\n    callback();\n  };\n\n  let batchNotifyFn = callback => {\n    callback();\n  };\n\n  const batch = callback => {\n    let result;\n    transactions++;\n\n    try {\n      result = callback();\n    } finally {\n      transactions--;\n\n      if (!transactions) {\n        flush();\n      }\n    }\n\n    return result;\n  };\n\n  const schedule = callback => {\n    if (transactions) {\n      queue.push(callback);\n    } else {\n      scheduleMicrotask(() => {\n        notifyFn(callback);\n      });\n    }\n  };\n  /**\n   * All calls to the wrapped function will be batched.\n   */\n\n\n  const batchCalls = callback => {\n    return (...args) => {\n      schedule(() => {\n        callback(...args);\n      });\n    };\n  };\n\n  const flush = () => {\n    const originalQueue = queue;\n    queue = [];\n\n    if (originalQueue.length) {\n      scheduleMicrotask(() => {\n        batchNotifyFn(() => {\n          originalQueue.forEach(callback => {\n            notifyFn(callback);\n          });\n        });\n      });\n    }\n  };\n  /**\n   * Use this method to set a custom notify function.\n   * This can be used to for example wrap notifications with `React.act` while running tests.\n   */\n\n\n  const setNotifyFunction = fn => {\n    notifyFn = fn;\n  };\n  /**\n   * Use this method to set a custom function to batch notifications together into a single tick.\n   * By default React Query will use the batch function provided by ReactDOM or React Native.\n   */\n\n\n  const setBatchNotifyFunction = fn => {\n    batchNotifyFn = fn;\n  };\n\n  return {\n    batch,\n    batchCalls,\n    schedule,\n    setNotifyFunction,\n    setBatchNotifyFunction\n  };\n} // SINGLETON\n\nconst notifyManager = createNotifyManager();\n\nexport { createNotifyManager, notifyManager };\n//# sourceMappingURL=notifyManager.mjs.map\n","import { isValidTimeout, isServer } from './utils.mjs';\n\nclass Removable {\n  destroy() {\n    this.clearGcTimeout();\n  }\n\n  scheduleGc() {\n    this.clearGcTimeout();\n\n    if (isValidTimeout(this.cacheTime)) {\n      this.gcTimeout = setTimeout(() => {\n        this.optionalRemove();\n      }, this.cacheTime);\n    }\n  }\n\n  updateCacheTime(newCacheTime) {\n    // Default to 5 minutes (Infinity for server-side) if no cache time is set\n    this.cacheTime = Math.max(this.cacheTime || 0, newCacheTime != null ? newCacheTime : isServer ? Infinity : 5 * 60 * 1000);\n  }\n\n  clearGcTimeout() {\n    if (this.gcTimeout) {\n      clearTimeout(this.gcTimeout);\n      this.gcTimeout = undefined;\n    }\n  }\n\n}\n\nexport { Removable };\n//# sourceMappingURL=removable.mjs.map\n","import { replaceData, noop, timeUntilStale, getAbortController } from './utils.mjs';\nimport { defaultLogger } from './logger.mjs';\nimport { notifyManager } from './notifyManager.mjs';\nimport { createRetryer, isCancelledError, canFetch } from './retryer.mjs';\nimport { Removable } from './removable.mjs';\n\n// CLASS\nclass Query extends Removable {\n  constructor(config) {\n    super();\n    this.abortSignalConsumed = false;\n    this.defaultOptions = config.defaultOptions;\n    this.setOptions(config.options);\n    this.observers = [];\n    this.cache = config.cache;\n    this.logger = config.logger || defaultLogger;\n    this.queryKey = config.queryKey;\n    this.queryHash = config.queryHash;\n    this.initialState = config.state || getDefaultState(this.options);\n    this.state = this.initialState;\n    this.scheduleGc();\n  }\n\n  get meta() {\n    return this.options.meta;\n  }\n\n  setOptions(options) {\n    this.options = { ...this.defaultOptions,\n      ...options\n    };\n    this.updateCacheTime(this.options.cacheTime);\n  }\n\n  optionalRemove() {\n    if (!this.observers.length && this.state.fetchStatus === 'idle') {\n      this.cache.remove(this);\n    }\n  }\n\n  setData(newData, options) {\n    const data = replaceData(this.state.data, newData, this.options); // Set data and mark it as cached\n\n    this.dispatch({\n      data,\n      type: 'success',\n      dataUpdatedAt: options == null ? void 0 : options.updatedAt,\n      manual: options == null ? void 0 : options.manual\n    });\n    return data;\n  }\n\n  setState(state, setStateOptions) {\n    this.dispatch({\n      type: 'setState',\n      state,\n      setStateOptions\n    });\n  }\n\n  cancel(options) {\n    var _this$retryer;\n\n    const promise = this.promise;\n    (_this$retryer = this.retryer) == null ? void 0 : _this$retryer.cancel(options);\n    return promise ? promise.then(noop).catch(noop) : Promise.resolve();\n  }\n\n  destroy() {\n    super.destroy();\n    this.cancel({\n      silent: true\n    });\n  }\n\n  reset() {\n    this.destroy();\n    this.setState(this.initialState);\n  }\n\n  isActive() {\n    return this.observers.some(observer => observer.options.enabled !== false);\n  }\n\n  isDisabled() {\n    return this.getObserversCount() > 0 && !this.isActive();\n  }\n\n  isStale() {\n    return this.state.isInvalidated || !this.state.dataUpdatedAt || this.observers.some(observer => observer.getCurrentResult().isStale);\n  }\n\n  isStaleByTime(staleTime = 0) {\n    return this.state.isInvalidated || !this.state.dataUpdatedAt || !timeUntilStale(this.state.dataUpdatedAt, staleTime);\n  }\n\n  onFocus() {\n    var _this$retryer2;\n\n    const observer = this.observers.find(x => x.shouldFetchOnWindowFocus());\n\n    if (observer) {\n      observer.refetch({\n        cancelRefetch: false\n      });\n    } // Continue fetch if currently paused\n\n\n    (_this$retryer2 = this.retryer) == null ? void 0 : _this$retryer2.continue();\n  }\n\n  onOnline() {\n    var _this$retryer3;\n\n    const observer = this.observers.find(x => x.shouldFetchOnReconnect());\n\n    if (observer) {\n      observer.refetch({\n        cancelRefetch: false\n      });\n    } // Continue fetch if currently paused\n\n\n    (_this$retryer3 = this.retryer) == null ? void 0 : _this$retryer3.continue();\n  }\n\n  addObserver(observer) {\n    if (!this.observers.includes(observer)) {\n      this.observers.push(observer); // Stop the query from being garbage collected\n\n      this.clearGcTimeout();\n      this.cache.notify({\n        type: 'observerAdded',\n        query: this,\n        observer\n      });\n    }\n  }\n\n  removeObserver(observer) {\n    if (this.observers.includes(observer)) {\n      this.observers = this.observers.filter(x => x !== observer);\n\n      if (!this.observers.length) {\n        // If the transport layer does not support cancellation\n        // we'll let the query continue so the result can be cached\n        if (this.retryer) {\n          if (this.abortSignalConsumed) {\n            this.retryer.cancel({\n              revert: true\n            });\n          } else {\n            this.retryer.cancelRetry();\n          }\n        }\n\n        this.scheduleGc();\n      }\n\n      this.cache.notify({\n        type: 'observerRemoved',\n        query: this,\n        observer\n      });\n    }\n  }\n\n  getObserversCount() {\n    return this.observers.length;\n  }\n\n  invalidate() {\n    if (!this.state.isInvalidated) {\n      this.dispatch({\n        type: 'invalidate'\n      });\n    }\n  }\n\n  fetch(options, fetchOptions) {\n    var _this$options$behavio, _context$fetchOptions;\n\n    if (this.state.fetchStatus !== 'idle') {\n      if (this.state.dataUpdatedAt && fetchOptions != null && fetchOptions.cancelRefetch) {\n        // Silently cancel current fetch if the user wants to cancel refetches\n        this.cancel({\n          silent: true\n        });\n      } else if (this.promise) {\n        var _this$retryer4;\n\n        // make sure that retries that were potentially cancelled due to unmounts can continue\n        (_this$retryer4 = this.retryer) == null ? void 0 : _this$retryer4.continueRetry(); // Return current promise if we are already fetching\n\n        return this.promise;\n      }\n    } // Update config if passed, otherwise the config from the last execution is used\n\n\n    if (options) {\n      this.setOptions(options);\n    } // Use the options from the first observer with a query function if no function is found.\n    // This can happen when the query is hydrated or created with setQueryData.\n\n\n    if (!this.options.queryFn) {\n      const observer = this.observers.find(x => x.options.queryFn);\n\n      if (observer) {\n        this.setOptions(observer.options);\n      }\n    }\n\n    if (process.env.NODE_ENV !== 'production') {\n      if (!Array.isArray(this.options.queryKey)) {\n        this.logger.error(\"As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']\");\n      }\n    }\n\n    const abortController = getAbortController(); // Create query function context\n\n    const queryFnContext = {\n      queryKey: this.queryKey,\n      pageParam: undefined,\n      meta: this.meta\n    }; // Adds an enumerable signal property to the object that\n    // which sets abortSignalConsumed to true when the signal\n    // is read.\n\n    const addSignalProperty = object => {\n      Object.defineProperty(object, 'signal', {\n        enumerable: true,\n        get: () => {\n          if (abortController) {\n            this.abortSignalConsumed = true;\n            return abortController.signal;\n          }\n\n          return undefined;\n        }\n      });\n    };\n\n    addSignalProperty(queryFnContext); // Create fetch function\n\n    const fetchFn = () => {\n      if (!this.options.queryFn) {\n        return Promise.reject(\"Missing queryFn for queryKey '\" + this.options.queryHash + \"'\");\n      }\n\n      this.abortSignalConsumed = false;\n      return this.options.queryFn(queryFnContext);\n    }; // Trigger behavior hook\n\n\n    const context = {\n      fetchOptions,\n      options: this.options,\n      queryKey: this.queryKey,\n      state: this.state,\n      fetchFn\n    };\n    addSignalProperty(context);\n    (_this$options$behavio = this.options.behavior) == null ? void 0 : _this$options$behavio.onFetch(context); // Store state in case the current fetch needs to be reverted\n\n    this.revertState = this.state; // Set to fetching state if not already in it\n\n    if (this.state.fetchStatus === 'idle' || this.state.fetchMeta !== ((_context$fetchOptions = context.fetchOptions) == null ? void 0 : _context$fetchOptions.meta)) {\n      var _context$fetchOptions2;\n\n      this.dispatch({\n        type: 'fetch',\n        meta: (_context$fetchOptions2 = context.fetchOptions) == null ? void 0 : _context$fetchOptions2.meta\n      });\n    }\n\n    const onError = error => {\n      // Optimistically update state if needed\n      if (!(isCancelledError(error) && error.silent)) {\n        this.dispatch({\n          type: 'error',\n          error: error\n        });\n      }\n\n      if (!isCancelledError(error)) {\n        var _this$cache$config$on, _this$cache$config, _this$cache$config$on2, _this$cache$config2;\n\n        // Notify cache callback\n        (_this$cache$config$on = (_this$cache$config = this.cache.config).onError) == null ? void 0 : _this$cache$config$on.call(_this$cache$config, error, this);\n        (_this$cache$config$on2 = (_this$cache$config2 = this.cache.config).onSettled) == null ? void 0 : _this$cache$config$on2.call(_this$cache$config2, this.state.data, error, this);\n\n        if (process.env.NODE_ENV !== 'production') {\n          this.logger.error(error);\n        }\n      }\n\n      if (!this.isFetchingOptimistic) {\n        // Schedule query gc after fetching\n        this.scheduleGc();\n      }\n\n      this.isFetchingOptimistic = false;\n    }; // Try to fetch the data\n\n\n    this.retryer = createRetryer({\n      fn: context.fetchFn,\n      abort: abortController == null ? void 0 : abortController.abort.bind(abortController),\n      onSuccess: data => {\n        var _this$cache$config$on3, _this$cache$config3, _this$cache$config$on4, _this$cache$config4;\n\n        if (typeof data === 'undefined') {\n          if (process.env.NODE_ENV !== 'production') {\n            this.logger.error(\"Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: \" + this.queryHash);\n          }\n\n          onError(new Error(this.queryHash + \" data is undefined\"));\n          return;\n        }\n\n        this.setData(data); // Notify cache callback\n\n        (_this$cache$config$on3 = (_this$cache$config3 = this.cache.config).onSuccess) == null ? void 0 : _this$cache$config$on3.call(_this$cache$config3, data, this);\n        (_this$cache$config$on4 = (_this$cache$config4 = this.cache.config).onSettled) == null ? void 0 : _this$cache$config$on4.call(_this$cache$config4, data, this.state.error, this);\n\n        if (!this.isFetchingOptimistic) {\n          // Schedule query gc after fetching\n          this.scheduleGc();\n        }\n\n        this.isFetchingOptimistic = false;\n      },\n      onError,\n      onFail: (failureCount, error) => {\n        this.dispatch({\n          type: 'failed',\n          failureCount,\n          error\n        });\n      },\n      onPause: () => {\n        this.dispatch({\n          type: 'pause'\n        });\n      },\n      onContinue: () => {\n        this.dispatch({\n          type: 'continue'\n        });\n      },\n      retry: context.options.retry,\n      retryDelay: context.options.retryDelay,\n      networkMode: context.options.networkMode\n    });\n    this.promise = this.retryer.promise;\n    return this.promise;\n  }\n\n  dispatch(action) {\n    const reducer = state => {\n      var _action$meta, _action$dataUpdatedAt;\n\n      switch (action.type) {\n        case 'failed':\n          return { ...state,\n            fetchFailureCount: action.failureCount,\n            fetchFailureReason: action.error\n          };\n\n        case 'pause':\n          return { ...state,\n            fetchStatus: 'paused'\n          };\n\n        case 'continue':\n          return { ...state,\n            fetchStatus: 'fetching'\n          };\n\n        case 'fetch':\n          return { ...state,\n            fetchFailureCount: 0,\n            fetchFailureReason: null,\n            fetchMeta: (_action$meta = action.meta) != null ? _action$meta : null,\n            fetchStatus: canFetch(this.options.networkMode) ? 'fetching' : 'paused',\n            ...(!state.dataUpdatedAt && {\n              error: null,\n              status: 'loading'\n            })\n          };\n\n        case 'success':\n          return { ...state,\n            data: action.data,\n            dataUpdateCount: state.dataUpdateCount + 1,\n            dataUpdatedAt: (_action$dataUpdatedAt = action.dataUpdatedAt) != null ? _action$dataUpdatedAt : Date.now(),\n            error: null,\n            isInvalidated: false,\n            status: 'success',\n            ...(!action.manual && {\n              fetchStatus: 'idle',\n              fetchFailureCount: 0,\n              fetchFailureReason: null\n            })\n          };\n\n        case 'error':\n          const error = action.error;\n\n          if (isCancelledError(error) && error.revert && this.revertState) {\n            return { ...this.revertState,\n              fetchStatus: 'idle'\n            };\n          }\n\n          return { ...state,\n            error: error,\n            errorUpdateCount: state.errorUpdateCount + 1,\n            errorUpdatedAt: Date.now(),\n            fetchFailureCount: state.fetchFailureCount + 1,\n            fetchFailureReason: error,\n            fetchStatus: 'idle',\n            status: 'error'\n          };\n\n        case 'invalidate':\n          return { ...state,\n            isInvalidated: true\n          };\n\n        case 'setState':\n          return { ...state,\n            ...action.state\n          };\n      }\n    };\n\n    this.state = reducer(this.state);\n    notifyManager.batch(() => {\n      this.observers.forEach(observer => {\n        observer.onQueryUpdate(action);\n      });\n      this.cache.notify({\n        query: this,\n        type: 'updated',\n        action\n      });\n    });\n  }\n\n}\n\nfunction getDefaultState(options) {\n  const data = typeof options.initialData === 'function' ? options.initialData() : options.initialData;\n  const hasData = typeof data !== 'undefined';\n  const initialDataUpdatedAt = hasData ? typeof options.initialDataUpdatedAt === 'function' ? options.initialDataUpdatedAt() : options.initialDataUpdatedAt : 0;\n  return {\n    data,\n    dataUpdateCount: 0,\n    dataUpdatedAt: hasData ? initialDataUpdatedAt != null ? initialDataUpdatedAt : Date.now() : 0,\n    error: null,\n    errorUpdateCount: 0,\n    errorUpdatedAt: 0,\n    fetchFailureCount: 0,\n    fetchFailureReason: null,\n    fetchMeta: null,\n    isInvalidated: false,\n    status: hasData ? 'success' : 'loading',\n    fetchStatus: 'idle'\n  };\n}\n\nexport { Query };\n//# sourceMappingURL=query.mjs.map\n","import { hashQueryKeyByOptions, parseFilterArgs, matchQuery } from './utils.mjs';\nimport { Query } from './query.mjs';\nimport { notifyManager } from './notifyManager.mjs';\nimport { Subscribable } from './subscribable.mjs';\n\n// CLASS\nclass QueryCache extends Subscribable {\n  constructor(config) {\n    super();\n    this.config = config || {};\n    this.queries = [];\n    this.queriesMap = {};\n  }\n\n  build(client, options, state) {\n    var _options$queryHash;\n\n    const queryKey = options.queryKey;\n    const queryHash = (_options$queryHash = options.queryHash) != null ? _options$queryHash : hashQueryKeyByOptions(queryKey, options);\n    let query = this.get(queryHash);\n\n    if (!query) {\n      query = new Query({\n        cache: this,\n        logger: client.getLogger(),\n        queryKey,\n        queryHash,\n        options: client.defaultQueryOptions(options),\n        state,\n        defaultOptions: client.getQueryDefaults(queryKey)\n      });\n      this.add(query);\n    }\n\n    return query;\n  }\n\n  add(query) {\n    if (!this.queriesMap[query.queryHash]) {\n      this.queriesMap[query.queryHash] = query;\n      this.queries.push(query);\n      this.notify({\n        type: 'added',\n        query\n      });\n    }\n  }\n\n  remove(query) {\n    const queryInMap = this.queriesMap[query.queryHash];\n\n    if (queryInMap) {\n      query.destroy();\n      this.queries = this.queries.filter(x => x !== query);\n\n      if (queryInMap === query) {\n        delete this.queriesMap[query.queryHash];\n      }\n\n      this.notify({\n        type: 'removed',\n        query\n      });\n    }\n  }\n\n  clear() {\n    notifyManager.batch(() => {\n      this.queries.forEach(query => {\n        this.remove(query);\n      });\n    });\n  }\n\n  get(queryHash) {\n    return this.queriesMap[queryHash];\n  }\n\n  getAll() {\n    return this.queries;\n  }\n\n  find(arg1, arg2) {\n    const [filters] = parseFilterArgs(arg1, arg2);\n\n    if (typeof filters.exact === 'undefined') {\n      filters.exact = true;\n    }\n\n    return this.queries.find(query => matchQuery(filters, query));\n  }\n\n  findAll(arg1, arg2) {\n    const [filters] = parseFilterArgs(arg1, arg2);\n    return Object.keys(filters).length > 0 ? this.queries.filter(query => matchQuery(filters, query)) : this.queries;\n  }\n\n  notify(event) {\n    notifyManager.batch(() => {\n      this.listeners.forEach(({\n        listener\n      }) => {\n        listener(event);\n      });\n    });\n  }\n\n  onFocus() {\n    notifyManager.batch(() => {\n      this.queries.forEach(query => {\n        query.onFocus();\n      });\n    });\n  }\n\n  onOnline() {\n    notifyManager.batch(() => {\n      this.queries.forEach(query => {\n        query.onOnline();\n      });\n    });\n  }\n\n}\n\nexport { QueryCache };\n//# sourceMappingURL=queryCache.mjs.map\n","import { defaultLogger } from './logger.mjs';\nimport { notifyManager } from './notifyManager.mjs';\nimport { Removable } from './removable.mjs';\nimport { createRetryer, canFetch } from './retryer.mjs';\n\n// CLASS\nclass Mutation extends Removable {\n  constructor(config) {\n    super();\n    this.defaultOptions = config.defaultOptions;\n    this.mutationId = config.mutationId;\n    this.mutationCache = config.mutationCache;\n    this.logger = config.logger || defaultLogger;\n    this.observers = [];\n    this.state = config.state || getDefaultState();\n    this.setOptions(config.options);\n    this.scheduleGc();\n  }\n\n  setOptions(options) {\n    this.options = { ...this.defaultOptions,\n      ...options\n    };\n    this.updateCacheTime(this.options.cacheTime);\n  }\n\n  get meta() {\n    return this.options.meta;\n  }\n\n  setState(state) {\n    this.dispatch({\n      type: 'setState',\n      state\n    });\n  }\n\n  addObserver(observer) {\n    if (!this.observers.includes(observer)) {\n      this.observers.push(observer); // Stop the mutation from being garbage collected\n\n      this.clearGcTimeout();\n      this.mutationCache.notify({\n        type: 'observerAdded',\n        mutation: this,\n        observer\n      });\n    }\n  }\n\n  removeObserver(observer) {\n    this.observers = this.observers.filter(x => x !== observer);\n    this.scheduleGc();\n    this.mutationCache.notify({\n      type: 'observerRemoved',\n      mutation: this,\n      observer\n    });\n  }\n\n  optionalRemove() {\n    if (!this.observers.length) {\n      if (this.state.status === 'loading') {\n        this.scheduleGc();\n      } else {\n        this.mutationCache.remove(this);\n      }\n    }\n  }\n\n  continue() {\n    var _this$retryer$continu, _this$retryer;\n\n    return (_this$retryer$continu = (_this$retryer = this.retryer) == null ? void 0 : _this$retryer.continue()) != null ? _this$retryer$continu : this.execute();\n  }\n\n  async execute() {\n    const executeMutation = () => {\n      var _this$options$retry;\n\n      this.retryer = createRetryer({\n        fn: () => {\n          if (!this.options.mutationFn) {\n            return Promise.reject('No mutationFn found');\n          }\n\n          return this.options.mutationFn(this.state.variables);\n        },\n        onFail: (failureCount, error) => {\n          this.dispatch({\n            type: 'failed',\n            failureCount,\n            error\n          });\n        },\n        onPause: () => {\n          this.dispatch({\n            type: 'pause'\n          });\n        },\n        onContinue: () => {\n          this.dispatch({\n            type: 'continue'\n          });\n        },\n        retry: (_this$options$retry = this.options.retry) != null ? _this$options$retry : 0,\n        retryDelay: this.options.retryDelay,\n        networkMode: this.options.networkMode\n      });\n      return this.retryer.promise;\n    };\n\n    const restored = this.state.status === 'loading';\n\n    try {\n      var _this$mutationCache$c3, _this$mutationCache$c4, _this$options$onSucce, _this$options2, _this$mutationCache$c5, _this$mutationCache$c6, _this$options$onSettl, _this$options3;\n\n      if (!restored) {\n        var _this$mutationCache$c, _this$mutationCache$c2, _this$options$onMutat, _this$options;\n\n        this.dispatch({\n          type: 'loading',\n          variables: this.options.variables\n        }); // Notify cache callback\n\n        await ((_this$mutationCache$c = (_this$mutationCache$c2 = this.mutationCache.config).onMutate) == null ? void 0 : _this$mutationCache$c.call(_this$mutationCache$c2, this.state.variables, this));\n        const context = await ((_this$options$onMutat = (_this$options = this.options).onMutate) == null ? void 0 : _this$options$onMutat.call(_this$options, this.state.variables));\n\n        if (context !== this.state.context) {\n          this.dispatch({\n            type: 'loading',\n            context,\n            variables: this.state.variables\n          });\n        }\n      }\n\n      const data = await executeMutation(); // Notify cache callback\n\n      await ((_this$mutationCache$c3 = (_this$mutationCache$c4 = this.mutationCache.config).onSuccess) == null ? void 0 : _this$mutationCache$c3.call(_this$mutationCache$c4, data, this.state.variables, this.state.context, this));\n      await ((_this$options$onSucce = (_this$options2 = this.options).onSuccess) == null ? void 0 : _this$options$onSucce.call(_this$options2, data, this.state.variables, this.state.context)); // Notify cache callback\n\n      await ((_this$mutationCache$c5 = (_this$mutationCache$c6 = this.mutationCache.config).onSettled) == null ? void 0 : _this$mutationCache$c5.call(_this$mutationCache$c6, data, null, this.state.variables, this.state.context, this));\n      await ((_this$options$onSettl = (_this$options3 = this.options).onSettled) == null ? void 0 : _this$options$onSettl.call(_this$options3, data, null, this.state.variables, this.state.context));\n      this.dispatch({\n        type: 'success',\n        data\n      });\n      return data;\n    } catch (error) {\n      try {\n        var _this$mutationCache$c7, _this$mutationCache$c8, _this$options$onError, _this$options4, _this$mutationCache$c9, _this$mutationCache$c10, _this$options$onSettl2, _this$options5;\n\n        // Notify cache callback\n        await ((_this$mutationCache$c7 = (_this$mutationCache$c8 = this.mutationCache.config).onError) == null ? void 0 : _this$mutationCache$c7.call(_this$mutationCache$c8, error, this.state.variables, this.state.context, this));\n\n        if (process.env.NODE_ENV !== 'production') {\n          this.logger.error(error);\n        }\n\n        await ((_this$options$onError = (_this$options4 = this.options).onError) == null ? void 0 : _this$options$onError.call(_this$options4, error, this.state.variables, this.state.context)); // Notify cache callback\n\n        await ((_this$mutationCache$c9 = (_this$mutationCache$c10 = this.mutationCache.config).onSettled) == null ? void 0 : _this$mutationCache$c9.call(_this$mutationCache$c10, undefined, error, this.state.variables, this.state.context, this));\n        await ((_this$options$onSettl2 = (_this$options5 = this.options).onSettled) == null ? void 0 : _this$options$onSettl2.call(_this$options5, undefined, error, this.state.variables, this.state.context));\n        throw error;\n      } finally {\n        this.dispatch({\n          type: 'error',\n          error: error\n        });\n      }\n    }\n  }\n\n  dispatch(action) {\n    const reducer = state => {\n      switch (action.type) {\n        case 'failed':\n          return { ...state,\n            failureCount: action.failureCount,\n            failureReason: action.error\n          };\n\n        case 'pause':\n          return { ...state,\n            isPaused: true\n          };\n\n        case 'continue':\n          return { ...state,\n            isPaused: false\n          };\n\n        case 'loading':\n          return { ...state,\n            context: action.context,\n            data: undefined,\n            failureCount: 0,\n            failureReason: null,\n            error: null,\n            isPaused: !canFetch(this.options.networkMode),\n            status: 'loading',\n            variables: action.variables\n          };\n\n        case 'success':\n          return { ...state,\n            data: action.data,\n            failureCount: 0,\n            failureReason: null,\n            error: null,\n            status: 'success',\n            isPaused: false\n          };\n\n        case 'error':\n          return { ...state,\n            data: undefined,\n            error: action.error,\n            failureCount: state.failureCount + 1,\n            failureReason: action.error,\n            isPaused: false,\n            status: 'error'\n          };\n\n        case 'setState':\n          return { ...state,\n            ...action.state\n          };\n      }\n    };\n\n    this.state = reducer(this.state);\n    notifyManager.batch(() => {\n      this.observers.forEach(observer => {\n        observer.onMutationUpdate(action);\n      });\n      this.mutationCache.notify({\n        mutation: this,\n        type: 'updated',\n        action\n      });\n    });\n  }\n\n}\nfunction getDefaultState() {\n  return {\n    context: undefined,\n    data: undefined,\n    error: null,\n    failureCount: 0,\n    failureReason: null,\n    isPaused: false,\n    status: 'idle',\n    variables: undefined\n  };\n}\n\nexport { Mutation, getDefaultState };\n//# sourceMappingURL=mutation.mjs.map\n","import { notifyManager } from './notifyManager.mjs';\nimport { Mutation } from './mutation.mjs';\nimport { matchMutation, noop } from './utils.mjs';\nimport { Subscribable } from './subscribable.mjs';\n\n// CLASS\nclass MutationCache extends Subscribable {\n  constructor(config) {\n    super();\n    this.config = config || {};\n    this.mutations = [];\n    this.mutationId = 0;\n  }\n\n  build(client, options, state) {\n    const mutation = new Mutation({\n      mutationCache: this,\n      logger: client.getLogger(),\n      mutationId: ++this.mutationId,\n      options: client.defaultMutationOptions(options),\n      state,\n      defaultOptions: options.mutationKey ? client.getMutationDefaults(options.mutationKey) : undefined\n    });\n    this.add(mutation);\n    return mutation;\n  }\n\n  add(mutation) {\n    this.mutations.push(mutation);\n    this.notify({\n      type: 'added',\n      mutation\n    });\n  }\n\n  remove(mutation) {\n    this.mutations = this.mutations.filter(x => x !== mutation);\n    this.notify({\n      type: 'removed',\n      mutation\n    });\n  }\n\n  clear() {\n    notifyManager.batch(() => {\n      this.mutations.forEach(mutation => {\n        this.remove(mutation);\n      });\n    });\n  }\n\n  getAll() {\n    return this.mutations;\n  }\n\n  find(filters) {\n    if (typeof filters.exact === 'undefined') {\n      filters.exact = true;\n    }\n\n    return this.mutations.find(mutation => matchMutation(filters, mutation));\n  }\n\n  findAll(filters) {\n    return this.mutations.filter(mutation => matchMutation(filters, mutation));\n  }\n\n  notify(event) {\n    notifyManager.batch(() => {\n      this.listeners.forEach(({\n        listener\n      }) => {\n        listener(event);\n      });\n    });\n  }\n\n  resumePausedMutations() {\n    var _this$resuming;\n\n    this.resuming = ((_this$resuming = this.resuming) != null ? _this$resuming : Promise.resolve()).then(() => {\n      const pausedMutations = this.mutations.filter(x => x.state.isPaused);\n      return notifyManager.batch(() => pausedMutations.reduce((promise, mutation) => promise.then(() => mutation.continue().catch(noop)), Promise.resolve()));\n    }).then(() => {\n      this.resuming = undefined;\n    });\n    return this.resuming;\n  }\n\n}\n\nexport { MutationCache };\n//# sourceMappingURL=mutationCache.mjs.map\n","function infiniteQueryBehavior() {\n  return {\n    onFetch: context => {\n      context.fetchFn = () => {\n        var _context$fetchOptions, _context$fetchOptions2, _context$fetchOptions3, _context$fetchOptions4, _context$state$data, _context$state$data2;\n\n        const refetchPage = (_context$fetchOptions = context.fetchOptions) == null ? void 0 : (_context$fetchOptions2 = _context$fetchOptions.meta) == null ? void 0 : _context$fetchOptions2.refetchPage;\n        const fetchMore = (_context$fetchOptions3 = context.fetchOptions) == null ? void 0 : (_context$fetchOptions4 = _context$fetchOptions3.meta) == null ? void 0 : _context$fetchOptions4.fetchMore;\n        const pageParam = fetchMore == null ? void 0 : fetchMore.pageParam;\n        const isFetchingNextPage = (fetchMore == null ? void 0 : fetchMore.direction) === 'forward';\n        const isFetchingPreviousPage = (fetchMore == null ? void 0 : fetchMore.direction) === 'backward';\n        const oldPages = ((_context$state$data = context.state.data) == null ? void 0 : _context$state$data.pages) || [];\n        const oldPageParams = ((_context$state$data2 = context.state.data) == null ? void 0 : _context$state$data2.pageParams) || [];\n        let newPageParams = oldPageParams;\n        let cancelled = false;\n\n        const addSignalProperty = object => {\n          Object.defineProperty(object, 'signal', {\n            enumerable: true,\n            get: () => {\n              var _context$signal;\n\n              if ((_context$signal = context.signal) != null && _context$signal.aborted) {\n                cancelled = true;\n              } else {\n                var _context$signal2;\n\n                (_context$signal2 = context.signal) == null ? void 0 : _context$signal2.addEventListener('abort', () => {\n                  cancelled = true;\n                });\n              }\n\n              return context.signal;\n            }\n          });\n        }; // Get query function\n\n\n        const queryFn = context.options.queryFn || (() => Promise.reject(\"Missing queryFn for queryKey '\" + context.options.queryHash + \"'\"));\n\n        const buildNewPages = (pages, param, page, previous) => {\n          newPageParams = previous ? [param, ...newPageParams] : [...newPageParams, param];\n          return previous ? [page, ...pages] : [...pages, page];\n        }; // Create function to fetch a page\n\n\n        const fetchPage = (pages, manual, param, previous) => {\n          if (cancelled) {\n            return Promise.reject('Cancelled');\n          }\n\n          if (typeof param === 'undefined' && !manual && pages.length) {\n            return Promise.resolve(pages);\n          }\n\n          const queryFnContext = {\n            queryKey: context.queryKey,\n            pageParam: param,\n            meta: context.options.meta\n          };\n          addSignalProperty(queryFnContext);\n          const queryFnResult = queryFn(queryFnContext);\n          const promise = Promise.resolve(queryFnResult).then(page => buildNewPages(pages, param, page, previous));\n          return promise;\n        };\n\n        let promise; // Fetch first page?\n\n        if (!oldPages.length) {\n          promise = fetchPage([]);\n        } // Fetch next page?\n        else if (isFetchingNextPage) {\n          const manual = typeof pageParam !== 'undefined';\n          const param = manual ? pageParam : getNextPageParam(context.options, oldPages);\n          promise = fetchPage(oldPages, manual, param);\n        } // Fetch previous page?\n        else if (isFetchingPreviousPage) {\n          const manual = typeof pageParam !== 'undefined';\n          const param = manual ? pageParam : getPreviousPageParam(context.options, oldPages);\n          promise = fetchPage(oldPages, manual, param, true);\n        } // Refetch pages\n        else {\n          newPageParams = [];\n          const manual = typeof context.options.getNextPageParam === 'undefined';\n          const shouldFetchFirstPage = refetchPage && oldPages[0] ? refetchPage(oldPages[0], 0, oldPages) : true; // Fetch first page\n\n          promise = shouldFetchFirstPage ? fetchPage([], manual, oldPageParams[0]) : Promise.resolve(buildNewPages([], oldPageParams[0], oldPages[0])); // Fetch remaining pages\n\n          for (let i = 1; i < oldPages.length; i++) {\n            promise = promise.then(pages => {\n              const shouldFetchNextPage = refetchPage && oldPages[i] ? refetchPage(oldPages[i], i, oldPages) : true;\n\n              if (shouldFetchNextPage) {\n                const param = manual ? oldPageParams[i] : getNextPageParam(context.options, pages);\n                return fetchPage(pages, manual, param);\n              }\n\n              return Promise.resolve(buildNewPages(pages, oldPageParams[i], oldPages[i]));\n            });\n          }\n        }\n\n        const finalPromise = promise.then(pages => ({\n          pages,\n          pageParams: newPageParams\n        }));\n        return finalPromise;\n      };\n    }\n  };\n}\nfunction getNextPageParam(options, pages) {\n  return options.getNextPageParam == null ? void 0 : options.getNextPageParam(pages[pages.length - 1], pages);\n}\nfunction getPreviousPageParam(options, pages) {\n  return options.getPreviousPageParam == null ? void 0 : options.getPreviousPageParam(pages[0], pages);\n}\n/**\n * Checks if there is a next page.\n * Returns `undefined` if it cannot be determined.\n */\n\nfunction hasNextPage(options, pages) {\n  if (options.getNextPageParam && Array.isArray(pages)) {\n    const nextPageParam = getNextPageParam(options, pages);\n    return typeof nextPageParam !== 'undefined' && nextPageParam !== null && nextPageParam !== false;\n  }\n\n  return;\n}\n/**\n * Checks if there is a previous page.\n * Returns `undefined` if it cannot be determined.\n */\n\nfunction hasPreviousPage(options, pages) {\n  if (options.getPreviousPageParam && Array.isArray(pages)) {\n    const previousPageParam = getPreviousPageParam(options, pages);\n    return typeof previousPageParam !== 'undefined' && previousPageParam !== null && previousPageParam !== false;\n  }\n\n  return;\n}\n\nexport { getNextPageParam, getPreviousPageParam, hasNextPage, hasPreviousPage, infiniteQueryBehavior };\n//# sourceMappingURL=infiniteQueryBehavior.mjs.map\n","import { parseFilterArgs, parseQueryArgs, functionalUpdate, noop, hashQueryKey, partialMatchKey, hashQueryKeyByOptions } from './utils.mjs';\nimport { QueryCache } from './queryCache.mjs';\nimport { MutationCache } from './mutationCache.mjs';\nimport { focusManager } from './focusManager.mjs';\nimport { onlineManager } from './onlineManager.mjs';\nimport { notifyManager } from './notifyManager.mjs';\nimport { infiniteQueryBehavior } from './infiniteQueryBehavior.mjs';\nimport { defaultLogger } from './logger.mjs';\n\n// CLASS\nclass QueryClient {\n  constructor(config = {}) {\n    this.queryCache = config.queryCache || new QueryCache();\n    this.mutationCache = config.mutationCache || new MutationCache();\n    this.logger = config.logger || defaultLogger;\n    this.defaultOptions = config.defaultOptions || {};\n    this.queryDefaults = [];\n    this.mutationDefaults = [];\n    this.mountCount = 0;\n\n    if (process.env.NODE_ENV !== 'production' && config.logger) {\n      this.logger.error(\"Passing a custom logger has been deprecated and will be removed in the next major version.\");\n    }\n  }\n\n  mount() {\n    this.mountCount++;\n    if (this.mountCount !== 1) return;\n    this.unsubscribeFocus = focusManager.subscribe(() => {\n      if (focusManager.isFocused()) {\n        this.resumePausedMutations();\n        this.queryCache.onFocus();\n      }\n    });\n    this.unsubscribeOnline = onlineManager.subscribe(() => {\n      if (onlineManager.isOnline()) {\n        this.resumePausedMutations();\n        this.queryCache.onOnline();\n      }\n    });\n  }\n\n  unmount() {\n    var _this$unsubscribeFocu, _this$unsubscribeOnli;\n\n    this.mountCount--;\n    if (this.mountCount !== 0) return;\n    (_this$unsubscribeFocu = this.unsubscribeFocus) == null ? void 0 : _this$unsubscribeFocu.call(this);\n    this.unsubscribeFocus = undefined;\n    (_this$unsubscribeOnli = this.unsubscribeOnline) == null ? void 0 : _this$unsubscribeOnli.call(this);\n    this.unsubscribeOnline = undefined;\n  }\n\n  isFetching(arg1, arg2) {\n    const [filters] = parseFilterArgs(arg1, arg2);\n    filters.fetchStatus = 'fetching';\n    return this.queryCache.findAll(filters).length;\n  }\n\n  isMutating(filters) {\n    return this.mutationCache.findAll({ ...filters,\n      fetching: true\n    }).length;\n  }\n\n  getQueryData(queryKey, filters) {\n    var _this$queryCache$find;\n\n    return (_this$queryCache$find = this.queryCache.find(queryKey, filters)) == null ? void 0 : _this$queryCache$find.state.data;\n  }\n\n  ensureQueryData(arg1, arg2, arg3) {\n    const parsedOptions = parseQueryArgs(arg1, arg2, arg3);\n    const cachedData = this.getQueryData(parsedOptions.queryKey);\n    return cachedData ? Promise.resolve(cachedData) : this.fetchQuery(parsedOptions);\n  }\n\n  getQueriesData(queryKeyOrFilters) {\n    return this.getQueryCache().findAll(queryKeyOrFilters).map(({\n      queryKey,\n      state\n    }) => {\n      const data = state.data;\n      return [queryKey, data];\n    });\n  }\n\n  setQueryData(queryKey, updater, options) {\n    const query = this.queryCache.find(queryKey);\n    const prevData = query == null ? void 0 : query.state.data;\n    const data = functionalUpdate(updater, prevData);\n\n    if (typeof data === 'undefined') {\n      return undefined;\n    }\n\n    const parsedOptions = parseQueryArgs(queryKey);\n    const defaultedOptions = this.defaultQueryOptions(parsedOptions);\n    return this.queryCache.build(this, defaultedOptions).setData(data, { ...options,\n      manual: true\n    });\n  }\n\n  setQueriesData(queryKeyOrFilters, updater, options) {\n    return notifyManager.batch(() => this.getQueryCache().findAll(queryKeyOrFilters).map(({\n      queryKey\n    }) => [queryKey, this.setQueryData(queryKey, updater, options)]));\n  }\n\n  getQueryState(queryKey, filters) {\n    var _this$queryCache$find2;\n\n    return (_this$queryCache$find2 = this.queryCache.find(queryKey, filters)) == null ? void 0 : _this$queryCache$find2.state;\n  }\n\n  removeQueries(arg1, arg2) {\n    const [filters] = parseFilterArgs(arg1, arg2);\n    const queryCache = this.queryCache;\n    notifyManager.batch(() => {\n      queryCache.findAll(filters).forEach(query => {\n        queryCache.remove(query);\n      });\n    });\n  }\n\n  resetQueries(arg1, arg2, arg3) {\n    const [filters, options] = parseFilterArgs(arg1, arg2, arg3);\n    const queryCache = this.queryCache;\n    const refetchFilters = {\n      type: 'active',\n      ...filters\n    };\n    return notifyManager.batch(() => {\n      queryCache.findAll(filters).forEach(query => {\n        query.reset();\n      });\n      return this.refetchQueries(refetchFilters, options);\n    });\n  }\n\n  cancelQueries(arg1, arg2, arg3) {\n    const [filters, cancelOptions = {}] = parseFilterArgs(arg1, arg2, arg3);\n\n    if (typeof cancelOptions.revert === 'undefined') {\n      cancelOptions.revert = true;\n    }\n\n    const promises = notifyManager.batch(() => this.queryCache.findAll(filters).map(query => query.cancel(cancelOptions)));\n    return Promise.all(promises).then(noop).catch(noop);\n  }\n\n  invalidateQueries(arg1, arg2, arg3) {\n    const [filters, options] = parseFilterArgs(arg1, arg2, arg3);\n    return notifyManager.batch(() => {\n      var _ref, _filters$refetchType;\n\n      this.queryCache.findAll(filters).forEach(query => {\n        query.invalidate();\n      });\n\n      if (filters.refetchType === 'none') {\n        return Promise.resolve();\n      }\n\n      const refetchFilters = { ...filters,\n        type: (_ref = (_filters$refetchType = filters.refetchType) != null ? _filters$refetchType : filters.type) != null ? _ref : 'active'\n      };\n      return this.refetchQueries(refetchFilters, options);\n    });\n  }\n\n  refetchQueries(arg1, arg2, arg3) {\n    const [filters, options] = parseFilterArgs(arg1, arg2, arg3);\n    const promises = notifyManager.batch(() => this.queryCache.findAll(filters).filter(query => !query.isDisabled()).map(query => {\n      var _options$cancelRefetc;\n\n      return query.fetch(undefined, { ...options,\n        cancelRefetch: (_options$cancelRefetc = options == null ? void 0 : options.cancelRefetch) != null ? _options$cancelRefetc : true,\n        meta: {\n          refetchPage: filters.refetchPage\n        }\n      });\n    }));\n    let promise = Promise.all(promises).then(noop);\n\n    if (!(options != null && options.throwOnError)) {\n      promise = promise.catch(noop);\n    }\n\n    return promise;\n  }\n\n  fetchQuery(arg1, arg2, arg3) {\n    const parsedOptions = parseQueryArgs(arg1, arg2, arg3);\n    const defaultedOptions = this.defaultQueryOptions(parsedOptions); // https://github.com/tannerlinsley/react-query/issues/652\n\n    if (typeof defaultedOptions.retry === 'undefined') {\n      defaultedOptions.retry = false;\n    }\n\n    const query = this.queryCache.build(this, defaultedOptions);\n    return query.isStaleByTime(defaultedOptions.staleTime) ? query.fetch(defaultedOptions) : Promise.resolve(query.state.data);\n  }\n\n  prefetchQuery(arg1, arg2, arg3) {\n    return this.fetchQuery(arg1, arg2, arg3).then(noop).catch(noop);\n  }\n\n  fetchInfiniteQuery(arg1, arg2, arg3) {\n    const parsedOptions = parseQueryArgs(arg1, arg2, arg3);\n    parsedOptions.behavior = infiniteQueryBehavior();\n    return this.fetchQuery(parsedOptions);\n  }\n\n  prefetchInfiniteQuery(arg1, arg2, arg3) {\n    return this.fetchInfiniteQuery(arg1, arg2, arg3).then(noop).catch(noop);\n  }\n\n  resumePausedMutations() {\n    return this.mutationCache.resumePausedMutations();\n  }\n\n  getQueryCache() {\n    return this.queryCache;\n  }\n\n  getMutationCache() {\n    return this.mutationCache;\n  }\n\n  getLogger() {\n    return this.logger;\n  }\n\n  getDefaultOptions() {\n    return this.defaultOptions;\n  }\n\n  setDefaultOptions(options) {\n    this.defaultOptions = options;\n  }\n\n  setQueryDefaults(queryKey, options) {\n    const result = this.queryDefaults.find(x => hashQueryKey(queryKey) === hashQueryKey(x.queryKey));\n\n    if (result) {\n      result.defaultOptions = options;\n    } else {\n      this.queryDefaults.push({\n        queryKey,\n        defaultOptions: options\n      });\n    }\n  }\n\n  getQueryDefaults(queryKey) {\n    if (!queryKey) {\n      return undefined;\n    } // Get the first matching defaults\n\n\n    const firstMatchingDefaults = this.queryDefaults.find(x => partialMatchKey(queryKey, x.queryKey)); // Additional checks and error in dev mode\n\n    if (process.env.NODE_ENV !== 'production') {\n      // Retrieve all matching defaults for the given key\n      const matchingDefaults = this.queryDefaults.filter(x => partialMatchKey(queryKey, x.queryKey)); // It is ok not having defaults, but it is error prone to have more than 1 default for a given key\n\n      if (matchingDefaults.length > 1) {\n        this.logger.error(\"[QueryClient] Several query defaults match with key '\" + JSON.stringify(queryKey) + \"'. The first matching query defaults are used. Please check how query defaults are registered. Order does matter here. cf. https://react-query.tanstack.com/reference/QueryClient#queryclientsetquerydefaults.\");\n      }\n    }\n\n    return firstMatchingDefaults == null ? void 0 : firstMatchingDefaults.defaultOptions;\n  }\n\n  setMutationDefaults(mutationKey, options) {\n    const result = this.mutationDefaults.find(x => hashQueryKey(mutationKey) === hashQueryKey(x.mutationKey));\n\n    if (result) {\n      result.defaultOptions = options;\n    } else {\n      this.mutationDefaults.push({\n        mutationKey,\n        defaultOptions: options\n      });\n    }\n  }\n\n  getMutationDefaults(mutationKey) {\n    if (!mutationKey) {\n      return undefined;\n    } // Get the first matching defaults\n\n\n    const firstMatchingDefaults = this.mutationDefaults.find(x => partialMatchKey(mutationKey, x.mutationKey)); // Additional checks and error in dev mode\n\n    if (process.env.NODE_ENV !== 'production') {\n      // Retrieve all matching defaults for the given key\n      const matchingDefaults = this.mutationDefaults.filter(x => partialMatchKey(mutationKey, x.mutationKey)); // It is ok not having defaults, but it is error prone to have more than 1 default for a given key\n\n      if (matchingDefaults.length > 1) {\n        this.logger.error(\"[QueryClient] Several mutation defaults match with key '\" + JSON.stringify(mutationKey) + \"'. The first matching mutation defaults are used. Please check how mutation defaults are registered. Order does matter here. cf. https://react-query.tanstack.com/reference/QueryClient#queryclientsetmutationdefaults.\");\n      }\n    }\n\n    return firstMatchingDefaults == null ? void 0 : firstMatchingDefaults.defaultOptions;\n  }\n\n  defaultQueryOptions(options) {\n    if (options != null && options._defaulted) {\n      return options;\n    }\n\n    const defaultedOptions = { ...this.defaultOptions.queries,\n      ...this.getQueryDefaults(options == null ? void 0 : options.queryKey),\n      ...options,\n      _defaulted: true\n    };\n\n    if (!defaultedOptions.queryHash && defaultedOptions.queryKey) {\n      defaultedOptions.queryHash = hashQueryKeyByOptions(defaultedOptions.queryKey, defaultedOptions);\n    } // dependent default values\n\n\n    if (typeof defaultedOptions.refetchOnReconnect === 'undefined') {\n      defaultedOptions.refetchOnReconnect = defaultedOptions.networkMode !== 'always';\n    }\n\n    if (typeof defaultedOptions.useErrorBoundary === 'undefined') {\n      defaultedOptions.useErrorBoundary = !!defaultedOptions.suspense;\n    }\n\n    return defaultedOptions;\n  }\n\n  defaultMutationOptions(options) {\n    if (options != null && options._defaulted) {\n      return options;\n    }\n\n    return { ...this.defaultOptions.mutations,\n      ...this.getMutationDefaults(options == null ? void 0 : options.mutationKey),\n      ...options,\n      _defaulted: true\n    };\n  }\n\n  clear() {\n    this.queryCache.clear();\n    this.mutationCache.clear();\n  }\n\n}\n\nexport { QueryClient };\n//# sourceMappingURL=queryClient.mjs.map\n","import { shallowEqualObjects, noop, isServer, isValidTimeout, timeUntilStale, replaceData } from './utils.mjs';\nimport { notifyManager } from './notifyManager.mjs';\nimport { focusManager } from './focusManager.mjs';\nimport { Subscribable } from './subscribable.mjs';\nimport { canFetch, isCancelledError } from './retryer.mjs';\n\nclass QueryObserver extends Subscribable {\n  constructor(client, options) {\n    super();\n    this.client = client;\n    this.options = options;\n    this.trackedProps = new Set();\n    this.selectError = null;\n    this.bindMethods();\n    this.setOptions(options);\n  }\n\n  bindMethods() {\n    this.remove = this.remove.bind(this);\n    this.refetch = this.refetch.bind(this);\n  }\n\n  onSubscribe() {\n    if (this.listeners.size === 1) {\n      this.currentQuery.addObserver(this);\n\n      if (shouldFetchOnMount(this.currentQuery, this.options)) {\n        this.executeFetch();\n      }\n\n      this.updateTimers();\n    }\n  }\n\n  onUnsubscribe() {\n    if (!this.hasListeners()) {\n      this.destroy();\n    }\n  }\n\n  shouldFetchOnReconnect() {\n    return shouldFetchOn(this.currentQuery, this.options, this.options.refetchOnReconnect);\n  }\n\n  shouldFetchOnWindowFocus() {\n    return shouldFetchOn(this.currentQuery, this.options, this.options.refetchOnWindowFocus);\n  }\n\n  destroy() {\n    this.listeners = new Set();\n    this.clearStaleTimeout();\n    this.clearRefetchInterval();\n    this.currentQuery.removeObserver(this);\n  }\n\n  setOptions(options, notifyOptions) {\n    const prevOptions = this.options;\n    const prevQuery = this.currentQuery;\n    this.options = this.client.defaultQueryOptions(options);\n\n    if (process.env.NODE_ENV !== 'production' && typeof (options == null ? void 0 : options.isDataEqual) !== 'undefined') {\n      this.client.getLogger().error(\"The isDataEqual option has been deprecated and will be removed in the next major version. You can achieve the same functionality by passing a function as the structuralSharing option\");\n    }\n\n    if (!shallowEqualObjects(prevOptions, this.options)) {\n      this.client.getQueryCache().notify({\n        type: 'observerOptionsUpdated',\n        query: this.currentQuery,\n        observer: this\n      });\n    }\n\n    if (typeof this.options.enabled !== 'undefined' && typeof this.options.enabled !== 'boolean') {\n      throw new Error('Expected enabled to be a boolean');\n    } // Keep previous query key if the user does not supply one\n\n\n    if (!this.options.queryKey) {\n      this.options.queryKey = prevOptions.queryKey;\n    }\n\n    this.updateQuery();\n    const mounted = this.hasListeners(); // Fetch if there are subscribers\n\n    if (mounted && shouldFetchOptionally(this.currentQuery, prevQuery, this.options, prevOptions)) {\n      this.executeFetch();\n    } // Update result\n\n\n    this.updateResult(notifyOptions); // Update stale interval if needed\n\n    if (mounted && (this.currentQuery !== prevQuery || this.options.enabled !== prevOptions.enabled || this.options.staleTime !== prevOptions.staleTime)) {\n      this.updateStaleTimeout();\n    }\n\n    const nextRefetchInterval = this.computeRefetchInterval(); // Update refetch interval if needed\n\n    if (mounted && (this.currentQuery !== prevQuery || this.options.enabled !== prevOptions.enabled || nextRefetchInterval !== this.currentRefetchInterval)) {\n      this.updateRefetchInterval(nextRefetchInterval);\n    }\n  }\n\n  getOptimisticResult(options) {\n    const query = this.client.getQueryCache().build(this.client, options);\n    const result = this.createResult(query, options);\n\n    if (shouldAssignObserverCurrentProperties(this, result, options)) {\n      // this assigns the optimistic result to the current Observer\n      // because if the query function changes, useQuery will be performing\n      // an effect where it would fetch again.\n      // When the fetch finishes, we perform a deep data cloning in order\n      // to reuse objects references. This deep data clone is performed against\n      // the `observer.currentResult.data` property\n      // When QueryKey changes, we refresh the query and get new `optimistic`\n      // result, while we leave the `observer.currentResult`, so when new data\n      // arrives, it finds the old `observer.currentResult` which is related\n      // to the old QueryKey. Which means that currentResult and selectData are\n      // out of sync already.\n      // To solve this, we move the cursor of the currentResult everytime\n      // an observer reads an optimistic value.\n      // When keeping the previous data, the result doesn't change until new\n      // data arrives.\n      this.currentResult = result;\n      this.currentResultOptions = this.options;\n      this.currentResultState = this.currentQuery.state;\n    }\n\n    return result;\n  }\n\n  getCurrentResult() {\n    return this.currentResult;\n  }\n\n  trackResult(result) {\n    const trackedResult = {};\n    Object.keys(result).forEach(key => {\n      Object.defineProperty(trackedResult, key, {\n        configurable: false,\n        enumerable: true,\n        get: () => {\n          this.trackedProps.add(key);\n          return result[key];\n        }\n      });\n    });\n    return trackedResult;\n  }\n\n  getCurrentQuery() {\n    return this.currentQuery;\n  }\n\n  remove() {\n    this.client.getQueryCache().remove(this.currentQuery);\n  }\n\n  refetch({\n    refetchPage,\n    ...options\n  } = {}) {\n    return this.fetch({ ...options,\n      meta: {\n        refetchPage\n      }\n    });\n  }\n\n  fetchOptimistic(options) {\n    const defaultedOptions = this.client.defaultQueryOptions(options);\n    const query = this.client.getQueryCache().build(this.client, defaultedOptions);\n    query.isFetchingOptimistic = true;\n    return query.fetch().then(() => this.createResult(query, defaultedOptions));\n  }\n\n  fetch(fetchOptions) {\n    var _fetchOptions$cancelR;\n\n    return this.executeFetch({ ...fetchOptions,\n      cancelRefetch: (_fetchOptions$cancelR = fetchOptions.cancelRefetch) != null ? _fetchOptions$cancelR : true\n    }).then(() => {\n      this.updateResult();\n      return this.currentResult;\n    });\n  }\n\n  executeFetch(fetchOptions) {\n    // Make sure we reference the latest query as the current one might have been removed\n    this.updateQuery(); // Fetch\n\n    let promise = this.currentQuery.fetch(this.options, fetchOptions);\n\n    if (!(fetchOptions != null && fetchOptions.throwOnError)) {\n      promise = promise.catch(noop);\n    }\n\n    return promise;\n  }\n\n  updateStaleTimeout() {\n    this.clearStaleTimeout();\n\n    if (isServer || this.currentResult.isStale || !isValidTimeout(this.options.staleTime)) {\n      return;\n    }\n\n    const time = timeUntilStale(this.currentResult.dataUpdatedAt, this.options.staleTime); // The timeout is sometimes triggered 1 ms before the stale time expiration.\n    // To mitigate this issue we always add 1 ms to the timeout.\n\n    const timeout = time + 1;\n    this.staleTimeoutId = setTimeout(() => {\n      if (!this.currentResult.isStale) {\n        this.updateResult();\n      }\n    }, timeout);\n  }\n\n  computeRefetchInterval() {\n    var _this$options$refetch;\n\n    return typeof this.options.refetchInterval === 'function' ? this.options.refetchInterval(this.currentResult.data, this.currentQuery) : (_this$options$refetch = this.options.refetchInterval) != null ? _this$options$refetch : false;\n  }\n\n  updateRefetchInterval(nextInterval) {\n    this.clearRefetchInterval();\n    this.currentRefetchInterval = nextInterval;\n\n    if (isServer || this.options.enabled === false || !isValidTimeout(this.currentRefetchInterval) || this.currentRefetchInterval === 0) {\n      return;\n    }\n\n    this.refetchIntervalId = setInterval(() => {\n      if (this.options.refetchIntervalInBackground || focusManager.isFocused()) {\n        this.executeFetch();\n      }\n    }, this.currentRefetchInterval);\n  }\n\n  updateTimers() {\n    this.updateStaleTimeout();\n    this.updateRefetchInterval(this.computeRefetchInterval());\n  }\n\n  clearStaleTimeout() {\n    if (this.staleTimeoutId) {\n      clearTimeout(this.staleTimeoutId);\n      this.staleTimeoutId = undefined;\n    }\n  }\n\n  clearRefetchInterval() {\n    if (this.refetchIntervalId) {\n      clearInterval(this.refetchIntervalId);\n      this.refetchIntervalId = undefined;\n    }\n  }\n\n  createResult(query, options) {\n    const prevQuery = this.currentQuery;\n    const prevOptions = this.options;\n    const prevResult = this.currentResult;\n    const prevResultState = this.currentResultState;\n    const prevResultOptions = this.currentResultOptions;\n    const queryChange = query !== prevQuery;\n    const queryInitialState = queryChange ? query.state : this.currentQueryInitialState;\n    const prevQueryResult = queryChange ? this.currentResult : this.previousQueryResult;\n    const {\n      state\n    } = query;\n    let {\n      dataUpdatedAt,\n      error,\n      errorUpdatedAt,\n      fetchStatus,\n      status\n    } = state;\n    let isPreviousData = false;\n    let isPlaceholderData = false;\n    let data; // Optimistically set result in fetching state if needed\n\n    if (options._optimisticResults) {\n      const mounted = this.hasListeners();\n      const fetchOnMount = !mounted && shouldFetchOnMount(query, options);\n      const fetchOptionally = mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions);\n\n      if (fetchOnMount || fetchOptionally) {\n        fetchStatus = canFetch(query.options.networkMode) ? 'fetching' : 'paused';\n\n        if (!dataUpdatedAt) {\n          status = 'loading';\n        }\n      }\n\n      if (options._optimisticResults === 'isRestoring') {\n        fetchStatus = 'idle';\n      }\n    } // Keep previous data if needed\n\n\n    if (options.keepPreviousData && !state.dataUpdatedAt && prevQueryResult != null && prevQueryResult.isSuccess && status !== 'error') {\n      data = prevQueryResult.data;\n      dataUpdatedAt = prevQueryResult.dataUpdatedAt;\n      status = prevQueryResult.status;\n      isPreviousData = true;\n    } // Select data if needed\n    else if (options.select && typeof state.data !== 'undefined') {\n      // Memoize select result\n      if (prevResult && state.data === (prevResultState == null ? void 0 : prevResultState.data) && options.select === this.selectFn) {\n        data = this.selectResult;\n      } else {\n        try {\n          this.selectFn = options.select;\n          data = options.select(state.data);\n          data = replaceData(prevResult == null ? void 0 : prevResult.data, data, options);\n          this.selectResult = data;\n          this.selectError = null;\n        } catch (selectError) {\n          if (process.env.NODE_ENV !== 'production') {\n            this.client.getLogger().error(selectError);\n          }\n\n          this.selectError = selectError;\n        }\n      }\n    } // Use query data\n    else {\n      data = state.data;\n    } // Show placeholder data if needed\n\n\n    if (typeof options.placeholderData !== 'undefined' && typeof data === 'undefined' && status === 'loading') {\n      let placeholderData; // Memoize placeholder data\n\n      if (prevResult != null && prevResult.isPlaceholderData && options.placeholderData === (prevResultOptions == null ? void 0 : prevResultOptions.placeholderData)) {\n        placeholderData = prevResult.data;\n      } else {\n        placeholderData = typeof options.placeholderData === 'function' ? options.placeholderData() : options.placeholderData;\n\n        if (options.select && typeof placeholderData !== 'undefined') {\n          try {\n            placeholderData = options.select(placeholderData);\n            this.selectError = null;\n          } catch (selectError) {\n            if (process.env.NODE_ENV !== 'production') {\n              this.client.getLogger().error(selectError);\n            }\n\n            this.selectError = selectError;\n          }\n        }\n      }\n\n      if (typeof placeholderData !== 'undefined') {\n        status = 'success';\n        data = replaceData(prevResult == null ? void 0 : prevResult.data, placeholderData, options);\n        isPlaceholderData = true;\n      }\n    }\n\n    if (this.selectError) {\n      error = this.selectError;\n      data = this.selectResult;\n      errorUpdatedAt = Date.now();\n      status = 'error';\n    }\n\n    const isFetching = fetchStatus === 'fetching';\n    const isLoading = status === 'loading';\n    const isError = status === 'error';\n    const result = {\n      status,\n      fetchStatus,\n      isLoading,\n      isSuccess: status === 'success',\n      isError,\n      isInitialLoading: isLoading && isFetching,\n      data,\n      dataUpdatedAt,\n      error,\n      errorUpdatedAt,\n      failureCount: state.fetchFailureCount,\n      failureReason: state.fetchFailureReason,\n      errorUpdateCount: state.errorUpdateCount,\n      isFetched: state.dataUpdateCount > 0 || state.errorUpdateCount > 0,\n      isFetchedAfterMount: state.dataUpdateCount > queryInitialState.dataUpdateCount || state.errorUpdateCount > queryInitialState.errorUpdateCount,\n      isFetching,\n      isRefetching: isFetching && !isLoading,\n      isLoadingError: isError && state.dataUpdatedAt === 0,\n      isPaused: fetchStatus === 'paused',\n      isPlaceholderData,\n      isPreviousData,\n      isRefetchError: isError && state.dataUpdatedAt !== 0,\n      isStale: isStale(query, options),\n      refetch: this.refetch,\n      remove: this.remove\n    };\n    return result;\n  }\n\n  updateResult(notifyOptions) {\n    const prevResult = this.currentResult;\n    const nextResult = this.createResult(this.currentQuery, this.options);\n    this.currentResultState = this.currentQuery.state;\n    this.currentResultOptions = this.options; // Only notify and update result if something has changed\n\n    if (shallowEqualObjects(nextResult, prevResult)) {\n      return;\n    }\n\n    this.currentResult = nextResult; // Determine which callbacks to trigger\n\n    const defaultNotifyOptions = {\n      cache: true\n    };\n\n    const shouldNotifyListeners = () => {\n      if (!prevResult) {\n        return true;\n      }\n\n      const {\n        notifyOnChangeProps\n      } = this.options;\n      const notifyOnChangePropsValue = typeof notifyOnChangeProps === 'function' ? notifyOnChangeProps() : notifyOnChangeProps;\n\n      if (notifyOnChangePropsValue === 'all' || !notifyOnChangePropsValue && !this.trackedProps.size) {\n        return true;\n      }\n\n      const includedProps = new Set(notifyOnChangePropsValue != null ? notifyOnChangePropsValue : this.trackedProps);\n\n      if (this.options.useErrorBoundary) {\n        includedProps.add('error');\n      }\n\n      return Object.keys(this.currentResult).some(key => {\n        const typedKey = key;\n        const changed = this.currentResult[typedKey] !== prevResult[typedKey];\n        return changed && includedProps.has(typedKey);\n      });\n    };\n\n    if ((notifyOptions == null ? void 0 : notifyOptions.listeners) !== false && shouldNotifyListeners()) {\n      defaultNotifyOptions.listeners = true;\n    }\n\n    this.notify({ ...defaultNotifyOptions,\n      ...notifyOptions\n    });\n  }\n\n  updateQuery() {\n    const query = this.client.getQueryCache().build(this.client, this.options);\n\n    if (query === this.currentQuery) {\n      return;\n    }\n\n    const prevQuery = this.currentQuery;\n    this.currentQuery = query;\n    this.currentQueryInitialState = query.state;\n    this.previousQueryResult = this.currentResult;\n\n    if (this.hasListeners()) {\n      prevQuery == null ? void 0 : prevQuery.removeObserver(this);\n      query.addObserver(this);\n    }\n  }\n\n  onQueryUpdate(action) {\n    const notifyOptions = {};\n\n    if (action.type === 'success') {\n      notifyOptions.onSuccess = !action.manual;\n    } else if (action.type === 'error' && !isCancelledError(action.error)) {\n      notifyOptions.onError = true;\n    }\n\n    this.updateResult(notifyOptions);\n\n    if (this.hasListeners()) {\n      this.updateTimers();\n    }\n  }\n\n  notify(notifyOptions) {\n    notifyManager.batch(() => {\n      // First trigger the configuration callbacks\n      if (notifyOptions.onSuccess) {\n        var _this$options$onSucce, _this$options, _this$options$onSettl, _this$options2;\n\n        (_this$options$onSucce = (_this$options = this.options).onSuccess) == null ? void 0 : _this$options$onSucce.call(_this$options, this.currentResult.data);\n        (_this$options$onSettl = (_this$options2 = this.options).onSettled) == null ? void 0 : _this$options$onSettl.call(_this$options2, this.currentResult.data, null);\n      } else if (notifyOptions.onError) {\n        var _this$options$onError, _this$options3, _this$options$onSettl2, _this$options4;\n\n        (_this$options$onError = (_this$options3 = this.options).onError) == null ? void 0 : _this$options$onError.call(_this$options3, this.currentResult.error);\n        (_this$options$onSettl2 = (_this$options4 = this.options).onSettled) == null ? void 0 : _this$options$onSettl2.call(_this$options4, undefined, this.currentResult.error);\n      } // Then trigger the listeners\n\n\n      if (notifyOptions.listeners) {\n        this.listeners.forEach(({\n          listener\n        }) => {\n          listener(this.currentResult);\n        });\n      } // Then the cache listeners\n\n\n      if (notifyOptions.cache) {\n        this.client.getQueryCache().notify({\n          query: this.currentQuery,\n          type: 'observerResultsUpdated'\n        });\n      }\n    });\n  }\n\n}\n\nfunction shouldLoadOnMount(query, options) {\n  return options.enabled !== false && !query.state.dataUpdatedAt && !(query.state.status === 'error' && options.retryOnMount === false);\n}\n\nfunction shouldFetchOnMount(query, options) {\n  return shouldLoadOnMount(query, options) || query.state.dataUpdatedAt > 0 && shouldFetchOn(query, options, options.refetchOnMount);\n}\n\nfunction shouldFetchOn(query, options, field) {\n  if (options.enabled !== false) {\n    const value = typeof field === 'function' ? field(query) : field;\n    return value === 'always' || value !== false && isStale(query, options);\n  }\n\n  return false;\n}\n\nfunction shouldFetchOptionally(query, prevQuery, options, prevOptions) {\n  return options.enabled !== false && (query !== prevQuery || prevOptions.enabled === false) && (!options.suspense || query.state.status !== 'error') && isStale(query, options);\n}\n\nfunction isStale(query, options) {\n  return query.isStaleByTime(options.staleTime);\n} // this function would decide if we will update the observer's 'current'\n// properties after an optimistic reading via getOptimisticResult\n\n\nfunction shouldAssignObserverCurrentProperties(observer, optimisticResult, options) {\n  // it is important to keep this condition like this for three reasons:\n  // 1. It will get removed in the v5\n  // 2. it reads: don't update the properties if we want to keep the previous\n  // data.\n  // 3. The opposite condition (!options.keepPreviousData) would fallthrough\n  // and will result in a bad decision\n  if (options.keepPreviousData) {\n    return false;\n  } // this means we want to put some placeholder data when pending and queryKey\n  // changed.\n\n\n  if (options.placeholderData !== undefined) {\n    // re-assign properties only if current data is placeholder data\n    // which means that data did not arrive yet, so, if there is some cached data\n    // we need to \"prepare\" to receive it\n    return optimisticResult.isPlaceholderData;\n  } // if the newly created result isn't what the observer is holding as current,\n  // then we'll need to update the properties as well\n\n\n  if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {\n    return true;\n  } // basically, just keep previous properties if nothing changed\n\n\n  return false;\n}\n\nexport { QueryObserver };\n//# sourceMappingURL=queryObserver.mjs.map\n","import { QueryObserver } from './queryObserver.mjs';\nimport { infiniteQueryBehavior, hasNextPage, hasPreviousPage } from './infiniteQueryBehavior.mjs';\n\nclass InfiniteQueryObserver extends QueryObserver {\n  // Type override\n  // Type override\n  // Type override\n  // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n  constructor(client, options) {\n    super(client, options);\n  }\n\n  bindMethods() {\n    super.bindMethods();\n    this.fetchNextPage = this.fetchNextPage.bind(this);\n    this.fetchPreviousPage = this.fetchPreviousPage.bind(this);\n  }\n\n  setOptions(options, notifyOptions) {\n    super.setOptions({ ...options,\n      behavior: infiniteQueryBehavior()\n    }, notifyOptions);\n  }\n\n  getOptimisticResult(options) {\n    options.behavior = infiniteQueryBehavior();\n    return super.getOptimisticResult(options);\n  }\n\n  fetchNextPage({\n    pageParam,\n    ...options\n  } = {}) {\n    return this.fetch({ ...options,\n      meta: {\n        fetchMore: {\n          direction: 'forward',\n          pageParam\n        }\n      }\n    });\n  }\n\n  fetchPreviousPage({\n    pageParam,\n    ...options\n  } = {}) {\n    return this.fetch({ ...options,\n      meta: {\n        fetchMore: {\n          direction: 'backward',\n          pageParam\n        }\n      }\n    });\n  }\n\n  createResult(query, options) {\n    var _state$fetchMeta, _state$fetchMeta$fetc, _state$fetchMeta2, _state$fetchMeta2$fet, _state$data, _state$data2;\n\n    const {\n      state\n    } = query;\n    const result = super.createResult(query, options);\n    const {\n      isFetching,\n      isRefetching\n    } = result;\n    const isFetchingNextPage = isFetching && ((_state$fetchMeta = state.fetchMeta) == null ? void 0 : (_state$fetchMeta$fetc = _state$fetchMeta.fetchMore) == null ? void 0 : _state$fetchMeta$fetc.direction) === 'forward';\n    const isFetchingPreviousPage = isFetching && ((_state$fetchMeta2 = state.fetchMeta) == null ? void 0 : (_state$fetchMeta2$fet = _state$fetchMeta2.fetchMore) == null ? void 0 : _state$fetchMeta2$fet.direction) === 'backward';\n    return { ...result,\n      fetchNextPage: this.fetchNextPage,\n      fetchPreviousPage: this.fetchPreviousPage,\n      hasNextPage: hasNextPage(options, (_state$data = state.data) == null ? void 0 : _state$data.pages),\n      hasPreviousPage: hasPreviousPage(options, (_state$data2 = state.data) == null ? void 0 : _state$data2.pages),\n      isFetchingNextPage,\n      isFetchingPreviousPage,\n      isRefetching: isRefetching && !isFetchingNextPage && !isFetchingPreviousPage\n    };\n  }\n\n}\n\nexport { InfiniteQueryObserver };\n//# sourceMappingURL=infiniteQueryObserver.mjs.map\n","import { getDefaultState } from './mutation.mjs';\nimport { notifyManager } from './notifyManager.mjs';\nimport { Subscribable } from './subscribable.mjs';\nimport { shallowEqualObjects } from './utils.mjs';\n\n// CLASS\nclass MutationObserver extends Subscribable {\n  constructor(client, options) {\n    super();\n    this.client = client;\n    this.setOptions(options);\n    this.bindMethods();\n    this.updateResult();\n  }\n\n  bindMethods() {\n    this.mutate = this.mutate.bind(this);\n    this.reset = this.reset.bind(this);\n  }\n\n  setOptions(options) {\n    var _this$currentMutation;\n\n    const prevOptions = this.options;\n    this.options = this.client.defaultMutationOptions(options);\n\n    if (!shallowEqualObjects(prevOptions, this.options)) {\n      this.client.getMutationCache().notify({\n        type: 'observerOptionsUpdated',\n        mutation: this.currentMutation,\n        observer: this\n      });\n    }\n\n    (_this$currentMutation = this.currentMutation) == null ? void 0 : _this$currentMutation.setOptions(this.options);\n  }\n\n  onUnsubscribe() {\n    if (!this.hasListeners()) {\n      var _this$currentMutation2;\n\n      (_this$currentMutation2 = this.currentMutation) == null ? void 0 : _this$currentMutation2.removeObserver(this);\n    }\n  }\n\n  onMutationUpdate(action) {\n    this.updateResult(); // Determine which callbacks to trigger\n\n    const notifyOptions = {\n      listeners: true\n    };\n\n    if (action.type === 'success') {\n      notifyOptions.onSuccess = true;\n    } else if (action.type === 'error') {\n      notifyOptions.onError = true;\n    }\n\n    this.notify(notifyOptions);\n  }\n\n  getCurrentResult() {\n    return this.currentResult;\n  }\n\n  reset() {\n    this.currentMutation = undefined;\n    this.updateResult();\n    this.notify({\n      listeners: true\n    });\n  }\n\n  mutate(variables, options) {\n    this.mutateOptions = options;\n\n    if (this.currentMutation) {\n      this.currentMutation.removeObserver(this);\n    }\n\n    this.currentMutation = this.client.getMutationCache().build(this.client, { ...this.options,\n      variables: typeof variables !== 'undefined' ? variables : this.options.variables\n    });\n    this.currentMutation.addObserver(this);\n    return this.currentMutation.execute();\n  }\n\n  updateResult() {\n    const state = this.currentMutation ? this.currentMutation.state : getDefaultState();\n    const result = { ...state,\n      isLoading: state.status === 'loading',\n      isSuccess: state.status === 'success',\n      isError: state.status === 'error',\n      isIdle: state.status === 'idle',\n      mutate: this.mutate,\n      reset: this.reset\n    };\n    this.currentResult = result;\n  }\n\n  notify(options) {\n    notifyManager.batch(() => {\n      // First trigger the mutate callbacks\n      if (this.mutateOptions && this.hasListeners()) {\n        if (options.onSuccess) {\n          var _this$mutateOptions$o, _this$mutateOptions, _this$mutateOptions$o2, _this$mutateOptions2;\n\n          (_this$mutateOptions$o = (_this$mutateOptions = this.mutateOptions).onSuccess) == null ? void 0 : _this$mutateOptions$o.call(_this$mutateOptions, this.currentResult.data, this.currentResult.variables, this.currentResult.context);\n          (_this$mutateOptions$o2 = (_this$mutateOptions2 = this.mutateOptions).onSettled) == null ? void 0 : _this$mutateOptions$o2.call(_this$mutateOptions2, this.currentResult.data, null, this.currentResult.variables, this.currentResult.context);\n        } else if (options.onError) {\n          var _this$mutateOptions$o3, _this$mutateOptions3, _this$mutateOptions$o4, _this$mutateOptions4;\n\n          (_this$mutateOptions$o3 = (_this$mutateOptions3 = this.mutateOptions).onError) == null ? void 0 : _this$mutateOptions$o3.call(_this$mutateOptions3, this.currentResult.error, this.currentResult.variables, this.currentResult.context);\n          (_this$mutateOptions$o4 = (_this$mutateOptions4 = this.mutateOptions).onSettled) == null ? void 0 : _this$mutateOptions$o4.call(_this$mutateOptions4, undefined, this.currentResult.error, this.currentResult.variables, this.currentResult.context);\n        }\n      } // Then trigger the listeners\n\n\n      if (options.listeners) {\n        this.listeners.forEach(({\n          listener\n        }) => {\n          listener(this.currentResult);\n        });\n      }\n    });\n  }\n\n}\n\nexport { MutationObserver };\n//# sourceMappingURL=mutationObserver.mjs.map\n","import { isRef, unref } from 'vue-demi';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst VUE_QUERY_CLIENT = 'VUE_QUERY_CLIENT';\nfunction getClientKey(key) {\n  const suffix = key ? \":\" + key : '';\n  return \"\" + VUE_QUERY_CLIENT + suffix;\n}\nfunction isQueryKey(value) {\n  return Array.isArray(value);\n}\nfunction isMutationKey(value) {\n  return Array.isArray(value);\n}\nfunction updateState(state, update) {\n  Object.keys(state).forEach(key => {\n    state[key] = update[key];\n  });\n}\nfunction cloneDeep(value, customizer) {\n  if (customizer) {\n    const result = customizer(value);\n\n    if (result !== undefined || isRef(value)) {\n      return result;\n    }\n  }\n\n  if (Array.isArray(value)) {\n    return value.map(val => cloneDeep(val, customizer));\n  }\n\n  if (typeof value === 'object' && isPlainObject(value)) {\n    const entries = Object.entries(value).map(([key, val]) => [key, cloneDeep(val, customizer)]);\n    return Object.fromEntries(entries);\n  }\n\n  return value;\n}\nfunction cloneDeepUnref(obj) {\n  return cloneDeep(obj, val => {\n    if (isRef(val)) {\n      return cloneDeepUnref(unref(val));\n    }\n  });\n}\n\nfunction isPlainObject(value) {\n  if (Object.prototype.toString.call(value) !== '[object Object]') {\n    return false;\n  }\n\n  const prototype = Object.getPrototypeOf(value);\n  return prototype === null || prototype === Object.prototype;\n}\n\nfunction shouldThrowError(_useErrorBoundary, params) {\n  // Allow useErrorBoundary function to override throwing behavior on a per-error basis\n  if (typeof _useErrorBoundary === 'function') {\n    return _useErrorBoundary(...params);\n  }\n\n  return !!_useErrorBoundary;\n}\n\nexport { VUE_QUERY_CLIENT, cloneDeep, cloneDeepUnref, getClientKey, isMutationKey, isQueryKey, shouldThrowError, updateState };\n//# sourceMappingURL=utils.mjs.map\n","import { inject, getCurrentInstance } from 'vue-demi';\nimport { getClientKey } from './utils.mjs';\n\nfunction useQueryClient(id = '') {\n  const key = getClientKey(id);\n  const queryClient = inject(key, null);\n\n  if (!queryClient) {\n    var _getCurrentInstance;\n\n    const vm = (_getCurrentInstance = getCurrentInstance()) == null ? void 0 : _getCurrentInstance.proxy;\n\n    if (!vm) {\n      throw new Error('vue-query hooks can only be used inside setup() function.');\n    }\n\n    throw new Error(\"No 'queryClient' found in Vue context, use 'VueQueryPlugin' to properly initialize the library.\");\n  }\n\n  return queryClient;\n}\n\nexport { useQueryClient };\n//# sourceMappingURL=useQueryClient.mjs.map\n","import { QueryCache as QueryCache$1 } from '@tanstack/query-core';\nimport { cloneDeepUnref, isQueryKey } from './utils.mjs';\n\nclass QueryCache extends QueryCache$1 {\n  find(arg1, arg2) {\n    const arg1Unreffed = cloneDeepUnref(arg1);\n    const arg2Unreffed = cloneDeepUnref(arg2);\n    return super.find(arg1Unreffed, arg2Unreffed);\n  }\n\n  findAll(arg1, arg2) {\n    const arg1Unreffed = cloneDeepUnref(arg1);\n    const arg2Unreffed = cloneDeepUnref(arg2);\n\n    if (isQueryKey(arg1Unreffed)) {\n      return super.findAll(arg1Unreffed, arg2Unreffed);\n    }\n\n    return super.findAll(arg1Unreffed);\n  }\n\n}\n\nexport { QueryCache };\n//# sourceMappingURL=queryCache.mjs.map\n","import { MutationCache as MutationCache$1 } from '@tanstack/query-core';\nimport { cloneDeepUnref } from './utils.mjs';\n\nclass MutationCache extends MutationCache$1 {\n  find(filters) {\n    return super.find(cloneDeepUnref(filters));\n  }\n\n  findAll(filters) {\n    return super.findAll(cloneDeepUnref(filters));\n  }\n\n}\n\nexport { MutationCache };\n//# sourceMappingURL=mutationCache.mjs.map\n","import { ref } from 'vue-demi';\nimport { QueryClient as QueryClient$1 } from '@tanstack/query-core';\nimport { cloneDeepUnref, isQueryKey } from './utils.mjs';\nimport { QueryCache } from './queryCache.mjs';\nimport { MutationCache } from './mutationCache.mjs';\n\nclass QueryClient extends QueryClient$1 {\n  constructor(config = {}) {\n    const unreffedConfig = cloneDeepUnref(config);\n    const vueQueryConfig = {\n      logger: cloneDeepUnref(unreffedConfig.logger),\n      defaultOptions: cloneDeepUnref(unreffedConfig.defaultOptions),\n      queryCache: unreffedConfig.queryCache || new QueryCache(),\n      mutationCache: unreffedConfig.mutationCache || new MutationCache()\n    };\n    super(vueQueryConfig);\n    this.isRestoring = ref(false);\n  }\n\n  isFetching(arg1, arg2) {\n    const arg1Unreffed = cloneDeepUnref(arg1);\n    const arg2Unreffed = cloneDeepUnref(arg2);\n\n    if (isQueryKey(arg1Unreffed)) {\n      return super.isFetching(arg1Unreffed, arg2Unreffed);\n    }\n\n    return super.isFetching(arg1Unreffed);\n  }\n\n  isMutating(filters) {\n    return super.isMutating(cloneDeepUnref(filters));\n  }\n\n  getQueryData(queryKey, filters) {\n    return super.getQueryData(cloneDeepUnref(queryKey), cloneDeepUnref(filters));\n  }\n\n  getQueriesData(queryKeyOrFilters) {\n    const unreffed = cloneDeepUnref(queryKeyOrFilters);\n\n    if (isQueryKey(unreffed)) {\n      return super.getQueriesData(unreffed);\n    }\n\n    return super.getQueriesData(unreffed);\n  }\n\n  setQueryData(queryKey, updater, options) {\n    return super.setQueryData(cloneDeepUnref(queryKey), updater, cloneDeepUnref(options));\n  }\n\n  setQueriesData(queryKeyOrFilters, updater, options) {\n    const arg1Unreffed = cloneDeepUnref(queryKeyOrFilters);\n    const arg3Unreffed = cloneDeepUnref(options);\n\n    if (isQueryKey(arg1Unreffed)) {\n      return super.setQueriesData(arg1Unreffed, updater, arg3Unreffed);\n    }\n\n    return super.setQueriesData(arg1Unreffed, updater, arg3Unreffed);\n  }\n\n  getQueryState(queryKey, filters) {\n    return super.getQueryState(cloneDeepUnref(queryKey), cloneDeepUnref(filters));\n  }\n\n  removeQueries(arg1, arg2) {\n    const arg1Unreffed = cloneDeepUnref(arg1);\n\n    if (isQueryKey(arg1Unreffed)) {\n      return super.removeQueries(arg1Unreffed, cloneDeepUnref(arg2));\n    }\n\n    return super.removeQueries(arg1Unreffed);\n  }\n\n  resetQueries(arg1, arg2, arg3) {\n    const arg1Unreffed = cloneDeepUnref(arg1);\n    const arg2Unreffed = cloneDeepUnref(arg2);\n\n    if (isQueryKey(arg1Unreffed)) {\n      return super.resetQueries(arg1Unreffed, arg2Unreffed, cloneDeepUnref(arg3));\n    }\n\n    return super.resetQueries(arg1Unreffed, arg2Unreffed);\n  }\n\n  cancelQueries(arg1, arg2, arg3) {\n    const arg1Unreffed = cloneDeepUnref(arg1);\n    const arg2Unreffed = cloneDeepUnref(arg2);\n\n    if (isQueryKey(arg1Unreffed)) {\n      return super.cancelQueries(arg1Unreffed, arg2Unreffed, cloneDeepUnref(arg3));\n    }\n\n    return super.cancelQueries(arg1Unreffed, arg2Unreffed);\n  }\n\n  invalidateQueries(arg1, arg2, arg3) {\n    const arg1Unreffed = cloneDeepUnref(arg1);\n    const arg2Unreffed = cloneDeepUnref(arg2);\n\n    if (isQueryKey(arg1Unreffed)) {\n      return super.invalidateQueries(arg1Unreffed, arg2Unreffed, cloneDeepUnref(arg3));\n    }\n\n    return super.invalidateQueries(arg1Unreffed, arg2Unreffed);\n  }\n\n  refetchQueries(arg1, arg2, arg3) {\n    const arg1Unreffed = cloneDeepUnref(arg1);\n    const arg2Unreffed = cloneDeepUnref(arg2);\n\n    if (isQueryKey(arg1Unreffed)) {\n      return super.refetchQueries(arg1Unreffed, arg2Unreffed, cloneDeepUnref(arg3));\n    }\n\n    return super.refetchQueries(arg1Unreffed, arg2Unreffed);\n  }\n\n  fetchQuery(arg1, arg2, arg3) {\n    const arg1Unreffed = cloneDeepUnref(arg1);\n    const arg2Unreffed = cloneDeepUnref(arg2);\n\n    if (isQueryKey(arg1Unreffed)) {\n      return super.fetchQuery(arg1Unreffed, arg2Unreffed, cloneDeepUnref(arg3));\n    }\n\n    return super.fetchQuery(arg1Unreffed);\n  }\n\n  prefetchQuery(arg1, arg2, arg3) {\n    return super.prefetchQuery(cloneDeepUnref(arg1), cloneDeepUnref(arg2), cloneDeepUnref(arg3));\n  }\n\n  fetchInfiniteQuery(arg1, arg2, arg3) {\n    const arg1Unreffed = cloneDeepUnref(arg1);\n    const arg2Unreffed = cloneDeepUnref(arg2);\n\n    if (isQueryKey(arg1Unreffed)) {\n      return super.fetchInfiniteQuery(arg1Unreffed, arg2Unreffed, cloneDeepUnref(arg3));\n    }\n\n    return super.fetchInfiniteQuery(arg1Unreffed);\n  }\n\n  prefetchInfiniteQuery(arg1, arg2, arg3) {\n    return super.prefetchInfiniteQuery(cloneDeepUnref(arg1), cloneDeepUnref(arg2), cloneDeepUnref(arg3));\n  }\n\n  setDefaultOptions(options) {\n    super.setDefaultOptions(cloneDeepUnref(options));\n  }\n\n  setQueryDefaults(queryKey, options) {\n    super.setQueryDefaults(cloneDeepUnref(queryKey), cloneDeepUnref(options));\n  }\n\n  getQueryDefaults(queryKey) {\n    return super.getQueryDefaults(cloneDeepUnref(queryKey));\n  }\n\n  setMutationDefaults(mutationKey, options) {\n    super.setMutationDefaults(cloneDeepUnref(mutationKey), cloneDeepUnref(options));\n  }\n\n  getMutationDefaults(mutationKey) {\n    return super.getMutationDefaults(cloneDeepUnref(mutationKey));\n  }\n\n}\n\nexport { QueryClient };\n//# sourceMappingURL=queryClient.mjs.map\n","import { isVue2 } from 'vue-demi';\nimport { isServer } from '@tanstack/query-core';\nimport { QueryClient } from './queryClient.mjs';\nimport { getClientKey } from './utils.mjs';\nimport { setupDevtools } from './devtools/devtools.mjs';\n\nconst VueQueryPlugin = {\n  install: (app, options = {}) => {\n    const clientKey = getClientKey(options.queryClientKey);\n    let client;\n\n    if ('queryClient' in options && options.queryClient) {\n      client = options.queryClient;\n    } else {\n      if (options.contextSharing && typeof window !== 'undefined') {\n        if (!window.__VUE_QUERY_CONTEXT__) {\n          const clientConfig = 'queryClientConfig' in options ? options.queryClientConfig : undefined;\n          client = new QueryClient(clientConfig);\n          window.__VUE_QUERY_CONTEXT__ = client;\n        } else {\n          client = window.__VUE_QUERY_CONTEXT__;\n        }\n      } else {\n        const clientConfig = 'queryClientConfig' in options ? options.queryClientConfig : undefined;\n        client = new QueryClient(clientConfig);\n      }\n    }\n\n    if (!isServer) {\n      client.mount();\n    }\n\n    let persisterUnmount = () => {// noop\n    };\n\n    if (options.clientPersister) {\n      client.isRestoring.value = true;\n      const [unmount, promise] = options.clientPersister(client);\n      persisterUnmount = unmount;\n      promise.then(() => {\n        client.isRestoring.value = false;\n        options.clientPersisterOnSuccess == null ? void 0 : options.clientPersisterOnSuccess(client);\n      });\n    }\n\n    if (process.env.NODE_ENV !== 'production' && options.contextSharing) {\n      client.getLogger().error(\"The contextSharing option has been deprecated and will be removed in the next major version\");\n    }\n\n    const cleanup = () => {\n      client.unmount();\n      persisterUnmount();\n    };\n\n    if (app.onUnmount) {\n      app.onUnmount(cleanup);\n    } else {\n      const originalUnmount = app.unmount;\n\n      app.unmount = function vueQueryUnmount() {\n        cleanup();\n        originalUnmount();\n      };\n    }\n    /* istanbul ignore next */\n\n\n    if (isVue2) {\n      app.mixin({\n        beforeCreate() {\n          // HACK: taken from provide(): https://github.com/vuejs/composition-api/blob/master/src/apis/inject.ts#L30\n          if (!this._provided) {\n            const provideCache = {};\n            Object.defineProperty(this, '_provided', {\n              get: () => provideCache,\n              set: v => Object.assign(provideCache, v)\n            });\n          }\n\n          this._provided[clientKey] = client;\n\n          if (process.env.NODE_ENV === 'development') {\n            if (this === this.$root) {\n              setupDevtools(this, client);\n            }\n          }\n        }\n\n      });\n    } else {\n      app.provide(clientKey, client);\n\n      if (process.env.NODE_ENV === 'development') {\n        setupDevtools(app, client);\n      }\n    }\n  }\n};\n\nexport { VueQueryPlugin };\n//# sourceMappingURL=vueQueryPlugin.mjs.map\n","import { getCurrentScope, computed, reactive, watch, onScopeDispose, toRefs, readonly, unref } from 'vue-demi';\nimport { useQueryClient } from './useQueryClient.mjs';\nimport { updateState, shouldThrowError, isQueryKey, cloneDeepUnref } from './utils.mjs';\n\nfunction useBaseQuery(Observer, arg1, arg2 = {}, arg3 = {}) {\n  var _options$value$queryC;\n\n  if (process.env.NODE_ENV === 'development') {\n    if (!getCurrentScope()) {\n      console.warn('vue-query composables like \"useQuery()\" should only be used inside a \"setup()\" function or a running effect scope. They might otherwise lead to memory leaks.');\n    }\n  }\n\n  const options = computed(() => parseQueryArgs(arg1, arg2, arg3));\n  const queryClient = (_options$value$queryC = options.value.queryClient) != null ? _options$value$queryC : useQueryClient(options.value.queryClientKey);\n  const defaultedOptions = computed(() => {\n    const defaulted = queryClient.defaultQueryOptions(options.value);\n    defaulted._optimisticResults = queryClient.isRestoring.value ? 'isRestoring' : 'optimistic';\n    return defaulted;\n  });\n  const observer = new Observer(queryClient, defaultedOptions.value);\n  const state = reactive(observer.getCurrentResult());\n\n  let unsubscribe = () => {// noop\n  };\n\n  watch(queryClient.isRestoring, isRestoring => {\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n    if (!isRestoring) {\n      unsubscribe();\n      unsubscribe = observer.subscribe(result => {\n        updateState(state, result);\n      });\n    }\n  }, {\n    immediate: true\n  });\n\n  const updater = () => {\n    observer.setOptions(defaultedOptions.value);\n    updateState(state, observer.getCurrentResult());\n  };\n\n  watch(defaultedOptions, updater);\n  onScopeDispose(() => {\n    unsubscribe();\n  }); // fix #5910\n\n  const refetch = (...args) => {\n    updater();\n    return state.refetch(...args);\n  };\n\n  const suspense = () => {\n    return new Promise((resolve, reject) => {\n      let stopWatch = () => {//noop\n      };\n\n      const run = () => {\n        if (defaultedOptions.value.enabled !== false) {\n          const optimisticResult = observer.getOptimisticResult(defaultedOptions.value);\n\n          if (optimisticResult.isStale) {\n            stopWatch();\n            observer.fetchOptimistic(defaultedOptions.value).then(resolve, reject);\n          } else {\n            stopWatch();\n            resolve(optimisticResult);\n          }\n        }\n      };\n\n      run();\n      stopWatch = watch(defaultedOptions, run);\n    });\n  }; // Handle error boundary\n\n\n  watch(() => state.error, error => {\n    if (state.isError && !state.isFetching && shouldThrowError(defaultedOptions.value.useErrorBoundary, [error, observer.getCurrentQuery()])) {\n      throw error;\n    }\n  });\n  const object = toRefs(readonly(state));\n\n  for (const key in state) {\n    if (typeof state[key] === 'function') {\n      object[key] = state[key];\n    }\n  }\n\n  object.suspense = suspense;\n  object.refetch = refetch;\n  return object;\n}\nfunction parseQueryArgs(arg1, arg2 = {}, arg3 = {}) {\n  const plainArg1 = unref(arg1);\n  const plainArg2 = unref(arg2);\n  const plainArg3 = unref(arg3);\n  let options = plainArg1;\n\n  if (!isQueryKey(plainArg1)) {\n    options = plainArg1;\n  } else if (typeof plainArg2 === 'function') {\n    options = { ...plainArg3,\n      queryKey: plainArg1,\n      queryFn: plainArg2\n    };\n  } else {\n    options = { ...plainArg2,\n      queryKey: plainArg1\n    };\n  }\n\n  const clondedOptions = cloneDeepUnref(options);\n\n  if (typeof clondedOptions.enabled === 'function') {\n    clondedOptions.enabled = clondedOptions.enabled();\n  }\n\n  return clondedOptions;\n}\n\nexport { parseQueryArgs, useBaseQuery };\n//# sourceMappingURL=useBaseQuery.mjs.map\n","import { QueryObserver } from '@tanstack/query-core';\nimport { useBaseQuery } from './useBaseQuery.mjs';\n\nfunction useQuery(arg1, arg2, arg3) {\n  const result = useBaseQuery(QueryObserver, arg1, arg2, arg3);\n  return result;\n}\n\nexport { useQuery };\n//# sourceMappingURL=useQuery.mjs.map\n","import { InfiniteQueryObserver } from '@tanstack/query-core';\nimport { useBaseQuery } from './useBaseQuery.mjs';\n\nfunction useInfiniteQuery(arg1, arg2, arg3) {\n  const result = useBaseQuery(InfiniteQueryObserver, arg1, arg2, arg3);\n  return result;\n}\n\nexport { useInfiniteQuery };\n//# sourceMappingURL=useInfiniteQuery.mjs.map\n","import { getCurrentScope, computed, reactive, watch, onScopeDispose, toRefs, readonly, unref } from 'vue-demi';\nimport { MutationObserver } from '@tanstack/query-core';\nimport { updateState, shouldThrowError, isMutationKey, cloneDeepUnref } from './utils.mjs';\nimport { useQueryClient } from './useQueryClient.mjs';\n\nfunction useMutation(arg1, arg2, arg3) {\n  var _options$value$queryC;\n\n  if (process.env.NODE_ENV === 'development') {\n    if (!getCurrentScope()) {\n      console.warn('vue-query composables like \"useQuery()\" should only be used inside a \"setup()\" function or a running effect scope. They might otherwise lead to memory leaks.');\n    }\n  }\n\n  const options = computed(() => {\n    return parseMutationArgs(arg1, arg2, arg3);\n  });\n  const queryClient = (_options$value$queryC = options.value.queryClient) != null ? _options$value$queryC : useQueryClient(options.value.queryClientKey);\n  const observer = new MutationObserver(queryClient, queryClient.defaultMutationOptions(options.value));\n  const state = reactive(observer.getCurrentResult());\n  const unsubscribe = observer.subscribe(result => {\n    updateState(state, result);\n  });\n\n  const mutate = (variables, mutateOptions) => {\n    observer.mutate(variables, mutateOptions).catch(() => {// This is intentional\n    });\n  };\n\n  watch(options, () => {\n    observer.setOptions(queryClient.defaultMutationOptions(options.value));\n  });\n  onScopeDispose(() => {\n    unsubscribe();\n  });\n  const resultRefs = toRefs(readonly(state));\n  watch(() => state.error, error => {\n    if (error && shouldThrowError(options.value.useErrorBoundary, [error])) {\n      throw error;\n    }\n  });\n  return { ...resultRefs,\n    mutate,\n    mutateAsync: state.mutate,\n    reset: state.reset\n  };\n}\nfunction parseMutationArgs(arg1, arg2, arg3) {\n  const plainArg1 = unref(arg1);\n  const plainArg2 = unref(arg2);\n  let options = plainArg1;\n\n  if (isMutationKey(plainArg1)) {\n    if (typeof plainArg2 === 'function') {\n      const plainArg3 = unref(arg3);\n      options = { ...plainArg3,\n        mutationKey: plainArg1,\n        mutationFn: plainArg2\n      };\n    } else {\n      options = { ...plainArg2,\n        mutationKey: plainArg1\n      };\n    }\n  }\n\n  if (typeof plainArg1 === 'function') {\n    options = { ...plainArg2,\n      mutationFn: plainArg1\n    };\n  }\n\n  return cloneDeepUnref(options);\n}\n\nexport { parseMutationArgs, useMutation };\n//# sourceMappingURL=useMutation.mjs.map\n","import axiosClient from \"./axiosClient\";\r\nimport { useQueryClient, useQuery, useMutation } from \"@tanstack/vue-query\";\r\n\r\nconst QUERY_KEY = [\"cart\"];\r\n\r\nfunction selectCartData(cart) {\r\n  return {\r\n    ...cart,\r\n    totalItemsCount: cart.items.reduce((count, item) => count + item.quantity, 0)\r\n  };\r\n}\r\n\r\nexport function useCartQuery(options) {\r\n  return useQuery({\r\n    ...(options || {}),\r\n    queryKey: QUERY_KEY,\r\n    queryFn: () => axiosClient.get(\"/cart\"),\r\n    select: selectCartData,\r\n    refetchOnWindowFocus: false\r\n  });\r\n}\r\n\r\nexport function useAddCartItemsMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (items) => axiosClient.post(\"/cart/items\", items),\r\n    select: selectCartData,\r\n    onSuccess: (cart) => queryClient.setQueryData(QUERY_KEY, cart)\r\n  });\r\n}\r\n\r\nexport function useUpdateCartItemMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (item) => axiosClient.put(`/cart/items/${encodeURIComponent(item.id)}`, item),\r\n    select: selectCartData,\r\n    onSuccess: (cart) => queryClient.setQueryData(QUERY_KEY, cart)\r\n  });\r\n}\r\n\r\nexport function useRemoveCartItemMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (item) => axiosClient.delete(`/cart/items/${encodeURIComponent(item.id)}`),\r\n    select: selectCartData,\r\n    onSuccess: (cart) => queryClient.setQueryData(QUERY_KEY, cart)\r\n  });\r\n}\r\n","import axiosClient from \"./axiosClient\";\r\nimport { useQuery, useQueryClient, useMutation } from \"@tanstack/vue-query\";\r\n\r\nconst QUERY_KEY = [\"saveforlater\"];\r\nconst QUERY_KEY_CART = [\"cart\"];\r\n\r\nexport const useSaveForLaterQuery = (options) => {\r\n  return useQuery({\r\n    ...(options || {}),\r\n    queryKey: QUERY_KEY,\r\n    queryFn: () => axiosClient.get(\"/saveforlater\"),\r\n    select: (saveForLaterResponse) => saveForLaterResponse.saveForLaterItems,\r\n    refetchOnWindowFocus: false\r\n  });\r\n};\r\nexport function useAddSaveForLaterItemsMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (cartItem) => {\r\n      const saveForLaterItem = [{ skuNumber: cartItem.sku.skuNumber, quantity: cartItem.quantity, id: cartItem.id, category: cartItem.category }];\r\n      return axiosClient.post(\"/saveforlater\", saveForLaterItem);\r\n    },\r\n    onSuccess: (saveForLaterItems) => {\r\n      queryClient.setQueriesData(QUERY_KEY_CART, saveForLaterItems.cart);\r\n      queryClient.setQueryData(QUERY_KEY, saveForLaterItems.savedForLaterItems);\r\n    }\r\n  });\r\n}\r\nexport function useDeleteSaveForItemMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (item) => axiosClient.delete(`/saveforlater/${encodeURIComponent(item.id)}`),\r\n    onSuccess: (_data, variables) => {\r\n      const { id: saveForLaterId } = variables;\r\n      queryClient.setQueriesData(QUERY_KEY, (saveForLaterItemsCache) => {\r\n        let deleteSFLItem = saveForLaterItemsCache.saveForLaterItems.filter((sflItem) => sflItem.id !== saveForLaterId);\r\n        return {\r\n          saveForLaterItems: deleteSFLItem\r\n        };\r\n      });\r\n    }\r\n  });\r\n}\r\n\r\nexport function useAddToCartMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (item) => axiosClient.post(\"/saveforlater/addtocart\", item),\r\n    onSuccess: (sfl_cartItem, queryPayload) => {\r\n      queryClient.setQueryData(QUERY_KEY_CART, sfl_cartItem);\r\n      queryClient.setQueriesData(QUERY_KEY, (sfl_items) => {\r\n        const updated_sflItems = sfl_items.saveForLaterItems.filter((item) => {\r\n          const cartItemToRemove = queryPayload.find((payload) => payload.id === item.id);\r\n          if (cartItemToRemove) return false;\r\n          return true;\r\n        });\r\n        return {\r\n          saveForLaterItems: updated_sflItems\r\n        };\r\n      });\r\n    }\r\n  });\r\n}\r\n","import * as Vue from 'vue'\n\nvar isVue2 = false\nvar isVue3 = true\nvar Vue2 = undefined\n\nfunction install() {}\n\nexport function set(target, key, val) {\n  if (Array.isArray(target)) {\n    target.length = Math.max(target.length, key)\n    target.splice(key, 1, val)\n    return val\n  }\n  target[key] = val\n  return val\n}\n\nexport function del(target, key) {\n  if (Array.isArray(target)) {\n    target.splice(key, 1)\n    return\n  }\n  delete target[key]\n}\n\nexport * from 'vue'\nexport {\n  Vue,\n  Vue2,\n  isVue2,\n  isVue3,\n  install,\n}\n","/*!\n * pinia v2.1.7\n * (c) 2023 Eduardo San Martin Morote\n * @license MIT\n */\nimport { hasInjectionContext, inject, toRaw, watch, unref, markRaw, effectScope, ref, isVue2, isRef, isReactive, set, getCurrentScope, onScopeDispose, getCurrentInstance, reactive, toRef, del, nextTick, computed, toRefs } from 'vue-demi';\nimport { setupDevtoolsPlugin } from '@vue/devtools-api';\n\n/**\n * setActivePinia must be called to handle SSR at the top of functions like\n * `fetch`, `setup`, `serverPrefetch` and others\n */\nlet activePinia;\n/**\n * Sets or unsets the active pinia. Used in SSR and internally when calling\n * actions and getters\n *\n * @param pinia - Pinia instance\n */\n// @ts-expect-error: cannot constrain the type of the return\nconst setActivePinia = (pinia) => (activePinia = pinia);\n/**\n * Get the currently active pinia if there is any.\n */\nconst getActivePinia = () => (hasInjectionContext() && inject(piniaSymbol)) || activePinia;\nconst piniaSymbol = ((process.env.NODE_ENV !== 'production') ? Symbol('pinia') : /* istanbul ignore next */ Symbol());\n\nfunction isPlainObject(\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\no) {\n    return (o &&\n        typeof o === 'object' &&\n        Object.prototype.toString.call(o) === '[object Object]' &&\n        typeof o.toJSON !== 'function');\n}\n// type DeepReadonly<T> = { readonly [P in keyof T]: DeepReadonly<T[P]> }\n// TODO: can we change these to numbers?\n/**\n * Possible types for SubscriptionCallback\n */\nvar MutationType;\n(function (MutationType) {\n    /**\n     * Direct mutation of the state:\n     *\n     * - `store.name = 'new name'`\n     * - `store.$state.name = 'new name'`\n     * - `store.list.push('new item')`\n     */\n    MutationType[\"direct\"] = \"direct\";\n    /**\n     * Mutated the state with `$patch` and an object\n     *\n     * - `store.$patch({ name: 'newName' })`\n     */\n    MutationType[\"patchObject\"] = \"patch object\";\n    /**\n     * Mutated the state with `$patch` and a function\n     *\n     * - `store.$patch(state => state.name = 'newName')`\n     */\n    MutationType[\"patchFunction\"] = \"patch function\";\n    // maybe reset? for $state = {} and $reset\n})(MutationType || (MutationType = {}));\n\nconst IS_CLIENT = typeof window !== 'undefined';\n/**\n * Should we add the devtools plugins.\n * - only if dev mode or forced through the prod devtools flag\n * - not in test\n * - only if window exists (could change in the future)\n */\nconst USE_DEVTOOLS = ((process.env.NODE_ENV !== 'production') || (typeof __VUE_PROD_DEVTOOLS__ !== 'undefined' && __VUE_PROD_DEVTOOLS__)) && !(process.env.NODE_ENV === 'test') && IS_CLIENT;\n\n/*\n * FileSaver.js A saveAs() FileSaver implementation.\n *\n * Originally by Eli Grey, adapted as an ESM module by Eduardo San Martin\n * Morote.\n *\n * License : MIT\n */\n// The one and only way of getting global scope in all environments\n// https://stackoverflow.com/q/3277182/1008999\nconst _global = /*#__PURE__*/ (() => typeof window === 'object' && window.window === window\n    ? window\n    : typeof self === 'object' && self.self === self\n        ? self\n        : typeof global === 'object' && global.global === global\n            ? global\n            : typeof globalThis === 'object'\n                ? globalThis\n                : { HTMLElement: null })();\nfunction bom(blob, { autoBom = false } = {}) {\n    // prepend BOM for UTF-8 XML and text/* types (including HTML)\n    // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n    if (autoBom &&\n        /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n        return new Blob([String.fromCharCode(0xfeff), blob], { type: blob.type });\n    }\n    return blob;\n}\nfunction download(url, name, opts) {\n    const xhr = new XMLHttpRequest();\n    xhr.open('GET', url);\n    xhr.responseType = 'blob';\n    xhr.onload = function () {\n        saveAs(xhr.response, name, opts);\n    };\n    xhr.onerror = function () {\n        console.error('could not download file');\n    };\n    xhr.send();\n}\nfunction corsEnabled(url) {\n    const xhr = new XMLHttpRequest();\n    // use sync to avoid popup blocker\n    xhr.open('HEAD', url, false);\n    try {\n        xhr.send();\n    }\n    catch (e) { }\n    return xhr.status >= 200 && xhr.status <= 299;\n}\n// `a.click()` doesn't work for all browsers (#465)\nfunction click(node) {\n    try {\n        node.dispatchEvent(new MouseEvent('click'));\n    }\n    catch (e) {\n        const evt = document.createEvent('MouseEvents');\n        evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);\n        node.dispatchEvent(evt);\n    }\n}\nconst _navigator = \n typeof navigator === 'object' ? navigator : { userAgent: '' };\n// Detect WebView inside a native macOS app by ruling out all browsers\n// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too\n// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos\nconst isMacOSWebView = /*#__PURE__*/ (() => /Macintosh/.test(_navigator.userAgent) &&\n    /AppleWebKit/.test(_navigator.userAgent) &&\n    !/Safari/.test(_navigator.userAgent))();\nconst saveAs = !IS_CLIENT\n    ? () => { } // noop\n    : // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView or mini program\n        typeof HTMLAnchorElement !== 'undefined' &&\n            'download' in HTMLAnchorElement.prototype &&\n            !isMacOSWebView\n            ? downloadSaveAs\n            : // Use msSaveOrOpenBlob as a second approach\n                'msSaveOrOpenBlob' in _navigator\n                    ? msSaveAs\n                    : // Fallback to using FileReader and a popup\n                        fileSaverSaveAs;\nfunction downloadSaveAs(blob, name = 'download', opts) {\n    const a = document.createElement('a');\n    a.download = name;\n    a.rel = 'noopener'; // tabnabbing\n    // TODO: detect chrome extensions & packaged apps\n    // a.target = '_blank'\n    if (typeof blob === 'string') {\n        // Support regular links\n        a.href = blob;\n        if (a.origin !== location.origin) {\n            if (corsEnabled(a.href)) {\n                download(blob, name, opts);\n            }\n            else {\n                a.target = '_blank';\n                click(a);\n            }\n        }\n        else {\n            click(a);\n        }\n    }\n    else {\n        // Support blobs\n        a.href = URL.createObjectURL(blob);\n        setTimeout(function () {\n            URL.revokeObjectURL(a.href);\n        }, 4e4); // 40s\n        setTimeout(function () {\n            click(a);\n        }, 0);\n    }\n}\nfunction msSaveAs(blob, name = 'download', opts) {\n    if (typeof blob === 'string') {\n        if (corsEnabled(blob)) {\n            download(blob, name, opts);\n        }\n        else {\n            const a = document.createElement('a');\n            a.href = blob;\n            a.target = '_blank';\n            setTimeout(function () {\n                click(a);\n            });\n        }\n    }\n    else {\n        // @ts-ignore: works on windows\n        navigator.msSaveOrOpenBlob(bom(blob, opts), name);\n    }\n}\nfunction fileSaverSaveAs(blob, name, opts, popup) {\n    // Open a popup immediately do go around popup blocker\n    // Mostly only available on user interaction and the fileReader is async so...\n    popup = popup || open('', '_blank');\n    if (popup) {\n        popup.document.title = popup.document.body.innerText = 'downloading...';\n    }\n    if (typeof blob === 'string')\n        return download(blob, name, opts);\n    const force = blob.type === 'application/octet-stream';\n    const isSafari = /constructor/i.test(String(_global.HTMLElement)) || 'safari' in _global;\n    const isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent);\n    if ((isChromeIOS || (force && isSafari) || isMacOSWebView) &&\n        typeof FileReader !== 'undefined') {\n        // Safari doesn't allow downloading of blob URLs\n        const reader = new FileReader();\n        reader.onloadend = function () {\n            let url = reader.result;\n            if (typeof url !== 'string') {\n                popup = null;\n                throw new Error('Wrong reader.result type');\n            }\n            url = isChromeIOS\n                ? url\n                : url.replace(/^data:[^;]*;/, 'data:attachment/file;');\n            if (popup) {\n                popup.location.href = url;\n            }\n            else {\n                location.assign(url);\n            }\n            popup = null; // reverse-tabnabbing #460\n        };\n        reader.readAsDataURL(blob);\n    }\n    else {\n        const url = URL.createObjectURL(blob);\n        if (popup)\n            popup.location.assign(url);\n        else\n            location.href = url;\n        popup = null; // reverse-tabnabbing #460\n        setTimeout(function () {\n            URL.revokeObjectURL(url);\n        }, 4e4); // 40s\n    }\n}\n\n/**\n * Shows a toast or console.log\n *\n * @param message - message to log\n * @param type - different color of the tooltip\n */\nfunction toastMessage(message, type) {\n    const piniaMessage = '🍍 ' + message;\n    if (typeof __VUE_DEVTOOLS_TOAST__ === 'function') {\n        // No longer available :(\n        __VUE_DEVTOOLS_TOAST__(piniaMessage, type);\n    }\n    else if (type === 'error') {\n        console.error(piniaMessage);\n    }\n    else if (type === 'warn') {\n        console.warn(piniaMessage);\n    }\n    else {\n        console.log(piniaMessage);\n    }\n}\nfunction isPinia(o) {\n    return '_a' in o && 'install' in o;\n}\n\n/**\n * This file contain devtools actions, they are not Pinia actions.\n */\n// ---\nfunction checkClipboardAccess() {\n    if (!('clipboard' in navigator)) {\n        toastMessage(`Your browser doesn't support the Clipboard API`, 'error');\n        return true;\n    }\n}\nfunction checkNotFocusedError(error) {\n    if (error instanceof Error &&\n        error.message.toLowerCase().includes('document is not focused')) {\n        toastMessage('You need to activate the \"Emulate a focused page\" setting in the \"Rendering\" panel of devtools.', 'warn');\n        return true;\n    }\n    return false;\n}\nasync function actionGlobalCopyState(pinia) {\n    if (checkClipboardAccess())\n        return;\n    try {\n        await navigator.clipboard.writeText(JSON.stringify(pinia.state.value));\n        toastMessage('Global state copied to clipboard.');\n    }\n    catch (error) {\n        if (checkNotFocusedError(error))\n            return;\n        toastMessage(`Failed to serialize the state. Check the console for more details.`, 'error');\n        console.error(error);\n    }\n}\nasync function actionGlobalPasteState(pinia) {\n    if (checkClipboardAccess())\n        return;\n    try {\n        loadStoresState(pinia, JSON.parse(await navigator.clipboard.readText()));\n        toastMessage('Global state pasted from clipboard.');\n    }\n    catch (error) {\n        if (checkNotFocusedError(error))\n            return;\n        toastMessage(`Failed to deserialize the state from clipboard. Check the console for more details.`, 'error');\n        console.error(error);\n    }\n}\nasync function actionGlobalSaveState(pinia) {\n    try {\n        saveAs(new Blob([JSON.stringify(pinia.state.value)], {\n            type: 'text/plain;charset=utf-8',\n        }), 'pinia-state.json');\n    }\n    catch (error) {\n        toastMessage(`Failed to export the state as JSON. Check the console for more details.`, 'error');\n        console.error(error);\n    }\n}\nlet fileInput;\nfunction getFileOpener() {\n    if (!fileInput) {\n        fileInput = document.createElement('input');\n        fileInput.type = 'file';\n        fileInput.accept = '.json';\n    }\n    function openFile() {\n        return new Promise((resolve, reject) => {\n            fileInput.onchange = async () => {\n                const files = fileInput.files;\n                if (!files)\n                    return resolve(null);\n                const file = files.item(0);\n                if (!file)\n                    return resolve(null);\n                return resolve({ text: await file.text(), file });\n            };\n            // @ts-ignore: TODO: changed from 4.3 to 4.4\n            fileInput.oncancel = () => resolve(null);\n            fileInput.onerror = reject;\n            fileInput.click();\n        });\n    }\n    return openFile;\n}\nasync function actionGlobalOpenStateFile(pinia) {\n    try {\n        const open = getFileOpener();\n        const result = await open();\n        if (!result)\n            return;\n        const { text, file } = result;\n        loadStoresState(pinia, JSON.parse(text));\n        toastMessage(`Global state imported from \"${file.name}\".`);\n    }\n    catch (error) {\n        toastMessage(`Failed to import the state from JSON. Check the console for more details.`, 'error');\n        console.error(error);\n    }\n}\nfunction loadStoresState(pinia, state) {\n    for (const key in state) {\n        const storeState = pinia.state.value[key];\n        // store is already instantiated, patch it\n        if (storeState) {\n            Object.assign(storeState, state[key]);\n        }\n        else {\n            // store is not instantiated, set the initial state\n            pinia.state.value[key] = state[key];\n        }\n    }\n}\n\nfunction formatDisplay(display) {\n    return {\n        _custom: {\n            display,\n        },\n    };\n}\nconst PINIA_ROOT_LABEL = '🍍 Pinia (root)';\nconst PINIA_ROOT_ID = '_root';\nfunction formatStoreForInspectorTree(store) {\n    return isPinia(store)\n        ? {\n            id: PINIA_ROOT_ID,\n            label: PINIA_ROOT_LABEL,\n        }\n        : {\n            id: store.$id,\n            label: store.$id,\n        };\n}\nfunction formatStoreForInspectorState(store) {\n    if (isPinia(store)) {\n        const storeNames = Array.from(store._s.keys());\n        const storeMap = store._s;\n        const state = {\n            state: storeNames.map((storeId) => ({\n                editable: true,\n                key: storeId,\n                value: store.state.value[storeId],\n            })),\n            getters: storeNames\n                .filter((id) => storeMap.get(id)._getters)\n                .map((id) => {\n                const store = storeMap.get(id);\n                return {\n                    editable: false,\n                    key: id,\n                    value: store._getters.reduce((getters, key) => {\n                        getters[key] = store[key];\n                        return getters;\n                    }, {}),\n                };\n            }),\n        };\n        return state;\n    }\n    const state = {\n        state: Object.keys(store.$state).map((key) => ({\n            editable: true,\n            key,\n            value: store.$state[key],\n        })),\n    };\n    // avoid adding empty getters\n    if (store._getters && store._getters.length) {\n        state.getters = store._getters.map((getterName) => ({\n            editable: false,\n            key: getterName,\n            value: store[getterName],\n        }));\n    }\n    if (store._customProperties.size) {\n        state.customProperties = Array.from(store._customProperties).map((key) => ({\n            editable: true,\n            key,\n            value: store[key],\n        }));\n    }\n    return state;\n}\nfunction formatEventData(events) {\n    if (!events)\n        return {};\n    if (Array.isArray(events)) {\n        // TODO: handle add and delete for arrays and objects\n        return events.reduce((data, event) => {\n            data.keys.push(event.key);\n            data.operations.push(event.type);\n            data.oldValue[event.key] = event.oldValue;\n            data.newValue[event.key] = event.newValue;\n            return data;\n        }, {\n            oldValue: {},\n            keys: [],\n            operations: [],\n            newValue: {},\n        });\n    }\n    else {\n        return {\n            operation: formatDisplay(events.type),\n            key: formatDisplay(events.key),\n            oldValue: events.oldValue,\n            newValue: events.newValue,\n        };\n    }\n}\nfunction formatMutationType(type) {\n    switch (type) {\n        case MutationType.direct:\n            return 'mutation';\n        case MutationType.patchFunction:\n            return '$patch';\n        case MutationType.patchObject:\n            return '$patch';\n        default:\n            return 'unknown';\n    }\n}\n\n// timeline can be paused when directly changing the state\nlet isTimelineActive = true;\nconst componentStateTypes = [];\nconst MUTATIONS_LAYER_ID = 'pinia:mutations';\nconst INSPECTOR_ID = 'pinia';\nconst { assign: assign$1 } = Object;\n/**\n * Gets the displayed name of a store in devtools\n *\n * @param id - id of the store\n * @returns a formatted string\n */\nconst getStoreType = (id) => '🍍 ' + id;\n/**\n * Add the pinia plugin without any store. Allows displaying a Pinia plugin tab\n * as soon as it is added to the application.\n *\n * @param app - Vue application\n * @param pinia - pinia instance\n */\nfunction registerPiniaDevtools(app, pinia) {\n    setupDevtoolsPlugin({\n        id: 'dev.esm.pinia',\n        label: 'Pinia 🍍',\n        logo: 'https://pinia.vuejs.org/logo.svg',\n        packageName: 'pinia',\n        homepage: 'https://pinia.vuejs.org',\n        componentStateTypes,\n        app,\n    }, (api) => {\n        if (typeof api.now !== 'function') {\n            toastMessage('You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.');\n        }\n        api.addTimelineLayer({\n            id: MUTATIONS_LAYER_ID,\n            label: `Pinia 🍍`,\n            color: 0xe5df88,\n        });\n        api.addInspector({\n            id: INSPECTOR_ID,\n            label: 'Pinia 🍍',\n            icon: 'storage',\n            treeFilterPlaceholder: 'Search stores',\n            actions: [\n                {\n                    icon: 'content_copy',\n                    action: () => {\n                        actionGlobalCopyState(pinia);\n                    },\n                    tooltip: 'Serialize and copy the state',\n                },\n                {\n                    icon: 'content_paste',\n                    action: async () => {\n                        await actionGlobalPasteState(pinia);\n                        api.sendInspectorTree(INSPECTOR_ID);\n                        api.sendInspectorState(INSPECTOR_ID);\n                    },\n                    tooltip: 'Replace the state with the content of your clipboard',\n                },\n                {\n                    icon: 'save',\n                    action: () => {\n                        actionGlobalSaveState(pinia);\n                    },\n                    tooltip: 'Save the state as a JSON file',\n                },\n                {\n                    icon: 'folder_open',\n                    action: async () => {\n                        await actionGlobalOpenStateFile(pinia);\n                        api.sendInspectorTree(INSPECTOR_ID);\n                        api.sendInspectorState(INSPECTOR_ID);\n                    },\n                    tooltip: 'Import the state from a JSON file',\n                },\n            ],\n            nodeActions: [\n                {\n                    icon: 'restore',\n                    tooltip: 'Reset the state (with \"$reset\")',\n                    action: (nodeId) => {\n                        const store = pinia._s.get(nodeId);\n                        if (!store) {\n                            toastMessage(`Cannot reset \"${nodeId}\" store because it wasn't found.`, 'warn');\n                        }\n                        else if (typeof store.$reset !== 'function') {\n                            toastMessage(`Cannot reset \"${nodeId}\" store because it doesn't have a \"$reset\" method implemented.`, 'warn');\n                        }\n                        else {\n                            store.$reset();\n                            toastMessage(`Store \"${nodeId}\" reset.`);\n                        }\n                    },\n                },\n            ],\n        });\n        api.on.inspectComponent((payload, ctx) => {\n            const proxy = (payload.componentInstance &&\n                payload.componentInstance.proxy);\n            if (proxy && proxy._pStores) {\n                const piniaStores = payload.componentInstance.proxy._pStores;\n                Object.values(piniaStores).forEach((store) => {\n                    payload.instanceData.state.push({\n                        type: getStoreType(store.$id),\n                        key: 'state',\n                        editable: true,\n                        value: store._isOptionsAPI\n                            ? {\n                                _custom: {\n                                    value: toRaw(store.$state),\n                                    actions: [\n                                        {\n                                            icon: 'restore',\n                                            tooltip: 'Reset the state of this store',\n                                            action: () => store.$reset(),\n                                        },\n                                    ],\n                                },\n                            }\n                            : // NOTE: workaround to unwrap transferred refs\n                                Object.keys(store.$state).reduce((state, key) => {\n                                    state[key] = store.$state[key];\n                                    return state;\n                                }, {}),\n                    });\n                    if (store._getters && store._getters.length) {\n                        payload.instanceData.state.push({\n                            type: getStoreType(store.$id),\n                            key: 'getters',\n                            editable: false,\n                            value: store._getters.reduce((getters, key) => {\n                                try {\n                                    getters[key] = store[key];\n                                }\n                                catch (error) {\n                                    // @ts-expect-error: we just want to show it in devtools\n                                    getters[key] = error;\n                                }\n                                return getters;\n                            }, {}),\n                        });\n                    }\n                });\n            }\n        });\n        api.on.getInspectorTree((payload) => {\n            if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n                let stores = [pinia];\n                stores = stores.concat(Array.from(pinia._s.values()));\n                payload.rootNodes = (payload.filter\n                    ? stores.filter((store) => '$id' in store\n                        ? store.$id\n                            .toLowerCase()\n                            .includes(payload.filter.toLowerCase())\n                        : PINIA_ROOT_LABEL.toLowerCase().includes(payload.filter.toLowerCase()))\n                    : stores).map(formatStoreForInspectorTree);\n            }\n        });\n        api.on.getInspectorState((payload) => {\n            if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n                const inspectedStore = payload.nodeId === PINIA_ROOT_ID\n                    ? pinia\n                    : pinia._s.get(payload.nodeId);\n                if (!inspectedStore) {\n                    // this could be the selected store restored for a different project\n                    // so it's better not to say anything here\n                    return;\n                }\n                if (inspectedStore) {\n                    payload.state = formatStoreForInspectorState(inspectedStore);\n                }\n            }\n        });\n        api.on.editInspectorState((payload, ctx) => {\n            if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n                const inspectedStore = payload.nodeId === PINIA_ROOT_ID\n                    ? pinia\n                    : pinia._s.get(payload.nodeId);\n                if (!inspectedStore) {\n                    return toastMessage(`store \"${payload.nodeId}\" not found`, 'error');\n                }\n                const { path } = payload;\n                if (!isPinia(inspectedStore)) {\n                    // access only the state\n                    if (path.length !== 1 ||\n                        !inspectedStore._customProperties.has(path[0]) ||\n                        path[0] in inspectedStore.$state) {\n                        path.unshift('$state');\n                    }\n                }\n                else {\n                    // Root access, we can omit the `.value` because the devtools API does it for us\n                    path.unshift('state');\n                }\n                isTimelineActive = false;\n                payload.set(inspectedStore, path, payload.state.value);\n                isTimelineActive = true;\n            }\n        });\n        api.on.editComponentState((payload) => {\n            if (payload.type.startsWith('🍍')) {\n                const storeId = payload.type.replace(/^🍍\\s*/, '');\n                const store = pinia._s.get(storeId);\n                if (!store) {\n                    return toastMessage(`store \"${storeId}\" not found`, 'error');\n                }\n                const { path } = payload;\n                if (path[0] !== 'state') {\n                    return toastMessage(`Invalid path for store \"${storeId}\":\\n${path}\\nOnly state can be modified.`);\n                }\n                // rewrite the first entry to be able to directly set the state as\n                // well as any other path\n                path[0] = '$state';\n                isTimelineActive = false;\n                payload.set(store, path, payload.state.value);\n                isTimelineActive = true;\n            }\n        });\n    });\n}\nfunction addStoreToDevtools(app, store) {\n    if (!componentStateTypes.includes(getStoreType(store.$id))) {\n        componentStateTypes.push(getStoreType(store.$id));\n    }\n    setupDevtoolsPlugin({\n        id: 'dev.esm.pinia',\n        label: 'Pinia 🍍',\n        logo: 'https://pinia.vuejs.org/logo.svg',\n        packageName: 'pinia',\n        homepage: 'https://pinia.vuejs.org',\n        componentStateTypes,\n        app,\n        settings: {\n            logStoreChanges: {\n                label: 'Notify about new/deleted stores',\n                type: 'boolean',\n                defaultValue: true,\n            },\n            // useEmojis: {\n            //   label: 'Use emojis in messages ⚡️',\n            //   type: 'boolean',\n            //   defaultValue: true,\n            // },\n        },\n    }, (api) => {\n        // gracefully handle errors\n        const now = typeof api.now === 'function' ? api.now.bind(api) : Date.now;\n        store.$onAction(({ after, onError, name, args }) => {\n            const groupId = runningActionId++;\n            api.addTimelineEvent({\n                layerId: MUTATIONS_LAYER_ID,\n                event: {\n                    time: now(),\n                    title: '🛫 ' + name,\n                    subtitle: 'start',\n                    data: {\n                        store: formatDisplay(store.$id),\n                        action: formatDisplay(name),\n                        args,\n                    },\n                    groupId,\n                },\n            });\n            after((result) => {\n                activeAction = undefined;\n                api.addTimelineEvent({\n                    layerId: MUTATIONS_LAYER_ID,\n                    event: {\n                        time: now(),\n                        title: '🛬 ' + name,\n                        subtitle: 'end',\n                        data: {\n                            store: formatDisplay(store.$id),\n                            action: formatDisplay(name),\n                            args,\n                            result,\n                        },\n                        groupId,\n                    },\n                });\n            });\n            onError((error) => {\n                activeAction = undefined;\n                api.addTimelineEvent({\n                    layerId: MUTATIONS_LAYER_ID,\n                    event: {\n                        time: now(),\n                        logType: 'error',\n                        title: '💥 ' + name,\n                        subtitle: 'end',\n                        data: {\n                            store: formatDisplay(store.$id),\n                            action: formatDisplay(name),\n                            args,\n                            error,\n                        },\n                        groupId,\n                    },\n                });\n            });\n        }, true);\n        store._customProperties.forEach((name) => {\n            watch(() => unref(store[name]), (newValue, oldValue) => {\n                api.notifyComponentUpdate();\n                api.sendInspectorState(INSPECTOR_ID);\n                if (isTimelineActive) {\n                    api.addTimelineEvent({\n                        layerId: MUTATIONS_LAYER_ID,\n                        event: {\n                            time: now(),\n                            title: 'Change',\n                            subtitle: name,\n                            data: {\n                                newValue,\n                                oldValue,\n                            },\n                            groupId: activeAction,\n                        },\n                    });\n                }\n            }, { deep: true });\n        });\n        store.$subscribe(({ events, type }, state) => {\n            api.notifyComponentUpdate();\n            api.sendInspectorState(INSPECTOR_ID);\n            if (!isTimelineActive)\n                return;\n            // rootStore.state[store.id] = state\n            const eventData = {\n                time: now(),\n                title: formatMutationType(type),\n                data: assign$1({ store: formatDisplay(store.$id) }, formatEventData(events)),\n                groupId: activeAction,\n            };\n            if (type === MutationType.patchFunction) {\n                eventData.subtitle = '⤵️';\n            }\n            else if (type === MutationType.patchObject) {\n                eventData.subtitle = '🧩';\n            }\n            else if (events && !Array.isArray(events)) {\n                eventData.subtitle = events.type;\n            }\n            if (events) {\n                eventData.data['rawEvent(s)'] = {\n                    _custom: {\n                        display: 'DebuggerEvent',\n                        type: 'object',\n                        tooltip: 'raw DebuggerEvent[]',\n                        value: events,\n                    },\n                };\n            }\n            api.addTimelineEvent({\n                layerId: MUTATIONS_LAYER_ID,\n                event: eventData,\n            });\n        }, { detached: true, flush: 'sync' });\n        const hotUpdate = store._hotUpdate;\n        store._hotUpdate = markRaw((newStore) => {\n            hotUpdate(newStore);\n            api.addTimelineEvent({\n                layerId: MUTATIONS_LAYER_ID,\n                event: {\n                    time: now(),\n                    title: '🔥 ' + store.$id,\n                    subtitle: 'HMR update',\n                    data: {\n                        store: formatDisplay(store.$id),\n                        info: formatDisplay(`HMR update`),\n                    },\n                },\n            });\n            // update the devtools too\n            api.notifyComponentUpdate();\n            api.sendInspectorTree(INSPECTOR_ID);\n            api.sendInspectorState(INSPECTOR_ID);\n        });\n        const { $dispose } = store;\n        store.$dispose = () => {\n            $dispose();\n            api.notifyComponentUpdate();\n            api.sendInspectorTree(INSPECTOR_ID);\n            api.sendInspectorState(INSPECTOR_ID);\n            api.getSettings().logStoreChanges &&\n                toastMessage(`Disposed \"${store.$id}\" store 🗑`);\n        };\n        // trigger an update so it can display new registered stores\n        api.notifyComponentUpdate();\n        api.sendInspectorTree(INSPECTOR_ID);\n        api.sendInspectorState(INSPECTOR_ID);\n        api.getSettings().logStoreChanges &&\n            toastMessage(`\"${store.$id}\" store installed 🆕`);\n    });\n}\nlet runningActionId = 0;\nlet activeAction;\n/**\n * Patches a store to enable action grouping in devtools by wrapping the store with a Proxy that is passed as the\n * context of all actions, allowing us to set `runningAction` on each access and effectively associating any state\n * mutation to the action.\n *\n * @param store - store to patch\n * @param actionNames - list of actionst to patch\n */\nfunction patchActionForGrouping(store, actionNames, wrapWithProxy) {\n    // original actions of the store as they are given by pinia. We are going to override them\n    const actions = actionNames.reduce((storeActions, actionName) => {\n        // use toRaw to avoid tracking #541\n        storeActions[actionName] = toRaw(store)[actionName];\n        return storeActions;\n    }, {});\n    for (const actionName in actions) {\n        store[actionName] = function () {\n            // the running action id is incremented in a before action hook\n            const _actionId = runningActionId;\n            const trackedStore = wrapWithProxy\n                ? new Proxy(store, {\n                    get(...args) {\n                        activeAction = _actionId;\n                        return Reflect.get(...args);\n                    },\n                    set(...args) {\n                        activeAction = _actionId;\n                        return Reflect.set(...args);\n                    },\n                })\n                : store;\n            // For Setup Stores we need https://github.com/tc39/proposal-async-context\n            activeAction = _actionId;\n            const retValue = actions[actionName].apply(trackedStore, arguments);\n            // this is safer as async actions in Setup Stores would associate mutations done outside of the action\n            activeAction = undefined;\n            return retValue;\n        };\n    }\n}\n/**\n * pinia.use(devtoolsPlugin)\n */\nfunction devtoolsPlugin({ app, store, options }) {\n    // HMR module\n    if (store.$id.startsWith('__hot:')) {\n        return;\n    }\n    // detect option api vs setup api\n    store._isOptionsAPI = !!options.state;\n    patchActionForGrouping(store, Object.keys(options.actions), store._isOptionsAPI);\n    // Upgrade the HMR to also update the new actions\n    const originalHotUpdate = store._hotUpdate;\n    toRaw(store)._hotUpdate = function (newStore) {\n        originalHotUpdate.apply(this, arguments);\n        patchActionForGrouping(store, Object.keys(newStore._hmrPayload.actions), !!store._isOptionsAPI);\n    };\n    addStoreToDevtools(app, \n    // FIXME: is there a way to allow the assignment from Store<Id, S, G, A> to StoreGeneric?\n    store);\n}\n\n/**\n * Creates a Pinia instance to be used by the application\n */\nfunction createPinia() {\n    const scope = effectScope(true);\n    // NOTE: here we could check the window object for a state and directly set it\n    // if there is anything like it with Vue 3 SSR\n    const state = scope.run(() => ref({}));\n    let _p = [];\n    // plugins added before calling app.use(pinia)\n    let toBeInstalled = [];\n    const pinia = markRaw({\n        install(app) {\n            // this allows calling useStore() outside of a component setup after\n            // installing pinia's plugin\n            setActivePinia(pinia);\n            if (!isVue2) {\n                pinia._a = app;\n                app.provide(piniaSymbol, pinia);\n                app.config.globalProperties.$pinia = pinia;\n                /* istanbul ignore else */\n                if (USE_DEVTOOLS) {\n                    registerPiniaDevtools(app, pinia);\n                }\n                toBeInstalled.forEach((plugin) => _p.push(plugin));\n                toBeInstalled = [];\n            }\n        },\n        use(plugin) {\n            if (!this._a && !isVue2) {\n                toBeInstalled.push(plugin);\n            }\n            else {\n                _p.push(plugin);\n            }\n            return this;\n        },\n        _p,\n        // it's actually undefined here\n        // @ts-expect-error\n        _a: null,\n        _e: scope,\n        _s: new Map(),\n        state,\n    });\n    // pinia devtools rely on dev only features so they cannot be forced unless\n    // the dev build of Vue is used. Avoid old browsers like IE11.\n    if (USE_DEVTOOLS && typeof Proxy !== 'undefined') {\n        pinia.use(devtoolsPlugin);\n    }\n    return pinia;\n}\n\n/**\n * Checks if a function is a `StoreDefinition`.\n *\n * @param fn - object to test\n * @returns true if `fn` is a StoreDefinition\n */\nconst isUseStore = (fn) => {\n    return typeof fn === 'function' && typeof fn.$id === 'string';\n};\n/**\n * Mutates in place `newState` with `oldState` to _hot update_ it. It will\n * remove any key not existing in `newState` and recursively merge plain\n * objects.\n *\n * @param newState - new state object to be patched\n * @param oldState - old state that should be used to patch newState\n * @returns - newState\n */\nfunction patchObject(newState, oldState) {\n    // no need to go through symbols because they cannot be serialized anyway\n    for (const key in oldState) {\n        const subPatch = oldState[key];\n        // skip the whole sub tree\n        if (!(key in newState)) {\n            continue;\n        }\n        const targetValue = newState[key];\n        if (isPlainObject(targetValue) &&\n            isPlainObject(subPatch) &&\n            !isRef(subPatch) &&\n            !isReactive(subPatch)) {\n            newState[key] = patchObject(targetValue, subPatch);\n        }\n        else {\n            // objects are either a bit more complex (e.g. refs) or primitives, so we\n            // just set the whole thing\n            if (isVue2) {\n                set(newState, key, subPatch);\n            }\n            else {\n                newState[key] = subPatch;\n            }\n        }\n    }\n    return newState;\n}\n/**\n * Creates an _accept_ function to pass to `import.meta.hot` in Vite applications.\n *\n * @example\n * ```js\n * const useUser = defineStore(...)\n * if (import.meta.hot) {\n *   import.meta.hot.accept(acceptHMRUpdate(useUser, import.meta.hot))\n * }\n * ```\n *\n * @param initialUseStore - return of the defineStore to hot update\n * @param hot - `import.meta.hot`\n */\nfunction acceptHMRUpdate(initialUseStore, hot) {\n    // strip as much as possible from iife.prod\n    if (!(process.env.NODE_ENV !== 'production')) {\n        return () => { };\n    }\n    return (newModule) => {\n        const pinia = hot.data.pinia || initialUseStore._pinia;\n        if (!pinia) {\n            // this store is still not used\n            return;\n        }\n        // preserve the pinia instance across loads\n        hot.data.pinia = pinia;\n        // console.log('got data', newStore)\n        for (const exportName in newModule) {\n            const useStore = newModule[exportName];\n            // console.log('checking for', exportName)\n            if (isUseStore(useStore) && pinia._s.has(useStore.$id)) {\n                // console.log('Accepting update for', useStore.$id)\n                const id = useStore.$id;\n                if (id !== initialUseStore.$id) {\n                    console.warn(`The id of the store changed from \"${initialUseStore.$id}\" to \"${id}\". Reloading.`);\n                    // return import.meta.hot.invalidate()\n                    return hot.invalidate();\n                }\n                const existingStore = pinia._s.get(id);\n                if (!existingStore) {\n                    console.log(`[Pinia]: skipping hmr because store doesn't exist yet`);\n                    return;\n                }\n                useStore(pinia, existingStore);\n            }\n        }\n    };\n}\n\nconst noop = () => { };\nfunction addSubscription(subscriptions, callback, detached, onCleanup = noop) {\n    subscriptions.push(callback);\n    const removeSubscription = () => {\n        const idx = subscriptions.indexOf(callback);\n        if (idx > -1) {\n            subscriptions.splice(idx, 1);\n            onCleanup();\n        }\n    };\n    if (!detached && getCurrentScope()) {\n        onScopeDispose(removeSubscription);\n    }\n    return removeSubscription;\n}\nfunction triggerSubscriptions(subscriptions, ...args) {\n    subscriptions.slice().forEach((callback) => {\n        callback(...args);\n    });\n}\n\nconst fallbackRunWithContext = (fn) => fn();\nfunction mergeReactiveObjects(target, patchToApply) {\n    // Handle Map instances\n    if (target instanceof Map && patchToApply instanceof Map) {\n        patchToApply.forEach((value, key) => target.set(key, value));\n    }\n    // Handle Set instances\n    if (target instanceof Set && patchToApply instanceof Set) {\n        patchToApply.forEach(target.add, target);\n    }\n    // no need to go through symbols because they cannot be serialized anyway\n    for (const key in patchToApply) {\n        if (!patchToApply.hasOwnProperty(key))\n            continue;\n        const subPatch = patchToApply[key];\n        const targetValue = target[key];\n        if (isPlainObject(targetValue) &&\n            isPlainObject(subPatch) &&\n            target.hasOwnProperty(key) &&\n            !isRef(subPatch) &&\n            !isReactive(subPatch)) {\n            // NOTE: here I wanted to warn about inconsistent types but it's not possible because in setup stores one might\n            // start the value of a property as a certain type e.g. a Map, and then for some reason, during SSR, change that\n            // to `undefined`. When trying to hydrate, we want to override the Map with `undefined`.\n            target[key] = mergeReactiveObjects(targetValue, subPatch);\n        }\n        else {\n            // @ts-expect-error: subPatch is a valid value\n            target[key] = subPatch;\n        }\n    }\n    return target;\n}\nconst skipHydrateSymbol = (process.env.NODE_ENV !== 'production')\n    ? Symbol('pinia:skipHydration')\n    : /* istanbul ignore next */ Symbol();\nconst skipHydrateMap = /*#__PURE__*/ new WeakMap();\n/**\n * Tells Pinia to skip the hydration process of a given object. This is useful in setup stores (only) when you return a\n * stateful object in the store but it isn't really state. e.g. returning a router instance in a setup store.\n *\n * @param obj - target object\n * @returns obj\n */\nfunction skipHydrate(obj) {\n    return isVue2\n        ? // in @vue/composition-api, the refs are sealed so defineProperty doesn't work...\n            /* istanbul ignore next */ skipHydrateMap.set(obj, 1) && obj\n        : Object.defineProperty(obj, skipHydrateSymbol, {});\n}\n/**\n * Returns whether a value should be hydrated\n *\n * @param obj - target variable\n * @returns true if `obj` should be hydrated\n */\nfunction shouldHydrate(obj) {\n    return isVue2\n        ? /* istanbul ignore next */ !skipHydrateMap.has(obj)\n        : !isPlainObject(obj) || !obj.hasOwnProperty(skipHydrateSymbol);\n}\nconst { assign } = Object;\nfunction isComputed(o) {\n    return !!(isRef(o) && o.effect);\n}\nfunction createOptionsStore(id, options, pinia, hot) {\n    const { state, actions, getters } = options;\n    const initialState = pinia.state.value[id];\n    let store;\n    function setup() {\n        if (!initialState && (!(process.env.NODE_ENV !== 'production') || !hot)) {\n            /* istanbul ignore if */\n            if (isVue2) {\n                set(pinia.state.value, id, state ? state() : {});\n            }\n            else {\n                pinia.state.value[id] = state ? state() : {};\n            }\n        }\n        // avoid creating a state in pinia.state.value\n        const localState = (process.env.NODE_ENV !== 'production') && hot\n            ? // use ref() to unwrap refs inside state TODO: check if this is still necessary\n                toRefs(ref(state ? state() : {}).value)\n            : toRefs(pinia.state.value[id]);\n        return assign(localState, actions, Object.keys(getters || {}).reduce((computedGetters, name) => {\n            if ((process.env.NODE_ENV !== 'production') && name in localState) {\n                console.warn(`[🍍]: A getter cannot have the same name as another state property. Rename one of them. Found with \"${name}\" in store \"${id}\".`);\n            }\n            computedGetters[name] = markRaw(computed(() => {\n                setActivePinia(pinia);\n                // it was created just before\n                const store = pinia._s.get(id);\n                // allow cross using stores\n                /* istanbul ignore next */\n                if (isVue2 && !store._r)\n                    return;\n                // @ts-expect-error\n                // return getters![name].call(context, context)\n                // TODO: avoid reading the getter while assigning with a global variable\n                return getters[name].call(store, store);\n            }));\n            return computedGetters;\n        }, {}));\n    }\n    store = createSetupStore(id, setup, options, pinia, hot, true);\n    return store;\n}\nfunction createSetupStore($id, setup, options = {}, pinia, hot, isOptionsStore) {\n    let scope;\n    const optionsForPlugin = assign({ actions: {} }, options);\n    /* istanbul ignore if */\n    if ((process.env.NODE_ENV !== 'production') && !pinia._e.active) {\n        throw new Error('Pinia destroyed');\n    }\n    // watcher options for $subscribe\n    const $subscribeOptions = {\n        deep: true,\n        // flush: 'post',\n    };\n    /* istanbul ignore else */\n    if ((process.env.NODE_ENV !== 'production') && !isVue2) {\n        $subscribeOptions.onTrigger = (event) => {\n            /* istanbul ignore else */\n            if (isListening) {\n                debuggerEvents = event;\n                // avoid triggering this while the store is being built and the state is being set in pinia\n            }\n            else if (isListening == false && !store._hotUpdating) {\n                // let patch send all the events together later\n                /* istanbul ignore else */\n                if (Array.isArray(debuggerEvents)) {\n                    debuggerEvents.push(event);\n                }\n                else {\n                    console.error('🍍 debuggerEvents should be an array. This is most likely an internal Pinia bug.');\n                }\n            }\n        };\n    }\n    // internal state\n    let isListening; // set to true at the end\n    let isSyncListening; // set to true at the end\n    let subscriptions = [];\n    let actionSubscriptions = [];\n    let debuggerEvents;\n    const initialState = pinia.state.value[$id];\n    // avoid setting the state for option stores if it is set\n    // by the setup\n    if (!isOptionsStore && !initialState && (!(process.env.NODE_ENV !== 'production') || !hot)) {\n        /* istanbul ignore if */\n        if (isVue2) {\n            set(pinia.state.value, $id, {});\n        }\n        else {\n            pinia.state.value[$id] = {};\n        }\n    }\n    const hotState = ref({});\n    // avoid triggering too many listeners\n    // https://github.com/vuejs/pinia/issues/1129\n    let activeListener;\n    function $patch(partialStateOrMutator) {\n        let subscriptionMutation;\n        isListening = isSyncListening = false;\n        // reset the debugger events since patches are sync\n        /* istanbul ignore else */\n        if ((process.env.NODE_ENV !== 'production')) {\n            debuggerEvents = [];\n        }\n        if (typeof partialStateOrMutator === 'function') {\n            partialStateOrMutator(pinia.state.value[$id]);\n            subscriptionMutation = {\n                type: MutationType.patchFunction,\n                storeId: $id,\n                events: debuggerEvents,\n            };\n        }\n        else {\n            mergeReactiveObjects(pinia.state.value[$id], partialStateOrMutator);\n            subscriptionMutation = {\n                type: MutationType.patchObject,\n                payload: partialStateOrMutator,\n                storeId: $id,\n                events: debuggerEvents,\n            };\n        }\n        const myListenerId = (activeListener = Symbol());\n        nextTick().then(() => {\n            if (activeListener === myListenerId) {\n                isListening = true;\n            }\n        });\n        isSyncListening = true;\n        // because we paused the watcher, we need to manually call the subscriptions\n        triggerSubscriptions(subscriptions, subscriptionMutation, pinia.state.value[$id]);\n    }\n    const $reset = isOptionsStore\n        ? function $reset() {\n            const { state } = options;\n            const newState = state ? state() : {};\n            // we use a patch to group all changes into one single subscription\n            this.$patch(($state) => {\n                assign($state, newState);\n            });\n        }\n        : /* istanbul ignore next */\n            (process.env.NODE_ENV !== 'production')\n                ? () => {\n                    throw new Error(`🍍: Store \"${$id}\" is built using the setup syntax and does not implement $reset().`);\n                }\n                : noop;\n    function $dispose() {\n        scope.stop();\n        subscriptions = [];\n        actionSubscriptions = [];\n        pinia._s.delete($id);\n    }\n    /**\n     * Wraps an action to handle subscriptions.\n     *\n     * @param name - name of the action\n     * @param action - action to wrap\n     * @returns a wrapped action to handle subscriptions\n     */\n    function wrapAction(name, action) {\n        return function () {\n            setActivePinia(pinia);\n            const args = Array.from(arguments);\n            const afterCallbackList = [];\n            const onErrorCallbackList = [];\n            function after(callback) {\n                afterCallbackList.push(callback);\n            }\n            function onError(callback) {\n                onErrorCallbackList.push(callback);\n            }\n            // @ts-expect-error\n            triggerSubscriptions(actionSubscriptions, {\n                args,\n                name,\n                store,\n                after,\n                onError,\n            });\n            let ret;\n            try {\n                ret = action.apply(this && this.$id === $id ? this : store, args);\n                // handle sync errors\n            }\n            catch (error) {\n                triggerSubscriptions(onErrorCallbackList, error);\n                throw error;\n            }\n            if (ret instanceof Promise) {\n                return ret\n                    .then((value) => {\n                    triggerSubscriptions(afterCallbackList, value);\n                    return value;\n                })\n                    .catch((error) => {\n                    triggerSubscriptions(onErrorCallbackList, error);\n                    return Promise.reject(error);\n                });\n            }\n            // trigger after callbacks\n            triggerSubscriptions(afterCallbackList, ret);\n            return ret;\n        };\n    }\n    const _hmrPayload = /*#__PURE__*/ markRaw({\n        actions: {},\n        getters: {},\n        state: [],\n        hotState,\n    });\n    const partialStore = {\n        _p: pinia,\n        // _s: scope,\n        $id,\n        $onAction: addSubscription.bind(null, actionSubscriptions),\n        $patch,\n        $reset,\n        $subscribe(callback, options = {}) {\n            const removeSubscription = addSubscription(subscriptions, callback, options.detached, () => stopWatcher());\n            const stopWatcher = scope.run(() => watch(() => pinia.state.value[$id], (state) => {\n                if (options.flush === 'sync' ? isSyncListening : isListening) {\n                    callback({\n                        storeId: $id,\n                        type: MutationType.direct,\n                        events: debuggerEvents,\n                    }, state);\n                }\n            }, assign({}, $subscribeOptions, options)));\n            return removeSubscription;\n        },\n        $dispose,\n    };\n    /* istanbul ignore if */\n    if (isVue2) {\n        // start as non ready\n        partialStore._r = false;\n    }\n    const store = reactive((process.env.NODE_ENV !== 'production') || USE_DEVTOOLS\n        ? assign({\n            _hmrPayload,\n            _customProperties: markRaw(new Set()), // devtools custom properties\n        }, partialStore\n        // must be added later\n        // setupStore\n        )\n        : partialStore);\n    // store the partial store now so the setup of stores can instantiate each other before they are finished without\n    // creating infinite loops.\n    pinia._s.set($id, store);\n    const runWithContext = (pinia._a && pinia._a.runWithContext) || fallbackRunWithContext;\n    // TODO: idea create skipSerialize that marks properties as non serializable and they are skipped\n    const setupStore = runWithContext(() => pinia._e.run(() => (scope = effectScope()).run(setup)));\n    // overwrite existing actions to support $onAction\n    for (const key in setupStore) {\n        const prop = setupStore[key];\n        if ((isRef(prop) && !isComputed(prop)) || isReactive(prop)) {\n            // mark it as a piece of state to be serialized\n            if ((process.env.NODE_ENV !== 'production') && hot) {\n                set(hotState.value, key, toRef(setupStore, key));\n                // createOptionStore directly sets the state in pinia.state.value so we\n                // can just skip that\n            }\n            else if (!isOptionsStore) {\n                // in setup stores we must hydrate the state and sync pinia state tree with the refs the user just created\n                if (initialState && shouldHydrate(prop)) {\n                    if (isRef(prop)) {\n                        prop.value = initialState[key];\n                    }\n                    else {\n                        // probably a reactive object, lets recursively assign\n                        // @ts-expect-error: prop is unknown\n                        mergeReactiveObjects(prop, initialState[key]);\n                    }\n                }\n                // transfer the ref to the pinia state to keep everything in sync\n                /* istanbul ignore if */\n                if (isVue2) {\n                    set(pinia.state.value[$id], key, prop);\n                }\n                else {\n                    pinia.state.value[$id][key] = prop;\n                }\n            }\n            /* istanbul ignore else */\n            if ((process.env.NODE_ENV !== 'production')) {\n                _hmrPayload.state.push(key);\n            }\n            // action\n        }\n        else if (typeof prop === 'function') {\n            // @ts-expect-error: we are overriding the function we avoid wrapping if\n            const actionValue = (process.env.NODE_ENV !== 'production') && hot ? prop : wrapAction(key, prop);\n            // this a hot module replacement store because the hotUpdate method needs\n            // to do it with the right context\n            /* istanbul ignore if */\n            if (isVue2) {\n                set(setupStore, key, actionValue);\n            }\n            else {\n                // @ts-expect-error\n                setupStore[key] = actionValue;\n            }\n            /* istanbul ignore else */\n            if ((process.env.NODE_ENV !== 'production')) {\n                _hmrPayload.actions[key] = prop;\n            }\n            // list actions so they can be used in plugins\n            // @ts-expect-error\n            optionsForPlugin.actions[key] = prop;\n        }\n        else if ((process.env.NODE_ENV !== 'production')) {\n            // add getters for devtools\n            if (isComputed(prop)) {\n                _hmrPayload.getters[key] = isOptionsStore\n                    ? // @ts-expect-error\n                        options.getters[key]\n                    : prop;\n                if (IS_CLIENT) {\n                    const getters = setupStore._getters ||\n                        // @ts-expect-error: same\n                        (setupStore._getters = markRaw([]));\n                    getters.push(key);\n                }\n            }\n        }\n    }\n    // add the state, getters, and action properties\n    /* istanbul ignore if */\n    if (isVue2) {\n        Object.keys(setupStore).forEach((key) => {\n            set(store, key, setupStore[key]);\n        });\n    }\n    else {\n        assign(store, setupStore);\n        // allows retrieving reactive objects with `storeToRefs()`. Must be called after assigning to the reactive object.\n        // Make `storeToRefs()` work with `reactive()` #799\n        assign(toRaw(store), setupStore);\n    }\n    // use this instead of a computed with setter to be able to create it anywhere\n    // without linking the computed lifespan to wherever the store is first\n    // created.\n    Object.defineProperty(store, '$state', {\n        get: () => ((process.env.NODE_ENV !== 'production') && hot ? hotState.value : pinia.state.value[$id]),\n        set: (state) => {\n            /* istanbul ignore if */\n            if ((process.env.NODE_ENV !== 'production') && hot) {\n                throw new Error('cannot set hotState');\n            }\n            $patch(($state) => {\n                assign($state, state);\n            });\n        },\n    });\n    // add the hotUpdate before plugins to allow them to override it\n    /* istanbul ignore else */\n    if ((process.env.NODE_ENV !== 'production')) {\n        store._hotUpdate = markRaw((newStore) => {\n            store._hotUpdating = true;\n            newStore._hmrPayload.state.forEach((stateKey) => {\n                if (stateKey in store.$state) {\n                    const newStateTarget = newStore.$state[stateKey];\n                    const oldStateSource = store.$state[stateKey];\n                    if (typeof newStateTarget === 'object' &&\n                        isPlainObject(newStateTarget) &&\n                        isPlainObject(oldStateSource)) {\n                        patchObject(newStateTarget, oldStateSource);\n                    }\n                    else {\n                        // transfer the ref\n                        newStore.$state[stateKey] = oldStateSource;\n                    }\n                }\n                // patch direct access properties to allow store.stateProperty to work as\n                // store.$state.stateProperty\n                set(store, stateKey, toRef(newStore.$state, stateKey));\n            });\n            // remove deleted state properties\n            Object.keys(store.$state).forEach((stateKey) => {\n                if (!(stateKey in newStore.$state)) {\n                    del(store, stateKey);\n                }\n            });\n            // avoid devtools logging this as a mutation\n            isListening = false;\n            isSyncListening = false;\n            pinia.state.value[$id] = toRef(newStore._hmrPayload, 'hotState');\n            isSyncListening = true;\n            nextTick().then(() => {\n                isListening = true;\n            });\n            for (const actionName in newStore._hmrPayload.actions) {\n                const action = newStore[actionName];\n                set(store, actionName, wrapAction(actionName, action));\n            }\n            // TODO: does this work in both setup and option store?\n            for (const getterName in newStore._hmrPayload.getters) {\n                const getter = newStore._hmrPayload.getters[getterName];\n                const getterValue = isOptionsStore\n                    ? // special handling of options api\n                        computed(() => {\n                            setActivePinia(pinia);\n                            return getter.call(store, store);\n                        })\n                    : getter;\n                set(store, getterName, getterValue);\n            }\n            // remove deleted getters\n            Object.keys(store._hmrPayload.getters).forEach((key) => {\n                if (!(key in newStore._hmrPayload.getters)) {\n                    del(store, key);\n                }\n            });\n            // remove old actions\n            Object.keys(store._hmrPayload.actions).forEach((key) => {\n                if (!(key in newStore._hmrPayload.actions)) {\n                    del(store, key);\n                }\n            });\n            // update the values used in devtools and to allow deleting new properties later on\n            store._hmrPayload = newStore._hmrPayload;\n            store._getters = newStore._getters;\n            store._hotUpdating = false;\n        });\n    }\n    if (USE_DEVTOOLS) {\n        const nonEnumerable = {\n            writable: true,\n            configurable: true,\n            // avoid warning on devtools trying to display this property\n            enumerable: false,\n        };\n        ['_p', '_hmrPayload', '_getters', '_customProperties'].forEach((p) => {\n            Object.defineProperty(store, p, assign({ value: store[p] }, nonEnumerable));\n        });\n    }\n    /* istanbul ignore if */\n    if (isVue2) {\n        // mark the store as ready before plugins\n        store._r = true;\n    }\n    // apply all plugins\n    pinia._p.forEach((extender) => {\n        /* istanbul ignore else */\n        if (USE_DEVTOOLS) {\n            const extensions = scope.run(() => extender({\n                store,\n                app: pinia._a,\n                pinia,\n                options: optionsForPlugin,\n            }));\n            Object.keys(extensions || {}).forEach((key) => store._customProperties.add(key));\n            assign(store, extensions);\n        }\n        else {\n            assign(store, scope.run(() => extender({\n                store,\n                app: pinia._a,\n                pinia,\n                options: optionsForPlugin,\n            })));\n        }\n    });\n    if ((process.env.NODE_ENV !== 'production') &&\n        store.$state &&\n        typeof store.$state === 'object' &&\n        typeof store.$state.constructor === 'function' &&\n        !store.$state.constructor.toString().includes('[native code]')) {\n        console.warn(`[🍍]: The \"state\" must be a plain object. It cannot be\\n` +\n            `\\tstate: () => new MyClass()\\n` +\n            `Found in store \"${store.$id}\".`);\n    }\n    // only apply hydrate to option stores with an initial state in pinia\n    if (initialState &&\n        isOptionsStore &&\n        options.hydrate) {\n        options.hydrate(store.$state, initialState);\n    }\n    isListening = true;\n    isSyncListening = true;\n    return store;\n}\nfunction defineStore(\n// TODO: add proper types from above\nidOrOptions, setup, setupOptions) {\n    let id;\n    let options;\n    const isSetupStore = typeof setup === 'function';\n    if (typeof idOrOptions === 'string') {\n        id = idOrOptions;\n        // the option store setup will contain the actual options in this case\n        options = isSetupStore ? setupOptions : setup;\n    }\n    else {\n        options = idOrOptions;\n        id = idOrOptions.id;\n        if ((process.env.NODE_ENV !== 'production') && typeof id !== 'string') {\n            throw new Error(`[🍍]: \"defineStore()\" must be passed a store id as its first argument.`);\n        }\n    }\n    function useStore(pinia, hot) {\n        const hasContext = hasInjectionContext();\n        pinia =\n            // in test mode, ignore the argument provided as we can always retrieve a\n            // pinia instance with getActivePinia()\n            ((process.env.NODE_ENV === 'test') && activePinia && activePinia._testing ? null : pinia) ||\n                (hasContext ? inject(piniaSymbol, null) : null);\n        if (pinia)\n            setActivePinia(pinia);\n        if ((process.env.NODE_ENV !== 'production') && !activePinia) {\n            throw new Error(`[🍍]: \"getActivePinia()\" was called but there was no active Pinia. Are you trying to use a store before calling \"app.use(pinia)\"?\\n` +\n                `See https://pinia.vuejs.org/core-concepts/outside-component-usage.html for help.\\n` +\n                `This will fail in production.`);\n        }\n        pinia = activePinia;\n        if (!pinia._s.has(id)) {\n            // creating the store registers it in `pinia._s`\n            if (isSetupStore) {\n                createSetupStore(id, setup, options, pinia);\n            }\n            else {\n                createOptionsStore(id, options, pinia);\n            }\n            /* istanbul ignore else */\n            if ((process.env.NODE_ENV !== 'production')) {\n                // @ts-expect-error: not the right inferred type\n                useStore._pinia = pinia;\n            }\n        }\n        const store = pinia._s.get(id);\n        if ((process.env.NODE_ENV !== 'production') && hot) {\n            const hotId = '__hot:' + id;\n            const newStore = isSetupStore\n                ? createSetupStore(hotId, setup, options, pinia, true)\n                : createOptionsStore(hotId, assign({}, options), pinia, true);\n            hot._hotUpdate(newStore);\n            // cleanup the state properties and the store from the cache\n            delete pinia.state.value[hotId];\n            pinia._s.delete(hotId);\n        }\n        if ((process.env.NODE_ENV !== 'production') && IS_CLIENT) {\n            const currentInstance = getCurrentInstance();\n            // save stores in instances to access them devtools\n            if (currentInstance &&\n                currentInstance.proxy &&\n                // avoid adding stores that are just built for hot module replacement\n                !hot) {\n                const vm = currentInstance.proxy;\n                const cache = '_pStores' in vm ? vm._pStores : (vm._pStores = {});\n                cache[id] = store;\n            }\n        }\n        // StoreGeneric cannot be casted towards Store\n        return store;\n    }\n    useStore.$id = id;\n    return useStore;\n}\n\nlet mapStoreSuffix = 'Store';\n/**\n * Changes the suffix added by `mapStores()`. Can be set to an empty string.\n * Defaults to `\"Store\"`. Make sure to extend the MapStoresCustomization\n * interface if you are using TypeScript.\n *\n * @param suffix - new suffix\n */\nfunction setMapStoreSuffix(suffix // could be 'Store' but that would be annoying for JS\n) {\n    mapStoreSuffix = suffix;\n}\n/**\n * Allows using stores without the composition API (`setup()`) by generating an\n * object to be spread in the `computed` field of a component. It accepts a list\n * of store definitions.\n *\n * @example\n * ```js\n * export default {\n *   computed: {\n *     // other computed properties\n *     ...mapStores(useUserStore, useCartStore)\n *   },\n *\n *   created() {\n *     this.userStore // store with id \"user\"\n *     this.cartStore // store with id \"cart\"\n *   }\n * }\n * ```\n *\n * @param stores - list of stores to map to an object\n */\nfunction mapStores(...stores) {\n    if ((process.env.NODE_ENV !== 'production') && Array.isArray(stores[0])) {\n        console.warn(`[🍍]: Directly pass all stores to \"mapStores()\" without putting them in an array:\\n` +\n            `Replace\\n` +\n            `\\tmapStores([useAuthStore, useCartStore])\\n` +\n            `with\\n` +\n            `\\tmapStores(useAuthStore, useCartStore)\\n` +\n            `This will fail in production if not fixed.`);\n        stores = stores[0];\n    }\n    return stores.reduce((reduced, useStore) => {\n        // @ts-expect-error: $id is added by defineStore\n        reduced[useStore.$id + mapStoreSuffix] = function () {\n            return useStore(this.$pinia);\n        };\n        return reduced;\n    }, {});\n}\n/**\n * Allows using state and getters from one store without using the composition\n * API (`setup()`) by generating an object to be spread in the `computed` field\n * of a component.\n *\n * @param useStore - store to map from\n * @param keysOrMapper - array or object\n */\nfunction mapState(useStore, keysOrMapper) {\n    return Array.isArray(keysOrMapper)\n        ? keysOrMapper.reduce((reduced, key) => {\n            reduced[key] = function () {\n                return useStore(this.$pinia)[key];\n            };\n            return reduced;\n        }, {})\n        : Object.keys(keysOrMapper).reduce((reduced, key) => {\n            // @ts-expect-error\n            reduced[key] = function () {\n                const store = useStore(this.$pinia);\n                const storeKey = keysOrMapper[key];\n                // for some reason TS is unable to infer the type of storeKey to be a\n                // function\n                return typeof storeKey === 'function'\n                    ? storeKey.call(this, store)\n                    : store[storeKey];\n            };\n            return reduced;\n        }, {});\n}\n/**\n * Alias for `mapState()`. You should use `mapState()` instead.\n * @deprecated use `mapState()` instead.\n */\nconst mapGetters = mapState;\n/**\n * Allows directly using actions from your store without using the composition\n * API (`setup()`) by generating an object to be spread in the `methods` field\n * of a component.\n *\n * @param useStore - store to map from\n * @param keysOrMapper - array or object\n */\nfunction mapActions(useStore, keysOrMapper) {\n    return Array.isArray(keysOrMapper)\n        ? keysOrMapper.reduce((reduced, key) => {\n            // @ts-expect-error\n            reduced[key] = function (...args) {\n                return useStore(this.$pinia)[key](...args);\n            };\n            return reduced;\n        }, {})\n        : Object.keys(keysOrMapper).reduce((reduced, key) => {\n            // @ts-expect-error\n            reduced[key] = function (...args) {\n                return useStore(this.$pinia)[keysOrMapper[key]](...args);\n            };\n            return reduced;\n        }, {});\n}\n/**\n * Allows using state and getters from one store without using the composition\n * API (`setup()`) by generating an object to be spread in the `computed` field\n * of a component.\n *\n * @param useStore - store to map from\n * @param keysOrMapper - array or object\n */\nfunction mapWritableState(useStore, keysOrMapper) {\n    return Array.isArray(keysOrMapper)\n        ? keysOrMapper.reduce((reduced, key) => {\n            // @ts-ignore\n            reduced[key] = {\n                get() {\n                    return useStore(this.$pinia)[key];\n                },\n                set(value) {\n                    // it's easier to type it here as any\n                    return (useStore(this.$pinia)[key] = value);\n                },\n            };\n            return reduced;\n        }, {})\n        : Object.keys(keysOrMapper).reduce((reduced, key) => {\n            // @ts-ignore\n            reduced[key] = {\n                get() {\n                    return useStore(this.$pinia)[keysOrMapper[key]];\n                },\n                set(value) {\n                    // it's easier to type it here as any\n                    return (useStore(this.$pinia)[keysOrMapper[key]] = value);\n                },\n            };\n            return reduced;\n        }, {});\n}\n\n/**\n * Creates an object of references with all the state, getters, and plugin-added\n * state properties of the store. Similar to `toRefs()` but specifically\n * designed for Pinia stores so methods and non reactive properties are\n * completely ignored.\n *\n * @param store - store to extract the refs from\n */\nfunction storeToRefs(store) {\n    // See https://github.com/vuejs/pinia/issues/852\n    // It's easier to just use toRefs() even if it includes more stuff\n    if (isVue2) {\n        // @ts-expect-error: toRefs include methods and others\n        return toRefs(store);\n    }\n    else {\n        store = toRaw(store);\n        const refs = {};\n        for (const key in store) {\n            const value = store[key];\n            if (isRef(value) || isReactive(value)) {\n                // @ts-expect-error: the key is state or getter\n                refs[key] =\n                    // ---\n                    toRef(store, key);\n            }\n        }\n        return refs;\n    }\n}\n\n/**\n * Vue 2 Plugin that must be installed for pinia to work. Note **you don't need\n * this plugin if you are using Nuxt.js**. Use the `buildModule` instead:\n * https://pinia.vuejs.org/ssr/nuxt.html.\n *\n * @example\n * ```js\n * import Vue from 'vue'\n * import { PiniaVuePlugin, createPinia } from 'pinia'\n *\n * Vue.use(PiniaVuePlugin)\n * const pinia = createPinia()\n *\n * new Vue({\n *   el: '#app',\n *   // ...\n *   pinia,\n * })\n * ```\n *\n * @param _Vue - `Vue` imported from 'vue'.\n */\nconst PiniaVuePlugin = function (_Vue) {\n    // Equivalent of\n    // app.config.globalProperties.$pinia = pinia\n    _Vue.mixin({\n        beforeCreate() {\n            const options = this.$options;\n            if (options.pinia) {\n                const pinia = options.pinia;\n                // HACK: taken from provide(): https://github.com/vuejs/composition-api/blob/main/src/apis/inject.ts#L31\n                /* istanbul ignore else */\n                if (!this._provided) {\n                    const provideCache = {};\n                    Object.defineProperty(this, '_provided', {\n                        get: () => provideCache,\n                        set: (v) => Object.assign(provideCache, v),\n                    });\n                }\n                this._provided[piniaSymbol] = pinia;\n                // propagate the pinia instance in an SSR friendly way\n                // avoid adding it to nuxt twice\n                /* istanbul ignore else */\n                if (!this.$pinia) {\n                    this.$pinia = pinia;\n                }\n                pinia._a = this;\n                if (IS_CLIENT) {\n                    // this allows calling useStore() outside of a component setup after\n                    // installing pinia's plugin\n                    setActivePinia(pinia);\n                }\n                if (USE_DEVTOOLS) {\n                    registerPiniaDevtools(pinia._a, pinia);\n                }\n            }\n            else if (!this.$pinia && options.parent && options.parent.$pinia) {\n                this.$pinia = options.parent.$pinia;\n            }\n        },\n        destroyed() {\n            delete this._pStores;\n        },\n    });\n};\n\nexport { MutationType, PiniaVuePlugin, acceptHMRUpdate, createPinia, defineStore, getActivePinia, mapActions, mapGetters, mapState, mapStores, mapWritableState, setActivePinia, setMapStoreSuffix, skipHydrate, storeToRefs };\n","import { ref } from \"vue\";\r\nimport { defineStore } from \"pinia\";\r\n\r\nexport const useNotificationStore = defineStore(\"notification\", () => {\r\n  const notifications = ref([]);\r\n  let id = 1;\r\n\r\n  function notify(type, message, notificationSettings) {\r\n    notifications.value.push({\r\n      ...(notificationSettings || {}),\r\n      id: id++,\r\n      type: type,\r\n      message: message\r\n    });\r\n  }\r\n\r\n  function notifySuccess(message, notificationSettings) {\r\n    notify(\"success\", message, notificationSettings);\r\n  }\r\n\r\n  function notifyError(message, notificationSettings) {\r\n    notify(\"error\", message, notificationSettings);\r\n  }\r\n\r\n  function dismiss(id) {\r\n    notifications.value = notifications.value.filter((notification) => notification.id !== id);\r\n  }\r\n\r\n  return {\r\n    notifications,\r\n    notify,\r\n    notifySuccess,\r\n    notifyError,\r\n    dismiss\r\n  };\r\n});\r\n","import { shallowRef, watchEffect, readonly, ref, watch, customRef, getCurrentScope, onScopeDispose, effectScope, getCurrentInstance, provide, inject, isVue3, version, isRef, unref, computed, reactive, toRefs as toRefs$1, toRef as toRef$1, isVue2, set as set$1, onBeforeMount, nextTick, onBeforeUnmount, onMounted, onUnmounted, isReactive } from 'vue-demi';\n\nfunction computedEager(fn, options) {\n  var _a;\n  const result = shallowRef();\n  watchEffect(() => {\n    result.value = fn();\n  }, {\n    ...options,\n    flush: (_a = options == null ? void 0 : options.flush) != null ? _a : \"sync\"\n  });\n  return readonly(result);\n}\n\nfunction computedWithControl(source, fn) {\n  let v = void 0;\n  let track;\n  let trigger;\n  const dirty = ref(true);\n  const update = () => {\n    dirty.value = true;\n    trigger();\n  };\n  watch(source, update, { flush: \"sync\" });\n  const get = typeof fn === \"function\" ? fn : fn.get;\n  const set = typeof fn === \"function\" ? void 0 : fn.set;\n  const result = customRef((_track, _trigger) => {\n    track = _track;\n    trigger = _trigger;\n    return {\n      get() {\n        if (dirty.value) {\n          v = get();\n          dirty.value = false;\n        }\n        track();\n        return v;\n      },\n      set(v2) {\n        set == null ? void 0 : set(v2);\n      }\n    };\n  });\n  if (Object.isExtensible(result))\n    result.trigger = update;\n  return result;\n}\n\nfunction tryOnScopeDispose(fn) {\n  if (getCurrentScope()) {\n    onScopeDispose(fn);\n    return true;\n  }\n  return false;\n}\n\nfunction createEventHook() {\n  const fns = /* @__PURE__ */ new Set();\n  const off = (fn) => {\n    fns.delete(fn);\n  };\n  const on = (fn) => {\n    fns.add(fn);\n    const offFn = () => off(fn);\n    tryOnScopeDispose(offFn);\n    return {\n      off: offFn\n    };\n  };\n  const trigger = (...args) => {\n    return Promise.all(Array.from(fns).map((fn) => fn(...args)));\n  };\n  return {\n    on,\n    off,\n    trigger\n  };\n}\n\nfunction createGlobalState(stateFactory) {\n  let initialized = false;\n  let state;\n  const scope = effectScope(true);\n  return (...args) => {\n    if (!initialized) {\n      state = scope.run(() => stateFactory(...args));\n      initialized = true;\n    }\n    return state;\n  };\n}\n\nconst localProvidedStateMap = /* @__PURE__ */ new WeakMap();\n\nconst provideLocal = (key, value) => {\n  var _a;\n  const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n  if (instance == null)\n    throw new Error(\"provideLocal must be called in setup\");\n  if (!localProvidedStateMap.has(instance))\n    localProvidedStateMap.set(instance, /* @__PURE__ */ Object.create(null));\n  const localProvidedState = localProvidedStateMap.get(instance);\n  localProvidedState[key] = value;\n  provide(key, value);\n};\n\nconst injectLocal = (...args) => {\n  var _a;\n  const key = args[0];\n  const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n  if (instance == null)\n    throw new Error(\"injectLocal must be called in setup\");\n  if (localProvidedStateMap.has(instance) && key in localProvidedStateMap.get(instance))\n    return localProvidedStateMap.get(instance)[key];\n  return inject(...args);\n};\n\nfunction createInjectionState(composable, options) {\n  const key = (options == null ? void 0 : options.injectionKey) || Symbol(composable.name || \"InjectionState\");\n  const useProvidingState = (...args) => {\n    const state = composable(...args);\n    provideLocal(key, state);\n    return state;\n  };\n  const useInjectedState = () => injectLocal(key);\n  return [useProvidingState, useInjectedState];\n}\n\nfunction createSharedComposable(composable) {\n  let subscribers = 0;\n  let state;\n  let scope;\n  const dispose = () => {\n    subscribers -= 1;\n    if (scope && subscribers <= 0) {\n      scope.stop();\n      state = void 0;\n      scope = void 0;\n    }\n  };\n  return (...args) => {\n    subscribers += 1;\n    if (!state) {\n      scope = effectScope(true);\n      state = scope.run(() => composable(...args));\n    }\n    tryOnScopeDispose(dispose);\n    return state;\n  };\n}\n\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n  if (!isVue3 && !version.startsWith(\"2.7.\")) {\n    if (process.env.NODE_ENV !== \"production\")\n      throw new Error(\"[VueUse] extendRef only works in Vue 2.7 or above.\");\n    return;\n  }\n  for (const [key, value] of Object.entries(extend)) {\n    if (key === \"value\")\n      continue;\n    if (isRef(value) && unwrap) {\n      Object.defineProperty(ref, key, {\n        get() {\n          return value.value;\n        },\n        set(v) {\n          value.value = v;\n        },\n        enumerable\n      });\n    } else {\n      Object.defineProperty(ref, key, { value, enumerable });\n    }\n  }\n  return ref;\n}\n\nfunction get(obj, key) {\n  if (key == null)\n    return unref(obj);\n  return unref(obj)[key];\n}\n\nfunction isDefined(v) {\n  return unref(v) != null;\n}\n\nfunction makeDestructurable(obj, arr) {\n  if (typeof Symbol !== \"undefined\") {\n    const clone = { ...obj };\n    Object.defineProperty(clone, Symbol.iterator, {\n      enumerable: false,\n      value() {\n        let index = 0;\n        return {\n          next: () => ({\n            value: arr[index++],\n            done: index > arr.length\n          })\n        };\n      }\n    });\n    return clone;\n  } else {\n    return Object.assign([...arr], obj);\n  }\n}\n\nfunction toValue(r) {\n  return typeof r === \"function\" ? r() : unref(r);\n}\nconst resolveUnref = toValue;\n\nfunction reactify(fn, options) {\n  const unrefFn = (options == null ? void 0 : options.computedGetter) === false ? unref : toValue;\n  return function(...args) {\n    return computed(() => fn.apply(this, args.map((i) => unrefFn(i))));\n  };\n}\n\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n  let keys = [];\n  let options;\n  if (Array.isArray(optionsOrKeys)) {\n    keys = optionsOrKeys;\n  } else {\n    options = optionsOrKeys;\n    const { includeOwnProperties = true } = optionsOrKeys;\n    keys.push(...Object.keys(obj));\n    if (includeOwnProperties)\n      keys.push(...Object.getOwnPropertyNames(obj));\n  }\n  return Object.fromEntries(\n    keys.map((key) => {\n      const value = obj[key];\n      return [\n        key,\n        typeof value === \"function\" ? reactify(value.bind(obj), options) : value\n      ];\n    })\n  );\n}\n\nfunction toReactive(objectRef) {\n  if (!isRef(objectRef))\n    return reactive(objectRef);\n  const proxy = new Proxy({}, {\n    get(_, p, receiver) {\n      return unref(Reflect.get(objectRef.value, p, receiver));\n    },\n    set(_, p, value) {\n      if (isRef(objectRef.value[p]) && !isRef(value))\n        objectRef.value[p].value = value;\n      else\n        objectRef.value[p] = value;\n      return true;\n    },\n    deleteProperty(_, p) {\n      return Reflect.deleteProperty(objectRef.value, p);\n    },\n    has(_, p) {\n      return Reflect.has(objectRef.value, p);\n    },\n    ownKeys() {\n      return Object.keys(objectRef.value);\n    },\n    getOwnPropertyDescriptor() {\n      return {\n        enumerable: true,\n        configurable: true\n      };\n    }\n  });\n  return reactive(proxy);\n}\n\nfunction reactiveComputed(fn) {\n  return toReactive(computed(fn));\n}\n\nfunction reactiveOmit(obj, ...keys) {\n  const flatKeys = keys.flat();\n  const predicate = flatKeys[0];\n  return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => !predicate(toValue(v), k))) : Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !flatKeys.includes(e[0]))));\n}\n\nconst isClient = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst isWorker = typeof WorkerGlobalScope !== \"undefined\" && globalThis instanceof WorkerGlobalScope;\nconst isDef = (val) => typeof val !== \"undefined\";\nconst notNullish = (val) => val != null;\nconst assert = (condition, ...infos) => {\n  if (!condition)\n    console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {\n};\nconst rand = (min, max) => {\n  min = Math.ceil(min);\n  max = Math.floor(max);\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n};\nconst hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);\nconst isIOS = /* @__PURE__ */ getIsIOS();\nfunction getIsIOS() {\n  var _a, _b;\n  return isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && (/iP(ad|hone|od)/.test(window.navigator.userAgent) || ((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window == null ? void 0 : window.navigator.userAgent));\n}\n\nfunction createFilterWrapper(filter, fn) {\n  function wrapper(...args) {\n    return new Promise((resolve, reject) => {\n      Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject);\n    });\n  }\n  return wrapper;\n}\nconst bypassFilter = (invoke) => {\n  return invoke();\n};\nfunction debounceFilter(ms, options = {}) {\n  let timer;\n  let maxTimer;\n  let lastRejector = noop;\n  const _clearTimeout = (timer2) => {\n    clearTimeout(timer2);\n    lastRejector();\n    lastRejector = noop;\n  };\n  const filter = (invoke) => {\n    const duration = toValue(ms);\n    const maxDuration = toValue(options.maxWait);\n    if (timer)\n      _clearTimeout(timer);\n    if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n      if (maxTimer) {\n        _clearTimeout(maxTimer);\n        maxTimer = null;\n      }\n      return Promise.resolve(invoke());\n    }\n    return new Promise((resolve, reject) => {\n      lastRejector = options.rejectOnCancel ? reject : resolve;\n      if (maxDuration && !maxTimer) {\n        maxTimer = setTimeout(() => {\n          if (timer)\n            _clearTimeout(timer);\n          maxTimer = null;\n          resolve(invoke());\n        }, maxDuration);\n      }\n      timer = setTimeout(() => {\n        if (maxTimer)\n          _clearTimeout(maxTimer);\n        maxTimer = null;\n        resolve(invoke());\n      }, duration);\n    });\n  };\n  return filter;\n}\nfunction throttleFilter(...args) {\n  let lastExec = 0;\n  let timer;\n  let isLeading = true;\n  let lastRejector = noop;\n  let lastValue;\n  let ms;\n  let trailing;\n  let leading;\n  let rejectOnCancel;\n  if (!isRef(args[0]) && typeof args[0] === \"object\")\n    ({ delay: ms, trailing = true, leading = true, rejectOnCancel = false } = args[0]);\n  else\n    [ms, trailing = true, leading = true, rejectOnCancel = false] = args;\n  const clear = () => {\n    if (timer) {\n      clearTimeout(timer);\n      timer = void 0;\n      lastRejector();\n      lastRejector = noop;\n    }\n  };\n  const filter = (_invoke) => {\n    const duration = toValue(ms);\n    const elapsed = Date.now() - lastExec;\n    const invoke = () => {\n      return lastValue = _invoke();\n    };\n    clear();\n    if (duration <= 0) {\n      lastExec = Date.now();\n      return invoke();\n    }\n    if (elapsed > duration && (leading || !isLeading)) {\n      lastExec = Date.now();\n      invoke();\n    } else if (trailing) {\n      lastValue = new Promise((resolve, reject) => {\n        lastRejector = rejectOnCancel ? reject : resolve;\n        timer = setTimeout(() => {\n          lastExec = Date.now();\n          isLeading = true;\n          resolve(invoke());\n          clear();\n        }, Math.max(0, duration - elapsed));\n      });\n    }\n    if (!leading && !timer)\n      timer = setTimeout(() => isLeading = true, duration);\n    isLeading = false;\n    return lastValue;\n  };\n  return filter;\n}\nfunction pausableFilter(extendFilter = bypassFilter) {\n  const isActive = ref(true);\n  function pause() {\n    isActive.value = false;\n  }\n  function resume() {\n    isActive.value = true;\n  }\n  const eventFilter = (...args) => {\n    if (isActive.value)\n      extendFilter(...args);\n  };\n  return { isActive: readonly(isActive), pause, resume, eventFilter };\n}\n\nconst directiveHooks = {\n  mounted: isVue3 ? \"mounted\" : \"inserted\",\n  updated: isVue3 ? \"updated\" : \"componentUpdated\",\n  unmounted: isVue3 ? \"unmounted\" : \"unbind\"\n};\n\nfunction cacheStringFunction(fn) {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (str) => {\n    const hit = cache[str];\n    return hit || (cache[str] = fn(str));\n  };\n}\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n  return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\n\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n  return new Promise((resolve, reject) => {\n    if (throwOnTimeout)\n      setTimeout(() => reject(reason), ms);\n    else\n      setTimeout(resolve, ms);\n  });\n}\nfunction identity(arg) {\n  return arg;\n}\nfunction createSingletonPromise(fn) {\n  let _promise;\n  function wrapper() {\n    if (!_promise)\n      _promise = fn();\n    return _promise;\n  }\n  wrapper.reset = async () => {\n    const _prev = _promise;\n    _promise = void 0;\n    if (_prev)\n      await _prev;\n  };\n  return wrapper;\n}\nfunction invoke(fn) {\n  return fn();\n}\nfunction containsProp(obj, ...props) {\n  return props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n  var _a;\n  if (typeof target === \"number\")\n    return target + delta;\n  const value = ((_a = target.match(/^-?[0-9]+\\.?[0-9]*/)) == null ? void 0 : _a[0]) || \"\";\n  const unit = target.slice(value.length);\n  const result = Number.parseFloat(value) + delta;\n  if (Number.isNaN(result))\n    return target;\n  return result + unit;\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n  return keys.reduce((n, k) => {\n    if (k in obj) {\n      if (!omitUndefined || obj[k] !== void 0)\n        n[k] = obj[k];\n    }\n    return n;\n  }, {});\n}\nfunction objectOmit(obj, keys, omitUndefined = false) {\n  return Object.fromEntries(Object.entries(obj).filter(([key, value]) => {\n    return (!omitUndefined || value !== void 0) && !keys.includes(key);\n  }));\n}\nfunction objectEntries(obj) {\n  return Object.entries(obj);\n}\nfunction getLifeCycleTarget(target) {\n  return target || getCurrentInstance();\n}\n\nfunction toRef(...args) {\n  if (args.length !== 1)\n    return toRef$1(...args);\n  const r = args[0];\n  return typeof r === \"function\" ? readonly(customRef(() => ({ get: r, set: noop }))) : ref(r);\n}\nconst resolveRef = toRef;\n\nfunction reactivePick(obj, ...keys) {\n  const flatKeys = keys.flat();\n  const predicate = flatKeys[0];\n  return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => predicate(toValue(v), k))) : Object.fromEntries(flatKeys.map((k) => [k, toRef(obj, k)])));\n}\n\nfunction refAutoReset(defaultValue, afterMs = 1e4) {\n  return customRef((track, trigger) => {\n    let value = toValue(defaultValue);\n    let timer;\n    const resetAfter = () => setTimeout(() => {\n      value = toValue(defaultValue);\n      trigger();\n    }, toValue(afterMs));\n    tryOnScopeDispose(() => {\n      clearTimeout(timer);\n    });\n    return {\n      get() {\n        track();\n        return value;\n      },\n      set(newValue) {\n        value = newValue;\n        trigger();\n        clearTimeout(timer);\n        timer = resetAfter();\n      }\n    };\n  });\n}\n\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n  return createFilterWrapper(\n    debounceFilter(ms, options),\n    fn\n  );\n}\n\nfunction refDebounced(value, ms = 200, options = {}) {\n  const debounced = ref(value.value);\n  const updater = useDebounceFn(() => {\n    debounced.value = value.value;\n  }, ms, options);\n  watch(value, () => updater());\n  return debounced;\n}\n\nfunction refDefault(source, defaultValue) {\n  return computed({\n    get() {\n      var _a;\n      return (_a = source.value) != null ? _a : defaultValue;\n    },\n    set(value) {\n      source.value = value;\n    }\n  });\n}\n\nfunction useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) {\n  return createFilterWrapper(\n    throttleFilter(ms, trailing, leading, rejectOnCancel),\n    fn\n  );\n}\n\nfunction refThrottled(value, delay = 200, trailing = true, leading = true) {\n  if (delay <= 0)\n    return value;\n  const throttled = ref(value.value);\n  const updater = useThrottleFn(() => {\n    throttled.value = value.value;\n  }, delay, trailing, leading);\n  watch(value, () => updater());\n  return throttled;\n}\n\nfunction refWithControl(initial, options = {}) {\n  let source = initial;\n  let track;\n  let trigger;\n  const ref = customRef((_track, _trigger) => {\n    track = _track;\n    trigger = _trigger;\n    return {\n      get() {\n        return get();\n      },\n      set(v) {\n        set(v);\n      }\n    };\n  });\n  function get(tracking = true) {\n    if (tracking)\n      track();\n    return source;\n  }\n  function set(value, triggering = true) {\n    var _a, _b;\n    if (value === source)\n      return;\n    const old = source;\n    if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)\n      return;\n    source = value;\n    (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);\n    if (triggering)\n      trigger();\n  }\n  const untrackedGet = () => get(false);\n  const silentSet = (v) => set(v, false);\n  const peek = () => get(false);\n  const lay = (v) => set(v, false);\n  return extendRef(\n    ref,\n    {\n      get,\n      set,\n      untrackedGet,\n      silentSet,\n      peek,\n      lay\n    },\n    { enumerable: true }\n  );\n}\nconst controlledRef = refWithControl;\n\nfunction set(...args) {\n  if (args.length === 2) {\n    const [ref, value] = args;\n    ref.value = value;\n  }\n  if (args.length === 3) {\n    if (isVue2) {\n      set$1(...args);\n    } else {\n      const [target, key, value] = args;\n      target[key] = value;\n    }\n  }\n}\n\nfunction watchWithFilter(source, cb, options = {}) {\n  const {\n    eventFilter = bypassFilter,\n    ...watchOptions\n  } = options;\n  return watch(\n    source,\n    createFilterWrapper(\n      eventFilter,\n      cb\n    ),\n    watchOptions\n  );\n}\n\nfunction watchPausable(source, cb, options = {}) {\n  const {\n    eventFilter: filter,\n    ...watchOptions\n  } = options;\n  const { eventFilter, pause, resume, isActive } = pausableFilter(filter);\n  const stop = watchWithFilter(\n    source,\n    cb,\n    {\n      ...watchOptions,\n      eventFilter\n    }\n  );\n  return { stop, pause, resume, isActive };\n}\n\nfunction syncRef(left, right, ...[options]) {\n  const {\n    flush = \"sync\",\n    deep = false,\n    immediate = true,\n    direction = \"both\",\n    transform = {}\n  } = options || {};\n  const watchers = [];\n  const transformLTR = \"ltr\" in transform && transform.ltr || ((v) => v);\n  const transformRTL = \"rtl\" in transform && transform.rtl || ((v) => v);\n  if (direction === \"both\" || direction === \"ltr\") {\n    watchers.push(watchPausable(\n      left,\n      (newValue) => {\n        watchers.forEach((w) => w.pause());\n        right.value = transformLTR(newValue);\n        watchers.forEach((w) => w.resume());\n      },\n      { flush, deep, immediate }\n    ));\n  }\n  if (direction === \"both\" || direction === \"rtl\") {\n    watchers.push(watchPausable(\n      right,\n      (newValue) => {\n        watchers.forEach((w) => w.pause());\n        left.value = transformRTL(newValue);\n        watchers.forEach((w) => w.resume());\n      },\n      { flush, deep, immediate }\n    ));\n  }\n  const stop = () => {\n    watchers.forEach((w) => w.stop());\n  };\n  return stop;\n}\n\nfunction syncRefs(source, targets, options = {}) {\n  const {\n    flush = \"sync\",\n    deep = false,\n    immediate = true\n  } = options;\n  if (!Array.isArray(targets))\n    targets = [targets];\n  return watch(\n    source,\n    (newValue) => targets.forEach((target) => target.value = newValue),\n    { flush, deep, immediate }\n  );\n}\n\nfunction toRefs(objectRef, options = {}) {\n  if (!isRef(objectRef))\n    return toRefs$1(objectRef);\n  const result = Array.isArray(objectRef.value) ? Array.from({ length: objectRef.value.length }) : {};\n  for (const key in objectRef.value) {\n    result[key] = customRef(() => ({\n      get() {\n        return objectRef.value[key];\n      },\n      set(v) {\n        var _a;\n        const replaceRef = (_a = toValue(options.replaceRef)) != null ? _a : true;\n        if (replaceRef) {\n          if (Array.isArray(objectRef.value)) {\n            const copy = [...objectRef.value];\n            copy[key] = v;\n            objectRef.value = copy;\n          } else {\n            const newObject = { ...objectRef.value, [key]: v };\n            Object.setPrototypeOf(newObject, Object.getPrototypeOf(objectRef.value));\n            objectRef.value = newObject;\n          }\n        } else {\n          objectRef.value[key] = v;\n        }\n      }\n    }));\n  }\n  return result;\n}\n\nfunction tryOnBeforeMount(fn, sync = true, target) {\n  const instance = getLifeCycleTarget(target);\n  if (instance)\n    onBeforeMount(fn, target);\n  else if (sync)\n    fn();\n  else\n    nextTick(fn);\n}\n\nfunction tryOnBeforeUnmount(fn, target) {\n  const instance = getLifeCycleTarget(target);\n  if (instance)\n    onBeforeUnmount(fn, target);\n}\n\nfunction tryOnMounted(fn, sync = true, target) {\n  const instance = getLifeCycleTarget();\n  if (instance)\n    onMounted(fn, target);\n  else if (sync)\n    fn();\n  else\n    nextTick(fn);\n}\n\nfunction tryOnUnmounted(fn, target) {\n  const instance = getLifeCycleTarget(target);\n  if (instance)\n    onUnmounted(fn, target);\n}\n\nfunction createUntil(r, isNot = false) {\n  function toMatch(condition, { flush = \"sync\", deep = false, timeout, throwOnTimeout } = {}) {\n    let stop = null;\n    const watcher = new Promise((resolve) => {\n      stop = watch(\n        r,\n        (v) => {\n          if (condition(v) !== isNot) {\n            stop == null ? void 0 : stop();\n            resolve(v);\n          }\n        },\n        {\n          flush,\n          deep,\n          immediate: true\n        }\n      );\n    });\n    const promises = [watcher];\n    if (timeout != null) {\n      promises.push(\n        promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => stop == null ? void 0 : stop())\n      );\n    }\n    return Promise.race(promises);\n  }\n  function toBe(value, options) {\n    if (!isRef(value))\n      return toMatch((v) => v === value, options);\n    const { flush = \"sync\", deep = false, timeout, throwOnTimeout } = options != null ? options : {};\n    let stop = null;\n    const watcher = new Promise((resolve) => {\n      stop = watch(\n        [r, value],\n        ([v1, v2]) => {\n          if (isNot !== (v1 === v2)) {\n            stop == null ? void 0 : stop();\n            resolve(v1);\n          }\n        },\n        {\n          flush,\n          deep,\n          immediate: true\n        }\n      );\n    });\n    const promises = [watcher];\n    if (timeout != null) {\n      promises.push(\n        promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => {\n          stop == null ? void 0 : stop();\n          return toValue(r);\n        })\n      );\n    }\n    return Promise.race(promises);\n  }\n  function toBeTruthy(options) {\n    return toMatch((v) => Boolean(v), options);\n  }\n  function toBeNull(options) {\n    return toBe(null, options);\n  }\n  function toBeUndefined(options) {\n    return toBe(void 0, options);\n  }\n  function toBeNaN(options) {\n    return toMatch(Number.isNaN, options);\n  }\n  function toContains(value, options) {\n    return toMatch((v) => {\n      const array = Array.from(v);\n      return array.includes(value) || array.includes(toValue(value));\n    }, options);\n  }\n  function changed(options) {\n    return changedTimes(1, options);\n  }\n  function changedTimes(n = 1, options) {\n    let count = -1;\n    return toMatch(() => {\n      count += 1;\n      return count >= n;\n    }, options);\n  }\n  if (Array.isArray(toValue(r))) {\n    const instance = {\n      toMatch,\n      toContains,\n      changed,\n      changedTimes,\n      get not() {\n        return createUntil(r, !isNot);\n      }\n    };\n    return instance;\n  } else {\n    const instance = {\n      toMatch,\n      toBe,\n      toBeTruthy,\n      toBeNull,\n      toBeNaN,\n      toBeUndefined,\n      changed,\n      changedTimes,\n      get not() {\n        return createUntil(r, !isNot);\n      }\n    };\n    return instance;\n  }\n}\nfunction until(r) {\n  return createUntil(r);\n}\n\nfunction defaultComparator(value, othVal) {\n  return value === othVal;\n}\nfunction useArrayDifference(...args) {\n  var _a;\n  const list = args[0];\n  const values = args[1];\n  let compareFn = (_a = args[2]) != null ? _a : defaultComparator;\n  if (typeof compareFn === \"string\") {\n    const key = compareFn;\n    compareFn = (value, othVal) => value[key] === othVal[key];\n  }\n  return computed(() => toValue(list).filter((x) => toValue(values).findIndex((y) => compareFn(x, y)) === -1));\n}\n\nfunction useArrayEvery(list, fn) {\n  return computed(() => toValue(list).every((element, index, array) => fn(toValue(element), index, array)));\n}\n\nfunction useArrayFilter(list, fn) {\n  return computed(() => toValue(list).map((i) => toValue(i)).filter(fn));\n}\n\nfunction useArrayFind(list, fn) {\n  return computed(() => toValue(\n    toValue(list).find((element, index, array) => fn(toValue(element), index, array))\n  ));\n}\n\nfunction useArrayFindIndex(list, fn) {\n  return computed(() => toValue(list).findIndex((element, index, array) => fn(toValue(element), index, array)));\n}\n\nfunction findLast(arr, cb) {\n  let index = arr.length;\n  while (index-- > 0) {\n    if (cb(arr[index], index, arr))\n      return arr[index];\n  }\n  return void 0;\n}\nfunction useArrayFindLast(list, fn) {\n  return computed(() => toValue(\n    !Array.prototype.findLast ? findLast(toValue(list), (element, index, array) => fn(toValue(element), index, array)) : toValue(list).findLast((element, index, array) => fn(toValue(element), index, array))\n  ));\n}\n\nfunction isArrayIncludesOptions(obj) {\n  return isObject(obj) && containsProp(obj, \"formIndex\", \"comparator\");\n}\nfunction useArrayIncludes(...args) {\n  var _a;\n  const list = args[0];\n  const value = args[1];\n  let comparator = args[2];\n  let formIndex = 0;\n  if (isArrayIncludesOptions(comparator)) {\n    formIndex = (_a = comparator.fromIndex) != null ? _a : 0;\n    comparator = comparator.comparator;\n  }\n  if (typeof comparator === \"string\") {\n    const key = comparator;\n    comparator = (element, value2) => element[key] === toValue(value2);\n  }\n  comparator = comparator != null ? comparator : (element, value2) => element === toValue(value2);\n  return computed(() => toValue(list).slice(formIndex).some((element, index, array) => comparator(\n    toValue(element),\n    toValue(value),\n    index,\n    toValue(array)\n  )));\n}\n\nfunction useArrayJoin(list, separator) {\n  return computed(() => toValue(list).map((i) => toValue(i)).join(toValue(separator)));\n}\n\nfunction useArrayMap(list, fn) {\n  return computed(() => toValue(list).map((i) => toValue(i)).map(fn));\n}\n\nfunction useArrayReduce(list, reducer, ...args) {\n  const reduceCallback = (sum, value, index) => reducer(toValue(sum), toValue(value), index);\n  return computed(() => {\n    const resolved = toValue(list);\n    return args.length ? resolved.reduce(reduceCallback, toValue(args[0])) : resolved.reduce(reduceCallback);\n  });\n}\n\nfunction useArraySome(list, fn) {\n  return computed(() => toValue(list).some((element, index, array) => fn(toValue(element), index, array)));\n}\n\nfunction uniq(array) {\n  return Array.from(new Set(array));\n}\nfunction uniqueElementsBy(array, fn) {\n  return array.reduce((acc, v) => {\n    if (!acc.some((x) => fn(v, x, array)))\n      acc.push(v);\n    return acc;\n  }, []);\n}\nfunction useArrayUnique(list, compareFn) {\n  return computed(() => {\n    const resolvedList = toValue(list).map((element) => toValue(element));\n    return compareFn ? uniqueElementsBy(resolvedList, compareFn) : uniq(resolvedList);\n  });\n}\n\nfunction useCounter(initialValue = 0, options = {}) {\n  let _initialValue = unref(initialValue);\n  const count = ref(initialValue);\n  const {\n    max = Number.POSITIVE_INFINITY,\n    min = Number.NEGATIVE_INFINITY\n  } = options;\n  const inc = (delta = 1) => count.value = Math.max(Math.min(max, count.value + delta), min);\n  const dec = (delta = 1) => count.value = Math.min(Math.max(min, count.value - delta), max);\n  const get = () => count.value;\n  const set = (val) => count.value = Math.max(min, Math.min(max, val));\n  const reset = (val = _initialValue) => {\n    _initialValue = val;\n    return set(val);\n  };\n  return { count, inc, dec, get, set, reset };\n}\n\nconst REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/;\nconst REGEX_FORMAT = /[YMDHhms]o|\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|SSS/g;\nfunction defaultMeridiem(hours, minutes, isLowercase, hasPeriod) {\n  let m = hours < 12 ? \"AM\" : \"PM\";\n  if (hasPeriod)\n    m = m.split(\"\").reduce((acc, curr) => acc += `${curr}.`, \"\");\n  return isLowercase ? m.toLowerCase() : m;\n}\nfunction formatOrdinal(num) {\n  const suffixes = [\"th\", \"st\", \"nd\", \"rd\"];\n  const v = num % 100;\n  return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n}\nfunction formatDate(date, formatStr, options = {}) {\n  var _a;\n  const years = date.getFullYear();\n  const month = date.getMonth();\n  const days = date.getDate();\n  const hours = date.getHours();\n  const minutes = date.getMinutes();\n  const seconds = date.getSeconds();\n  const milliseconds = date.getMilliseconds();\n  const day = date.getDay();\n  const meridiem = (_a = options.customMeridiem) != null ? _a : defaultMeridiem;\n  const matches = {\n    Yo: () => formatOrdinal(years),\n    YY: () => String(years).slice(-2),\n    YYYY: () => years,\n    M: () => month + 1,\n    Mo: () => formatOrdinal(month + 1),\n    MM: () => `${month + 1}`.padStart(2, \"0\"),\n    MMM: () => date.toLocaleDateString(options.locales, { month: \"short\" }),\n    MMMM: () => date.toLocaleDateString(options.locales, { month: \"long\" }),\n    D: () => String(days),\n    Do: () => formatOrdinal(days),\n    DD: () => `${days}`.padStart(2, \"0\"),\n    H: () => String(hours),\n    Ho: () => formatOrdinal(hours),\n    HH: () => `${hours}`.padStart(2, \"0\"),\n    h: () => `${hours % 12 || 12}`.padStart(1, \"0\"),\n    ho: () => formatOrdinal(hours % 12 || 12),\n    hh: () => `${hours % 12 || 12}`.padStart(2, \"0\"),\n    m: () => String(minutes),\n    mo: () => formatOrdinal(minutes),\n    mm: () => `${minutes}`.padStart(2, \"0\"),\n    s: () => String(seconds),\n    so: () => formatOrdinal(seconds),\n    ss: () => `${seconds}`.padStart(2, \"0\"),\n    SSS: () => `${milliseconds}`.padStart(3, \"0\"),\n    d: () => day,\n    dd: () => date.toLocaleDateString(options.locales, { weekday: \"narrow\" }),\n    ddd: () => date.toLocaleDateString(options.locales, { weekday: \"short\" }),\n    dddd: () => date.toLocaleDateString(options.locales, { weekday: \"long\" }),\n    A: () => meridiem(hours, minutes),\n    AA: () => meridiem(hours, minutes, false, true),\n    a: () => meridiem(hours, minutes, true),\n    aa: () => meridiem(hours, minutes, true, true)\n  };\n  return formatStr.replace(REGEX_FORMAT, (match, $1) => {\n    var _a2, _b;\n    return (_b = $1 != null ? $1 : (_a2 = matches[match]) == null ? void 0 : _a2.call(matches)) != null ? _b : match;\n  });\n}\nfunction normalizeDate(date) {\n  if (date === null)\n    return new Date(Number.NaN);\n  if (date === void 0)\n    return /* @__PURE__ */ new Date();\n  if (date instanceof Date)\n    return new Date(date);\n  if (typeof date === \"string\" && !/Z$/i.test(date)) {\n    const d = date.match(REGEX_PARSE);\n    if (d) {\n      const m = d[2] - 1 || 0;\n      const ms = (d[7] || \"0\").substring(0, 3);\n      return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n    }\n  }\n  return new Date(date);\n}\nfunction useDateFormat(date, formatStr = \"HH:mm:ss\", options = {}) {\n  return computed(() => formatDate(normalizeDate(toValue(date)), toValue(formatStr), options));\n}\n\nfunction useIntervalFn(cb, interval = 1e3, options = {}) {\n  const {\n    immediate = true,\n    immediateCallback = false\n  } = options;\n  let timer = null;\n  const isActive = ref(false);\n  function clean() {\n    if (timer) {\n      clearInterval(timer);\n      timer = null;\n    }\n  }\n  function pause() {\n    isActive.value = false;\n    clean();\n  }\n  function resume() {\n    const intervalValue = toValue(interval);\n    if (intervalValue <= 0)\n      return;\n    isActive.value = true;\n    if (immediateCallback)\n      cb();\n    clean();\n    timer = setInterval(cb, intervalValue);\n  }\n  if (immediate && isClient)\n    resume();\n  if (isRef(interval) || typeof interval === \"function\") {\n    const stopWatch = watch(interval, () => {\n      if (isActive.value && isClient)\n        resume();\n    });\n    tryOnScopeDispose(stopWatch);\n  }\n  tryOnScopeDispose(pause);\n  return {\n    isActive,\n    pause,\n    resume\n  };\n}\n\nfunction useInterval(interval = 1e3, options = {}) {\n  const {\n    controls: exposeControls = false,\n    immediate = true,\n    callback\n  } = options;\n  const counter = ref(0);\n  const update = () => counter.value += 1;\n  const reset = () => {\n    counter.value = 0;\n  };\n  const controls = useIntervalFn(\n    callback ? () => {\n      update();\n      callback(counter.value);\n    } : update,\n    interval,\n    { immediate }\n  );\n  if (exposeControls) {\n    return {\n      counter,\n      reset,\n      ...controls\n    };\n  } else {\n    return counter;\n  }\n}\n\nfunction useLastChanged(source, options = {}) {\n  var _a;\n  const ms = ref((_a = options.initialValue) != null ? _a : null);\n  watch(\n    source,\n    () => ms.value = timestamp(),\n    options\n  );\n  return ms;\n}\n\nfunction useTimeoutFn(cb, interval, options = {}) {\n  const {\n    immediate = true\n  } = options;\n  const isPending = ref(false);\n  let timer = null;\n  function clear() {\n    if (timer) {\n      clearTimeout(timer);\n      timer = null;\n    }\n  }\n  function stop() {\n    isPending.value = false;\n    clear();\n  }\n  function start(...args) {\n    clear();\n    isPending.value = true;\n    timer = setTimeout(() => {\n      isPending.value = false;\n      timer = null;\n      cb(...args);\n    }, toValue(interval));\n  }\n  if (immediate) {\n    isPending.value = true;\n    if (isClient)\n      start();\n  }\n  tryOnScopeDispose(stop);\n  return {\n    isPending: readonly(isPending),\n    start,\n    stop\n  };\n}\n\nfunction useTimeout(interval = 1e3, options = {}) {\n  const {\n    controls: exposeControls = false,\n    callback\n  } = options;\n  const controls = useTimeoutFn(\n    callback != null ? callback : noop,\n    interval,\n    options\n  );\n  const ready = computed(() => !controls.isPending.value);\n  if (exposeControls) {\n    return {\n      ready,\n      ...controls\n    };\n  } else {\n    return ready;\n  }\n}\n\nfunction useToNumber(value, options = {}) {\n  const {\n    method = \"parseFloat\",\n    radix,\n    nanToZero\n  } = options;\n  return computed(() => {\n    let resolved = toValue(value);\n    if (typeof resolved === \"string\")\n      resolved = Number[method](resolved, radix);\n    if (nanToZero && Number.isNaN(resolved))\n      resolved = 0;\n    return resolved;\n  });\n}\n\nfunction useToString(value) {\n  return computed(() => `${toValue(value)}`);\n}\n\nfunction useToggle(initialValue = false, options = {}) {\n  const {\n    truthyValue = true,\n    falsyValue = false\n  } = options;\n  const valueIsRef = isRef(initialValue);\n  const _value = ref(initialValue);\n  function toggle(value) {\n    if (arguments.length) {\n      _value.value = value;\n      return _value.value;\n    } else {\n      const truthy = toValue(truthyValue);\n      _value.value = _value.value === truthy ? toValue(falsyValue) : truthy;\n      return _value.value;\n    }\n  }\n  if (valueIsRef)\n    return toggle;\n  else\n    return [_value, toggle];\n}\n\nfunction watchArray(source, cb, options) {\n  let oldList = (options == null ? void 0 : options.immediate) ? [] : [...source instanceof Function ? source() : Array.isArray(source) ? source : toValue(source)];\n  return watch(source, (newList, _, onCleanup) => {\n    const oldListRemains = Array.from({ length: oldList.length });\n    const added = [];\n    for (const obj of newList) {\n      let found = false;\n      for (let i = 0; i < oldList.length; i++) {\n        if (!oldListRemains[i] && obj === oldList[i]) {\n          oldListRemains[i] = true;\n          found = true;\n          break;\n        }\n      }\n      if (!found)\n        added.push(obj);\n    }\n    const removed = oldList.filter((_2, i) => !oldListRemains[i]);\n    cb(newList, oldList, added, removed, onCleanup);\n    oldList = [...newList];\n  }, options);\n}\n\nfunction watchAtMost(source, cb, options) {\n  const {\n    count,\n    ...watchOptions\n  } = options;\n  const current = ref(0);\n  const stop = watchWithFilter(\n    source,\n    (...args) => {\n      current.value += 1;\n      if (current.value >= toValue(count))\n        nextTick(() => stop());\n      cb(...args);\n    },\n    watchOptions\n  );\n  return { count: current, stop };\n}\n\nfunction watchDebounced(source, cb, options = {}) {\n  const {\n    debounce = 0,\n    maxWait = void 0,\n    ...watchOptions\n  } = options;\n  return watchWithFilter(\n    source,\n    cb,\n    {\n      ...watchOptions,\n      eventFilter: debounceFilter(debounce, { maxWait })\n    }\n  );\n}\n\nfunction watchDeep(source, cb, options) {\n  return watch(\n    source,\n    cb,\n    {\n      ...options,\n      deep: true\n    }\n  );\n}\n\nfunction watchIgnorable(source, cb, options = {}) {\n  const {\n    eventFilter = bypassFilter,\n    ...watchOptions\n  } = options;\n  const filteredCb = createFilterWrapper(\n    eventFilter,\n    cb\n  );\n  let ignoreUpdates;\n  let ignorePrevAsyncUpdates;\n  let stop;\n  if (watchOptions.flush === \"sync\") {\n    const ignore = ref(false);\n    ignorePrevAsyncUpdates = () => {\n    };\n    ignoreUpdates = (updater) => {\n      ignore.value = true;\n      updater();\n      ignore.value = false;\n    };\n    stop = watch(\n      source,\n      (...args) => {\n        if (!ignore.value)\n          filteredCb(...args);\n      },\n      watchOptions\n    );\n  } else {\n    const disposables = [];\n    const ignoreCounter = ref(0);\n    const syncCounter = ref(0);\n    ignorePrevAsyncUpdates = () => {\n      ignoreCounter.value = syncCounter.value;\n    };\n    disposables.push(\n      watch(\n        source,\n        () => {\n          syncCounter.value++;\n        },\n        { ...watchOptions, flush: \"sync\" }\n      )\n    );\n    ignoreUpdates = (updater) => {\n      const syncCounterPrev = syncCounter.value;\n      updater();\n      ignoreCounter.value += syncCounter.value - syncCounterPrev;\n    };\n    disposables.push(\n      watch(\n        source,\n        (...args) => {\n          const ignore = ignoreCounter.value > 0 && ignoreCounter.value === syncCounter.value;\n          ignoreCounter.value = 0;\n          syncCounter.value = 0;\n          if (ignore)\n            return;\n          filteredCb(...args);\n        },\n        watchOptions\n      )\n    );\n    stop = () => {\n      disposables.forEach((fn) => fn());\n    };\n  }\n  return { stop, ignoreUpdates, ignorePrevAsyncUpdates };\n}\n\nfunction watchImmediate(source, cb, options) {\n  return watch(\n    source,\n    cb,\n    {\n      ...options,\n      immediate: true\n    }\n  );\n}\n\nfunction watchOnce(source, cb, options) {\n  const stop = watch(source, (...args) => {\n    nextTick(() => stop());\n    return cb(...args);\n  }, options);\n  return stop;\n}\n\nfunction watchThrottled(source, cb, options = {}) {\n  const {\n    throttle = 0,\n    trailing = true,\n    leading = true,\n    ...watchOptions\n  } = options;\n  return watchWithFilter(\n    source,\n    cb,\n    {\n      ...watchOptions,\n      eventFilter: throttleFilter(throttle, trailing, leading)\n    }\n  );\n}\n\nfunction watchTriggerable(source, cb, options = {}) {\n  let cleanupFn;\n  function onEffect() {\n    if (!cleanupFn)\n      return;\n    const fn = cleanupFn;\n    cleanupFn = void 0;\n    fn();\n  }\n  function onCleanup(callback) {\n    cleanupFn = callback;\n  }\n  const _cb = (value, oldValue) => {\n    onEffect();\n    return cb(value, oldValue, onCleanup);\n  };\n  const res = watchIgnorable(source, _cb, options);\n  const { ignoreUpdates } = res;\n  const trigger = () => {\n    let res2;\n    ignoreUpdates(() => {\n      res2 = _cb(getWatchSources(source), getOldValue(source));\n    });\n    return res2;\n  };\n  return {\n    ...res,\n    trigger\n  };\n}\nfunction getWatchSources(sources) {\n  if (isReactive(sources))\n    return sources;\n  if (Array.isArray(sources))\n    return sources.map((item) => toValue(item));\n  return toValue(sources);\n}\nfunction getOldValue(source) {\n  return Array.isArray(source) ? source.map(() => void 0) : void 0;\n}\n\nfunction whenever(source, cb, options) {\n  const stop = watch(\n    source,\n    (v, ov, onInvalidate) => {\n      if (v) {\n        if (options == null ? void 0 : options.once)\n          nextTick(() => stop());\n        cb(v, ov, onInvalidate);\n      }\n    },\n    {\n      ...options,\n      once: false\n    }\n  );\n  return stop;\n}\n\nexport { assert, refAutoReset as autoResetRef, bypassFilter, camelize, clamp, computedEager, computedWithControl, containsProp, computedWithControl as controlledComputed, controlledRef, createEventHook, createFilterWrapper, createGlobalState, createInjectionState, reactify as createReactiveFn, createSharedComposable, createSingletonPromise, debounceFilter, refDebounced as debouncedRef, watchDebounced as debouncedWatch, directiveHooks, computedEager as eagerComputed, extendRef, formatDate, get, getLifeCycleTarget, hasOwn, hyphenate, identity, watchIgnorable as ignorableWatch, increaseWithUnit, injectLocal, invoke, isClient, isDef, isDefined, isIOS, isObject, isWorker, makeDestructurable, noop, normalizeDate, notNullish, now, objectEntries, objectOmit, objectPick, pausableFilter, watchPausable as pausableWatch, promiseTimeout, provideLocal, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refAutoReset, refDebounced, refDefault, refThrottled, refWithControl, resolveRef, resolveUnref, set, syncRef, syncRefs, throttleFilter, refThrottled as throttledRef, watchThrottled as throttledWatch, timestamp, toReactive, toRef, toRefs, toValue, tryOnBeforeMount, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useArrayDifference, useArrayEvery, useArrayFilter, useArrayFind, useArrayFindIndex, useArrayFindLast, useArrayIncludes, useArrayJoin, useArrayMap, useArrayReduce, useArraySome, useArrayUnique, useCounter, useDateFormat, refDebounced as useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, refThrottled as useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToNumber, useToString, useToggle, watchArray, watchAtMost, watchDebounced, watchDeep, watchIgnorable, watchImmediate, watchOnce, watchPausable, watchThrottled, watchTriggerable, watchWithFilter, whenever };\n","import { noop, makeDestructurable, camelize, toValue, isClient, isObject, tryOnScopeDispose, isIOS, tryOnMounted, objectOmit, promiseTimeout, until, increaseWithUnit, objectEntries, createSingletonPromise, useTimeoutFn, pausableWatch, toRef, createEventHook, notNullish, computedWithControl, timestamp, pausableFilter, watchIgnorable, debounceFilter, createFilterWrapper, bypassFilter, toRefs, useIntervalFn, containsProp, hasOwn, throttleFilter, useDebounceFn, useThrottleFn, clamp, syncRef, objectPick, tryOnUnmounted, watchWithFilter, tryOnBeforeUnmount, identity, isDef, isWorker } from '@vueuse/shared';\nexport * from '@vueuse/shared';\nimport { isRef, ref, shallowRef, watchEffect, computed, inject, isVue3, version, defineComponent, h, TransitionGroup, shallowReactive, Fragment, watch, getCurrentInstance, customRef, onUpdated, onMounted, isVue2, readonly, nextTick, reactive, markRaw, unref, getCurrentScope, set, del, isReadonly, onBeforeUpdate } from 'vue-demi';\n\nfunction computedAsync(evaluationCallback, initialState, optionsOrRef) {\n  let options;\n  if (isRef(optionsOrRef)) {\n    options = {\n      evaluating: optionsOrRef\n    };\n  } else {\n    options = optionsOrRef || {};\n  }\n  const {\n    lazy = false,\n    evaluating = void 0,\n    shallow = true,\n    onError = noop\n  } = options;\n  const started = ref(!lazy);\n  const current = shallow ? shallowRef(initialState) : ref(initialState);\n  let counter = 0;\n  watchEffect(async (onInvalidate) => {\n    if (!started.value)\n      return;\n    counter++;\n    const counterAtBeginning = counter;\n    let hasFinished = false;\n    if (evaluating) {\n      Promise.resolve().then(() => {\n        evaluating.value = true;\n      });\n    }\n    try {\n      const result = await evaluationCallback((cancelCallback) => {\n        onInvalidate(() => {\n          if (evaluating)\n            evaluating.value = false;\n          if (!hasFinished)\n            cancelCallback();\n        });\n      });\n      if (counterAtBeginning === counter)\n        current.value = result;\n    } catch (e) {\n      onError(e);\n    } finally {\n      if (evaluating && counterAtBeginning === counter)\n        evaluating.value = false;\n      hasFinished = true;\n    }\n  });\n  if (lazy) {\n    return computed(() => {\n      started.value = true;\n      return current.value;\n    });\n  } else {\n    return current;\n  }\n}\n\nfunction computedInject(key, options, defaultSource, treatDefaultAsFactory) {\n  let source = inject(key);\n  if (defaultSource)\n    source = inject(key, defaultSource);\n  if (treatDefaultAsFactory)\n    source = inject(key, defaultSource, treatDefaultAsFactory);\n  if (typeof options === \"function\") {\n    return computed((ctx) => options(source, ctx));\n  } else {\n    return computed({\n      get: (ctx) => options.get(source, ctx),\n      set: options.set\n    });\n  }\n}\n\nfunction createReusableTemplate(options = {}) {\n  if (!isVue3 && !version.startsWith(\"2.7.\")) {\n    if (process.env.NODE_ENV !== \"production\")\n      throw new Error(\"[VueUse] createReusableTemplate only works in Vue 2.7 or above.\");\n    return;\n  }\n  const {\n    inheritAttrs = true\n  } = options;\n  const render = shallowRef();\n  const define = /* #__PURE__ */ defineComponent({\n    setup(_, { slots }) {\n      return () => {\n        render.value = slots.default;\n      };\n    }\n  });\n  const reuse = /* #__PURE__ */ defineComponent({\n    inheritAttrs,\n    setup(_, { attrs, slots }) {\n      return () => {\n        var _a;\n        if (!render.value && process.env.NODE_ENV !== \"production\")\n          throw new Error(\"[VueUse] Failed to find the definition of reusable template\");\n        const vnode = (_a = render.value) == null ? void 0 : _a.call(render, { ...keysToCamelKebabCase(attrs), $slots: slots });\n        return inheritAttrs && (vnode == null ? void 0 : vnode.length) === 1 ? vnode[0] : vnode;\n      };\n    }\n  });\n  return makeDestructurable(\n    { define, reuse },\n    [define, reuse]\n  );\n}\nfunction keysToCamelKebabCase(obj) {\n  const newObj = {};\n  for (const key in obj)\n    newObj[camelize(key)] = obj[key];\n  return newObj;\n}\n\nfunction createTemplatePromise(options = {}) {\n  if (!isVue3) {\n    if (process.env.NODE_ENV !== \"production\")\n      throw new Error(\"[VueUse] createTemplatePromise only works in Vue 3 or above.\");\n    return;\n  }\n  let index = 0;\n  const instances = ref([]);\n  function create(...args) {\n    const props = shallowReactive({\n      key: index++,\n      args,\n      promise: void 0,\n      resolve: () => {\n      },\n      reject: () => {\n      },\n      isResolving: false,\n      options\n    });\n    instances.value.push(props);\n    props.promise = new Promise((_resolve, _reject) => {\n      props.resolve = (v) => {\n        props.isResolving = true;\n        return _resolve(v);\n      };\n      props.reject = _reject;\n    }).finally(() => {\n      props.promise = void 0;\n      const index2 = instances.value.indexOf(props);\n      if (index2 !== -1)\n        instances.value.splice(index2, 1);\n    });\n    return props.promise;\n  }\n  function start(...args) {\n    if (options.singleton && instances.value.length > 0)\n      return instances.value[0].promise;\n    return create(...args);\n  }\n  const component = /* #__PURE__ */ defineComponent((_, { slots }) => {\n    const renderList = () => instances.value.map((props) => {\n      var _a;\n      return h(Fragment, { key: props.key }, (_a = slots.default) == null ? void 0 : _a.call(slots, props));\n    });\n    if (options.transition)\n      return () => h(TransitionGroup, options.transition, renderList);\n    return renderList;\n  });\n  component.start = start;\n  return component;\n}\n\nfunction createUnrefFn(fn) {\n  return function(...args) {\n    return fn.apply(this, args.map((i) => toValue(i)));\n  };\n}\n\nfunction unrefElement(elRef) {\n  var _a;\n  const plain = toValue(elRef);\n  return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\n\nconst defaultWindow = isClient ? window : void 0;\nconst defaultDocument = isClient ? window.document : void 0;\nconst defaultNavigator = isClient ? window.navigator : void 0;\nconst defaultLocation = isClient ? window.location : void 0;\n\nfunction useEventListener(...args) {\n  let target;\n  let events;\n  let listeners;\n  let options;\n  if (typeof args[0] === \"string\" || Array.isArray(args[0])) {\n    [events, listeners, options] = args;\n    target = defaultWindow;\n  } else {\n    [target, events, listeners, options] = args;\n  }\n  if (!target)\n    return noop;\n  if (!Array.isArray(events))\n    events = [events];\n  if (!Array.isArray(listeners))\n    listeners = [listeners];\n  const cleanups = [];\n  const cleanup = () => {\n    cleanups.forEach((fn) => fn());\n    cleanups.length = 0;\n  };\n  const register = (el, event, listener, options2) => {\n    el.addEventListener(event, listener, options2);\n    return () => el.removeEventListener(event, listener, options2);\n  };\n  const stopWatch = watch(\n    () => [unrefElement(target), toValue(options)],\n    ([el, options2]) => {\n      cleanup();\n      if (!el)\n        return;\n      const optionsClone = isObject(options2) ? { ...options2 } : options2;\n      cleanups.push(\n        ...events.flatMap((event) => {\n          return listeners.map((listener) => register(el, event, listener, optionsClone));\n        })\n      );\n    },\n    { immediate: true, flush: \"post\" }\n  );\n  const stop = () => {\n    stopWatch();\n    cleanup();\n  };\n  tryOnScopeDispose(stop);\n  return stop;\n}\n\nlet _iOSWorkaround = false;\nfunction onClickOutside(target, handler, options = {}) {\n  const { window = defaultWindow, ignore = [], capture = true, detectIframe = false } = options;\n  if (!window)\n    return noop;\n  if (isIOS && !_iOSWorkaround) {\n    _iOSWorkaround = true;\n    Array.from(window.document.body.children).forEach((el) => el.addEventListener(\"click\", noop));\n    window.document.documentElement.addEventListener(\"click\", noop);\n  }\n  let shouldListen = true;\n  const shouldIgnore = (event) => {\n    return ignore.some((target2) => {\n      if (typeof target2 === \"string\") {\n        return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));\n      } else {\n        const el = unrefElement(target2);\n        return el && (event.target === el || event.composedPath().includes(el));\n      }\n    });\n  };\n  const listener = (event) => {\n    const el = unrefElement(target);\n    if (!el || el === event.target || event.composedPath().includes(el))\n      return;\n    if (event.detail === 0)\n      shouldListen = !shouldIgnore(event);\n    if (!shouldListen) {\n      shouldListen = true;\n      return;\n    }\n    handler(event);\n  };\n  const cleanup = [\n    useEventListener(window, \"click\", listener, { passive: true, capture }),\n    useEventListener(window, \"pointerdown\", (e) => {\n      const el = unrefElement(target);\n      shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));\n    }, { passive: true }),\n    detectIframe && useEventListener(window, \"blur\", (event) => {\n      setTimeout(() => {\n        var _a;\n        const el = unrefElement(target);\n        if (((_a = window.document.activeElement) == null ? void 0 : _a.tagName) === \"IFRAME\" && !(el == null ? void 0 : el.contains(window.document.activeElement)))\n          handler(event);\n      }, 0);\n    })\n  ].filter(Boolean);\n  const stop = () => cleanup.forEach((fn) => fn());\n  return stop;\n}\n\nfunction createKeyPredicate(keyFilter) {\n  if (typeof keyFilter === \"function\")\n    return keyFilter;\n  else if (typeof keyFilter === \"string\")\n    return (event) => event.key === keyFilter;\n  else if (Array.isArray(keyFilter))\n    return (event) => keyFilter.includes(event.key);\n  return () => true;\n}\nfunction onKeyStroke(...args) {\n  let key;\n  let handler;\n  let options = {};\n  if (args.length === 3) {\n    key = args[0];\n    handler = args[1];\n    options = args[2];\n  } else if (args.length === 2) {\n    if (typeof args[1] === \"object\") {\n      key = true;\n      handler = args[0];\n      options = args[1];\n    } else {\n      key = args[0];\n      handler = args[1];\n    }\n  } else {\n    key = true;\n    handler = args[0];\n  }\n  const {\n    target = defaultWindow,\n    eventName = \"keydown\",\n    passive = false,\n    dedupe = false\n  } = options;\n  const predicate = createKeyPredicate(key);\n  const listener = (e) => {\n    if (e.repeat && toValue(dedupe))\n      return;\n    if (predicate(e))\n      handler(e);\n  };\n  return useEventListener(target, eventName, listener, passive);\n}\nfunction onKeyDown(key, handler, options = {}) {\n  return onKeyStroke(key, handler, { ...options, eventName: \"keydown\" });\n}\nfunction onKeyPressed(key, handler, options = {}) {\n  return onKeyStroke(key, handler, { ...options, eventName: \"keypress\" });\n}\nfunction onKeyUp(key, handler, options = {}) {\n  return onKeyStroke(key, handler, { ...options, eventName: \"keyup\" });\n}\n\nconst DEFAULT_DELAY = 500;\nconst DEFAULT_THRESHOLD = 10;\nfunction onLongPress(target, handler, options) {\n  var _a, _b;\n  const elementRef = computed(() => unrefElement(target));\n  let timeout;\n  let posStart;\n  function clear() {\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = void 0;\n    }\n    posStart = void 0;\n  }\n  function onDown(ev) {\n    var _a2, _b2, _c, _d;\n    if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n      return;\n    clear();\n    if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n      ev.preventDefault();\n    if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n      ev.stopPropagation();\n    posStart = {\n      x: ev.x,\n      y: ev.y\n    };\n    timeout = setTimeout(\n      () => handler(ev),\n      (_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY\n    );\n  }\n  function onMove(ev) {\n    var _a2, _b2, _c, _d;\n    if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n      return;\n    if (!posStart || (options == null ? void 0 : options.distanceThreshold) === false)\n      return;\n    if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n      ev.preventDefault();\n    if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n      ev.stopPropagation();\n    const dx = ev.x - posStart.x;\n    const dy = ev.y - posStart.y;\n    const distance = Math.sqrt(dx * dx + dy * dy);\n    if (distance >= ((_d = options == null ? void 0 : options.distanceThreshold) != null ? _d : DEFAULT_THRESHOLD))\n      clear();\n  }\n  const listenerOptions = {\n    capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,\n    once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once\n  };\n  const cleanup = [\n    useEventListener(elementRef, \"pointerdown\", onDown, listenerOptions),\n    useEventListener(elementRef, \"pointermove\", onMove, listenerOptions),\n    useEventListener(elementRef, [\"pointerup\", \"pointerleave\"], clear, listenerOptions)\n  ];\n  const stop = () => cleanup.forEach((fn) => fn());\n  return stop;\n}\n\nfunction isFocusedElementEditable() {\n  const { activeElement, body } = document;\n  if (!activeElement)\n    return false;\n  if (activeElement === body)\n    return false;\n  switch (activeElement.tagName) {\n    case \"INPUT\":\n    case \"TEXTAREA\":\n      return true;\n  }\n  return activeElement.hasAttribute(\"contenteditable\");\n}\nfunction isTypedCharValid({\n  keyCode,\n  metaKey,\n  ctrlKey,\n  altKey\n}) {\n  if (metaKey || ctrlKey || altKey)\n    return false;\n  if (keyCode >= 48 && keyCode <= 57)\n    return true;\n  if (keyCode >= 65 && keyCode <= 90)\n    return true;\n  if (keyCode >= 97 && keyCode <= 122)\n    return true;\n  return false;\n}\nfunction onStartTyping(callback, options = {}) {\n  const { document: document2 = defaultDocument } = options;\n  const keydown = (event) => {\n    !isFocusedElementEditable() && isTypedCharValid(event) && callback(event);\n  };\n  if (document2)\n    useEventListener(document2, \"keydown\", keydown, { passive: true });\n}\n\nfunction templateRef(key, initialValue = null) {\n  const instance = getCurrentInstance();\n  let _trigger = () => {\n  };\n  const element = customRef((track, trigger) => {\n    _trigger = trigger;\n    return {\n      get() {\n        var _a, _b;\n        track();\n        return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;\n      },\n      set() {\n      }\n    };\n  });\n  tryOnMounted(_trigger);\n  onUpdated(_trigger);\n  return element;\n}\n\nfunction useActiveElement(options = {}) {\n  var _a;\n  const {\n    window = defaultWindow,\n    deep = true\n  } = options;\n  const document = (_a = options.document) != null ? _a : window == null ? void 0 : window.document;\n  const getDeepActiveElement = () => {\n    var _a2;\n    let element = document == null ? void 0 : document.activeElement;\n    if (deep) {\n      while (element == null ? void 0 : element.shadowRoot)\n        element = (_a2 = element == null ? void 0 : element.shadowRoot) == null ? void 0 : _a2.activeElement;\n    }\n    return element;\n  };\n  const activeElement = ref();\n  const trigger = () => {\n    activeElement.value = getDeepActiveElement();\n  };\n  if (window) {\n    useEventListener(window, \"blur\", (event) => {\n      if (event.relatedTarget !== null)\n        return;\n      trigger();\n    }, true);\n    useEventListener(window, \"focus\", trigger, true);\n  }\n  trigger();\n  return activeElement;\n}\n\nfunction useMounted() {\n  const isMounted = ref(false);\n  const instance = getCurrentInstance();\n  if (instance) {\n    onMounted(() => {\n      isMounted.value = true;\n    }, isVue2 ? null : instance);\n  }\n  return isMounted;\n}\n\nfunction useSupported(callback) {\n  const isMounted = useMounted();\n  return computed(() => {\n    isMounted.value;\n    return Boolean(callback());\n  });\n}\n\nfunction useRafFn(fn, options = {}) {\n  const {\n    immediate = true,\n    fpsLimit = void 0,\n    window = defaultWindow\n  } = options;\n  const isActive = ref(false);\n  const intervalLimit = fpsLimit ? 1e3 / fpsLimit : null;\n  let previousFrameTimestamp = 0;\n  let rafId = null;\n  function loop(timestamp) {\n    if (!isActive.value || !window)\n      return;\n    if (!previousFrameTimestamp)\n      previousFrameTimestamp = timestamp;\n    const delta = timestamp - previousFrameTimestamp;\n    if (intervalLimit && delta < intervalLimit) {\n      rafId = window.requestAnimationFrame(loop);\n      return;\n    }\n    previousFrameTimestamp = timestamp;\n    fn({ delta, timestamp });\n    rafId = window.requestAnimationFrame(loop);\n  }\n  function resume() {\n    if (!isActive.value && window) {\n      isActive.value = true;\n      previousFrameTimestamp = 0;\n      rafId = window.requestAnimationFrame(loop);\n    }\n  }\n  function pause() {\n    isActive.value = false;\n    if (rafId != null && window) {\n      window.cancelAnimationFrame(rafId);\n      rafId = null;\n    }\n  }\n  if (immediate)\n    resume();\n  tryOnScopeDispose(pause);\n  return {\n    isActive: readonly(isActive),\n    pause,\n    resume\n  };\n}\n\nfunction useAnimate(target, keyframes, options) {\n  let config;\n  let animateOptions;\n  if (isObject(options)) {\n    config = options;\n    animateOptions = objectOmit(options, [\"window\", \"immediate\", \"commitStyles\", \"persist\", \"onReady\", \"onError\"]);\n  } else {\n    config = { duration: options };\n    animateOptions = options;\n  }\n  const {\n    window = defaultWindow,\n    immediate = true,\n    commitStyles,\n    persist,\n    playbackRate: _playbackRate = 1,\n    onReady,\n    onError = (e) => {\n      console.error(e);\n    }\n  } = config;\n  const isSupported = useSupported(() => window && HTMLElement && \"animate\" in HTMLElement.prototype);\n  const animate = shallowRef(void 0);\n  const store = shallowReactive({\n    startTime: null,\n    currentTime: null,\n    timeline: null,\n    playbackRate: _playbackRate,\n    pending: false,\n    playState: immediate ? \"idle\" : \"paused\",\n    replaceState: \"active\"\n  });\n  const pending = computed(() => store.pending);\n  const playState = computed(() => store.playState);\n  const replaceState = computed(() => store.replaceState);\n  const startTime = computed({\n    get() {\n      return store.startTime;\n    },\n    set(value) {\n      store.startTime = value;\n      if (animate.value)\n        animate.value.startTime = value;\n    }\n  });\n  const currentTime = computed({\n    get() {\n      return store.currentTime;\n    },\n    set(value) {\n      store.currentTime = value;\n      if (animate.value) {\n        animate.value.currentTime = value;\n        syncResume();\n      }\n    }\n  });\n  const timeline = computed({\n    get() {\n      return store.timeline;\n    },\n    set(value) {\n      store.timeline = value;\n      if (animate.value)\n        animate.value.timeline = value;\n    }\n  });\n  const playbackRate = computed({\n    get() {\n      return store.playbackRate;\n    },\n    set(value) {\n      store.playbackRate = value;\n      if (animate.value)\n        animate.value.playbackRate = value;\n    }\n  });\n  const play = () => {\n    if (animate.value) {\n      try {\n        animate.value.play();\n        syncResume();\n      } catch (e) {\n        syncPause();\n        onError(e);\n      }\n    } else {\n      update();\n    }\n  };\n  const pause = () => {\n    var _a;\n    try {\n      (_a = animate.value) == null ? void 0 : _a.pause();\n      syncPause();\n    } catch (e) {\n      onError(e);\n    }\n  };\n  const reverse = () => {\n    var _a;\n    !animate.value && update();\n    try {\n      (_a = animate.value) == null ? void 0 : _a.reverse();\n      syncResume();\n    } catch (e) {\n      syncPause();\n      onError(e);\n    }\n  };\n  const finish = () => {\n    var _a;\n    try {\n      (_a = animate.value) == null ? void 0 : _a.finish();\n      syncPause();\n    } catch (e) {\n      onError(e);\n    }\n  };\n  const cancel = () => {\n    var _a;\n    try {\n      (_a = animate.value) == null ? void 0 : _a.cancel();\n      syncPause();\n    } catch (e) {\n      onError(e);\n    }\n  };\n  watch(() => unrefElement(target), (el) => {\n    el && update();\n  });\n  watch(() => keyframes, (value) => {\n    !animate.value && update();\n    if (!unrefElement(target) && animate.value) {\n      animate.value.effect = new KeyframeEffect(\n        unrefElement(target),\n        toValue(value),\n        animateOptions\n      );\n    }\n  }, { deep: true });\n  tryOnMounted(() => {\n    nextTick(() => update(true));\n  });\n  tryOnScopeDispose(cancel);\n  function update(init) {\n    const el = unrefElement(target);\n    if (!isSupported.value || !el)\n      return;\n    if (!animate.value)\n      animate.value = el.animate(toValue(keyframes), animateOptions);\n    if (commitStyles)\n      animate.value.commitStyles();\n    if (persist)\n      animate.value.persist();\n    if (_playbackRate !== 1)\n      animate.value.playbackRate = _playbackRate;\n    if (init && !immediate)\n      animate.value.pause();\n    else\n      syncResume();\n    onReady == null ? void 0 : onReady(animate.value);\n  }\n  useEventListener(animate, [\"cancel\", \"finish\", \"remove\"], syncPause);\n  const { resume: resumeRef, pause: pauseRef } = useRafFn(() => {\n    if (!animate.value)\n      return;\n    store.pending = animate.value.pending;\n    store.playState = animate.value.playState;\n    store.replaceState = animate.value.replaceState;\n    store.startTime = animate.value.startTime;\n    store.currentTime = animate.value.currentTime;\n    store.timeline = animate.value.timeline;\n    store.playbackRate = animate.value.playbackRate;\n  }, { immediate: false });\n  function syncResume() {\n    if (isSupported.value)\n      resumeRef();\n  }\n  function syncPause() {\n    if (isSupported.value && window)\n      window.requestAnimationFrame(pauseRef);\n  }\n  return {\n    isSupported,\n    animate,\n    // actions\n    play,\n    pause,\n    reverse,\n    finish,\n    cancel,\n    // state\n    pending,\n    playState,\n    replaceState,\n    startTime,\n    currentTime,\n    timeline,\n    playbackRate\n  };\n}\n\nfunction useAsyncQueue(tasks, options) {\n  const {\n    interrupt = true,\n    onError = noop,\n    onFinished = noop,\n    signal\n  } = options || {};\n  const promiseState = {\n    aborted: \"aborted\",\n    fulfilled: \"fulfilled\",\n    pending: \"pending\",\n    rejected: \"rejected\"\n  };\n  const initialResult = Array.from(Array.from({ length: tasks.length }), () => ({ state: promiseState.pending, data: null }));\n  const result = reactive(initialResult);\n  const activeIndex = ref(-1);\n  if (!tasks || tasks.length === 0) {\n    onFinished();\n    return {\n      activeIndex,\n      result\n    };\n  }\n  function updateResult(state, res) {\n    activeIndex.value++;\n    result[activeIndex.value].data = res;\n    result[activeIndex.value].state = state;\n  }\n  tasks.reduce((prev, curr) => {\n    return prev.then((prevRes) => {\n      var _a;\n      if (signal == null ? void 0 : signal.aborted) {\n        updateResult(promiseState.aborted, new Error(\"aborted\"));\n        return;\n      }\n      if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {\n        onFinished();\n        return;\n      }\n      const done = curr(prevRes).then((currentRes) => {\n        updateResult(promiseState.fulfilled, currentRes);\n        activeIndex.value === tasks.length - 1 && onFinished();\n        return currentRes;\n      });\n      if (!signal)\n        return done;\n      return Promise.race([done, whenAborted(signal)]);\n    }).catch((e) => {\n      if (signal == null ? void 0 : signal.aborted) {\n        updateResult(promiseState.aborted, e);\n        return e;\n      }\n      updateResult(promiseState.rejected, e);\n      onError();\n      return e;\n    });\n  }, Promise.resolve());\n  return {\n    activeIndex,\n    result\n  };\n}\nfunction whenAborted(signal) {\n  return new Promise((resolve, reject) => {\n    const error = new Error(\"aborted\");\n    if (signal.aborted)\n      reject(error);\n    else\n      signal.addEventListener(\"abort\", () => reject(error), { once: true });\n  });\n}\n\nfunction useAsyncState(promise, initialState, options) {\n  const {\n    immediate = true,\n    delay = 0,\n    onError = noop,\n    onSuccess = noop,\n    resetOnExecute = true,\n    shallow = true,\n    throwError\n  } = options != null ? options : {};\n  const state = shallow ? shallowRef(initialState) : ref(initialState);\n  const isReady = ref(false);\n  const isLoading = ref(false);\n  const error = shallowRef(void 0);\n  async function execute(delay2 = 0, ...args) {\n    if (resetOnExecute)\n      state.value = initialState;\n    error.value = void 0;\n    isReady.value = false;\n    isLoading.value = true;\n    if (delay2 > 0)\n      await promiseTimeout(delay2);\n    const _promise = typeof promise === \"function\" ? promise(...args) : promise;\n    try {\n      const data = await _promise;\n      state.value = data;\n      isReady.value = true;\n      onSuccess(data);\n    } catch (e) {\n      error.value = e;\n      onError(e);\n      if (throwError)\n        throw e;\n    } finally {\n      isLoading.value = false;\n    }\n    return state.value;\n  }\n  if (immediate)\n    execute(delay);\n  const shell = {\n    state,\n    isReady,\n    isLoading,\n    error,\n    execute\n  };\n  function waitUntilIsLoaded() {\n    return new Promise((resolve, reject) => {\n      until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);\n    });\n  }\n  return {\n    ...shell,\n    then(onFulfilled, onRejected) {\n      return waitUntilIsLoaded().then(onFulfilled, onRejected);\n    }\n  };\n}\n\nconst defaults = {\n  array: (v) => JSON.stringify(v),\n  object: (v) => JSON.stringify(v),\n  set: (v) => JSON.stringify(Array.from(v)),\n  map: (v) => JSON.stringify(Object.fromEntries(v)),\n  null: () => \"\"\n};\nfunction getDefaultSerialization(target) {\n  if (!target)\n    return defaults.null;\n  if (target instanceof Map)\n    return defaults.map;\n  else if (target instanceof Set)\n    return defaults.set;\n  else if (Array.isArray(target))\n    return defaults.array;\n  else\n    return defaults.object;\n}\n\nfunction useBase64(target, options) {\n  const base64 = ref(\"\");\n  const promise = ref();\n  function execute() {\n    if (!isClient)\n      return;\n    promise.value = new Promise((resolve, reject) => {\n      try {\n        const _target = toValue(target);\n        if (_target == null) {\n          resolve(\"\");\n        } else if (typeof _target === \"string\") {\n          resolve(blobToBase64(new Blob([_target], { type: \"text/plain\" })));\n        } else if (_target instanceof Blob) {\n          resolve(blobToBase64(_target));\n        } else if (_target instanceof ArrayBuffer) {\n          resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));\n        } else if (_target instanceof HTMLCanvasElement) {\n          resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n        } else if (_target instanceof HTMLImageElement) {\n          const img = _target.cloneNode(false);\n          img.crossOrigin = \"Anonymous\";\n          imgLoaded(img).then(() => {\n            const canvas = document.createElement(\"canvas\");\n            const ctx = canvas.getContext(\"2d\");\n            canvas.width = img.width;\n            canvas.height = img.height;\n            ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n            resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n          }).catch(reject);\n        } else if (typeof _target === \"object\") {\n          const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target);\n          const serialized = _serializeFn(_target);\n          return resolve(blobToBase64(new Blob([serialized], { type: \"application/json\" })));\n        } else {\n          reject(new Error(\"target is unsupported types\"));\n        }\n      } catch (error) {\n        reject(error);\n      }\n    });\n    promise.value.then((res) => base64.value = res);\n    return promise.value;\n  }\n  if (isRef(target) || typeof target === \"function\")\n    watch(target, execute, { immediate: true });\n  else\n    execute();\n  return {\n    base64,\n    promise,\n    execute\n  };\n}\nfunction imgLoaded(img) {\n  return new Promise((resolve, reject) => {\n    if (!img.complete) {\n      img.onload = () => {\n        resolve();\n      };\n      img.onerror = reject;\n    } else {\n      resolve();\n    }\n  });\n}\nfunction blobToBase64(blob) {\n  return new Promise((resolve, reject) => {\n    const fr = new FileReader();\n    fr.onload = (e) => {\n      resolve(e.target.result);\n    };\n    fr.onerror = reject;\n    fr.readAsDataURL(blob);\n  });\n}\n\nfunction useBattery(options = {}) {\n  const { navigator = defaultNavigator } = options;\n  const events = [\"chargingchange\", \"chargingtimechange\", \"dischargingtimechange\", \"levelchange\"];\n  const isSupported = useSupported(() => navigator && \"getBattery\" in navigator && typeof navigator.getBattery === \"function\");\n  const charging = ref(false);\n  const chargingTime = ref(0);\n  const dischargingTime = ref(0);\n  const level = ref(1);\n  let battery;\n  function updateBatteryInfo() {\n    charging.value = this.charging;\n    chargingTime.value = this.chargingTime || 0;\n    dischargingTime.value = this.dischargingTime || 0;\n    level.value = this.level;\n  }\n  if (isSupported.value) {\n    navigator.getBattery().then((_battery) => {\n      battery = _battery;\n      updateBatteryInfo.call(battery);\n      useEventListener(battery, events, updateBatteryInfo, { passive: true });\n    });\n  }\n  return {\n    isSupported,\n    charging,\n    chargingTime,\n    dischargingTime,\n    level\n  };\n}\n\nfunction useBluetooth(options) {\n  let {\n    acceptAllDevices = false\n  } = options || {};\n  const {\n    filters = void 0,\n    optionalServices = void 0,\n    navigator = defaultNavigator\n  } = options || {};\n  const isSupported = useSupported(() => navigator && \"bluetooth\" in navigator);\n  const device = shallowRef(void 0);\n  const error = shallowRef(null);\n  watch(device, () => {\n    connectToBluetoothGATTServer();\n  });\n  async function requestDevice() {\n    if (!isSupported.value)\n      return;\n    error.value = null;\n    if (filters && filters.length > 0)\n      acceptAllDevices = false;\n    try {\n      device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({\n        acceptAllDevices,\n        filters,\n        optionalServices\n      }));\n    } catch (err) {\n      error.value = err;\n    }\n  }\n  const server = ref();\n  const isConnected = computed(() => {\n    var _a;\n    return ((_a = server.value) == null ? void 0 : _a.connected) || false;\n  });\n  async function connectToBluetoothGATTServer() {\n    error.value = null;\n    if (device.value && device.value.gatt) {\n      device.value.addEventListener(\"gattserverdisconnected\", () => {\n      });\n      try {\n        server.value = await device.value.gatt.connect();\n      } catch (err) {\n        error.value = err;\n      }\n    }\n  }\n  tryOnMounted(() => {\n    var _a;\n    if (device.value)\n      (_a = device.value.gatt) == null ? void 0 : _a.connect();\n  });\n  tryOnScopeDispose(() => {\n    var _a;\n    if (device.value)\n      (_a = device.value.gatt) == null ? void 0 : _a.disconnect();\n  });\n  return {\n    isSupported,\n    isConnected,\n    // Device:\n    device,\n    requestDevice,\n    // Server:\n    server,\n    // Errors:\n    error\n  };\n}\n\nfunction useMediaQuery(query, options = {}) {\n  const { window = defaultWindow } = options;\n  const isSupported = useSupported(() => window && \"matchMedia\" in window && typeof window.matchMedia === \"function\");\n  let mediaQuery;\n  const matches = ref(false);\n  const handler = (event) => {\n    matches.value = event.matches;\n  };\n  const cleanup = () => {\n    if (!mediaQuery)\n      return;\n    if (\"removeEventListener\" in mediaQuery)\n      mediaQuery.removeEventListener(\"change\", handler);\n    else\n      mediaQuery.removeListener(handler);\n  };\n  const stopWatch = watchEffect(() => {\n    if (!isSupported.value)\n      return;\n    cleanup();\n    mediaQuery = window.matchMedia(toValue(query));\n    if (\"addEventListener\" in mediaQuery)\n      mediaQuery.addEventListener(\"change\", handler);\n    else\n      mediaQuery.addListener(handler);\n    matches.value = mediaQuery.matches;\n  });\n  tryOnScopeDispose(() => {\n    stopWatch();\n    cleanup();\n    mediaQuery = void 0;\n  });\n  return matches;\n}\n\nconst breakpointsTailwind = {\n  \"sm\": 640,\n  \"md\": 768,\n  \"lg\": 1024,\n  \"xl\": 1280,\n  \"2xl\": 1536\n};\nconst breakpointsBootstrapV5 = {\n  xs: 0,\n  sm: 576,\n  md: 768,\n  lg: 992,\n  xl: 1200,\n  xxl: 1400\n};\nconst breakpointsVuetifyV2 = {\n  xs: 0,\n  sm: 600,\n  md: 960,\n  lg: 1264,\n  xl: 1904\n};\nconst breakpointsVuetifyV3 = {\n  xs: 0,\n  sm: 600,\n  md: 960,\n  lg: 1280,\n  xl: 1920,\n  xxl: 2560\n};\nconst breakpointsVuetify = breakpointsVuetifyV2;\nconst breakpointsAntDesign = {\n  xs: 480,\n  sm: 576,\n  md: 768,\n  lg: 992,\n  xl: 1200,\n  xxl: 1600\n};\nconst breakpointsQuasar = {\n  xs: 0,\n  sm: 600,\n  md: 1024,\n  lg: 1440,\n  xl: 1920\n};\nconst breakpointsSematic = {\n  mobileS: 320,\n  mobileM: 375,\n  mobileL: 425,\n  tablet: 768,\n  laptop: 1024,\n  laptopL: 1440,\n  desktop4K: 2560\n};\nconst breakpointsMasterCss = {\n  \"3xs\": 360,\n  \"2xs\": 480,\n  \"xs\": 600,\n  \"sm\": 768,\n  \"md\": 1024,\n  \"lg\": 1280,\n  \"xl\": 1440,\n  \"2xl\": 1600,\n  \"3xl\": 1920,\n  \"4xl\": 2560\n};\nconst breakpointsPrimeFlex = {\n  sm: 576,\n  md: 768,\n  lg: 992,\n  xl: 1200\n};\n\nfunction useBreakpoints(breakpoints, options = {}) {\n  function getValue(k, delta) {\n    let v = toValue(breakpoints[toValue(k)]);\n    if (delta != null)\n      v = increaseWithUnit(v, delta);\n    if (typeof v === \"number\")\n      v = `${v}px`;\n    return v;\n  }\n  const { window = defaultWindow, strategy = \"min-width\" } = options;\n  function match(query) {\n    if (!window)\n      return false;\n    return window.matchMedia(query).matches;\n  }\n  const greaterOrEqual = (k) => {\n    return useMediaQuery(() => `(min-width: ${getValue(k)})`, options);\n  };\n  const smallerOrEqual = (k) => {\n    return useMediaQuery(() => `(max-width: ${getValue(k)})`, options);\n  };\n  const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {\n    Object.defineProperty(shortcuts, k, {\n      get: () => strategy === \"min-width\" ? greaterOrEqual(k) : smallerOrEqual(k),\n      enumerable: true,\n      configurable: true\n    });\n    return shortcuts;\n  }, {});\n  function current() {\n    const points = Object.keys(breakpoints).map((i) => [i, greaterOrEqual(i)]);\n    return computed(() => points.filter(([, v]) => v.value).map(([k]) => k));\n  }\n  return Object.assign(shortcutMethods, {\n    greaterOrEqual,\n    smallerOrEqual,\n    greater(k) {\n      return useMediaQuery(() => `(min-width: ${getValue(k, 0.1)})`, options);\n    },\n    smaller(k) {\n      return useMediaQuery(() => `(max-width: ${getValue(k, -0.1)})`, options);\n    },\n    between(a, b) {\n      return useMediaQuery(() => `(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options);\n    },\n    isGreater(k) {\n      return match(`(min-width: ${getValue(k, 0.1)})`);\n    },\n    isGreaterOrEqual(k) {\n      return match(`(min-width: ${getValue(k)})`);\n    },\n    isSmaller(k) {\n      return match(`(max-width: ${getValue(k, -0.1)})`);\n    },\n    isSmallerOrEqual(k) {\n      return match(`(max-width: ${getValue(k)})`);\n    },\n    isInBetween(a, b) {\n      return match(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`);\n    },\n    current,\n    active() {\n      const bps = current();\n      return computed(() => bps.value.length === 0 ? \"\" : bps.value.at(-1));\n    }\n  });\n}\n\nfunction useBroadcastChannel(options) {\n  const {\n    name,\n    window = defaultWindow\n  } = options;\n  const isSupported = useSupported(() => window && \"BroadcastChannel\" in window);\n  const isClosed = ref(false);\n  const channel = ref();\n  const data = ref();\n  const error = shallowRef(null);\n  const post = (data2) => {\n    if (channel.value)\n      channel.value.postMessage(data2);\n  };\n  const close = () => {\n    if (channel.value)\n      channel.value.close();\n    isClosed.value = true;\n  };\n  if (isSupported.value) {\n    tryOnMounted(() => {\n      error.value = null;\n      channel.value = new BroadcastChannel(name);\n      channel.value.addEventListener(\"message\", (e) => {\n        data.value = e.data;\n      }, { passive: true });\n      channel.value.addEventListener(\"messageerror\", (e) => {\n        error.value = e;\n      }, { passive: true });\n      channel.value.addEventListener(\"close\", () => {\n        isClosed.value = true;\n      });\n    });\n  }\n  tryOnScopeDispose(() => {\n    close();\n  });\n  return {\n    isSupported,\n    channel,\n    data,\n    post,\n    close,\n    error,\n    isClosed\n  };\n}\n\nconst WRITABLE_PROPERTIES = [\n  \"hash\",\n  \"host\",\n  \"hostname\",\n  \"href\",\n  \"pathname\",\n  \"port\",\n  \"protocol\",\n  \"search\"\n];\nfunction useBrowserLocation(options = {}) {\n  const { window = defaultWindow } = options;\n  const refs = Object.fromEntries(\n    WRITABLE_PROPERTIES.map((key) => [key, ref()])\n  );\n  for (const [key, ref2] of objectEntries(refs)) {\n    watch(ref2, (value) => {\n      if (!(window == null ? void 0 : window.location) || window.location[key] === value)\n        return;\n      window.location[key] = value;\n    });\n  }\n  const buildState = (trigger) => {\n    var _a;\n    const { state: state2, length } = (window == null ? void 0 : window.history) || {};\n    const { origin } = (window == null ? void 0 : window.location) || {};\n    for (const key of WRITABLE_PROPERTIES)\n      refs[key].value = (_a = window == null ? void 0 : window.location) == null ? void 0 : _a[key];\n    return reactive({\n      trigger,\n      state: state2,\n      length,\n      origin,\n      ...refs\n    });\n  };\n  const state = ref(buildState(\"load\"));\n  if (window) {\n    useEventListener(window, \"popstate\", () => state.value = buildState(\"popstate\"), { passive: true });\n    useEventListener(window, \"hashchange\", () => state.value = buildState(\"hashchange\"), { passive: true });\n  }\n  return state;\n}\n\nfunction useCached(refValue, comparator = (a, b) => a === b, watchOptions) {\n  const cachedValue = ref(refValue.value);\n  watch(() => refValue.value, (value) => {\n    if (!comparator(value, cachedValue.value))\n      cachedValue.value = value;\n  }, watchOptions);\n  return cachedValue;\n}\n\nfunction usePermission(permissionDesc, options = {}) {\n  const {\n    controls = false,\n    navigator = defaultNavigator\n  } = options;\n  const isSupported = useSupported(() => navigator && \"permissions\" in navigator);\n  let permissionStatus;\n  const desc = typeof permissionDesc === \"string\" ? { name: permissionDesc } : permissionDesc;\n  const state = ref();\n  const onChange = () => {\n    if (permissionStatus)\n      state.value = permissionStatus.state;\n  };\n  const query = createSingletonPromise(async () => {\n    if (!isSupported.value)\n      return;\n    if (!permissionStatus) {\n      try {\n        permissionStatus = await navigator.permissions.query(desc);\n        useEventListener(permissionStatus, \"change\", onChange);\n        onChange();\n      } catch (e) {\n        state.value = \"prompt\";\n      }\n    }\n    return permissionStatus;\n  });\n  query();\n  if (controls) {\n    return {\n      state,\n      isSupported,\n      query\n    };\n  } else {\n    return state;\n  }\n}\n\nfunction useClipboard(options = {}) {\n  const {\n    navigator = defaultNavigator,\n    read = false,\n    source,\n    copiedDuring = 1500,\n    legacy = false\n  } = options;\n  const isClipboardApiSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n  const permissionRead = usePermission(\"clipboard-read\");\n  const permissionWrite = usePermission(\"clipboard-write\");\n  const isSupported = computed(() => isClipboardApiSupported.value || legacy);\n  const text = ref(\"\");\n  const copied = ref(false);\n  const timeout = useTimeoutFn(() => copied.value = false, copiedDuring);\n  function updateText() {\n    if (isClipboardApiSupported.value && isAllowed(permissionRead.value)) {\n      navigator.clipboard.readText().then((value) => {\n        text.value = value;\n      });\n    } else {\n      text.value = legacyRead();\n    }\n  }\n  if (isSupported.value && read)\n    useEventListener([\"copy\", \"cut\"], updateText);\n  async function copy(value = toValue(source)) {\n    if (isSupported.value && value != null) {\n      if (isClipboardApiSupported.value && isAllowed(permissionWrite.value))\n        await navigator.clipboard.writeText(value);\n      else\n        legacyCopy(value);\n      text.value = value;\n      copied.value = true;\n      timeout.start();\n    }\n  }\n  function legacyCopy(value) {\n    const ta = document.createElement(\"textarea\");\n    ta.value = value != null ? value : \"\";\n    ta.style.position = \"absolute\";\n    ta.style.opacity = \"0\";\n    document.body.appendChild(ta);\n    ta.select();\n    document.execCommand(\"copy\");\n    ta.remove();\n  }\n  function legacyRead() {\n    var _a, _b, _c;\n    return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : \"\";\n  }\n  function isAllowed(status) {\n    return status === \"granted\" || status === \"prompt\";\n  }\n  return {\n    isSupported,\n    text,\n    copied,\n    copy\n  };\n}\n\nfunction useClipboardItems(options = {}) {\n  const {\n    navigator = defaultNavigator,\n    read = false,\n    source,\n    copiedDuring = 1500\n  } = options;\n  const isSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n  const content = ref([]);\n  const copied = ref(false);\n  const timeout = useTimeoutFn(() => copied.value = false, copiedDuring);\n  function updateContent() {\n    if (isSupported.value) {\n      navigator.clipboard.read().then((items) => {\n        content.value = items;\n      });\n    }\n  }\n  if (isSupported.value && read)\n    useEventListener([\"copy\", \"cut\"], updateContent);\n  async function copy(value = toValue(source)) {\n    if (isSupported.value && value != null) {\n      await navigator.clipboard.write(value);\n      content.value = value;\n      copied.value = true;\n      timeout.start();\n    }\n  }\n  return {\n    isSupported,\n    content,\n    copied,\n    copy\n  };\n}\n\nfunction cloneFnJSON(source) {\n  return JSON.parse(JSON.stringify(source));\n}\nfunction useCloned(source, options = {}) {\n  const cloned = ref({});\n  const {\n    manual,\n    clone = cloneFnJSON,\n    // watch options\n    deep = true,\n    immediate = true\n  } = options;\n  function sync() {\n    cloned.value = clone(toValue(source));\n  }\n  if (!manual && (isRef(source) || typeof source === \"function\")) {\n    watch(source, sync, {\n      ...options,\n      deep,\n      immediate\n    });\n  } else {\n    sync();\n  }\n  return { cloned, sync };\n}\n\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\nconst handlers = /* @__PURE__ */ getHandlers();\nfunction getHandlers() {\n  if (!(globalKey in _global))\n    _global[globalKey] = _global[globalKey] || {};\n  return _global[globalKey];\n}\nfunction getSSRHandler(key, fallback) {\n  return handlers[key] || fallback;\n}\nfunction setSSRHandler(key, fn) {\n  handlers[key] = fn;\n}\n\nfunction guessSerializerType(rawInit) {\n  return rawInit == null ? \"any\" : rawInit instanceof Set ? \"set\" : rawInit instanceof Map ? \"map\" : rawInit instanceof Date ? \"date\" : typeof rawInit === \"boolean\" ? \"boolean\" : typeof rawInit === \"string\" ? \"string\" : typeof rawInit === \"object\" ? \"object\" : !Number.isNaN(rawInit) ? \"number\" : \"any\";\n}\n\nconst StorageSerializers = {\n  boolean: {\n    read: (v) => v === \"true\",\n    write: (v) => String(v)\n  },\n  object: {\n    read: (v) => JSON.parse(v),\n    write: (v) => JSON.stringify(v)\n  },\n  number: {\n    read: (v) => Number.parseFloat(v),\n    write: (v) => String(v)\n  },\n  any: {\n    read: (v) => v,\n    write: (v) => String(v)\n  },\n  string: {\n    read: (v) => v,\n    write: (v) => String(v)\n  },\n  map: {\n    read: (v) => new Map(JSON.parse(v)),\n    write: (v) => JSON.stringify(Array.from(v.entries()))\n  },\n  set: {\n    read: (v) => new Set(JSON.parse(v)),\n    write: (v) => JSON.stringify(Array.from(v))\n  },\n  date: {\n    read: (v) => new Date(v),\n    write: (v) => v.toISOString()\n  }\n};\nconst customStorageEventName = \"vueuse-storage\";\nfunction useStorage(key, defaults, storage, options = {}) {\n  var _a;\n  const {\n    flush = \"pre\",\n    deep = true,\n    listenToStorageChanges = true,\n    writeDefaults = true,\n    mergeDefaults = false,\n    shallow,\n    window = defaultWindow,\n    eventFilter,\n    onError = (e) => {\n      console.error(e);\n    },\n    initOnMounted\n  } = options;\n  const data = (shallow ? shallowRef : ref)(typeof defaults === \"function\" ? defaults() : defaults);\n  if (!storage) {\n    try {\n      storage = getSSRHandler(\"getDefaultStorage\", () => {\n        var _a2;\n        return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n      })();\n    } catch (e) {\n      onError(e);\n    }\n  }\n  if (!storage)\n    return data;\n  const rawInit = toValue(defaults);\n  const type = guessSerializerType(rawInit);\n  const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n  const { pause: pauseWatch, resume: resumeWatch } = pausableWatch(\n    data,\n    () => write(data.value),\n    { flush, deep, eventFilter }\n  );\n  if (window && listenToStorageChanges) {\n    tryOnMounted(() => {\n      useEventListener(window, \"storage\", update);\n      useEventListener(window, customStorageEventName, updateFromCustomEvent);\n      if (initOnMounted)\n        update();\n    });\n  }\n  if (!initOnMounted)\n    update();\n  function dispatchWriteEvent(oldValue, newValue) {\n    if (window) {\n      window.dispatchEvent(new CustomEvent(customStorageEventName, {\n        detail: {\n          key,\n          oldValue,\n          newValue,\n          storageArea: storage\n        }\n      }));\n    }\n  }\n  function write(v) {\n    try {\n      const oldValue = storage.getItem(key);\n      if (v == null) {\n        dispatchWriteEvent(oldValue, null);\n        storage.removeItem(key);\n      } else {\n        const serialized = serializer.write(v);\n        if (oldValue !== serialized) {\n          storage.setItem(key, serialized);\n          dispatchWriteEvent(oldValue, serialized);\n        }\n      }\n    } catch (e) {\n      onError(e);\n    }\n  }\n  function read(event) {\n    const rawValue = event ? event.newValue : storage.getItem(key);\n    if (rawValue == null) {\n      if (writeDefaults && rawInit != null)\n        storage.setItem(key, serializer.write(rawInit));\n      return rawInit;\n    } else if (!event && mergeDefaults) {\n      const value = serializer.read(rawValue);\n      if (typeof mergeDefaults === \"function\")\n        return mergeDefaults(value, rawInit);\n      else if (type === \"object\" && !Array.isArray(value))\n        return { ...rawInit, ...value };\n      return value;\n    } else if (typeof rawValue !== \"string\") {\n      return rawValue;\n    } else {\n      return serializer.read(rawValue);\n    }\n  }\n  function update(event) {\n    if (event && event.storageArea !== storage)\n      return;\n    if (event && event.key == null) {\n      data.value = rawInit;\n      return;\n    }\n    if (event && event.key !== key)\n      return;\n    pauseWatch();\n    try {\n      if ((event == null ? void 0 : event.newValue) !== serializer.write(data.value))\n        data.value = read(event);\n    } catch (e) {\n      onError(e);\n    } finally {\n      if (event)\n        nextTick(resumeWatch);\n      else\n        resumeWatch();\n    }\n  }\n  function updateFromCustomEvent(event) {\n    update(event.detail);\n  }\n  return data;\n}\n\nfunction usePreferredDark(options) {\n  return useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n\nfunction useColorMode(options = {}) {\n  const {\n    selector = \"html\",\n    attribute = \"class\",\n    initialValue = \"auto\",\n    window = defaultWindow,\n    storage,\n    storageKey = \"vueuse-color-scheme\",\n    listenToStorageChanges = true,\n    storageRef,\n    emitAuto,\n    disableTransition = true\n  } = options;\n  const modes = {\n    auto: \"\",\n    light: \"light\",\n    dark: \"dark\",\n    ...options.modes || {}\n  };\n  const preferredDark = usePreferredDark({ window });\n  const system = computed(() => preferredDark.value ? \"dark\" : \"light\");\n  const store = storageRef || (storageKey == null ? toRef(initialValue) : useStorage(storageKey, initialValue, storage, { window, listenToStorageChanges }));\n  const state = computed(() => store.value === \"auto\" ? system.value : store.value);\n  const updateHTMLAttrs = getSSRHandler(\n    \"updateHTMLAttrs\",\n    (selector2, attribute2, value) => {\n      const el = typeof selector2 === \"string\" ? window == null ? void 0 : window.document.querySelector(selector2) : unrefElement(selector2);\n      if (!el)\n        return;\n      let style;\n      if (disableTransition) {\n        style = window.document.createElement(\"style\");\n        const styleString = \"*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}\";\n        style.appendChild(document.createTextNode(styleString));\n        window.document.head.appendChild(style);\n      }\n      if (attribute2 === \"class\") {\n        const current = value.split(/\\s/g);\n        Object.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n          if (current.includes(v))\n            el.classList.add(v);\n          else\n            el.classList.remove(v);\n        });\n      } else {\n        el.setAttribute(attribute2, value);\n      }\n      if (disableTransition) {\n        window.getComputedStyle(style).opacity;\n        document.head.removeChild(style);\n      }\n    }\n  );\n  function defaultOnChanged(mode) {\n    var _a;\n    updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);\n  }\n  function onChanged(mode) {\n    if (options.onChanged)\n      options.onChanged(mode, defaultOnChanged);\n    else\n      defaultOnChanged(mode);\n  }\n  watch(state, onChanged, { flush: \"post\", immediate: true });\n  tryOnMounted(() => onChanged(state.value));\n  const auto = computed({\n    get() {\n      return emitAuto ? store.value : state.value;\n    },\n    set(v) {\n      store.value = v;\n    }\n  });\n  try {\n    return Object.assign(auto, { store, system, state });\n  } catch (e) {\n    return auto;\n  }\n}\n\nfunction useConfirmDialog(revealed = ref(false)) {\n  const confirmHook = createEventHook();\n  const cancelHook = createEventHook();\n  const revealHook = createEventHook();\n  let _resolve = noop;\n  const reveal = (data) => {\n    revealHook.trigger(data);\n    revealed.value = true;\n    return new Promise((resolve) => {\n      _resolve = resolve;\n    });\n  };\n  const confirm = (data) => {\n    revealed.value = false;\n    confirmHook.trigger(data);\n    _resolve({ data, isCanceled: false });\n  };\n  const cancel = (data) => {\n    revealed.value = false;\n    cancelHook.trigger(data);\n    _resolve({ data, isCanceled: true });\n  };\n  return {\n    isRevealed: computed(() => revealed.value),\n    reveal,\n    confirm,\n    cancel,\n    onReveal: revealHook.on,\n    onConfirm: confirmHook.on,\n    onCancel: cancelHook.on\n  };\n}\n\nfunction useMutationObserver(target, callback, options = {}) {\n  const { window = defaultWindow, ...mutationOptions } = options;\n  let observer;\n  const isSupported = useSupported(() => window && \"MutationObserver\" in window);\n  const cleanup = () => {\n    if (observer) {\n      observer.disconnect();\n      observer = void 0;\n    }\n  };\n  const targets = computed(() => {\n    const value = toValue(target);\n    const items = (Array.isArray(value) ? value : [value]).map(unrefElement).filter(notNullish);\n    return new Set(items);\n  });\n  const stopWatch = watch(\n    () => targets.value,\n    (targets2) => {\n      cleanup();\n      if (isSupported.value && window && targets2.size) {\n        observer = new MutationObserver(callback);\n        targets2.forEach((el) => observer.observe(el, mutationOptions));\n      }\n    },\n    { immediate: true, flush: \"post\" }\n  );\n  const takeRecords = () => {\n    return observer == null ? void 0 : observer.takeRecords();\n  };\n  const stop = () => {\n    cleanup();\n    stopWatch();\n  };\n  tryOnScopeDispose(stop);\n  return {\n    isSupported,\n    stop,\n    takeRecords\n  };\n}\n\nfunction useCssVar(prop, target, options = {}) {\n  const { window = defaultWindow, initialValue = \"\", observe = false } = options;\n  const variable = ref(initialValue);\n  const elRef = computed(() => {\n    var _a;\n    return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);\n  });\n  function updateCssVar() {\n    var _a;\n    const key = toValue(prop);\n    const el = toValue(elRef);\n    if (el && window) {\n      const value = (_a = window.getComputedStyle(el).getPropertyValue(key)) == null ? void 0 : _a.trim();\n      variable.value = value || initialValue;\n    }\n  }\n  if (observe) {\n    useMutationObserver(elRef, updateCssVar, {\n      attributeFilter: [\"style\", \"class\"],\n      window\n    });\n  }\n  watch(\n    [elRef, () => toValue(prop)],\n    updateCssVar,\n    { immediate: true }\n  );\n  watch(\n    variable,\n    (val) => {\n      var _a;\n      if ((_a = elRef.value) == null ? void 0 : _a.style)\n        elRef.value.style.setProperty(toValue(prop), val);\n    }\n  );\n  return variable;\n}\n\nfunction useCurrentElement(rootComponent) {\n  const vm = getCurrentInstance();\n  const currentElement = computedWithControl(\n    () => null,\n    () => rootComponent ? unrefElement(rootComponent) : vm.proxy.$el\n  );\n  onUpdated(currentElement.trigger);\n  onMounted(currentElement.trigger);\n  return currentElement;\n}\n\nfunction useCycleList(list, options) {\n  const state = shallowRef(getInitialValue());\n  const listRef = toRef(list);\n  const index = computed({\n    get() {\n      var _a;\n      const targetList = listRef.value;\n      let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, targetList) : targetList.indexOf(state.value);\n      if (index2 < 0)\n        index2 = (_a = options == null ? void 0 : options.fallbackIndex) != null ? _a : 0;\n      return index2;\n    },\n    set(v) {\n      set(v);\n    }\n  });\n  function set(i) {\n    const targetList = listRef.value;\n    const length = targetList.length;\n    const index2 = (i % length + length) % length;\n    const value = targetList[index2];\n    state.value = value;\n    return value;\n  }\n  function shift(delta = 1) {\n    return set(index.value + delta);\n  }\n  function next(n = 1) {\n    return shift(n);\n  }\n  function prev(n = 1) {\n    return shift(-n);\n  }\n  function getInitialValue() {\n    var _a, _b;\n    return (_b = toValue((_a = options == null ? void 0 : options.initialValue) != null ? _a : toValue(list)[0])) != null ? _b : void 0;\n  }\n  watch(listRef, () => set(index.value));\n  return {\n    state,\n    index,\n    next,\n    prev,\n    go: set\n  };\n}\n\nfunction useDark(options = {}) {\n  const {\n    valueDark = \"dark\",\n    valueLight = \"\",\n    window = defaultWindow\n  } = options;\n  const mode = useColorMode({\n    ...options,\n    onChanged: (mode2, defaultHandler) => {\n      var _a;\n      if (options.onChanged)\n        (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === \"dark\", defaultHandler, mode2);\n      else\n        defaultHandler(mode2);\n    },\n    modes: {\n      dark: valueDark,\n      light: valueLight\n    }\n  });\n  const system = computed(() => {\n    if (mode.system) {\n      return mode.system.value;\n    } else {\n      const preferredDark = usePreferredDark({ window });\n      return preferredDark.value ? \"dark\" : \"light\";\n    }\n  });\n  const isDark = computed({\n    get() {\n      return mode.value === \"dark\";\n    },\n    set(v) {\n      const modeVal = v ? \"dark\" : \"light\";\n      if (system.value === modeVal)\n        mode.value = \"auto\";\n      else\n        mode.value = modeVal;\n    }\n  });\n  return isDark;\n}\n\nfunction fnBypass(v) {\n  return v;\n}\nfunction fnSetSource(source, value) {\n  return source.value = value;\n}\nfunction defaultDump(clone) {\n  return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction defaultParse(clone) {\n  return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction useManualRefHistory(source, options = {}) {\n  const {\n    clone = false,\n    dump = defaultDump(clone),\n    parse = defaultParse(clone),\n    setSource = fnSetSource\n  } = options;\n  function _createHistoryRecord() {\n    return markRaw({\n      snapshot: dump(source.value),\n      timestamp: timestamp()\n    });\n  }\n  const last = ref(_createHistoryRecord());\n  const undoStack = ref([]);\n  const redoStack = ref([]);\n  const _setSource = (record) => {\n    setSource(source, parse(record.snapshot));\n    last.value = record;\n  };\n  const commit = () => {\n    undoStack.value.unshift(last.value);\n    last.value = _createHistoryRecord();\n    if (options.capacity && undoStack.value.length > options.capacity)\n      undoStack.value.splice(options.capacity, Number.POSITIVE_INFINITY);\n    if (redoStack.value.length)\n      redoStack.value.splice(0, redoStack.value.length);\n  };\n  const clear = () => {\n    undoStack.value.splice(0, undoStack.value.length);\n    redoStack.value.splice(0, redoStack.value.length);\n  };\n  const undo = () => {\n    const state = undoStack.value.shift();\n    if (state) {\n      redoStack.value.unshift(last.value);\n      _setSource(state);\n    }\n  };\n  const redo = () => {\n    const state = redoStack.value.shift();\n    if (state) {\n      undoStack.value.unshift(last.value);\n      _setSource(state);\n    }\n  };\n  const reset = () => {\n    _setSource(last.value);\n  };\n  const history = computed(() => [last.value, ...undoStack.value]);\n  const canUndo = computed(() => undoStack.value.length > 0);\n  const canRedo = computed(() => redoStack.value.length > 0);\n  return {\n    source,\n    undoStack,\n    redoStack,\n    last,\n    history,\n    canUndo,\n    canRedo,\n    clear,\n    commit,\n    reset,\n    undo,\n    redo\n  };\n}\n\nfunction useRefHistory(source, options = {}) {\n  const {\n    deep = false,\n    flush = \"pre\",\n    eventFilter\n  } = options;\n  const {\n    eventFilter: composedFilter,\n    pause,\n    resume: resumeTracking,\n    isActive: isTracking\n  } = pausableFilter(eventFilter);\n  const {\n    ignoreUpdates,\n    ignorePrevAsyncUpdates,\n    stop\n  } = watchIgnorable(\n    source,\n    commit,\n    { deep, flush, eventFilter: composedFilter }\n  );\n  function setSource(source2, value) {\n    ignorePrevAsyncUpdates();\n    ignoreUpdates(() => {\n      source2.value = value;\n    });\n  }\n  const manualHistory = useManualRefHistory(source, { ...options, clone: options.clone || deep, setSource });\n  const { clear, commit: manualCommit } = manualHistory;\n  function commit() {\n    ignorePrevAsyncUpdates();\n    manualCommit();\n  }\n  function resume(commitNow) {\n    resumeTracking();\n    if (commitNow)\n      commit();\n  }\n  function batch(fn) {\n    let canceled = false;\n    const cancel = () => canceled = true;\n    ignoreUpdates(() => {\n      fn(cancel);\n    });\n    if (!canceled)\n      commit();\n  }\n  function dispose() {\n    stop();\n    clear();\n  }\n  return {\n    ...manualHistory,\n    isTracking,\n    pause,\n    resume,\n    commit,\n    batch,\n    dispose\n  };\n}\n\nfunction useDebouncedRefHistory(source, options = {}) {\n  const filter = options.debounce ? debounceFilter(options.debounce) : void 0;\n  const history = useRefHistory(source, { ...options, eventFilter: filter });\n  return {\n    ...history\n  };\n}\n\nfunction useDeviceMotion(options = {}) {\n  const {\n    window = defaultWindow,\n    eventFilter = bypassFilter\n  } = options;\n  const acceleration = ref({ x: null, y: null, z: null });\n  const rotationRate = ref({ alpha: null, beta: null, gamma: null });\n  const interval = ref(0);\n  const accelerationIncludingGravity = ref({\n    x: null,\n    y: null,\n    z: null\n  });\n  if (window) {\n    const onDeviceMotion = createFilterWrapper(\n      eventFilter,\n      (event) => {\n        acceleration.value = event.acceleration;\n        accelerationIncludingGravity.value = event.accelerationIncludingGravity;\n        rotationRate.value = event.rotationRate;\n        interval.value = event.interval;\n      }\n    );\n    useEventListener(window, \"devicemotion\", onDeviceMotion);\n  }\n  return {\n    acceleration,\n    accelerationIncludingGravity,\n    rotationRate,\n    interval\n  };\n}\n\nfunction useDeviceOrientation(options = {}) {\n  const { window = defaultWindow } = options;\n  const isSupported = useSupported(() => window && \"DeviceOrientationEvent\" in window);\n  const isAbsolute = ref(false);\n  const alpha = ref(null);\n  const beta = ref(null);\n  const gamma = ref(null);\n  if (window && isSupported.value) {\n    useEventListener(window, \"deviceorientation\", (event) => {\n      isAbsolute.value = event.absolute;\n      alpha.value = event.alpha;\n      beta.value = event.beta;\n      gamma.value = event.gamma;\n    });\n  }\n  return {\n    isSupported,\n    isAbsolute,\n    alpha,\n    beta,\n    gamma\n  };\n}\n\nfunction useDevicePixelRatio(options = {}) {\n  const {\n    window = defaultWindow\n  } = options;\n  const pixelRatio = ref(1);\n  if (window) {\n    let observe2 = function() {\n      pixelRatio.value = window.devicePixelRatio;\n      cleanup2();\n      media = window.matchMedia(`(resolution: ${pixelRatio.value}dppx)`);\n      media.addEventListener(\"change\", observe2, { once: true });\n    }, cleanup2 = function() {\n      media == null ? void 0 : media.removeEventListener(\"change\", observe2);\n    };\n    let media;\n    observe2();\n    tryOnScopeDispose(cleanup2);\n  }\n  return { pixelRatio };\n}\n\nfunction useDevicesList(options = {}) {\n  const {\n    navigator = defaultNavigator,\n    requestPermissions = false,\n    constraints = { audio: true, video: true },\n    onUpdated\n  } = options;\n  const devices = ref([]);\n  const videoInputs = computed(() => devices.value.filter((i) => i.kind === \"videoinput\"));\n  const audioInputs = computed(() => devices.value.filter((i) => i.kind === \"audioinput\"));\n  const audioOutputs = computed(() => devices.value.filter((i) => i.kind === \"audiooutput\"));\n  const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n  const permissionGranted = ref(false);\n  let stream;\n  async function update() {\n    if (!isSupported.value)\n      return;\n    devices.value = await navigator.mediaDevices.enumerateDevices();\n    onUpdated == null ? void 0 : onUpdated(devices.value);\n    if (stream) {\n      stream.getTracks().forEach((t) => t.stop());\n      stream = null;\n    }\n  }\n  async function ensurePermissions() {\n    if (!isSupported.value)\n      return false;\n    if (permissionGranted.value)\n      return true;\n    const { state, query } = usePermission(\"camera\", { controls: true });\n    await query();\n    if (state.value !== \"granted\") {\n      stream = await navigator.mediaDevices.getUserMedia(constraints);\n      update();\n      permissionGranted.value = true;\n    } else {\n      permissionGranted.value = true;\n    }\n    return permissionGranted.value;\n  }\n  if (isSupported.value) {\n    if (requestPermissions)\n      ensurePermissions();\n    useEventListener(navigator.mediaDevices, \"devicechange\", update);\n    update();\n  }\n  return {\n    devices,\n    ensurePermissions,\n    permissionGranted,\n    videoInputs,\n    audioInputs,\n    audioOutputs,\n    isSupported\n  };\n}\n\nfunction useDisplayMedia(options = {}) {\n  var _a;\n  const enabled = ref((_a = options.enabled) != null ? _a : false);\n  const video = options.video;\n  const audio = options.audio;\n  const { navigator = defaultNavigator } = options;\n  const isSupported = useSupported(() => {\n    var _a2;\n    return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia;\n  });\n  const constraint = { audio, video };\n  const stream = shallowRef();\n  async function _start() {\n    if (!isSupported.value || stream.value)\n      return;\n    stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);\n    return stream.value;\n  }\n  async function _stop() {\n    var _a2;\n    (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n    stream.value = void 0;\n  }\n  function stop() {\n    _stop();\n    enabled.value = false;\n  }\n  async function start() {\n    await _start();\n    if (stream.value)\n      enabled.value = true;\n    return stream.value;\n  }\n  watch(\n    enabled,\n    (v) => {\n      if (v)\n        _start();\n      else\n        _stop();\n    },\n    { immediate: true }\n  );\n  return {\n    isSupported,\n    stream,\n    start,\n    stop,\n    enabled\n  };\n}\n\nfunction useDocumentVisibility(options = {}) {\n  const { document = defaultDocument } = options;\n  if (!document)\n    return ref(\"visible\");\n  const visibility = ref(document.visibilityState);\n  useEventListener(document, \"visibilitychange\", () => {\n    visibility.value = document.visibilityState;\n  });\n  return visibility;\n}\n\nfunction useDraggable(target, options = {}) {\n  var _a, _b;\n  const {\n    pointerTypes,\n    preventDefault,\n    stopPropagation,\n    exact,\n    onMove,\n    onEnd,\n    onStart,\n    initialValue,\n    axis = \"both\",\n    draggingElement = defaultWindow,\n    containerElement,\n    handle: draggingHandle = target\n  } = options;\n  const position = ref(\n    (_a = toValue(initialValue)) != null ? _a : { x: 0, y: 0 }\n  );\n  const pressedDelta = ref();\n  const filterEvent = (e) => {\n    if (pointerTypes)\n      return pointerTypes.includes(e.pointerType);\n    return true;\n  };\n  const handleEvent = (e) => {\n    if (toValue(preventDefault))\n      e.preventDefault();\n    if (toValue(stopPropagation))\n      e.stopPropagation();\n  };\n  const start = (e) => {\n    var _a2;\n    if (toValue(options.disabled) || !filterEvent(e))\n      return;\n    if (toValue(exact) && e.target !== toValue(target))\n      return;\n    const container = toValue(containerElement);\n    const containerRect = (_a2 = container == null ? void 0 : container.getBoundingClientRect) == null ? void 0 : _a2.call(container);\n    const targetRect = toValue(target).getBoundingClientRect();\n    const pos = {\n      x: e.clientX - (container ? targetRect.left - containerRect.left + container.scrollLeft : targetRect.left),\n      y: e.clientY - (container ? targetRect.top - containerRect.top + container.scrollTop : targetRect.top)\n    };\n    if ((onStart == null ? void 0 : onStart(pos, e)) === false)\n      return;\n    pressedDelta.value = pos;\n    handleEvent(e);\n  };\n  const move = (e) => {\n    if (toValue(options.disabled) || !filterEvent(e))\n      return;\n    if (!pressedDelta.value)\n      return;\n    const container = toValue(containerElement);\n    const targetRect = toValue(target).getBoundingClientRect();\n    let { x, y } = position.value;\n    if (axis === \"x\" || axis === \"both\") {\n      x = e.clientX - pressedDelta.value.x;\n      if (container)\n        x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width);\n    }\n    if (axis === \"y\" || axis === \"both\") {\n      y = e.clientY - pressedDelta.value.y;\n      if (container)\n        y = Math.min(Math.max(0, y), container.scrollHeight - targetRect.height);\n    }\n    position.value = {\n      x,\n      y\n    };\n    onMove == null ? void 0 : onMove(position.value, e);\n    handleEvent(e);\n  };\n  const end = (e) => {\n    if (toValue(options.disabled) || !filterEvent(e))\n      return;\n    if (!pressedDelta.value)\n      return;\n    pressedDelta.value = void 0;\n    onEnd == null ? void 0 : onEnd(position.value, e);\n    handleEvent(e);\n  };\n  if (isClient) {\n    const config = { capture: (_b = options.capture) != null ? _b : true };\n    useEventListener(draggingHandle, \"pointerdown\", start, config);\n    useEventListener(draggingElement, \"pointermove\", move, config);\n    useEventListener(draggingElement, \"pointerup\", end, config);\n  }\n  return {\n    ...toRefs(position),\n    position,\n    isDragging: computed(() => !!pressedDelta.value),\n    style: computed(\n      () => `left:${position.value.x}px;top:${position.value.y}px;`\n    )\n  };\n}\n\nfunction useDropZone(target, options = {}) {\n  const isOverDropZone = ref(false);\n  const files = shallowRef(null);\n  let counter = 0;\n  let isDataTypeIncluded = true;\n  if (isClient) {\n    const _options = typeof options === \"function\" ? { onDrop: options } : options;\n    const getFiles = (event) => {\n      var _a, _b;\n      const list = Array.from((_b = (_a = event.dataTransfer) == null ? void 0 : _a.files) != null ? _b : []);\n      return files.value = list.length === 0 ? null : list;\n    };\n    useEventListener(target, \"dragenter\", (event) => {\n      var _a, _b;\n      const types = Array.from(((_a = event == null ? void 0 : event.dataTransfer) == null ? void 0 : _a.items) || []).map((i) => i.kind === \"file\" ? i.type : null).filter(notNullish);\n      if (_options.dataTypes && event.dataTransfer) {\n        const dataTypes = unref(_options.dataTypes);\n        isDataTypeIncluded = typeof dataTypes === \"function\" ? dataTypes(types) : dataTypes ? dataTypes.some((item) => types.includes(item)) : true;\n        if (!isDataTypeIncluded)\n          return;\n      }\n      event.preventDefault();\n      counter += 1;\n      isOverDropZone.value = true;\n      (_b = _options.onEnter) == null ? void 0 : _b.call(_options, getFiles(event), event);\n    });\n    useEventListener(target, \"dragover\", (event) => {\n      var _a;\n      if (!isDataTypeIncluded)\n        return;\n      event.preventDefault();\n      (_a = _options.onOver) == null ? void 0 : _a.call(_options, getFiles(event), event);\n    });\n    useEventListener(target, \"dragleave\", (event) => {\n      var _a;\n      if (!isDataTypeIncluded)\n        return;\n      event.preventDefault();\n      counter -= 1;\n      if (counter === 0)\n        isOverDropZone.value = false;\n      (_a = _options.onLeave) == null ? void 0 : _a.call(_options, getFiles(event), event);\n    });\n    useEventListener(target, \"drop\", (event) => {\n      var _a;\n      event.preventDefault();\n      counter = 0;\n      isOverDropZone.value = false;\n      (_a = _options.onDrop) == null ? void 0 : _a.call(_options, getFiles(event), event);\n    });\n  }\n  return {\n    files,\n    isOverDropZone\n  };\n}\n\nfunction useResizeObserver(target, callback, options = {}) {\n  const { window = defaultWindow, ...observerOptions } = options;\n  let observer;\n  const isSupported = useSupported(() => window && \"ResizeObserver\" in window);\n  const cleanup = () => {\n    if (observer) {\n      observer.disconnect();\n      observer = void 0;\n    }\n  };\n  const targets = computed(() => Array.isArray(target) ? target.map((el) => unrefElement(el)) : [unrefElement(target)]);\n  const stopWatch = watch(\n    targets,\n    (els) => {\n      cleanup();\n      if (isSupported.value && window) {\n        observer = new ResizeObserver(callback);\n        for (const _el of els)\n          _el && observer.observe(_el, observerOptions);\n      }\n    },\n    { immediate: true, flush: \"post\" }\n  );\n  const stop = () => {\n    cleanup();\n    stopWatch();\n  };\n  tryOnScopeDispose(stop);\n  return {\n    isSupported,\n    stop\n  };\n}\n\nfunction useElementBounding(target, options = {}) {\n  const {\n    reset = true,\n    windowResize = true,\n    windowScroll = true,\n    immediate = true\n  } = options;\n  const height = ref(0);\n  const bottom = ref(0);\n  const left = ref(0);\n  const right = ref(0);\n  const top = ref(0);\n  const width = ref(0);\n  const x = ref(0);\n  const y = ref(0);\n  function update() {\n    const el = unrefElement(target);\n    if (!el) {\n      if (reset) {\n        height.value = 0;\n        bottom.value = 0;\n        left.value = 0;\n        right.value = 0;\n        top.value = 0;\n        width.value = 0;\n        x.value = 0;\n        y.value = 0;\n      }\n      return;\n    }\n    const rect = el.getBoundingClientRect();\n    height.value = rect.height;\n    bottom.value = rect.bottom;\n    left.value = rect.left;\n    right.value = rect.right;\n    top.value = rect.top;\n    width.value = rect.width;\n    x.value = rect.x;\n    y.value = rect.y;\n  }\n  useResizeObserver(target, update);\n  watch(() => unrefElement(target), (ele) => !ele && update());\n  useMutationObserver(target, update, {\n    attributeFilter: [\"style\", \"class\"]\n  });\n  if (windowScroll)\n    useEventListener(\"scroll\", update, { capture: true, passive: true });\n  if (windowResize)\n    useEventListener(\"resize\", update, { passive: true });\n  tryOnMounted(() => {\n    if (immediate)\n      update();\n  });\n  return {\n    height,\n    bottom,\n    left,\n    right,\n    top,\n    width,\n    x,\n    y,\n    update\n  };\n}\n\nfunction useElementByPoint(options) {\n  const {\n    x,\n    y,\n    document = defaultDocument,\n    multiple,\n    interval = \"requestAnimationFrame\",\n    immediate = true\n  } = options;\n  const isSupported = useSupported(() => {\n    if (toValue(multiple))\n      return document && \"elementsFromPoint\" in document;\n    return document && \"elementFromPoint\" in document;\n  });\n  const element = ref(null);\n  const cb = () => {\n    var _a, _b;\n    element.value = toValue(multiple) ? (_a = document == null ? void 0 : document.elementsFromPoint(toValue(x), toValue(y))) != null ? _a : [] : (_b = document == null ? void 0 : document.elementFromPoint(toValue(x), toValue(y))) != null ? _b : null;\n  };\n  const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n  return {\n    isSupported,\n    element,\n    ...controls\n  };\n}\n\nfunction useElementHover(el, options = {}) {\n  const {\n    delayEnter = 0,\n    delayLeave = 0,\n    window = defaultWindow\n  } = options;\n  const isHovered = ref(false);\n  let timer;\n  const toggle = (entering) => {\n    const delay = entering ? delayEnter : delayLeave;\n    if (timer) {\n      clearTimeout(timer);\n      timer = void 0;\n    }\n    if (delay)\n      timer = setTimeout(() => isHovered.value = entering, delay);\n    else\n      isHovered.value = entering;\n  };\n  if (!window)\n    return isHovered;\n  useEventListener(el, \"mouseenter\", () => toggle(true), { passive: true });\n  useEventListener(el, \"mouseleave\", () => toggle(false), { passive: true });\n  return isHovered;\n}\n\nfunction useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {\n  const { window = defaultWindow, box = \"content-box\" } = options;\n  const isSVG = computed(() => {\n    var _a, _b;\n    return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes(\"svg\");\n  });\n  const width = ref(initialSize.width);\n  const height = ref(initialSize.height);\n  const { stop: stop1 } = useResizeObserver(\n    target,\n    ([entry]) => {\n      const boxSize = box === \"border-box\" ? entry.borderBoxSize : box === \"content-box\" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;\n      if (window && isSVG.value) {\n        const $elem = unrefElement(target);\n        if ($elem) {\n          const styles = window.getComputedStyle($elem);\n          width.value = Number.parseFloat(styles.width);\n          height.value = Number.parseFloat(styles.height);\n        }\n      } else {\n        if (boxSize) {\n          const formatBoxSize = Array.isArray(boxSize) ? boxSize : [boxSize];\n          width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);\n          height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);\n        } else {\n          width.value = entry.contentRect.width;\n          height.value = entry.contentRect.height;\n        }\n      }\n    },\n    options\n  );\n  tryOnMounted(() => {\n    const ele = unrefElement(target);\n    if (ele) {\n      width.value = \"offsetWidth\" in ele ? ele.offsetWidth : initialSize.width;\n      height.value = \"offsetHeight\" in ele ? ele.offsetHeight : initialSize.height;\n    }\n  });\n  const stop2 = watch(\n    () => unrefElement(target),\n    (ele) => {\n      width.value = ele ? initialSize.width : 0;\n      height.value = ele ? initialSize.height : 0;\n    }\n  );\n  function stop() {\n    stop1();\n    stop2();\n  }\n  return {\n    width,\n    height,\n    stop\n  };\n}\n\nfunction useIntersectionObserver(target, callback, options = {}) {\n  const {\n    root,\n    rootMargin = \"0px\",\n    threshold = 0.1,\n    window = defaultWindow,\n    immediate = true\n  } = options;\n  const isSupported = useSupported(() => window && \"IntersectionObserver\" in window);\n  const targets = computed(() => {\n    const _target = toValue(target);\n    return (Array.isArray(_target) ? _target : [_target]).map(unrefElement).filter(notNullish);\n  });\n  let cleanup = noop;\n  const isActive = ref(immediate);\n  const stopWatch = isSupported.value ? watch(\n    () => [targets.value, unrefElement(root), isActive.value],\n    ([targets2, root2]) => {\n      cleanup();\n      if (!isActive.value)\n        return;\n      if (!targets2.length)\n        return;\n      const observer = new IntersectionObserver(\n        callback,\n        {\n          root: unrefElement(root2),\n          rootMargin,\n          threshold\n        }\n      );\n      targets2.forEach((el) => el && observer.observe(el));\n      cleanup = () => {\n        observer.disconnect();\n        cleanup = noop;\n      };\n    },\n    { immediate, flush: \"post\" }\n  ) : noop;\n  const stop = () => {\n    cleanup();\n    stopWatch();\n    isActive.value = false;\n  };\n  tryOnScopeDispose(stop);\n  return {\n    isSupported,\n    isActive,\n    pause() {\n      cleanup();\n      isActive.value = false;\n    },\n    resume() {\n      isActive.value = true;\n    },\n    stop\n  };\n}\n\nfunction useElementVisibility(element, options = {}) {\n  const { window = defaultWindow, scrollTarget, threshold = 0 } = options;\n  const elementIsVisible = ref(false);\n  useIntersectionObserver(\n    element,\n    (intersectionObserverEntries) => {\n      let isIntersecting = elementIsVisible.value;\n      let latestTime = 0;\n      for (const entry of intersectionObserverEntries) {\n        if (entry.time >= latestTime) {\n          latestTime = entry.time;\n          isIntersecting = entry.isIntersecting;\n        }\n      }\n      elementIsVisible.value = isIntersecting;\n    },\n    {\n      root: scrollTarget,\n      window,\n      threshold\n    }\n  );\n  return elementIsVisible;\n}\n\nconst events = /* @__PURE__ */ new Map();\n\nfunction useEventBus(key) {\n  const scope = getCurrentScope();\n  function on(listener) {\n    var _a;\n    const listeners = events.get(key) || /* @__PURE__ */ new Set();\n    listeners.add(listener);\n    events.set(key, listeners);\n    const _off = () => off(listener);\n    (_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off);\n    return _off;\n  }\n  function once(listener) {\n    function _listener(...args) {\n      off(_listener);\n      listener(...args);\n    }\n    return on(_listener);\n  }\n  function off(listener) {\n    const listeners = events.get(key);\n    if (!listeners)\n      return;\n    listeners.delete(listener);\n    if (!listeners.size)\n      reset();\n  }\n  function reset() {\n    events.delete(key);\n  }\n  function emit(event, payload) {\n    var _a;\n    (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));\n  }\n  return { on, once, off, emit, reset };\n}\n\nfunction resolveNestedOptions$1(options) {\n  if (options === true)\n    return {};\n  return options;\n}\nfunction useEventSource(url, events = [], options = {}) {\n  const event = ref(null);\n  const data = ref(null);\n  const status = ref(\"CONNECTING\");\n  const eventSource = ref(null);\n  const error = shallowRef(null);\n  const urlRef = toRef(url);\n  let explicitlyClosed = false;\n  let retried = 0;\n  const {\n    withCredentials = false,\n    immediate = true\n  } = options;\n  const close = () => {\n    if (isClient && eventSource.value) {\n      eventSource.value.close();\n      eventSource.value = null;\n      status.value = \"CLOSED\";\n      explicitlyClosed = true;\n    }\n  };\n  const _init = () => {\n    if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n      return;\n    const es = new EventSource(urlRef.value, { withCredentials });\n    status.value = \"CONNECTING\";\n    eventSource.value = es;\n    es.onopen = () => {\n      status.value = \"OPEN\";\n      error.value = null;\n    };\n    es.onerror = (e) => {\n      status.value = \"CLOSED\";\n      error.value = e;\n      if (es.readyState === 2 && !explicitlyClosed && options.autoReconnect) {\n        es.close();\n        const {\n          retries = -1,\n          delay = 1e3,\n          onFailed\n        } = resolveNestedOptions$1(options.autoReconnect);\n        retried += 1;\n        if (typeof retries === \"number\" && (retries < 0 || retried < retries))\n          setTimeout(_init, delay);\n        else if (typeof retries === \"function\" && retries())\n          setTimeout(_init, delay);\n        else\n          onFailed == null ? void 0 : onFailed();\n      }\n    };\n    es.onmessage = (e) => {\n      event.value = null;\n      data.value = e.data;\n    };\n    for (const event_name of events) {\n      useEventListener(es, event_name, (e) => {\n        event.value = event_name;\n        data.value = e.data || null;\n      });\n    }\n  };\n  const open = () => {\n    if (!isClient)\n      return;\n    close();\n    explicitlyClosed = false;\n    retried = 0;\n    _init();\n  };\n  if (immediate)\n    watch(urlRef, open, { immediate: true });\n  tryOnScopeDispose(close);\n  return {\n    eventSource,\n    event,\n    data,\n    status,\n    error,\n    open,\n    close\n  };\n}\n\nfunction useEyeDropper(options = {}) {\n  const { initialValue = \"\" } = options;\n  const isSupported = useSupported(() => typeof window !== \"undefined\" && \"EyeDropper\" in window);\n  const sRGBHex = ref(initialValue);\n  async function open(openOptions) {\n    if (!isSupported.value)\n      return;\n    const eyeDropper = new window.EyeDropper();\n    const result = await eyeDropper.open(openOptions);\n    sRGBHex.value = result.sRGBHex;\n    return result;\n  }\n  return { isSupported, sRGBHex, open };\n}\n\nfunction useFavicon(newIcon = null, options = {}) {\n  const {\n    baseUrl = \"\",\n    rel = \"icon\",\n    document = defaultDocument\n  } = options;\n  const favicon = toRef(newIcon);\n  const applyIcon = (icon) => {\n    const elements = document == null ? void 0 : document.head.querySelectorAll(`link[rel*=\"${rel}\"]`);\n    if (!elements || elements.length === 0) {\n      const link = document == null ? void 0 : document.createElement(\"link\");\n      if (link) {\n        link.rel = rel;\n        link.href = `${baseUrl}${icon}`;\n        link.type = `image/${icon.split(\".\").pop()}`;\n        document == null ? void 0 : document.head.append(link);\n      }\n      return;\n    }\n    elements == null ? void 0 : elements.forEach((el) => el.href = `${baseUrl}${icon}`);\n  };\n  watch(\n    favicon,\n    (i, o) => {\n      if (typeof i === \"string\" && i !== o)\n        applyIcon(i);\n    },\n    { immediate: true }\n  );\n  return favicon;\n}\n\nconst payloadMapping = {\n  json: \"application/json\",\n  text: \"text/plain\"\n};\nfunction isFetchOptions(obj) {\n  return obj && containsProp(obj, \"immediate\", \"refetch\", \"initialData\", \"timeout\", \"beforeFetch\", \"afterFetch\", \"onFetchError\", \"fetch\", \"updateDataOnError\");\n}\nfunction isAbsoluteURL(url) {\n  return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\nfunction headersToObject(headers) {\n  if (typeof Headers !== \"undefined\" && headers instanceof Headers)\n    return Object.fromEntries(headers.entries());\n  return headers;\n}\nfunction combineCallbacks(combination, ...callbacks) {\n  if (combination === \"overwrite\") {\n    return async (ctx) => {\n      const callback = callbacks[callbacks.length - 1];\n      if (callback)\n        return { ...ctx, ...await callback(ctx) };\n      return ctx;\n    };\n  } else {\n    return async (ctx) => {\n      for (const callback of callbacks) {\n        if (callback)\n          ctx = { ...ctx, ...await callback(ctx) };\n      }\n      return ctx;\n    };\n  }\n}\nfunction createFetch(config = {}) {\n  const _combination = config.combination || \"chain\";\n  const _options = config.options || {};\n  const _fetchOptions = config.fetchOptions || {};\n  function useFactoryFetch(url, ...args) {\n    const computedUrl = computed(() => {\n      const baseUrl = toValue(config.baseUrl);\n      const targetUrl = toValue(url);\n      return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl;\n    });\n    let options = _options;\n    let fetchOptions = _fetchOptions;\n    if (args.length > 0) {\n      if (isFetchOptions(args[0])) {\n        options = {\n          ...options,\n          ...args[0],\n          beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch),\n          afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch),\n          onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError)\n        };\n      } else {\n        fetchOptions = {\n          ...fetchOptions,\n          ...args[0],\n          headers: {\n            ...headersToObject(fetchOptions.headers) || {},\n            ...headersToObject(args[0].headers) || {}\n          }\n        };\n      }\n    }\n    if (args.length > 1 && isFetchOptions(args[1])) {\n      options = {\n        ...options,\n        ...args[1],\n        beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch),\n        afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch),\n        onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError)\n      };\n    }\n    return useFetch(computedUrl, fetchOptions, options);\n  }\n  return useFactoryFetch;\n}\nfunction useFetch(url, ...args) {\n  var _a;\n  const supportsAbort = typeof AbortController === \"function\";\n  let fetchOptions = {};\n  let options = {\n    immediate: true,\n    refetch: false,\n    timeout: 0,\n    updateDataOnError: false\n  };\n  const config = {\n    method: \"GET\",\n    type: \"text\",\n    payload: void 0\n  };\n  if (args.length > 0) {\n    if (isFetchOptions(args[0]))\n      options = { ...options, ...args[0] };\n    else\n      fetchOptions = args[0];\n  }\n  if (args.length > 1) {\n    if (isFetchOptions(args[1]))\n      options = { ...options, ...args[1] };\n  }\n  const {\n    fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch,\n    initialData,\n    timeout\n  } = options;\n  const responseEvent = createEventHook();\n  const errorEvent = createEventHook();\n  const finallyEvent = createEventHook();\n  const isFinished = ref(false);\n  const isFetching = ref(false);\n  const aborted = ref(false);\n  const statusCode = ref(null);\n  const response = shallowRef(null);\n  const error = shallowRef(null);\n  const data = shallowRef(initialData || null);\n  const canAbort = computed(() => supportsAbort && isFetching.value);\n  let controller;\n  let timer;\n  const abort = () => {\n    if (supportsAbort) {\n      controller == null ? void 0 : controller.abort();\n      controller = new AbortController();\n      controller.signal.onabort = () => aborted.value = true;\n      fetchOptions = {\n        ...fetchOptions,\n        signal: controller.signal\n      };\n    }\n  };\n  const loading = (isLoading) => {\n    isFetching.value = isLoading;\n    isFinished.value = !isLoading;\n  };\n  if (timeout)\n    timer = useTimeoutFn(abort, timeout, { immediate: false });\n  let executeCounter = 0;\n  const execute = async (throwOnFailed = false) => {\n    var _a2, _b;\n    abort();\n    loading(true);\n    error.value = null;\n    statusCode.value = null;\n    aborted.value = false;\n    executeCounter += 1;\n    const currentExecuteCounter = executeCounter;\n    const defaultFetchOptions = {\n      method: config.method,\n      headers: {}\n    };\n    if (config.payload) {\n      const headers = headersToObject(defaultFetchOptions.headers);\n      const payload = toValue(config.payload);\n      if (!config.payloadType && payload && Object.getPrototypeOf(payload) === Object.prototype && !(payload instanceof FormData))\n        config.payloadType = \"json\";\n      if (config.payloadType)\n        headers[\"Content-Type\"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;\n      defaultFetchOptions.body = config.payloadType === \"json\" ? JSON.stringify(payload) : payload;\n    }\n    let isCanceled = false;\n    const context = {\n      url: toValue(url),\n      options: {\n        ...defaultFetchOptions,\n        ...fetchOptions\n      },\n      cancel: () => {\n        isCanceled = true;\n      }\n    };\n    if (options.beforeFetch)\n      Object.assign(context, await options.beforeFetch(context));\n    if (isCanceled || !fetch) {\n      loading(false);\n      return Promise.resolve(null);\n    }\n    let responseData = null;\n    if (timer)\n      timer.start();\n    return fetch(\n      context.url,\n      {\n        ...defaultFetchOptions,\n        ...context.options,\n        headers: {\n          ...headersToObject(defaultFetchOptions.headers),\n          ...headersToObject((_b = context.options) == null ? void 0 : _b.headers)\n        }\n      }\n    ).then(async (fetchResponse) => {\n      response.value = fetchResponse;\n      statusCode.value = fetchResponse.status;\n      responseData = await fetchResponse.clone()[config.type]();\n      if (!fetchResponse.ok) {\n        data.value = initialData || null;\n        throw new Error(fetchResponse.statusText);\n      }\n      if (options.afterFetch) {\n        ({ data: responseData } = await options.afterFetch({\n          data: responseData,\n          response: fetchResponse\n        }));\n      }\n      data.value = responseData;\n      responseEvent.trigger(fetchResponse);\n      return fetchResponse;\n    }).catch(async (fetchError) => {\n      let errorData = fetchError.message || fetchError.name;\n      if (options.onFetchError) {\n        ({ error: errorData, data: responseData } = await options.onFetchError({\n          data: responseData,\n          error: fetchError,\n          response: response.value\n        }));\n      }\n      error.value = errorData;\n      if (options.updateDataOnError)\n        data.value = responseData;\n      errorEvent.trigger(fetchError);\n      if (throwOnFailed)\n        throw fetchError;\n      return null;\n    }).finally(() => {\n      if (currentExecuteCounter === executeCounter)\n        loading(false);\n      if (timer)\n        timer.stop();\n      finallyEvent.trigger(null);\n    });\n  };\n  const refetch = toRef(options.refetch);\n  watch(\n    [\n      refetch,\n      toRef(url)\n    ],\n    ([refetch2]) => refetch2 && execute(),\n    { deep: true }\n  );\n  const shell = {\n    isFinished: readonly(isFinished),\n    isFetching: readonly(isFetching),\n    statusCode,\n    response,\n    error,\n    data,\n    canAbort,\n    aborted,\n    abort,\n    execute,\n    onFetchResponse: responseEvent.on,\n    onFetchError: errorEvent.on,\n    onFetchFinally: finallyEvent.on,\n    // method\n    get: setMethod(\"GET\"),\n    put: setMethod(\"PUT\"),\n    post: setMethod(\"POST\"),\n    delete: setMethod(\"DELETE\"),\n    patch: setMethod(\"PATCH\"),\n    head: setMethod(\"HEAD\"),\n    options: setMethod(\"OPTIONS\"),\n    // type\n    json: setType(\"json\"),\n    text: setType(\"text\"),\n    blob: setType(\"blob\"),\n    arrayBuffer: setType(\"arrayBuffer\"),\n    formData: setType(\"formData\")\n  };\n  function setMethod(method) {\n    return (payload, payloadType) => {\n      if (!isFetching.value) {\n        config.method = method;\n        config.payload = payload;\n        config.payloadType = payloadType;\n        if (isRef(config.payload)) {\n          watch(\n            [\n              refetch,\n              toRef(config.payload)\n            ],\n            ([refetch2]) => refetch2 && execute(),\n            { deep: true }\n          );\n        }\n        return {\n          ...shell,\n          then(onFulfilled, onRejected) {\n            return waitUntilFinished().then(onFulfilled, onRejected);\n          }\n        };\n      }\n      return void 0;\n    };\n  }\n  function waitUntilFinished() {\n    return new Promise((resolve, reject) => {\n      until(isFinished).toBe(true).then(() => resolve(shell)).catch((error2) => reject(error2));\n    });\n  }\n  function setType(type) {\n    return () => {\n      if (!isFetching.value) {\n        config.type = type;\n        return {\n          ...shell,\n          then(onFulfilled, onRejected) {\n            return waitUntilFinished().then(onFulfilled, onRejected);\n          }\n        };\n      }\n      return void 0;\n    };\n  }\n  if (options.immediate)\n    Promise.resolve().then(() => execute());\n  return {\n    ...shell,\n    then(onFulfilled, onRejected) {\n      return waitUntilFinished().then(onFulfilled, onRejected);\n    }\n  };\n}\nfunction joinPaths(start, end) {\n  if (!start.endsWith(\"/\") && !end.startsWith(\"/\"))\n    return `${start}/${end}`;\n  return `${start}${end}`;\n}\n\nconst DEFAULT_OPTIONS = {\n  multiple: true,\n  accept: \"*\",\n  reset: false,\n  directory: false\n};\nfunction useFileDialog(options = {}) {\n  const {\n    document = defaultDocument\n  } = options;\n  const files = ref(null);\n  const { on: onChange, trigger } = createEventHook();\n  let input;\n  if (document) {\n    input = document.createElement(\"input\");\n    input.type = \"file\";\n    input.onchange = (event) => {\n      const result = event.target;\n      files.value = result.files;\n      trigger(files.value);\n    };\n  }\n  const reset = () => {\n    files.value = null;\n    if (input) {\n      input.value = \"\";\n      trigger(null);\n    }\n  };\n  const open = (localOptions) => {\n    if (!input)\n      return;\n    const _options = {\n      ...DEFAULT_OPTIONS,\n      ...options,\n      ...localOptions\n    };\n    input.multiple = _options.multiple;\n    input.accept = _options.accept;\n    input.webkitdirectory = _options.directory;\n    if (hasOwn(_options, \"capture\"))\n      input.capture = _options.capture;\n    if (_options.reset)\n      reset();\n    input.click();\n  };\n  return {\n    files: readonly(files),\n    open,\n    reset,\n    onChange\n  };\n}\n\nfunction useFileSystemAccess(options = {}) {\n  const {\n    window: _window = defaultWindow,\n    dataType = \"Text\"\n  } = options;\n  const window = _window;\n  const isSupported = useSupported(() => window && \"showSaveFilePicker\" in window && \"showOpenFilePicker\" in window);\n  const fileHandle = ref();\n  const data = ref();\n  const file = ref();\n  const fileName = computed(() => {\n    var _a, _b;\n    return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : \"\";\n  });\n  const fileMIME = computed(() => {\n    var _a, _b;\n    return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : \"\";\n  });\n  const fileSize = computed(() => {\n    var _a, _b;\n    return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0;\n  });\n  const fileLastModified = computed(() => {\n    var _a, _b;\n    return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0;\n  });\n  async function open(_options = {}) {\n    if (!isSupported.value)\n      return;\n    const [handle] = await window.showOpenFilePicker({ ...toValue(options), ..._options });\n    fileHandle.value = handle;\n    await updateData();\n  }\n  async function create(_options = {}) {\n    if (!isSupported.value)\n      return;\n    fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n    data.value = void 0;\n    await updateData();\n  }\n  async function save(_options = {}) {\n    if (!isSupported.value)\n      return;\n    if (!fileHandle.value)\n      return saveAs(_options);\n    if (data.value) {\n      const writableStream = await fileHandle.value.createWritable();\n      await writableStream.write(data.value);\n      await writableStream.close();\n    }\n    await updateFile();\n  }\n  async function saveAs(_options = {}) {\n    if (!isSupported.value)\n      return;\n    fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n    if (data.value) {\n      const writableStream = await fileHandle.value.createWritable();\n      await writableStream.write(data.value);\n      await writableStream.close();\n    }\n    await updateFile();\n  }\n  async function updateFile() {\n    var _a;\n    file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile());\n  }\n  async function updateData() {\n    var _a, _b;\n    await updateFile();\n    const type = toValue(dataType);\n    if (type === \"Text\")\n      data.value = await ((_a = file.value) == null ? void 0 : _a.text());\n    else if (type === \"ArrayBuffer\")\n      data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer());\n    else if (type === \"Blob\")\n      data.value = file.value;\n  }\n  watch(() => toValue(dataType), updateData);\n  return {\n    isSupported,\n    data,\n    file,\n    fileName,\n    fileMIME,\n    fileSize,\n    fileLastModified,\n    open,\n    create,\n    save,\n    saveAs,\n    updateData\n  };\n}\n\nfunction useFocus(target, options = {}) {\n  const { initialValue = false, focusVisible = false } = options;\n  const innerFocused = ref(false);\n  const targetElement = computed(() => unrefElement(target));\n  useEventListener(targetElement, \"focus\", (event) => {\n    var _a, _b;\n    if (!focusVisible || ((_b = (_a = event.target).matches) == null ? void 0 : _b.call(_a, \":focus-visible\")))\n      innerFocused.value = true;\n  });\n  useEventListener(targetElement, \"blur\", () => innerFocused.value = false);\n  const focused = computed({\n    get: () => innerFocused.value,\n    set(value) {\n      var _a, _b;\n      if (!value && innerFocused.value)\n        (_a = targetElement.value) == null ? void 0 : _a.blur();\n      else if (value && !innerFocused.value)\n        (_b = targetElement.value) == null ? void 0 : _b.focus();\n    }\n  });\n  watch(\n    targetElement,\n    () => {\n      focused.value = initialValue;\n    },\n    { immediate: true, flush: \"post\" }\n  );\n  return { focused };\n}\n\nfunction useFocusWithin(target, options = {}) {\n  const activeElement = useActiveElement(options);\n  const targetElement = computed(() => unrefElement(target));\n  const focused = computed(() => targetElement.value && activeElement.value ? targetElement.value.contains(activeElement.value) : false);\n  return { focused };\n}\n\nfunction useFps(options) {\n  var _a;\n  const fps = ref(0);\n  if (typeof performance === \"undefined\")\n    return fps;\n  const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;\n  let last = performance.now();\n  let ticks = 0;\n  useRafFn(() => {\n    ticks += 1;\n    if (ticks >= every) {\n      const now = performance.now();\n      const diff = now - last;\n      fps.value = Math.round(1e3 / (diff / ticks));\n      last = now;\n      ticks = 0;\n    }\n  });\n  return fps;\n}\n\nconst eventHandlers = [\n  \"fullscreenchange\",\n  \"webkitfullscreenchange\",\n  \"webkitendfullscreen\",\n  \"mozfullscreenchange\",\n  \"MSFullscreenChange\"\n];\nfunction useFullscreen(target, options = {}) {\n  const {\n    document = defaultDocument,\n    autoExit = false\n  } = options;\n  const targetRef = computed(() => {\n    var _a;\n    return (_a = unrefElement(target)) != null ? _a : document == null ? void 0 : document.querySelector(\"html\");\n  });\n  const isFullscreen = ref(false);\n  const requestMethod = computed(() => {\n    return [\n      \"requestFullscreen\",\n      \"webkitRequestFullscreen\",\n      \"webkitEnterFullscreen\",\n      \"webkitEnterFullScreen\",\n      \"webkitRequestFullScreen\",\n      \"mozRequestFullScreen\",\n      \"msRequestFullscreen\"\n    ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n  });\n  const exitMethod = computed(() => {\n    return [\n      \"exitFullscreen\",\n      \"webkitExitFullscreen\",\n      \"webkitExitFullScreen\",\n      \"webkitCancelFullScreen\",\n      \"mozCancelFullScreen\",\n      \"msExitFullscreen\"\n    ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n  });\n  const fullscreenEnabled = computed(() => {\n    return [\n      \"fullScreen\",\n      \"webkitIsFullScreen\",\n      \"webkitDisplayingFullscreen\",\n      \"mozFullScreen\",\n      \"msFullscreenElement\"\n    ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n  });\n  const fullscreenElementMethod = [\n    \"fullscreenElement\",\n    \"webkitFullscreenElement\",\n    \"mozFullScreenElement\",\n    \"msFullscreenElement\"\n  ].find((m) => document && m in document);\n  const isSupported = useSupported(() => targetRef.value && document && requestMethod.value !== void 0 && exitMethod.value !== void 0 && fullscreenEnabled.value !== void 0);\n  const isCurrentElementFullScreen = () => {\n    if (fullscreenElementMethod)\n      return (document == null ? void 0 : document[fullscreenElementMethod]) === targetRef.value;\n    return false;\n  };\n  const isElementFullScreen = () => {\n    if (fullscreenEnabled.value) {\n      if (document && document[fullscreenEnabled.value] != null) {\n        return document[fullscreenEnabled.value];\n      } else {\n        const target2 = targetRef.value;\n        if ((target2 == null ? void 0 : target2[fullscreenEnabled.value]) != null) {\n          return Boolean(target2[fullscreenEnabled.value]);\n        }\n      }\n    }\n    return false;\n  };\n  async function exit() {\n    if (!isSupported.value || !isFullscreen.value)\n      return;\n    if (exitMethod.value) {\n      if ((document == null ? void 0 : document[exitMethod.value]) != null) {\n        await document[exitMethod.value]();\n      } else {\n        const target2 = targetRef.value;\n        if ((target2 == null ? void 0 : target2[exitMethod.value]) != null)\n          await target2[exitMethod.value]();\n      }\n    }\n    isFullscreen.value = false;\n  }\n  async function enter() {\n    if (!isSupported.value || isFullscreen.value)\n      return;\n    if (isElementFullScreen())\n      await exit();\n    const target2 = targetRef.value;\n    if (requestMethod.value && (target2 == null ? void 0 : target2[requestMethod.value]) != null) {\n      await target2[requestMethod.value]();\n      isFullscreen.value = true;\n    }\n  }\n  async function toggle() {\n    await (isFullscreen.value ? exit() : enter());\n  }\n  const handlerCallback = () => {\n    const isElementFullScreenValue = isElementFullScreen();\n    if (!isElementFullScreenValue || isElementFullScreenValue && isCurrentElementFullScreen())\n      isFullscreen.value = isElementFullScreenValue;\n  };\n  useEventListener(document, eventHandlers, handlerCallback, false);\n  useEventListener(() => unrefElement(targetRef), eventHandlers, handlerCallback, false);\n  if (autoExit)\n    tryOnScopeDispose(exit);\n  return {\n    isSupported,\n    isFullscreen,\n    enter,\n    exit,\n    toggle\n  };\n}\n\nfunction mapGamepadToXbox360Controller(gamepad) {\n  return computed(() => {\n    if (gamepad.value) {\n      return {\n        buttons: {\n          a: gamepad.value.buttons[0],\n          b: gamepad.value.buttons[1],\n          x: gamepad.value.buttons[2],\n          y: gamepad.value.buttons[3]\n        },\n        bumper: {\n          left: gamepad.value.buttons[4],\n          right: gamepad.value.buttons[5]\n        },\n        triggers: {\n          left: gamepad.value.buttons[6],\n          right: gamepad.value.buttons[7]\n        },\n        stick: {\n          left: {\n            horizontal: gamepad.value.axes[0],\n            vertical: gamepad.value.axes[1],\n            button: gamepad.value.buttons[10]\n          },\n          right: {\n            horizontal: gamepad.value.axes[2],\n            vertical: gamepad.value.axes[3],\n            button: gamepad.value.buttons[11]\n          }\n        },\n        dpad: {\n          up: gamepad.value.buttons[12],\n          down: gamepad.value.buttons[13],\n          left: gamepad.value.buttons[14],\n          right: gamepad.value.buttons[15]\n        },\n        back: gamepad.value.buttons[8],\n        start: gamepad.value.buttons[9]\n      };\n    }\n    return null;\n  });\n}\nfunction useGamepad(options = {}) {\n  const {\n    navigator = defaultNavigator\n  } = options;\n  const isSupported = useSupported(() => navigator && \"getGamepads\" in navigator);\n  const gamepads = ref([]);\n  const onConnectedHook = createEventHook();\n  const onDisconnectedHook = createEventHook();\n  const stateFromGamepad = (gamepad) => {\n    const hapticActuators = [];\n    const vibrationActuator = \"vibrationActuator\" in gamepad ? gamepad.vibrationActuator : null;\n    if (vibrationActuator)\n      hapticActuators.push(vibrationActuator);\n    if (gamepad.hapticActuators)\n      hapticActuators.push(...gamepad.hapticActuators);\n    return {\n      ...gamepad,\n      id: gamepad.id,\n      hapticActuators,\n      axes: gamepad.axes.map((axes) => axes),\n      buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value })),\n      index: gamepad.index\n    };\n  };\n  const updateGamepadState = () => {\n    const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n    for (const gamepad of _gamepads) {\n      if (gamepad && gamepads.value[gamepad.index])\n        gamepads.value[gamepad.index] = stateFromGamepad(gamepad);\n    }\n  };\n  const { isActive, pause, resume } = useRafFn(updateGamepadState);\n  const onGamepadConnected = (gamepad) => {\n    if (!gamepads.value.some(({ index }) => index === gamepad.index)) {\n      gamepads.value.push(stateFromGamepad(gamepad));\n      onConnectedHook.trigger(gamepad.index);\n    }\n    resume();\n  };\n  const onGamepadDisconnected = (gamepad) => {\n    gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);\n    onDisconnectedHook.trigger(gamepad.index);\n  };\n  useEventListener(\"gamepadconnected\", (e) => onGamepadConnected(e.gamepad));\n  useEventListener(\"gamepaddisconnected\", (e) => onGamepadDisconnected(e.gamepad));\n  tryOnMounted(() => {\n    const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n    for (const gamepad of _gamepads) {\n      if (gamepad && gamepads.value[gamepad.index])\n        onGamepadConnected(gamepad);\n    }\n  });\n  pause();\n  return {\n    isSupported,\n    onConnected: onConnectedHook.on,\n    onDisconnected: onDisconnectedHook.on,\n    gamepads,\n    pause,\n    resume,\n    isActive\n  };\n}\n\nfunction useGeolocation(options = {}) {\n  const {\n    enableHighAccuracy = true,\n    maximumAge = 3e4,\n    timeout = 27e3,\n    navigator = defaultNavigator,\n    immediate = true\n  } = options;\n  const isSupported = useSupported(() => navigator && \"geolocation\" in navigator);\n  const locatedAt = ref(null);\n  const error = shallowRef(null);\n  const coords = ref({\n    accuracy: 0,\n    latitude: Number.POSITIVE_INFINITY,\n    longitude: Number.POSITIVE_INFINITY,\n    altitude: null,\n    altitudeAccuracy: null,\n    heading: null,\n    speed: null\n  });\n  function updatePosition(position) {\n    locatedAt.value = position.timestamp;\n    coords.value = position.coords;\n    error.value = null;\n  }\n  let watcher;\n  function resume() {\n    if (isSupported.value) {\n      watcher = navigator.geolocation.watchPosition(\n        updatePosition,\n        (err) => error.value = err,\n        {\n          enableHighAccuracy,\n          maximumAge,\n          timeout\n        }\n      );\n    }\n  }\n  if (immediate)\n    resume();\n  function pause() {\n    if (watcher && navigator)\n      navigator.geolocation.clearWatch(watcher);\n  }\n  tryOnScopeDispose(() => {\n    pause();\n  });\n  return {\n    isSupported,\n    coords,\n    locatedAt,\n    error,\n    resume,\n    pause\n  };\n}\n\nconst defaultEvents$1 = [\"mousemove\", \"mousedown\", \"resize\", \"keydown\", \"touchstart\", \"wheel\"];\nconst oneMinute = 6e4;\nfunction useIdle(timeout = oneMinute, options = {}) {\n  const {\n    initialState = false,\n    listenForVisibilityChange = true,\n    events = defaultEvents$1,\n    window = defaultWindow,\n    eventFilter = throttleFilter(50)\n  } = options;\n  const idle = ref(initialState);\n  const lastActive = ref(timestamp());\n  let timer;\n  const reset = () => {\n    idle.value = false;\n    clearTimeout(timer);\n    timer = setTimeout(() => idle.value = true, timeout);\n  };\n  const onEvent = createFilterWrapper(\n    eventFilter,\n    () => {\n      lastActive.value = timestamp();\n      reset();\n    }\n  );\n  if (window) {\n    const document = window.document;\n    for (const event of events)\n      useEventListener(window, event, onEvent, { passive: true });\n    if (listenForVisibilityChange) {\n      useEventListener(document, \"visibilitychange\", () => {\n        if (!document.hidden)\n          onEvent();\n      });\n    }\n    reset();\n  }\n  return {\n    idle,\n    lastActive,\n    reset\n  };\n}\n\nasync function loadImage(options) {\n  return new Promise((resolve, reject) => {\n    const img = new Image();\n    const { src, srcset, sizes, class: clazz, loading, crossorigin, referrerPolicy } = options;\n    img.src = src;\n    if (srcset)\n      img.srcset = srcset;\n    if (sizes)\n      img.sizes = sizes;\n    if (clazz)\n      img.className = clazz;\n    if (loading)\n      img.loading = loading;\n    if (crossorigin)\n      img.crossOrigin = crossorigin;\n    if (referrerPolicy)\n      img.referrerPolicy = referrerPolicy;\n    img.onload = () => resolve(img);\n    img.onerror = reject;\n  });\n}\nfunction useImage(options, asyncStateOptions = {}) {\n  const state = useAsyncState(\n    () => loadImage(toValue(options)),\n    void 0,\n    {\n      resetOnExecute: true,\n      ...asyncStateOptions\n    }\n  );\n  watch(\n    () => toValue(options),\n    () => state.execute(asyncStateOptions.delay),\n    { deep: true }\n  );\n  return state;\n}\n\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\nfunction useScroll(element, options = {}) {\n  const {\n    throttle = 0,\n    idle = 200,\n    onStop = noop,\n    onScroll = noop,\n    offset = {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    },\n    eventListenerOptions = {\n      capture: false,\n      passive: true\n    },\n    behavior = \"auto\",\n    window = defaultWindow,\n    onError = (e) => {\n      console.error(e);\n    }\n  } = options;\n  const internalX = ref(0);\n  const internalY = ref(0);\n  const x = computed({\n    get() {\n      return internalX.value;\n    },\n    set(x2) {\n      scrollTo(x2, void 0);\n    }\n  });\n  const y = computed({\n    get() {\n      return internalY.value;\n    },\n    set(y2) {\n      scrollTo(void 0, y2);\n    }\n  });\n  function scrollTo(_x, _y) {\n    var _a, _b, _c;\n    if (!window)\n      return;\n    const _element = toValue(element);\n    if (!_element)\n      return;\n    (_c = _element instanceof Document ? window.document.body : _element) == null ? void 0 : _c.scrollTo({\n      top: (_a = toValue(_y)) != null ? _a : y.value,\n      left: (_b = toValue(_x)) != null ? _b : x.value,\n      behavior: toValue(behavior)\n    });\n  }\n  const isScrolling = ref(false);\n  const arrivedState = reactive({\n    left: true,\n    right: false,\n    top: true,\n    bottom: false\n  });\n  const directions = reactive({\n    left: false,\n    right: false,\n    top: false,\n    bottom: false\n  });\n  const onScrollEnd = (e) => {\n    if (!isScrolling.value)\n      return;\n    isScrolling.value = false;\n    directions.left = false;\n    directions.right = false;\n    directions.top = false;\n    directions.bottom = false;\n    onStop(e);\n  };\n  const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);\n  const setArrivedState = (target) => {\n    var _a;\n    if (!window)\n      return;\n    const el = ((_a = target == null ? void 0 : target.document) == null ? void 0 : _a.documentElement) || (target == null ? void 0 : target.documentElement) || unrefElement(target);\n    const { display, flexDirection } = getComputedStyle(el);\n    const scrollLeft = el.scrollLeft;\n    directions.left = scrollLeft < internalX.value;\n    directions.right = scrollLeft > internalX.value;\n    const left = Math.abs(scrollLeft) <= (offset.left || 0);\n    const right = Math.abs(scrollLeft) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n    if (display === \"flex\" && flexDirection === \"row-reverse\") {\n      arrivedState.left = right;\n      arrivedState.right = left;\n    } else {\n      arrivedState.left = left;\n      arrivedState.right = right;\n    }\n    internalX.value = scrollLeft;\n    let scrollTop = el.scrollTop;\n    if (target === window.document && !scrollTop)\n      scrollTop = window.document.body.scrollTop;\n    directions.top = scrollTop < internalY.value;\n    directions.bottom = scrollTop > internalY.value;\n    const top = Math.abs(scrollTop) <= (offset.top || 0);\n    const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n    if (display === \"flex\" && flexDirection === \"column-reverse\") {\n      arrivedState.top = bottom;\n      arrivedState.bottom = top;\n    } else {\n      arrivedState.top = top;\n      arrivedState.bottom = bottom;\n    }\n    internalY.value = scrollTop;\n  };\n  const onScrollHandler = (e) => {\n    var _a;\n    if (!window)\n      return;\n    const eventTarget = (_a = e.target.documentElement) != null ? _a : e.target;\n    setArrivedState(eventTarget);\n    isScrolling.value = true;\n    onScrollEndDebounced(e);\n    onScroll(e);\n  };\n  useEventListener(\n    element,\n    \"scroll\",\n    throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,\n    eventListenerOptions\n  );\n  tryOnMounted(() => {\n    try {\n      const _element = toValue(element);\n      if (!_element)\n        return;\n      setArrivedState(_element);\n    } catch (e) {\n      onError(e);\n    }\n  });\n  useEventListener(\n    element,\n    \"scrollend\",\n    onScrollEnd,\n    eventListenerOptions\n  );\n  return {\n    x,\n    y,\n    isScrolling,\n    arrivedState,\n    directions,\n    measure() {\n      const _element = toValue(element);\n      if (window && _element)\n        setArrivedState(_element);\n    }\n  };\n}\n\nfunction resolveElement(el) {\n  if (typeof Window !== \"undefined\" && el instanceof Window)\n    return el.document.documentElement;\n  if (typeof Document !== \"undefined\" && el instanceof Document)\n    return el.documentElement;\n  return el;\n}\n\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n  var _a;\n  const {\n    direction = \"bottom\",\n    interval = 100,\n    canLoadMore = () => true\n  } = options;\n  const state = reactive(useScroll(\n    element,\n    {\n      ...options,\n      offset: {\n        [direction]: (_a = options.distance) != null ? _a : 0,\n        ...options.offset\n      }\n    }\n  ));\n  const promise = ref();\n  const isLoading = computed(() => !!promise.value);\n  const observedElement = computed(() => {\n    return resolveElement(toValue(element));\n  });\n  const isElementVisible = useElementVisibility(observedElement);\n  function checkAndLoad() {\n    state.measure();\n    if (!observedElement.value || !isElementVisible.value || !canLoadMore(observedElement.value))\n      return;\n    const { scrollHeight, clientHeight, scrollWidth, clientWidth } = observedElement.value;\n    const isNarrower = direction === \"bottom\" || direction === \"top\" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth;\n    if (state.arrivedState[direction] || isNarrower) {\n      if (!promise.value) {\n        promise.value = Promise.all([\n          onLoadMore(state),\n          new Promise((resolve) => setTimeout(resolve, interval))\n        ]).finally(() => {\n          promise.value = null;\n          nextTick(() => checkAndLoad());\n        });\n      }\n    }\n  }\n  watch(\n    () => [state.arrivedState[direction], isElementVisible.value],\n    checkAndLoad,\n    { immediate: true }\n  );\n  return {\n    isLoading\n  };\n}\n\nconst defaultEvents = [\"mousedown\", \"mouseup\", \"keydown\", \"keyup\"];\nfunction useKeyModifier(modifier, options = {}) {\n  const {\n    events = defaultEvents,\n    document = defaultDocument,\n    initial = null\n  } = options;\n  const state = ref(initial);\n  if (document) {\n    events.forEach((listenerEvent) => {\n      useEventListener(document, listenerEvent, (evt) => {\n        if (typeof evt.getModifierState === \"function\")\n          state.value = evt.getModifierState(modifier);\n      });\n    });\n  }\n  return state;\n}\n\nfunction useLocalStorage(key, initialValue, options = {}) {\n  const { window = defaultWindow } = options;\n  return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options);\n}\n\nconst DefaultMagicKeysAliasMap = {\n  ctrl: \"control\",\n  command: \"meta\",\n  cmd: \"meta\",\n  option: \"alt\",\n  up: \"arrowup\",\n  down: \"arrowdown\",\n  left: \"arrowleft\",\n  right: \"arrowright\"\n};\n\nfunction useMagicKeys(options = {}) {\n  const {\n    reactive: useReactive = false,\n    target = defaultWindow,\n    aliasMap = DefaultMagicKeysAliasMap,\n    passive = true,\n    onEventFired = noop\n  } = options;\n  const current = reactive(/* @__PURE__ */ new Set());\n  const obj = {\n    toJSON() {\n      return {};\n    },\n    current\n  };\n  const refs = useReactive ? reactive(obj) : obj;\n  const metaDeps = /* @__PURE__ */ new Set();\n  const usedKeys = /* @__PURE__ */ new Set();\n  function setRefs(key, value) {\n    if (key in refs) {\n      if (useReactive)\n        refs[key] = value;\n      else\n        refs[key].value = value;\n    }\n  }\n  function reset() {\n    current.clear();\n    for (const key of usedKeys)\n      setRefs(key, false);\n  }\n  function updateRefs(e, value) {\n    var _a, _b;\n    const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();\n    const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();\n    const values = [code, key].filter(Boolean);\n    if (key) {\n      if (value)\n        current.add(key);\n      else\n        current.delete(key);\n    }\n    for (const key2 of values) {\n      usedKeys.add(key2);\n      setRefs(key2, value);\n    }\n    if (key === \"meta\" && !value) {\n      metaDeps.forEach((key2) => {\n        current.delete(key2);\n        setRefs(key2, false);\n      });\n      metaDeps.clear();\n    } else if (typeof e.getModifierState === \"function\" && e.getModifierState(\"Meta\") && value) {\n      [...current, ...values].forEach((key2) => metaDeps.add(key2));\n    }\n  }\n  useEventListener(target, \"keydown\", (e) => {\n    updateRefs(e, true);\n    return onEventFired(e);\n  }, { passive });\n  useEventListener(target, \"keyup\", (e) => {\n    updateRefs(e, false);\n    return onEventFired(e);\n  }, { passive });\n  useEventListener(\"blur\", reset, { passive: true });\n  useEventListener(\"focus\", reset, { passive: true });\n  const proxy = new Proxy(\n    refs,\n    {\n      get(target2, prop, rec) {\n        if (typeof prop !== \"string\")\n          return Reflect.get(target2, prop, rec);\n        prop = prop.toLowerCase();\n        if (prop in aliasMap)\n          prop = aliasMap[prop];\n        if (!(prop in refs)) {\n          if (/[+_-]/.test(prop)) {\n            const keys = prop.split(/[+_-]/g).map((i) => i.trim());\n            refs[prop] = computed(() => keys.every((key) => toValue(proxy[key])));\n          } else {\n            refs[prop] = ref(false);\n          }\n        }\n        const r = Reflect.get(target2, prop, rec);\n        return useReactive ? toValue(r) : r;\n      }\n    }\n  );\n  return proxy;\n}\n\nfunction usingElRef(source, cb) {\n  if (toValue(source))\n    cb(toValue(source));\n}\nfunction timeRangeToArray(timeRanges) {\n  let ranges = [];\n  for (let i = 0; i < timeRanges.length; ++i)\n    ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n  return ranges;\n}\nfunction tracksToArray(tracks) {\n  return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));\n}\nconst defaultOptions = {\n  src: \"\",\n  tracks: []\n};\nfunction useMediaControls(target, options = {}) {\n  options = {\n    ...defaultOptions,\n    ...options\n  };\n  const {\n    document = defaultDocument\n  } = options;\n  const currentTime = ref(0);\n  const duration = ref(0);\n  const seeking = ref(false);\n  const volume = ref(1);\n  const waiting = ref(false);\n  const ended = ref(false);\n  const playing = ref(false);\n  const rate = ref(1);\n  const stalled = ref(false);\n  const buffered = ref([]);\n  const tracks = ref([]);\n  const selectedTrack = ref(-1);\n  const isPictureInPicture = ref(false);\n  const muted = ref(false);\n  const supportsPictureInPicture = document && \"pictureInPictureEnabled\" in document;\n  const sourceErrorEvent = createEventHook();\n  const disableTrack = (track) => {\n    usingElRef(target, (el) => {\n      if (track) {\n        const id = typeof track === \"number\" ? track : track.id;\n        el.textTracks[id].mode = \"disabled\";\n      } else {\n        for (let i = 0; i < el.textTracks.length; ++i)\n          el.textTracks[i].mode = \"disabled\";\n      }\n      selectedTrack.value = -1;\n    });\n  };\n  const enableTrack = (track, disableTracks = true) => {\n    usingElRef(target, (el) => {\n      const id = typeof track === \"number\" ? track : track.id;\n      if (disableTracks)\n        disableTrack();\n      el.textTracks[id].mode = \"showing\";\n      selectedTrack.value = id;\n    });\n  };\n  const togglePictureInPicture = () => {\n    return new Promise((resolve, reject) => {\n      usingElRef(target, async (el) => {\n        if (supportsPictureInPicture) {\n          if (!isPictureInPicture.value) {\n            el.requestPictureInPicture().then(resolve).catch(reject);\n          } else {\n            document.exitPictureInPicture().then(resolve).catch(reject);\n          }\n        }\n      });\n    });\n  };\n  watchEffect(() => {\n    if (!document)\n      return;\n    const el = toValue(target);\n    if (!el)\n      return;\n    const src = toValue(options.src);\n    let sources = [];\n    if (!src)\n      return;\n    if (typeof src === \"string\")\n      sources = [{ src }];\n    else if (Array.isArray(src))\n      sources = src;\n    else if (isObject(src))\n      sources = [src];\n    el.querySelectorAll(\"source\").forEach((e) => {\n      e.removeEventListener(\"error\", sourceErrorEvent.trigger);\n      e.remove();\n    });\n    sources.forEach(({ src: src2, type }) => {\n      const source = document.createElement(\"source\");\n      source.setAttribute(\"src\", src2);\n      source.setAttribute(\"type\", type || \"\");\n      source.addEventListener(\"error\", sourceErrorEvent.trigger);\n      el.appendChild(source);\n    });\n    el.load();\n  });\n  tryOnScopeDispose(() => {\n    const el = toValue(target);\n    if (!el)\n      return;\n    el.querySelectorAll(\"source\").forEach((e) => e.removeEventListener(\"error\", sourceErrorEvent.trigger));\n  });\n  watch([target, volume], () => {\n    const el = toValue(target);\n    if (!el)\n      return;\n    el.volume = volume.value;\n  });\n  watch([target, muted], () => {\n    const el = toValue(target);\n    if (!el)\n      return;\n    el.muted = muted.value;\n  });\n  watch([target, rate], () => {\n    const el = toValue(target);\n    if (!el)\n      return;\n    el.playbackRate = rate.value;\n  });\n  watchEffect(() => {\n    if (!document)\n      return;\n    const textTracks = toValue(options.tracks);\n    const el = toValue(target);\n    if (!textTracks || !textTracks.length || !el)\n      return;\n    el.querySelectorAll(\"track\").forEach((e) => e.remove());\n    textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {\n      const track = document.createElement(\"track\");\n      track.default = isDefault || false;\n      track.kind = kind;\n      track.label = label;\n      track.src = src;\n      track.srclang = srcLang;\n      if (track.default)\n        selectedTrack.value = i;\n      el.appendChild(track);\n    });\n  });\n  const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(currentTime, (time) => {\n    const el = toValue(target);\n    if (!el)\n      return;\n    el.currentTime = time;\n  });\n  const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(playing, (isPlaying) => {\n    const el = toValue(target);\n    if (!el)\n      return;\n    isPlaying ? el.play() : el.pause();\n  });\n  useEventListener(target, \"timeupdate\", () => ignoreCurrentTimeUpdates(() => currentTime.value = toValue(target).currentTime));\n  useEventListener(target, \"durationchange\", () => duration.value = toValue(target).duration);\n  useEventListener(target, \"progress\", () => buffered.value = timeRangeToArray(toValue(target).buffered));\n  useEventListener(target, \"seeking\", () => seeking.value = true);\n  useEventListener(target, \"seeked\", () => seeking.value = false);\n  useEventListener(target, [\"waiting\", \"loadstart\"], () => {\n    waiting.value = true;\n    ignorePlayingUpdates(() => playing.value = false);\n  });\n  useEventListener(target, \"loadeddata\", () => waiting.value = false);\n  useEventListener(target, \"playing\", () => {\n    waiting.value = false;\n    ended.value = false;\n    ignorePlayingUpdates(() => playing.value = true);\n  });\n  useEventListener(target, \"ratechange\", () => rate.value = toValue(target).playbackRate);\n  useEventListener(target, \"stalled\", () => stalled.value = true);\n  useEventListener(target, \"ended\", () => ended.value = true);\n  useEventListener(target, \"pause\", () => ignorePlayingUpdates(() => playing.value = false));\n  useEventListener(target, \"play\", () => ignorePlayingUpdates(() => playing.value = true));\n  useEventListener(target, \"enterpictureinpicture\", () => isPictureInPicture.value = true);\n  useEventListener(target, \"leavepictureinpicture\", () => isPictureInPicture.value = false);\n  useEventListener(target, \"volumechange\", () => {\n    const el = toValue(target);\n    if (!el)\n      return;\n    volume.value = el.volume;\n    muted.value = el.muted;\n  });\n  const listeners = [];\n  const stop = watch([target], () => {\n    const el = toValue(target);\n    if (!el)\n      return;\n    stop();\n    listeners[0] = useEventListener(el.textTracks, \"addtrack\", () => tracks.value = tracksToArray(el.textTracks));\n    listeners[1] = useEventListener(el.textTracks, \"removetrack\", () => tracks.value = tracksToArray(el.textTracks));\n    listeners[2] = useEventListener(el.textTracks, \"change\", () => tracks.value = tracksToArray(el.textTracks));\n  });\n  tryOnScopeDispose(() => listeners.forEach((listener) => listener()));\n  return {\n    currentTime,\n    duration,\n    waiting,\n    seeking,\n    ended,\n    stalled,\n    buffered,\n    playing,\n    rate,\n    // Volume\n    volume,\n    muted,\n    // Tracks\n    tracks,\n    selectedTrack,\n    enableTrack,\n    disableTrack,\n    // Picture in Picture\n    supportsPictureInPicture,\n    togglePictureInPicture,\n    isPictureInPicture,\n    // Events\n    onSourceError: sourceErrorEvent.on\n  };\n}\n\nfunction getMapVue2Compat() {\n  const data = shallowReactive({});\n  return {\n    get: (key) => data[key],\n    set: (key, value) => set(data, key, value),\n    has: (key) => hasOwn(data, key),\n    delete: (key) => del(data, key),\n    clear: () => {\n      Object.keys(data).forEach((key) => {\n        del(data, key);\n      });\n    }\n  };\n}\nfunction useMemoize(resolver, options) {\n  const initCache = () => {\n    if (options == null ? void 0 : options.cache)\n      return shallowReactive(options.cache);\n    if (isVue2)\n      return getMapVue2Compat();\n    return shallowReactive(/* @__PURE__ */ new Map());\n  };\n  const cache = initCache();\n  const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);\n  const _loadData = (key, ...args) => {\n    cache.set(key, resolver(...args));\n    return cache.get(key);\n  };\n  const loadData = (...args) => _loadData(generateKey(...args), ...args);\n  const deleteData = (...args) => {\n    cache.delete(generateKey(...args));\n  };\n  const clearData = () => {\n    cache.clear();\n  };\n  const memoized = (...args) => {\n    const key = generateKey(...args);\n    if (cache.has(key))\n      return cache.get(key);\n    return _loadData(key, ...args);\n  };\n  memoized.load = loadData;\n  memoized.delete = deleteData;\n  memoized.clear = clearData;\n  memoized.generateKey = generateKey;\n  memoized.cache = cache;\n  return memoized;\n}\n\nfunction useMemory(options = {}) {\n  const memory = ref();\n  const isSupported = useSupported(() => typeof performance !== \"undefined\" && \"memory\" in performance);\n  if (isSupported.value) {\n    const { interval = 1e3 } = options;\n    useIntervalFn(() => {\n      memory.value = performance.memory;\n    }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });\n  }\n  return { isSupported, memory };\n}\n\nconst UseMouseBuiltinExtractors = {\n  page: (event) => [event.pageX, event.pageY],\n  client: (event) => [event.clientX, event.clientY],\n  screen: (event) => [event.screenX, event.screenY],\n  movement: (event) => event instanceof Touch ? null : [event.movementX, event.movementY]\n};\nfunction useMouse(options = {}) {\n  const {\n    type = \"page\",\n    touch = true,\n    resetOnTouchEnds = false,\n    initialValue = { x: 0, y: 0 },\n    window = defaultWindow,\n    target = window,\n    scroll = true,\n    eventFilter\n  } = options;\n  let _prevMouseEvent = null;\n  const x = ref(initialValue.x);\n  const y = ref(initialValue.y);\n  const sourceType = ref(null);\n  const extractor = typeof type === \"function\" ? type : UseMouseBuiltinExtractors[type];\n  const mouseHandler = (event) => {\n    const result = extractor(event);\n    _prevMouseEvent = event;\n    if (result) {\n      [x.value, y.value] = result;\n      sourceType.value = \"mouse\";\n    }\n  };\n  const touchHandler = (event) => {\n    if (event.touches.length > 0) {\n      const result = extractor(event.touches[0]);\n      if (result) {\n        [x.value, y.value] = result;\n        sourceType.value = \"touch\";\n      }\n    }\n  };\n  const scrollHandler = () => {\n    if (!_prevMouseEvent || !window)\n      return;\n    const pos = extractor(_prevMouseEvent);\n    if (_prevMouseEvent instanceof MouseEvent && pos) {\n      x.value = pos[0] + window.scrollX;\n      y.value = pos[1] + window.scrollY;\n    }\n  };\n  const reset = () => {\n    x.value = initialValue.x;\n    y.value = initialValue.y;\n  };\n  const mouseHandlerWrapper = eventFilter ? (event) => eventFilter(() => mouseHandler(event), {}) : (event) => mouseHandler(event);\n  const touchHandlerWrapper = eventFilter ? (event) => eventFilter(() => touchHandler(event), {}) : (event) => touchHandler(event);\n  const scrollHandlerWrapper = eventFilter ? () => eventFilter(() => scrollHandler(), {}) : () => scrollHandler();\n  if (target) {\n    const listenerOptions = { passive: true };\n    useEventListener(target, [\"mousemove\", \"dragover\"], mouseHandlerWrapper, listenerOptions);\n    if (touch && type !== \"movement\") {\n      useEventListener(target, [\"touchstart\", \"touchmove\"], touchHandlerWrapper, listenerOptions);\n      if (resetOnTouchEnds)\n        useEventListener(target, \"touchend\", reset, listenerOptions);\n    }\n    if (scroll && type === \"page\")\n      useEventListener(window, \"scroll\", scrollHandlerWrapper, { passive: true });\n  }\n  return {\n    x,\n    y,\n    sourceType\n  };\n}\n\nfunction useMouseInElement(target, options = {}) {\n  const {\n    handleOutside = true,\n    window = defaultWindow\n  } = options;\n  const type = options.type || \"page\";\n  const { x, y, sourceType } = useMouse(options);\n  const targetRef = ref(target != null ? target : window == null ? void 0 : window.document.body);\n  const elementX = ref(0);\n  const elementY = ref(0);\n  const elementPositionX = ref(0);\n  const elementPositionY = ref(0);\n  const elementHeight = ref(0);\n  const elementWidth = ref(0);\n  const isOutside = ref(true);\n  let stop = () => {\n  };\n  if (window) {\n    stop = watch(\n      [targetRef, x, y],\n      () => {\n        const el = unrefElement(targetRef);\n        if (!el)\n          return;\n        const {\n          left,\n          top,\n          width,\n          height\n        } = el.getBoundingClientRect();\n        elementPositionX.value = left + (type === \"page\" ? window.pageXOffset : 0);\n        elementPositionY.value = top + (type === \"page\" ? window.pageYOffset : 0);\n        elementHeight.value = height;\n        elementWidth.value = width;\n        const elX = x.value - elementPositionX.value;\n        const elY = y.value - elementPositionY.value;\n        isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height;\n        if (handleOutside || !isOutside.value) {\n          elementX.value = elX;\n          elementY.value = elY;\n        }\n      },\n      { immediate: true }\n    );\n    useEventListener(document, \"mouseleave\", () => {\n      isOutside.value = true;\n    });\n  }\n  return {\n    x,\n    y,\n    sourceType,\n    elementX,\n    elementY,\n    elementPositionX,\n    elementPositionY,\n    elementHeight,\n    elementWidth,\n    isOutside,\n    stop\n  };\n}\n\nfunction useMousePressed(options = {}) {\n  const {\n    touch = true,\n    drag = true,\n    capture = false,\n    initialValue = false,\n    window = defaultWindow\n  } = options;\n  const pressed = ref(initialValue);\n  const sourceType = ref(null);\n  if (!window) {\n    return {\n      pressed,\n      sourceType\n    };\n  }\n  const onPressed = (srcType) => () => {\n    pressed.value = true;\n    sourceType.value = srcType;\n  };\n  const onReleased = () => {\n    pressed.value = false;\n    sourceType.value = null;\n  };\n  const target = computed(() => unrefElement(options.target) || window);\n  useEventListener(target, \"mousedown\", onPressed(\"mouse\"), { passive: true, capture });\n  useEventListener(window, \"mouseleave\", onReleased, { passive: true, capture });\n  useEventListener(window, \"mouseup\", onReleased, { passive: true, capture });\n  if (drag) {\n    useEventListener(target, \"dragstart\", onPressed(\"mouse\"), { passive: true, capture });\n    useEventListener(window, \"drop\", onReleased, { passive: true, capture });\n    useEventListener(window, \"dragend\", onReleased, { passive: true, capture });\n  }\n  if (touch) {\n    useEventListener(target, \"touchstart\", onPressed(\"touch\"), { passive: true, capture });\n    useEventListener(window, \"touchend\", onReleased, { passive: true, capture });\n    useEventListener(window, \"touchcancel\", onReleased, { passive: true, capture });\n  }\n  return {\n    pressed,\n    sourceType\n  };\n}\n\nfunction useNavigatorLanguage(options = {}) {\n  const { window = defaultWindow } = options;\n  const navigator = window == null ? void 0 : window.navigator;\n  const isSupported = useSupported(() => navigator && \"language\" in navigator);\n  const language = ref(navigator == null ? void 0 : navigator.language);\n  useEventListener(window, \"languagechange\", () => {\n    if (navigator)\n      language.value = navigator.language;\n  });\n  return {\n    isSupported,\n    language\n  };\n}\n\nfunction useNetwork(options = {}) {\n  const { window = defaultWindow } = options;\n  const navigator = window == null ? void 0 : window.navigator;\n  const isSupported = useSupported(() => navigator && \"connection\" in navigator);\n  const isOnline = ref(true);\n  const saveData = ref(false);\n  const offlineAt = ref(void 0);\n  const onlineAt = ref(void 0);\n  const downlink = ref(void 0);\n  const downlinkMax = ref(void 0);\n  const rtt = ref(void 0);\n  const effectiveType = ref(void 0);\n  const type = ref(\"unknown\");\n  const connection = isSupported.value && navigator.connection;\n  function updateNetworkInformation() {\n    if (!navigator)\n      return;\n    isOnline.value = navigator.onLine;\n    offlineAt.value = isOnline.value ? void 0 : Date.now();\n    onlineAt.value = isOnline.value ? Date.now() : void 0;\n    if (connection) {\n      downlink.value = connection.downlink;\n      downlinkMax.value = connection.downlinkMax;\n      effectiveType.value = connection.effectiveType;\n      rtt.value = connection.rtt;\n      saveData.value = connection.saveData;\n      type.value = connection.type;\n    }\n  }\n  if (window) {\n    useEventListener(window, \"offline\", () => {\n      isOnline.value = false;\n      offlineAt.value = Date.now();\n    });\n    useEventListener(window, \"online\", () => {\n      isOnline.value = true;\n      onlineAt.value = Date.now();\n    });\n  }\n  if (connection)\n    useEventListener(connection, \"change\", updateNetworkInformation, false);\n  updateNetworkInformation();\n  return {\n    isSupported,\n    isOnline,\n    saveData,\n    offlineAt,\n    onlineAt,\n    downlink,\n    downlinkMax,\n    effectiveType,\n    rtt,\n    type\n  };\n}\n\nfunction useNow(options = {}) {\n  const {\n    controls: exposeControls = false,\n    interval = \"requestAnimationFrame\"\n  } = options;\n  const now = ref(/* @__PURE__ */ new Date());\n  const update = () => now.value = /* @__PURE__ */ new Date();\n  const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate: true }) : useIntervalFn(update, interval, { immediate: true });\n  if (exposeControls) {\n    return {\n      now,\n      ...controls\n    };\n  } else {\n    return now;\n  }\n}\n\nfunction useObjectUrl(object) {\n  const url = ref();\n  const release = () => {\n    if (url.value)\n      URL.revokeObjectURL(url.value);\n    url.value = void 0;\n  };\n  watch(\n    () => toValue(object),\n    (newObject) => {\n      release();\n      if (newObject)\n        url.value = URL.createObjectURL(newObject);\n    },\n    { immediate: true }\n  );\n  tryOnScopeDispose(release);\n  return readonly(url);\n}\n\nfunction useClamp(value, min, max) {\n  if (typeof value === \"function\" || isReadonly(value))\n    return computed(() => clamp(toValue(value), toValue(min), toValue(max)));\n  const _value = ref(value);\n  return computed({\n    get() {\n      return _value.value = clamp(_value.value, toValue(min), toValue(max));\n    },\n    set(value2) {\n      _value.value = clamp(value2, toValue(min), toValue(max));\n    }\n  });\n}\n\nfunction useOffsetPagination(options) {\n  const {\n    total = Number.POSITIVE_INFINITY,\n    pageSize = 10,\n    page = 1,\n    onPageChange = noop,\n    onPageSizeChange = noop,\n    onPageCountChange = noop\n  } = options;\n  const currentPageSize = useClamp(pageSize, 1, Number.POSITIVE_INFINITY);\n  const pageCount = computed(() => Math.max(\n    1,\n    Math.ceil(toValue(total) / toValue(currentPageSize))\n  ));\n  const currentPage = useClamp(page, 1, pageCount);\n  const isFirstPage = computed(() => currentPage.value === 1);\n  const isLastPage = computed(() => currentPage.value === pageCount.value);\n  if (isRef(page)) {\n    syncRef(page, currentPage, {\n      direction: isReadonly(page) ? \"ltr\" : \"both\"\n    });\n  }\n  if (isRef(pageSize)) {\n    syncRef(pageSize, currentPageSize, {\n      direction: isReadonly(pageSize) ? \"ltr\" : \"both\"\n    });\n  }\n  function prev() {\n    currentPage.value--;\n  }\n  function next() {\n    currentPage.value++;\n  }\n  const returnValue = {\n    currentPage,\n    currentPageSize,\n    pageCount,\n    isFirstPage,\n    isLastPage,\n    prev,\n    next\n  };\n  watch(currentPage, () => {\n    onPageChange(reactive(returnValue));\n  });\n  watch(currentPageSize, () => {\n    onPageSizeChange(reactive(returnValue));\n  });\n  watch(pageCount, () => {\n    onPageCountChange(reactive(returnValue));\n  });\n  return returnValue;\n}\n\nfunction useOnline(options = {}) {\n  const { isOnline } = useNetwork(options);\n  return isOnline;\n}\n\nfunction usePageLeave(options = {}) {\n  const { window = defaultWindow } = options;\n  const isLeft = ref(false);\n  const handler = (event) => {\n    if (!window)\n      return;\n    event = event || window.event;\n    const from = event.relatedTarget || event.toElement;\n    isLeft.value = !from;\n  };\n  if (window) {\n    useEventListener(window, \"mouseout\", handler, { passive: true });\n    useEventListener(window.document, \"mouseleave\", handler, { passive: true });\n    useEventListener(window.document, \"mouseenter\", handler, { passive: true });\n  }\n  return isLeft;\n}\n\nfunction useScreenOrientation(options = {}) {\n  const {\n    window = defaultWindow\n  } = options;\n  const isSupported = useSupported(() => window && \"screen\" in window && \"orientation\" in window.screen);\n  const screenOrientation = isSupported.value ? window.screen.orientation : {};\n  const orientation = ref(screenOrientation.type);\n  const angle = ref(screenOrientation.angle || 0);\n  if (isSupported.value) {\n    useEventListener(window, \"orientationchange\", () => {\n      orientation.value = screenOrientation.type;\n      angle.value = screenOrientation.angle;\n    });\n  }\n  const lockOrientation = (type) => {\n    if (isSupported.value && typeof screenOrientation.lock === \"function\")\n      return screenOrientation.lock(type);\n    return Promise.reject(new Error(\"Not supported\"));\n  };\n  const unlockOrientation = () => {\n    if (isSupported.value && typeof screenOrientation.unlock === \"function\")\n      screenOrientation.unlock();\n  };\n  return {\n    isSupported,\n    orientation,\n    angle,\n    lockOrientation,\n    unlockOrientation\n  };\n}\n\nfunction useParallax(target, options = {}) {\n  const {\n    deviceOrientationTiltAdjust = (i) => i,\n    deviceOrientationRollAdjust = (i) => i,\n    mouseTiltAdjust = (i) => i,\n    mouseRollAdjust = (i) => i,\n    window = defaultWindow\n  } = options;\n  const orientation = reactive(useDeviceOrientation({ window }));\n  const screenOrientation = reactive(useScreenOrientation({ window }));\n  const {\n    elementX: x,\n    elementY: y,\n    elementWidth: width,\n    elementHeight: height\n  } = useMouseInElement(target, { handleOutside: false, window });\n  const source = computed(() => {\n    if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0))\n      return \"deviceOrientation\";\n    return \"mouse\";\n  });\n  const roll = computed(() => {\n    if (source.value === \"deviceOrientation\") {\n      let value;\n      switch (screenOrientation.orientation) {\n        case \"landscape-primary\":\n          value = orientation.gamma / 90;\n          break;\n        case \"landscape-secondary\":\n          value = -orientation.gamma / 90;\n          break;\n        case \"portrait-primary\":\n          value = -orientation.beta / 90;\n          break;\n        case \"portrait-secondary\":\n          value = orientation.beta / 90;\n          break;\n        default:\n          value = -orientation.beta / 90;\n      }\n      return deviceOrientationRollAdjust(value);\n    } else {\n      const value = -(y.value - height.value / 2) / height.value;\n      return mouseRollAdjust(value);\n    }\n  });\n  const tilt = computed(() => {\n    if (source.value === \"deviceOrientation\") {\n      let value;\n      switch (screenOrientation.orientation) {\n        case \"landscape-primary\":\n          value = orientation.beta / 90;\n          break;\n        case \"landscape-secondary\":\n          value = -orientation.beta / 90;\n          break;\n        case \"portrait-primary\":\n          value = orientation.gamma / 90;\n          break;\n        case \"portrait-secondary\":\n          value = -orientation.gamma / 90;\n          break;\n        default:\n          value = orientation.gamma / 90;\n      }\n      return deviceOrientationTiltAdjust(value);\n    } else {\n      const value = (x.value - width.value / 2) / width.value;\n      return mouseTiltAdjust(value);\n    }\n  });\n  return { roll, tilt, source };\n}\n\nfunction useParentElement(element = useCurrentElement()) {\n  const parentElement = shallowRef();\n  const update = () => {\n    const el = unrefElement(element);\n    if (el)\n      parentElement.value = el.parentElement;\n  };\n  tryOnMounted(update);\n  watch(() => toValue(element), update);\n  return parentElement;\n}\n\nfunction usePerformanceObserver(options, callback) {\n  const {\n    window = defaultWindow,\n    immediate = true,\n    ...performanceOptions\n  } = options;\n  const isSupported = useSupported(() => window && \"PerformanceObserver\" in window);\n  let observer;\n  const stop = () => {\n    observer == null ? void 0 : observer.disconnect();\n  };\n  const start = () => {\n    if (isSupported.value) {\n      stop();\n      observer = new PerformanceObserver(callback);\n      observer.observe(performanceOptions);\n    }\n  };\n  tryOnScopeDispose(stop);\n  if (immediate)\n    start();\n  return {\n    isSupported,\n    start,\n    stop\n  };\n}\n\nconst defaultState = {\n  x: 0,\n  y: 0,\n  pointerId: 0,\n  pressure: 0,\n  tiltX: 0,\n  tiltY: 0,\n  width: 0,\n  height: 0,\n  twist: 0,\n  pointerType: null\n};\nconst keys = /* @__PURE__ */ Object.keys(defaultState);\nfunction usePointer(options = {}) {\n  const {\n    target = defaultWindow\n  } = options;\n  const isInside = ref(false);\n  const state = ref(options.initialValue || {});\n  Object.assign(state.value, defaultState, state.value);\n  const handler = (event) => {\n    isInside.value = true;\n    if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))\n      return;\n    state.value = objectPick(event, keys, false);\n  };\n  if (target) {\n    const listenerOptions = { passive: true };\n    useEventListener(target, [\"pointerdown\", \"pointermove\", \"pointerup\"], handler, listenerOptions);\n    useEventListener(target, \"pointerleave\", () => isInside.value = false, listenerOptions);\n  }\n  return {\n    ...toRefs(state),\n    isInside\n  };\n}\n\nfunction usePointerLock(target, options = {}) {\n  const { document = defaultDocument } = options;\n  const isSupported = useSupported(() => document && \"pointerLockElement\" in document);\n  const element = ref();\n  const triggerElement = ref();\n  let targetElement;\n  if (isSupported.value) {\n    useEventListener(document, \"pointerlockchange\", () => {\n      var _a;\n      const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n      if (targetElement && currentElement === targetElement) {\n        element.value = document.pointerLockElement;\n        if (!element.value)\n          targetElement = triggerElement.value = null;\n      }\n    });\n    useEventListener(document, \"pointerlockerror\", () => {\n      var _a;\n      const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n      if (targetElement && currentElement === targetElement) {\n        const action = document.pointerLockElement ? \"release\" : \"acquire\";\n        throw new Error(`Failed to ${action} pointer lock.`);\n      }\n    });\n  }\n  async function lock(e) {\n    var _a;\n    if (!isSupported.value)\n      throw new Error(\"Pointer Lock API is not supported by your browser.\");\n    triggerElement.value = e instanceof Event ? e.currentTarget : null;\n    targetElement = e instanceof Event ? (_a = unrefElement(target)) != null ? _a : triggerElement.value : unrefElement(e);\n    if (!targetElement)\n      throw new Error(\"Target element undefined.\");\n    targetElement.requestPointerLock();\n    return await until(element).toBe(targetElement);\n  }\n  async function unlock() {\n    if (!element.value)\n      return false;\n    document.exitPointerLock();\n    await until(element).toBeNull();\n    return true;\n  }\n  return {\n    isSupported,\n    element,\n    triggerElement,\n    lock,\n    unlock\n  };\n}\n\nfunction usePointerSwipe(target, options = {}) {\n  const targetRef = toRef(target);\n  const {\n    threshold = 50,\n    onSwipe,\n    onSwipeEnd,\n    onSwipeStart,\n    disableTextSelect = false\n  } = options;\n  const posStart = reactive({ x: 0, y: 0 });\n  const updatePosStart = (x, y) => {\n    posStart.x = x;\n    posStart.y = y;\n  };\n  const posEnd = reactive({ x: 0, y: 0 });\n  const updatePosEnd = (x, y) => {\n    posEnd.x = x;\n    posEnd.y = y;\n  };\n  const distanceX = computed(() => posStart.x - posEnd.x);\n  const distanceY = computed(() => posStart.y - posEnd.y);\n  const { max, abs } = Math;\n  const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);\n  const isSwiping = ref(false);\n  const isPointerDown = ref(false);\n  const direction = computed(() => {\n    if (!isThresholdExceeded.value)\n      return \"none\";\n    if (abs(distanceX.value) > abs(distanceY.value)) {\n      return distanceX.value > 0 ? \"left\" : \"right\";\n    } else {\n      return distanceY.value > 0 ? \"up\" : \"down\";\n    }\n  });\n  const eventIsAllowed = (e) => {\n    var _a, _b, _c;\n    const isReleasingButton = e.buttons === 0;\n    const isPrimaryButton = e.buttons === 1;\n    return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true;\n  };\n  const stops = [\n    useEventListener(target, \"pointerdown\", (e) => {\n      if (!eventIsAllowed(e))\n        return;\n      isPointerDown.value = true;\n      const eventTarget = e.target;\n      eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);\n      const { clientX: x, clientY: y } = e;\n      updatePosStart(x, y);\n      updatePosEnd(x, y);\n      onSwipeStart == null ? void 0 : onSwipeStart(e);\n    }),\n    useEventListener(target, \"pointermove\", (e) => {\n      if (!eventIsAllowed(e))\n        return;\n      if (!isPointerDown.value)\n        return;\n      const { clientX: x, clientY: y } = e;\n      updatePosEnd(x, y);\n      if (!isSwiping.value && isThresholdExceeded.value)\n        isSwiping.value = true;\n      if (isSwiping.value)\n        onSwipe == null ? void 0 : onSwipe(e);\n    }),\n    useEventListener(target, \"pointerup\", (e) => {\n      if (!eventIsAllowed(e))\n        return;\n      if (isSwiping.value)\n        onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n      isPointerDown.value = false;\n      isSwiping.value = false;\n    })\n  ];\n  tryOnMounted(() => {\n    var _a, _b, _c, _d, _e, _f, _g, _h;\n    (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"none\");\n    if (disableTextSelect) {\n      (_d = (_c = targetRef.value) == null ? void 0 : _c.style) == null ? void 0 : _d.setProperty(\"-webkit-user-select\", \"none\");\n      (_f = (_e = targetRef.value) == null ? void 0 : _e.style) == null ? void 0 : _f.setProperty(\"-ms-user-select\", \"none\");\n      (_h = (_g = targetRef.value) == null ? void 0 : _g.style) == null ? void 0 : _h.setProperty(\"user-select\", \"none\");\n    }\n  });\n  const stop = () => stops.forEach((s) => s());\n  return {\n    isSwiping: readonly(isSwiping),\n    direction: readonly(direction),\n    posStart: readonly(posStart),\n    posEnd: readonly(posEnd),\n    distanceX,\n    distanceY,\n    stop\n  };\n}\n\nfunction usePreferredColorScheme(options) {\n  const isLight = useMediaQuery(\"(prefers-color-scheme: light)\", options);\n  const isDark = useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n  return computed(() => {\n    if (isDark.value)\n      return \"dark\";\n    if (isLight.value)\n      return \"light\";\n    return \"no-preference\";\n  });\n}\n\nfunction usePreferredContrast(options) {\n  const isMore = useMediaQuery(\"(prefers-contrast: more)\", options);\n  const isLess = useMediaQuery(\"(prefers-contrast: less)\", options);\n  const isCustom = useMediaQuery(\"(prefers-contrast: custom)\", options);\n  return computed(() => {\n    if (isMore.value)\n      return \"more\";\n    if (isLess.value)\n      return \"less\";\n    if (isCustom.value)\n      return \"custom\";\n    return \"no-preference\";\n  });\n}\n\nfunction usePreferredLanguages(options = {}) {\n  const { window = defaultWindow } = options;\n  if (!window)\n    return ref([\"en\"]);\n  const navigator = window.navigator;\n  const value = ref(navigator.languages);\n  useEventListener(window, \"languagechange\", () => {\n    value.value = navigator.languages;\n  });\n  return value;\n}\n\nfunction usePreferredReducedMotion(options) {\n  const isReduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\", options);\n  return computed(() => {\n    if (isReduced.value)\n      return \"reduce\";\n    return \"no-preference\";\n  });\n}\n\nfunction usePrevious(value, initialValue) {\n  const previous = shallowRef(initialValue);\n  watch(\n    toRef(value),\n    (_, oldValue) => {\n      previous.value = oldValue;\n    },\n    { flush: \"sync\" }\n  );\n  return readonly(previous);\n}\n\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\nfunction useScreenSafeArea() {\n  const top = ref(\"\");\n  const right = ref(\"\");\n  const bottom = ref(\"\");\n  const left = ref(\"\");\n  if (isClient) {\n    const topCssVar = useCssVar(topVarName);\n    const rightCssVar = useCssVar(rightVarName);\n    const bottomCssVar = useCssVar(bottomVarName);\n    const leftCssVar = useCssVar(leftVarName);\n    topCssVar.value = \"env(safe-area-inset-top, 0px)\";\n    rightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n    bottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n    leftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n    update();\n    useEventListener(\"resize\", useDebounceFn(update));\n  }\n  function update() {\n    top.value = getValue(topVarName);\n    right.value = getValue(rightVarName);\n    bottom.value = getValue(bottomVarName);\n    left.value = getValue(leftVarName);\n  }\n  return {\n    top,\n    right,\n    bottom,\n    left,\n    update\n  };\n}\nfunction getValue(position) {\n  return getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n\nfunction useScriptTag(src, onLoaded = noop, options = {}) {\n  const {\n    immediate = true,\n    manual = false,\n    type = \"text/javascript\",\n    async = true,\n    crossOrigin,\n    referrerPolicy,\n    noModule,\n    defer,\n    document = defaultDocument,\n    attrs = {}\n  } = options;\n  const scriptTag = ref(null);\n  let _promise = null;\n  const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {\n    const resolveWithElement = (el2) => {\n      scriptTag.value = el2;\n      resolve(el2);\n      return el2;\n    };\n    if (!document) {\n      resolve(false);\n      return;\n    }\n    let shouldAppend = false;\n    let el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n    if (!el) {\n      el = document.createElement(\"script\");\n      el.type = type;\n      el.async = async;\n      el.src = toValue(src);\n      if (defer)\n        el.defer = defer;\n      if (crossOrigin)\n        el.crossOrigin = crossOrigin;\n      if (noModule)\n        el.noModule = noModule;\n      if (referrerPolicy)\n        el.referrerPolicy = referrerPolicy;\n      Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value));\n      shouldAppend = true;\n    } else if (el.hasAttribute(\"data-loaded\")) {\n      resolveWithElement(el);\n    }\n    el.addEventListener(\"error\", (event) => reject(event));\n    el.addEventListener(\"abort\", (event) => reject(event));\n    el.addEventListener(\"load\", () => {\n      el.setAttribute(\"data-loaded\", \"true\");\n      onLoaded(el);\n      resolveWithElement(el);\n    });\n    if (shouldAppend)\n      el = document.head.appendChild(el);\n    if (!waitForScriptLoad)\n      resolveWithElement(el);\n  });\n  const load = (waitForScriptLoad = true) => {\n    if (!_promise)\n      _promise = loadScript(waitForScriptLoad);\n    return _promise;\n  };\n  const unload = () => {\n    if (!document)\n      return;\n    _promise = null;\n    if (scriptTag.value)\n      scriptTag.value = null;\n    const el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n    if (el)\n      document.head.removeChild(el);\n  };\n  if (immediate && !manual)\n    tryOnMounted(load);\n  if (!manual)\n    tryOnUnmounted(unload);\n  return { scriptTag, load, unload };\n}\n\nfunction checkOverflowScroll(ele) {\n  const style = window.getComputedStyle(ele);\n  if (style.overflowX === \"scroll\" || style.overflowY === \"scroll\" || style.overflowX === \"auto\" && ele.clientWidth < ele.scrollWidth || style.overflowY === \"auto\" && ele.clientHeight < ele.scrollHeight) {\n    return true;\n  } else {\n    const parent = ele.parentNode;\n    if (!parent || parent.tagName === \"BODY\")\n      return false;\n    return checkOverflowScroll(parent);\n  }\n}\nfunction preventDefault(rawEvent) {\n  const e = rawEvent || window.event;\n  const _target = e.target;\n  if (checkOverflowScroll(_target))\n    return false;\n  if (e.touches.length > 1)\n    return true;\n  if (e.preventDefault)\n    e.preventDefault();\n  return false;\n}\nconst elInitialOverflow = /* @__PURE__ */ new WeakMap();\nfunction useScrollLock(element, initialState = false) {\n  const isLocked = ref(initialState);\n  let stopTouchMoveListener = null;\n  watch(toRef(element), (el) => {\n    const target = resolveElement(toValue(el));\n    if (target) {\n      const ele = target;\n      if (!elInitialOverflow.get(ele))\n        elInitialOverflow.set(ele, ele.style.overflow);\n      if (isLocked.value)\n        ele.style.overflow = \"hidden\";\n    }\n  }, {\n    immediate: true\n  });\n  const lock = () => {\n    const el = resolveElement(toValue(element));\n    if (!el || isLocked.value)\n      return;\n    if (isIOS) {\n      stopTouchMoveListener = useEventListener(\n        el,\n        \"touchmove\",\n        (e) => {\n          preventDefault(e);\n        },\n        { passive: false }\n      );\n    }\n    el.style.overflow = \"hidden\";\n    isLocked.value = true;\n  };\n  const unlock = () => {\n    var _a;\n    const el = resolveElement(toValue(element));\n    if (!el || !isLocked.value)\n      return;\n    isIOS && (stopTouchMoveListener == null ? void 0 : stopTouchMoveListener());\n    el.style.overflow = (_a = elInitialOverflow.get(el)) != null ? _a : \"\";\n    elInitialOverflow.delete(el);\n    isLocked.value = false;\n  };\n  tryOnScopeDispose(unlock);\n  return computed({\n    get() {\n      return isLocked.value;\n    },\n    set(v) {\n      if (v)\n        lock();\n      else\n        unlock();\n    }\n  });\n}\n\nfunction useSessionStorage(key, initialValue, options = {}) {\n  const { window = defaultWindow } = options;\n  return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options);\n}\n\nfunction useShare(shareOptions = {}, options = {}) {\n  const { navigator = defaultNavigator } = options;\n  const _navigator = navigator;\n  const isSupported = useSupported(() => _navigator && \"canShare\" in _navigator);\n  const share = async (overrideOptions = {}) => {\n    if (isSupported.value) {\n      const data = {\n        ...toValue(shareOptions),\n        ...toValue(overrideOptions)\n      };\n      let granted = true;\n      if (data.files && _navigator.canShare)\n        granted = _navigator.canShare({ files: data.files });\n      if (granted)\n        return _navigator.share(data);\n    }\n  };\n  return {\n    isSupported,\n    share\n  };\n}\n\nconst defaultSortFn = (source, compareFn) => source.sort(compareFn);\nconst defaultCompare = (a, b) => a - b;\nfunction useSorted(...args) {\n  var _a, _b, _c, _d;\n  const [source] = args;\n  let compareFn = defaultCompare;\n  let options = {};\n  if (args.length === 2) {\n    if (typeof args[1] === \"object\") {\n      options = args[1];\n      compareFn = (_a = options.compareFn) != null ? _a : defaultCompare;\n    } else {\n      compareFn = (_b = args[1]) != null ? _b : defaultCompare;\n    }\n  } else if (args.length > 2) {\n    compareFn = (_c = args[1]) != null ? _c : defaultCompare;\n    options = (_d = args[2]) != null ? _d : {};\n  }\n  const {\n    dirty = false,\n    sortFn = defaultSortFn\n  } = options;\n  if (!dirty)\n    return computed(() => sortFn([...toValue(source)], compareFn));\n  watchEffect(() => {\n    const result = sortFn(toValue(source), compareFn);\n    if (isRef(source))\n      source.value = result;\n    else\n      source.splice(0, source.length, ...result);\n  });\n  return source;\n}\n\nfunction useSpeechRecognition(options = {}) {\n  const {\n    interimResults = true,\n    continuous = true,\n    window = defaultWindow\n  } = options;\n  const lang = toRef(options.lang || \"en-US\");\n  const isListening = ref(false);\n  const isFinal = ref(false);\n  const result = ref(\"\");\n  const error = shallowRef(void 0);\n  const toggle = (value = !isListening.value) => {\n    isListening.value = value;\n  };\n  const start = () => {\n    isListening.value = true;\n  };\n  const stop = () => {\n    isListening.value = false;\n  };\n  const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);\n  const isSupported = useSupported(() => SpeechRecognition);\n  let recognition;\n  if (isSupported.value) {\n    recognition = new SpeechRecognition();\n    recognition.continuous = continuous;\n    recognition.interimResults = interimResults;\n    recognition.lang = toValue(lang);\n    recognition.onstart = () => {\n      isFinal.value = false;\n    };\n    watch(lang, (lang2) => {\n      if (recognition && !isListening.value)\n        recognition.lang = lang2;\n    });\n    recognition.onresult = (event) => {\n      const transcript = Array.from(event.results).map((result2) => {\n        isFinal.value = result2.isFinal;\n        return result2[0];\n      }).map((result2) => result2.transcript).join(\"\");\n      result.value = transcript;\n      error.value = void 0;\n    };\n    recognition.onerror = (event) => {\n      error.value = event;\n    };\n    recognition.onend = () => {\n      isListening.value = false;\n      recognition.lang = toValue(lang);\n    };\n    watch(isListening, () => {\n      if (isListening.value)\n        recognition.start();\n      else\n        recognition.stop();\n    });\n  }\n  tryOnScopeDispose(() => {\n    isListening.value = false;\n  });\n  return {\n    isSupported,\n    isListening,\n    isFinal,\n    recognition,\n    result,\n    error,\n    toggle,\n    start,\n    stop\n  };\n}\n\nfunction useSpeechSynthesis(text, options = {}) {\n  const {\n    pitch = 1,\n    rate = 1,\n    volume = 1,\n    window = defaultWindow\n  } = options;\n  const synth = window && window.speechSynthesis;\n  const isSupported = useSupported(() => synth);\n  const isPlaying = ref(false);\n  const status = ref(\"init\");\n  const spokenText = toRef(text || \"\");\n  const lang = toRef(options.lang || \"en-US\");\n  const error = shallowRef(void 0);\n  const toggle = (value = !isPlaying.value) => {\n    isPlaying.value = value;\n  };\n  const bindEventsForUtterance = (utterance2) => {\n    utterance2.lang = toValue(lang);\n    utterance2.voice = toValue(options.voice) || null;\n    utterance2.pitch = toValue(pitch);\n    utterance2.rate = toValue(rate);\n    utterance2.volume = volume;\n    utterance2.onstart = () => {\n      isPlaying.value = true;\n      status.value = \"play\";\n    };\n    utterance2.onpause = () => {\n      isPlaying.value = false;\n      status.value = \"pause\";\n    };\n    utterance2.onresume = () => {\n      isPlaying.value = true;\n      status.value = \"play\";\n    };\n    utterance2.onend = () => {\n      isPlaying.value = false;\n      status.value = \"end\";\n    };\n    utterance2.onerror = (event) => {\n      error.value = event;\n    };\n  };\n  const utterance = computed(() => {\n    isPlaying.value = false;\n    status.value = \"init\";\n    const newUtterance = new SpeechSynthesisUtterance(spokenText.value);\n    bindEventsForUtterance(newUtterance);\n    return newUtterance;\n  });\n  const speak = () => {\n    synth.cancel();\n    utterance && synth.speak(utterance.value);\n  };\n  const stop = () => {\n    synth.cancel();\n    isPlaying.value = false;\n  };\n  if (isSupported.value) {\n    bindEventsForUtterance(utterance.value);\n    watch(lang, (lang2) => {\n      if (utterance.value && !isPlaying.value)\n        utterance.value.lang = lang2;\n    });\n    if (options.voice) {\n      watch(options.voice, () => {\n        synth.cancel();\n      });\n    }\n    watch(isPlaying, () => {\n      if (isPlaying.value)\n        synth.resume();\n      else\n        synth.pause();\n    });\n  }\n  tryOnScopeDispose(() => {\n    isPlaying.value = false;\n  });\n  return {\n    isSupported,\n    isPlaying,\n    status,\n    utterance,\n    error,\n    stop,\n    toggle,\n    speak\n  };\n}\n\nfunction useStepper(steps, initialStep) {\n  const stepsRef = ref(steps);\n  const stepNames = computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value));\n  const index = ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0]));\n  const current = computed(() => at(index.value));\n  const isFirst = computed(() => index.value === 0);\n  const isLast = computed(() => index.value === stepNames.value.length - 1);\n  const next = computed(() => stepNames.value[index.value + 1]);\n  const previous = computed(() => stepNames.value[index.value - 1]);\n  function at(index2) {\n    if (Array.isArray(stepsRef.value))\n      return stepsRef.value[index2];\n    return stepsRef.value[stepNames.value[index2]];\n  }\n  function get(step) {\n    if (!stepNames.value.includes(step))\n      return;\n    return at(stepNames.value.indexOf(step));\n  }\n  function goTo(step) {\n    if (stepNames.value.includes(step))\n      index.value = stepNames.value.indexOf(step);\n  }\n  function goToNext() {\n    if (isLast.value)\n      return;\n    index.value++;\n  }\n  function goToPrevious() {\n    if (isFirst.value)\n      return;\n    index.value--;\n  }\n  function goBackTo(step) {\n    if (isAfter(step))\n      goTo(step);\n  }\n  function isNext(step) {\n    return stepNames.value.indexOf(step) === index.value + 1;\n  }\n  function isPrevious(step) {\n    return stepNames.value.indexOf(step) === index.value - 1;\n  }\n  function isCurrent(step) {\n    return stepNames.value.indexOf(step) === index.value;\n  }\n  function isBefore(step) {\n    return index.value < stepNames.value.indexOf(step);\n  }\n  function isAfter(step) {\n    return index.value > stepNames.value.indexOf(step);\n  }\n  return {\n    steps: stepsRef,\n    stepNames,\n    index,\n    current,\n    next,\n    previous,\n    isFirst,\n    isLast,\n    at,\n    get,\n    goTo,\n    goToNext,\n    goToPrevious,\n    goBackTo,\n    isNext,\n    isPrevious,\n    isCurrent,\n    isBefore,\n    isAfter\n  };\n}\n\nfunction useStorageAsync(key, initialValue, storage, options = {}) {\n  var _a;\n  const {\n    flush = \"pre\",\n    deep = true,\n    listenToStorageChanges = true,\n    writeDefaults = true,\n    mergeDefaults = false,\n    shallow,\n    window = defaultWindow,\n    eventFilter,\n    onError = (e) => {\n      console.error(e);\n    }\n  } = options;\n  const rawInit = toValue(initialValue);\n  const type = guessSerializerType(rawInit);\n  const data = (shallow ? shallowRef : ref)(initialValue);\n  const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n  if (!storage) {\n    try {\n      storage = getSSRHandler(\"getDefaultStorageAsync\", () => {\n        var _a2;\n        return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n      })();\n    } catch (e) {\n      onError(e);\n    }\n  }\n  async function read(event) {\n    if (!storage || event && event.key !== key)\n      return;\n    try {\n      const rawValue = event ? event.newValue : await storage.getItem(key);\n      if (rawValue == null) {\n        data.value = rawInit;\n        if (writeDefaults && rawInit !== null)\n          await storage.setItem(key, await serializer.write(rawInit));\n      } else if (mergeDefaults) {\n        const value = await serializer.read(rawValue);\n        if (typeof mergeDefaults === \"function\")\n          data.value = mergeDefaults(value, rawInit);\n        else if (type === \"object\" && !Array.isArray(value))\n          data.value = { ...rawInit, ...value };\n        else\n          data.value = value;\n      } else {\n        data.value = await serializer.read(rawValue);\n      }\n    } catch (e) {\n      onError(e);\n    }\n  }\n  read();\n  if (window && listenToStorageChanges)\n    useEventListener(window, \"storage\", (e) => Promise.resolve().then(() => read(e)));\n  if (storage) {\n    watchWithFilter(\n      data,\n      async () => {\n        try {\n          if (data.value == null)\n            await storage.removeItem(key);\n          else\n            await storage.setItem(key, await serializer.write(data.value));\n        } catch (e) {\n          onError(e);\n        }\n      },\n      {\n        flush,\n        deep,\n        eventFilter\n      }\n    );\n  }\n  return data;\n}\n\nlet _id = 0;\nfunction useStyleTag(css, options = {}) {\n  const isLoaded = ref(false);\n  const {\n    document = defaultDocument,\n    immediate = true,\n    manual = false,\n    id = `vueuse_styletag_${++_id}`\n  } = options;\n  const cssRef = ref(css);\n  let stop = () => {\n  };\n  const load = () => {\n    if (!document)\n      return;\n    const el = document.getElementById(id) || document.createElement(\"style\");\n    if (!el.isConnected) {\n      el.id = id;\n      if (options.media)\n        el.media = options.media;\n      document.head.appendChild(el);\n    }\n    if (isLoaded.value)\n      return;\n    stop = watch(\n      cssRef,\n      (value) => {\n        el.textContent = value;\n      },\n      { immediate: true }\n    );\n    isLoaded.value = true;\n  };\n  const unload = () => {\n    if (!document || !isLoaded.value)\n      return;\n    stop();\n    document.head.removeChild(document.getElementById(id));\n    isLoaded.value = false;\n  };\n  if (immediate && !manual)\n    tryOnMounted(load);\n  if (!manual)\n    tryOnScopeDispose(unload);\n  return {\n    id,\n    css: cssRef,\n    unload,\n    load,\n    isLoaded: readonly(isLoaded)\n  };\n}\n\nfunction useSwipe(target, options = {}) {\n  const {\n    threshold = 50,\n    onSwipe,\n    onSwipeEnd,\n    onSwipeStart,\n    passive = true,\n    window = defaultWindow\n  } = options;\n  const coordsStart = reactive({ x: 0, y: 0 });\n  const coordsEnd = reactive({ x: 0, y: 0 });\n  const diffX = computed(() => coordsStart.x - coordsEnd.x);\n  const diffY = computed(() => coordsStart.y - coordsEnd.y);\n  const { max, abs } = Math;\n  const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n  const isSwiping = ref(false);\n  const direction = computed(() => {\n    if (!isThresholdExceeded.value)\n      return \"none\";\n    if (abs(diffX.value) > abs(diffY.value)) {\n      return diffX.value > 0 ? \"left\" : \"right\";\n    } else {\n      return diffY.value > 0 ? \"up\" : \"down\";\n    }\n  });\n  const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];\n  const updateCoordsStart = (x, y) => {\n    coordsStart.x = x;\n    coordsStart.y = y;\n  };\n  const updateCoordsEnd = (x, y) => {\n    coordsEnd.x = x;\n    coordsEnd.y = y;\n  };\n  let listenerOptions;\n  const isPassiveEventSupported = checkPassiveEventSupport(window == null ? void 0 : window.document);\n  if (!passive)\n    listenerOptions = isPassiveEventSupported ? { passive: false, capture: true } : { capture: true };\n  else\n    listenerOptions = isPassiveEventSupported ? { passive: true } : { capture: false };\n  const onTouchEnd = (e) => {\n    if (isSwiping.value)\n      onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n    isSwiping.value = false;\n  };\n  const stops = [\n    useEventListener(target, \"touchstart\", (e) => {\n      if (e.touches.length !== 1)\n        return;\n      if (listenerOptions.capture && !listenerOptions.passive)\n        e.preventDefault();\n      const [x, y] = getTouchEventCoords(e);\n      updateCoordsStart(x, y);\n      updateCoordsEnd(x, y);\n      onSwipeStart == null ? void 0 : onSwipeStart(e);\n    }, listenerOptions),\n    useEventListener(target, \"touchmove\", (e) => {\n      if (e.touches.length !== 1)\n        return;\n      const [x, y] = getTouchEventCoords(e);\n      updateCoordsEnd(x, y);\n      if (!isSwiping.value && isThresholdExceeded.value)\n        isSwiping.value = true;\n      if (isSwiping.value)\n        onSwipe == null ? void 0 : onSwipe(e);\n    }, listenerOptions),\n    useEventListener(target, [\"touchend\", \"touchcancel\"], onTouchEnd, listenerOptions)\n  ];\n  const stop = () => stops.forEach((s) => s());\n  return {\n    isPassiveEventSupported,\n    isSwiping,\n    direction,\n    coordsStart,\n    coordsEnd,\n    lengthX: diffX,\n    lengthY: diffY,\n    stop\n  };\n}\nfunction checkPassiveEventSupport(document) {\n  if (!document)\n    return false;\n  let supportsPassive = false;\n  const optionsBlock = {\n    get passive() {\n      supportsPassive = true;\n      return false;\n    }\n  };\n  document.addEventListener(\"x\", noop, optionsBlock);\n  document.removeEventListener(\"x\", noop);\n  return supportsPassive;\n}\n\nfunction useTemplateRefsList() {\n  const refs = ref([]);\n  refs.value.set = (el) => {\n    if (el)\n      refs.value.push(el);\n  };\n  onBeforeUpdate(() => {\n    refs.value.length = 0;\n  });\n  return refs;\n}\n\nfunction useTextDirection(options = {}) {\n  const {\n    document = defaultDocument,\n    selector = \"html\",\n    observe = false,\n    initialValue = \"ltr\"\n  } = options;\n  function getValue() {\n    var _a, _b;\n    return (_b = (_a = document == null ? void 0 : document.querySelector(selector)) == null ? void 0 : _a.getAttribute(\"dir\")) != null ? _b : initialValue;\n  }\n  const dir = ref(getValue());\n  tryOnMounted(() => dir.value = getValue());\n  if (observe && document) {\n    useMutationObserver(\n      document.querySelector(selector),\n      () => dir.value = getValue(),\n      { attributes: true }\n    );\n  }\n  return computed({\n    get() {\n      return dir.value;\n    },\n    set(v) {\n      var _a, _b;\n      dir.value = v;\n      if (!document)\n        return;\n      if (dir.value)\n        (_a = document.querySelector(selector)) == null ? void 0 : _a.setAttribute(\"dir\", dir.value);\n      else\n        (_b = document.querySelector(selector)) == null ? void 0 : _b.removeAttribute(\"dir\");\n    }\n  });\n}\n\nfunction getRangesFromSelection(selection) {\n  var _a;\n  const rangeCount = (_a = selection.rangeCount) != null ? _a : 0;\n  return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));\n}\nfunction useTextSelection(options = {}) {\n  const {\n    window = defaultWindow\n  } = options;\n  const selection = ref(null);\n  const text = computed(() => {\n    var _a, _b;\n    return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : \"\";\n  });\n  const ranges = computed(() => selection.value ? getRangesFromSelection(selection.value) : []);\n  const rects = computed(() => ranges.value.map((range) => range.getBoundingClientRect()));\n  function onSelectionChange() {\n    selection.value = null;\n    if (window)\n      selection.value = window.getSelection();\n  }\n  if (window)\n    useEventListener(window.document, \"selectionchange\", onSelectionChange);\n  return {\n    text,\n    rects,\n    ranges,\n    selection\n  };\n}\n\nfunction useTextareaAutosize(options) {\n  var _a;\n  const textarea = ref(options == null ? void 0 : options.element);\n  const input = ref(options == null ? void 0 : options.input);\n  const styleProp = (_a = options == null ? void 0 : options.styleProp) != null ? _a : \"height\";\n  const textareaScrollHeight = ref(1);\n  function triggerResize() {\n    var _a2, _b;\n    if (!textarea.value)\n      return;\n    let height = \"\";\n    textarea.value.style[styleProp] = \"1px\";\n    textareaScrollHeight.value = (_a2 = textarea.value) == null ? void 0 : _a2.scrollHeight;\n    if (options == null ? void 0 : options.styleTarget)\n      toValue(options.styleTarget).style[styleProp] = `${textareaScrollHeight.value}px`;\n    else\n      height = `${textareaScrollHeight.value}px`;\n    textarea.value.style[styleProp] = height;\n    (_b = options == null ? void 0 : options.onResize) == null ? void 0 : _b.call(options);\n  }\n  watch([input, textarea], () => nextTick(triggerResize), { immediate: true });\n  useResizeObserver(textarea, () => triggerResize());\n  if (options == null ? void 0 : options.watch)\n    watch(options.watch, triggerResize, { immediate: true, deep: true });\n  return {\n    textarea,\n    input,\n    triggerResize\n  };\n}\n\nfunction useThrottledRefHistory(source, options = {}) {\n  const { throttle = 200, trailing = true } = options;\n  const filter = throttleFilter(throttle, trailing);\n  const history = useRefHistory(source, { ...options, eventFilter: filter });\n  return {\n    ...history\n  };\n}\n\nconst DEFAULT_UNITS = [\n  { max: 6e4, value: 1e3, name: \"second\" },\n  { max: 276e4, value: 6e4, name: \"minute\" },\n  { max: 72e6, value: 36e5, name: \"hour\" },\n  { max: 5184e5, value: 864e5, name: \"day\" },\n  { max: 24192e5, value: 6048e5, name: \"week\" },\n  { max: 28512e6, value: 2592e6, name: \"month\" },\n  { max: Number.POSITIVE_INFINITY, value: 31536e6, name: \"year\" }\n];\nconst DEFAULT_MESSAGES = {\n  justNow: \"just now\",\n  past: (n) => n.match(/\\d/) ? `${n} ago` : n,\n  future: (n) => n.match(/\\d/) ? `in ${n}` : n,\n  month: (n, past) => n === 1 ? past ? \"last month\" : \"next month\" : `${n} month${n > 1 ? \"s\" : \"\"}`,\n  year: (n, past) => n === 1 ? past ? \"last year\" : \"next year\" : `${n} year${n > 1 ? \"s\" : \"\"}`,\n  day: (n, past) => n === 1 ? past ? \"yesterday\" : \"tomorrow\" : `${n} day${n > 1 ? \"s\" : \"\"}`,\n  week: (n, past) => n === 1 ? past ? \"last week\" : \"next week\" : `${n} week${n > 1 ? \"s\" : \"\"}`,\n  hour: (n) => `${n} hour${n > 1 ? \"s\" : \"\"}`,\n  minute: (n) => `${n} minute${n > 1 ? \"s\" : \"\"}`,\n  second: (n) => `${n} second${n > 1 ? \"s\" : \"\"}`,\n  invalid: \"\"\n};\nfunction DEFAULT_FORMATTER(date) {\n  return date.toISOString().slice(0, 10);\n}\nfunction useTimeAgo(time, options = {}) {\n  const {\n    controls: exposeControls = false,\n    updateInterval = 3e4\n  } = options;\n  const { now, ...controls } = useNow({ interval: updateInterval, controls: true });\n  const timeAgo = computed(() => formatTimeAgo(new Date(toValue(time)), options, toValue(now)));\n  if (exposeControls) {\n    return {\n      timeAgo,\n      ...controls\n    };\n  } else {\n    return timeAgo;\n  }\n}\nfunction formatTimeAgo(from, options = {}, now = Date.now()) {\n  var _a;\n  const {\n    max,\n    messages = DEFAULT_MESSAGES,\n    fullDateFormatter = DEFAULT_FORMATTER,\n    units = DEFAULT_UNITS,\n    showSecond = false,\n    rounding = \"round\"\n  } = options;\n  const roundFn = typeof rounding === \"number\" ? (n) => +n.toFixed(rounding) : Math[rounding];\n  const diff = +now - +from;\n  const absDiff = Math.abs(diff);\n  function getValue(diff2, unit) {\n    return roundFn(Math.abs(diff2) / unit.value);\n  }\n  function format(diff2, unit) {\n    const val = getValue(diff2, unit);\n    const past = diff2 > 0;\n    const str = applyFormat(unit.name, val, past);\n    return applyFormat(past ? \"past\" : \"future\", str, past);\n  }\n  function applyFormat(name, val, isPast) {\n    const formatter = messages[name];\n    if (typeof formatter === \"function\")\n      return formatter(val, isPast);\n    return formatter.replace(\"{0}\", val.toString());\n  }\n  if (absDiff < 6e4 && !showSecond)\n    return messages.justNow;\n  if (typeof max === \"number\" && absDiff > max)\n    return fullDateFormatter(new Date(from));\n  if (typeof max === \"string\") {\n    const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max;\n    if (unitMax && absDiff > unitMax)\n      return fullDateFormatter(new Date(from));\n  }\n  for (const [idx, unit] of units.entries()) {\n    const val = getValue(diff, unit);\n    if (val <= 0 && units[idx - 1])\n      return format(diff, units[idx - 1]);\n    if (absDiff < unit.max)\n      return format(diff, unit);\n  }\n  return messages.invalid;\n}\n\nfunction useTimeoutPoll(fn, interval, timeoutPollOptions) {\n  const { start } = useTimeoutFn(loop, interval, { immediate: false });\n  const isActive = ref(false);\n  async function loop() {\n    if (!isActive.value)\n      return;\n    await fn();\n    start();\n  }\n  function resume() {\n    if (!isActive.value) {\n      isActive.value = true;\n      loop();\n    }\n  }\n  function pause() {\n    isActive.value = false;\n  }\n  if (timeoutPollOptions == null ? void 0 : timeoutPollOptions.immediate)\n    resume();\n  tryOnScopeDispose(pause);\n  return {\n    isActive,\n    pause,\n    resume\n  };\n}\n\nfunction useTimestamp(options = {}) {\n  const {\n    controls: exposeControls = false,\n    offset = 0,\n    immediate = true,\n    interval = \"requestAnimationFrame\",\n    callback\n  } = options;\n  const ts = ref(timestamp() + offset);\n  const update = () => ts.value = timestamp() + offset;\n  const cb = callback ? () => {\n    update();\n    callback(ts.value);\n  } : update;\n  const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n  if (exposeControls) {\n    return {\n      timestamp: ts,\n      ...controls\n    };\n  } else {\n    return ts;\n  }\n}\n\nfunction useTitle(newTitle = null, options = {}) {\n  var _a, _b, _c;\n  const {\n    document = defaultDocument,\n    restoreOnUnmount = (t) => t\n  } = options;\n  const originalTitle = (_a = document == null ? void 0 : document.title) != null ? _a : \"\";\n  const title = toRef((_b = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _b : null);\n  const isReadonly = newTitle && typeof newTitle === \"function\";\n  function format(t) {\n    if (!(\"titleTemplate\" in options))\n      return t;\n    const template = options.titleTemplate || \"%s\";\n    return typeof template === \"function\" ? template(t) : toValue(template).replace(/%s/g, t);\n  }\n  watch(\n    title,\n    (t, o) => {\n      if (t !== o && document)\n        document.title = format(typeof t === \"string\" ? t : \"\");\n    },\n    { immediate: true }\n  );\n  if (options.observe && !options.titleTemplate && document && !isReadonly) {\n    useMutationObserver(\n      (_c = document.head) == null ? void 0 : _c.querySelector(\"title\"),\n      () => {\n        if (document && document.title !== title.value)\n          title.value = format(document.title);\n      },\n      { childList: true }\n    );\n  }\n  tryOnBeforeUnmount(() => {\n    if (restoreOnUnmount) {\n      const restoredTitle = restoreOnUnmount(originalTitle, title.value || \"\");\n      if (restoredTitle != null && document)\n        document.title = restoredTitle;\n    }\n  });\n  return title;\n}\n\nconst _TransitionPresets = {\n  easeInSine: [0.12, 0, 0.39, 0],\n  easeOutSine: [0.61, 1, 0.88, 1],\n  easeInOutSine: [0.37, 0, 0.63, 1],\n  easeInQuad: [0.11, 0, 0.5, 0],\n  easeOutQuad: [0.5, 1, 0.89, 1],\n  easeInOutQuad: [0.45, 0, 0.55, 1],\n  easeInCubic: [0.32, 0, 0.67, 0],\n  easeOutCubic: [0.33, 1, 0.68, 1],\n  easeInOutCubic: [0.65, 0, 0.35, 1],\n  easeInQuart: [0.5, 0, 0.75, 0],\n  easeOutQuart: [0.25, 1, 0.5, 1],\n  easeInOutQuart: [0.76, 0, 0.24, 1],\n  easeInQuint: [0.64, 0, 0.78, 0],\n  easeOutQuint: [0.22, 1, 0.36, 1],\n  easeInOutQuint: [0.83, 0, 0.17, 1],\n  easeInExpo: [0.7, 0, 0.84, 0],\n  easeOutExpo: [0.16, 1, 0.3, 1],\n  easeInOutExpo: [0.87, 0, 0.13, 1],\n  easeInCirc: [0.55, 0, 1, 0.45],\n  easeOutCirc: [0, 0.55, 0.45, 1],\n  easeInOutCirc: [0.85, 0, 0.15, 1],\n  easeInBack: [0.36, 0, 0.66, -0.56],\n  easeOutBack: [0.34, 1.56, 0.64, 1],\n  easeInOutBack: [0.68, -0.6, 0.32, 1.6]\n};\nconst TransitionPresets = /* @__PURE__ */ Object.assign({}, { linear: identity }, _TransitionPresets);\nfunction createEasingFunction([p0, p1, p2, p3]) {\n  const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;\n  const b = (a1, a2) => 3 * a2 - 6 * a1;\n  const c = (a1) => 3 * a1;\n  const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\n  const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);\n  const getTforX = (x) => {\n    let aGuessT = x;\n    for (let i = 0; i < 4; ++i) {\n      const currentSlope = getSlope(aGuessT, p0, p2);\n      if (currentSlope === 0)\n        return aGuessT;\n      const currentX = calcBezier(aGuessT, p0, p2) - x;\n      aGuessT -= currentX / currentSlope;\n    }\n    return aGuessT;\n  };\n  return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);\n}\nfunction lerp(a, b, alpha) {\n  return a + alpha * (b - a);\n}\nfunction toVec(t) {\n  return (typeof t === \"number\" ? [t] : t) || [];\n}\nfunction executeTransition(source, from, to, options = {}) {\n  var _a, _b;\n  const fromVal = toValue(from);\n  const toVal = toValue(to);\n  const v1 = toVec(fromVal);\n  const v2 = toVec(toVal);\n  const duration = (_a = toValue(options.duration)) != null ? _a : 1e3;\n  const startedAt = Date.now();\n  const endAt = Date.now() + duration;\n  const trans = typeof options.transition === \"function\" ? options.transition : (_b = toValue(options.transition)) != null ? _b : identity;\n  const ease = typeof trans === \"function\" ? trans : createEasingFunction(trans);\n  return new Promise((resolve) => {\n    source.value = fromVal;\n    const tick = () => {\n      var _a2;\n      if ((_a2 = options.abort) == null ? void 0 : _a2.call(options)) {\n        resolve();\n        return;\n      }\n      const now = Date.now();\n      const alpha = ease((now - startedAt) / duration);\n      const arr = toVec(source.value).map((n, i) => lerp(v1[i], v2[i], alpha));\n      if (Array.isArray(source.value))\n        source.value = arr.map((n, i) => {\n          var _a3, _b2;\n          return lerp((_a3 = v1[i]) != null ? _a3 : 0, (_b2 = v2[i]) != null ? _b2 : 0, alpha);\n        });\n      else if (typeof source.value === \"number\")\n        source.value = arr[0];\n      if (now < endAt) {\n        requestAnimationFrame(tick);\n      } else {\n        source.value = toVal;\n        resolve();\n      }\n    };\n    tick();\n  });\n}\nfunction useTransition(source, options = {}) {\n  let currentId = 0;\n  const sourceVal = () => {\n    const v = toValue(source);\n    return typeof v === \"number\" ? v : v.map(toValue);\n  };\n  const outputRef = ref(sourceVal());\n  watch(sourceVal, async (to) => {\n    var _a, _b;\n    if (toValue(options.disabled))\n      return;\n    const id = ++currentId;\n    if (options.delay)\n      await promiseTimeout(toValue(options.delay));\n    if (id !== currentId)\n      return;\n    const toVal = Array.isArray(to) ? to.map(toValue) : toValue(to);\n    (_a = options.onStarted) == null ? void 0 : _a.call(options);\n    await executeTransition(outputRef, outputRef.value, toVal, {\n      ...options,\n      abort: () => {\n        var _a2;\n        return id !== currentId || ((_a2 = options.abort) == null ? void 0 : _a2.call(options));\n      }\n    });\n    (_b = options.onFinished) == null ? void 0 : _b.call(options);\n  }, { deep: true });\n  watch(() => toValue(options.disabled), (disabled) => {\n    if (disabled) {\n      currentId++;\n      outputRef.value = sourceVal();\n    }\n  });\n  tryOnScopeDispose(() => {\n    currentId++;\n  });\n  return computed(() => toValue(options.disabled) ? sourceVal() : outputRef.value);\n}\n\nfunction useUrlSearchParams(mode = \"history\", options = {}) {\n  const {\n    initialValue = {},\n    removeNullishValues = true,\n    removeFalsyValues = false,\n    write: enableWrite = true,\n    window = defaultWindow\n  } = options;\n  if (!window)\n    return reactive(initialValue);\n  const state = reactive({});\n  function getRawParams() {\n    if (mode === \"history\") {\n      return window.location.search || \"\";\n    } else if (mode === \"hash\") {\n      const hash = window.location.hash || \"\";\n      const index = hash.indexOf(\"?\");\n      return index > 0 ? hash.slice(index) : \"\";\n    } else {\n      return (window.location.hash || \"\").replace(/^#/, \"\");\n    }\n  }\n  function constructQuery(params) {\n    const stringified = params.toString();\n    if (mode === \"history\")\n      return `${stringified ? `?${stringified}` : \"\"}${window.location.hash || \"\"}`;\n    if (mode === \"hash-params\")\n      return `${window.location.search || \"\"}${stringified ? `#${stringified}` : \"\"}`;\n    const hash = window.location.hash || \"#\";\n    const index = hash.indexOf(\"?\");\n    if (index > 0)\n      return `${hash.slice(0, index)}${stringified ? `?${stringified}` : \"\"}`;\n    return `${hash}${stringified ? `?${stringified}` : \"\"}`;\n  }\n  function read() {\n    return new URLSearchParams(getRawParams());\n  }\n  function updateState(params) {\n    const unusedKeys = new Set(Object.keys(state));\n    for (const key of params.keys()) {\n      const paramsForKey = params.getAll(key);\n      state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || \"\";\n      unusedKeys.delete(key);\n    }\n    Array.from(unusedKeys).forEach((key) => delete state[key]);\n  }\n  const { pause, resume } = pausableWatch(\n    state,\n    () => {\n      const params = new URLSearchParams(\"\");\n      Object.keys(state).forEach((key) => {\n        const mapEntry = state[key];\n        if (Array.isArray(mapEntry))\n          mapEntry.forEach((value) => params.append(key, value));\n        else if (removeNullishValues && mapEntry == null)\n          params.delete(key);\n        else if (removeFalsyValues && !mapEntry)\n          params.delete(key);\n        else\n          params.set(key, mapEntry);\n      });\n      write(params);\n    },\n    { deep: true }\n  );\n  function write(params, shouldUpdate) {\n    pause();\n    if (shouldUpdate)\n      updateState(params);\n    window.history.replaceState(\n      window.history.state,\n      window.document.title,\n      window.location.pathname + constructQuery(params)\n    );\n    resume();\n  }\n  function onChanged() {\n    if (!enableWrite)\n      return;\n    write(read(), true);\n  }\n  useEventListener(window, \"popstate\", onChanged, false);\n  if (mode !== \"history\")\n    useEventListener(window, \"hashchange\", onChanged, false);\n  const initial = read();\n  if (initial.keys().next().value)\n    updateState(initial);\n  else\n    Object.assign(state, initialValue);\n  return state;\n}\n\nfunction useUserMedia(options = {}) {\n  var _a, _b;\n  const enabled = ref((_a = options.enabled) != null ? _a : false);\n  const autoSwitch = ref((_b = options.autoSwitch) != null ? _b : true);\n  const constraints = ref(options.constraints);\n  const { navigator = defaultNavigator } = options;\n  const isSupported = useSupported(() => {\n    var _a2;\n    return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia;\n  });\n  const stream = shallowRef();\n  function getDeviceOptions(type) {\n    switch (type) {\n      case \"video\": {\n        if (constraints.value)\n          return constraints.value.video || false;\n        break;\n      }\n      case \"audio\": {\n        if (constraints.value)\n          return constraints.value.audio || false;\n        break;\n      }\n    }\n  }\n  async function _start() {\n    if (!isSupported.value || stream.value)\n      return;\n    stream.value = await navigator.mediaDevices.getUserMedia({\n      video: getDeviceOptions(\"video\"),\n      audio: getDeviceOptions(\"audio\")\n    });\n    return stream.value;\n  }\n  function _stop() {\n    var _a2;\n    (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n    stream.value = void 0;\n  }\n  function stop() {\n    _stop();\n    enabled.value = false;\n  }\n  async function start() {\n    await _start();\n    if (stream.value)\n      enabled.value = true;\n    return stream.value;\n  }\n  async function restart() {\n    _stop();\n    return await start();\n  }\n  watch(\n    enabled,\n    (v) => {\n      if (v)\n        _start();\n      else\n        _stop();\n    },\n    { immediate: true }\n  );\n  watch(\n    constraints,\n    () => {\n      if (autoSwitch.value && stream.value)\n        restart();\n    },\n    { immediate: true }\n  );\n  tryOnScopeDispose(() => {\n    stop();\n  });\n  return {\n    isSupported,\n    stream,\n    start,\n    stop,\n    restart,\n    constraints,\n    enabled,\n    autoSwitch\n  };\n}\n\nfunction useVModel(props, key, emit, options = {}) {\n  var _a, _b, _c, _d, _e;\n  const {\n    clone = false,\n    passive = false,\n    eventName,\n    deep = false,\n    defaultValue,\n    shouldEmit\n  } = options;\n  const vm = getCurrentInstance();\n  const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm)) || ((_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$emit) == null ? void 0 : _c.bind(vm == null ? void 0 : vm.proxy));\n  let event = eventName;\n  if (!key) {\n    if (isVue2) {\n      const modelOptions = (_e = (_d = vm == null ? void 0 : vm.proxy) == null ? void 0 : _d.$options) == null ? void 0 : _e.model;\n      key = (modelOptions == null ? void 0 : modelOptions.value) || \"value\";\n      if (!eventName)\n        event = (modelOptions == null ? void 0 : modelOptions.event) || \"input\";\n    } else {\n      key = \"modelValue\";\n    }\n  }\n  event = event || `update:${key.toString()}`;\n  const cloneFn = (val) => !clone ? val : typeof clone === \"function\" ? clone(val) : cloneFnJSON(val);\n  const getValue = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue;\n  const triggerEmit = (value) => {\n    if (shouldEmit) {\n      if (shouldEmit(value))\n        _emit(event, value);\n    } else {\n      _emit(event, value);\n    }\n  };\n  if (passive) {\n    const initialValue = getValue();\n    const proxy = ref(initialValue);\n    let isUpdating = false;\n    watch(\n      () => props[key],\n      (v) => {\n        if (!isUpdating) {\n          isUpdating = true;\n          proxy.value = cloneFn(v);\n          nextTick(() => isUpdating = false);\n        }\n      }\n    );\n    watch(\n      proxy,\n      (v) => {\n        if (!isUpdating && (v !== props[key] || deep))\n          triggerEmit(v);\n      },\n      { deep }\n    );\n    return proxy;\n  } else {\n    return computed({\n      get() {\n        return getValue();\n      },\n      set(value) {\n        triggerEmit(value);\n      }\n    });\n  }\n}\n\nfunction useVModels(props, emit, options = {}) {\n  const ret = {};\n  for (const key in props) {\n    ret[key] = useVModel(\n      props,\n      key,\n      emit,\n      options\n    );\n  }\n  return ret;\n}\n\nfunction useVibrate(options) {\n  const {\n    pattern = [],\n    interval = 0,\n    navigator = defaultNavigator\n  } = options || {};\n  const isSupported = useSupported(() => typeof navigator !== \"undefined\" && \"vibrate\" in navigator);\n  const patternRef = toRef(pattern);\n  let intervalControls;\n  const vibrate = (pattern2 = patternRef.value) => {\n    if (isSupported.value)\n      navigator.vibrate(pattern2);\n  };\n  const stop = () => {\n    if (isSupported.value)\n      navigator.vibrate(0);\n    intervalControls == null ? void 0 : intervalControls.pause();\n  };\n  if (interval > 0) {\n    intervalControls = useIntervalFn(\n      vibrate,\n      interval,\n      {\n        immediate: false,\n        immediateCallback: false\n      }\n    );\n  }\n  return {\n    isSupported,\n    pattern,\n    intervalControls,\n    vibrate,\n    stop\n  };\n}\n\nfunction useVirtualList(list, options) {\n  const { containerStyle, wrapperProps, scrollTo, calculateRange, currentList, containerRef } = \"itemHeight\" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list);\n  return {\n    list: currentList,\n    scrollTo,\n    containerProps: {\n      ref: containerRef,\n      onScroll: () => {\n        calculateRange();\n      },\n      style: containerStyle\n    },\n    wrapperProps\n  };\n}\nfunction useVirtualListResources(list) {\n  const containerRef = ref(null);\n  const size = useElementSize(containerRef);\n  const currentList = ref([]);\n  const source = shallowRef(list);\n  const state = ref({ start: 0, end: 10 });\n  return { state, source, currentList, size, containerRef };\n}\nfunction createGetViewCapacity(state, source, itemSize) {\n  return (containerSize) => {\n    if (typeof itemSize === \"number\")\n      return Math.ceil(containerSize / itemSize);\n    const { start = 0 } = state.value;\n    let sum = 0;\n    let capacity = 0;\n    for (let i = start; i < source.value.length; i++) {\n      const size = itemSize(i);\n      sum += size;\n      capacity = i;\n      if (sum > containerSize)\n        break;\n    }\n    return capacity - start;\n  };\n}\nfunction createGetOffset(source, itemSize) {\n  return (scrollDirection) => {\n    if (typeof itemSize === \"number\")\n      return Math.floor(scrollDirection / itemSize) + 1;\n    let sum = 0;\n    let offset = 0;\n    for (let i = 0; i < source.value.length; i++) {\n      const size = itemSize(i);\n      sum += size;\n      if (sum >= scrollDirection) {\n        offset = i;\n        break;\n      }\n    }\n    return offset + 1;\n  };\n}\nfunction createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) {\n  return () => {\n    const element = containerRef.value;\n    if (element) {\n      const offset = getOffset(type === \"vertical\" ? element.scrollTop : element.scrollLeft);\n      const viewCapacity = getViewCapacity(type === \"vertical\" ? element.clientHeight : element.clientWidth);\n      const from = offset - overscan;\n      const to = offset + viewCapacity + overscan;\n      state.value = {\n        start: from < 0 ? 0 : from,\n        end: to > source.value.length ? source.value.length : to\n      };\n      currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({\n        data: ele,\n        index: index + state.value.start\n      }));\n    }\n  };\n}\nfunction createGetDistance(itemSize, source) {\n  return (index) => {\n    if (typeof itemSize === \"number\") {\n      const size2 = index * itemSize;\n      return size2;\n    }\n    const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0);\n    return size;\n  };\n}\nfunction useWatchForSizes(size, list, calculateRange) {\n  watch([size.width, size.height, list], () => {\n    calculateRange();\n  });\n}\nfunction createComputedTotalSize(itemSize, source) {\n  return computed(() => {\n    if (typeof itemSize === \"number\")\n      return source.value.length * itemSize;\n    return source.value.reduce((sum, _, index) => sum + itemSize(index), 0);\n  });\n}\nconst scrollToDictionaryForElementScrollKey = {\n  horizontal: \"scrollLeft\",\n  vertical: \"scrollTop\"\n};\nfunction createScrollTo(type, calculateRange, getDistance, containerRef) {\n  return (index) => {\n    if (containerRef.value) {\n      containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index);\n      calculateRange();\n    }\n  };\n}\nfunction useHorizontalVirtualList(options, list) {\n  const resources = useVirtualListResources(list);\n  const { state, source, currentList, size, containerRef } = resources;\n  const containerStyle = { overflowX: \"auto\" };\n  const { itemWidth, overscan = 5 } = options;\n  const getViewCapacity = createGetViewCapacity(state, source, itemWidth);\n  const getOffset = createGetOffset(source, itemWidth);\n  const calculateRange = createCalculateRange(\"horizontal\", overscan, getOffset, getViewCapacity, resources);\n  const getDistanceLeft = createGetDistance(itemWidth, source);\n  const offsetLeft = computed(() => getDistanceLeft(state.value.start));\n  const totalWidth = createComputedTotalSize(itemWidth, source);\n  useWatchForSizes(size, list, calculateRange);\n  const scrollTo = createScrollTo(\"horizontal\", calculateRange, getDistanceLeft, containerRef);\n  const wrapperProps = computed(() => {\n    return {\n      style: {\n        height: \"100%\",\n        width: `${totalWidth.value - offsetLeft.value}px`,\n        marginLeft: `${offsetLeft.value}px`,\n        display: \"flex\"\n      }\n    };\n  });\n  return {\n    scrollTo,\n    calculateRange,\n    wrapperProps,\n    containerStyle,\n    currentList,\n    containerRef\n  };\n}\nfunction useVerticalVirtualList(options, list) {\n  const resources = useVirtualListResources(list);\n  const { state, source, currentList, size, containerRef } = resources;\n  const containerStyle = { overflowY: \"auto\" };\n  const { itemHeight, overscan = 5 } = options;\n  const getViewCapacity = createGetViewCapacity(state, source, itemHeight);\n  const getOffset = createGetOffset(source, itemHeight);\n  const calculateRange = createCalculateRange(\"vertical\", overscan, getOffset, getViewCapacity, resources);\n  const getDistanceTop = createGetDistance(itemHeight, source);\n  const offsetTop = computed(() => getDistanceTop(state.value.start));\n  const totalHeight = createComputedTotalSize(itemHeight, source);\n  useWatchForSizes(size, list, calculateRange);\n  const scrollTo = createScrollTo(\"vertical\", calculateRange, getDistanceTop, containerRef);\n  const wrapperProps = computed(() => {\n    return {\n      style: {\n        width: \"100%\",\n        height: `${totalHeight.value - offsetTop.value}px`,\n        marginTop: `${offsetTop.value}px`\n      }\n    };\n  });\n  return {\n    calculateRange,\n    scrollTo,\n    containerStyle,\n    wrapperProps,\n    currentList,\n    containerRef\n  };\n}\n\nfunction useWakeLock(options = {}) {\n  const {\n    navigator = defaultNavigator,\n    document = defaultDocument\n  } = options;\n  let wakeLock;\n  const isSupported = useSupported(() => navigator && \"wakeLock\" in navigator);\n  const isActive = ref(false);\n  async function onVisibilityChange() {\n    if (!isSupported.value || !wakeLock)\n      return;\n    if (document && document.visibilityState === \"visible\")\n      wakeLock = await navigator.wakeLock.request(\"screen\");\n    isActive.value = !wakeLock.released;\n  }\n  if (document)\n    useEventListener(document, \"visibilitychange\", onVisibilityChange, { passive: true });\n  async function request(type) {\n    if (!isSupported.value)\n      return;\n    wakeLock = await navigator.wakeLock.request(type);\n    isActive.value = !wakeLock.released;\n  }\n  async function release() {\n    if (!isSupported.value || !wakeLock)\n      return;\n    await wakeLock.release();\n    isActive.value = !wakeLock.released;\n    wakeLock = null;\n  }\n  return {\n    isSupported,\n    isActive,\n    request,\n    release\n  };\n}\n\nfunction useWebNotification(options = {}) {\n  const {\n    window = defaultWindow,\n    requestPermissions: _requestForPermissions = true\n  } = options;\n  const defaultWebNotificationOptions = options;\n  const isSupported = useSupported(() => !!window && \"Notification\" in window);\n  const permissionGranted = ref(isSupported.value && \"permission\" in Notification && Notification.permission === \"granted\");\n  const notification = ref(null);\n  const ensurePermissions = async () => {\n    if (!isSupported.value)\n      return;\n    if (!permissionGranted.value && Notification.permission !== \"denied\") {\n      const result = await Notification.requestPermission();\n      if (result === \"granted\")\n        permissionGranted.value = true;\n    }\n    return permissionGranted.value;\n  };\n  const { on: onClick, trigger: clickTrigger } = createEventHook();\n  const { on: onShow, trigger: showTrigger } = createEventHook();\n  const { on: onError, trigger: errorTrigger } = createEventHook();\n  const { on: onClose, trigger: closeTrigger } = createEventHook();\n  const show = async (overrides) => {\n    if (!isSupported.value || !permissionGranted.value)\n      return;\n    const options2 = Object.assign({}, defaultWebNotificationOptions, overrides);\n    notification.value = new Notification(options2.title || \"\", options2);\n    notification.value.onclick = clickTrigger;\n    notification.value.onshow = showTrigger;\n    notification.value.onerror = errorTrigger;\n    notification.value.onclose = closeTrigger;\n    return notification.value;\n  };\n  const close = () => {\n    if (notification.value)\n      notification.value.close();\n    notification.value = null;\n  };\n  if (_requestForPermissions)\n    tryOnMounted(ensurePermissions);\n  tryOnScopeDispose(close);\n  if (isSupported.value && window) {\n    const document = window.document;\n    useEventListener(document, \"visibilitychange\", (e) => {\n      e.preventDefault();\n      if (document.visibilityState === \"visible\") {\n        close();\n      }\n    });\n  }\n  return {\n    isSupported,\n    notification,\n    ensurePermissions,\n    permissionGranted,\n    show,\n    close,\n    onClick,\n    onShow,\n    onError,\n    onClose\n  };\n}\n\nconst DEFAULT_PING_MESSAGE = \"ping\";\nfunction resolveNestedOptions(options) {\n  if (options === true)\n    return {};\n  return options;\n}\nfunction useWebSocket(url, options = {}) {\n  const {\n    onConnected,\n    onDisconnected,\n    onError,\n    onMessage,\n    immediate = true,\n    autoClose = true,\n    protocols = []\n  } = options;\n  const data = ref(null);\n  const status = ref(\"CLOSED\");\n  const wsRef = ref();\n  const urlRef = toRef(url);\n  let heartbeatPause;\n  let heartbeatResume;\n  let explicitlyClosed = false;\n  let retried = 0;\n  let bufferedData = [];\n  let pongTimeoutWait;\n  const _sendBuffer = () => {\n    if (bufferedData.length && wsRef.value && status.value === \"OPEN\") {\n      for (const buffer of bufferedData)\n        wsRef.value.send(buffer);\n      bufferedData = [];\n    }\n  };\n  const resetHeartbeat = () => {\n    clearTimeout(pongTimeoutWait);\n    pongTimeoutWait = void 0;\n  };\n  const close = (code = 1e3, reason) => {\n    if (!isClient || !wsRef.value)\n      return;\n    explicitlyClosed = true;\n    resetHeartbeat();\n    heartbeatPause == null ? void 0 : heartbeatPause();\n    wsRef.value.close(code, reason);\n    wsRef.value = void 0;\n  };\n  const send = (data2, useBuffer = true) => {\n    if (!wsRef.value || status.value !== \"OPEN\") {\n      if (useBuffer)\n        bufferedData.push(data2);\n      return false;\n    }\n    _sendBuffer();\n    wsRef.value.send(data2);\n    return true;\n  };\n  const _init = () => {\n    if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n      return;\n    const ws = new WebSocket(urlRef.value, protocols);\n    wsRef.value = ws;\n    status.value = \"CONNECTING\";\n    ws.onopen = () => {\n      status.value = \"OPEN\";\n      onConnected == null ? void 0 : onConnected(ws);\n      heartbeatResume == null ? void 0 : heartbeatResume();\n      _sendBuffer();\n    };\n    ws.onclose = (ev) => {\n      status.value = \"CLOSED\";\n      onDisconnected == null ? void 0 : onDisconnected(ws, ev);\n      if (!explicitlyClosed && options.autoReconnect) {\n        const {\n          retries = -1,\n          delay = 1e3,\n          onFailed\n        } = resolveNestedOptions(options.autoReconnect);\n        retried += 1;\n        if (typeof retries === \"number\" && (retries < 0 || retried < retries))\n          setTimeout(_init, delay);\n        else if (typeof retries === \"function\" && retries())\n          setTimeout(_init, delay);\n        else\n          onFailed == null ? void 0 : onFailed();\n      }\n    };\n    ws.onerror = (e) => {\n      onError == null ? void 0 : onError(ws, e);\n    };\n    ws.onmessage = (e) => {\n      if (options.heartbeat) {\n        resetHeartbeat();\n        const {\n          message = DEFAULT_PING_MESSAGE\n        } = resolveNestedOptions(options.heartbeat);\n        if (e.data === message)\n          return;\n      }\n      data.value = e.data;\n      onMessage == null ? void 0 : onMessage(ws, e);\n    };\n  };\n  if (options.heartbeat) {\n    const {\n      message = DEFAULT_PING_MESSAGE,\n      interval = 1e3,\n      pongTimeout = 1e3\n    } = resolveNestedOptions(options.heartbeat);\n    const { pause, resume } = useIntervalFn(\n      () => {\n        send(message, false);\n        if (pongTimeoutWait != null)\n          return;\n        pongTimeoutWait = setTimeout(() => {\n          close();\n          explicitlyClosed = false;\n        }, pongTimeout);\n      },\n      interval,\n      { immediate: false }\n    );\n    heartbeatPause = pause;\n    heartbeatResume = resume;\n  }\n  if (autoClose) {\n    if (isClient)\n      useEventListener(\"beforeunload\", () => close());\n    tryOnScopeDispose(close);\n  }\n  const open = () => {\n    if (!isClient && !isWorker)\n      return;\n    close();\n    explicitlyClosed = false;\n    retried = 0;\n    _init();\n  };\n  if (immediate)\n    open();\n  return {\n    data,\n    status,\n    close,\n    send,\n    open,\n    ws: wsRef\n  };\n}\n\nfunction useWebWorker(arg0, workerOptions, options) {\n  const {\n    window = defaultWindow\n  } = options != null ? options : {};\n  const data = ref(null);\n  const worker = shallowRef();\n  const post = (...args) => {\n    if (!worker.value)\n      return;\n    worker.value.postMessage(...args);\n  };\n  const terminate = function terminate2() {\n    if (!worker.value)\n      return;\n    worker.value.terminate();\n  };\n  if (window) {\n    if (typeof arg0 === \"string\")\n      worker.value = new Worker(arg0, workerOptions);\n    else if (typeof arg0 === \"function\")\n      worker.value = arg0();\n    else\n      worker.value = arg0;\n    worker.value.onmessage = (e) => {\n      data.value = e.data;\n    };\n    tryOnScopeDispose(() => {\n      if (worker.value)\n        worker.value.terminate();\n    });\n  }\n  return {\n    data,\n    post,\n    terminate,\n    worker\n  };\n}\n\nfunction jobRunner(userFunc) {\n  return (e) => {\n    const userFuncArgs = e.data[0];\n    return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {\n      postMessage([\"SUCCESS\", result]);\n    }).catch((error) => {\n      postMessage([\"ERROR\", error]);\n    });\n  };\n}\n\nfunction depsParser(deps) {\n  if (deps.length === 0)\n    return \"\";\n  const depsString = deps.map((dep) => `'${dep}'`).toString();\n  return `importScripts(${depsString})`;\n}\n\nfunction createWorkerBlobUrl(fn, deps) {\n  const blobCode = `${depsParser(deps)}; onmessage=(${jobRunner})(${fn})`;\n  const blob = new Blob([blobCode], { type: \"text/javascript\" });\n  const url = URL.createObjectURL(blob);\n  return url;\n}\n\nfunction useWebWorkerFn(fn, options = {}) {\n  const {\n    dependencies = [],\n    timeout,\n    window = defaultWindow\n  } = options;\n  const worker = ref();\n  const workerStatus = ref(\"PENDING\");\n  const promise = ref({});\n  const timeoutId = ref();\n  const workerTerminate = (status = \"PENDING\") => {\n    if (worker.value && worker.value._url && window) {\n      worker.value.terminate();\n      URL.revokeObjectURL(worker.value._url);\n      promise.value = {};\n      worker.value = void 0;\n      window.clearTimeout(timeoutId.value);\n      workerStatus.value = status;\n    }\n  };\n  workerTerminate();\n  tryOnScopeDispose(workerTerminate);\n  const generateWorker = () => {\n    const blobUrl = createWorkerBlobUrl(fn, dependencies);\n    const newWorker = new Worker(blobUrl);\n    newWorker._url = blobUrl;\n    newWorker.onmessage = (e) => {\n      const { resolve = () => {\n      }, reject = () => {\n      } } = promise.value;\n      const [status, result] = e.data;\n      switch (status) {\n        case \"SUCCESS\":\n          resolve(result);\n          workerTerminate(status);\n          break;\n        default:\n          reject(result);\n          workerTerminate(\"ERROR\");\n          break;\n      }\n    };\n    newWorker.onerror = (e) => {\n      const { reject = () => {\n      } } = promise.value;\n      e.preventDefault();\n      reject(e);\n      workerTerminate(\"ERROR\");\n    };\n    if (timeout) {\n      timeoutId.value = setTimeout(\n        () => workerTerminate(\"TIMEOUT_EXPIRED\"),\n        timeout\n      );\n    }\n    return newWorker;\n  };\n  const callWorker = (...fnArgs) => new Promise((resolve, reject) => {\n    promise.value = {\n      resolve,\n      reject\n    };\n    worker.value && worker.value.postMessage([[...fnArgs]]);\n    workerStatus.value = \"RUNNING\";\n  });\n  const workerFn = (...fnArgs) => {\n    if (workerStatus.value === \"RUNNING\") {\n      console.error(\n        \"[useWebWorkerFn] You can only run one instance of the worker at a time.\"\n      );\n      return Promise.reject();\n    }\n    worker.value = generateWorker();\n    return callWorker(...fnArgs);\n  };\n  return {\n    workerFn,\n    workerStatus,\n    workerTerminate\n  };\n}\n\nfunction useWindowFocus(options = {}) {\n  const { window = defaultWindow } = options;\n  if (!window)\n    return ref(false);\n  const focused = ref(window.document.hasFocus());\n  useEventListener(window, \"blur\", () => {\n    focused.value = false;\n  });\n  useEventListener(window, \"focus\", () => {\n    focused.value = true;\n  });\n  return focused;\n}\n\nfunction useWindowScroll(options = {}) {\n  const { window = defaultWindow, behavior = \"auto\" } = options;\n  if (!window) {\n    return {\n      x: ref(0),\n      y: ref(0)\n    };\n  }\n  const internalX = ref(window.scrollX);\n  const internalY = ref(window.scrollY);\n  const x = computed({\n    get() {\n      return internalX.value;\n    },\n    set(x2) {\n      scrollTo({ left: x2, behavior });\n    }\n  });\n  const y = computed({\n    get() {\n      return internalY.value;\n    },\n    set(y2) {\n      scrollTo({ top: y2, behavior });\n    }\n  });\n  useEventListener(\n    window,\n    \"scroll\",\n    () => {\n      internalX.value = window.scrollX;\n      internalY.value = window.scrollY;\n    },\n    {\n      capture: false,\n      passive: true\n    }\n  );\n  return { x, y };\n}\n\nfunction useWindowSize(options = {}) {\n  const {\n    window = defaultWindow,\n    initialWidth = Number.POSITIVE_INFINITY,\n    initialHeight = Number.POSITIVE_INFINITY,\n    listenOrientation = true,\n    includeScrollbar = true\n  } = options;\n  const width = ref(initialWidth);\n  const height = ref(initialHeight);\n  const update = () => {\n    if (window) {\n      if (includeScrollbar) {\n        width.value = window.innerWidth;\n        height.value = window.innerHeight;\n      } else {\n        width.value = window.document.documentElement.clientWidth;\n        height.value = window.document.documentElement.clientHeight;\n      }\n    }\n  };\n  update();\n  tryOnMounted(update);\n  useEventListener(\"resize\", update, { passive: true });\n  if (listenOrientation) {\n    const matches = useMediaQuery(\"(orientation: portrait)\");\n    watch(matches, () => update());\n  }\n  return { width, height };\n}\n\nexport { DefaultMagicKeysAliasMap, StorageSerializers, TransitionPresets, computedAsync as asyncComputed, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsMasterCss, breakpointsPrimeFlex, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, breakpointsVuetifyV2, breakpointsVuetifyV3, cloneFnJSON, computedAsync, computedInject, createFetch, createReusableTemplate, createTemplatePromise, createUnrefFn, customStorageEventName, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, executeTransition, formatTimeAgo, getSSRHandler, mapGamepadToXbox360Controller, onClickOutside, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, setSSRHandler, templateRef, unrefElement, useActiveElement, useAnimate, useAsyncQueue, useAsyncState, useBase64, useBattery, useBluetooth, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClipboard, useClipboardItems, useCloned, useColorMode, useConfirmDialog, useCssVar, useCurrentElement, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFileDialog, useFileSystemAccess, useFocus, useFocusWithin, useFps, useFullscreen, useGamepad, useGeolocation, useIdle, useImage, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, useParallax, useParentElement, usePerformanceObserver, usePermission, usePointer, usePointerLock, usePointerSwipe, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePreferredLanguages, usePreferredReducedMotion, usePrevious, useRafFn, useRefHistory, useResizeObserver, useScreenOrientation, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSorted, useSpeechRecognition, useSpeechSynthesis, useStepper, useStorage, useStorageAsync, useStyleTag, useSupported, useSwipe, useTemplateRefsList, useTextDirection, useTextSelection, useTextareaAutosize, useThrottledRefHistory, useTimeAgo, useTimeoutPoll, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };\n","export const CART = \"/cart\";\r\nexport const CHECKOUT = \"/checkout\";\r\nexport const TRADEPROGRAM = \"/to-the-trade\";\r\nexport const HOWTOBUY = \"/how-to-buy\";\r\nexport const LOGIN = \"/login\";\r\nexport const CONTACT_US = \"/contact-us\";\r\nexport const ACCOUNT = \"/account\";\r\n","import { ref, computed, watch, unref } from \"vue\";\r\n\r\n/**\r\n * Reactive paginated list of items (for client-side pagination).\r\n * @param {Array} list The full list of items to be paginated. Can be an Array or Vue ref to an Array.\r\n * @param {Number} perPage The number of items to show per page.\r\n * @returns An object with the following reactive properties:\r\n    page: The current page number. This is a ref that can be assigned for changing the current page and can be bound to the v-model:page of the FhPaginationNav component.\r\n    totalPages: The total number of pages.\r\n    perPage: \r\n    sublist: The current page of items.\r\n */\r\nexport default function (list, perPage) {\r\n  if (!Array.isArray(unref(list))) {\r\n    throw new Error(\"list param expected to be an Array\");\r\n  }\r\n\r\n  const page = ref(1);\r\n\r\n  const totalPages = computed(() => Math.ceil(unref(list).length / perPage));\r\n\r\n  // Ensures page ref is not left with an invalid value if the total number of pages changes (e.g., if the last item on the last page is removed)\r\n  watch(totalPages, (val) => (page.value = Math.min(page.value, val)));\r\n\r\n  const sublist = computed(() => {\r\n    const start = (page.value - 1) * perPage;\r\n    const end = start + perPage;\r\n    return unref(list).slice(start, end);\r\n  });\r\n\r\n  return {\r\n    page,\r\n    totalPages,\r\n    sublist\r\n  };\r\n}\r\n","import { useBreakpoints } from \"@vueuse/core\";\r\n\r\n// Note: Breakpoints config is duplicated from tailwind.config.js (theme.screens).\r\n//\r\n// Importing the config here was problematic because Tailwind config is CommonJS and\r\n// Vite is ESM and they don't play together nicely without extraneous configuration.\r\n//\r\n// ** Update in both places if these need to change! **\r\nconst screens = {\r\n  md: \"768px\",\r\n  lg: \"1200px\",\r\n  xl: \"1920px\",\r\n  \"2xl\": \"2540px\"\r\n};\r\n\r\nexport default function () {\r\n  const breakpoints = useBreakpoints(screens);\r\n  return {\r\n    isSm: breakpoints.smaller(\"md\"),\r\n    isMd: breakpoints.between(\"md\", \"lg\"),\r\n    isLg: breakpoints.greaterOrEqual(\"lg\")\r\n  };\r\n}\r\n","<script setup>\r\nimport { useViewportSizes } from \"@/composables\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * Controls whether or not the summary slot is sticky to the bottom of the screen on mobile.\r\n   */\r\n  showInlineSummaryOnMobile: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst { isLg } = useViewportSizes();\r\n</script>\r\n\r\n<template>\r\n  <div class=\"relative my-f15 lg:grid lg:grid-cols-[3fr_1fr] lg:items-start lg:gap-f15\">\r\n    <div>\r\n      <slot></slot>\r\n    </div>\r\n    <div :class=\"{ 'sticky bottom-0 z-10 -mb-f3': !isLg && !props.showInlineSummaryOnMobile, 'sticky top-f4': isLg }\">\r\n      <div :class=\"{ 'relative left-1/2 w-screen -translate-x-1/2 border-t border-neutral-30 bg-white p-f3': !isLg && !props.showInlineSummaryOnMobile }\">\r\n        <slot name=\"summary\"></slot>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n","/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.21';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            }\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n","/**\r\n * Formats a numeric value as a USD price string. Drops the .00 on the end for whole dollar amounts.\r\n * @param {Number} val\r\n */\r\nexport default function (val) {\r\n  let formattedPrice = val.toLocaleString(\"en-US\", { style: \"currency\", currency: \"USD\" });\r\n  return formattedPrice.endsWith(\".00\") ? formattedPrice.slice(0, -3) : formattedPrice;\r\n}\r\n","<script setup>\r\nconst props = defineProps({\r\n  src: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  alt: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  /**\r\n   * Forces the image into a square (1:1) aspect ratio, cropping if necessary (by default; use `contain` to change the behavior)\r\n   */\r\n  square: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * If `square` is `true`, the default behavior is to crop non-square images. Setting this prop to `true` will preserve the image aspect ratio instead.\r\n   */\r\n  contain: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * Adds a border to the image\r\n   */\r\n  border: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <img\r\n    :src=\"src\"\r\n    :alt=\"alt\"\r\n    :class=\"{\r\n      'aspect-square': props.square,\r\n      'object-cover': props.square && !props.contain,\r\n      'object-contain': props.square && props.contain,\r\n      'border border-solid border-neutral-30 bg-neutral-10': props.border\r\n    }\"\r\n    loading=\"lazy\"\r\n    class=\"block w-full\"\r\n  />\r\n</template>\r\n","<script setup>\r\nimport { ref, computed, watch, nextTick } from \"vue\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * Model of the component; Either use this property (along with a listener for 'update:model-value' event) OR use v-model directive\r\n   */\r\n  modelValue: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  disabled: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst MIN = 1;\r\nconst MAX = 999;\r\n\r\nconst input = ref(null);\r\nconst value = ref(props.modelValue);\r\n\r\nfunction tryUpdateValue(incomingValue) {\r\n  let oldValue = value.value;\r\n  let n = parseInt(incomingValue);\r\n  if (incomingValue === \"\" || (/^\\d+$/.test(incomingValue) && n >= MIN && n <= MAX)) {\r\n    value.value = n;\r\n  } else {\r\n    nextTick(() => {\r\n      input.value.value = isNaN(oldValue) ? \"\" : oldValue;\r\n    });\r\n  }\r\n}\r\n\r\nwatch(\r\n  () => props.modelValue,\r\n  (value) => {\r\n    tryUpdateValue(value);\r\n  }\r\n);\r\n\r\nfunction handleInput(event) {\r\n  tryUpdateValue(event.target.value);\r\n}\r\n\r\nfunction handleBlur() {\r\n  if (isNaN(value.value)) {\r\n    value.value = MIN;\r\n  }\r\n  emit(\"blur\");\r\n}\r\n\r\nconst isDecreasable = computed(() => !props.disabled && !isNaN(value.value) && value.value > MIN);\r\nconst isIncreasable = computed(() => !props.disabled && !isNaN(value.value) && value.value < MAX);\r\n\r\nfunction decrement() {\r\n  if (isDecreasable.value) {\r\n    value.value = value.value - 1;\r\n    emit(\"step\", value.value);\r\n  }\r\n}\r\n\r\nfunction increment() {\r\n  if (isIncreasable.value) {\r\n    value.value = value.value + 1;\r\n    emit(\"step\", value.value);\r\n  }\r\n}\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"blur\", \"step\"]);\r\nwatch(value, (value) => emit(\"update:modelValue\", value));\r\n</script>\r\n\r\n<template>\r\n  <label class=\"relative flex w-32\">\r\n    <input\r\n      ref=\"input\"\r\n      :value=\"isNaN(value) ? '' : value\"\r\n      inputmode=\"numeric\"\r\n      pattern=\"[0-9]*\"\r\n      :min=\"MIN\"\r\n      :max=\"MAX\"\r\n      :disabled=\"props.disabled\"\r\n      aria-label=\"Quantity\"\r\n      class=\"text-body-lg w-full border border-neutral-30 bg-white py-3.5 text-center focus:border-neutral-70 focus:outline-none disabled:border-neutral-30 disabled:bg-neutral-20 disabled:text-neutral-50\"\r\n      @focus=\"input.select()\"\r\n      @input=\"handleInput\"\r\n      @blur=\"handleBlur\"\r\n      @keydown.up.prevent=\"increment\"\r\n      @keydown.down.prevent=\"decrement\"\r\n      @keyup.enter.prevent=\"input.blur()\"\r\n    />\r\n    <button class=\"spin-button left-f0.5\" aria-hidden=\"true\" tabindex=\"-1\" title=\"Decrement\" :disabled=\"!isDecreasable\" @click=\"decrement\">\r\n      <FhIcon name=\"MinusSign\" class=\"text-body-xl\" />\r\n    </button>\r\n    <button class=\"spin-button right-f0.5\" aria-hidden=\"true\" tabindex=\"-1\" title=\"Increment\" :disabled=\"!isIncreasable\" @click=\"increment\">\r\n      <FhIcon name=\"PlusSign\" class=\"text-body-xl\" />\r\n    </button>\r\n  </label>\r\n</template>\r\n\r\n<style scoped>\r\n.spin-button {\r\n  @apply absolute h-full w-11 text-center;\r\n\r\n  &:disabled {\r\n    @apply text-neutral-40;\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { debounce } from \"lodash\";\r\nimport formatPrice from \"../util/formatPrice.js\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhImage from \"./FhImage.vue\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\nimport FhQuantityInput from \"./FhQuantityInput.vue\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * Puts the cart item in a view-only state where quantity cannot be edited and the actions aren't available.\r\n   */\r\n  viewOnly: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  quantity: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  unitPrice: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  isDiscounted: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  originalUnitPrice: {\r\n    type: Number,\r\n    default: 0\r\n  },\r\n  totalPrice: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  sku: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isSaveForLater: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:quantity\", \"delete\", \"movetocart\", \"saveforlater\"]);\r\n\r\nconst _quantity = computed({\r\n  get: () => props.quantity,\r\n  set: debounce((val) => {\r\n    if (val && val !== props.quantity) {\r\n      emit(\"update:quantity\", val);\r\n    }\r\n  }, 500)\r\n});\r\n\r\nconst isUnavailable = computed(() => props.sku.isAvailable === false);\r\n</script>\r\n\r\n<template>\r\n  <div\r\n    class=\"relative border-solid border-neutral-30 py-5 md:py-8\"\r\n    :class=\"{\r\n      'bg-neutral-10 before:absolute before:top-0 before:left-1/2 before:-z-10 before:h-full before:w-[calc(100%+40px)] before:-translate-x-1/2 before:bg-neutral-10':\r\n        isUnavailable,\r\n      'border-y': !props.isSaveForLater\r\n    }\"\r\n  >\r\n    <div class=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between md:gap-f5\">\r\n      <div class=\"flex gap-3 md:min-w-0 md:gap-f5\">\r\n        <a :href=\"props.sku.url\" class=\"block w-32 flex-none md:w-f25\">\r\n          <FhImage :src=\"props.sku.thumbUrl\" :alt=\"props.sku.productName\" square :border=\"true\" />\r\n        </a>\r\n        <div class=\"flex min-w-0 flex-col gap-1\" :class=\"{ 'text-neutral-50': isUnavailable, 'md:mt-f3': !props.isSaveForLater }\">\r\n          <a :href=\"props.sku.url\" class=\"whitespace-pre-line text-f-base-2xl md:mb-f0.5 md:whitespace-normal\">{{ props.sku.productName }}</a>\r\n          <div class=\"flex gap-f1.5 text-f-xs-base\">\r\n            <span :class=\"{ 'text-brand-red': props.isDiscounted }\">{{ formatPrice(props.unitPrice) }}</span>\r\n            <span v-if=\"props.originalUnitPrice\" class=\"line-through\">{{ formatPrice(props.originalUnitPrice) }}</span>\r\n          </div>\r\n          <div class=\"truncate text-f-xs-base text-neutral-50 mdmax:flex mdmax:flex-wrap mdmax:gap-1 mdmax:flex-col\">\r\n            <span v-if=\"props.sku.skuName\" class=\"mdmax:whitespace-pre-line\"\r\n              >{{ props.sku.skuName }}\r\n              <div class=\"inline mdmax:hidden\">&nbsp;&bull;&nbsp;</div></span\r\n            >\r\n            <span>{{ props.sku.skuNumber }}</span>\r\n          </div>\r\n          <div v-if=\"props.sku.inStock && !isUnavailable\" class=\"text-f-xs-base\">In Stock <FhIcon name=\"LightningBolt\" class=\"relative -top-px\" /></div>\r\n          <div v-if=\"isUnavailable\" class=\"mt-f0.5 font-bold\"><FhIcon name=\"AlertCircle\" class=\"relative -top-0.5\" /> This item is no longer available</div>\r\n\r\n          <div\r\n            v-if=\"!props.viewOnly\"\r\n            class=\"sm:right-0 flex w-full gap-5 md:bottom-f5 md:right-0\"\r\n            :class=\"props.isSaveForLater ? 'sm:mt-3 sm:justify-end mt-auto md:justify-start' : 'justify-end md:absolute md:mt-3'\"\r\n          >\r\n            <FhButton variant=\"link\" @click=\"emit('delete')\">Remove</FhButton>\r\n            <FhButton v-if=\"!isUnavailable && !props.isSaveForLater\" variant=\"link\" @click=\"emit('saveforlater')\">Save for Later</FhButton>\r\n            <FhButton v-if=\"!isUnavailable && props.isSaveForLater\" variant=\"link\" @click=\"emit('movetocart')\">Move to Cart</FhButton>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <div\r\n        v-if=\"!props.isSaveForLater\"\r\n        class=\"flex items-center justify-between gap-3 md:absolute md:right-0 md:mt-f3 md:flex-none\"\r\n        :class=\"{ 'text-neutral-50': isUnavailable }\"\r\n      >\r\n        <div v-if=\"props.viewOnly\" class=\"text-neutral-50\">Qty: {{ props.quantity }}</div>\r\n        <FhQuantityInput v-else v-model=\"_quantity\" :disabled=\"isUnavailable\" />\r\n        <div v-show=\"!props.isSaveForLater\" class=\"text-f-base-2xl md:w-[6.5em] md:min-w-min md:text-right\">{{ formatPrice(props.totalPrice) }}</div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n","function t(e){typeof queueMicrotask==\"function\"?queueMicrotask(e):Promise.resolve().then(e).catch(o=>setTimeout(()=>{throw o}))}export{t as microTask};\n","import{microTask as n}from'./micro-task.js';function o(){let a=[],s={addEventListener(e,t,r,i){return e.addEventListener(t,r,i),s.add(()=>e.removeEventListener(t,r,i))},requestAnimationFrame(...e){let t=requestAnimationFrame(...e);s.add(()=>cancelAnimationFrame(t))},nextFrame(...e){s.requestAnimationFrame(()=>{s.requestAnimationFrame(...e)})},setTimeout(...e){let t=setTimeout(...e);s.add(()=>clearTimeout(t))},microTask(...e){let t={current:!0};return n(()=>{t.current&&e[0]()}),s.add(()=>{t.current=!1})},style(e,t,r){let i=e.style.getPropertyValue(t);return Object.assign(e.style,{[t]:r}),this.add(()=>{Object.assign(e.style,{[t]:i})})},group(e){let t=o();return e(t),this.add(()=>t.dispose())},add(e){return a.push(e),()=>{let t=a.indexOf(e);if(t>=0)for(let r of a.splice(t,1))r()}},dispose(){for(let e of a.splice(0))e()}};return s}export{o as disposables};\n","import{inject as n,provide as r}from\"vue\";let t=Symbol(\"headlessui.useid\"),i=0;function I(){return n(t,()=>`${++i}`)()}function l(e){r(t,e)}export{l as provideUseId,I as useId};\n","function o(e){var l;if(e==null||e.value==null)return null;let n=(l=e.value.$el)!=null?l:e.value;return n instanceof Node?n:null}export{o as dom};\n","function u(r,n,...a){if(r in n){let e=n[r];return typeof e==\"function\"?e(...a):e}let t=new Error(`Tried to handle \"${r}\" but there is no handler defined. Only defined handlers are: ${Object.keys(n).map(e=>`\"${e}\"`).join(\", \")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,u),t}export{u as match};\n","var i=Object.defineProperty;var d=(t,e,r)=>e in t?i(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var n=(t,e,r)=>(d(t,typeof e!=\"symbol\"?e+\"\":e,r),r);class s{constructor(){n(this,\"current\",this.detect());n(this,\"currentId\",0)}set(e){this.current!==e&&(this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current===\"server\"}get isClient(){return this.current===\"client\"}detect(){return typeof window==\"undefined\"||typeof document==\"undefined\"?\"server\":\"client\"}}let c=new s;export{c as env};\n","import{dom as o}from'./dom.js';import{env as t}from'./env.js';function i(r){if(t.isServer)return null;if(r instanceof Node)return r.ownerDocument;if(r!=null&&r.hasOwnProperty(\"value\")){let n=o(r);if(n)return n.ownerDocument}return document}export{i as getOwnerDocument};\n","import{nextTick as b}from\"vue\";import{match as M}from'./match.js';import{getOwnerDocument as f}from'./owner.js';let c=[\"[contentEditable=true]\",\"[tabindex]\",\"a[href]\",\"area[href]\",\"button:not([disabled])\",\"iframe\",\"input:not([disabled])\",\"select:not([disabled])\",\"textarea:not([disabled])\"].map(e=>`${e}:not([tabindex='-1'])`).join(\",\");var N=(n=>(n[n.First=1]=\"First\",n[n.Previous=2]=\"Previous\",n[n.Next=4]=\"Next\",n[n.Last=8]=\"Last\",n[n.WrapAround=16]=\"WrapAround\",n[n.NoScroll=32]=\"NoScroll\",n))(N||{}),T=(o=>(o[o.Error=0]=\"Error\",o[o.Overflow=1]=\"Overflow\",o[o.Success=2]=\"Success\",o[o.Underflow=3]=\"Underflow\",o))(T||{}),F=(t=>(t[t.Previous=-1]=\"Previous\",t[t.Next=1]=\"Next\",t))(F||{});function E(e=document.body){return e==null?[]:Array.from(e.querySelectorAll(c)).sort((r,t)=>Math.sign((r.tabIndex||Number.MAX_SAFE_INTEGER)-(t.tabIndex||Number.MAX_SAFE_INTEGER)))}var h=(t=>(t[t.Strict=0]=\"Strict\",t[t.Loose=1]=\"Loose\",t))(h||{});function w(e,r=0){var t;return e===((t=f(e))==null?void 0:t.body)?!1:M(r,{[0](){return e.matches(c)},[1](){let l=e;for(;l!==null;){if(l.matches(c))return!0;l=l.parentElement}return!1}})}function _(e){let r=f(e);b(()=>{r&&!w(r.activeElement,0)&&S(e)})}var y=(t=>(t[t.Keyboard=0]=\"Keyboard\",t[t.Mouse=1]=\"Mouse\",t))(y||{});typeof window!=\"undefined\"&&typeof document!=\"undefined\"&&(document.addEventListener(\"keydown\",e=>{e.metaKey||e.altKey||e.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible=\"\")},!0),document.addEventListener(\"click\",e=>{e.detail===1?delete document.documentElement.dataset.headlessuiFocusVisible:e.detail===0&&(document.documentElement.dataset.headlessuiFocusVisible=\"\")},!0));function S(e){e==null||e.focus({preventScroll:!0})}let H=[\"textarea\",\"input\"].join(\",\");function I(e){var r,t;return(t=(r=e==null?void 0:e.matches)==null?void 0:r.call(e,H))!=null?t:!1}function O(e,r=t=>t){return e.slice().sort((t,l)=>{let o=r(t),i=r(l);if(o===null||i===null)return 0;let n=o.compareDocumentPosition(i);return n&Node.DOCUMENT_POSITION_FOLLOWING?-1:n&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function v(e,r){return P(E(),r,{relativeTo:e})}function P(e,r,{sorted:t=!0,relativeTo:l=null,skipElements:o=[]}={}){var m;let i=(m=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:e==null?void 0:e.ownerDocument)!=null?m:document,n=Array.isArray(e)?t?O(e):e:E(e);o.length>0&&n.length>1&&(n=n.filter(s=>!o.includes(s))),l=l!=null?l:i.activeElement;let x=(()=>{if(r&5)return 1;if(r&10)return-1;throw new Error(\"Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last\")})(),p=(()=>{if(r&1)return 0;if(r&2)return Math.max(0,n.indexOf(l))-1;if(r&4)return Math.max(0,n.indexOf(l))+1;if(r&8)return n.length-1;throw new Error(\"Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last\")})(),L=r&32?{preventScroll:!0}:{},a=0,d=n.length,u;do{if(a>=d||a+d<=0)return 0;let s=p+a;if(r&16)s=(s+d)%d;else{if(s<0)return 3;if(s>=d)return 1}u=n[s],u==null||u.focus(L),a+=x}while(u!==i.activeElement);return r&6&&I(u)&&u.select(),2}export{N as Focus,T as FocusResult,h as FocusableMode,S as focusElement,v as focusFrom,P as focusIn,E as getFocusableElements,w as isFocusableElement,_ as restoreFocusIfNecessary,O as sortByDomNode};\n","function t(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}function i(){return/Android/gi.test(window.navigator.userAgent)}function n(){return t()||i()}export{i as isAndroid,t as isIOS,n as isMobile};\n","import{watchEffect as r}from\"vue\";import{env as m}from'../utils/env.js';function u(e,t,n){m.isServer||r(o=>{document.addEventListener(e,t,n),o(()=>document.removeEventListener(e,t,n))})}export{u as useDocumentEvent};\n","import{watchEffect as i}from\"vue\";import{env as r}from'../utils/env.js';function w(e,n,t){r.isServer||i(o=>{window.addEventListener(e,n,t),o(()=>window.removeEventListener(e,n,t))})}export{w as useWindowEvent};\n","import{computed as s,ref as E}from\"vue\";import{dom as p}from'../utils/dom.js';import{FocusableMode as d,isFocusableElement as C}from'../utils/focus-management.js';import{isMobile as T}from'../utils/platform.js';import{useDocumentEvent as i}from'./use-document-event.js';import{useWindowEvent as M}from'./use-window-event.js';function w(f,m,l=s(()=>!0)){function a(e,r){if(!l.value||e.defaultPrevented)return;let t=r(e);if(t===null||!t.getRootNode().contains(t))return;let c=function o(n){return typeof n==\"function\"?o(n()):Array.isArray(n)||n instanceof Set?n:[n]}(f);for(let o of c){if(o===null)continue;let n=o instanceof HTMLElement?o:p(o);if(n!=null&&n.contains(t)||e.composed&&e.composedPath().includes(n))return}return!C(t,d.Loose)&&t.tabIndex!==-1&&e.preventDefault(),m(e,t)}let u=E(null);i(\"pointerdown\",e=>{var r,t;l.value&&(u.value=((t=(r=e.composedPath)==null?void 0:r.call(e))==null?void 0:t[0])||e.target)},!0),i(\"mousedown\",e=>{var r,t;l.value&&(u.value=((t=(r=e.composedPath)==null?void 0:r.call(e))==null?void 0:t[0])||e.target)},!0),i(\"click\",e=>{T()||u.value&&(a(e,()=>u.value),u.value=null)},!0),i(\"touchend\",e=>a(e,()=>e.target instanceof HTMLElement?e.target:null),!0),M(\"blur\",e=>a(e,()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null),!0)}export{w as useOutsideClick};\n","import{onMounted as i,ref as f,watchEffect as l}from\"vue\";import{dom as o}from'../utils/dom.js';function r(t,e){if(t)return t;let n=e!=null?e:\"button\";if(typeof n==\"string\"&&n.toLowerCase()===\"button\")return\"button\"}function s(t,e){let n=f(r(t.value.type,t.value.as));return i(()=>{n.value=r(t.value.type,t.value.as)}),l(()=>{var u;n.value||o(e)&&o(e)instanceof HTMLButtonElement&&!((u=o(e))!=null&&u.hasAttribute(\"type\"))&&(n.value=\"button\")}),n}export{s as useResolveButtonType};\n","import{cloneVNode as O,Fragment as x,h as k}from\"vue\";import{match as w}from'./match.js';var N=(o=>(o[o.None=0]=\"None\",o[o.RenderStrategy=1]=\"RenderStrategy\",o[o.Static=2]=\"Static\",o))(N||{}),S=(e=>(e[e.Unmount=0]=\"Unmount\",e[e.Hidden=1]=\"Hidden\",e))(S||{});function A({visible:r=!0,features:t=0,ourProps:e,theirProps:o,...i}){var a;let n=j(o,e),l=Object.assign(i,{props:n});if(r||t&2&&n.static)return y(l);if(t&1){let d=(a=n.unmount)==null||a?0:1;return w(d,{[0](){return null},[1](){return y({...i,props:{...n,hidden:!0,style:{display:\"none\"}}})}})}return y(l)}function y({props:r,attrs:t,slots:e,slot:o,name:i}){var m,h;let{as:n,...l}=T(r,[\"unmount\",\"static\"]),a=(m=e.default)==null?void 0:m.call(e,o),d={};if(o){let u=!1,c=[];for(let[p,f]of Object.entries(o))typeof f==\"boolean\"&&(u=!0),f===!0&&c.push(p);u&&(d[\"data-headlessui-state\"]=c.join(\" \"))}if(n===\"template\"){if(a=b(a!=null?a:[]),Object.keys(l).length>0||Object.keys(t).length>0){let[u,...c]=a!=null?a:[];if(!v(u)||c.length>0)throw new Error(['Passing props on \"template\"!',\"\",`The current component <${i} /> is rendering a \"template\".`,\"However we need to passthrough the following props:\",Object.keys(l).concat(Object.keys(t)).map(s=>s.trim()).filter((s,g,R)=>R.indexOf(s)===g).sort((s,g)=>s.localeCompare(g)).map(s=>`  - ${s}`).join(`\n`),\"\",\"You can apply a few solutions:\",['Add an `as=\"...\"` prop, to ensure that we render an actual element instead of a \"template\".',\"Render a single element as the child so that we can forward the props onto that element.\"].map(s=>`  - ${s}`).join(`\n`)].join(`\n`));let p=j((h=u.props)!=null?h:{},l,d),f=O(u,p,!0);for(let s in p)s.startsWith(\"on\")&&(f.props||(f.props={}),f.props[s]=p[s]);return f}return Array.isArray(a)&&a.length===1?a[0]:a}return k(n,Object.assign({},l,d),{default:()=>a})}function b(r){return r.flatMap(t=>t.type===x?b(t.children):[t])}function j(...r){var o;if(r.length===0)return{};if(r.length===1)return r[0];let t={},e={};for(let i of r)for(let n in i)n.startsWith(\"on\")&&typeof i[n]==\"function\"?((o=e[n])!=null||(e[n]=[]),e[n].push(i[n])):t[n]=i[n];if(t.disabled||t[\"aria-disabled\"])return Object.assign(t,Object.fromEntries(Object.keys(e).map(i=>[i,void 0])));for(let i in e)Object.assign(t,{[i](n,...l){let a=e[i];for(let d of a){if(n instanceof Event&&n.defaultPrevented)return;d(n,...l)}}});return t}function E(r){let t=Object.assign({},r);for(let e in t)t[e]===void 0&&delete t[e];return t}function T(r,t=[]){let e=Object.assign({},r);for(let o of t)o in e&&delete e[o];return e}function v(r){return r==null?!1:typeof r.type==\"string\"||typeof r.type==\"object\"||typeof r.type==\"function\"}export{N as Features,S as RenderStrategy,E as compact,T as omit,A as render};\n","import{defineComponent as a}from\"vue\";import{render as p}from'../utils/render.js';var u=(e=>(e[e.None=1]=\"None\",e[e.Focusable=2]=\"Focusable\",e[e.Hidden=4]=\"Hidden\",e))(u||{});let f=a({name:\"Hidden\",props:{as:{type:[Object,String],default:\"div\"},features:{type:Number,default:1}},setup(t,{slots:n,attrs:i}){return()=>{var r;let{features:e,...d}=t,o={\"aria-hidden\":(e&2)===2?!0:(r=d[\"aria-hidden\"])!=null?r:void 0,hidden:(e&4)===4?!0:void 0,style:{position:\"fixed\",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:\"hidden\",clip:\"rect(0, 0, 0, 0)\",whiteSpace:\"nowrap\",borderWidth:\"0\",...(e&4)===4&&(e&2)!==2&&{display:\"none\"}}};return p({ourProps:o,theirProps:d,slot:{},attrs:i,slots:n,name:\"Hidden\"})}}});export{u as Features,f as Hidden};\n","import{inject as p,provide as r}from\"vue\";let n=Symbol(\"Context\");var i=(e=>(e[e.Open=1]=\"Open\",e[e.Closed=2]=\"Closed\",e[e.Closing=4]=\"Closing\",e[e.Opening=8]=\"Opening\",e))(i||{});function s(){return l()!==null}function l(){return p(n,null)}function t(o){r(n,o)}export{i as State,s as hasOpenClosed,l as useOpenClosed,t as useOpenClosedProvider};\n","var o=(r=>(r.Space=\" \",r.Enter=\"Enter\",r.Escape=\"Escape\",r.Backspace=\"Backspace\",r.Delete=\"Delete\",r.ArrowLeft=\"ArrowLeft\",r.ArrowUp=\"ArrowUp\",r.ArrowRight=\"ArrowRight\",r.ArrowDown=\"ArrowDown\",r.Home=\"Home\",r.End=\"End\",r.PageUp=\"PageUp\",r.PageDown=\"PageDown\",r.Tab=\"Tab\",r))(o||{});export{o as Keys};\n","function t(n){function e(){document.readyState!==\"loading\"&&(n(),document.removeEventListener(\"DOMContentLoaded\",e))}typeof window!=\"undefined\"&&typeof document!=\"undefined\"&&(document.addEventListener(\"DOMContentLoaded\",e),e())}export{t as onDocumentReady};\n","import{onDocumentReady as d}from'./document-ready.js';let t=[];d(()=>{function e(n){n.target instanceof HTMLElement&&n.target!==document.body&&t[0]!==n.target&&(t.unshift(n.target),t=t.filter(r=>r!=null&&r.isConnected),t.splice(10))}window.addEventListener(\"click\",e,{capture:!0}),window.addEventListener(\"mousedown\",e,{capture:!0}),window.addEventListener(\"focus\",e,{capture:!0}),document.body.addEventListener(\"click\",e,{capture:!0}),document.body.addEventListener(\"mousedown\",e,{capture:!0}),document.body.addEventListener(\"focus\",e,{capture:!0})});export{t as history};\n","import{watchEffect as i}from\"vue\";import{env as a}from'../utils/env.js';function E(n,e,o,r){a.isServer||i(t=>{n=n!=null?n:window,n.addEventListener(e,o,r),t(()=>n.removeEventListener(e,o,r))})}export{E as useEventListener};\n","import{ref as a}from\"vue\";import{useWindowEvent as t}from'./use-window-event.js';var d=(r=>(r[r.Forwards=0]=\"Forwards\",r[r.Backwards=1]=\"Backwards\",r))(d||{});function n(){let o=a(0);return t(\"keydown\",e=>{e.key===\"Tab\"&&(o.value=e.shiftKey?1:0)}),o}export{d as Direction,n as useTabDirection};\n","import{computed as L,defineComponent as I,Fragment as j,h as R,onMounted as M,onUnmounted as h,ref as E,watch as g,watchEffect as K}from\"vue\";import{useEventListener as U}from'../../hooks/use-event-listener.js';import{Direction as y,useTabDirection as _}from'../../hooks/use-tab-direction.js';import{Features as k,Hidden as D}from'../../internal/hidden.js';import{history as C}from'../../utils/active-element-history.js';import{dom as c}from'../../utils/dom.js';import{Focus as v,focusElement as p,focusIn as b,FocusResult as q}from'../../utils/focus-management.js';import{match as P}from'../../utils/match.js';import{microTask as S}from'../../utils/micro-task.js';import{getOwnerDocument as x}from'../../utils/owner.js';import{render as G}from'../../utils/render.js';function B(t){if(!t)return new Set;if(typeof t==\"function\")return new Set(t());let n=new Set;for(let r of t.value){let l=c(r);l instanceof HTMLElement&&n.add(l)}return n}var A=(e=>(e[e.None=1]=\"None\",e[e.InitialFocus=2]=\"InitialFocus\",e[e.TabLock=4]=\"TabLock\",e[e.FocusLock=8]=\"FocusLock\",e[e.RestoreFocus=16]=\"RestoreFocus\",e[e.All=30]=\"All\",e))(A||{});let ue=Object.assign(I({name:\"FocusTrap\",props:{as:{type:[Object,String],default:\"div\"},initialFocus:{type:Object,default:null},features:{type:Number,default:30},containers:{type:[Object,Function],default:E(new Set)}},inheritAttrs:!1,setup(t,{attrs:n,slots:r,expose:l}){let o=E(null);l({el:o,$el:o});let i=L(()=>x(o)),e=E(!1);M(()=>e.value=!0),h(()=>e.value=!1),$({ownerDocument:i},L(()=>e.value&&Boolean(t.features&16)));let m=z({ownerDocument:i,container:o,initialFocus:L(()=>t.initialFocus)},L(()=>e.value&&Boolean(t.features&2)));J({ownerDocument:i,container:o,containers:t.containers,previousActiveElement:m},L(()=>e.value&&Boolean(t.features&8)));let f=_();function a(u){let T=c(o);if(!T)return;(w=>w())(()=>{P(f.value,{[y.Forwards]:()=>{b(T,v.First,{skipElements:[u.relatedTarget]})},[y.Backwards]:()=>{b(T,v.Last,{skipElements:[u.relatedTarget]})}})})}let s=E(!1);function F(u){u.key===\"Tab\"&&(s.value=!0,requestAnimationFrame(()=>{s.value=!1}))}function H(u){if(!e.value)return;let T=B(t.containers);c(o)instanceof HTMLElement&&T.add(c(o));let d=u.relatedTarget;d instanceof HTMLElement&&d.dataset.headlessuiFocusGuard!==\"true\"&&(N(T,d)||(s.value?b(c(o),P(f.value,{[y.Forwards]:()=>v.Next,[y.Backwards]:()=>v.Previous})|v.WrapAround,{relativeTo:u.target}):u.target instanceof HTMLElement&&p(u.target)))}return()=>{let u={},T={ref:o,onKeydown:F,onFocusout:H},{features:d,initialFocus:w,containers:Q,...O}=t;return R(j,[Boolean(d&4)&&R(D,{as:\"button\",type:\"button\",\"data-headlessui-focus-guard\":!0,onFocus:a,features:k.Focusable}),G({ourProps:T,theirProps:{...n,...O},slot:u,attrs:n,slots:r,name:\"FocusTrap\"}),Boolean(d&4)&&R(D,{as:\"button\",type:\"button\",\"data-headlessui-focus-guard\":!0,onFocus:a,features:k.Focusable})])}}}),{features:A});function W(t){let n=E(C.slice());return g([t],([r],[l])=>{l===!0&&r===!1?S(()=>{n.value.splice(0)}):l===!1&&r===!0&&(n.value=C.slice())},{flush:\"post\"}),()=>{var r;return(r=n.value.find(l=>l!=null&&l.isConnected))!=null?r:null}}function $({ownerDocument:t},n){let r=W(n);M(()=>{K(()=>{var l,o;n.value||((l=t.value)==null?void 0:l.activeElement)===((o=t.value)==null?void 0:o.body)&&p(r())},{flush:\"post\"})}),h(()=>{n.value&&p(r())})}function z({ownerDocument:t,container:n,initialFocus:r},l){let o=E(null),i=E(!1);return M(()=>i.value=!0),h(()=>i.value=!1),M(()=>{g([n,r,l],(e,m)=>{if(e.every((a,s)=>(m==null?void 0:m[s])===a)||!l.value)return;let f=c(n);f&&S(()=>{var F,H;if(!i.value)return;let a=c(r),s=(F=t.value)==null?void 0:F.activeElement;if(a){if(a===s){o.value=s;return}}else if(f.contains(s)){o.value=s;return}a?p(a):b(f,v.First|v.NoScroll)===q.Error&&console.warn(\"There are no focusable elements inside the <FocusTrap />\"),o.value=(H=t.value)==null?void 0:H.activeElement})},{immediate:!0,flush:\"post\"})}),o}function J({ownerDocument:t,container:n,containers:r,previousActiveElement:l},o){var i;U((i=t.value)==null?void 0:i.defaultView,\"focus\",e=>{if(!o.value)return;let m=B(r);c(n)instanceof HTMLElement&&m.add(c(n));let f=l.value;if(!f)return;let a=e.target;a&&a instanceof HTMLElement?N(m,a)?(l.value=a,p(a)):(e.preventDefault(),e.stopPropagation(),p(f)):p(l.value)},!0)}function N(t,n){for(let r of t)if(r.contains(n))return!0;return!1}export{ue as FocusTrap};\n","import{onUnmounted as o,shallowRef as n}from\"vue\";function m(t){let e=n(t.getSnapshot());return o(t.subscribe(()=>{e.value=t.getSnapshot()})),e}export{m as useStore};\n","function a(o,r){let t=o(),n=new Set;return{getSnapshot(){return t},subscribe(e){return n.add(e),()=>n.delete(e)},dispatch(e,...s){let i=r[e].call(t,...s);i&&(t=i,n.forEach(c=>c()))}}}export{a as createStore};\n","function c(){let o;return{before({doc:e}){var l;let n=e.documentElement;o=((l=e.defaultView)!=null?l:window).innerWidth-n.clientWidth},after({doc:e,d:n}){let t=e.documentElement,l=t.clientWidth-t.offsetWidth,r=o-l;n.style(t,\"paddingRight\",`${r}px`)}}}export{c as adjustScrollbarPadding};\n","import{disposables as m}from'../../utils/disposables.js';import{isIOS as u}from'../../utils/platform.js';function w(){return u()?{before({doc:r,d:n,meta:c}){function a(o){return c.containers.flatMap(l=>l()).some(l=>l.contains(o))}n.microTask(()=>{var s;if(window.getComputedStyle(r.documentElement).scrollBehavior!==\"auto\"){let t=m();t.style(r.documentElement,\"scrollBehavior\",\"auto\"),n.add(()=>n.microTask(()=>t.dispose()))}let o=(s=window.scrollY)!=null?s:window.pageYOffset,l=null;n.addEventListener(r,\"click\",t=>{if(t.target instanceof HTMLElement)try{let e=t.target.closest(\"a\");if(!e)return;let{hash:f}=new URL(e.href),i=r.querySelector(f);i&&!a(i)&&(l=i)}catch{}},!0),n.addEventListener(r,\"touchstart\",t=>{if(t.target instanceof HTMLElement)if(a(t.target)){let e=t.target;for(;e.parentElement&&a(e.parentElement);)e=e.parentElement;n.style(e,\"overscrollBehavior\",\"contain\")}else n.style(t.target,\"touchAction\",\"none\")}),n.addEventListener(r,\"touchmove\",t=>{if(t.target instanceof HTMLElement){if(t.target.tagName===\"INPUT\")return;if(a(t.target)){let e=t.target;for(;e.parentElement&&e.dataset.headlessuiPortal!==\"\"&&!(e.scrollHeight>e.clientHeight||e.scrollWidth>e.clientWidth);)e=e.parentElement;e.dataset.headlessuiPortal===\"\"&&t.preventDefault()}else t.preventDefault()}},{passive:!1}),n.add(()=>{var e;let t=(e=window.scrollY)!=null?e:window.pageYOffset;o!==t&&window.scrollTo(0,o),l&&l.isConnected&&(l.scrollIntoView({block:\"nearest\"}),l=null)})})}}:{}}export{w as handleIOSLocking};\n","function l(){return{before({doc:e,d:o}){o.style(e.documentElement,\"overflow\",\"hidden\")}}}export{l as preventScroll};\n","import{disposables as s}from'../../utils/disposables.js';import{createStore as i}from'../../utils/store.js';import{adjustScrollbarPadding as l}from'./adjust-scrollbar-padding.js';import{handleIOSLocking as d}from'./handle-ios-locking.js';import{preventScroll as p}from'./prevent-scroll.js';function m(e){let n={};for(let t of e)Object.assign(n,t(n));return n}let a=i(()=>new Map,{PUSH(e,n){var o;let t=(o=this.get(e))!=null?o:{doc:e,count:0,d:s(),meta:new Set};return t.count++,t.meta.add(n),this.set(e,t),this},POP(e,n){let t=this.get(e);return t&&(t.count--,t.meta.delete(n)),this},SCROLL_PREVENT({doc:e,d:n,meta:t}){let o={doc:e,d:n,meta:m(t)},c=[d(),l(),p()];c.forEach(({before:r})=>r==null?void 0:r(o)),c.forEach(({after:r})=>r==null?void 0:r(o))},SCROLL_ALLOW({d:e}){e.dispose()},TEARDOWN({doc:e}){this.delete(e)}});a.subscribe(()=>{let e=a.getSnapshot(),n=new Map;for(let[t]of e)n.set(t,t.documentElement.style.overflow);for(let t of e.values()){let o=n.get(t.doc)===\"hidden\",c=t.count!==0;(c&&!o||!c&&o)&&a.dispatch(t.count>0?\"SCROLL_PREVENT\":\"SCROLL_ALLOW\",t),t.count===0&&a.dispatch(\"TEARDOWN\",t)}});export{a as overflows};\n","import{computed as p,watch as s}from\"vue\";import{useStore as v}from'../../hooks/use-store.js';import{overflows as u}from'./overflow-store.js';function d(t,a,n){let i=v(u),l=p(()=>{let e=t.value?i.value.get(t.value):void 0;return e?e.count>0:!1});return s([t,a],([e,m],[r],o)=>{if(!e||!m)return;u.dispatch(\"PUSH\",e,n);let f=!1;o(()=>{f||(u.dispatch(\"POP\",r!=null?r:e,n),f=!0)})},{immediate:!0}),l}export{d as useDocumentOverflowLockedEffect};\n","import{ref as m,watchEffect as s}from\"vue\";import{dom as h}from'../utils/dom.js';let i=new Map,t=new Map;function E(d,f=m(!0)){s(o=>{var a;if(!f.value)return;let e=h(d);if(!e)return;o(function(){var u;if(!e)return;let r=(u=t.get(e))!=null?u:1;if(r===1?t.delete(e):t.set(e,r-1),r!==1)return;let n=i.get(e);n&&(n[\"aria-hidden\"]===null?e.removeAttribute(\"aria-hidden\"):e.setAttribute(\"aria-hidden\",n[\"aria-hidden\"]),e.inert=n.inert,i.delete(e))});let l=(a=t.get(e))!=null?a:0;t.set(e,l+1),l===0&&(i.set(e,{\"aria-hidden\":e.getAttribute(\"aria-hidden\"),inert:e.inert}),e.setAttribute(\"aria-hidden\",\"true\"),e.inert=!0)})}export{E as useInert};\n","import{h as m,ref as s}from\"vue\";import{Features as d,Hidden as c}from'../internal/hidden.js';import{dom as T}from'../utils/dom.js';import{getOwnerDocument as E}from'../utils/owner.js';function N({defaultContainers:o=[],portals:i,mainTreeNodeRef:H}={}){let t=s(null),r=E(t);function u(){var l,f,a;let n=[];for(let e of o)e!==null&&(e instanceof HTMLElement?n.push(e):\"value\"in e&&e.value instanceof HTMLElement&&n.push(e.value));if(i!=null&&i.value)for(let e of i.value)n.push(e);for(let e of(l=r==null?void 0:r.querySelectorAll(\"html > *, body > *\"))!=null?l:[])e!==document.body&&e!==document.head&&e instanceof HTMLElement&&e.id!==\"headlessui-portal-root\"&&(e.contains(T(t))||e.contains((a=(f=T(t))==null?void 0:f.getRootNode())==null?void 0:a.host)||n.some(M=>e.contains(M))||n.push(e));return n}return{resolveContainers:u,contains(n){return u().some(l=>l.contains(n))},mainTreeNodeRef:t,MainTreeNode(){return H!=null?null:m(c,{features:d.Hidden,ref:t})}}}function v(){let o=s(null);return{mainTreeNodeRef:o,MainTreeNode(){return m(c,{features:d.Hidden,ref:o})}}}export{v as useMainTreeNode,N as useRootContainers};\n","import{defineComponent as l,inject as a,provide as c}from\"vue\";import{render as p}from'../utils/render.js';let e=Symbol(\"ForcePortalRootContext\");function s(){return a(e,!1)}let u=l({name:\"ForcePortalRoot\",props:{as:{type:[Object,String],default:\"template\"},force:{type:Boolean,default:!1}},setup(o,{slots:t,attrs:r}){return c(e,o.force),()=>{let{force:f,...n}=o;return p({theirProps:n,ourProps:{},slot:{},slots:t,attrs:r,name:\"ForcePortalRoot\"})}}});export{u as ForcePortalRoot,s as usePortalRoot};\n","import{inject as f,onMounted as m,onUnmounted as l,provide as c,watch as p}from\"vue\";let u=Symbol(\"StackContext\");var s=(e=>(e[e.Add=0]=\"Add\",e[e.Remove=1]=\"Remove\",e))(s||{});function y(){return f(u,()=>{})}function R({type:o,enabled:r,element:e,onUpdate:i}){let a=y();function t(...n){i==null||i(...n),a(...n)}m(()=>{p(r,(n,d)=>{n?t(0,o,e):d===!0&&t(1,o,e)},{immediate:!0,flush:\"sync\"})}),l(()=>{r.value&&t(1,o,e)}),c(u,t)}export{s as StackMessage,y as useStackContext,R as useStackProvider};\n","import{computed as x,defineComponent as y,inject as R,onMounted as v,onUnmounted as D,provide as j,ref as p,unref as C}from\"vue\";import{useId as h}from'../../hooks/use-id.js';import{render as b}from'../../utils/render.js';let u=Symbol(\"DescriptionContext\");function w(){let t=R(u,null);if(t===null)throw new Error(\"Missing parent\");return t}function k({slot:t=p({}),name:o=\"Description\",props:s={}}={}){let e=p([]);function r(n){return e.value.push(n),()=>{let i=e.value.indexOf(n);i!==-1&&e.value.splice(i,1)}}return j(u,{register:r,slot:t,name:o,props:s}),x(()=>e.value.length>0?e.value.join(\" \"):void 0)}let K=y({name:\"Description\",props:{as:{type:[Object,String],default:\"p\"},id:{type:String,default:null}},setup(t,{attrs:o,slots:s}){var n;let e=(n=t.id)!=null?n:`headlessui-description-${h()}`,r=w();return v(()=>D(r.register(e))),()=>{let{name:i=\"Description\",slot:l=p({}),props:d={}}=r,{...c}=t,f={...Object.entries(d).reduce((a,[g,m])=>Object.assign(a,{[g]:C(m)}),{}),id:e};return b({ourProps:f,theirProps:c,slot:l.value,attrs:o,slots:s,name:i})}}});export{K as Description,k as useDescriptions};\n","import{computed as w,defineComponent as m,getCurrentInstance as j,h as I,inject as s,onMounted as R,onUnmounted as y,provide as E,reactive as G,ref as p,Teleport as O,watch as D,watchEffect as K}from\"vue\";import{usePortalRoot as S}from'../../internal/portal-force-root.js';import{dom as B}from'../../utils/dom.js';import{getOwnerDocument as C}from'../../utils/owner.js';import{render as h}from'../../utils/render.js';function x(e){let t=C(e);if(!t){if(e===null)return null;throw new Error(`[Headless UI]: Cannot find ownerDocument for contextElement: ${e}`)}let l=t.getElementById(\"headlessui-portal-root\");if(l)return l;let r=t.createElement(\"div\");return r.setAttribute(\"id\",\"headlessui-portal-root\"),t.body.appendChild(r)}const f=new WeakMap;function U(e){var t;return(t=f.get(e))!=null?t:0}function M(e,t){let l=t(U(e));return l<=0?f.delete(e):f.set(e,l),l}let $=m({name:\"Portal\",props:{as:{type:[Object,String],default:\"div\"}},setup(e,{slots:t,attrs:l}){let r=p(null),i=w(()=>C(r)),o=S(),u=s(H,null),n=p(o===!0||u==null?x(r.value):u.resolveTarget());n.value&&M(n.value,a=>a+1);let c=p(!1);R(()=>{c.value=!0}),K(()=>{o||u!=null&&(n.value=u.resolveTarget())});let v=s(d,null),g=!1,b=j();return D(r,()=>{if(g||!v)return;let a=B(r);a&&(y(v.register(a),b),g=!0)}),y(()=>{var P,T;let a=(P=i.value)==null?void 0:P.getElementById(\"headlessui-portal-root\");!a||n.value!==a||M(n.value,L=>L-1)||n.value.children.length>0||(T=n.value.parentElement)==null||T.removeChild(n.value)}),()=>{if(!c.value||n.value===null)return null;let a={ref:r,\"data-headlessui-portal\":\"\"};return I(O,{to:n.value},h({ourProps:a,theirProps:e,slot:{},attrs:l,slots:t,name:\"Portal\"}))}}}),d=Symbol(\"PortalParentContext\");function q(){let e=s(d,null),t=p([]);function l(o){return t.value.push(o),e&&e.register(o),()=>r(o)}function r(o){let u=t.value.indexOf(o);u!==-1&&t.value.splice(u,1),e&&e.unregister(o)}let i={register:l,unregister:r,portals:t};return[t,m({name:\"PortalWrapper\",setup(o,{slots:u}){return E(d,i),()=>{var n;return(n=u.default)==null?void 0:n.call(u)}}})]}let H=Symbol(\"PortalGroupContext\"),z=m({name:\"PortalGroup\",props:{as:{type:[Object,String],default:\"template\"},target:{type:Object,default:null}},setup(e,{attrs:t,slots:l}){let r=G({resolveTarget(){return e.target}});return E(H,r),()=>{let{target:i,...o}=e;return h({theirProps:o,ourProps:{},slot:{},attrs:t,slots:l,name:\"PortalGroup\"})}}});export{$ as Portal,z as PortalGroup,q as useNestedPortals};\n","import{computed as o,defineComponent as O,h as v,inject as Y,nextTick as se,onMounted as $,onUnmounted as pe,provide as de,ref as y,watchEffect as fe}from\"vue\";import{FocusTrap as P}from'../../components/focus-trap/focus-trap.js';import{useDocumentOverflowLockedEffect as ge}from'../../hooks/document-overflow/use-document-overflow.js';import{useEventListener as ce}from'../../hooks/use-event-listener.js';import{useId as b}from'../../hooks/use-id.js';import{useInert as _}from'../../hooks/use-inert.js';import{useOutsideClick as ve}from'../../hooks/use-outside-click.js';import{useRootContainers as me}from'../../hooks/use-root-containers.js';import{State as I,useOpenClosed as De}from'../../internal/open-closed.js';import{ForcePortalRoot as F}from'../../internal/portal-force-root.js';import{StackMessage as z,useStackProvider as ye}from'../../internal/stack-context.js';import{Keys as Se}from'../../keyboard.js';import{dom as j}from'../../utils/dom.js';import{match as G}from'../../utils/match.js';import{getOwnerDocument as he}from'../../utils/owner.js';import{Features as V,render as C}from'../../utils/render.js';import{Description as Oe,useDescriptions as Pe}from'../description/description.js';import{Portal as J,PortalGroup as be,useNestedPortals as Ce}from'../portal/portal.js';var Te=(l=>(l[l.Open=0]=\"Open\",l[l.Closed=1]=\"Closed\",l))(Te||{});let H=Symbol(\"DialogContext\");function T(t){let i=Y(H,null);if(i===null){let l=new Error(`<${t} /> is missing a parent <Dialog /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(l,T),l}return i}let A=\"DC8F892D-2EBD-447C-A4C8-A03058436FF4\",Ye=O({name:\"Dialog\",inheritAttrs:!1,props:{as:{type:[Object,String],default:\"div\"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},open:{type:[Boolean,String],default:A},initialFocus:{type:Object,default:null},id:{type:String,default:null},role:{type:String,default:\"dialog\"}},emits:{close:t=>!0},setup(t,{emit:i,attrs:l,slots:p,expose:s}){var q,W;let n=(q=t.id)!=null?q:`headlessui-dialog-${b()}`,u=y(!1);$(()=>{u.value=!0});let r=!1,g=o(()=>t.role===\"dialog\"||t.role===\"alertdialog\"?t.role:(r||(r=!0,console.warn(`Invalid role [${g}] passed to <Dialog />. Only \\`dialog\\` and and \\`alertdialog\\` are supported. Using \\`dialog\\` instead.`)),\"dialog\")),D=y(0),S=De(),R=o(()=>t.open===A&&S!==null?(S.value&I.Open)===I.Open:t.open),m=y(null),E=o(()=>he(m));if(s({el:m,$el:m}),!(t.open!==A||S!==null))throw new Error(\"You forgot to provide an `open` prop to the `Dialog`.\");if(typeof R.value!=\"boolean\")throw new Error(`You provided an \\`open\\` prop to the \\`Dialog\\`, but the value is not a boolean. Received: ${R.value===A?void 0:t.open}`);let c=o(()=>u.value&&R.value?0:1),k=o(()=>c.value===0),w=o(()=>D.value>1),N=Y(H,null)!==null,[Q,X]=Ce(),{resolveContainers:B,mainTreeNodeRef:K,MainTreeNode:Z}=me({portals:Q,defaultContainers:[o(()=>{var e;return(e=h.panelRef.value)!=null?e:m.value})]}),ee=o(()=>w.value?\"parent\":\"leaf\"),U=o(()=>S!==null?(S.value&I.Closing)===I.Closing:!1),te=o(()=>N||U.value?!1:k.value),le=o(()=>{var e,a,d;return(d=Array.from((a=(e=E.value)==null?void 0:e.querySelectorAll(\"body > *\"))!=null?a:[]).find(f=>f.id===\"headlessui-portal-root\"?!1:f.contains(j(K))&&f instanceof HTMLElement))!=null?d:null});_(le,te);let ae=o(()=>w.value?!0:k.value),oe=o(()=>{var e,a,d;return(d=Array.from((a=(e=E.value)==null?void 0:e.querySelectorAll(\"[data-headlessui-portal]\"))!=null?a:[]).find(f=>f.contains(j(K))&&f instanceof HTMLElement))!=null?d:null});_(oe,ae),ye({type:\"Dialog\",enabled:o(()=>c.value===0),element:m,onUpdate:(e,a)=>{if(a===\"Dialog\")return G(e,{[z.Add]:()=>D.value+=1,[z.Remove]:()=>D.value-=1})}});let re=Pe({name:\"DialogDescription\",slot:o(()=>({open:R.value}))}),M=y(null),h={titleId:M,panelRef:y(null),dialogState:c,setTitleId(e){M.value!==e&&(M.value=e)},close(){i(\"close\",!1)}};de(H,h);let ne=o(()=>!(!k.value||w.value));ve(B,(e,a)=>{e.preventDefault(),h.close(),se(()=>a==null?void 0:a.focus())},ne);let ie=o(()=>!(w.value||c.value!==0));ce((W=E.value)==null?void 0:W.defaultView,\"keydown\",e=>{ie.value&&(e.defaultPrevented||e.key===Se.Escape&&(e.preventDefault(),e.stopPropagation(),h.close()))});let ue=o(()=>!(U.value||c.value!==0||N));return ge(E,ue,e=>{var a;return{containers:[...(a=e.containers)!=null?a:[],B]}}),fe(e=>{if(c.value!==0)return;let a=j(m);if(!a)return;let d=new ResizeObserver(f=>{for(let L of f){let x=L.target.getBoundingClientRect();x.x===0&&x.y===0&&x.width===0&&x.height===0&&h.close()}});d.observe(a),e(()=>d.disconnect())}),()=>{let{open:e,initialFocus:a,...d}=t,f={...l,ref:m,id:n,role:g.value,\"aria-modal\":c.value===0?!0:void 0,\"aria-labelledby\":M.value,\"aria-describedby\":re.value},L={open:c.value===0};return v(F,{force:!0},()=>[v(J,()=>v(be,{target:m.value},()=>v(F,{force:!1},()=>v(P,{initialFocus:a,containers:B,features:k.value?G(ee.value,{parent:P.features.RestoreFocus,leaf:P.features.All&~P.features.FocusLock}):P.features.None},()=>v(X,{},()=>C({ourProps:f,theirProps:{...d,...l},slot:L,attrs:l,slots:p,visible:c.value===0,features:V.RenderStrategy|V.Static,name:\"Dialog\"})))))),v(Z)])}}}),_e=O({name:\"DialogOverlay\",props:{as:{type:[Object,String],default:\"div\"},id:{type:String,default:null}},setup(t,{attrs:i,slots:l}){var u;let p=(u=t.id)!=null?u:`headlessui-dialog-overlay-${b()}`,s=T(\"DialogOverlay\");function n(r){r.target===r.currentTarget&&(r.preventDefault(),r.stopPropagation(),s.close())}return()=>{let{...r}=t;return C({ourProps:{id:p,\"aria-hidden\":!0,onClick:n},theirProps:r,slot:{open:s.dialogState.value===0},attrs:i,slots:l,name:\"DialogOverlay\"})}}}),ze=O({name:\"DialogBackdrop\",props:{as:{type:[Object,String],default:\"div\"},id:{type:String,default:null}},inheritAttrs:!1,setup(t,{attrs:i,slots:l,expose:p}){var r;let s=(r=t.id)!=null?r:`headlessui-dialog-backdrop-${b()}`,n=T(\"DialogBackdrop\"),u=y(null);return p({el:u,$el:u}),$(()=>{if(n.panelRef.value===null)throw new Error(\"A <DialogBackdrop /> component is being used, but a <DialogPanel /> component is missing.\")}),()=>{let{...g}=t,D={id:s,ref:u,\"aria-hidden\":!0};return v(F,{force:!0},()=>v(J,()=>C({ourProps:D,theirProps:{...i,...g},slot:{open:n.dialogState.value===0},attrs:i,slots:l,name:\"DialogBackdrop\"})))}}}),Ge=O({name:\"DialogPanel\",props:{as:{type:[Object,String],default:\"div\"},id:{type:String,default:null}},setup(t,{attrs:i,slots:l,expose:p}){var r;let s=(r=t.id)!=null?r:`headlessui-dialog-panel-${b()}`,n=T(\"DialogPanel\");p({el:n.panelRef,$el:n.panelRef});function u(g){g.stopPropagation()}return()=>{let{...g}=t,D={id:s,ref:n.panelRef,onClick:u};return C({ourProps:D,theirProps:g,slot:{open:n.dialogState.value===0},attrs:i,slots:l,name:\"DialogPanel\"})}}}),Ve=O({name:\"DialogTitle\",props:{as:{type:[Object,String],default:\"h2\"},id:{type:String,default:null}},setup(t,{attrs:i,slots:l}){var n;let p=(n=t.id)!=null?n:`headlessui-dialog-title-${b()}`,s=T(\"DialogTitle\");return $(()=>{s.setTitleId(p),pe(()=>s.setTitleId(null))}),()=>{let{...u}=t;return C({ourProps:{id:p},theirProps:u,slot:{open:s.dialogState.value===0},attrs:i,slots:l,name:\"DialogTitle\"})}}}),Je=Oe;export{Ye as Dialog,ze as DialogBackdrop,Je as DialogDescription,_e as DialogOverlay,Ge as DialogPanel,Ve as DialogTitle};\n","import{defineComponent as i,h as m,ref as f}from\"vue\";import{Features as l,Hidden as F}from'./hidden.js';let d=i({props:{onFocus:{type:Function,required:!0}},setup(t){let n=f(!0);return()=>n.value?m(F,{as:\"button\",type:\"button\",features:l.Focusable,onFocus(o){o.preventDefault();let e,a=50;function r(){var u;if(a--<=0){e&&cancelAnimationFrame(e);return}if((u=t.onFocus)!=null&&u.call(t)){n.value=!1,cancelAnimationFrame(e);return}e=requestAnimationFrame(r)}e=requestAnimationFrame(r)}}):null}});export{d as FocusSentinel};\n","import{computed as v,defineComponent as L,Fragment as z,h as A,inject as j,onMounted as F,onUnmounted as K,provide as N,ref as P,watch as _,watchEffect as J}from\"vue\";import{useId as $}from'../../hooks/use-id.js';import{useResolveButtonType as Q}from'../../hooks/use-resolve-button-type.js';import{FocusSentinel as V}from'../../internal/focus-sentinel.js';import{Hidden as X}from'../../internal/hidden.js';import{Keys as S}from'../../keyboard.js';import{dom as f}from'../../utils/dom.js';import{Focus as g,focusIn as D,FocusResult as B,sortByDomNode as k}from'../../utils/focus-management.js';import{match as H}from'../../utils/match.js';import{microTask as Y}from'../../utils/micro-task.js';import{getOwnerDocument as Z}from'../../utils/owner.js';import{Features as q,omit as ee,render as M}from'../../utils/render.js';var te=(s=>(s[s.Forwards=0]=\"Forwards\",s[s.Backwards=1]=\"Backwards\",s))(te||{}),le=(d=>(d[d.Less=-1]=\"Less\",d[d.Equal=0]=\"Equal\",d[d.Greater=1]=\"Greater\",d))(le||{});let U=Symbol(\"TabsContext\");function C(a){let b=j(U,null);if(b===null){let s=new Error(`<${a} /> is missing a parent <TabGroup /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(s,C),s}return b}let G=Symbol(\"TabsSSRContext\"),me=L({name:\"TabGroup\",emits:{change:a=>!0},props:{as:{type:[Object,String],default:\"template\"},selectedIndex:{type:[Number],default:null},defaultIndex:{type:[Number],default:0},vertical:{type:[Boolean],default:!1},manual:{type:[Boolean],default:!1}},inheritAttrs:!1,setup(a,{slots:b,attrs:s,emit:d}){var E;let i=P((E=a.selectedIndex)!=null?E:a.defaultIndex),l=P([]),r=P([]),p=v(()=>a.selectedIndex!==null),R=v(()=>p.value?a.selectedIndex:i.value);function y(t){var c;let n=k(u.tabs.value,f),o=k(u.panels.value,f),e=n.filter(I=>{var m;return!((m=f(I))!=null&&m.hasAttribute(\"disabled\"))});if(t<0||t>n.length-1){let I=H(i.value===null?0:Math.sign(t-i.value),{[-1]:()=>1,[0]:()=>H(Math.sign(t),{[-1]:()=>0,[0]:()=>0,[1]:()=>1}),[1]:()=>0}),m=H(I,{[0]:()=>n.indexOf(e[0]),[1]:()=>n.indexOf(e[e.length-1])});m!==-1&&(i.value=m),u.tabs.value=n,u.panels.value=o}else{let I=n.slice(0,t),h=[...n.slice(t),...I].find(W=>e.includes(W));if(!h)return;let O=(c=n.indexOf(h))!=null?c:u.selectedIndex.value;O===-1&&(O=u.selectedIndex.value),i.value=O,u.tabs.value=n,u.panels.value=o}}let u={selectedIndex:v(()=>{var t,n;return(n=(t=i.value)!=null?t:a.defaultIndex)!=null?n:null}),orientation:v(()=>a.vertical?\"vertical\":\"horizontal\"),activation:v(()=>a.manual?\"manual\":\"auto\"),tabs:l,panels:r,setSelectedIndex(t){R.value!==t&&d(\"change\",t),p.value||y(t)},registerTab(t){var o;if(l.value.includes(t))return;let n=l.value[i.value];if(l.value.push(t),l.value=k(l.value,f),!p.value){let e=(o=l.value.indexOf(n))!=null?o:i.value;e!==-1&&(i.value=e)}},unregisterTab(t){let n=l.value.indexOf(t);n!==-1&&l.value.splice(n,1)},registerPanel(t){r.value.includes(t)||(r.value.push(t),r.value=k(r.value,f))},unregisterPanel(t){let n=r.value.indexOf(t);n!==-1&&r.value.splice(n,1)}};N(U,u);let T=P({tabs:[],panels:[]}),x=P(!1);F(()=>{x.value=!0}),N(G,v(()=>x.value?null:T.value));let w=v(()=>a.selectedIndex);return F(()=>{_([w],()=>{var t;return y((t=a.selectedIndex)!=null?t:a.defaultIndex)},{immediate:!0})}),J(()=>{if(!p.value||R.value==null||u.tabs.value.length<=0)return;let t=k(u.tabs.value,f);t.some((o,e)=>f(u.tabs.value[e])!==f(o))&&u.setSelectedIndex(t.findIndex(o=>f(o)===f(u.tabs.value[R.value])))}),()=>{let t={selectedIndex:i.value};return A(z,[l.value.length<=0&&A(V,{onFocus:()=>{for(let n of l.value){let o=f(n);if((o==null?void 0:o.tabIndex)===0)return o.focus(),!0}return!1}}),M({theirProps:{...s,...ee(a,[\"selectedIndex\",\"defaultIndex\",\"manual\",\"vertical\",\"onChange\"])},ourProps:{},slot:t,slots:b,attrs:s,name:\"TabGroup\"})])}}}),pe=L({name:\"TabList\",props:{as:{type:[Object,String],default:\"div\"}},setup(a,{attrs:b,slots:s}){let d=C(\"TabList\");return()=>{let i={selectedIndex:d.selectedIndex.value},l={role:\"tablist\",\"aria-orientation\":d.orientation.value};return M({ourProps:l,theirProps:a,slot:i,attrs:b,slots:s,name:\"TabList\"})}}}),xe=L({name:\"Tab\",props:{as:{type:[Object,String],default:\"button\"},disabled:{type:[Boolean],default:!1},id:{type:String,default:null}},setup(a,{attrs:b,slots:s,expose:d}){var o;let i=(o=a.id)!=null?o:`headlessui-tabs-tab-${$()}`,l=C(\"Tab\"),r=P(null);d({el:r,$el:r}),F(()=>l.registerTab(r)),K(()=>l.unregisterTab(r));let p=j(G),R=v(()=>{if(p.value){let e=p.value.tabs.indexOf(i);return e===-1?p.value.tabs.push(i)-1:e}return-1}),y=v(()=>{let e=l.tabs.value.indexOf(r);return e===-1?R.value:e}),u=v(()=>y.value===l.selectedIndex.value);function T(e){var I;let c=e();if(c===B.Success&&l.activation.value===\"auto\"){let m=(I=Z(r))==null?void 0:I.activeElement,h=l.tabs.value.findIndex(O=>f(O)===m);h!==-1&&l.setSelectedIndex(h)}return c}function x(e){let c=l.tabs.value.map(m=>f(m)).filter(Boolean);if(e.key===S.Space||e.key===S.Enter){e.preventDefault(),e.stopPropagation(),l.setSelectedIndex(y.value);return}switch(e.key){case S.Home:case S.PageUp:return e.preventDefault(),e.stopPropagation(),T(()=>D(c,g.First));case S.End:case S.PageDown:return e.preventDefault(),e.stopPropagation(),T(()=>D(c,g.Last))}if(T(()=>H(l.orientation.value,{vertical(){return e.key===S.ArrowUp?D(c,g.Previous|g.WrapAround):e.key===S.ArrowDown?D(c,g.Next|g.WrapAround):B.Error},horizontal(){return e.key===S.ArrowLeft?D(c,g.Previous|g.WrapAround):e.key===S.ArrowRight?D(c,g.Next|g.WrapAround):B.Error}}))===B.Success)return e.preventDefault()}let w=P(!1);function E(){var e;w.value||(w.value=!0,!a.disabled&&((e=f(r))==null||e.focus({preventScroll:!0}),l.setSelectedIndex(y.value),Y(()=>{w.value=!1})))}function t(e){e.preventDefault()}let n=Q(v(()=>({as:a.as,type:b.type})),r);return()=>{var m,h;let e={selected:u.value,disabled:(m=a.disabled)!=null?m:!1},{...c}=a,I={ref:r,onKeydown:x,onMousedown:t,onClick:E,id:i,role:\"tab\",type:n.value,\"aria-controls\":(h=f(l.panels.value[y.value]))==null?void 0:h.id,\"aria-selected\":u.value,tabIndex:u.value?0:-1,disabled:a.disabled?!0:void 0};return M({ourProps:I,theirProps:c,slot:e,attrs:b,slots:s,name:\"Tab\"})}}}),Ie=L({name:\"TabPanels\",props:{as:{type:[Object,String],default:\"div\"}},setup(a,{slots:b,attrs:s}){let d=C(\"TabPanels\");return()=>{let i={selectedIndex:d.selectedIndex.value};return M({theirProps:a,ourProps:{},slot:i,attrs:s,slots:b,name:\"TabPanels\"})}}}),ye=L({name:\"TabPanel\",props:{as:{type:[Object,String],default:\"div\"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:null},tabIndex:{type:Number,default:0}},setup(a,{attrs:b,slots:s,expose:d}){var T;let i=(T=a.id)!=null?T:`headlessui-tabs-panel-${$()}`,l=C(\"TabPanel\"),r=P(null);d({el:r,$el:r}),F(()=>l.registerPanel(r)),K(()=>l.unregisterPanel(r));let p=j(G),R=v(()=>{if(p.value){let x=p.value.panels.indexOf(i);return x===-1?p.value.panels.push(i)-1:x}return-1}),y=v(()=>{let x=l.panels.value.indexOf(r);return x===-1?R.value:x}),u=v(()=>y.value===l.selectedIndex.value);return()=>{var n;let x={selected:u.value},{tabIndex:w,...E}=a,t={ref:r,id:i,role:\"tabpanel\",\"aria-labelledby\":(n=f(l.tabs.value[y.value]))==null?void 0:n.id,tabIndex:u.value?w:-1};return!u.value&&a.unmount&&!a.static?A(X,{as:\"span\",\"aria-hidden\":!0,...t}):M({ourProps:t,theirProps:E,slot:x,attrs:b,slots:s,features:q.Static|q.RenderStrategy,visible:u.value,name:\"TabPanel\"})}}});export{xe as Tab,me as TabGroup,pe as TabList,ye as TabPanel,Ie as TabPanels};\n","function l(r){let e={called:!1};return(...t)=>{if(!e.called)return e.called=!0,r(...t)}}export{l as once};\n","import{disposables as p}from'../../../utils/disposables.js';import{once as f}from'../../../utils/once.js';function m(e,...t){e&&t.length>0&&e.classList.add(...t)}function d(e,...t){e&&t.length>0&&e.classList.remove(...t)}var g=(i=>(i.Finished=\"finished\",i.Cancelled=\"cancelled\",i))(g||{});function F(e,t){let i=p();if(!e)return i.dispose;let{transitionDuration:n,transitionDelay:a}=getComputedStyle(e),[l,s]=[n,a].map(o=>{let[u=0]=o.split(\",\").filter(Boolean).map(r=>r.includes(\"ms\")?parseFloat(r):parseFloat(r)*1e3).sort((r,c)=>c-r);return u});return l!==0?i.setTimeout(()=>t(\"finished\"),l+s):t(\"finished\"),i.add(()=>t(\"cancelled\")),i.dispose}function L(e,t,i,n,a,l){let s=p(),o=l!==void 0?f(l):()=>{};return d(e,...a),m(e,...t,...i),s.nextFrame(()=>{d(e,...i),m(e,...n),s.add(F(e,u=>(d(e,...n,...t),m(e,...a),o(u))))}),s.add(()=>d(e,...t,...i,...n,...a)),s.add(()=>o(\"cancelled\")),s.dispose}export{g as Reason,L as transition};\n","import{computed as w,defineComponent as K,h as k,inject as F,normalizeClass as ae,onMounted as C,onUnmounted as z,provide as B,ref as m,watch as le,watchEffect as x}from\"vue\";import{useId as ie}from'../../hooks/use-id.js';import{hasOpenClosed as se,State as u,useOpenClosed as oe,useOpenClosedProvider as ue}from'../../internal/open-closed.js';import{dom as $}from'../../utils/dom.js';import{env as fe}from'../../utils/env.js';import{match as O}from'../../utils/match.js';import{Features as de,omit as ve,render as q,RenderStrategy as T}from'../../utils/render.js';import{Reason as G,transition as J}from'./utils/transition.js';function g(e=\"\"){return e.split(/\\s+/).filter(t=>t.length>1)}let R=Symbol(\"TransitionContext\");var pe=(a=>(a.Visible=\"visible\",a.Hidden=\"hidden\",a))(pe||{});function me(){return F(R,null)!==null}function Te(){let e=F(R,null);if(e===null)throw new Error(\"A <TransitionChild /> is used but it is missing a parent <TransitionRoot />.\");return e}function ge(){let e=F(N,null);if(e===null)throw new Error(\"A <TransitionChild /> is used but it is missing a parent <TransitionRoot />.\");return e}let N=Symbol(\"NestingContext\");function L(e){return\"children\"in e?L(e.children):e.value.filter(({state:t})=>t===\"visible\").length>0}function Q(e){let t=m([]),a=m(!1);C(()=>a.value=!0),z(()=>a.value=!1);function s(n,r=T.Hidden){let l=t.value.findIndex(({id:f})=>f===n);l!==-1&&(O(r,{[T.Unmount](){t.value.splice(l,1)},[T.Hidden](){t.value[l].state=\"hidden\"}}),!L(t)&&a.value&&(e==null||e()))}function h(n){let r=t.value.find(({id:l})=>l===n);return r?r.state!==\"visible\"&&(r.state=\"visible\"):t.value.push({id:n,state:\"visible\"}),()=>s(n,T.Unmount)}return{children:t,register:h,unregister:s}}let W=de.RenderStrategy,he=K({props:{as:{type:[Object,String],default:\"div\"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:\"\"},enterFrom:{type:[String],default:\"\"},enterTo:{type:[String],default:\"\"},entered:{type:[String],default:\"\"},leave:{type:[String],default:\"\"},leaveFrom:{type:[String],default:\"\"},leaveTo:{type:[String],default:\"\"}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(e,{emit:t,attrs:a,slots:s,expose:h}){let n=m(0);function r(){n.value|=u.Opening,t(\"beforeEnter\")}function l(){n.value&=~u.Opening,t(\"afterEnter\")}function f(){n.value|=u.Closing,t(\"beforeLeave\")}function S(){n.value&=~u.Closing,t(\"afterLeave\")}if(!me()&&se())return()=>k(Se,{...e,onBeforeEnter:r,onAfterEnter:l,onBeforeLeave:f,onAfterLeave:S},s);let d=m(null),y=w(()=>e.unmount?T.Unmount:T.Hidden);h({el:d,$el:d});let{show:v,appear:A}=Te(),{register:D,unregister:H}=ge(),i=m(v.value?\"visible\":\"hidden\"),I={value:!0},c=ie(),b={value:!1},P=Q(()=>{!b.value&&i.value!==\"hidden\"&&(i.value=\"hidden\",H(c),S())});C(()=>{let o=D(c);z(o)}),x(()=>{if(y.value===T.Hidden&&c){if(v.value&&i.value!==\"visible\"){i.value=\"visible\";return}O(i.value,{[\"hidden\"]:()=>H(c),[\"visible\"]:()=>D(c)})}});let j=g(e.enter),M=g(e.enterFrom),X=g(e.enterTo),_=g(e.entered),Y=g(e.leave),Z=g(e.leaveFrom),ee=g(e.leaveTo);C(()=>{x(()=>{if(i.value===\"visible\"){let o=$(d);if(o instanceof Comment&&o.data===\"\")throw new Error(\"Did you forget to passthrough the `ref` to the actual DOM node?\")}})});function te(o){let E=I.value&&!A.value,p=$(d);!p||!(p instanceof HTMLElement)||E||(b.value=!0,v.value&&r(),v.value||f(),o(v.value?J(p,j,M,X,_,V=>{b.value=!1,V===G.Finished&&l()}):J(p,Y,Z,ee,_,V=>{b.value=!1,V===G.Finished&&(L(P)||(i.value=\"hidden\",H(c),S()))})))}return C(()=>{le([v],(o,E,p)=>{te(p),I.value=!1},{immediate:!0})}),B(N,P),ue(w(()=>O(i.value,{[\"visible\"]:u.Open,[\"hidden\"]:u.Closed})|n.value)),()=>{let{appear:o,show:E,enter:p,enterFrom:V,enterTo:Ce,entered:ye,leave:be,leaveFrom:Ee,leaveTo:Ve,...U}=e,ne={ref:d},re={...U,...A.value&&v.value&&fe.isServer?{class:ae([a.class,U.class,...j,...M])}:{}};return q({theirProps:re,ourProps:ne,slot:{},slots:s,attrs:a,features:W,visible:i.value===\"visible\",name:\"TransitionChild\"})}}}),ce=he,Se=K({inheritAttrs:!1,props:{as:{type:[Object,String],default:\"div\"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:\"\"},enterFrom:{type:[String],default:\"\"},enterTo:{type:[String],default:\"\"},entered:{type:[String],default:\"\"},leave:{type:[String],default:\"\"},leaveFrom:{type:[String],default:\"\"},leaveTo:{type:[String],default:\"\"}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(e,{emit:t,attrs:a,slots:s}){let h=oe(),n=w(()=>e.show===null&&h!==null?(h.value&u.Open)===u.Open:e.show);x(()=>{if(![!0,!1].includes(n.value))throw new Error('A <Transition /> is used but it is missing a `:show=\"true | false\"` prop.')});let r=m(n.value?\"visible\":\"hidden\"),l=Q(()=>{r.value=\"hidden\"}),f=m(!0),S={show:n,appear:w(()=>e.appear||!f.value)};return C(()=>{x(()=>{f.value=!1,n.value?r.value=\"visible\":L(l)||(r.value=\"hidden\")})}),B(N,l),B(R,S),()=>{let d=ve(e,[\"show\",\"appear\",\"unmount\",\"onBeforeEnter\",\"onBeforeLeave\",\"onAfterEnter\",\"onAfterLeave\"]),y={unmount:e.unmount};return q({ourProps:{...y,as:\"template\"},theirProps:{},slot:{},slots:{...s,default:()=>[k(ce,{onBeforeEnter:()=>t(\"beforeEnter\"),onAfterEnter:()=>t(\"afterEnter\"),onBeforeLeave:()=>t(\"beforeLeave\"),onAfterLeave:()=>t(\"afterLeave\"),...a,...y,...d},s.default)]},attrs:{},features:W,visible:r.value===\"visible\",name:\"Transition\"})}}});export{he as TransitionChild,Se as TransitionRoot};\n","<script setup>\r\nimport { ref, computed, watch, useSlots } from \"vue\";\r\nimport { TransitionRoot, TransitionChild, Dialog, DialogPanel, DialogTitle } from \"@headlessui/vue\";\r\nimport FhButton from \"../components/FhButton.vue\";\r\nimport FhIcon from \"../components/FhIcon.vue\";\r\nimport FhWysiwyg from \"../includes/FhWysiwyg.vue\";\r\n\r\nconst props = defineProps({\r\n  isOpen: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  wide: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:isOpen\", \"open\", \"close\", \"afterEnter\", \"afterLeave\"]);\r\n\r\nconst _isOpen = ref(props.isOpen);\r\n\r\nwatch(\r\n  () => props.isOpen,\r\n  (val) => (_isOpen.value = val)\r\n);\r\n\r\nwatch(_isOpen, (val) => {\r\n  emit(\"update:isOpen\", val);\r\n  emit(val ? \"open\" : \"close\");\r\n});\r\n\r\nconst slots = useSlots();\r\nconst bodySlotName = computed(() => (slots.body ? \"body\" : \"default\"));\r\nconst hasFooter = computed(() => props.data.ctaText || slots.footer);\r\n\r\nconst window = ref(null);\r\n\r\nfunction open() {\r\n  _isOpen.value = true;\r\n}\r\n\r\nfunction close() {\r\n  _isOpen.value = false;\r\n}\r\n\r\ndefineExpose({ window, open, close });\r\n</script>\r\n\r\n<template>\r\n  <slot name=\"activator\" :open=\"open\"></slot>\r\n  <TransitionRoot appear :show=\"_isOpen\" as=\"template\" @after-enter=\"emit('afterEnter')\" @after-leave=\"emit('afterLeave')\">\r\n    <Dialog as=\"div\" class=\"relative z-body-modal\" @close=\"close\">\r\n      <TransitionChild\r\n        as=\"template\"\r\n        enter=\"duration-300 ease-out\"\r\n        enter-from=\"opacity-0\"\r\n        enter-to=\"opacity-100\"\r\n        leave=\"duration-200 ease-in\"\r\n        leave-from=\"opacity-100\"\r\n        leave-to=\"opacity-0\"\r\n      >\r\n        <div class=\"fixed inset-0 bg-neutral-opacity-60\" aria-hidden=\"true\"></div>\r\n      </TransitionChild>\r\n\r\n      <div ref=\"window\" class=\"fixed inset-0 flex items-center justify-center overflow-y-auto md:py-10\">\r\n        <TransitionChild\r\n          as=\"template\"\r\n          enter=\"duration-300 ease-out\"\r\n          enter-from=\"opacity-0 scale-95\"\r\n          enter-to=\"opacity-100 scale-100\"\r\n          leave=\"duration-200 ease-in\"\r\n          leave-from=\"opacity-100 scale-100\"\r\n          leave-to=\"opacity-0 scale-95\"\r\n        >\r\n          <DialogPanel\r\n            name=\"wrapper\"\r\n            class=\"my-auto mx-0 flex min-h-[var(--100vh)] w-full flex-col bg-white px-4 py-8 transition-all md:h-auto md:min-h-[20rem] md:px-10 md:pb-10 overflow-x-auto\"\r\n            :class=\"[props.wide ? 'md:max-w-screen-md' : 'md:max-w-[34rem]']\"\r\n          >\r\n            <!-- CLOSE BUTTON -->\r\n            <div class=\"mb-f4 flex justify-end\">\r\n              <FhButton size=\"small\" variant=\"round\" class=\"relative md:-right-2\" aria-label=\"Close Modal\" @click=\"close\">\r\n                <FhIcon name=\"XIcon\" class=\"!text-2xl\" />\r\n              </FhButton>\r\n            </div>\r\n            <!-- TITLE -->\r\n            <DialogTitle v-if=\"data.heading\" as=\"h2\" class=\"mb-f5 flex flex-col gap-f1\">\r\n              <span class=\"font-serif text-f-3xl-5xl\">{{ data.heading }}</span>\r\n              <div v-if=\"data.subheading\">{{ data.subheading }}</div>\r\n            </DialogTitle>\r\n            <!-- BODY -->\r\n            <div class=\"mb-f3 grow\">\r\n              <slot :name=\"bodySlotName\">\r\n                <FhWysiwyg v-if=\"data.copy\" :content=\"data.copy\" spacing />\r\n              </slot>\r\n            </div>\r\n            <!-- FOOTER -->\r\n            <div v-if=\"hasFooter\" class=\"modal__footer md mt-f3 flex flex-col gap-f2 md:flex-row-reverse md:items-center md:justify-start\">\r\n              <slot name=\"footer\" :close=\"close\">\r\n                <FhButton\r\n                  color=\"primary\"\r\n                  :href=\"data.ctaURL\"\r\n                  :target=\"data.ctaTarget\"\r\n                  :aria-label=\"data.ctaAriaLabel\"\r\n                  :download=\"data.ctaDownload\"\r\n                  :title=\"data.ctaText\"\r\n                >\r\n                  {{ data.ctaText }}\r\n                </FhButton>\r\n              </slot>\r\n            </div>\r\n          </DialogPanel>\r\n        </TransitionChild>\r\n      </div>\r\n    </Dialog>\r\n  </TransitionRoot>\r\n</template>\r\n\r\n<style scoped>\r\n.modal__footer:deep :where(.btn--text, .btn--link) {\r\n  @apply md:mx-f2;\r\n}\r\n</style>\r\n","import { isRef, watch, onMounted, onBeforeUnmount, unref, ref, reactive, nextTick, toRefs, openBlock, createElementBlock, useCssVars, useSlots, computed, watchEffect, normalizeStyle, createElementVNode, withKeys, renderSlot, createVNode, Transition, withCtx, withDirectives, createTextVNode, toDisplayString, createBlock, createCommentVNode, vShow } from 'vue';\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing. The function also has a property 'clear' \n * that is a function which will clear the timer to prevent previously scheduled executions. \n *\n * @source underscore.js\n * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/\n * @param {Function} function to wrap\n * @param {Number} timeout in ms (`100`)\n * @param {Boolean} whether to execute at the beginning (`false`)\n * @api public\n */\nfunction debounce$1(func, wait, immediate){\n  var timeout, args, context, timestamp, result;\n  if (null == wait) wait = 100;\n\n  function later() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n    }\n  }\n  var debounced = function(){\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n\n  debounced.clear = function() {\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = null;\n    }\n  };\n  \n  debounced.flush = function() {\n    if (timeout) {\n      result = func.apply(context, args);\n      context = args = null;\n      \n      clearTimeout(timeout);\n      timeout = null;\n    }\n  };\n\n  return debounced;\n}\n// Adds compatibility for ES modules\ndebounce$1.debounce = debounce$1;\n\nvar debounce_1 = debounce$1;\n\nfunction useEventListener(target, event, handler) {\n  if (isRef(target)) {\n    watch(target, (value, oldValue) => {\n      oldValue === null || oldValue === void 0 ? void 0 : oldValue.removeEventListener(event, handler);\n      value === null || value === void 0 ? void 0 : value.addEventListener(event, handler);\n    });\n  } else {\n    onMounted(() => {\n      target.addEventListener(event, handler);\n    });\n  }\n\n  onBeforeUnmount(() => {\n    var _unref;\n\n    (_unref = unref(target)) === null || _unref === void 0 ? void 0 : _unref.removeEventListener(event, handler);\n  });\n}\n\nfunction useClickAway(target, handler) {\n  const event = \"pointerdown\";\n\n  if (typeof window === 'undefined' || !window) {\n    return;\n  }\n\n  const listener = event => {\n    const el = unref(target);\n\n    if (!el) {\n      return;\n    }\n\n    if (el === event.target || event.composedPath().includes(el)) {\n      return;\n    }\n\n    handler(event);\n  };\n\n  return useEventListener(window, event, listener);\n}\n\nfunction useContent(slots, popperNode, content) {\n  let observer = null;\n  const hasContent = ref(false);\n  onMounted(() => {\n    if (slots.content !== undefined || content.value) {\n      hasContent.value = true;\n    }\n\n    observer = new MutationObserver(checkContent);\n    observer.observe(popperNode.value, {\n      childList: true,\n      subtree: true\n    });\n  });\n  onBeforeUnmount(() => observer.disconnect());\n  /**\n   * Watch the content prop\n   */\n\n  watch(content, content => {\n    if (content) {\n      hasContent.value = true;\n    } else {\n      hasContent.value = false;\n    }\n  });\n  /**\n   * Check the content slot\n   */\n\n  const checkContent = () => {\n    if (slots.content) {\n      hasContent.value = true;\n    } else {\n      hasContent.value = false;\n    }\n  };\n\n  return {\n    hasContent\n  };\n}\n\n// import { isHTMLElement } from './instanceOf';\nfunction getBoundingClientRect(element, // eslint-disable-next-line unused-imports/no-unused-vars\nincludeScale) {\n\n  var rect = element.getBoundingClientRect();\n  var scaleX = 1;\n  var scaleY = 1; // FIXME:\n  // `offsetWidth` returns an integer while `getBoundingClientRect`\n  // returns a float. This results in `scaleX` or `scaleY` being\n  // non-1 when it should be for elements that aren't a full pixel in\n  // width or height.\n  // if (isHTMLElement(element) && includeScale) {\n  //   const offsetHeight = element.offsetHeight;\n  //   const offsetWidth = element.offsetWidth;\n  //   // Do not attempt to divide by 0, otherwise we get `Infinity` as scale\n  //   // Fallback to 1 in case both values are `0`\n  //   if (offsetWidth > 0) {\n  //     scaleX = rect.width / offsetWidth || 1;\n  //   }\n  //   if (offsetHeight > 0) {\n  //     scaleY = rect.height / offsetHeight || 1;\n  //   }\n  // }\n\n  return {\n    width: rect.width / scaleX,\n    height: rect.height / scaleY,\n    top: rect.top / scaleY,\n    right: rect.right / scaleX,\n    bottom: rect.bottom / scaleY,\n    left: rect.left / scaleX,\n    x: rect.left / scaleX,\n    y: rect.top / scaleY\n  };\n}\n\nfunction getWindow(node) {\n  if (node == null) {\n    return window;\n  }\n\n  if (node.toString() !== '[object Window]') {\n    var ownerDocument = node.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView || window : window;\n  }\n\n  return node;\n}\n\nfunction getWindowScroll(node) {\n  var win = getWindow(node);\n  var scrollLeft = win.pageXOffset;\n  var scrollTop = win.pageYOffset;\n  return {\n    scrollLeft: scrollLeft,\n    scrollTop: scrollTop\n  };\n}\n\nfunction isElement(node) {\n  var OwnElement = getWindow(node).Element;\n  return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n  var OwnElement = getWindow(node).HTMLElement;\n  return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n  // IE 11 has no ShadowRoot\n  if (typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n\n  var OwnElement = getWindow(node).ShadowRoot;\n  return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nfunction getHTMLElementScroll(element) {\n  return {\n    scrollLeft: element.scrollLeft,\n    scrollTop: element.scrollTop\n  };\n}\n\nfunction getNodeScroll(node) {\n  if (node === getWindow(node) || !isHTMLElement(node)) {\n    return getWindowScroll(node);\n  } else {\n    return getHTMLElementScroll(node);\n  }\n}\n\nfunction getNodeName(element) {\n  return element ? (element.nodeName || '').toLowerCase() : null;\n}\n\nfunction getDocumentElement(element) {\n  // $FlowFixMe[incompatible-return]: assume body is always available\n  return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n  element.document) || window.document).documentElement;\n}\n\nfunction getWindowScrollBarX(element) {\n  // If <html> has a CSS width greater than the viewport, then this will be\n  // incorrect for RTL.\n  // Popper 1 is broken in this case and never had a bug report so let's assume\n  // it's not an issue. I don't think anyone ever specifies width on <html>\n  // anyway.\n  // Browsers where the left scrollbar doesn't cause an issue report `0` for\n  // this (e.g. Edge 2019, IE11, Safari)\n  return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}\n\nfunction getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}\n\nfunction isScrollParent(element) {\n  // Firefox wants us to check `-x` and `-y` variations as well\n  var _getComputedStyle = getComputedStyle(element),\n      overflow = _getComputedStyle.overflow,\n      overflowX = _getComputedStyle.overflowX,\n      overflowY = _getComputedStyle.overflowY;\n\n  return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}\n\nfunction isElementScaled(element) {\n  var rect = element.getBoundingClientRect();\n  var scaleX = rect.width / element.offsetWidth || 1;\n  var scaleY = rect.height / element.offsetHeight || 1;\n  return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nfunction getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n\n  var isOffsetParentAnElement = isHTMLElement(offsetParent);\n  isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n  var documentElement = getDocumentElement(offsetParent);\n  var rect = getBoundingClientRect(elementOrVirtualElement);\n  var scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  var offsets = {\n    x: 0,\n    y: 0\n  };\n\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n    isScrollParent(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n\n    if (isHTMLElement(offsetParent)) {\n      offsets = getBoundingClientRect(offsetParent);\n      offsets.x += offsetParent.clientLeft;\n      offsets.y += offsetParent.clientTop;\n    } else if (documentElement) {\n      offsets.x = getWindowScrollBarX(documentElement);\n    }\n  }\n\n  return {\n    x: rect.left + scroll.scrollLeft - offsets.x,\n    y: rect.top + scroll.scrollTop - offsets.y,\n    width: rect.width,\n    height: rect.height\n  };\n}\n\n// means it doesn't take into account transforms.\n\nfunction getLayoutRect(element) {\n  var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n  // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n  var width = element.offsetWidth;\n  var height = element.offsetHeight;\n\n  if (Math.abs(clientRect.width - width) <= 1) {\n    width = clientRect.width;\n  }\n\n  if (Math.abs(clientRect.height - height) <= 1) {\n    height = clientRect.height;\n  }\n\n  return {\n    x: element.offsetLeft,\n    y: element.offsetTop,\n    width: width,\n    height: height\n  };\n}\n\nfunction getParentNode(element) {\n  if (getNodeName(element) === 'html') {\n    return element;\n  }\n\n  return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n    // $FlowFixMe[incompatible-return]\n    // $FlowFixMe[prop-missing]\n    element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n    element.parentNode || ( // DOM Element detected\n    isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n    // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n    getDocumentElement(element) // fallback\n\n  );\n}\n\nfunction getScrollParent(node) {\n  if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n    // $FlowFixMe[incompatible-return]: assume body is always available\n    return node.ownerDocument.body;\n  }\n\n  if (isHTMLElement(node) && isScrollParent(node)) {\n    return node;\n  }\n\n  return getScrollParent(getParentNode(node));\n}\n\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nfunction listScrollParents(element, list) {\n  var _element$ownerDocumen;\n\n  if (list === void 0) {\n    list = [];\n  }\n\n  var scrollParent = getScrollParent(element);\n  var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n  var win = getWindow(scrollParent);\n  var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n  var updatedList = list.concat(target);\n  return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n  updatedList.concat(listScrollParents(getParentNode(target)));\n}\n\nfunction isTableElement(element) {\n  return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}\n\nfunction getTrueOffsetParent(element) {\n  if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n  getComputedStyle(element).position === 'fixed') {\n    return null;\n  }\n\n  return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n  var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n  var isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n  if (isIE && isHTMLElement(element)) {\n    // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n    var elementCss = getComputedStyle(element);\n\n    if (elementCss.position === 'fixed') {\n      return null;\n    }\n  }\n\n  var currentNode = getParentNode(element);\n\n  while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n    var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n    // create a containing block.\n    // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n    if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n      return currentNode;\n    } else {\n      currentNode = currentNode.parentNode;\n    }\n  }\n\n  return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nfunction getOffsetParent(element) {\n  var window = getWindow(element);\n  var offsetParent = getTrueOffsetParent(element);\n\n  while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n    offsetParent = getTrueOffsetParent(offsetParent);\n  }\n\n  if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n    return window;\n  }\n\n  return offsetParent || getContainingBlock(element) || window;\n}\n\nvar top = 'top';\nvar bottom = 'bottom';\nvar right = 'right';\nvar left = 'left';\nvar auto = 'auto';\nvar basePlacements = [top, bottom, right, left];\nvar start = 'start';\nvar end = 'end';\nvar clippingParents = 'clippingParents';\nvar viewport = 'viewport';\nvar popper = 'popper';\nvar reference = 'reference';\nvar variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n  return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nvar placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n  return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nvar beforeRead = 'beforeRead';\nvar read = 'read';\nvar afterRead = 'afterRead'; // pure-logic modifiers\n\nvar beforeMain = 'beforeMain';\nvar main = 'main';\nvar afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nvar beforeWrite = 'beforeWrite';\nvar write = 'write';\nvar afterWrite = 'afterWrite';\nvar modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];\n\nfunction order(modifiers) {\n  var map = new Map();\n  var visited = new Set();\n  var result = [];\n  modifiers.forEach(function (modifier) {\n    map.set(modifier.name, modifier);\n  }); // On visiting object, check for its dependencies and visit them recursively\n\n  function sort(modifier) {\n    visited.add(modifier.name);\n    var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n    requires.forEach(function (dep) {\n      if (!visited.has(dep)) {\n        var depModifier = map.get(dep);\n\n        if (depModifier) {\n          sort(depModifier);\n        }\n      }\n    });\n    result.push(modifier);\n  }\n\n  modifiers.forEach(function (modifier) {\n    if (!visited.has(modifier.name)) {\n      // check for visited object\n      sort(modifier);\n    }\n  });\n  return result;\n}\n\nfunction orderModifiers(modifiers) {\n  // order based on dependencies\n  var orderedModifiers = order(modifiers); // order based on phase\n\n  return modifierPhases.reduce(function (acc, phase) {\n    return acc.concat(orderedModifiers.filter(function (modifier) {\n      return modifier.phase === phase;\n    }));\n  }, []);\n}\n\nfunction debounce(fn) {\n  var pending;\n  return function () {\n    if (!pending) {\n      pending = new Promise(function (resolve) {\n        Promise.resolve().then(function () {\n          pending = undefined;\n          resolve(fn());\n        });\n      });\n    }\n\n    return pending;\n  };\n}\n\nfunction getBasePlacement(placement) {\n  return placement.split('-')[0];\n}\n\nfunction mergeByName(modifiers) {\n  var merged = modifiers.reduce(function (merged, current) {\n    var existing = merged[current.name];\n    merged[current.name] = existing ? Object.assign({}, existing, current, {\n      options: Object.assign({}, existing.options, current.options),\n      data: Object.assign({}, existing.data, current.data)\n    }) : current;\n    return merged;\n  }, {}); // IE11 does not support Object.values\n\n  return Object.keys(merged).map(function (key) {\n    return merged[key];\n  });\n}\n\nfunction getViewportRect(element) {\n  var win = getWindow(element);\n  var html = getDocumentElement(element);\n  var visualViewport = win.visualViewport;\n  var width = html.clientWidth;\n  var height = html.clientHeight;\n  var x = 0;\n  var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n  // can be obscured underneath it.\n  // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n  // if it isn't open, so if this isn't available, the popper will be detected\n  // to overflow the bottom of the screen too early.\n\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n    // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n    // errors due to floating point numbers, so we need to check precision.\n    // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n    // Feature detection fails in mobile emulation mode in Chrome.\n    // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n    // 0.001\n    // Fallback here: \"Not Safari\" userAgent\n\n    if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x + getWindowScrollBarX(element),\n    y: y\n  };\n}\n\nvar max = Math.max;\nvar min = Math.min;\nvar round = Math.round;\n\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nfunction getDocumentRect(element) {\n  var _element$ownerDocumen;\n\n  var html = getDocumentElement(element);\n  var winScroll = getWindowScroll(element);\n  var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n  var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n  var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n  var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n  var y = -winScroll.scrollTop;\n\n  if (getComputedStyle(body || html).direction === 'rtl') {\n    x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x,\n    y: y\n  };\n}\n\nfunction contains(parent, child) {\n  var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n  if (parent.contains(child)) {\n    return true;\n  } // then fallback to custom implementation with Shadow DOM support\n  else if (rootNode && isShadowRoot(rootNode)) {\n      var next = child;\n\n      do {\n        if (next && parent.isSameNode(next)) {\n          return true;\n        } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n        next = next.parentNode || next.host;\n      } while (next);\n    } // Give up, the result is false\n\n\n  return false;\n}\n\nfunction rectToClientRect(rect) {\n  return Object.assign({}, rect, {\n    left: rect.x,\n    top: rect.y,\n    right: rect.x + rect.width,\n    bottom: rect.y + rect.height\n  });\n}\n\nfunction getInnerBoundingClientRect(element) {\n  var rect = getBoundingClientRect(element);\n  rect.top = rect.top + element.clientTop;\n  rect.left = rect.left + element.clientLeft;\n  rect.bottom = rect.top + element.clientHeight;\n  rect.right = rect.left + element.clientWidth;\n  rect.width = element.clientWidth;\n  rect.height = element.clientHeight;\n  rect.x = rect.left;\n  rect.y = rect.top;\n  return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n  return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n  var clippingParents = listScrollParents(getParentNode(element));\n  var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n  var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n  if (!isElement(clipperElement)) {\n    return [];\n  } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n  return clippingParents.filter(function (clippingParent) {\n    return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n  });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nfunction getClippingRect(element, boundary, rootBoundary) {\n  var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n  var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n  var firstClippingParent = clippingParents[0];\n  var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n    var rect = getClientRectFromMixedType(element, clippingParent);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromMixedType(element, firstClippingParent));\n  clippingRect.width = clippingRect.right - clippingRect.left;\n  clippingRect.height = clippingRect.bottom - clippingRect.top;\n  clippingRect.x = clippingRect.left;\n  clippingRect.y = clippingRect.top;\n  return clippingRect;\n}\n\nfunction getVariation(placement) {\n  return placement.split('-')[1];\n}\n\nfunction getMainAxisFromPlacement(placement) {\n  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}\n\nfunction computeOffsets(_ref) {\n  var reference = _ref.reference,\n      element = _ref.element,\n      placement = _ref.placement;\n  var basePlacement = placement ? getBasePlacement(placement) : null;\n  var variation = placement ? getVariation(placement) : null;\n  var commonX = reference.x + reference.width / 2 - element.width / 2;\n  var commonY = reference.y + reference.height / 2 - element.height / 2;\n  var offsets;\n\n  switch (basePlacement) {\n    case top:\n      offsets = {\n        x: commonX,\n        y: reference.y - element.height\n      };\n      break;\n\n    case bottom:\n      offsets = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n\n    case right:\n      offsets = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n\n    case left:\n      offsets = {\n        x: reference.x - element.width,\n        y: commonY\n      };\n      break;\n\n    default:\n      offsets = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n\n  var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n  if (mainAxis != null) {\n    var len = mainAxis === 'y' ? 'height' : 'width';\n\n    switch (variation) {\n      case start:\n        offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n        break;\n\n      case end:\n        offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n        break;\n    }\n  }\n\n  return offsets;\n}\n\nfunction getFreshSideObject() {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  };\n}\n\nfunction mergePaddingObject(paddingObject) {\n  return Object.assign({}, getFreshSideObject(), paddingObject);\n}\n\nfunction expandToHashMap(value, keys) {\n  return keys.reduce(function (hashMap, key) {\n    hashMap[key] = value;\n    return hashMap;\n  }, {});\n}\n\nfunction detectOverflow(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      _options$placement = _options.placement,\n      placement = _options$placement === void 0 ? state.placement : _options$placement,\n      _options$boundary = _options.boundary,\n      boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n      _options$rootBoundary = _options.rootBoundary,\n      rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n      _options$elementConte = _options.elementContext,\n      elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n      _options$altBoundary = _options.altBoundary,\n      altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n      _options$padding = _options.padding,\n      padding = _options$padding === void 0 ? 0 : _options$padding;\n  var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n  var altContext = elementContext === popper ? reference : popper;\n  var popperRect = state.rects.popper;\n  var element = state.elements[altBoundary ? altContext : elementContext];\n  var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n  var referenceClientRect = getBoundingClientRect(state.elements.reference);\n  var popperOffsets = computeOffsets({\n    reference: referenceClientRect,\n    element: popperRect,\n    strategy: 'absolute',\n    placement: placement\n  });\n  var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n  var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n  // 0 or negative = within the clipping rect\n\n  var overflowOffsets = {\n    top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n    bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n    left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n    right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n  };\n  var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n  if (elementContext === popper && offsetData) {\n    var offset = offsetData[placement];\n    Object.keys(overflowOffsets).forEach(function (key) {\n      var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n      var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n      overflowOffsets[key] += offset[axis] * multiply;\n    });\n  }\n\n  return overflowOffsets;\n}\n\nvar DEFAULT_OPTIONS = {\n  placement: 'bottom',\n  modifiers: [],\n  strategy: 'absolute'\n};\n\nfunction areValidElements() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  return !args.some(function (element) {\n    return !(element && typeof element.getBoundingClientRect === 'function');\n  });\n}\n\nfunction popperGenerator(generatorOptions) {\n  if (generatorOptions === void 0) {\n    generatorOptions = {};\n  }\n\n  var _generatorOptions = generatorOptions,\n      _generatorOptions$def = _generatorOptions.defaultModifiers,\n      defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n      _generatorOptions$def2 = _generatorOptions.defaultOptions,\n      defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n  return function createPopper(reference, popper, options) {\n    if (options === void 0) {\n      options = defaultOptions;\n    }\n\n    var state = {\n      placement: 'bottom',\n      orderedModifiers: [],\n      options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n      modifiersData: {},\n      elements: {\n        reference: reference,\n        popper: popper\n      },\n      attributes: {},\n      styles: {}\n    };\n    var effectCleanupFns = [];\n    var isDestroyed = false;\n    var instance = {\n      state: state,\n      setOptions: function setOptions(setOptionsAction) {\n        var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n        cleanupModifierEffects();\n        state.options = Object.assign({}, defaultOptions, state.options, options);\n        state.scrollParents = {\n          reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n          popper: listScrollParents(popper)\n        }; // Orders the modifiers based on their dependencies and `phase`\n        // properties\n\n        var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n        state.orderedModifiers = orderedModifiers.filter(function (m) {\n          return m.enabled;\n        }); // Validate the provided modifiers so that the consumer will get warned\n\n        runModifierEffects();\n        return instance.update();\n      },\n      // Sync update – it will always be executed, even if not necessary. This\n      // is useful for low frequency updates where sync behavior simplifies the\n      // logic.\n      // For high frequency updates (e.g. `resize` and `scroll` events), always\n      // prefer the async Popper#update method\n      forceUpdate: function forceUpdate() {\n        if (isDestroyed) {\n          return;\n        }\n\n        var _state$elements = state.elements,\n            reference = _state$elements.reference,\n            popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n        // anymore\n\n        if (!areValidElements(reference, popper)) {\n\n          return;\n        } // Store the reference and popper rects to be read by modifiers\n\n\n        state.rects = {\n          reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n          popper: getLayoutRect(popper)\n        }; // Modifiers have the ability to reset the current update cycle. The\n        // most common use case for this is the `flip` modifier changing the\n        // placement, which then needs to re-run all the modifiers, because the\n        // logic was previously ran for the previous placement and is therefore\n        // stale/incorrect\n\n        state.reset = false;\n        state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n        // is filled with the initial data specified by the modifier. This means\n        // it doesn't persist and is fresh on each update.\n        // To ensure persistent data, use `${name}#persistent`\n\n        state.orderedModifiers.forEach(function (modifier) {\n          return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n        });\n\n        for (var index = 0; index < state.orderedModifiers.length; index++) {\n\n          if (state.reset === true) {\n            state.reset = false;\n            index = -1;\n            continue;\n          }\n\n          var _state$orderedModifie = state.orderedModifiers[index],\n              fn = _state$orderedModifie.fn,\n              _state$orderedModifie2 = _state$orderedModifie.options,\n              _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n              name = _state$orderedModifie.name;\n\n          if (typeof fn === 'function') {\n            state = fn({\n              state: state,\n              options: _options,\n              name: name,\n              instance: instance\n            }) || state;\n          }\n        }\n      },\n      // Async and optimistically optimized update – it will not be executed if\n      // not necessary (debounced to run at most once-per-tick)\n      update: debounce(function () {\n        return new Promise(function (resolve) {\n          instance.forceUpdate();\n          resolve(state);\n        });\n      }),\n      destroy: function destroy() {\n        cleanupModifierEffects();\n        isDestroyed = true;\n      }\n    };\n\n    if (!areValidElements(reference, popper)) {\n\n      return instance;\n    }\n\n    instance.setOptions(options).then(function (state) {\n      if (!isDestroyed && options.onFirstUpdate) {\n        options.onFirstUpdate(state);\n      }\n    }); // Modifiers have the ability to execute arbitrary code before the first\n    // update cycle runs. They will be executed in the same order as the update\n    // cycle. This is useful when a modifier adds some persistent data that\n    // other modifiers need to use, but the modifier is run after the dependent\n    // one.\n\n    function runModifierEffects() {\n      state.orderedModifiers.forEach(function (_ref3) {\n        var name = _ref3.name,\n            _ref3$options = _ref3.options,\n            options = _ref3$options === void 0 ? {} : _ref3$options,\n            effect = _ref3.effect;\n\n        if (typeof effect === 'function') {\n          var cleanupFn = effect({\n            state: state,\n            name: name,\n            instance: instance,\n            options: options\n          });\n\n          var noopFn = function noopFn() {};\n\n          effectCleanupFns.push(cleanupFn || noopFn);\n        }\n      });\n    }\n\n    function cleanupModifierEffects() {\n      effectCleanupFns.forEach(function (fn) {\n        return fn();\n      });\n      effectCleanupFns = [];\n    }\n\n    return instance;\n  };\n}\n\nvar passive = {\n  passive: true\n};\n\nfunction effect$2(_ref) {\n  var state = _ref.state,\n      instance = _ref.instance,\n      options = _ref.options;\n  var _options$scroll = options.scroll,\n      scroll = _options$scroll === void 0 ? true : _options$scroll,\n      _options$resize = options.resize,\n      resize = _options$resize === void 0 ? true : _options$resize;\n  var window = getWindow(state.elements.popper);\n  var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n  if (scroll) {\n    scrollParents.forEach(function (scrollParent) {\n      scrollParent.addEventListener('scroll', instance.update, passive);\n    });\n  }\n\n  if (resize) {\n    window.addEventListener('resize', instance.update, passive);\n  }\n\n  return function () {\n    if (scroll) {\n      scrollParents.forEach(function (scrollParent) {\n        scrollParent.removeEventListener('scroll', instance.update, passive);\n      });\n    }\n\n    if (resize) {\n      window.removeEventListener('resize', instance.update, passive);\n    }\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar eventListeners = {\n  name: 'eventListeners',\n  enabled: true,\n  phase: 'write',\n  fn: function fn() {},\n  effect: effect$2,\n  data: {}\n};\n\nfunction popperOffsets(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  // Offsets are the actual position the popper needs to have to be\n  // properly positioned near its reference element\n  // This is the most basic placement, and will be adjusted by\n  // the modifiers in the next step\n  state.modifiersData[name] = computeOffsets({\n    reference: state.rects.reference,\n    element: state.rects.popper,\n    strategy: 'absolute',\n    placement: state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar popperOffsets$1 = {\n  name: 'popperOffsets',\n  enabled: true,\n  phase: 'read',\n  fn: popperOffsets,\n  data: {}\n};\n\nvar unsetSides = {\n  top: 'auto',\n  right: 'auto',\n  bottom: 'auto',\n  left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref) {\n  var x = _ref.x,\n      y = _ref.y;\n  var win = window;\n  var dpr = win.devicePixelRatio || 1;\n  return {\n    x: round(round(x * dpr) / dpr) || 0,\n    y: round(round(y * dpr) / dpr) || 0\n  };\n}\n\nfunction mapToStyles(_ref2) {\n  var _Object$assign2;\n\n  var popper = _ref2.popper,\n      popperRect = _ref2.popperRect,\n      placement = _ref2.placement,\n      variation = _ref2.variation,\n      offsets = _ref2.offsets,\n      position = _ref2.position,\n      gpuAcceleration = _ref2.gpuAcceleration,\n      adaptive = _ref2.adaptive,\n      roundOffsets = _ref2.roundOffsets;\n\n  var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,\n      _ref3$x = _ref3.x,\n      x = _ref3$x === void 0 ? 0 : _ref3$x,\n      _ref3$y = _ref3.y,\n      y = _ref3$y === void 0 ? 0 : _ref3$y;\n\n  var hasX = offsets.hasOwnProperty('x');\n  var hasY = offsets.hasOwnProperty('y');\n  var sideX = left;\n  var sideY = top;\n  var win = window;\n\n  if (adaptive) {\n    var offsetParent = getOffsetParent(popper);\n    var heightProp = 'clientHeight';\n    var widthProp = 'clientWidth';\n\n    if (offsetParent === getWindow(popper)) {\n      offsetParent = getDocumentElement(popper);\n\n      if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n        heightProp = 'scrollHeight';\n        widthProp = 'scrollWidth';\n      }\n    } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n    offsetParent = offsetParent;\n\n    if (placement === top || (placement === left || placement === right) && variation === end) {\n      sideY = bottom; // $FlowFixMe[prop-missing]\n\n      y -= offsetParent[heightProp] - popperRect.height;\n      y *= gpuAcceleration ? 1 : -1;\n    }\n\n    if (placement === left || (placement === top || placement === bottom) && variation === end) {\n      sideX = right; // $FlowFixMe[prop-missing]\n\n      x -= offsetParent[widthProp] - popperRect.width;\n      x *= gpuAcceleration ? 1 : -1;\n    }\n  }\n\n  var commonStyles = Object.assign({\n    position: position\n  }, adaptive && unsetSides);\n\n  if (gpuAcceleration) {\n    var _Object$assign;\n\n    return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n  }\n\n  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref4) {\n  var state = _ref4.state,\n      options = _ref4.options;\n  var _options$gpuAccelerat = options.gpuAcceleration,\n      gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n      _options$adaptive = options.adaptive,\n      adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n      _options$roundOffsets = options.roundOffsets,\n      roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n  var commonStyles = {\n    placement: getBasePlacement(state.placement),\n    variation: getVariation(state.placement),\n    popper: state.elements.popper,\n    popperRect: state.rects.popper,\n    gpuAcceleration: gpuAcceleration\n  };\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.popperOffsets,\n      position: state.options.strategy,\n      adaptive: adaptive,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  if (state.modifiersData.arrow != null) {\n    state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.arrow,\n      position: 'absolute',\n      adaptive: false,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-placement': state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar computeStyles$1 = {\n  name: 'computeStyles',\n  enabled: true,\n  phase: 'beforeWrite',\n  fn: computeStyles,\n  data: {}\n};\n\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n  var state = _ref.state;\n  Object.keys(state.elements).forEach(function (name) {\n    var style = state.styles[name] || {};\n    var attributes = state.attributes[name] || {};\n    var element = state.elements[name]; // arrow is optional + virtual elements\n\n    if (!isHTMLElement(element) || !getNodeName(element)) {\n      return;\n    } // Flow doesn't support to extend this property, but it's the most\n    // effective way to apply styles to an HTMLElement\n    // $FlowFixMe[cannot-write]\n\n\n    Object.assign(element.style, style);\n    Object.keys(attributes).forEach(function (name) {\n      var value = attributes[name];\n\n      if (value === false) {\n        element.removeAttribute(name);\n      } else {\n        element.setAttribute(name, value === true ? '' : value);\n      }\n    });\n  });\n}\n\nfunction effect$1(_ref2) {\n  var state = _ref2.state;\n  var initialStyles = {\n    popper: {\n      position: state.options.strategy,\n      left: '0',\n      top: '0',\n      margin: '0'\n    },\n    arrow: {\n      position: 'absolute'\n    },\n    reference: {}\n  };\n  Object.assign(state.elements.popper.style, initialStyles.popper);\n  state.styles = initialStyles;\n\n  if (state.elements.arrow) {\n    Object.assign(state.elements.arrow.style, initialStyles.arrow);\n  }\n\n  return function () {\n    Object.keys(state.elements).forEach(function (name) {\n      var element = state.elements[name];\n      var attributes = state.attributes[name] || {};\n      var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n      var style = styleProperties.reduce(function (style, property) {\n        style[property] = '';\n        return style;\n      }, {}); // arrow is optional + virtual elements\n\n      if (!isHTMLElement(element) || !getNodeName(element)) {\n        return;\n      }\n\n      Object.assign(element.style, style);\n      Object.keys(attributes).forEach(function (attribute) {\n        element.removeAttribute(attribute);\n      });\n    });\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar applyStyles$1 = {\n  name: 'applyStyles',\n  enabled: true,\n  phase: 'write',\n  fn: applyStyles,\n  effect: effect$1,\n  requires: ['computeStyles']\n};\n\nvar defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1];\nvar createPopper = /*#__PURE__*/popperGenerator({\n  defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nfunction getAltAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}\n\nfunction within(min$1, value, max$1) {\n  return max(min$1, min(value, max$1));\n}\n\nfunction preventOverflow(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      padding = options.padding,\n      _options$tether = options.tether,\n      tether = _options$tether === void 0 ? true : _options$tether,\n      _options$tetherOffset = options.tetherOffset,\n      tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n  var overflow = detectOverflow(state, {\n    boundary: boundary,\n    rootBoundary: rootBoundary,\n    padding: padding,\n    altBoundary: altBoundary\n  });\n  var basePlacement = getBasePlacement(state.placement);\n  var variation = getVariation(state.placement);\n  var isBasePlacement = !variation;\n  var mainAxis = getMainAxisFromPlacement(basePlacement);\n  var altAxis = getAltAxis(mainAxis);\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : tetherOffset;\n  var data = {\n    x: 0,\n    y: 0\n  };\n\n  if (!popperOffsets) {\n    return;\n  }\n\n  if (checkMainAxis || checkAltAxis) {\n    var mainSide = mainAxis === 'y' ? top : left;\n    var altSide = mainAxis === 'y' ? bottom : right;\n    var len = mainAxis === 'y' ? 'height' : 'width';\n    var offset = popperOffsets[mainAxis];\n    var min$1 = popperOffsets[mainAxis] + overflow[mainSide];\n    var max$1 = popperOffsets[mainAxis] - overflow[altSide];\n    var additive = tether ? -popperRect[len] / 2 : 0;\n    var minLen = variation === start ? referenceRect[len] : popperRect[len];\n    var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n    // outside the reference bounds\n\n    var arrowElement = state.elements.arrow;\n    var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n      width: 0,\n      height: 0\n    };\n    var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n    var arrowPaddingMin = arrowPaddingObject[mainSide];\n    var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n    // to include its full size in the calculation. If the reference is small\n    // and near the edge of a boundary, the popper can overflow even if the\n    // reference is not overflowing as well (e.g. virtual elements with no\n    // width or height)\n\n    var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n    var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n    var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n    var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n    var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n    var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n    var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n    var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n\n    if (checkMainAxis) {\n      var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1);\n      popperOffsets[mainAxis] = preventedOffset;\n      data[mainAxis] = preventedOffset - offset;\n    }\n\n    if (checkAltAxis) {\n      var _mainSide = mainAxis === 'x' ? top : left;\n\n      var _altSide = mainAxis === 'x' ? bottom : right;\n\n      var _offset = popperOffsets[altAxis];\n\n      var _min = _offset + overflow[_mainSide];\n\n      var _max = _offset - overflow[_altSide];\n\n      var _preventedOffset = within(tether ? min(_min, tetherMin) : _min, _offset, tether ? max(_max, tetherMax) : _max);\n\n      popperOffsets[altAxis] = _preventedOffset;\n      data[altAxis] = _preventedOffset - _offset;\n    }\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar preventOverflow$1 = {\n  name: 'preventOverflow',\n  enabled: true,\n  phase: 'main',\n  fn: preventOverflow,\n  requiresIfExists: ['offset']\n};\n\nvar hash$1 = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nfunction getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\n    return hash$1[matched];\n  });\n}\n\nvar hash = {\n  start: 'end',\n  end: 'start'\n};\nfunction getOppositeVariationPlacement(placement) {\n  return placement.replace(/start|end/g, function (matched) {\n    return hash[matched];\n  });\n}\n\nfunction computeAutoPlacement(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      placement = _options.placement,\n      boundary = _options.boundary,\n      rootBoundary = _options.rootBoundary,\n      padding = _options.padding,\n      flipVariations = _options.flipVariations,\n      _options$allowedAutoP = _options.allowedAutoPlacements,\n      allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;\n  var variation = getVariation(placement);\n  var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n    return getVariation(placement) === variation;\n  }) : basePlacements;\n  var allowedPlacements = placements$1.filter(function (placement) {\n    return allowedAutoPlacements.indexOf(placement) >= 0;\n  });\n\n  if (allowedPlacements.length === 0) {\n    allowedPlacements = placements$1;\n  } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n  var overflows = allowedPlacements.reduce(function (acc, placement) {\n    acc[placement] = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding\n    })[getBasePlacement(placement)];\n    return acc;\n  }, {});\n  return Object.keys(overflows).sort(function (a, b) {\n    return overflows[a] - overflows[b];\n  });\n}\n\nfunction getExpandedFallbackPlacements(placement) {\n  if (getBasePlacement(placement) === auto) {\n    return [];\n  }\n\n  var oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n\n  if (state.modifiersData[name]._skip) {\n    return;\n  }\n\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n      specifiedFallbackPlacements = options.fallbackPlacements,\n      padding = options.padding,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      _options$flipVariatio = options.flipVariations,\n      flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n      allowedAutoPlacements = options.allowedAutoPlacements;\n  var preferredPlacement = state.options.placement;\n  var basePlacement = getBasePlacement(preferredPlacement);\n  var isBasePlacement = basePlacement === preferredPlacement;\n  var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n  var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n    return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding,\n      flipVariations: flipVariations,\n      allowedAutoPlacements: allowedAutoPlacements\n    }) : placement);\n  }, []);\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var checksMap = new Map();\n  var makeFallbackChecks = true;\n  var firstFittingPlacement = placements[0];\n\n  for (var i = 0; i < placements.length; i++) {\n    var placement = placements[i];\n\n    var _basePlacement = getBasePlacement(placement);\n\n    var isStartVariation = getVariation(placement) === start;\n    var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n    var len = isVertical ? 'width' : 'height';\n    var overflow = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      altBoundary: altBoundary,\n      padding: padding\n    });\n    var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n    if (referenceRect[len] > popperRect[len]) {\n      mainVariationSide = getOppositePlacement(mainVariationSide);\n    }\n\n    var altVariationSide = getOppositePlacement(mainVariationSide);\n    var checks = [];\n\n    if (checkMainAxis) {\n      checks.push(overflow[_basePlacement] <= 0);\n    }\n\n    if (checkAltAxis) {\n      checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n    }\n\n    if (checks.every(function (check) {\n      return check;\n    })) {\n      firstFittingPlacement = placement;\n      makeFallbackChecks = false;\n      break;\n    }\n\n    checksMap.set(placement, checks);\n  }\n\n  if (makeFallbackChecks) {\n    // `2` may be desired in some cases – research later\n    var numberOfChecks = flipVariations ? 3 : 1;\n\n    var _loop = function _loop(_i) {\n      var fittingPlacement = placements.find(function (placement) {\n        var checks = checksMap.get(placement);\n\n        if (checks) {\n          return checks.slice(0, _i).every(function (check) {\n            return check;\n          });\n        }\n      });\n\n      if (fittingPlacement) {\n        firstFittingPlacement = fittingPlacement;\n        return \"break\";\n      }\n    };\n\n    for (var _i = numberOfChecks; _i > 0; _i--) {\n      var _ret = _loop(_i);\n\n      if (_ret === \"break\") break;\n    }\n  }\n\n  if (state.placement !== firstFittingPlacement) {\n    state.modifiersData[name]._skip = true;\n    state.placement = firstFittingPlacement;\n    state.reset = true;\n  }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar flip$1 = {\n  name: 'flip',\n  enabled: true,\n  phase: 'main',\n  fn: flip,\n  requiresIfExists: ['offset'],\n  data: {\n    _skip: false\n  }\n};\n\nfunction distanceAndSkiddingToXY(placement, rects, offset) {\n  var basePlacement = getBasePlacement(placement);\n  var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n  var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n    placement: placement\n  })) : offset,\n      skidding = _ref[0],\n      distance = _ref[1];\n\n  skidding = skidding || 0;\n  distance = (distance || 0) * invertDistance;\n  return [left, right].indexOf(basePlacement) >= 0 ? {\n    x: distance,\n    y: skidding\n  } : {\n    x: skidding,\n    y: distance\n  };\n}\n\nfunction offset(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options,\n      name = _ref2.name;\n  var _options$offset = options.offset,\n      offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n  var data = placements.reduce(function (acc, placement) {\n    acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n    return acc;\n  }, {});\n  var _data$state$placement = data[state.placement],\n      x = _data$state$placement.x,\n      y = _data$state$placement.y;\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.modifiersData.popperOffsets.x += x;\n    state.modifiersData.popperOffsets.y += y;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar offset$1 = {\n  name: 'offset',\n  enabled: true,\n  phase: 'main',\n  requires: ['popperOffsets'],\n  fn: offset\n};\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n  padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : padding;\n  return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n  var _state$modifiersData$;\n\n  var state = _ref.state,\n      name = _ref.name,\n      options = _ref.options;\n  var arrowElement = state.elements.arrow;\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var basePlacement = getBasePlacement(state.placement);\n  var axis = getMainAxisFromPlacement(basePlacement);\n  var isVertical = [left, right].indexOf(basePlacement) >= 0;\n  var len = isVertical ? 'height' : 'width';\n\n  if (!arrowElement || !popperOffsets) {\n    return;\n  }\n\n  var paddingObject = toPaddingObject(options.padding, state);\n  var arrowRect = getLayoutRect(arrowElement);\n  var minProp = axis === 'y' ? top : left;\n  var maxProp = axis === 'y' ? bottom : right;\n  var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n  var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n  var arrowOffsetParent = getOffsetParent(arrowElement);\n  var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n  var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n  // outside of the popper bounds\n\n  var min = paddingObject[minProp];\n  var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n  var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n  var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n  var axisProp = axis;\n  state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options;\n  var _options$element = options.element,\n      arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n  if (arrowElement == null) {\n    return;\n  } // CSS selector\n\n\n  if (typeof arrowElement === 'string') {\n    arrowElement = state.elements.popper.querySelector(arrowElement);\n\n    if (!arrowElement) {\n      return;\n    }\n  }\n\n  if (!contains(state.elements.popper, arrowElement)) {\n\n    return;\n  }\n\n  state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar arrow$1 = {\n  name: 'arrow',\n  enabled: true,\n  phase: 'main',\n  fn: arrow,\n  effect: effect,\n  requires: ['popperOffsets'],\n  requiresIfExists: ['preventOverflow']\n};\n\nconst toInt = x => parseInt(x, 10);\n\nfunction usePopper({\n  arrowPadding,\n  emit,\n  locked,\n  offsetDistance,\n  offsetSkid,\n  placement,\n  popperNode,\n  triggerNode\n}) {\n  const state = reactive({\n    isOpen: false,\n    popperInstance: null\n  }); // Enable or disable event listeners to optimize performance.\n\n  const setPopperEventListeners = enabled => {\n    var _state$popperInstance;\n\n    (_state$popperInstance = state.popperInstance) === null || _state$popperInstance === void 0 ? void 0 : _state$popperInstance.setOptions(options => ({ ...options,\n      modifiers: [...options.modifiers, {\n        name: \"eventListeners\",\n        enabled\n      }]\n    }));\n  };\n\n  const enablePopperEventListeners = () => setPopperEventListeners(true);\n\n  const disablePopperEventListeners = () => setPopperEventListeners(false);\n\n  const close = () => {\n    if (!state.isOpen) {\n      return;\n    }\n\n    state.isOpen = false;\n    emit(\"close:popper\");\n  };\n\n  const open = () => {\n    if (state.isOpen) {\n      return;\n    }\n\n    state.isOpen = true;\n    emit(\"open:popper\");\n  }; // When isOpen or placement change\n\n\n  watch([() => state.isOpen, placement], async ([isOpen]) => {\n    if (isOpen) {\n      await initializePopper();\n      enablePopperEventListeners();\n    } else {\n      disablePopperEventListeners();\n    }\n  });\n\n  const initializePopper = async () => {\n    await nextTick();\n    state.popperInstance = createPopper(triggerNode.value, popperNode.value, {\n      placement: placement.value,\n      modifiers: [preventOverflow$1, flip$1, {\n        name: \"flip\",\n        enabled: !locked.value\n      }, arrow$1, {\n        name: \"arrow\",\n        options: {\n          padding: toInt(arrowPadding.value)\n        }\n      }, offset$1, {\n        name: \"offset\",\n        options: {\n          offset: [toInt(offsetSkid.value), toInt(offsetDistance.value)]\n        }\n      }]\n    }); // Update its position\n\n    state.popperInstance.update();\n  };\n\n  onBeforeUnmount(() => {\n    var _state$popperInstance2;\n\n    (_state$popperInstance2 = state.popperInstance) === null || _state$popperInstance2 === void 0 ? void 0 : _state$popperInstance2.destroy();\n  });\n  return { ...toRefs(state),\n    open,\n    close\n  };\n}\n\nconst _hoisted_1$1 = {\n  id: \"arrow\",\n  \"data-popper-arrow\": \"\"\n};\nfunction render(_ctx, _cache) {\n  return openBlock(), createElementBlock(\"div\", _hoisted_1$1);\n}\n\nfunction styleInject(css, ref) {\n  if ( ref === void 0 ) ref = {};\n  var insertAt = ref.insertAt;\n\n  if (!css || typeof document === 'undefined') { return; }\n\n  var head = document.head || document.getElementsByTagName('head')[0];\n  var style = document.createElement('style');\n  style.type = 'text/css';\n\n  if (insertAt === 'top') {\n    if (head.firstChild) {\n      head.insertBefore(style, head.firstChild);\n    } else {\n      head.appendChild(style);\n    }\n  } else {\n    head.appendChild(style);\n  }\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nvar css_248z$1 = \"\\n#arrow[data-v-20b7fd4a],\\n  #arrow[data-v-20b7fd4a]::before {\\n    transition: background 250ms ease-in-out;\\n    position: absolute;\\n    width: calc(10px - var(--popper-theme-border-width, 0px));\\n    height: calc(10px - var(--popper-theme-border-width, 0px));\\n    box-sizing: border-box;\\n    background: var(--popper-theme-background-color);\\n}\\n#arrow[data-v-20b7fd4a] {\\n    visibility: hidden;\\n}\\n#arrow[data-v-20b7fd4a]::before {\\n    visibility: visible;\\n    content: \\\"\\\";\\n    transform: rotate(45deg);\\n}\\n\\n  /* Top arrow */\\n.popper[data-popper-placement^=\\\"top\\\"] > #arrow[data-v-20b7fd4a] {\\n    bottom: -5px;\\n}\\n.popper[data-popper-placement^=\\\"top\\\"] > #arrow[data-v-20b7fd4a]::before {\\n    border-right: var(--popper-theme-border-width)\\n      var(--popper-theme-border-style) var(--popper-theme-border-color);\\n    border-bottom: var(--popper-theme-border-width)\\n      var(--popper-theme-border-style) var(--popper-theme-border-color);\\n}\\n\\n  /* Bottom arrow */\\n.popper[data-popper-placement^=\\\"bottom\\\"] > #arrow[data-v-20b7fd4a] {\\n    top: -5px;\\n}\\n.popper[data-popper-placement^=\\\"bottom\\\"] > #arrow[data-v-20b7fd4a]::before {\\n    border-left: var(--popper-theme-border-width)\\n      var(--popper-theme-border-style) var(--popper-theme-border-color);\\n    border-top: var(--popper-theme-border-width)\\n      var(--popper-theme-border-style) var(--popper-theme-border-color);\\n}\\n\\n  /* Left arrow */\\n.popper[data-popper-placement^=\\\"left\\\"] > #arrow[data-v-20b7fd4a] {\\n    right: -5px;\\n}\\n.popper[data-popper-placement^=\\\"left\\\"] > #arrow[data-v-20b7fd4a]::before {\\n    border-right: var(--popper-theme-border-width)\\n      var(--popper-theme-border-style) var(--popper-theme-border-color);\\n    border-top: var(--popper-theme-border-width)\\n      var(--popper-theme-border-style) var(--popper-theme-border-color);\\n}\\n\\n  /* Right arrow */\\n.popper[data-popper-placement^=\\\"right\\\"] > #arrow[data-v-20b7fd4a] {\\n    left: -5px;\\n}\\n\";\nstyleInject(css_248z$1);\n\nconst script$1 = {};\nscript$1.render = render;\nscript$1.__scopeId = \"data-v-20b7fd4a\";\nvar Arrow = script$1;\n\nconst _hoisted_1 = [\"onKeyup\"];\nvar script = {\n  props: {\n    /**\n     * Preferred placement (the \"auto\" placements will choose the side with most space.)\n     */\n    placement: {\n      type: String,\n      default: \"bottom\",\n      validator: function (value) {\n        return [\"auto\", \"auto-start\", \"auto-end\", \"top\", \"top-start\", \"top-end\", \"bottom\", \"bottom-start\", \"bottom-end\", \"right\", \"right-start\", \"right-end\", \"left\", \"left-start\", \"left-end\"].includes(value);\n      }\n    },\n\n    /**\n     * Disables automatically closing the popover when the user clicks away from it\n     */\n    disableClickAway: {\n      type: Boolean,\n      default: false\n    },\n\n    /**\n     * Offset in pixels along the trigger element\n     */\n    offsetSkid: {\n      type: String,\n      default: \"0\"\n    },\n\n    /**\n     * Offset in pixels away from the trigger element\n     */\n    offsetDistance: {\n      type: String,\n      default: \"12\"\n    },\n\n    /**\n     * Trigger the popper on hover\n     */\n    hover: {\n      type: Boolean,\n      default: false\n    },\n\n    /**\n     * Manually open/close the Popper, other events are ignored if this prop is set\n     */\n    show: {\n      type: Boolean,\n      default: null\n    },\n\n    /**\n     * Disables the Popper. If it was already open, it will be closed.\n     */\n    disabled: {\n      type: Boolean,\n      default: false\n    },\n\n    /**\n     * Open the Popper after a delay (ms).\n     */\n    openDelay: {\n      type: [Number, String],\n      default: 0\n    },\n\n    /**\n     * Close the Popper after a delay (ms).\n     */\n    closeDelay: {\n      type: [Number, String],\n      default: 0\n    },\n\n    /**\n     * The z-index of the Popper.\n     */\n    zIndex: {\n      type: [Number, String],\n      default: 9999\n    },\n\n    /**\n     * Display an arrow on the popper\n     */\n    arrow: {\n      type: Boolean,\n      default: false\n    },\n\n    /**\n     * Stop arrow from reaching the edge of the popper\n     */\n    arrowPadding: {\n      type: String,\n      default: \"0\"\n    },\n\n    /**\n     * If the Popper should be interactive, it will close when clicked/hovered if false\n     */\n    interactive: {\n      type: Boolean,\n      default: true\n    },\n\n    /**\n     * Lock the Popper into place, it will not flip dynamically when it runs out of space if true\n     */\n    locked: {\n      type: Boolean,\n      default: false\n    },\n\n    /**\n     * If the content is just a simple string, it can be passed in as a prop\n     */\n    content: {\n      type: String,\n      default: null\n    }\n  },\n  emits: [\"open:popper\", \"close:popper\"],\n\n  setup(__props, {\n    emit\n  }) {\n    const props = __props;\n\n    useCssVars(_ctx => ({\n      \"c81fc0a4\": __props.zIndex\n    }));\n\n    const slots = useSlots();\n    const popperContainerNode = ref(null);\n    const popperNode = ref(null);\n    const triggerNode = ref(null);\n    const modifiedIsOpen = ref(false);\n    onMounted(() => {\n      const children = slots.default();\n\n      if (children && children.length > 1) {\n        return console.error(`[Popper]: The <Popper> component expects only one child element at its root. You passed ${children.length} child nodes.`);\n      }\n    });\n    const {\n      arrowPadding,\n      closeDelay,\n      content,\n      disableClickAway,\n      disabled,\n      interactive,\n      locked,\n      offsetDistance,\n      offsetSkid,\n      openDelay,\n      placement,\n      show\n    } = toRefs(props);\n    const {\n      isOpen,\n      open,\n      close\n    } = usePopper({\n      arrowPadding,\n      emit,\n      locked,\n      offsetDistance,\n      offsetSkid,\n      placement,\n      popperNode,\n      triggerNode\n    });\n    const {\n      hasContent\n    } = useContent(slots, popperNode, content);\n    const manualMode = computed(() => show.value !== null);\n    const invalid = computed(() => disabled.value || !hasContent.value);\n    const shouldShowPopper = computed(() => isOpen.value && !invalid.value);\n    const enableClickAway = computed(() => !disableClickAway.value && !manualMode.value); // Add an invisible border to keep the Popper open when hovering from the trigger into it\n\n    const interactiveStyle = computed(() => interactive.value ? `border: ${offsetDistance.value}px solid transparent; margin: -${offsetDistance.value}px;` : null);\n    const openPopperDebounce = debounce_1.debounce(open, openDelay.value);\n    const closePopperDebounce = debounce_1.debounce(close, closeDelay.value);\n\n    const openPopper = async () => {\n      if (invalid.value || manualMode.value) {\n        return;\n      }\n\n      closePopperDebounce.clear();\n      openPopperDebounce();\n    };\n\n    const closePopper = async () => {\n      if (manualMode.value) {\n        return;\n      }\n\n      openPopperDebounce.clear();\n      closePopperDebounce();\n    };\n\n    const togglePopper = () => {\n      isOpen.value ? closePopper() : openPopper();\n    };\n    /**\n     * If Popper is open, we automatically close it if it becomes\n     * disabled or without content.\n     */\n\n\n    watch([hasContent, disabled], ([hasContent, disabled]) => {\n      if (isOpen.value && (!hasContent || disabled)) {\n        close();\n      }\n    });\n    /**\n     * In order to eliminate flickering or visibly empty Poppers due to\n     * the transition when using the isOpen slot property, we need to return a\n     * separate debounced value based on isOpen.\n     */\n\n    watch(isOpen, isOpen => {\n      if (isOpen) {\n        modifiedIsOpen.value = true;\n      } else {\n        debounce_1.debounce(() => {\n          modifiedIsOpen.value = false;\n        }, 200);\n      }\n    });\n    /**\n     * Watch for manual mode.\n     */\n\n    watchEffect(() => {\n      if (manualMode.value) {\n        show.value ? openPopperDebounce() : closePopperDebounce();\n      }\n    });\n    /**\n     * Use click away if it should be enabled.\n     */\n\n    watchEffect(() => {\n      if (enableClickAway.value) {\n        useClickAway(popperContainerNode, closePopper);\n      }\n    });\n    return (_ctx, _cache) => {\n      return openBlock(), createElementBlock(\"div\", {\n        class: \"inline-block\",\n        style: normalizeStyle(unref(interactiveStyle)),\n        onMouseleave: _cache[2] || (_cache[2] = $event => __props.hover && closePopper()),\n        ref: (_value, _refs) => {\n          _refs['popperContainerNode'] = _value;\n          popperContainerNode.value = _value;\n        }\n      }, [createElementVNode(\"div\", {\n        ref: (_value, _refs) => {\n          _refs['triggerNode'] = _value;\n          triggerNode.value = _value;\n        },\n        onMouseover: _cache[0] || (_cache[0] = $event => __props.hover && openPopper()),\n        onClick: togglePopper,\n        onFocus: openPopper,\n        onKeyup: withKeys(closePopper, [\"esc\"])\n      }, [renderSlot(_ctx.$slots, \"default\")], 40, _hoisted_1), createVNode(Transition, {\n        name: \"fade\"\n      }, {\n        default: withCtx(() => [withDirectives(createElementVNode(\"div\", {\n          onClick: _cache[1] || (_cache[1] = $event => !unref(interactive) && closePopper()),\n          class: \"popper\",\n          ref: (_value, _refs) => {\n            _refs['popperNode'] = _value;\n            popperNode.value = _value;\n          }\n        }, [renderSlot(_ctx.$slots, \"content\", {\n          close: unref(close),\n          isOpen: modifiedIsOpen.value\n        }, () => [createTextVNode(toDisplayString(unref(content)), 1)]), __props.arrow ? (openBlock(), createBlock(Arrow, {\n          key: 0\n        })) : createCommentVNode(\"\", true)], 512), [[vShow, unref(shouldShowPopper)]])]),\n        _: 3\n      })], 36);\n    };\n  }\n\n};\n\nvar css_248z = \"\\n.inline-block[data-v-5784ed69] {\\n    display: inline-block;\\n}\\n.popper[data-v-5784ed69] {\\n    transition: background 250ms ease-in-out;\\n    background: var(--popper-theme-background-color);\\n    padding: var(--popper-theme-padding);\\n    color: var(--popper-theme-text-color);\\n    border-radius: var(--popper-theme-border-radius);\\n    border-width: var(--popper-theme-border-width);\\n    border-style: var(--popper-theme-border-style);\\n    border-color: var(--popper-theme-border-color);\\n    box-shadow: var(--popper-theme-box-shadow);\\n    z-index: var(--c81fc0a4);\\n}\\n.popper[data-v-5784ed69]:hover,\\n  .popper:hover > #arrow[data-v-5784ed69]::before {\\n    background: var(--popper-theme-background-color-hover);\\n}\\n.inline-block[data-v-5784ed69] {\\n    display: inline-block;\\n}\\n.fade-enter-active[data-v-5784ed69],\\n  .fade-leave-active[data-v-5784ed69] {\\n    transition: opacity 0.2s ease;\\n}\\n.fade-enter-from[data-v-5784ed69],\\n  .fade-leave-to[data-v-5784ed69] {\\n    opacity: 0;\\n}\\n\";\nstyleInject(css_248z);\n\nscript.__scopeId = \"data-v-5784ed69\";\n\n// IIFE injects install function into component, allowing component\n// to be registered via Vue.use() as well as Vue.component(),\n\nvar entry_esm = /*#__PURE__*/(() => {\n  // Get component instance\n  const installable = script; // Attach install function executed by Vue.use()\n\n  installable.install = app => {\n    app.component(\"Popper\", installable);\n  };\n\n  return installable;\n})(); // It's possible to expose named exports when writing components that can\n// also be used as directives, etc. - eg. import { RollupDemoDirective } from 'rollup-demo';\n// export const RollupDemoDirective = directive;\n\nexport { entry_esm as default };\n","<script setup>\r\nimport { ref } from \"vue\";\r\nimport Popper from \"vue3-popper\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\nconst isMobile = ref(false);\r\nif (/Mobi|Android/i.test(navigator.userAgent)) {\r\n  isMobile.value = true;\r\n}\r\n</script>\r\n\r\n<template>\r\n  <Popper v-bind=\"isMobile ? click : hover\" open-delay=\"100\" close-delay=\"100\" z-index=\"50\" class=\"popperWrapper\">\r\n    <FhIcon name=\"InformationCircle\" class=\"tooltip cursor-pointer\" />\r\n    <template #content>\r\n      <div class=\"pointer-events-none mx-4 box-border w-max max-w-xs bg-white px-f3 py-f2 shadow-lg md:max-w-sm\">\r\n        <slot></slot>\r\n      </div>\r\n    </template>\r\n  </Popper>\r\n</template>\r\n\r\n<style scoped>\r\n/* Centers the icon inside the popper wrappers */\r\n.popperWrapper,\r\n.popperWrapper > :deep(div) {\r\n  @apply flex items-center justify-center;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhTooltip from \"./FhTooltip.vue\";\r\n\r\nconst props = defineProps({\r\n  label: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  value: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  text: {\r\n    type: String,\r\n    default: null,\r\n    required: false\r\n  }\r\n});\r\n\r\nconst showTooltip = computed(() => !!props.text);\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex items-center justify-between\">\r\n    <div class=\"text-f-sm-lg\" :class=\"{ 'flex items-center gap-3': showTooltip }\">\r\n      {{ props.label }}<FhTooltip v-if=\"showTooltip\">{{ props.text }}</FhTooltip>\r\n    </div>\r\n    <span>{{ props.value }}</span>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport formatPrice from \"@/util/formatPrice\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhCartSummaryLineItem from \"@/components/FhCartSummaryLineItem.vue\";\r\n\r\nconst props = defineProps({\r\n  totalItemsPrice: {\r\n    type: Number,\r\n    default: null\r\n  },\r\n  totalShippingPrice: {\r\n    type: Number,\r\n    default: null\r\n  },\r\n  /**\r\n   * If `true`, the `totalShippingPrice` prop will be ignored and the shipping price will be displayed as \"to be quoted\"\r\n   */\r\n  shippingPriceToBeQuoted: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  totalTaxPrice: {\r\n    type: Number,\r\n    default: null\r\n  },\r\n  totalPrice: {\r\n    type: Number,\r\n    default: null\r\n  },\r\n  shippingTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  taxTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  /**\r\n   * This component displays in a collapsed state on mobile and tablet screens, with the full details available in modal.\r\n   * Setting this prop to `true` shows the full details inline, same as the desktop view.\r\n   */\r\n  showInlineOnMobile: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nfunction isPriceSet(price) {\r\n  return !!price || price === 0;\r\n}\r\n\r\nfunction getDisplayPrice(price) {\r\n  return isPriceSet(price) ? formatPrice(price) : \"--\";\r\n}\r\n\r\nconst summaryLineItems = computed(() => [\r\n  {\r\n    label: \"Items in Cart\",\r\n    value: getDisplayPrice(props.totalItemsPrice)\r\n  },\r\n  {\r\n    label: \"Shipping & Handling\",\r\n    value: props.shippingPriceToBeQuoted ? \"To be quoted\" : getDisplayPrice(props.totalShippingPrice),\r\n    text: props.shippingTooltip\r\n  },\r\n  {\r\n    label: \"Tax\",\r\n    value: getDisplayPrice(props.totalTaxPrice),\r\n    text: props.taxTooltip\r\n  }\r\n]);\r\n\r\nconst showBeforeShippingAndTaxNote = computed(() => !isPriceSet(props.totalShippingPrice) && !isPriceSet(props.totalTaxPrice));\r\n\r\nconst { isLg } = useViewportSizes();\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col gap-5 lg:gap-f3\">\r\n    <h2 v-if=\"isLg || props.showInlineOnMobile\" class=\"text-f-xl-4xl\">Summary</h2>\r\n    <div v-if=\"isLg || props.showInlineOnMobile\" class=\"flex flex-col gap-5 lg:gap-f2\">\r\n      <FhCartSummaryLineItem v-for=\"lineItem in summaryLineItems\" :key=\"lineItem.label\" v-bind=\"lineItem\" />\r\n    </div>\r\n    <div v-if=\"$slots.extras && (isLg || props.showInlineOnMobile)\" class=\"border-t border-neutral-30 pt-f3\">\r\n      <slot name=\"extras\"></slot>\r\n    </div>\r\n    <div v-if=\"isLg || props.showInlineOnMobile\" class=\"h-px w-full bg-neutral-30\"></div>\r\n    <div class=\"flex items-start justify-between\">\r\n      <div v-if=\"isLg || props.showInlineOnMobile\" class=\"text-f-sm-lg\">Total</div>\r\n      <FhModal v-else :data=\"{ heading: 'Summary' }\">\r\n        <template #activator=\"{ open }\">\r\n          <FhButton variant=\"link\" @click=\"open\">Summary</FhButton>\r\n        </template>\r\n        <template #default>\r\n          <div class=\"flex flex-col gap-5\">\r\n            <FhCartSummaryLineItem v-for=\"lineItem in summaryLineItems\" :key=\"lineItem.label\" v-bind=\"lineItem\" />\r\n            <div v-if=\"$slots.extras\" class=\"border-t border-neutral-30 pt-5\">\r\n              <slot name=\"extras\"></slot>\r\n            </div>\r\n            <div class=\"flex items-start justify-between border-t border-t-neutral-30 pt-5\">\r\n              <div class=\"text-f-sm-lg\">Total</div>\r\n              <div class=\"text-right\">\r\n                <div class=\"text-f-lg-3xl\">{{ getDisplayPrice(props.totalPrice) }}</div>\r\n                <div v-if=\"showBeforeShippingAndTaxNote\" class=\"text-neutral-50\">Before shipping &amp; tax</div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </template>\r\n        <template v-if=\"$slots.actions\" #footer>\r\n          <div class=\"flex w-full flex-col gap-f2\">\r\n            <slot name=\"actions\"></slot>\r\n          </div>\r\n        </template>\r\n      </FhModal>\r\n      <div class=\"text-right\">\r\n        <div class=\"text-f-lg-3xl\">{{ getDisplayPrice(props.totalPrice) }}</div>\r\n        <div v-if=\"showBeforeShippingAndTaxNote\" class=\"text-neutral-50\">Before shipping &amp; tax</div>\r\n      </div>\r\n    </div>\r\n    <div v-if=\"$slots.actions\" class=\"flex flex-col gap-f2\" :class=\"{ 'actions--collapsed': !isLg && !props.showInlineOnMobile }\">\r\n      <slot name=\"actions\"></slot>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style scoped>\r\n/* Hides all but the primary action */\r\n.actions--collapsed :not(:first-child) {\r\n  @apply hidden;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, computed } from \"vue\";\r\nimport { useTimeAgo } from \"@vueuse/core\";\r\nimport { CHECKOUT } from \"@/constants/routes\";\r\nimport FhAlert from \"./FhAlert.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhCartCheckoutLayout from \"./FhCartCheckoutLayout.vue\";\r\nimport FhCartItem from \"./FhCartItem.vue\";\r\nimport FhCartSummary from \"./FhCartSummary.vue\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\n\r\nconst props = defineProps({\r\n  totalItemsCount: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  totalItemsPrice: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  availabilityLastUpdatedDate: {\r\n    type: Date,\r\n    default: () => null\r\n  },\r\n  items: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  isLoading: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isError: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  shippingTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  taxTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  cartMessaging: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"itemQuantityUpdate\", \"itemDelete\", \"itemEnter\", \"saveforlater\"]);\r\n\r\nconst availabilityUpdatedTimeAgo = useTimeAgo(() => props.availabilityLastUpdatedDate);\r\n\r\nconst isDataLoaded = computed(() => !props.isLoading && !props.isError);\r\nconst isEmpty = computed(() => isDataLoaded.value && props.items.length === 0);\r\n\r\nconst unavailableItems = computed(() => props.items.filter((item) => item.sku.isAvailable === false));\r\n\r\nconst cutoverSkus = computed(() => props.items.filter((item) => !!item.sku.oldSku));\r\n\r\nconst isCheckoutDisabled = computed(() => props.isLoading || props.isError || isEmpty.value || unavailableItems.value.length > 0);\r\n\r\nconst isResidentialShippingEligible = computed(() => {\r\n  return props.items?.length > 0 && props.items?.every((item) => item.sku.isResidentialShippingEligible && isEmpty.value === false);\r\n});\r\n\r\nconst hasWallpaper = computed(() => {\r\n  return props.items.some((item) => item.sku.isResidentialShippingEligible);\r\n});\r\n\r\nconst hasAmberLewis = computed(() => props.items.some((item) => item.sku.collaboration && item.sku.collaboration.toLowerCase().includes(\"amber\")));\r\n\r\nconst isItemRemoveAnimationComplete = ref(true);\r\n\r\nconst cartSummaryProps = computed(() => {\r\n  let total = isDataLoaded.value ? props.totalItemsPrice : null;\r\n  return {\r\n    totalItemsPrice: total,\r\n    totalPrice: total,\r\n    shippingTooltip: props.shippingTooltip,\r\n    taxTooltip: props.taxTooltip\r\n  };\r\n});\r\n\r\nfunction removeUnavailable() {\r\n  unavailableItems.value.forEach((item) => emit(\"itemDelete\", { id: item.id }));\r\n}\r\n\r\nfunction checkout() {\r\n  window.location = CHECKOUT;\r\n}\r\n</script>\r\n\r\n<template>\r\n  <FhCartCheckoutLayout>\r\n    <template #default>\r\n      <!-- CART HEADER -->\r\n      <div class=\"mb-8 flex flex-col gap-f3 md:mb-f6 md:flex-row md:items-end md:justify-between\">\r\n        <h1 class=\"font-serif text-f-2xl-7xl\">Shopping Cart</h1>\r\n        <div v-if=\"isDataLoaded\" class=\"text-f-xs-lg\">\r\n          <span>{{ props.totalItemsCount }} {{ props.totalItemsCount === 1 ? \"item\" : \"items\" }}</span>\r\n          <span class=\"mx-f1.5 inline-block text-neutral-50\">&bull;</span>\r\n          <span class=\"text-neutral-50\">Last inventory update: {{ availabilityUpdatedTimeAgo }}</span>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- CUTOVER ITEMS MESSAGE -->\r\n      <FhAlert v-if=\"cutoverSkus.length > 0\" icon=\"InformationCircle\" class=\"mb-8 md:mb-f6\">\r\n        <div class=\"\">\r\n          <ul class=\"list-outside\">\r\n            <li v-for=\"(item, index) in cutoverSkus\" :key=\"item.sku.skuNumber\" :class=\"{ 'mb-3': index !== cutoverSkus.length - 1 }\">\r\n              {{ item.sku.productName }} (formally item number {{ item.sku.oldSku }}) has been replaced with {{ item.sku.skuNumber }}. This is the same product\r\n              with a new SKU number. Your cart has been automatically updated. There is no action required on your end.\r\n            </li>\r\n          </ul>\r\n        </div>\r\n      </FhAlert>\r\n      <!-- UNAVAILALBE ITEMS MESSAGE -->\r\n      <FhAlert v-if=\"unavailableItems.length > 0\" icon=\"AlertCircle\" class=\"mb-8 md:mb-f6\">\r\n        <div class=\"mb-2\">The following items are no longer available. Please remove them before checking out.</div>\r\n        <ul class=\"mb-2 ml-[1em] list-outside list-disc\">\r\n          <li v-for=\"item in unavailableItems\" :key=\"item.sku.skuNumber\">\r\n            {{ item.sku.productName }} &bull; {{ item.sku.skuName }} &bull; {{ item.sku.skuNumber }}\r\n          </li>\r\n        </ul>\r\n        <FhButton variant=\"link\" @click=\"removeUnavailable\">Remove All Unavailable Items</FhButton>\r\n      </FhAlert>\r\n      <!-- CUSTOM MESSAGE -->\r\n      <FhAlert v-if=\"props.cartMessaging\" icon=\"AlertCircle\" class=\"mb-8 md:mb-f6\">\r\n        <!-- eslint-disable vue/no-v-html -->\r\n        <div v-html=\"props.cartMessaging\"></div>\r\n      </FhAlert>\r\n      <!-- AMBER LEWIS ITEMS MESSAGE -->\r\n      <FhAlert v-if=\"hasAmberLewis\" icon=\"AlertCircle\" class=\"mb-8 md:mb-f6\">\r\n        <div class=\"mb-2\"><a href=\"/faq\">Amber Lewis x Four Hands products have online distribution requirements. Learn more ></a></div>\r\n      </FhAlert>\r\n      <!-- WALLPAPER ITEMS MESSAGE -->\r\n      <FhAlert v-if=\"hasWallpaper\" icon=\"AlertCircle\" class=\"mb-8 md:mb-f6\">\r\n        <div class=\"mb-2\">\r\n          Wallpaper ships separately from other products. Residential shipping is available for wallpaper-only orders. <a href=\"/faq#shipping\">Learn More ></a>\r\n        </div>\r\n      </FhAlert>\r\n      <FhAlert v-if=\"isResidentialShippingEligible\" icon=\"AlertCircle\" class=\"mb-8 md:mb-f6\">\r\n        <div class=\"mb-2\">Residential shipping is available for this order.</div>\r\n      </FhAlert>\r\n      <!-- CART ITEMS -->\r\n      <TransitionGroup\r\n        :leave-active-class=\"`transition ease-in duration-200 ${props.items.length > 0 ? '!absolute' : ''}`\"\r\n        leave-from-class=\"translate-x-0 opacity-100\"\r\n        leave-to-class=\"-translate-x-1/2 opacity-0\"\r\n        move-class=\"transtion duration-500\"\r\n        @after-enter=\"(el) => emit('itemEnter', el)\"\r\n        @before-leave=\"() => (isItemRemoveAnimationComplete = false)\"\r\n        @after-leave=\"() => (isItemRemoveAnimationComplete = true)\"\r\n      >\r\n        <FhCartItem\r\n          v-for=\"item in props.items\"\r\n          :key=\"item.key || item.id\"\r\n          v-bind=\"item\"\r\n          class=\"relative -mb-px scroll-mt-24\"\r\n          @update:quantity=\"(quantity) => emit('itemQuantityUpdate', { id: item.id, quantity })\"\r\n          @delete=\"() => emit('itemDelete', { id: item.id })\"\r\n          @saveforlater=\"() => emit('saveforlater', item)\"\r\n        />\r\n      </TransitionGroup>\r\n      <!-- EMPTY CART MESSAGE -->\r\n      <Transition enter-active-class=\"ease-out duration-300 transition\" enter-from-class=\"opacity-0\" enter-to-class=\"opacity-100\">\r\n        <div v-if=\"isEmpty && isItemRemoveAnimationComplete\" class=\"text-body-xl mb-f10 text-neutral-50\">Your cart is empty.</div>\r\n      </Transition>\r\n      <!-- ERROR MESSAGE -->\r\n      <div v-if=\"props.isError\" class=\"text-body-xl mb-f10 flex items-center gap-f1\">\r\n        <FhIcon name=\"AlertCircle\" />\r\n        Sorry, we are not able to load your cart at this time.\r\n      </div>\r\n    </template>\r\n    <template #summary>\r\n      <FhCartSummary v-bind=\"cartSummaryProps\">\r\n        <template #actions>\r\n          <FhButton color=\"primary\" :disabled=\"isCheckoutDisabled\" @click=\"checkout\">Proceed to Checkout</FhButton>\r\n        </template>\r\n      </FhCartSummary>\r\n    </template>\r\n  </FhCartCheckoutLayout>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\n\r\nconst props = defineProps({\r\n  page: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  totalItems: {\r\n    type: Number,\r\n    required: true,\r\n    validator: (value) => value > 0\r\n  },\r\n  perPage: {\r\n    type: Number,\r\n    default: 10,\r\n    validator: (value) => value > 0\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:page\", \"pageChange\"]);\r\n\r\nconst currentPage = computed({\r\n  get: () => props.page,\r\n  set: (val) => {\r\n    if (val !== props.page) {\r\n      emit(\"update:page\", val);\r\n      emit(\"pageChange\", val);\r\n    }\r\n  }\r\n});\r\n\r\nconst totalPages = computed(() => Math.max(Math.ceil(props.totalItems / props.perPage), 1));\r\nconst isOnFirstPage = computed(() => currentPage.value === 1);\r\nconst isOnLastPage = computed(() => currentPage.value === totalPages.value);\r\n\r\nconst paginationVisibility = (i) => {\r\n  let cp = currentPage.value;\r\n  let tp = totalPages.value;\r\n\r\n  if (tp <= 9) return true;\r\n  if (i === 0) return true;\r\n  if (i === tp - 1) return true;\r\n  if (cp < 5 && i < 5) return true;\r\n  if (Math.abs(cp - i) <= 1) return true;\r\n  if (cp > tp - 5 && i > tp - 5) return true;\r\n\r\n  return false;\r\n};\r\n</script>\r\n\r\n<template>\r\n  <nav role=\"navigation\" class=\"flex items-center justify-center gap-4\">\r\n    <FhButton size=\"small\" variant=\"round\" :disabled=\"isOnFirstPage\" title=\"Go to first page\" @click=\"currentPage--\">\r\n      <FhIcon name=\"LeftChevron\" />\r\n    </FhButton>\r\n    <div class=\"flex\">\r\n      <template v-for=\"(pageNum, index) in totalPages\" :key=\"index\">\r\n        <FhButton\r\n          v-if=\"paginationVisibility(index)\"\r\n          class=\"h-6 w-6\"\r\n          :class=\"[currentPage === pageNum ? 'font-bold text-neutral-70' : 'text-neutral-50']\"\r\n          variant=\"text\"\r\n          size=\"small\"\r\n          :title=\"`Go to page ${pageNum}`\"\r\n          :aria-current=\"currentPage === pageNum\"\r\n          @click=\"currentPage = pageNum\"\r\n        >\r\n          {{ pageNum }}\r\n        </FhButton>\r\n        <span v-else class=\"pagination__ellipsis\">...</span>\r\n      </template>\r\n    </div>\r\n    <FhButton size=\"small\" variant=\"round\" :disabled=\"isOnLastPage\" title=\"Go to last page\" @click=\"currentPage++\">\r\n      <FhIcon name=\"RightChevron\" />\r\n    </FhButton>\r\n  </nav>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.pagination__ellipsis {\r\n  @apply h-6 w-6;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  align-self: center;\r\n  margin-left: -1px;\r\n  & + & {\r\n    display: none;\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed, watch } from \"vue\";\r\nimport FhCartItem from \"@/components/FhCartItem.vue\";\r\nimport FhPaginationNav from \"@/components/FhPaginationNav.vue\";\r\nimport FhLoader from \"@/components/FhLoader.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport { usePaginatedList } from \"@/composables\";\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  hasError: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isLoading: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  totalItemsCount: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  itemsPerPage: {\r\n    type: Number,\r\n    default: 6\r\n  }\r\n});\r\nconst emit = defineEmits([\"itemDelete\", \"movetocart\", \"moveAllToCart\"]);\r\nconst saveForLaterItems = computed(() => props.modelValue);\r\nconst isEmpty = computed(() => saveForLaterItems.value.length === 0);\r\nconst totalItem = computed(() => props.modelValue.length);\r\nconst hasError = computed(() => props.hasError);\r\n\r\nlet { page, totalPages, sublist: itemsInCurrentPage } = usePaginatedList(saveForLaterItems, props.itemsPerPage);\r\n\r\nwatch(saveForLaterItems, () => {\r\n  page.value = 1;\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div v-if=\"props.isLoading\" class=\"w-full\"><FhLoader class=\"h-10 w-10\" /></div>\r\n  <div>\r\n    <div class=\"sm:grid-cols-1 grid md:grid-cols-2\">\r\n      <FhHeading class=\"headerText mb-0 py-f4\">Saved for Later</FhHeading>\r\n\r\n      <div v-if=\"totalItem > 0\" class=\"button addButton justify-end gap-5 self-center text-right md:mt-0 md:flex\">\r\n        <FhButton class=\"mb-2.5 w-full md:w-auto\" @click=\"emit('movealltocart', saveForLaterItems)\">Move All to Cart ({{ totalItem }}) </FhButton>\r\n      </div>\r\n    </div>\r\n    <div v-if=\"!isEmpty && !hasError && !props.isLoading\" class=\"grid gap-f5 border-y border-neutral-30 md:grid-cols-2 lg:grid-cols-3\">\r\n      <FhCartItem\r\n        v-for=\"saveForLaterItem in itemsInCurrentPage\"\r\n        :key=\"saveForLaterItem.id || saveForLaterItem.key\"\r\n        :is-save-for-later=\"true\"\r\n        v-bind=\"saveForLaterItem\"\r\n        @delete=\"() => emit('itemDelete', { id: saveForLaterItem.id })\"\r\n        @movetocart=\"movetocartitem = emit('movetocart', saveForLaterItem)\"\r\n      />\r\n    </div>\r\n\r\n    <div v-if=\"totalPages > 1\" class=\"mt-f8 flex items-center justify-center\">\r\n      <FhPaginationNav v-model:page=\"page\" :total-items=\"saveForLaterItems.length\" :per-page=\"props.itemsPerPage\" />\r\n    </div>\r\n  </div>\r\n  <div v-if=\"hasError && !props.isLoading\">\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">Sorry, we are not able to load your save for later items.</p>\r\n  </div>\r\n  <div v-else-if=\"isEmpty && !props.isLoading\">\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">Your Save For Later list is empty.</p>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhSaveForLaterPresenter from \"@/components/FhSaveForLaterPresenter.vue\";\r\nimport { useSaveForLaterQuery, useDeleteSaveForItemMutation, useAddToCartMutation } from \"@/api/saveforlaterApi\";\r\nimport { useNotificationStore } from \"../stores/NotificationStore.js\";\r\nconst { isLoading, isError, data: saveForLaterData } = useSaveForLaterQuery();\r\nconst items = computed(() => (isLoading.value ? [] : saveForLaterData.value));\r\n\r\nconst removeCartItemMutation = useDeleteSaveForItemMutation();\r\nconst addCartItemsMutation = useAddToCartMutation();\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst isLoadingState = computed(() => {\r\n  return isLoading.value || removeCartItemMutation.isLoading.value || addCartItemsMutation.isLoading.value;\r\n});\r\n\r\nfunction notifyItemRemoveSuccess(cartItem) {\r\n  notificationStore.notifySuccess(`${cartItem.sku.productName} removed.`);\r\n}\r\n\r\nfunction notifyItemRemoveError(cartItem) {\r\n  notificationStore.notifyError(`Sorry, something went wrong and we could not remove ${cartItem.sku.productName}. Please try again.`);\r\n}\r\n\r\nasync function handleItemDelete(item) {\r\n  let cartItem = items.value.find((x) => x.id === item.id);\r\n  try {\r\n    //saveForLaterData.value = true;\r\n    await removeCartItemMutation.mutateAsync(item);\r\n    notifyItemRemoveSuccess(cartItem);\r\n  } catch {\r\n    // saveForLaterData.value = false;\r\n    notifyItemRemoveError(cartItem);\r\n  }\r\n}\r\n\r\nfunction notifyAddToCartSuccess(cartItem) {\r\n  notificationStore.notifySuccess(`${cartItem.sku.productName} Added To Cart.`);\r\n}\r\n\r\nfunction notifyAddToCartError(cartItem) {\r\n  notificationStore.notifyError(`Sorry, something went wrong and we could not add ${cartItem.sku.productName} to Cart Please try again.`);\r\n}\r\nfunction handleMoveToCart(items) {\r\n  const data = [{ skuNumber: items.sku.skuNumber, quantity: items.quantity, id: items.id, category: items.category }];\r\n\r\n  addCartItemsMutation.mutate(data, {\r\n    onSuccess: () => {\r\n      //saveForLaterData.value = true;\r\n      notifyAddToCartSuccess(items);\r\n    },\r\n    onError: () => {\r\n      notifyAddToCartError(items);\r\n    }\r\n  });\r\n}\r\nfunction notifyAddAllToCartSuccess() {\r\n  notificationStore.notifySuccess(`All Save for Later Items Added To Cart`);\r\n}\r\n\r\nfunction notifyAddAllToCartError() {\r\n  notificationStore.notifyError(`Sorry, something went wrong and we could not add All to Cart Please try again.`);\r\n}\r\nfunction handleMoveAllToCart(items) {\r\n  const itemsToMoveMap = items.map((item) => {\r\n    return { skuNumber: item.sku.skuNumber, quantity: item.quantity, id: item.id };\r\n  });\r\n  addCartItemsMutation.mutate(itemsToMoveMap, {\r\n    onSuccess: () => {\r\n      notifyAddAllToCartSuccess();\r\n    },\r\n    onError: () => {\r\n      notifyAddAllToCartError();\r\n    }\r\n  });\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div class=\"pb-f8\">\r\n    <FhSaveForLaterPresenter\r\n      v-model=\"items\"\r\n      :is-loading=\"isLoadingState\"\r\n      :is-error=\"isError\"\r\n      @item-delete=\"handleItemDelete\"\r\n      @movetocart=\"handleMoveToCart\"\r\n      @movealltocart=\"handleMoveAllToCart\"\r\n    />\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { ref, computed } from \"vue\";\r\nimport { useCartQuery, useAddCartItemsMutation, useUpdateCartItemMutation, useRemoveCartItemMutation } from \"@/api/cartApi\";\r\nimport { useAddSaveForLaterItemsMutation } from \"@/api/saveforlaterApi\";\r\nimport { useNotificationStore } from \"../stores/NotificationStore.js\";\r\nimport FhCartPresenter from \"./FhCartPresenter.vue\";\r\nimport FhSaveForLater from \"./FhSaveForLater.vue\";\r\n\r\nconst props = defineProps({\r\n  shippingTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  taxTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  cartMessaging: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst itemKeyTouches = ref({});\r\n\r\nfunction getProductNameByItemId(itemId) {\r\n  return items.value.find((item) => item.id === itemId)?.sku.productName;\r\n}\r\n\r\n/**\r\n * Cart Query\r\n */\r\n\r\nconst { isLoading, isError, data: cart } = useCartQuery();\r\n\r\nfunction generateItemKey(itemId) {\r\n  const touches = itemKeyTouches.value[itemId] || 0;\r\n  return `${itemId}-${touches}`;\r\n}\r\n\r\nconst items = computed(() => cart.value?.items.map((item) => ({ ...item, key: generateItemKey(item.id) })) || []);\r\n\r\nconst totalItemsCount = computed(() => cart.value?.totalItemsCount || 0);\r\n\r\nconst totalItemsPrice = computed(() => cart.value?.totalItemsPrice || 0);\r\n\r\nconst availabilityLastUpdatedDate = computed(() => (cart.value ? new Date(cart.value.availabilityLastUpdatedDate) : null));\r\n\r\n/**\r\n * Update Cart Item Mutation\r\n */\r\n\r\nconst updateCartItemMutation = useUpdateCartItemMutation();\r\n\r\nfunction touchItemKey(itemId) {\r\n  itemKeyTouches.value = {\r\n    ...itemKeyTouches.value,\r\n    [itemId]: (itemKeyTouches.value[itemId] || 0) + 1\r\n  };\r\n}\r\n\r\nfunction handleItemQuantityUpdate(item) {\r\n  updateCartItemMutation.mutate(item, {\r\n    onSuccess: () => notifyItemQuantityUpdateSuccess(item.id),\r\n    onError: () => {\r\n      // Forces the CartItem component to rebind, so the quantity is reset back to its pre-mutation value\r\n      touchItemKey(item.id);\r\n      notifyItemQuantityUpdateError(item.id);\r\n    }\r\n  });\r\n}\r\n\r\nfunction notifyItemQuantityUpdateSuccess(itemId) {\r\n  notificationStore.notifySuccess(`${getProductNameByItemId(itemId)} quantity updated.`);\r\n}\r\n\r\nfunction notifyItemQuantityUpdateError(itemId) {\r\n  notificationStore.notifyError(`Sorry, something went wrong and we could not update the quantity of ${getProductNameByItemId(itemId)}. Please try again.`);\r\n}\r\n\r\n/**\r\n * Remove Cart Item Mutation\r\n */\r\n\r\nconst removeCartItemMutation = useRemoveCartItemMutation();\r\n\r\nasync function handleItemDelete(item) {\r\n  let cartItem = items.value.find((x) => x.id === item.id);\r\n  try {\r\n    await removeCartItemMutation.mutateAsync(item);\r\n    notifyItemRemoveSuccess(cartItem);\r\n  } catch {\r\n    notifyItemRemoveError(cartItem);\r\n  }\r\n}\r\n\r\nfunction notifyItemRemoveSuccess(cartItem) {\r\n  let notificationSettings;\r\n\r\n  // Don't offer the \"Undo\" link for unavailable items\r\n  if (cartItem.sku.isAvailable !== false) {\r\n    notificationSettings = {\r\n      linkText: \"Undo\",\r\n      onLinkClick: () => undoItemRemove(cartItem)\r\n    };\r\n  }\r\n\r\n  notificationStore.notifySuccess(`${cartItem.sku.productName} removed.`, notificationSettings);\r\n}\r\n\r\nfunction notifyItemRemoveError(cartItem) {\r\n  notificationStore.notifyError(`Sorry, something went wrong and we could not remove ${cartItem.sku.productName}. Please try again.`);\r\n}\r\n\r\n/**\r\n * Add Cart Item Mutation (to support undoing of a remove)\r\n */\r\n\r\nconst addCartItemsMutation = useAddCartItemsMutation();\r\n\r\nfunction undoItemRemove(cartItem) {\r\n  const data = [{ skuNumber: cartItem.sku.skuNumber, quantity: cartItem.quantity }];\r\n  addCartItemsMutation.mutate(data, {\r\n    onSuccess: () => notifyUndoSuccess(cartItem.sku.productName),\r\n    onError: () => notifiyUndoError(cartItem.sku.productName)\r\n  });\r\n}\r\n\r\nconst shouldScrollToItem = ref(false);\r\n\r\nfunction notifyUndoSuccess(productName) {\r\n  notificationStore.notifySuccess(`${productName} added back.`);\r\n  shouldScrollToItem.value = true;\r\n}\r\n\r\nfunction notifiyUndoError(productName) {\r\n  notificationStore.notifyError(`Sorry, something went wrong and we could not add ${productName} back.`);\r\n}\r\n\r\nfunction handleItemEnter(itemElement) {\r\n  if (shouldScrollToItem.value) {\r\n    shouldScrollToItem.value = false;\r\n    itemElement.scrollIntoView({ block: \"start\", behavior: \"smooth\" });\r\n  }\r\n}\r\nconst SaveForLatersMutation = useAddSaveForLaterItemsMutation();\r\n\r\nasync function handleSaveForLater(itemToMove) {\r\n  let cartItem = items.value.find((cartItem) => cartItem.id === itemToMove.id);\r\n  try {\r\n    await SaveForLatersMutation.mutateAsync(cartItem);\r\n    notificationStore.notifySuccess(`${cartItem.sku.productName} added to Save for Later.`);\r\n  } catch {\r\n    notificationStore.notifyError(`Sorry, something went wrong and we could not add to Save for Later.`);\r\n  }\r\n}\r\n</script>\r\n\r\n<template>\r\n  <FhCartPresenter\r\n    :is-loading=\"isLoading\"\r\n    :is-error=\"isError\"\r\n    :items=\"items\"\r\n    :total-items-count=\"totalItemsCount\"\r\n    :total-items-price=\"totalItemsPrice\"\r\n    :availability-last-updated-date=\"availabilityLastUpdatedDate\"\r\n    :shipping-tooltip=\"props.shippingTooltip\"\r\n    :tax-tooltip=\"props.taxTooltip\"\r\n    :cart-messaging=\"props.cartMessaging\"\r\n    @item-quantity-update=\"handleItemQuantityUpdate\"\r\n    @item-delete=\"handleItemDelete\"\r\n    @item-enter=\"handleItemEnter\"\r\n    @saveforlater=\"handleSaveForLater\"\r\n  />\r\n  <FhSaveForLater></FhSaveForLater>\r\n</template>\r\n","<script setup>\r\nconst props = defineProps({\r\n  header: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  subheader: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  description: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  headerVariant: {\r\n    type: String,\r\n    default: \"base\",\r\n    validator: (value) => [\"base\", \"large\", \"large-italic\"].includes(value)\r\n  }\r\n});\r\n\r\nconst headerClasses = [props.headerVariant == \"large\" ? \"display1\" : null, props.headerVariant == \"large-italic\" ? \"display1 italic\" : null];\r\nconst bodyClasses = [props.headerVariant.includes(\"large\") ? \"text-f-lg-2xl\" : null];\r\n</script>\r\n\r\n<template>\r\n  <section class=\"py-f5\">\r\n    <div class=\"lg:gap-30 grid items-center lg:grid-cols-3\">\r\n      <div class=\"lg:col-span-2\">\r\n        <h2 v-if=\"props.subheader\" class=\"text-base text-neutral-50\">{{ props.subheader }}</h2>\r\n        <h1 :class=\"headerClasses\" class=\"text-f-3xl-5xl font-medium text-neutral-70\">{{ props.header }}</h1>\r\n      </div>\r\n      <div class=\"pt-f3 lg:col-span-1 lg:flex lg:flex-1 lg:justify-end lg:pt-0\">\r\n        <p v-if=\"props.description\" :class=\"bodyClasses\" class=\"box-border max-w-md font-normal text-neutral-70\">\r\n          {{ description }}\r\n        </p>\r\n      </div>\r\n    </div>\r\n  </section>\r\n</template>\r\n","<script setup>\r\nimport FhImage from \"./FhImage.vue\";\r\n\r\nconst props = defineProps({\r\n  category: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <a :href=\"props.category.url\" class=\"group block\">\r\n    <FhImage :src=\"props.category.image\" :alt=\"`${props.category.name} category`\" square border />\r\n    <div class=\"px-2.5 py-f3\">\r\n      <span class=\"group-hover-underline-with-transition text-f-sm-2xl\">{{ props.category.name }}</span>\r\n    </div>\r\n  </a>\r\n</template>\r\n","<script setup>\r\nimport FhPageHeader from \"./FhPageHeader.vue\";\r\nimport FhCategoryGrid from \"./FhCategoryGrid.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\n\r\nconst props = defineProps({\r\n  categories: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  header: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  shopAllButton: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <FhPageHeader :header=\"props.header.header\" :subheader=\"props.header.subheader\" :description=\"props.header.description\" />\r\n\r\n  <FhCategoryGrid :categories=\"props.categories\" />\r\n  <div class=\"flex justify-center py-f5\">\r\n    <FhButton :href=\"props.shopAllButton.url\">{{ props.shopAllButton.title }}</FhButton>\r\n  </div>\r\n</template>\r\n","import axiosClient from \"./axiosClient\";\r\nimport { useQueryClient, useQuery, useMutation } from \"@tanstack/vue-query\";\r\n\r\nconst QUERY_KEY = [\"checkout\"];\r\n\r\nexport function useCheckoutQuery(options) {\r\n  return useQuery({\r\n    ...(options || {}),\r\n    queryKey: QUERY_KEY,\r\n    queryFn: () => axiosClient.get(\"/checkout\"),\r\n    // checkout data should be as fresh as possible because items can EOL during a checkout session\r\n    refetchOnWindowFocus: true\r\n  });\r\n}\r\n\r\nexport const UPDATE_CHECKOUT_PATHS = Object.freeze({\r\n  SHIPPING: \"shipping\",\r\n  SHIPPING_DETAILS: \"shipping_details\",\r\n  PAYMENT: \"payment\",\r\n  PO: \"po\"\r\n});\r\n\r\nexport function useCreateCheckoutMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: () => axiosClient.post(\"/checkout\"),\r\n    onSuccess: (data) => queryClient.setQueryData(QUERY_KEY, data)\r\n  });\r\n}\r\n\r\nexport function useUpdateCheckoutMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (data) => {\r\n      if (!Object.values(UPDATE_CHECKOUT_PATHS).includes(data.path)) {\r\n        throw new Error(`Unsupported path: ${data.path}`);\r\n      }\r\n      return axiosClient.put(`/checkout/${data.path}`, data.data);\r\n    },\r\n    onSuccess: (data) => queryClient.setQueryData(QUERY_KEY, data)\r\n  });\r\n}\r\n\r\nexport function useSubmitOrderMutation(options) {\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: () => axiosClient.post(\"/checkout/submit_order\")\r\n  });\r\n}\r\n","export const SUPPORT_PHONE_NUMBER = \"(866) 654-9433\";\r\nexport const SUPPORT_HOURS_OF_OPERATION = \"8am - 6pm CST\";\r\n","export const CHECKOUT_STEPS = Object.freeze({\r\n  SHIPPING: 1,\r\n  SHIPPING_DETAILS: 2,\r\n  PAYMENT: 3,\r\n  REVIEW: 4,\r\n  SUMMARY: 5\r\n});\r\n\r\nexport const SHIPPING_DETAILS_FH_CARRIERS_SUB_STEPS = Object.freeze({\r\n  SERVICE_LEVEL_SELECTION: 1,\r\n  OTHER_DETAILS: 2\r\n});\r\n\r\nexport const SHIPPING_OPTIONS = Object.freeze({\r\n  FH_CARRIERS: \"PREFERRED_CARRIER\",\r\n  THIRD_PARTY: \"THIRD_PARTY_CARRIER\",\r\n  PICK_UP: \"PICK_UP\"\r\n});\r\n\r\nexport const SHIPPING_OPTIONS_DEFINITION = Object.freeze({\r\n  [SHIPPING_OPTIONS.FH_CARRIERS]: {\r\n    displayName: \"Use a Four Hands carrier\",\r\n    longDescription: \"Four Hands carriers do not deliver to residential addresses and require a commercial address that can accommodate a 53' freight truck.\"\r\n  },\r\n  [SHIPPING_OPTIONS.THIRD_PARTY]: {\r\n    displayName: \"Arrange my own freight carrier\",\r\n    longDescription: \"Arrange shipment with the carrier of your choice. Additional handling fee may apply.\"\r\n  },\r\n  [SHIPPING_OPTIONS.PICK_UP]: {\r\n    displayName: \"Pick up in Austin, TX\",\r\n    longDescription: \"Pick up your order at our warehouse.\"\r\n  }\r\n});\r\n\r\nexport const FREIGHT_SERVICE_LEVEL = Object.freeze({\r\n  STANDARD: \"standard\",\r\n  EXPEDITED: \"expedited\",\r\n  RUSH: \"rush\"\r\n});\r\n\r\nexport const FREIGHT_SERVICE_LEVEL_DEFINITION = Object.freeze({\r\n  [FREIGHT_SERVICE_LEVEL.STANDARD]: {\r\n    displayName: \"Standard\",\r\n    description: \"15 to 20 business days\",\r\n    longDescription: `\r\n      <p class=\"mb-f2 text-body-lg\">After leaving our warehouse, most products will arrive within 15 to 20 business days.</p>\r\n      <p><em>Canadian delivery times may vary.</em><p>\r\n      <p>Important information:</p>\r\n      <ul>\r\n        <li>Timing depends on stock levels, order processing times and delivery area.</li>\r\n        <li>The delivery address must be able to accommodate a 53’ tractor trailer, unless it is a wallpaper-only order.</li>\r\n        <li>Special delivery requests may require an additional charge. Liftgate option not available with the standard service.</li>\r\n        <li>If you don&rsquo;t select the &ldquo;Don't Want Your Order Shipped Yet?&rdquo; option (in the next step), we will ship all products in your order as they&rsquo;re in stock and you will be charged for each individual shipment.</li>\r\n      </ul>   \r\n    `,\r\n    descriptionWallpaperOnly: \"5 to 7 business days\",\r\n    longDescriptionWallpaperOnly: `\r\n      <p class=\"mb-f2 text-body-lg\">After leaving our warehouse, most product will arrive within 5-7 business days.</p>\r\n      <p><em>Canadian delivery times may vary.</em><p>\r\n      <p>Important information:</p>\r\n      <ul>\r\n        <li>Product is made to order, processing times is 2-3 weeks. </li>\r\n        <li>Shipping to a residential address is only available for orders containing solely wallpaper products.</li>\r\n        <li>If you don't select the \"don't want your order shipped yet?\" options (in the next steps), we will ship all products in your order as they're in stock and you will be charged for each individual shipment.</li>\r\n      </ul>      \r\n    `\r\n  },\r\n  [FREIGHT_SERVICE_LEVEL.EXPEDITED]: {\r\n    displayName: \"Expedited\",\r\n    description: \"5 to 6 business days\",\r\n    longDescription: `\r\n      <p class=\"mb-f2 text-body-lg\">After leaving our warehouse, most products will arrive within 5 to 6 business days.</p>\r\n      <p><em>Canadian delivery times may vary.</em><p>\r\n      <p>Important information:</p>\r\n      <ul>\r\n        <li>Timing depends on stock levels, order processing times and delivery area.</li>\r\n        <li>The delivery address must be able to accommodate a 53’ tractor trailer, unless it is a wallpaper-only order.</li>\r\n        <li>Special delivery requests may require an additional charge. Liftgate option not available with the standard service.</li>\r\n        <li>If you don&rsquo;t select the &ldquo;Don't Want Your Order Shipped Yet?&rdquo; option (in the next step), we will ship all products in your order as they&rsquo;re in stock and you will be charged for each individual shipment.</li>\r\n      </ul>\r\n    `\r\n  },\r\n  [FREIGHT_SERVICE_LEVEL.RUSH]: {\r\n    displayName: \"Rush\",\r\n    description: \"3 to 4 business days\",\r\n    longDescription: `\r\n      <p class=\"mb-f2 text-body-lg\">After leaving our warehouse, most products will arrive within 3 to 4 business days.</p>\r\n      <p><em>Canadian delivery times may vary.</em><p>\r\n      <p>Important information:</p>\r\n      <ul>\r\n        <li>Timing depends on stock levels, order processing times and delivery area.</li>\r\n        <li>The delivery address must be able to accommodate a 53’ tractor trailer, unless it is a wallpaper-only order.</li>\r\n        <li>Special delivery requests may require an additional charge. Liftgate option not available with the standard service.</li>        \r\n        <li>If you don&rsquo;t select the &ldquo;Don't Want Your Order Shipped Yet?&rdquo; option (in the next step), we will ship all products in your order as they&rsquo;re in stock and you will be charged for each individual shipment.</li>\r\n      </ul>\r\n    `\r\n  }\r\n});\r\n","const _map_category_ga = (product, cateogryList) => {\r\n  const productObj = product;\r\n  cateogryList.forEach((category, index) => {\r\n    const key = index === 0 ? \"item_category\" : `item_category${index + 1}`;\r\n    productObj[key] = category?.name || category;\r\n  });\r\n  return productObj;\r\n};\r\n\r\nconst _mapProductDataToGA = (products = [], cateogryList) => {\r\n  return products.map((product, index) => {\r\n    const productObject = {\r\n      item_id: product?.sku,\r\n      item_name: product?.name,\r\n      item_list_name: product?.list,\r\n      index: product?.index ?? index,\r\n      item_variant: product?.skuName,\r\n      affiliation: product?.collaboration || null,\r\n      dimension5: product?.inStock ? \"In Stock\" : \"Out of Stock\",\r\n      status: product?.status\r\n    };\r\n\r\n    if (cateogryList.length > 0) {\r\n      return _map_category_ga(productObject, cateogryList);\r\n    }\r\n\r\n    return productObject;\r\n  });\r\n};\r\n\r\nconst _mapProductDetailsToGA = (product = null, cateogryList = []) => {\r\n  const productObject = {\r\n    item_id: product?.skuNumber,\r\n    item_name: product?.name || product?.productName,\r\n    item_list_name: product?.list,\r\n    item_variant: product?.skuName || product?.skuVariantName,\r\n    price: product?.price,\r\n    quantity: product?.quantity || 1,\r\n    affiliation: product?.collaboration || null,\r\n    dimension5: product?.inStock ? \"In Stock\" : \"Out of Stock\",\r\n    status: product?.status,\r\n    has_video: product?.has_video || product?.hasVideo || false\r\n  };\r\n\r\n  if (cateogryList.length > 0) {\r\n    return _map_category_ga(productObject, cateogryList);\r\n  }\r\n\r\n  return productObject;\r\n};\r\n\r\nconst send_ecommerce_event = (eventName, ecommObj = null) => {\r\n  window?.dataLayer?.push({ ecommerce: null });\r\n  window?.dataLayer?.push({\r\n    event: eventName,\r\n    ecommerce: ecommObj\r\n  });\r\n};\r\n\r\nexport const event_viewListItem = (productData = [], categoryList = []) => {\r\n  send_ecommerce_event(\"view_item_list\", {\r\n    items: _mapProductDataToGA(productData, categoryList)\r\n  });\r\n};\r\n\r\nexport const event_selectItem = (productData = [], categoryList = []) => {\r\n  send_ecommerce_event(\"select_item\", {\r\n    items: _mapProductDataToGA(productData, categoryList)\r\n  });\r\n};\r\n\r\nexport const event_viewItem = (productData = null, categoryList = []) => {\r\n  if (!productData) return false;\r\n  send_ecommerce_event(\"view_item\", {\r\n    currency: \"USD\",\r\n    value: productData?.price,\r\n    items: [_mapProductDetailsToGA(productData, categoryList)]\r\n  });\r\n};\r\n\r\nexport const event_addItemToCart = (productData = null, categoryList = []) => {\r\n  send_ecommerce_event(\"add_to_cart\", {\r\n    currency: \"USD\",\r\n    value: productData?.price * (productData?.quantity || 1),\r\n    items: [_mapProductDetailsToGA(productData, categoryList)]\r\n  });\r\n};\r\n\r\nexport const event_beginCheckout = (productData) => {\r\n  send_ecommerce_event(\"begin_checkout\", {\r\n    currency: \"USD\",\r\n    value: productData?.totalPrice,\r\n    items: productData.products.map((product) =>\r\n      _mapProductDetailsToGA(\r\n        { ...product.sku, quantity: product.quantity, price: product.unitPrice, collaboration: product.sku?.collaboration },\r\n        product?.category?.split(\"/\")\r\n      )\r\n    )\r\n  });\r\n};\r\n\r\nexport const event_Purchase = (purchaseData) => {\r\n  send_ecommerce_event(\"purchase\", {\r\n    transaction_id: purchaseData?.orderNumber,\r\n    currency: \"USD\",\r\n    value: purchaseData?.totalPrice,\r\n    tax: purchaseData?.tax,\r\n    shipping: purchaseData?.shippingPrice,\r\n    items: purchaseData.products.map((product) =>\r\n      _mapProductDetailsToGA(\r\n        { ...product.sku, quantity: product.quantity, price: product.unitPrice, collaboration: product.sku?.collaboration },\r\n        product?.category?.split(\"/\")\r\n      )\r\n    )\r\n  });\r\n};\r\n\r\nexport const event_Search = (searchTerm) => {\r\n  send_ecommerce_event(\"search\", {\r\n    search_term: searchTerm\r\n  });\r\n};\r\n\r\nexport const event_ShippingInfo = (checkoutTotal, productData = [], shipping_method) => {\r\n  send_ecommerce_event(\"add_shipping_info\", {\r\n    currency: \"USD\",\r\n    value: checkoutTotal,\r\n    shipping_tier: shipping_method,\r\n    items: productData.map((product) =>\r\n      _mapProductDetailsToGA({ ...product.sku, quantity: product.quantity, price: product.unitPrice }, product?.category?.split(\"/\"))\r\n    )\r\n  });\r\n};\r\n\r\nexport const event_PaymentInfo = (checkoutTotal, productData = [], payment_method) => {\r\n  send_ecommerce_event(\"add_payment_info\", {\r\n    currency: \"USD\",\r\n    value: checkoutTotal,\r\n    payment_type: payment_method,\r\n    items: productData.map((product) =>\r\n      _mapProductDetailsToGA({ ...product.sku, quantity: product.quantity, price: product.unitPrice }, product?.category?.split(\"/\"))\r\n    )\r\n  });\r\n};\r\n\r\nexport const event_AddToWishList = (product) => {\r\n  const productObj = {\r\n    item_id: product?.skuNumber,\r\n    item_name: product?.name || product?.productName,\r\n    item_list_id: product?.listId,\r\n    item_list_name: product?.title,\r\n    item_variant: product?.skuName || product?.skuVariantName,\r\n    price: product?.price,\r\n    quantity: product?.quantity || 1,\r\n    dimension5: product?.inStock ? \"In Stock\" : \"Out of Stock\"\r\n  };\r\n  send_ecommerce_event(\"add_to_wishlist\", {\r\n    currency: \"USD\",\r\n    value: product?.price,\r\n    items: [_map_category_ga(productObj, product.categoryList)]\r\n  });\r\n};\r\n\r\nexport const send_user_dimension = (userData) => {\r\n  window?.dataLayer?.push(userData);\r\n};\r\n\r\nexport const sent_custom_event = (eventName, data = {}) => {\r\n  window?.dataLayer?.push({\r\n    event: eventName,\r\n    ...data\r\n  });\r\n};\r\n","<script setup></script>\r\n\r\n<template>\r\n  <div class=\"border border-solid border-neutral-30 p-f5\">\r\n    <slot />\r\n  </div>\r\n</template>\r\n","export default Object.freeze({\r\n  US: {\r\n    name: \"United States\",\r\n    stateName: \"State\",\r\n    states: Object.freeze({\r\n      AL: \"Alabama\",\r\n      AK: \"Alaska\",\r\n      AS: \"American Samoa\",\r\n      AZ: \"Arizona\",\r\n      AR: \"Arkansas\",\r\n      CA: \"California\",\r\n      CO: \"Colorado\",\r\n      CT: \"Connecticut\",\r\n      DE: \"Delaware\",\r\n      DC: \"District Of Columbia\",\r\n      FM: \"Federated States Of Micronesia\",\r\n      FL: \"Florida\",\r\n      GA: \"Georgia\",\r\n      GU: \"Guam\",\r\n      HI: \"Hawaii\",\r\n      ID: \"Idaho\",\r\n      IL: \"Illinois\",\r\n      IN: \"Indiana\",\r\n      IA: \"Iowa\",\r\n      KS: \"Kansas\",\r\n      KY: \"Kentucky\",\r\n      LA: \"Louisiana\",\r\n      ME: \"Maine\",\r\n      MH: \"Marshall Islands\",\r\n      MD: \"Maryland\",\r\n      MA: \"Massachusetts\",\r\n      MI: \"Michigan\",\r\n      MN: \"Minnesota\",\r\n      MS: \"Mississippi\",\r\n      MO: \"Missouri\",\r\n      MT: \"Montana\",\r\n      NE: \"Nebraska\",\r\n      NV: \"Nevada\",\r\n      NH: \"New Hampshire\",\r\n      NJ: \"New Jersey\",\r\n      NM: \"New Mexico\",\r\n      NY: \"New York\",\r\n      NC: \"North Carolina\",\r\n      ND: \"North Dakota\",\r\n      MP: \"Northern Mariana Islands\",\r\n      OH: \"Ohio\",\r\n      OK: \"Oklahoma\",\r\n      OR: \"Oregon\",\r\n      PW: \"Palau\",\r\n      PA: \"Pennsylvania\",\r\n      PR: \"Puerto Rico\",\r\n      RI: \"Rhode Island\",\r\n      SC: \"South Carolina\",\r\n      SD: \"South Dakota\",\r\n      TN: \"Tennessee\",\r\n      TX: \"Texas\",\r\n      UT: \"Utah\",\r\n      VT: \"Vermont\",\r\n      VI: \"Virgin Islands\",\r\n      VA: \"Virginia\",\r\n      WA: \"Washington\",\r\n      WV: \"West Virginia\",\r\n      WI: \"Wisconsin\",\r\n      WY: \"Wyoming\"\r\n    }),\r\n    postalCodeName: \"ZIP Code\",\r\n    postalCodeRegex: /^([0-9]{5})(?:-([0-9]{4}))?$/\r\n  },\r\n  CA: {\r\n    name: \"Canada\",\r\n    stateName: \"Province/Territory\",\r\n    states: Object.freeze({\r\n      AB: \"Alberta\",\r\n      BC: \"British Columbia\",\r\n      MB: \"Manitoba\",\r\n      NB: \"New Brunswick\",\r\n      NL: \"Newfoundland and Labrador\",\r\n      NS: \"Nova Scotia\",\r\n      NU: \"Nunavut\",\r\n      NW: \"Northwest Territories\",\r\n      ON: \"Ontario\",\r\n      PE: \"Prince Edward Island\",\r\n      QC: \"Quebec\",\r\n      SK: \"Saskatchewan\",\r\n      YU: \"Yukon\"\r\n    }),\r\n    postalCodeName: \"Postal Code\",\r\n    postalCodeRegex: /^([ABCEGHJKLMNPRSTVXY][0-9][ABCEGHJKLMNPRSTVWXYZ])\\s*([0-9][ABCEGHJKLMNPRSTVWXYZ][0-9])$/i\r\n  },\r\n  AR: {\r\n    name: \"Argentina\"\r\n  },\r\n  BZ: {\r\n    name: \"Belize\"\r\n  },\r\n  BO: {\r\n    name: \"Bolivia\"\r\n  },\r\n  BR: {\r\n    name: \"Brazil\"\r\n  },\r\n  KY: {\r\n    name: \"Cayman Islands\"\r\n  },\r\n  CL: {\r\n    name: \"Chile\"\r\n  },\r\n  CO: {\r\n    name: \"Columbia\"\r\n  },\r\n  CR: {\r\n    name: \"Costa Rica\"\r\n  },\r\n  DO: {\r\n    name: \"Dominican Republic\"\r\n  },\r\n  EC: {\r\n    name: \"Ecuador\"\r\n  },\r\n  SV: {\r\n    name: \"El Salvador\"\r\n  },\r\n  GT: {\r\n    name: \"Guatemala\"\r\n  },\r\n  GY: {\r\n    name: \"Guyana\"\r\n  },\r\n  HN: {\r\n    name: \"Honduras\"\r\n  },\r\n  JM: {\r\n    name: \"Jamaica\"\r\n  },\r\n  MX: {\r\n    name: \"Mexico\"\r\n  },\r\n  NI: {\r\n    name: \"Nicaragua\"\r\n  },\r\n  PA: {\r\n    name: \"Panama\"\r\n  },\r\n  PY: {\r\n    name: \"Paraguay\"\r\n  },\r\n  PE: {\r\n    name: \"Peru\"\r\n  },\r\n  SR: {\r\n    name: \"Suriname\"\r\n  },\r\n  GB: {\r\n    name: \"United Kingdom\"\r\n  },\r\n  UY: {\r\n    name: \"Uruguay\"\r\n  },\r\n  VE: {\r\n    name: \"Venezuela\"\r\n  }\r\n});\r\n","export const MEASUREMENT_SYSTEM = Object.freeze({\r\n  IMPERIAL: \"IMPERIAL\",\r\n  METRIC: \"METRIC\"\r\n});\r\n\r\nexport const MEASUREMENT_UNITS = Object.freeze({\r\n  INCH: \"INCH\",\r\n  CENTIMETER: \"CENTIMETER\",\r\n  POUND: \"POUND\",\r\n  KILOGRAM: \"KILOGRAM\",\r\n  CUBIC_FOOT: \"CUBIC_FOOT\",\r\n  CUBIC_METER: \"CUBIC_METER\"\r\n});\r\n\r\nexport const MEASUREMENT_UNITS_DEFINITION = Object.freeze({\r\n  INCH: Object.freeze({\r\n    system: MEASUREMENT_SYSTEM.IMPERIAL,\r\n    formatAs: \"inch\",\r\n    convertsTo: MEASUREMENT_UNITS.CENTIMETER,\r\n    conversionRatio: 2.54\r\n  }),\r\n  CENTIMETER: Object.freeze({\r\n    system: MEASUREMENT_SYSTEM.METRIC,\r\n    formatAs: \"centimeter\",\r\n    convertsTo: MEASUREMENT_UNITS.INCH,\r\n    conversionRatio: 1 / 2.54\r\n  }),\r\n  POUND: Object.freeze({\r\n    system: MEASUREMENT_SYSTEM.IMPERIAL,\r\n    formatAs: \"pound\",\r\n    convertsTo: MEASUREMENT_UNITS.KILOGRAM,\r\n    conversionRatio: 0.453592\r\n  }),\r\n  KILOGRAM: Object.freeze({\r\n    system: MEASUREMENT_SYSTEM.METRIC,\r\n    formatAs: \"kilogram\",\r\n    convertsTo: MEASUREMENT_UNITS.POUND,\r\n    conversionRatio: 1 / 0.453592\r\n  }),\r\n  CUBIC_FOOT: Object.freeze({\r\n    system: MEASUREMENT_SYSTEM.IMPERIAL,\r\n    formatAs: \"cubic-foot\",\r\n    convertsTo: MEASUREMENT_UNITS.CUBIC_METER,\r\n    conversionRatio: 0.0283168\r\n  }),\r\n  CUBIC_METER: Object.freeze({\r\n    system: MEASUREMENT_SYSTEM.METRIC,\r\n    formatAs: \"cubic-meter\",\r\n    convertsTo: MEASUREMENT_UNITS.CUBIC_FOOT,\r\n    conversionRatio: 1 / 0.0283168\r\n  })\r\n});\r\n","import { STRINGS } from \"@/constants\";\r\nconst CREDIT_CARDS = {\r\n  amex: {\r\n    mapName: \"AMEX\",\r\n    name: \"American Express\",\r\n    icon: \"/icons/payment-methods/icon-amex.svg\"\r\n  },\r\n  discover: {\r\n    mapName: \"DISC\",\r\n    name: \"Discover\",\r\n    icon: \"/icons/payment-methods/icon-discover.svg\"\r\n  },\r\n  mastercard: {\r\n    mapName: \"MAST\",\r\n    name: \"MasterCard\",\r\n    icon: \"/icons/payment-methods/icon-mastercard.svg\"\r\n  },\r\n  visa: {\r\n    mapName: \"VISA\",\r\n    name: \"Visa\",\r\n    icon: \"/icons/payment-methods/icon-visa.svg\"\r\n  }\r\n};\r\n\r\nconst ERROR_RESPONSE_MESSAGES = {\r\n  40015: {\r\n    error_msg: \"Duplicate Card\"\r\n  },\r\n  CardAssignedToNotProcessedOrder: {\r\n    error_msg: `<div>This card cannot be deleted.</div><p>This credit card is tied to an open order. In order to delete this card, please call your Sales Support Specialist at ${STRINGS.SUPPORT_PHONE_NUMBER} to change the credit card associated with your open order.</p>`\r\n  }\r\n};\r\n\r\nexport { CREDIT_CARDS, ERROR_RESPONSE_MESSAGES };\r\n","export const PRICING_LEVELS = [\r\n  {\r\n    value: \"none\",\r\n    text: \"No Price\"\r\n  },\r\n  {\r\n    value: \"M\",\r\n    text: \"MAP\"\r\n  },\r\n  {\r\n    value: \"R\",\r\n    text: \"MSRP\"\r\n  }\r\n];\r\n\r\n// TODO New Pricing Visiblites for price markup feature\r\nexport const PRICING_LEVELS_MARK_UP = (markup) => [\r\n  {\r\n    value: \"none\",\r\n    text: \"No Price\"\r\n  },\r\n  {\r\n    value: \"M\",\r\n    text: \"MAP\"\r\n  },\r\n  {\r\n    value: \"R\",\r\n    text: \"MSRP\"\r\n  },\r\n  {\r\n    value: \"markup\",\r\n    text: `Price Markup: Your Price + ${markup}%`\r\n  },\r\n  {\r\n    value: \"account\",\r\n    text: \"Your Price\"\r\n  }\r\n];\r\n\r\n// TODO New Pricing Visiblites for price markup feature\r\nexport const CAD_PRICING = [\r\n  {\r\n    value: \"CADM\",\r\n    text: \"CAD MAP\"\r\n  },\r\n  {\r\n    value: \"CADR\",\r\n    text: \"CAD MSRP\"\r\n  }\r\n];\r\n","<script setup>\r\nimport { ref } from \"vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport { CREDIT_CARDS } from \"@/constants\";\r\n\r\nconst props = defineProps({\r\n  id: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  cardType: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  nickName: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  lastFour: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  expiration: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  showRemoveLink: {\r\n    type: Boolean,\r\n    default: true\r\n  },\r\n  isExpired: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst paymentCardRef = ref(null);\r\n\r\nconst emit = defineEmits([\"delete\"]);\r\n\r\nconst handleRemoveClick = (event) => {\r\n  event.preventDefault();\r\n  emit(\"delete\", props.id);\r\n};\r\n\r\nconst dateSlice = props?.expiration?.split(\"/\");\r\nconst card_icon = Object.values(CREDIT_CARDS).find((card) => card.mapName === props.cardType)?.icon;\r\n\r\nconst AriaClickText = `Remove credit card ending in ${props.lastFour}`;\r\n\r\ndefineExpose({\r\n  paymentCardRef\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div ref=\"paymentCardRef\" class=\"paymentCard flex flex-col gap-f3\">\r\n    <img v-if=\"card_icon\" class=\"paymentCard__icon block w-16 md:w-20\" :src=\"card_icon\" alt=\"Credit Card Vendor Icon\" />\r\n    <div>\r\n      <h4 class=\"text-body-lg paymentCard__name mb-1\">{{ props.nickName }}</h4>\r\n      <div class=\"paymentCard__details flex gap-1\">\r\n        <span class=\"text-neutral-50\">Ending in {{ props.lastFour }}</span>\r\n        <span class=\"paymentCard__detailsDivider text-neutral-50\">&#8226;</span>\r\n        <span v-if=\"dateSlice\" :class=\"{ 'text-brand-red': isExpired, 'text-neutral-50': !isExpired }\">\r\n          Exp {{ String(dateSlice[0]).padStart(2, \"0\") }}/{{ String(dateSlice[1]).slice(2) }}\r\n        </span>\r\n        <span v-if=\"showRemoveLink\" class=\"ml-4\">\r\n          <FhButton variant=\"link\" :aria-label=\"AriaClickText\" @click=\"handleRemoveClick\">Remove</FhButton>\r\n        </span>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport FhCard from \"./FhCard.vue\";\r\nimport FhPaymentCard from \"./Ecomm/FhPaymentCard/FhPaymentCard.vue\";\r\n\r\nconst props = defineProps({\r\n  hasTerms: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  paymentCard: {\r\n    type: Object,\r\n    default: null\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <FhCard class=\"flex-1\">\r\n    <template v-if=\"props.hasTerms\">\r\n      <div class=\"mb-f2 text-f-base-xl\">Payment Method</div>\r\n      <div class=\"text-neutral-50\">Payment Terms <span class=\"italic\">(Payment Method on File)</span></div>\r\n    </template>\r\n    <FhPaymentCard v-else v-bind=\"props.paymentCard\" :show-remove-link=\"false\" />\r\n  </FhCard>\r\n</template>\r\n\r\n<style scoped>\r\n:deep(.paymentCard) {\r\n  @apply flex-row items-center gap-f5;\r\n}\r\n</style>\r\n","import { isReactive, isReadonly, computed, unref, ref, watch, isRef, reactive, nextTick, inject, provide, getCurrentInstance, onBeforeMount, onBeforeUnmount } from 'vue-demi';\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    enumerableOnly && (symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    })), keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = null != arguments[i] ? arguments[i] : {};\n    i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n      _defineProperty(target, key, source[key]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n      Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n    });\n  }\n\n  return target;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction unwrapObj(obj) {\n  let ignoreKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  return Object.keys(obj).reduce((o, k) => {\n    if (ignoreKeys.includes(k)) return o;\n    o[k] = unref(obj[k]);\n    return o;\n  }, {});\n}\nfunction isFunction(val) {\n  return typeof val === 'function';\n}\nfunction isProxy(value) {\n  return isReactive(value) || isReadonly(value);\n}\nfunction get(obj, stringPath, def) {\n  let current = obj;\n  const path = stringPath.split('.');\n\n  for (let i = 0; i < path.length; i++) {\n    if (!current[path[i]]) return def;\n    current = current[path[i]];\n  }\n\n  return current;\n}\nfunction gatherBooleanGroupProperties(group, nestedResults, property) {\n  return computed(() => {\n    return group.some(path => {\n      return get(nestedResults, path, {\n        [property]: false\n      })[property];\n    });\n  });\n}\nfunction gatherArrayGroupProperties(group, nestedResults, property) {\n  return computed(() => {\n    return group.reduce((all, path) => {\n      const fetchedProperty = get(nestedResults, path, {\n        [property]: false\n      })[property] || [];\n      return all.concat(fetchedProperty);\n    }, []);\n  });\n}\n\nfunction callRule(rule, value, siblingState, instance) {\n  return rule.call(instance, unref(value), unref(siblingState), instance);\n}\n\nfunction normalizeValidatorResponse(result) {\n  return result.$valid !== undefined ? !result.$valid : !result;\n}\n\nfunction createAsyncResult(rule, model, $pending, $dirty, _ref, $response, instance) {\n  let {\n    $lazy,\n    $rewardEarly\n  } = _ref;\n  let watchTargets = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : [];\n  let siblingState = arguments.length > 8 ? arguments[8] : undefined;\n  let $lastInvalidState = arguments.length > 9 ? arguments[9] : undefined;\n  let $lastCommittedOn = arguments.length > 10 ? arguments[10] : undefined;\n  const $invalid = ref(!!$dirty.value);\n  const $pendingCounter = ref(0);\n  $pending.value = false;\n  const $unwatch = watch([model, $dirty].concat(watchTargets, $lastCommittedOn), () => {\n    if ($lazy && !$dirty.value || $rewardEarly && !$lastInvalidState.value && !$pending.value) {\n      return;\n    }\n\n    let ruleResult;\n\n    try {\n      ruleResult = callRule(rule, model, siblingState, instance);\n    } catch (err) {\n      ruleResult = Promise.reject(err);\n    }\n\n    $pendingCounter.value++;\n    $pending.value = !!$pendingCounter.value;\n    $invalid.value = false;\n    Promise.resolve(ruleResult).then(data => {\n      $pendingCounter.value--;\n      $pending.value = !!$pendingCounter.value;\n      $response.value = data;\n      $invalid.value = normalizeValidatorResponse(data);\n    }).catch(error => {\n      $pendingCounter.value--;\n      $pending.value = !!$pendingCounter.value;\n      $response.value = error;\n      $invalid.value = true;\n    });\n  }, {\n    immediate: true,\n    deep: typeof model === 'object'\n  });\n  return {\n    $invalid,\n    $unwatch\n  };\n}\n\nfunction createSyncResult(rule, model, $dirty, _ref2, $response, instance, siblingState, $lastInvalidState) {\n  let {\n    $lazy,\n    $rewardEarly\n  } = _ref2;\n\n  const $unwatch = () => ({});\n\n  const $invalid = computed(() => {\n    if ($lazy && !$dirty.value || $rewardEarly && !$lastInvalidState.value) {\n      return false;\n    }\n\n    let returnValue = true;\n\n    try {\n      const result = callRule(rule, model, siblingState, instance);\n      $response.value = result;\n      returnValue = normalizeValidatorResponse(result);\n    } catch (err) {\n      $response.value = err;\n    }\n\n    return returnValue;\n  });\n  return {\n    $unwatch,\n    $invalid\n  };\n}\n\nfunction createValidatorResult(rule, model, $dirty, config, instance, validatorName, propertyKey, propertyPath, siblingState, $lastInvalidState, $lastCommittedOn) {\n  const $pending = ref(false);\n  const $params = rule.$params || {};\n  const $response = ref(null);\n  let $invalid;\n  let $unwatch;\n\n  if (rule.$async) {\n    ({\n      $invalid,\n      $unwatch\n    } = createAsyncResult(rule.$validator, model, $pending, $dirty, config, $response, instance, rule.$watchTargets, siblingState, $lastInvalidState, $lastCommittedOn));\n  } else {\n    ({\n      $invalid,\n      $unwatch\n    } = createSyncResult(rule.$validator, model, $dirty, config, $response, instance, siblingState, $lastInvalidState));\n  }\n\n  const message = rule.$message;\n  const $message = isFunction(message) ? computed(() => message(unwrapObj({\n    $pending,\n    $invalid,\n    $params: unwrapObj($params),\n    $model: model,\n    $response,\n    $validator: validatorName,\n    $propertyPath: propertyPath,\n    $property: propertyKey\n  }))) : message || '';\n  return {\n    $message,\n    $params,\n    $pending,\n    $invalid,\n    $response,\n    $unwatch\n  };\n}\n\nfunction sortValidations() {\n  let validationsRaw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  const validations = unref(validationsRaw);\n  const validationKeys = Object.keys(validations);\n  const rules = {};\n  const nestedValidators = {};\n  const config = {};\n  let validationGroups = null;\n  validationKeys.forEach(key => {\n    const v = validations[key];\n\n    switch (true) {\n      case isFunction(v.$validator):\n        rules[key] = v;\n        break;\n\n      case isFunction(v):\n        rules[key] = {\n          $validator: v\n        };\n        break;\n\n      case key === '$validationGroups':\n        validationGroups = v;\n        break;\n\n      case key.startsWith('$'):\n        config[key] = v;\n        break;\n\n      default:\n        nestedValidators[key] = v;\n    }\n  });\n  return {\n    rules,\n    nestedValidators,\n    config,\n    validationGroups\n  };\n}\n\nconst ROOT_PATH = '__root';\n\nfunction createValidationResults(rules, model, key, resultsCache, path, config, instance, externalResults, siblingState) {\n  const ruleKeys = Object.keys(rules);\n  const cachedResult = resultsCache.get(path, rules);\n  const $dirty = ref(false);\n  const $lastInvalidState = ref(false);\n  const $lastCommittedOn = ref(0);\n\n  if (cachedResult) {\n    if (!cachedResult.$partial) return cachedResult;\n    cachedResult.$unwatch();\n    $dirty.value = cachedResult.$dirty.value;\n  }\n\n  const result = {\n    $dirty,\n    $path: path,\n    $touch: () => {\n      if (!$dirty.value) $dirty.value = true;\n    },\n    $reset: () => {\n      if ($dirty.value) $dirty.value = false;\n    },\n    $commit: () => {}\n  };\n\n  if (!ruleKeys.length) {\n    cachedResult && resultsCache.set(path, rules, result);\n    return result;\n  }\n\n  ruleKeys.forEach(ruleKey => {\n    result[ruleKey] = createValidatorResult(rules[ruleKey], model, result.$dirty, config, instance, ruleKey, key, path, siblingState, $lastInvalidState, $lastCommittedOn);\n  });\n  result.$externalResults = computed(() => {\n    if (!externalResults.value) return [];\n    return [].concat(externalResults.value).map((stringError, index) => ({\n      $propertyPath: path,\n      $property: key,\n      $validator: '$externalResults',\n      $uid: `${path}-externalResult-${index}`,\n      $message: stringError,\n      $params: {},\n      $response: null,\n      $pending: false\n    }));\n  });\n  result.$invalid = computed(() => {\n    const r = ruleKeys.some(ruleKey => unref(result[ruleKey].$invalid));\n    $lastInvalidState.value = r;\n    return !!result.$externalResults.value.length || r;\n  });\n  result.$pending = computed(() => ruleKeys.some(ruleKey => unref(result[ruleKey].$pending)));\n  result.$error = computed(() => result.$dirty.value ? result.$pending.value || result.$invalid.value : false);\n  result.$silentErrors = computed(() => ruleKeys.filter(ruleKey => unref(result[ruleKey].$invalid)).map(ruleKey => {\n    const res = result[ruleKey];\n    return reactive({\n      $propertyPath: path,\n      $property: key,\n      $validator: ruleKey,\n      $uid: `${path}-${ruleKey}`,\n      $message: res.$message,\n      $params: res.$params,\n      $response: res.$response,\n      $pending: res.$pending\n    });\n  }).concat(result.$externalResults.value));\n  result.$errors = computed(() => result.$dirty.value ? result.$silentErrors.value : []);\n\n  result.$unwatch = () => ruleKeys.forEach(ruleKey => {\n    result[ruleKey].$unwatch();\n  });\n\n  result.$commit = () => {\n    $lastInvalidState.value = true;\n    $lastCommittedOn.value = Date.now();\n  };\n\n  resultsCache.set(path, rules, result);\n  return result;\n}\n\nfunction collectNestedValidationResults(validations, nestedState, path, resultsCache, config, instance, nestedExternalResults) {\n  const nestedValidationKeys = Object.keys(validations);\n  if (!nestedValidationKeys.length) return {};\n  return nestedValidationKeys.reduce((results, nestedKey) => {\n    results[nestedKey] = setValidations({\n      validations: validations[nestedKey],\n      state: nestedState,\n      key: nestedKey,\n      parentKey: path,\n      resultsCache,\n      globalConfig: config,\n      instance,\n      externalResults: nestedExternalResults\n    });\n    return results;\n  }, {});\n}\n\nfunction createMetaFields(results, nestedResults, childResults) {\n  const allResults = computed(() => [nestedResults, childResults].filter(res => res).reduce((allRes, res) => {\n    return allRes.concat(Object.values(unref(res)));\n  }, []));\n  const $dirty = computed({\n    get() {\n      return results.$dirty.value || (allResults.value.length ? allResults.value.every(r => r.$dirty) : false);\n    },\n\n    set(v) {\n      results.$dirty.value = v;\n    }\n\n  });\n  const $silentErrors = computed(() => {\n    const modelErrors = unref(results.$silentErrors) || [];\n    const nestedErrors = allResults.value.filter(result => (unref(result).$silentErrors || []).length).reduce((errors, result) => {\n      return errors.concat(...result.$silentErrors);\n    }, []);\n    return modelErrors.concat(nestedErrors);\n  });\n  const $errors = computed(() => {\n    const modelErrors = unref(results.$errors) || [];\n    const nestedErrors = allResults.value.filter(result => (unref(result).$errors || []).length).reduce((errors, result) => {\n      return errors.concat(...result.$errors);\n    }, []);\n    return modelErrors.concat(nestedErrors);\n  });\n  const $invalid = computed(() => allResults.value.some(r => r.$invalid) || unref(results.$invalid) || false);\n  const $pending = computed(() => allResults.value.some(r => unref(r.$pending)) || unref(results.$pending) || false);\n  const $anyDirty = computed(() => allResults.value.some(r => r.$dirty) || allResults.value.some(r => r.$anyDirty) || $dirty.value);\n  const $error = computed(() => $dirty.value ? $pending.value || $invalid.value : false);\n\n  const $touch = () => {\n    results.$touch();\n    allResults.value.forEach(result => {\n      result.$touch();\n    });\n  };\n\n  const $commit = () => {\n    results.$commit();\n    allResults.value.forEach(result => {\n      result.$commit();\n    });\n  };\n\n  const $reset = () => {\n    results.$reset();\n    allResults.value.forEach(result => {\n      result.$reset();\n    });\n  };\n\n  if (allResults.value.length && allResults.value.every(nr => nr.$dirty)) $touch();\n  return {\n    $dirty,\n    $errors,\n    $invalid,\n    $anyDirty,\n    $error,\n    $pending,\n    $touch,\n    $reset,\n    $silentErrors,\n    $commit\n  };\n}\n\nfunction setValidations(_ref) {\n  let {\n    validations,\n    state,\n    key,\n    parentKey,\n    childResults,\n    resultsCache,\n    globalConfig = {},\n    instance,\n    externalResults\n  } = _ref;\n  const path = parentKey ? `${parentKey}.${key}` : key;\n  const {\n    rules,\n    nestedValidators,\n    config,\n    validationGroups\n  } = sortValidations(validations);\n\n  const mergedConfig = _objectSpread2(_objectSpread2({}, globalConfig), config);\n\n  const nestedState = key ? computed(() => {\n    const s = unref(state);\n    return s ? unref(s[key]) : undefined;\n  }) : state;\n\n  const cachedExternalResults = _objectSpread2({}, unref(externalResults) || {});\n\n  const nestedExternalResults = computed(() => {\n    const results = unref(externalResults);\n    if (!key) return results;\n    return results ? unref(results[key]) : undefined;\n  });\n  const results = createValidationResults(rules, nestedState, key, resultsCache, path, mergedConfig, instance, nestedExternalResults, state);\n  const nestedResults = collectNestedValidationResults(nestedValidators, nestedState, path, resultsCache, mergedConfig, instance, nestedExternalResults);\n  const $validationGroups = {};\n\n  if (validationGroups) {\n    Object.entries(validationGroups).forEach(_ref2 => {\n      let [key, group] = _ref2;\n      $validationGroups[key] = {\n        $invalid: gatherBooleanGroupProperties(group, nestedResults, '$invalid'),\n        $error: gatherBooleanGroupProperties(group, nestedResults, '$error'),\n        $pending: gatherBooleanGroupProperties(group, nestedResults, '$pending'),\n        $errors: gatherArrayGroupProperties(group, nestedResults, '$errors'),\n        $silentErrors: gatherArrayGroupProperties(group, nestedResults, '$silentErrors')\n      };\n    });\n  }\n\n  const {\n    $dirty,\n    $errors,\n    $invalid,\n    $anyDirty,\n    $error,\n    $pending,\n    $touch,\n    $reset,\n    $silentErrors,\n    $commit\n  } = createMetaFields(results, nestedResults, childResults);\n  const $model = key ? computed({\n    get: () => unref(nestedState),\n    set: val => {\n      $dirty.value = true;\n      const s = unref(state);\n      const external = unref(externalResults);\n\n      if (external) {\n        external[key] = cachedExternalResults[key];\n      }\n\n      if (isRef(s[key])) {\n        s[key].value = val;\n      } else {\n        s[key] = val;\n      }\n    }\n  }) : null;\n\n  if (key && mergedConfig.$autoDirty) {\n    watch(nestedState, () => {\n      if (!$dirty.value) $touch();\n      const external = unref(externalResults);\n\n      if (external) {\n        external[key] = cachedExternalResults[key];\n      }\n    }, {\n      flush: 'sync'\n    });\n  }\n\n  async function $validate() {\n    $touch();\n\n    if (mergedConfig.$rewardEarly) {\n      $commit();\n      await nextTick();\n    }\n\n    await nextTick();\n    return new Promise(resolve => {\n      if (!$pending.value) return resolve(!$invalid.value);\n      const unwatch = watch($pending, () => {\n        resolve(!$invalid.value);\n        unwatch();\n      });\n    });\n  }\n\n  function $getResultsForChild(key) {\n    return (childResults.value || {})[key];\n  }\n\n  function $clearExternalResults() {\n    if (isRef(externalResults)) {\n      externalResults.value = cachedExternalResults;\n    } else {\n      if (Object.keys(cachedExternalResults).length === 0) {\n        Object.keys(externalResults).forEach(k => {\n          delete externalResults[k];\n        });\n      } else {\n        Object.assign(externalResults, cachedExternalResults);\n      }\n    }\n  }\n\n  return reactive(_objectSpread2(_objectSpread2(_objectSpread2({}, results), {}, {\n    $model,\n    $dirty,\n    $error,\n    $errors,\n    $invalid,\n    $anyDirty,\n    $pending,\n    $touch,\n    $reset,\n    $path: path || ROOT_PATH,\n    $silentErrors,\n    $validate,\n    $commit\n  }, childResults && {\n    $getResultsForChild,\n    $clearExternalResults,\n    $validationGroups\n  }), nestedResults));\n}\n\nclass ResultsStorage {\n  constructor() {\n    this.storage = new Map();\n  }\n\n  set(path, rules, result) {\n    this.storage.set(path, {\n      rules,\n      result\n    });\n  }\n\n  checkRulesValidity(path, rules, storedRules) {\n    const storedRulesKeys = Object.keys(storedRules);\n    const newRulesKeys = Object.keys(rules);\n    if (newRulesKeys.length !== storedRulesKeys.length) return false;\n    const hasAllValidators = newRulesKeys.every(ruleKey => storedRulesKeys.includes(ruleKey));\n    if (!hasAllValidators) return false;\n    return newRulesKeys.every(ruleKey => {\n      if (!rules[ruleKey].$params) return true;\n      return Object.keys(rules[ruleKey].$params).every(paramKey => {\n        return unref(storedRules[ruleKey].$params[paramKey]) === unref(rules[ruleKey].$params[paramKey]);\n      });\n    });\n  }\n\n  get(path, rules) {\n    const storedRuleResultPair = this.storage.get(path);\n    if (!storedRuleResultPair) return undefined;\n    const {\n      rules: storedRules,\n      result\n    } = storedRuleResultPair;\n    const isValidCache = this.checkRulesValidity(path, rules, storedRules);\n    const $unwatch = result.$unwatch ? result.$unwatch : () => ({});\n    if (!isValidCache) return {\n      $dirty: result.$dirty,\n      $partial: true,\n      $unwatch\n    };\n    return result;\n  }\n\n}\n\nconst CollectFlag = {\n  COLLECT_ALL: true,\n  COLLECT_NONE: false\n};\nconst VuelidateInjectChildResults = Symbol('vuelidate#injectChildResults');\nconst VuelidateRemoveChildResults = Symbol('vuelidate#removeChildResults');\nfunction nestedValidations(_ref) {\n  let {\n    $scope,\n    instance\n  } = _ref;\n  const childResultsRaw = {};\n  const childResultsKeys = ref([]);\n  const childResults = computed(() => childResultsKeys.value.reduce((results, key) => {\n    results[key] = unref(childResultsRaw[key]);\n    return results;\n  }, {}));\n\n  function injectChildResultsIntoParent(results, _ref2) {\n    let {\n      $registerAs: key,\n      $scope: childScope,\n      $stopPropagation\n    } = _ref2;\n    if ($stopPropagation || $scope === CollectFlag.COLLECT_NONE || childScope === CollectFlag.COLLECT_NONE || $scope !== CollectFlag.COLLECT_ALL && $scope !== childScope) return;\n    childResultsRaw[key] = results;\n    childResultsKeys.value.push(key);\n  }\n\n  instance.__vuelidateInjectInstances = [].concat(instance.__vuelidateInjectInstances || [], injectChildResultsIntoParent);\n\n  function removeChildResultsFromParent(key) {\n    childResultsKeys.value = childResultsKeys.value.filter(childKey => childKey !== key);\n    delete childResultsRaw[key];\n  }\n\n  instance.__vuelidateRemoveInstances = [].concat(instance.__vuelidateRemoveInstances || [], removeChildResultsFromParent);\n  const sendValidationResultsToParent = inject(VuelidateInjectChildResults, []);\n  provide(VuelidateInjectChildResults, instance.__vuelidateInjectInstances);\n  const removeValidationResultsFromParent = inject(VuelidateRemoveChildResults, []);\n  provide(VuelidateRemoveChildResults, instance.__vuelidateRemoveInstances);\n  return {\n    childResults,\n    sendValidationResultsToParent,\n    removeValidationResultsFromParent\n  };\n}\n\nfunction ComputedProxyFactory(target) {\n  return new Proxy(target, {\n    get(target, prop) {\n      return typeof target[prop] === 'object' ? ComputedProxyFactory(target[prop]) : computed(() => target[prop]);\n    }\n\n  });\n}\n\nlet uid = 0;\nfunction useVuelidate(validations, state) {\n  var _getCurrentInstance;\n\n  let globalConfig = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n  if (arguments.length === 1) {\n    globalConfig = validations;\n    validations = undefined;\n    state = undefined;\n  }\n\n  let {\n    $registerAs,\n    $scope = CollectFlag.COLLECT_ALL,\n    $stopPropagation,\n    $externalResults,\n    currentVueInstance\n  } = globalConfig;\n  const instance = currentVueInstance || ((_getCurrentInstance = getCurrentInstance()) === null || _getCurrentInstance === void 0 ? void 0 : _getCurrentInstance.proxy);\n  const componentOptions = instance ? instance.$options : {};\n\n  if (!$registerAs) {\n    uid += 1;\n    $registerAs = `_vuelidate_${uid}`;\n  }\n\n  const validationResults = ref({});\n  const resultsCache = new ResultsStorage();\n  const {\n    childResults,\n    sendValidationResultsToParent,\n    removeValidationResultsFromParent\n  } = instance ? nestedValidations({\n    $scope,\n    instance\n  }) : {\n    childResults: ref({})\n  };\n\n  if (!validations && componentOptions.validations) {\n    const rules = componentOptions.validations;\n    state = ref({});\n    onBeforeMount(() => {\n      state.value = instance;\n      watch(() => isFunction(rules) ? rules.call(state.value, new ComputedProxyFactory(state.value)) : rules, validations => {\n        validationResults.value = setValidations({\n          validations,\n          state,\n          childResults,\n          resultsCache,\n          globalConfig,\n          instance,\n          externalResults: $externalResults || instance.vuelidateExternalResults\n        });\n      }, {\n        immediate: true\n      });\n    });\n    globalConfig = componentOptions.validationsConfig || globalConfig;\n  } else {\n    const validationsWatchTarget = isRef(validations) || isProxy(validations) ? validations : reactive(validations || {});\n    watch(validationsWatchTarget, newValidationRules => {\n      validationResults.value = setValidations({\n        validations: newValidationRules,\n        state,\n        childResults,\n        resultsCache,\n        globalConfig,\n        instance: instance !== null && instance !== void 0 ? instance : {},\n        externalResults: $externalResults\n      });\n    }, {\n      immediate: true\n    });\n  }\n\n  if (instance) {\n    sendValidationResultsToParent.forEach(f => f(validationResults, {\n      $registerAs,\n      $scope,\n      $stopPropagation\n    }));\n    onBeforeUnmount(() => removeValidationResultsFromParent.forEach(f => f($registerAs)));\n  }\n\n  return computed(() => {\n    return _objectSpread2(_objectSpread2({}, unref(validationResults.value)), childResults.value);\n  });\n}\n\nexport { CollectFlag, useVuelidate as default, useVuelidate };\n","import { unref } from 'vue-demi';\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    enumerableOnly && (symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    })), keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = null != arguments[i] ? arguments[i] : {};\n    i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n      _defineProperty(target, key, source[key]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n      Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n    });\n  }\n\n  return target;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction isFunction(val) {\n  return typeof val === 'function';\n}\nfunction isObject(o) {\n  return o !== null && typeof o === 'object' && !Array.isArray(o);\n}\nfunction normalizeValidatorObject(validator) {\n  return isFunction(validator.$validator) ? _objectSpread2({}, validator) : {\n    $validator: validator\n  };\n}\nfunction isPromise(object) {\n  return isObject(object) && isFunction(object.then);\n}\nfunction unwrapValidatorResponse(result) {\n  if (typeof result === 'object') return result.$valid;\n  return result;\n}\nfunction unwrapNormalizedValidator(validator) {\n  return validator.$validator || validator;\n}\n\nfunction withParams($params, $validator) {\n  if (!isObject($params)) throw new Error(`[@vuelidate/validators]: First parameter to \"withParams\" should be an object, provided ${typeof $params}`);\n  if (!isObject($validator) && !isFunction($validator)) throw new Error(`[@vuelidate/validators]: Validator must be a function or object with $validator parameter`);\n  const validatorObj = normalizeValidatorObject($validator);\n  validatorObj.$params = _objectSpread2(_objectSpread2({}, validatorObj.$params || {}), $params);\n  return validatorObj;\n}\n\nfunction withMessage($message, $validator) {\n  if (!isFunction($message) && typeof unref($message) !== 'string') throw new Error(`[@vuelidate/validators]: First parameter to \"withMessage\" should be string or a function returning a string, provided ${typeof $message}`);\n  if (!isObject($validator) && !isFunction($validator)) throw new Error(`[@vuelidate/validators]: Validator must be a function or object with $validator parameter`);\n  const validatorObj = normalizeValidatorObject($validator);\n  validatorObj.$message = $message;\n  return validatorObj;\n}\n\nfunction withAsync($validator) {\n  let $watchTargets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  const validatorObj = normalizeValidatorObject($validator);\n  return _objectSpread2(_objectSpread2({}, validatorObj), {}, {\n    $async: true,\n    $watchTargets\n  });\n}\n\nfunction forEach(validators) {\n  return {\n    $validator(collection) {\n      for (var _len = arguments.length, others = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        others[_key - 1] = arguments[_key];\n      }\n\n      return unref(collection).reduce((previous, collectionItem, index) => {\n        const collectionEntryResult = Object.entries(collectionItem).reduce((all, _ref) => {\n          let [property, $model] = _ref;\n          const innerValidators = validators[property] || {};\n          const propertyResult = Object.entries(innerValidators).reduce((all, _ref2) => {\n            let [validatorName, currentValidator] = _ref2;\n            const validatorFunction = unwrapNormalizedValidator(currentValidator);\n            const $response = validatorFunction.call(this, $model, collectionItem, index, ...others);\n            const $valid = unwrapValidatorResponse($response);\n            all.$data[validatorName] = $response;\n            all.$data.$invalid = !$valid || !!all.$data.$invalid;\n            all.$data.$error = all.$data.$invalid;\n\n            if (!$valid) {\n              let $message = currentValidator.$message || '';\n              const $params = currentValidator.$params || {};\n\n              if (typeof $message === 'function') {\n                $message = $message({\n                  $pending: false,\n                  $invalid: !$valid,\n                  $params,\n                  $model,\n                  $response\n                });\n              }\n\n              all.$errors.push({\n                $property: property,\n                $message,\n                $params,\n                $response,\n                $model,\n                $pending: false,\n                $validator: validatorName\n              });\n            }\n\n            return {\n              $valid: all.$valid && $valid,\n              $data: all.$data,\n              $errors: all.$errors\n            };\n          }, {\n            $valid: true,\n            $data: {},\n            $errors: []\n          });\n          all.$data[property] = propertyResult.$data;\n          all.$errors[property] = propertyResult.$errors;\n          return {\n            $valid: all.$valid && propertyResult.$valid,\n            $data: all.$data,\n            $errors: all.$errors\n          };\n        }, {\n          $valid: true,\n          $data: {},\n          $errors: {}\n        });\n        return {\n          $valid: previous.$valid && collectionEntryResult.$valid,\n          $data: previous.$data.concat(collectionEntryResult.$data),\n          $errors: previous.$errors.concat(collectionEntryResult.$errors)\n        };\n      }, {\n        $valid: true,\n        $data: [],\n        $errors: []\n      });\n    },\n\n    $message: _ref3 => {\n      let {\n        $response\n      } = _ref3;\n      return $response ? $response.$errors.map(context => {\n        return Object.values(context).map(errors => errors.map(error => error.$message)).reduce((a, b) => a.concat(b), []);\n      }) : [];\n    }\n  };\n}\n\nconst req = value => {\n  value = unref(value);\n  if (Array.isArray(value)) return !!value.length;\n\n  if (value === undefined || value === null) {\n    return false;\n  }\n\n  if (value === false) {\n    return true;\n  }\n\n  if (value instanceof Date) {\n    return !isNaN(value.getTime());\n  }\n\n  if (typeof value === 'object') {\n    for (let _ in value) return true;\n\n    return false;\n  }\n\n  return !!String(value).length;\n};\nconst len = value => {\n  value = unref(value);\n  if (Array.isArray(value)) return value.length;\n\n  if (typeof value === 'object') {\n    return Object.keys(value).length;\n  }\n\n  return String(value).length;\n};\nfunction regex() {\n  for (var _len = arguments.length, expr = new Array(_len), _key = 0; _key < _len; _key++) {\n    expr[_key] = arguments[_key];\n  }\n\n  return value => {\n    value = unref(value);\n    return !req(value) || expr.every(reg => {\n      reg.lastIndex = 0;\n      return reg.test(value);\n    });\n  };\n}\n\nvar common = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  forEach: forEach,\n  len: len,\n  normalizeValidatorObject: normalizeValidatorObject,\n  regex: regex,\n  req: req,\n  unwrap: unref,\n  unwrapNormalizedValidator: unwrapNormalizedValidator,\n  unwrapValidatorResponse: unwrapValidatorResponse,\n  withAsync: withAsync,\n  withMessage: withMessage,\n  withParams: withParams\n});\n\nvar alpha$1 = regex(/^[a-zA-Z]*$/);\n\nvar alpha = {\n  $validator: alpha$1,\n  $message: 'The value is not alphabetical',\n  $params: {\n    type: 'alpha'\n  }\n};\n\nvar alphaNum$1 = regex(/^[a-zA-Z0-9]*$/);\n\nvar alphaNum = {\n  $validator: alphaNum$1,\n  $message: 'The value must be alpha-numeric',\n  $params: {\n    type: 'alphaNum'\n  }\n};\n\nvar numeric$1 = regex(/^\\d*(\\.\\d+)?$/);\n\nvar numeric = {\n  $validator: numeric$1,\n  $message: 'Value must be numeric',\n  $params: {\n    type: 'numeric'\n  }\n};\n\nfunction between$1 (min, max) {\n  return value => !req(value) || (!/\\s/.test(value) || value instanceof Date) && +unref(min) <= +value && +unref(max) >= +value;\n}\n\nfunction between (min, max) {\n  return {\n    $validator: between$1(min, max),\n    $message: _ref => {\n      let {\n        $params\n      } = _ref;\n      return `The value must be between ${$params.min} and ${$params.max}`;\n    },\n    $params: {\n      min,\n      max,\n      type: 'between'\n    }\n  };\n}\n\nconst emailRegex = /^(?:[A-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[A-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9]{2,}(?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nvar email$1 = regex(emailRegex);\n\nvar email = {\n  $validator: email$1,\n  $message: 'Value is not a valid email address',\n  $params: {\n    type: 'email'\n  }\n};\n\nfunction ipAddress$1 (value) {\n  if (!req(value)) {\n    return true;\n  }\n\n  if (typeof value !== 'string') {\n    return false;\n  }\n\n  const nibbles = value.split('.');\n  return nibbles.length === 4 && nibbles.every(nibbleValid);\n}\n\nconst nibbleValid = nibble => {\n  if (nibble.length > 3 || nibble.length === 0) {\n    return false;\n  }\n\n  if (nibble[0] === '0' && nibble !== '0') {\n    return false;\n  }\n\n  if (!nibble.match(/^\\d+$/)) {\n    return false;\n  }\n\n  const numeric = +nibble | 0;\n  return numeric >= 0 && numeric <= 255;\n};\n\nvar ipAddress = {\n  $validator: ipAddress$1,\n  $message: 'The value is not a valid IP address',\n  $params: {\n    type: 'ipAddress'\n  }\n};\n\nfunction macAddress$1 () {\n  let separator = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ':';\n  return value => {\n    separator = unref(separator);\n\n    if (!req(value)) {\n      return true;\n    }\n\n    if (typeof value !== 'string') {\n      return false;\n    }\n\n    const parts = typeof separator === 'string' && separator !== '' ? value.split(separator) : value.length === 12 || value.length === 16 ? value.match(/.{2}/g) : null;\n    return parts !== null && (parts.length === 6 || parts.length === 8) && parts.every(hexValid);\n  };\n}\n\nconst hexValid = hex => hex.toLowerCase().match(/^[0-9a-f]{2}$/);\n\nfunction macAddress (separator) {\n  return {\n    $validator: macAddress$1(separator),\n    $message: 'The value is not a valid MAC Address',\n    $params: {\n      type: 'macAddress'\n    }\n  };\n}\n\nfunction maxLength$1 (length) {\n  return value => !req(value) || len(value) <= unref(length);\n}\n\nfunction maxLength (max) {\n  return {\n    $validator: maxLength$1(max),\n    $message: _ref => {\n      let {\n        $params\n      } = _ref;\n      return `The maximum length allowed is ${$params.max}`;\n    },\n    $params: {\n      max,\n      type: 'maxLength'\n    }\n  };\n}\n\nfunction minLength$1 (length) {\n  return value => !req(value) || len(value) >= unref(length);\n}\n\nfunction minLength (min) {\n  return {\n    $validator: minLength$1(min),\n    $message: _ref => {\n      let {\n        $params\n      } = _ref;\n      return `This field should be at least ${$params.min} characters long`;\n    },\n    $params: {\n      min,\n      type: 'minLength'\n    }\n  };\n}\n\nfunction required$1 (value) {\n  if (typeof value === 'string') {\n    value = value.trim();\n  }\n\n  return req(value);\n}\n\nvar required = {\n  $validator: required$1,\n  $message: 'Value is required',\n  $params: {\n    type: 'required'\n  }\n};\n\nconst validate$1 = (prop, val) => prop ? req(typeof val === 'string' ? val.trim() : val) : true;\n\nfunction requiredIf$1(propOrFunction) {\n  return function (value, parentVM) {\n    if (typeof propOrFunction !== 'function') {\n      return validate$1(unref(propOrFunction), value);\n    }\n\n    const result = propOrFunction.call(this, value, parentVM);\n    return validate$1(result, value);\n  };\n}\n\nfunction requiredIf (prop) {\n  return {\n    $validator: requiredIf$1(prop),\n    $message: 'The value is required',\n    $params: {\n      type: 'requiredIf',\n      prop\n    }\n  };\n}\n\nconst validate = (prop, val) => !prop ? req(typeof val === 'string' ? val.trim() : val) : true;\n\nfunction requiredUnless$1(propOrFunction) {\n  return function (value, parentVM) {\n    if (typeof propOrFunction !== 'function') {\n      return validate(unref(propOrFunction), value);\n    }\n\n    const result = propOrFunction.call(this, value, parentVM);\n    return validate(result, value);\n  };\n}\n\nfunction requiredUnless (prop) {\n  return {\n    $validator: requiredUnless$1(prop),\n    $message: 'The value is required',\n    $params: {\n      type: 'requiredUnless',\n      prop\n    }\n  };\n}\n\nfunction sameAs$1 (equalTo) {\n  return value => unref(value) === unref(equalTo);\n}\n\nfunction sameAs (equalTo) {\n  let otherName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'other';\n  return {\n    $validator: sameAs$1(equalTo),\n    $message: _ref => {\n      return `The value must be equal to the ${otherName} value`;\n    },\n    $params: {\n      equalTo,\n      otherName,\n      type: 'sameAs'\n    }\n  };\n}\n\nconst urlRegex = /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i;\nvar url$1 = regex(urlRegex);\n\nvar url = {\n  $validator: url$1,\n  $message: 'The value is not a valid URL address',\n  $params: {\n    type: 'url'\n  }\n};\n\nfunction syncOr(validators) {\n  return function () {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return validators.reduce((valid, fn) => {\n      if (unwrapValidatorResponse(valid)) return valid;\n      return unwrapNormalizedValidator(fn).apply(this, args);\n    }, false);\n  };\n}\n\nfunction asyncOr(validators) {\n  return function () {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    return validators.reduce(async (valid, fn) => {\n      const r = await valid;\n      if (unwrapValidatorResponse(r)) return r;\n      return unwrapNormalizedValidator(fn).apply(this, args);\n    }, Promise.resolve(false));\n  };\n}\n\nfunction or$1() {\n  for (var _len3 = arguments.length, validators = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n    validators[_key3] = arguments[_key3];\n  }\n\n  const $async = validators.some(v => v.$async);\n  const $watchTargets = validators.reduce((all, v) => {\n    if (!v.$watchTargets) return all;\n    return all.concat(v.$watchTargets);\n  }, []);\n\n  let $validator = () => false;\n\n  if (validators.length) $validator = $async ? asyncOr(validators) : syncOr(validators);\n  return {\n    $async,\n    $validator,\n    $watchTargets\n  };\n}\n\nfunction or () {\n  return withParams({\n    type: 'or'\n  }, withMessage('The value does not match any of the provided validators', or$1(...arguments)));\n}\n\nfunction syncAnd(validators) {\n  return function () {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return validators.reduce((valid, fn) => {\n      if (!unwrapValidatorResponse(valid)) return valid;\n      return unwrapNormalizedValidator(fn).apply(this, args);\n    }, true);\n  };\n}\n\nfunction asyncAnd(validators) {\n  return function () {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    return validators.reduce(async (valid, fn) => {\n      const r = await valid;\n      if (!unwrapValidatorResponse(r)) return r;\n      return unwrapNormalizedValidator(fn).apply(this, args);\n    }, Promise.resolve(true));\n  };\n}\n\nfunction and$1() {\n  for (var _len3 = arguments.length, validators = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n    validators[_key3] = arguments[_key3];\n  }\n\n  const $async = validators.some(v => v.$async);\n  const $watchTargets = validators.reduce((all, v) => {\n    if (!v.$watchTargets) return all;\n    return all.concat(v.$watchTargets);\n  }, []);\n\n  let $validator = () => false;\n\n  if (validators.length) $validator = $async ? asyncAnd(validators) : syncAnd(validators);\n  return {\n    $async,\n    $validator,\n    $watchTargets\n  };\n}\n\nfunction and () {\n  return withParams({\n    type: 'and'\n  }, withMessage('The value does not match all of the provided validators', and$1(...arguments)));\n}\n\nfunction not$1 (validator) {\n  return function (value, vm) {\n    if (!req(value)) return true;\n    const response = unwrapNormalizedValidator(validator).call(this, value, vm);\n    if (!isPromise(response)) return !unwrapValidatorResponse(response);\n    return response.then(r => !unwrapValidatorResponse(r));\n  };\n}\n\nfunction not (validator) {\n  return {\n    $validator: not$1(validator),\n    $message: `The value does not match the provided validator`,\n    $params: {\n      type: 'not'\n    }\n  };\n}\n\nfunction minValue$1 (min) {\n  return value => !req(value) || (!/\\s/.test(value) || value instanceof Date) && +value >= +unref(min);\n}\n\nfunction minValue (min) {\n  return {\n    $validator: minValue$1(min),\n    $message: _ref => {\n      let {\n        $params\n      } = _ref;\n      return `The minimum value allowed is ${$params.min}`;\n    },\n    $params: {\n      min,\n      type: 'minValue'\n    }\n  };\n}\n\nfunction maxValue$1 (max) {\n  return value => !req(value) || (!/\\s/.test(value) || value instanceof Date) && +value <= +unref(max);\n}\n\nvar maxValue = (max => ({\n  $validator: maxValue$1(max),\n  $message: _ref => {\n    let {\n      $params\n    } = _ref;\n    return `The maximum value allowed is ${$params.max}`;\n  },\n  $params: {\n    max,\n    type: 'maxValue'\n  }\n}));\n\nvar integer$1 = regex(/(^[0-9]*$)|(^-[0-9]+$)/);\n\nvar integer = {\n  $validator: integer$1,\n  $message: 'Value is not an integer',\n  $params: {\n    type: 'integer'\n  }\n};\n\nvar decimal$1 = regex(/^[-]?\\d*(\\.\\d+)?$/);\n\nvar decimal = {\n  $validator: decimal$1,\n  $message: 'Value must be decimal',\n  $params: {\n    type: 'decimal'\n  }\n};\n\nfunction createI18nMessage(_ref) {\n  let {\n    t,\n    messagePath = _ref2 => {\n      let {\n        $validator\n      } = _ref2;\n      return `validations.${$validator}`;\n    },\n    messageParams = params => params\n  } = _ref;\n  return function withI18nMessage(validator) {\n    let {\n      withArguments = false,\n      messagePath: localMessagePath = messagePath,\n      messageParams: localMessageParams = messageParams\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    function message(props) {\n      return t(localMessagePath(props), localMessageParams(_objectSpread2({\n        model: props.$model,\n        property: props.$property,\n        pending: props.$pending,\n        invalid: props.$invalid,\n        response: props.$response,\n        validator: props.$validator,\n        propertyPath: props.$propertyPath\n      }, props.$params)));\n    }\n\n    if (withArguments && typeof validator === 'function') {\n      return function () {\n        return withMessage(message, validator(...arguments));\n      };\n    }\n\n    return withMessage(message, validator);\n  };\n}\n\nexport { alpha, alphaNum, and, between, createI18nMessage, decimal, email, common as helpers, integer, ipAddress, macAddress, maxLength, maxValue, minLength, minValue, not, numeric, or, required, requiredIf, requiredUnless, sameAs, url };\n","/**\r\n * Generates a random, 6-digit, alpha-numeric string.\r\n * Intended to be used when a unique ID is needed for associating DOM elements, such as a label and a form field.\r\n */\r\nexport default function getId() {\r\n  return Math.random().toString(36).slice(2, 8);\r\n}\r\n","<script>\r\n/**\r\n * A generic form control wrapper for sharing functionality common to all form fields (i.e., labels, error messages, etc.)\r\n * Probably don't use this component directly. Prefer to use FhInput, FhSelect, etc., which all extend this component.\r\n */\r\nexport default {\r\n  inheritAttrs: false\r\n};\r\n</script>\r\n<script setup>\r\nimport { computed, useSlots, useAttrs } from \"vue\";\r\nimport getId from \"../util/getId\";\r\n\r\nconst props = defineProps({\r\n  label: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  note: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  disabled: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  required: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  error: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  errorMessage: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  /**\r\n   * The Vuelidate validation object for this field. Use this to automatically set the error state and errorMessage.\r\n   * The `errorMessage` prop will override any error messages from this prop if both are set.\r\n   */\r\n  vuelidate: {\r\n    type: Object,\r\n    default: () => undefined\r\n  },\r\n  /**\r\n   * Fallthrough attributes are applied to the inner form control. Use this object if you need to bind anything custom to the form field wrapper node intead.\r\n   */\r\n  wrapperAttrs: {\r\n    type: Object,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nconst slots = useSlots();\r\n\r\nif (!slots.default) {\r\n  throw new Error(\"FhFormField requires a form control in the default slot\");\r\n}\r\n\r\nconst formControlId = getId();\r\n\r\nconst noteId = getId();\r\nconst hasNote = computed(() => props.note || slots.note);\r\n\r\nconst errorMessageId = getId();\r\nconst hasVuelidateError = computed(() => !!props.vuelidate?.$error);\r\nconst hasError = computed(() => props.error || hasVuelidateError.value);\r\nconst hasErrorMessage = computed(() => (props.error && (props.errorMessage || slots.errorMessage)) || hasVuelidateError.value);\r\n\r\nconst attrs = useAttrs();\r\n\r\nconst formControlBindings = computed(() => ({\r\n  ...attrs,\r\n  id: formControlId,\r\n  disabled: props.disabled,\r\n  \"aria-required\": props.required,\r\n  \"aria-describedby\": hasNote.value ? noteId : false,\r\n  \"aria-invalid\": hasError.value,\r\n  \"aria-errormessage\": hasErrorMessage.value ? errorMessageId : false,\r\n  onBlur: () => {\r\n    if (props.vuelidate) props.vuelidate.$touch();\r\n    if (attrs.onBlur) attrs.onBlur();\r\n  }\r\n}));\r\n</script>\r\n\r\n<template>\r\n  <div :class=\"props.label ? 'gap-f1.5' : 'gap-f0'\" class=\"relative flex flex-col\" v-bind=\"wrapperAttrs\">\r\n    <div class=\"flex items-end\">\r\n      <label v-if=\"props.label\" :for=\"formControlId\" class=\"flex flex-row flex-wrap items-baseline gap-f1\">\r\n        <span>{{ label }}</span>\r\n        <span v-if=\"props.required\" class=\"text-body-xs text-neutral-50\">(Required)</span>\r\n      </label>\r\n      <div v-if=\"slots.topRight\" class=\"ml-auto\">\r\n        <slot name=\"topRight\"></slot>\r\n      </div>\r\n    </div>\r\n    <slot name=\"default\" v-bind=\"formControlBindings\"></slot>\r\n    <div v-if=\"slots.revealPassword\" class=\"absolute top-0 right-0\">\r\n      <slot name=\"revealPassword\"></slot>\r\n    </div>\r\n    <div v-if=\"hasNote\" :id=\"noteId\" class=\"text-body-sm max-w-prose text-neutral-50\">\r\n      <slot name=\"note\">{{ props.note }}</slot>\r\n    </div>\r\n    <div v-if=\"hasErrorMessage\" :id=\"errorMessageId\" class=\"text-body-sm max-w-prose text-brand-red\">\r\n      <slot name=\"errorMessage\">\r\n        <template v-if=\"props.errorMessage\">{{ props.errorMessage }}</template>\r\n        <template v-else-if=\"hasVuelidateError\">\r\n          <div v-for=\"errObj of props.vuelidate.$errors\" :key=\"errObj.$uid\">{{ errObj.$message }}</div>\r\n        </template>\r\n      </slot>\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { ref, computed } from \"vue\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\nimport FhFormField from \"./FhFormField.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: undefined,\r\n    required: true\r\n  },\r\n  type: {\r\n    type: String,\r\n    default: \"text\",\r\n    validator: (val) => [\"text\", \"password\", \"tel\", \"number\", \"date\"].includes(val)\r\n  },\r\n  placeholder: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  label: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  note: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  disabled: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  required: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  error: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  errorMessage: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  /**\r\n   * The Vuelidate validation object for this field. Use this to automatically set the error state and errorMessage.\r\n   * The `errorMessage` prop will override any error messages from this prop if both are set.\r\n   */\r\n  vuelidate: {\r\n    type: Object,\r\n    default: () => undefined\r\n  },\r\n  /**\r\n   * Fallthrough attributes are applied to the inner form control. Use this object if you need to bind anything custom to the form field wrapper node intead.\r\n   */\r\n  wrapperAttrs: {\r\n    type: Object,\r\n    default: () => {}\r\n  },\r\n  withDropDownIcon: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * Maximum number of decimal places allowed for number inputs\r\n   */\r\n  maxDecimalPlaces: {\r\n    type: Number,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\nconst isPassword = computed(() => props.type === \"password\");\r\nconst passwordIsVisible = ref(false);\r\nconst inputElement = ref(null);\r\n\r\nconst inputType = computed(() => (isPassword.value && passwordIsVisible.value ? \"text\" : props.type));\r\n\r\nconst handleInput = (event) => {\r\n  if (props.type === \"number\" && props.maxDecimalPlaces !== null) {\r\n    const value = event.target.value;\r\n    if (value.includes(\".\")) {\r\n      const parts = value.split(\".\");\r\n      if (parts[1] && parts[1].length > props.maxDecimalPlaces) {\r\n        const truncated = parseFloat(value).toFixed(props.maxDecimalPlaces);\r\n        event.target.value = truncated;\r\n        emit(\"update:modelValue\", parseFloat(truncated));\r\n      }\r\n    }\r\n  }\r\n};\r\n\r\ndefineExpose({\r\n  inputElement\r\n});\r\n</script>\r\n\r\n<template>\r\n  <FhFormField v-bind=\"{ label, note, disabled, required, error, errorMessage, vuelidate, wrapperAttrs }\">\r\n    <template #default=\"controlBindings\">\r\n      <input\r\n        ref=\"inputElement\"\r\n        v-bind=\"controlBindings\"\r\n        v-model=\"value\"\r\n        :type=\"inputType\"\r\n        :placeholder=\"props.placeholder\"\r\n        :readonly=\"props.withDropDownIcon\"\r\n        class=\"fh-input\"\r\n        @input=\"handleInput\"\r\n      />\r\n      <div v-if=\"props.withDropDownIcon\" class=\"absolute inset-y-0 right-0 flex items-center px-2 pointer-events-none\">\r\n        <svg class=\"h-5 w-5 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n          <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path>\r\n        </svg>\r\n      </div>\r\n    </template>\r\n    <template v-if=\"isPassword\" #revealPassword>\r\n      <FhButton\r\n        variant=\"text\"\r\n        class=\"translate-y-1 !pt-0\"\r\n        size=\"small\"\r\n        :title=\"`${passwordIsVisible ? 'Hide' : 'Show'} password`\"\r\n        @click=\"passwordIsVisible = !passwordIsVisible\"\r\n      >\r\n        <FhIcon name=\"PasswordReveal\" /> {{ passwordIsVisible ? \"Hide\" : \"Show\" }}\r\n      </FhButton>\r\n    </template>\r\n    <template v-if=\"$slots.note\" #note><slot name=\"note\"></slot></template>\r\n    <template v-if=\"$slots.errorMessage\" #errorMessage><slot name=\"errorMessage\"></slot></template>\r\n  </FhFormField>\r\n</template>\r\n","<script setup>\r\nimport { reactive, ref, watch } from \"vue\";\r\nimport { useNotificationStore } from \"../stores/NotificationStore.js\";\r\nimport { useUpdateCheckoutMutation, UPDATE_CHECKOUT_PATHS } from \"../api/checkoutApi\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, maxLength } from \"@vuelidate/validators\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhInput from \"./FhInput.vue\";\r\nimport FhModal from \"./FhModal.vue\";\r\n\r\nconst props = defineProps({\r\n  poNumber: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst data = reactive({\r\n  poNumber: props.poNumber\r\n});\r\n\r\nconst specialCharsValidation = helpers.regex(/^[^\\t]*$/);\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    poNumber: {\r\n      maxLength: helpers.withMessage(\"Please enter no more than 25 characters.\", maxLength(25)),\r\n      validCharacters: helpers.withMessage(\"Custom PO numbers cannot contain tabs.\", specialCharsValidation)\r\n    }\r\n  },\r\n  data\r\n);\r\n\r\nconst modalIsOpen = ref(false);\r\n\r\nwatch(\r\n  () => props.poNumber,\r\n  (val) => (data.poNumber = val)\r\n);\r\n\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst { mutate: updateCheckout, isLoading: isSaving } = useUpdateCheckoutMutation();\r\n\r\nfunction save() {\r\n  updateCheckout(\r\n    {\r\n      path: UPDATE_CHECKOUT_PATHS.PO,\r\n      data: {\r\n        poNumber: data.poNumber.trim()\r\n      }\r\n    },\r\n    {\r\n      onSuccess: () => (modalIsOpen.value = false),\r\n      onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not save your custom PO number. Please try again.\")\r\n    }\r\n  );\r\n}\r\n\r\nfunction cancel() {\r\n  data.poNumber = props.poNumber;\r\n  modalIsOpen.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div>\r\n    <div class=\"flex justify-between\" :class=\"[props.poNumber ? 'items-start' : 'items-center']\">\r\n      <div class=\"text-f-sm-lg\">PO</div>\r\n      <div v-if=\"props.poNumber\" class=\"text-right\">\r\n        <div>{{ props.poNumber }}</div>\r\n        <FhButton variant=\"link\" size=\"small\" @click=\"modalIsOpen = true\">Edit</FhButton>\r\n      </div>\r\n      <FhButton v-else variant=\"link\" size=\"small\" @click=\"modalIsOpen = true\">Add Custom PO</FhButton>\r\n    </div>\r\n    <FhModal v-model:is-open=\"modalIsOpen\" :data=\"{ heading: `${props.poNumber ? 'Edit' : 'Add'} Custom PO` }\">\r\n      <template #default><FhInput v-model=\"data.poNumber\" label=\"PO Number\" :vuelidate=\"vuelidate.poNumber\" /></template>\r\n      <template #footer>\r\n        <FhButton color=\"primary\" :disabled=\"vuelidate.$invalid || isSaving\" @click=\"save\">Save</FhButton>\r\n        <FhButton variant=\"text\" @click=\"cancel\">Cancel</FhButton>\r\n      </template>\r\n    </FhModal>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { ref } from \"vue\";\r\nconst props = defineProps({\r\n  title: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  isActive: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst checkoutSectionRef = ref(null);\r\ndefineExpose({\r\n  checkoutSectionRef\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div ref=\"checkoutSectionRef\" class=\"flex flex-col md:flex-row md:flex-wrap md:items-center\" :class=\"{ inactive: !props.isActive, 'pb-f10': props.isActive }\">\r\n    <div class=\"py-f5\">\r\n      <h2 class=\"text-f-xl-4xl\" :class=\"{ 'text-neutral-50': !props.isActive }\">{{ props.title }}</h2>\r\n    </div>\r\n    <div v-if=\"props.isActive\" class=\"w-full md:order-1\">\r\n      <slot></slot>\r\n    </div>\r\n    <div v-if=\"$slots.actions\" class=\"mt-f4 flex flex-col gap-f2 md:mt-0 md:ml-auto md:flex-row-reverse\">\r\n      <slot name=\"actions\"></slot>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style scoped>\r\n.inactive + .inactive {\r\n  @apply border-t border-neutral-30;\r\n}\r\n</style>\r\n","<script setup>\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\n\r\nconst props = defineProps({\r\n  title: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  alignment: {\r\n    type: String,\r\n    default: \"center\",\r\n    validator: (val) => [\"center\", \"top\"].includes(val)\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"change\"]);\r\n</script>\r\n\r\n<template>\r\n  <div\r\n    class=\"flex flex-row flex-wrap justify-between gap-f1 border border-neutral-30 p-f5 md:gap-f5\"\r\n    :class=\"{ 'items-center': props.alignment === 'center', 'items-start': props.alignment === 'top' }\"\r\n  >\r\n    <div class=\"order-1 flex h-7 w-7 items-center justify-center rounded-full border bg-neutral-70 md:h-8 md:w-8\">\r\n      <FhIcon name=\"Check\" class=\"h-2/3 w-2/3 text-white\" />\r\n    </div>\r\n    <div class=\"order-3 w-full grow md:order-2 md:w-auto\">\r\n      <slot name=\"content\">\r\n        <div v-if=\"props.title\" class=\"text-body-lg\">{{ props.title }}</div>\r\n        <div class=\"text-neutral-50\"><slot name=\"default\"></slot></div>\r\n      </slot>\r\n    </div>\r\n    <div class=\"order-2 flex gap-f2 md:order-3\">\r\n      <slot name=\"actions\">\r\n        <FhButton size=\"small\" @click=\"emit('change')\">Change</FhButton>\r\n      </slot>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nconst props = defineProps({\r\n  addressee: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  line1: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  line2: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  city: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  state: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  postalCode: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  country: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  phone: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  simpleDisplay: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst cityStatePostalCode = computed(() => {\r\n  let s = props.city;\r\n  if (props.state) s += \", \" + props.state;\r\n  s += \" \" + props.postalCode;\r\n  return s;\r\n});\r\n\r\nconst countryDisplayName = computed(() => new Intl.DisplayNames([\"en\"], { type: \"region\" }).of(props.country));\r\n</script>\r\n\r\n<template>\r\n  <div>\r\n    <div class=\"mb-f0.5\" :class=\"{ 'text-body-lg': !props.simpleDisplay }\">{{ props.addressee }}</div>\r\n    <div class=\"flex flex-col gap-f0.5\" :class=\"{ 'text-neutral-50': !props.simpleDisplay }\">\r\n      <div>{{ props.line1 }}</div>\r\n      <div v-if=\"props.line2\">{{ props.line2 }}</div>\r\n      <div>{{ cityStatePostalCode }}</div>\r\n      <div>{{ countryDisplayName }}</div>\r\n      <div v-if=\"props.phone\">{{ props.phone }}</div>\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { SHIPPING_OPTIONS, SHIPPING_OPTIONS_DEFINITION, FREIGHT_SERVICE_LEVEL, FREIGHT_SERVICE_LEVEL_DEFINITION } from \"@/constants/checkout\";\r\n\r\nconst props = defineProps({\r\n  shippingOption: {\r\n    type: String,\r\n    default: null,\r\n    validator: (val) => Object.values(SHIPPING_OPTIONS).includes(val)\r\n  },\r\n  freightServiceLevel: {\r\n    type: String,\r\n    default: null,\r\n    validator: (val) => Object.values(FREIGHT_SERVICE_LEVEL).includes(val)\r\n  },\r\n  carrierNotes: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carrierName: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carrierAccountNumber: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pickUpContactName: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pickUpContactPhone: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  holdDate: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst holdDateString = computed(() => {\r\n  if (!props.holdDate || isNaN(new Date(props.holdDate))) return null;\r\n  return \"Hold processing until \" + new Date(props.holdDate).toLocaleDateString(navigator.language || \"en-US\", { timeZone: \"UTC\", dateStyle: \"long\" });\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div>\r\n    <template v-if=\"props.shippingOption === SHIPPING_OPTIONS.FH_CARRIERS\">\r\n      <div>Four Hands Carrier</div>\r\n      <div v-if=\"props.shippingOption === SHIPPING_OPTIONS.FH_CARRIERS && props.freightServiceLevel\">\r\n        {{ FREIGHT_SERVICE_LEVEL_DEFINITION[props.freightServiceLevel].displayName }} Service &ndash;\r\n        {{ FREIGHT_SERVICE_LEVEL_DEFINITION[props.freightServiceLevel].description }}\r\n      </div>\r\n      <div v-if=\"holdDateString\">{{ holdDateString }}</div>\r\n      <div v-if=\"props.carrierNotes\" class=\"text-body-sm mt-f2\"><span class=\"italic\">Notes:</span> {{ carrierNotes }}</div>\r\n    </template>\r\n    <template v-if=\"props.shippingOption === SHIPPING_OPTIONS.THIRD_PARTY\">\r\n      <div class=\"mb-2\"><strong>Carrier Name:</strong> {{ props.carrierName }}</div>\r\n      <div v-if=\"props.carrierAccountNumber && props.carrierAccountNumber.trim().toLowerCase() !== 'n/a'\">\r\n        <strong>Account #:</strong> {{ props.carrierAccountNumber }}\r\n      </div>\r\n      <div v-if=\"holdDateString\" class=\"mt-2\">{{ holdDateString }}</div>\r\n      <div v-if=\"props.carrierNotes\" class=\"text-body-sm mt-2\"><span class=\"italic\">Notes:</span> {{ carrierNotes }}</div>\r\n    </template>\r\n    <template v-if=\"props.shippingOption === SHIPPING_OPTIONS.PICK_UP\">\r\n      <div>{{ SHIPPING_OPTIONS_DEFINITION[SHIPPING_OPTIONS.PICK_UP].displayName }}</div>\r\n      <div>{{ props.pickUpContactName }} &ndash; {{ props.pickUpContactPhone }}</div>\r\n      <div v-if=\"holdDateString\">{{ holdDateString }}</div>\r\n    </template>\r\n  </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { SHIPPING_OPTIONS, FREIGHT_SERVICE_LEVEL } from \"../constants/checkout\";\r\nimport FhCard from \"./FhCard.vue\";\r\nimport FhShippingAddress from \"./FhShippingAddress.vue\";\r\nimport FhCheckoutShippingDetailsSummary from \"./FhCheckoutShippingDetailsSummary.vue\";\r\n\r\nconst props = defineProps({\r\n  shippingOption: {\r\n    type: String,\r\n    default: null,\r\n    validator: (val) => Object.values(SHIPPING_OPTIONS).includes(val)\r\n  },\r\n  shippingAddress: {\r\n    type: Object,\r\n    default: null\r\n  },\r\n  freightServiceLevel: {\r\n    type: String,\r\n    default: null,\r\n    validator: (val) => Object.values(FREIGHT_SERVICE_LEVEL).includes(val)\r\n  },\r\n  carrierNotes: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carrierName: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carrierAccountNumber: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pickUpContactName: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pickUpContactPhone: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  holdDate: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst showShippingAddress = computed(() => props.shippingOption !== SHIPPING_OPTIONS.PICK_UP && props.shippingAddress);\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col gap-f3 md:flex-row\">\r\n    <FhCard v-if=\"showShippingAddress\" class=\"flex-1 overflow-hidden\">\r\n      <div class=\"mb-f2 text-f-base-xl\">Delivery Address</div>\r\n      <FhShippingAddress v-bind=\"props.shippingAddress\" simple-display class=\"text-neutral-50\" />\r\n    </FhCard>\r\n    <FhCard class=\"flex-1 overflow-hidden\">\r\n      <div class=\"mb-f2 text-f-base-xl\">Delivery Information</div>\r\n      <FhCheckoutShippingDetailsSummary v-bind=\"$props\" class=\"text-neutral-50\" />\r\n    </FhCard>\r\n  </div>\r\n</template>\r\n","/**\n * Node.js module for Forge.\n *\n * @author Dave Longley\n *\n * Copyright 2011-2016 Digital Bazaar, Inc.\n */\nmodule.exports = {\n  // default options\n  options: {\n    usePureJavaScript: false\n  }\n};\n","/**\n * Base-N/Base-X encoding/decoding functions.\n *\n * Original implementation from base-x:\n * https://github.com/cryptocoinjs/base-x\n *\n * Which is MIT licensed:\n *\n * The MIT License (MIT)\n *\n * Copyright base-x contributors (c) 2016\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\nvar api = {};\nmodule.exports = api;\n\n// baseN alphabet indexes\nvar _reverseAlphabets = {};\n\n/**\n * BaseN-encodes a Uint8Array using the given alphabet.\n *\n * @param input the Uint8Array to encode.\n * @param maxline the maximum number of encoded characters per line to use,\n *          defaults to none.\n *\n * @return the baseN-encoded output string.\n */\napi.encode = function(input, alphabet, maxline) {\n  if(typeof alphabet !== 'string') {\n    throw new TypeError('\"alphabet\" must be a string.');\n  }\n  if(maxline !== undefined && typeof maxline !== 'number') {\n    throw new TypeError('\"maxline\" must be a number.');\n  }\n\n  var output = '';\n\n  if(!(input instanceof Uint8Array)) {\n    // assume forge byte buffer\n    output = _encodeWithByteBuffer(input, alphabet);\n  } else {\n    var i = 0;\n    var base = alphabet.length;\n    var first = alphabet.charAt(0);\n    var digits = [0];\n    for(i = 0; i < input.length; ++i) {\n      for(var j = 0, carry = input[i]; j < digits.length; ++j) {\n        carry += digits[j] << 8;\n        digits[j] = carry % base;\n        carry = (carry / base) | 0;\n      }\n\n      while(carry > 0) {\n        digits.push(carry % base);\n        carry = (carry / base) | 0;\n      }\n    }\n\n    // deal with leading zeros\n    for(i = 0; input[i] === 0 && i < input.length - 1; ++i) {\n      output += first;\n    }\n    // convert digits to a string\n    for(i = digits.length - 1; i >= 0; --i) {\n      output += alphabet[digits[i]];\n    }\n  }\n\n  if(maxline) {\n    var regex = new RegExp('.{1,' + maxline + '}', 'g');\n    output = output.match(regex).join('\\r\\n');\n  }\n\n  return output;\n};\n\n/**\n * Decodes a baseN-encoded (using the given alphabet) string to a\n * Uint8Array.\n *\n * @param input the baseN-encoded input string.\n *\n * @return the Uint8Array.\n */\napi.decode = function(input, alphabet) {\n  if(typeof input !== 'string') {\n    throw new TypeError('\"input\" must be a string.');\n  }\n  if(typeof alphabet !== 'string') {\n    throw new TypeError('\"alphabet\" must be a string.');\n  }\n\n  var table = _reverseAlphabets[alphabet];\n  if(!table) {\n    // compute reverse alphabet\n    table = _reverseAlphabets[alphabet] = [];\n    for(var i = 0; i < alphabet.length; ++i) {\n      table[alphabet.charCodeAt(i)] = i;\n    }\n  }\n\n  // remove whitespace characters\n  input = input.replace(/\\s/g, '');\n\n  var base = alphabet.length;\n  var first = alphabet.charAt(0);\n  var bytes = [0];\n  for(var i = 0; i < input.length; i++) {\n    var value = table[input.charCodeAt(i)];\n    if(value === undefined) {\n      return;\n    }\n\n    for(var j = 0, carry = value; j < bytes.length; ++j) {\n      carry += bytes[j] * base;\n      bytes[j] = carry & 0xff;\n      carry >>= 8;\n    }\n\n    while(carry > 0) {\n      bytes.push(carry & 0xff);\n      carry >>= 8;\n    }\n  }\n\n  // deal with leading zeros\n  for(var k = 0; input[k] === first && k < input.length - 1; ++k) {\n    bytes.push(0);\n  }\n\n  if(typeof Buffer !== 'undefined') {\n    return Buffer.from(bytes.reverse());\n  }\n\n  return new Uint8Array(bytes.reverse());\n};\n\nfunction _encodeWithByteBuffer(input, alphabet) {\n  var i = 0;\n  var base = alphabet.length;\n  var first = alphabet.charAt(0);\n  var digits = [0];\n  for(i = 0; i < input.length(); ++i) {\n    for(var j = 0, carry = input.at(i); j < digits.length; ++j) {\n      carry += digits[j] << 8;\n      digits[j] = carry % base;\n      carry = (carry / base) | 0;\n    }\n\n    while(carry > 0) {\n      digits.push(carry % base);\n      carry = (carry / base) | 0;\n    }\n  }\n\n  var output = '';\n\n  // deal with leading zeros\n  for(i = 0; input.at(i) === 0 && i < input.length() - 1; ++i) {\n    output += first;\n  }\n  // convert digits to a string\n  for(i = digits.length - 1; i >= 0; --i) {\n    output += alphabet[digits[i]];\n  }\n\n  return output;\n}\n","/**\n * Utility functions for web applications.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2018 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nvar baseN = require('./baseN');\n\n/* Utilities API */\nvar util = module.exports = forge.util = forge.util || {};\n\n// define setImmediate and nextTick\n(function() {\n  // use native nextTick (unless we're in webpack)\n  // webpack (or better node-libs-browser polyfill) sets process.browser.\n  // this way we can detect webpack properly\n  if(typeof process !== 'undefined' && process.nextTick && !process.browser) {\n    util.nextTick = process.nextTick;\n    if(typeof setImmediate === 'function') {\n      util.setImmediate = setImmediate;\n    } else {\n      // polyfill setImmediate with nextTick, older versions of node\n      // (those w/o setImmediate) won't totally starve IO\n      util.setImmediate = util.nextTick;\n    }\n    return;\n  }\n\n  // polyfill nextTick with native setImmediate\n  if(typeof setImmediate === 'function') {\n    util.setImmediate = function() { return setImmediate.apply(undefined, arguments); };\n    util.nextTick = function(callback) {\n      return setImmediate(callback);\n    };\n    return;\n  }\n\n  /* Note: A polyfill upgrade pattern is used here to allow combining\n  polyfills. For example, MutationObserver is fast, but blocks UI updates,\n  so it needs to allow UI updates periodically, so it falls back on\n  postMessage or setTimeout. */\n\n  // polyfill with setTimeout\n  util.setImmediate = function(callback) {\n    setTimeout(callback, 0);\n  };\n\n  // upgrade polyfill to use postMessage\n  if(typeof window !== 'undefined' &&\n    typeof window.postMessage === 'function') {\n    var msg = 'forge.setImmediate';\n    var callbacks = [];\n    util.setImmediate = function(callback) {\n      callbacks.push(callback);\n      // only send message when one hasn't been sent in\n      // the current turn of the event loop\n      if(callbacks.length === 1) {\n        window.postMessage(msg, '*');\n      }\n    };\n    function handler(event) {\n      if(event.source === window && event.data === msg) {\n        event.stopPropagation();\n        var copy = callbacks.slice();\n        callbacks.length = 0;\n        copy.forEach(function(callback) {\n          callback();\n        });\n      }\n    }\n    window.addEventListener('message', handler, true);\n  }\n\n  // upgrade polyfill to use MutationObserver\n  if(typeof MutationObserver !== 'undefined') {\n    // polyfill with MutationObserver\n    var now = Date.now();\n    var attr = true;\n    var div = document.createElement('div');\n    var callbacks = [];\n    new MutationObserver(function() {\n      var copy = callbacks.slice();\n      callbacks.length = 0;\n      copy.forEach(function(callback) {\n        callback();\n      });\n    }).observe(div, {attributes: true});\n    var oldSetImmediate = util.setImmediate;\n    util.setImmediate = function(callback) {\n      if(Date.now() - now > 15) {\n        now = Date.now();\n        oldSetImmediate(callback);\n      } else {\n        callbacks.push(callback);\n        // only trigger observer when it hasn't been triggered in\n        // the current turn of the event loop\n        if(callbacks.length === 1) {\n          div.setAttribute('a', attr = !attr);\n        }\n      }\n    };\n  }\n\n  util.nextTick = util.setImmediate;\n})();\n\n// check if running under Node.js\nutil.isNodejs =\n  typeof process !== 'undefined' && process.versions && process.versions.node;\n\n\n// 'self' will also work in Web Workers (instance of WorkerGlobalScope) while\n// it will point to `window` in the main thread.\n// To remain compatible with older browsers, we fall back to 'window' if 'self'\n// is not available.\nutil.globalScope = (function() {\n  if(util.isNodejs) {\n    return global;\n  }\n\n  return typeof self === 'undefined' ? window : self;\n})();\n\n// define isArray\nutil.isArray = Array.isArray || function(x) {\n  return Object.prototype.toString.call(x) === '[object Array]';\n};\n\n// define isArrayBuffer\nutil.isArrayBuffer = function(x) {\n  return typeof ArrayBuffer !== 'undefined' && x instanceof ArrayBuffer;\n};\n\n// define isArrayBufferView\nutil.isArrayBufferView = function(x) {\n  return x && util.isArrayBuffer(x.buffer) && x.byteLength !== undefined;\n};\n\n/**\n * Ensure a bits param is 8, 16, 24, or 32. Used to validate input for\n * algorithms where bit manipulation, JavaScript limitations, and/or algorithm\n * design only allow for byte operations of a limited size.\n *\n * @param n number of bits.\n *\n * Throw Error if n invalid.\n */\nfunction _checkBitsParam(n) {\n  if(!(n === 8 || n === 16 || n === 24 || n === 32)) {\n    throw new Error('Only 8, 16, 24, or 32 bits supported: ' + n);\n  }\n}\n\n// TODO: set ByteBuffer to best available backing\nutil.ByteBuffer = ByteStringBuffer;\n\n/** Buffer w/BinaryString backing */\n\n/**\n * Constructor for a binary string backed byte buffer.\n *\n * @param [b] the bytes to wrap (either encoded as string, one byte per\n *          character, or as an ArrayBuffer or Typed Array).\n */\nfunction ByteStringBuffer(b) {\n  // TODO: update to match DataBuffer API\n\n  // the data in this buffer\n  this.data = '';\n  // the pointer for reading from this buffer\n  this.read = 0;\n\n  if(typeof b === 'string') {\n    this.data = b;\n  } else if(util.isArrayBuffer(b) || util.isArrayBufferView(b)) {\n    if(typeof Buffer !== 'undefined' && b instanceof Buffer) {\n      this.data = b.toString('binary');\n    } else {\n      // convert native buffer to forge buffer\n      // FIXME: support native buffers internally instead\n      var arr = new Uint8Array(b);\n      try {\n        this.data = String.fromCharCode.apply(null, arr);\n      } catch(e) {\n        for(var i = 0; i < arr.length; ++i) {\n          this.putByte(arr[i]);\n        }\n      }\n    }\n  } else if(b instanceof ByteStringBuffer ||\n    (typeof b === 'object' && typeof b.data === 'string' &&\n    typeof b.read === 'number')) {\n    // copy existing buffer\n    this.data = b.data;\n    this.read = b.read;\n  }\n\n  // used for v8 optimization\n  this._constructedStringLength = 0;\n}\nutil.ByteStringBuffer = ByteStringBuffer;\n\n/* Note: This is an optimization for V8-based browsers. When V8 concatenates\n  a string, the strings are only joined logically using a \"cons string\" or\n  \"constructed/concatenated string\". These containers keep references to one\n  another and can result in very large memory usage. For example, if a 2MB\n  string is constructed by concatenating 4 bytes together at a time, the\n  memory usage will be ~44MB; so ~22x increase. The strings are only joined\n  together when an operation requiring their joining takes place, such as\n  substr(). This function is called when adding data to this buffer to ensure\n  these types of strings are periodically joined to reduce the memory\n  footprint. */\nvar _MAX_CONSTRUCTED_STRING_LENGTH = 4096;\nutil.ByteStringBuffer.prototype._optimizeConstructedString = function(x) {\n  this._constructedStringLength += x;\n  if(this._constructedStringLength > _MAX_CONSTRUCTED_STRING_LENGTH) {\n    // this substr() should cause the constructed string to join\n    this.data.substr(0, 1);\n    this._constructedStringLength = 0;\n  }\n};\n\n/**\n * Gets the number of bytes in this buffer.\n *\n * @return the number of bytes in this buffer.\n */\nutil.ByteStringBuffer.prototype.length = function() {\n  return this.data.length - this.read;\n};\n\n/**\n * Gets whether or not this buffer is empty.\n *\n * @return true if this buffer is empty, false if not.\n */\nutil.ByteStringBuffer.prototype.isEmpty = function() {\n  return this.length() <= 0;\n};\n\n/**\n * Puts a byte in this buffer.\n *\n * @param b the byte to put.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putByte = function(b) {\n  return this.putBytes(String.fromCharCode(b));\n};\n\n/**\n * Puts a byte in this buffer N times.\n *\n * @param b the byte to put.\n * @param n the number of bytes of value b to put.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.fillWithByte = function(b, n) {\n  b = String.fromCharCode(b);\n  var d = this.data;\n  while(n > 0) {\n    if(n & 1) {\n      d += b;\n    }\n    n >>>= 1;\n    if(n > 0) {\n      b += b;\n    }\n  }\n  this.data = d;\n  this._optimizeConstructedString(n);\n  return this;\n};\n\n/**\n * Puts bytes in this buffer.\n *\n * @param bytes the bytes (as a binary encoded string) to put.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putBytes = function(bytes) {\n  this.data += bytes;\n  this._optimizeConstructedString(bytes.length);\n  return this;\n};\n\n/**\n * Puts a UTF-16 encoded string into this buffer.\n *\n * @param str the string to put.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putString = function(str) {\n  return this.putBytes(util.encodeUtf8(str));\n};\n\n/**\n * Puts a 16-bit integer in this buffer in big-endian order.\n *\n * @param i the 16-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt16 = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i & 0xFF));\n};\n\n/**\n * Puts a 24-bit integer in this buffer in big-endian order.\n *\n * @param i the 24-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt24 = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i >> 16 & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i & 0xFF));\n};\n\n/**\n * Puts a 32-bit integer in this buffer in big-endian order.\n *\n * @param i the 32-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt32 = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i >> 24 & 0xFF) +\n    String.fromCharCode(i >> 16 & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i & 0xFF));\n};\n\n/**\n * Puts a 16-bit integer in this buffer in little-endian order.\n *\n * @param i the 16-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt16Le = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF));\n};\n\n/**\n * Puts a 24-bit integer in this buffer in little-endian order.\n *\n * @param i the 24-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt24Le = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i >> 16 & 0xFF));\n};\n\n/**\n * Puts a 32-bit integer in this buffer in little-endian order.\n *\n * @param i the 32-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt32Le = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i >> 16 & 0xFF) +\n    String.fromCharCode(i >> 24 & 0xFF));\n};\n\n/**\n * Puts an n-bit integer in this buffer in big-endian order.\n *\n * @param i the n-bit integer.\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt = function(i, n) {\n  _checkBitsParam(n);\n  var bytes = '';\n  do {\n    n -= 8;\n    bytes += String.fromCharCode((i >> n) & 0xFF);\n  } while(n > 0);\n  return this.putBytes(bytes);\n};\n\n/**\n * Puts a signed n-bit integer in this buffer in big-endian order. Two's\n * complement representation is used.\n *\n * @param i the n-bit integer.\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putSignedInt = function(i, n) {\n  // putInt checks n\n  if(i < 0) {\n    i += 2 << (n - 1);\n  }\n  return this.putInt(i, n);\n};\n\n/**\n * Puts the given buffer into this buffer.\n *\n * @param buffer the buffer to put into this one.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putBuffer = function(buffer) {\n  return this.putBytes(buffer.getBytes());\n};\n\n/**\n * Gets a byte from this buffer and advances the read pointer by 1.\n *\n * @return the byte.\n */\nutil.ByteStringBuffer.prototype.getByte = function() {\n  return this.data.charCodeAt(this.read++);\n};\n\n/**\n * Gets a uint16 from this buffer in big-endian order and advances the read\n * pointer by 2.\n *\n * @return the uint16.\n */\nutil.ByteStringBuffer.prototype.getInt16 = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) << 8 ^\n    this.data.charCodeAt(this.read + 1));\n  this.read += 2;\n  return rval;\n};\n\n/**\n * Gets a uint24 from this buffer in big-endian order and advances the read\n * pointer by 3.\n *\n * @return the uint24.\n */\nutil.ByteStringBuffer.prototype.getInt24 = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) << 16 ^\n    this.data.charCodeAt(this.read + 1) << 8 ^\n    this.data.charCodeAt(this.read + 2));\n  this.read += 3;\n  return rval;\n};\n\n/**\n * Gets a uint32 from this buffer in big-endian order and advances the read\n * pointer by 4.\n *\n * @return the word.\n */\nutil.ByteStringBuffer.prototype.getInt32 = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) << 24 ^\n    this.data.charCodeAt(this.read + 1) << 16 ^\n    this.data.charCodeAt(this.read + 2) << 8 ^\n    this.data.charCodeAt(this.read + 3));\n  this.read += 4;\n  return rval;\n};\n\n/**\n * Gets a uint16 from this buffer in little-endian order and advances the read\n * pointer by 2.\n *\n * @return the uint16.\n */\nutil.ByteStringBuffer.prototype.getInt16Le = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) ^\n    this.data.charCodeAt(this.read + 1) << 8);\n  this.read += 2;\n  return rval;\n};\n\n/**\n * Gets a uint24 from this buffer in little-endian order and advances the read\n * pointer by 3.\n *\n * @return the uint24.\n */\nutil.ByteStringBuffer.prototype.getInt24Le = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) ^\n    this.data.charCodeAt(this.read + 1) << 8 ^\n    this.data.charCodeAt(this.read + 2) << 16);\n  this.read += 3;\n  return rval;\n};\n\n/**\n * Gets a uint32 from this buffer in little-endian order and advances the read\n * pointer by 4.\n *\n * @return the word.\n */\nutil.ByteStringBuffer.prototype.getInt32Le = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) ^\n    this.data.charCodeAt(this.read + 1) << 8 ^\n    this.data.charCodeAt(this.read + 2) << 16 ^\n    this.data.charCodeAt(this.read + 3) << 24);\n  this.read += 4;\n  return rval;\n};\n\n/**\n * Gets an n-bit integer from this buffer in big-endian order and advances the\n * read pointer by ceil(n/8).\n *\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return the integer.\n */\nutil.ByteStringBuffer.prototype.getInt = function(n) {\n  _checkBitsParam(n);\n  var rval = 0;\n  do {\n    // TODO: Use (rval * 0x100) if adding support for 33 to 53 bits.\n    rval = (rval << 8) + this.data.charCodeAt(this.read++);\n    n -= 8;\n  } while(n > 0);\n  return rval;\n};\n\n/**\n * Gets a signed n-bit integer from this buffer in big-endian order, using\n * two's complement, and advances the read pointer by n/8.\n *\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return the integer.\n */\nutil.ByteStringBuffer.prototype.getSignedInt = function(n) {\n  // getInt checks n\n  var x = this.getInt(n);\n  var max = 2 << (n - 2);\n  if(x >= max) {\n    x -= max << 1;\n  }\n  return x;\n};\n\n/**\n * Reads bytes out as a binary encoded string and clears them from the\n * buffer. Note that the resulting string is binary encoded (in node.js this\n * encoding is referred to as `binary`, it is *not* `utf8`).\n *\n * @param count the number of bytes to read, undefined or null for all.\n *\n * @return a binary encoded string of bytes.\n */\nutil.ByteStringBuffer.prototype.getBytes = function(count) {\n  var rval;\n  if(count) {\n    // read count bytes\n    count = Math.min(this.length(), count);\n    rval = this.data.slice(this.read, this.read + count);\n    this.read += count;\n  } else if(count === 0) {\n    rval = '';\n  } else {\n    // read all bytes, optimize to only copy when needed\n    rval = (this.read === 0) ? this.data : this.data.slice(this.read);\n    this.clear();\n  }\n  return rval;\n};\n\n/**\n * Gets a binary encoded string of the bytes from this buffer without\n * modifying the read pointer.\n *\n * @param count the number of bytes to get, omit to get all.\n *\n * @return a string full of binary encoded characters.\n */\nutil.ByteStringBuffer.prototype.bytes = function(count) {\n  return (typeof(count) === 'undefined' ?\n    this.data.slice(this.read) :\n    this.data.slice(this.read, this.read + count));\n};\n\n/**\n * Gets a byte at the given index without modifying the read pointer.\n *\n * @param i the byte index.\n *\n * @return the byte.\n */\nutil.ByteStringBuffer.prototype.at = function(i) {\n  return this.data.charCodeAt(this.read + i);\n};\n\n/**\n * Puts a byte at the given index without modifying the read pointer.\n *\n * @param i the byte index.\n * @param b the byte to put.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.setAt = function(i, b) {\n  this.data = this.data.substr(0, this.read + i) +\n    String.fromCharCode(b) +\n    this.data.substr(this.read + i + 1);\n  return this;\n};\n\n/**\n * Gets the last byte without modifying the read pointer.\n *\n * @return the last byte.\n */\nutil.ByteStringBuffer.prototype.last = function() {\n  return this.data.charCodeAt(this.data.length - 1);\n};\n\n/**\n * Creates a copy of this buffer.\n *\n * @return the copy.\n */\nutil.ByteStringBuffer.prototype.copy = function() {\n  var c = util.createBuffer(this.data);\n  c.read = this.read;\n  return c;\n};\n\n/**\n * Compacts this buffer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.compact = function() {\n  if(this.read > 0) {\n    this.data = this.data.slice(this.read);\n    this.read = 0;\n  }\n  return this;\n};\n\n/**\n * Clears this buffer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.clear = function() {\n  this.data = '';\n  this.read = 0;\n  return this;\n};\n\n/**\n * Shortens this buffer by triming bytes off of the end of this buffer.\n *\n * @param count the number of bytes to trim off.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.truncate = function(count) {\n  var len = Math.max(0, this.length() - count);\n  this.data = this.data.substr(this.read, len);\n  this.read = 0;\n  return this;\n};\n\n/**\n * Converts this buffer to a hexadecimal string.\n *\n * @return a hexadecimal string.\n */\nutil.ByteStringBuffer.prototype.toHex = function() {\n  var rval = '';\n  for(var i = this.read; i < this.data.length; ++i) {\n    var b = this.data.charCodeAt(i);\n    if(b < 16) {\n      rval += '0';\n    }\n    rval += b.toString(16);\n  }\n  return rval;\n};\n\n/**\n * Converts this buffer to a UTF-16 string (standard JavaScript string).\n *\n * @return a UTF-16 string.\n */\nutil.ByteStringBuffer.prototype.toString = function() {\n  return util.decodeUtf8(this.bytes());\n};\n\n/** End Buffer w/BinaryString backing */\n\n/** Buffer w/UInt8Array backing */\n\n/**\n * FIXME: Experimental. Do not use yet.\n *\n * Constructor for an ArrayBuffer-backed byte buffer.\n *\n * The buffer may be constructed from a string, an ArrayBuffer, DataView, or a\n * TypedArray.\n *\n * If a string is given, its encoding should be provided as an option,\n * otherwise it will default to 'binary'. A 'binary' string is encoded such\n * that each character is one byte in length and size.\n *\n * If an ArrayBuffer, DataView, or TypedArray is given, it will be used\n * *directly* without any copying. Note that, if a write to the buffer requires\n * more space, the buffer will allocate a new backing ArrayBuffer to\n * accommodate. The starting read and write offsets for the buffer may be\n * given as options.\n *\n * @param [b] the initial bytes for this buffer.\n * @param options the options to use:\n *          [readOffset] the starting read offset to use (default: 0).\n *          [writeOffset] the starting write offset to use (default: the\n *            length of the first parameter).\n *          [growSize] the minimum amount, in bytes, to grow the buffer by to\n *            accommodate writes (default: 1024).\n *          [encoding] the encoding ('binary', 'utf8', 'utf16', 'hex') for the\n *            first parameter, if it is a string (default: 'binary').\n */\nfunction DataBuffer(b, options) {\n  // default options\n  options = options || {};\n\n  // pointers for read from/write to buffer\n  this.read = options.readOffset || 0;\n  this.growSize = options.growSize || 1024;\n\n  var isArrayBuffer = util.isArrayBuffer(b);\n  var isArrayBufferView = util.isArrayBufferView(b);\n  if(isArrayBuffer || isArrayBufferView) {\n    // use ArrayBuffer directly\n    if(isArrayBuffer) {\n      this.data = new DataView(b);\n    } else {\n      // TODO: adjust read/write offset based on the type of view\n      // or specify that this must be done in the options ... that the\n      // offsets are byte-based\n      this.data = new DataView(b.buffer, b.byteOffset, b.byteLength);\n    }\n    this.write = ('writeOffset' in options ?\n      options.writeOffset : this.data.byteLength);\n    return;\n  }\n\n  // initialize to empty array buffer and add any given bytes using putBytes\n  this.data = new DataView(new ArrayBuffer(0));\n  this.write = 0;\n\n  if(b !== null && b !== undefined) {\n    this.putBytes(b);\n  }\n\n  if('writeOffset' in options) {\n    this.write = options.writeOffset;\n  }\n}\nutil.DataBuffer = DataBuffer;\n\n/**\n * Gets the number of bytes in this buffer.\n *\n * @return the number of bytes in this buffer.\n */\nutil.DataBuffer.prototype.length = function() {\n  return this.write - this.read;\n};\n\n/**\n * Gets whether or not this buffer is empty.\n *\n * @return true if this buffer is empty, false if not.\n */\nutil.DataBuffer.prototype.isEmpty = function() {\n  return this.length() <= 0;\n};\n\n/**\n * Ensures this buffer has enough empty space to accommodate the given number\n * of bytes. An optional parameter may be given that indicates a minimum\n * amount to grow the buffer if necessary. If the parameter is not given,\n * the buffer will be grown by some previously-specified default amount\n * or heuristic.\n *\n * @param amount the number of bytes to accommodate.\n * @param [growSize] the minimum amount, in bytes, to grow the buffer by if\n *          necessary.\n */\nutil.DataBuffer.prototype.accommodate = function(amount, growSize) {\n  if(this.length() >= amount) {\n    return this;\n  }\n  growSize = Math.max(growSize || this.growSize, amount);\n\n  // grow buffer\n  var src = new Uint8Array(\n    this.data.buffer, this.data.byteOffset, this.data.byteLength);\n  var dst = new Uint8Array(this.length() + growSize);\n  dst.set(src);\n  this.data = new DataView(dst.buffer);\n\n  return this;\n};\n\n/**\n * Puts a byte in this buffer.\n *\n * @param b the byte to put.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putByte = function(b) {\n  this.accommodate(1);\n  this.data.setUint8(this.write++, b);\n  return this;\n};\n\n/**\n * Puts a byte in this buffer N times.\n *\n * @param b the byte to put.\n * @param n the number of bytes of value b to put.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.fillWithByte = function(b, n) {\n  this.accommodate(n);\n  for(var i = 0; i < n; ++i) {\n    this.data.setUint8(b);\n  }\n  return this;\n};\n\n/**\n * Puts bytes in this buffer. The bytes may be given as a string, an\n * ArrayBuffer, a DataView, or a TypedArray.\n *\n * @param bytes the bytes to put.\n * @param [encoding] the encoding for the first parameter ('binary', 'utf8',\n *          'utf16', 'hex'), if it is a string (default: 'binary').\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putBytes = function(bytes, encoding) {\n  if(util.isArrayBufferView(bytes)) {\n    var src = new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n    var len = src.byteLength - src.byteOffset;\n    this.accommodate(len);\n    var dst = new Uint8Array(this.data.buffer, this.write);\n    dst.set(src);\n    this.write += len;\n    return this;\n  }\n\n  if(util.isArrayBuffer(bytes)) {\n    var src = new Uint8Array(bytes);\n    this.accommodate(src.byteLength);\n    var dst = new Uint8Array(this.data.buffer);\n    dst.set(src, this.write);\n    this.write += src.byteLength;\n    return this;\n  }\n\n  // bytes is a util.DataBuffer or equivalent\n  if(bytes instanceof util.DataBuffer ||\n    (typeof bytes === 'object' &&\n    typeof bytes.read === 'number' && typeof bytes.write === 'number' &&\n    util.isArrayBufferView(bytes.data))) {\n    var src = new Uint8Array(bytes.data.byteLength, bytes.read, bytes.length());\n    this.accommodate(src.byteLength);\n    var dst = new Uint8Array(bytes.data.byteLength, this.write);\n    dst.set(src);\n    this.write += src.byteLength;\n    return this;\n  }\n\n  if(bytes instanceof util.ByteStringBuffer) {\n    // copy binary string and process as the same as a string parameter below\n    bytes = bytes.data;\n    encoding = 'binary';\n  }\n\n  // string conversion\n  encoding = encoding || 'binary';\n  if(typeof bytes === 'string') {\n    var view;\n\n    // decode from string\n    if(encoding === 'hex') {\n      this.accommodate(Math.ceil(bytes.length / 2));\n      view = new Uint8Array(this.data.buffer, this.write);\n      this.write += util.binary.hex.decode(bytes, view, this.write);\n      return this;\n    }\n    if(encoding === 'base64') {\n      this.accommodate(Math.ceil(bytes.length / 4) * 3);\n      view = new Uint8Array(this.data.buffer, this.write);\n      this.write += util.binary.base64.decode(bytes, view, this.write);\n      return this;\n    }\n\n    // encode text as UTF-8 bytes\n    if(encoding === 'utf8') {\n      // encode as UTF-8 then decode string as raw binary\n      bytes = util.encodeUtf8(bytes);\n      encoding = 'binary';\n    }\n\n    // decode string as raw binary\n    if(encoding === 'binary' || encoding === 'raw') {\n      // one byte per character\n      this.accommodate(bytes.length);\n      view = new Uint8Array(this.data.buffer, this.write);\n      this.write += util.binary.raw.decode(view);\n      return this;\n    }\n\n    // encode text as UTF-16 bytes\n    if(encoding === 'utf16') {\n      // two bytes per character\n      this.accommodate(bytes.length * 2);\n      view = new Uint16Array(this.data.buffer, this.write);\n      this.write += util.text.utf16.encode(view);\n      return this;\n    }\n\n    throw new Error('Invalid encoding: ' + encoding);\n  }\n\n  throw Error('Invalid parameter: ' + bytes);\n};\n\n/**\n * Puts the given buffer into this buffer.\n *\n * @param buffer the buffer to put into this one.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putBuffer = function(buffer) {\n  this.putBytes(buffer);\n  buffer.clear();\n  return this;\n};\n\n/**\n * Puts a string into this buffer.\n *\n * @param str the string to put.\n * @param [encoding] the encoding for the string (default: 'utf16').\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putString = function(str) {\n  return this.putBytes(str, 'utf16');\n};\n\n/**\n * Puts a 16-bit integer in this buffer in big-endian order.\n *\n * @param i the 16-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt16 = function(i) {\n  this.accommodate(2);\n  this.data.setInt16(this.write, i);\n  this.write += 2;\n  return this;\n};\n\n/**\n * Puts a 24-bit integer in this buffer in big-endian order.\n *\n * @param i the 24-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt24 = function(i) {\n  this.accommodate(3);\n  this.data.setInt16(this.write, i >> 8 & 0xFFFF);\n  this.data.setInt8(this.write, i >> 16 & 0xFF);\n  this.write += 3;\n  return this;\n};\n\n/**\n * Puts a 32-bit integer in this buffer in big-endian order.\n *\n * @param i the 32-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt32 = function(i) {\n  this.accommodate(4);\n  this.data.setInt32(this.write, i);\n  this.write += 4;\n  return this;\n};\n\n/**\n * Puts a 16-bit integer in this buffer in little-endian order.\n *\n * @param i the 16-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt16Le = function(i) {\n  this.accommodate(2);\n  this.data.setInt16(this.write, i, true);\n  this.write += 2;\n  return this;\n};\n\n/**\n * Puts a 24-bit integer in this buffer in little-endian order.\n *\n * @param i the 24-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt24Le = function(i) {\n  this.accommodate(3);\n  this.data.setInt8(this.write, i >> 16 & 0xFF);\n  this.data.setInt16(this.write, i >> 8 & 0xFFFF, true);\n  this.write += 3;\n  return this;\n};\n\n/**\n * Puts a 32-bit integer in this buffer in little-endian order.\n *\n * @param i the 32-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt32Le = function(i) {\n  this.accommodate(4);\n  this.data.setInt32(this.write, i, true);\n  this.write += 4;\n  return this;\n};\n\n/**\n * Puts an n-bit integer in this buffer in big-endian order.\n *\n * @param i the n-bit integer.\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt = function(i, n) {\n  _checkBitsParam(n);\n  this.accommodate(n / 8);\n  do {\n    n -= 8;\n    this.data.setInt8(this.write++, (i >> n) & 0xFF);\n  } while(n > 0);\n  return this;\n};\n\n/**\n * Puts a signed n-bit integer in this buffer in big-endian order. Two's\n * complement representation is used.\n *\n * @param i the n-bit integer.\n * @param n the number of bits in the integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putSignedInt = function(i, n) {\n  _checkBitsParam(n);\n  this.accommodate(n / 8);\n  if(i < 0) {\n    i += 2 << (n - 1);\n  }\n  return this.putInt(i, n);\n};\n\n/**\n * Gets a byte from this buffer and advances the read pointer by 1.\n *\n * @return the byte.\n */\nutil.DataBuffer.prototype.getByte = function() {\n  return this.data.getInt8(this.read++);\n};\n\n/**\n * Gets a uint16 from this buffer in big-endian order and advances the read\n * pointer by 2.\n *\n * @return the uint16.\n */\nutil.DataBuffer.prototype.getInt16 = function() {\n  var rval = this.data.getInt16(this.read);\n  this.read += 2;\n  return rval;\n};\n\n/**\n * Gets a uint24 from this buffer in big-endian order and advances the read\n * pointer by 3.\n *\n * @return the uint24.\n */\nutil.DataBuffer.prototype.getInt24 = function() {\n  var rval = (\n    this.data.getInt16(this.read) << 8 ^\n    this.data.getInt8(this.read + 2));\n  this.read += 3;\n  return rval;\n};\n\n/**\n * Gets a uint32 from this buffer in big-endian order and advances the read\n * pointer by 4.\n *\n * @return the word.\n */\nutil.DataBuffer.prototype.getInt32 = function() {\n  var rval = this.data.getInt32(this.read);\n  this.read += 4;\n  return rval;\n};\n\n/**\n * Gets a uint16 from this buffer in little-endian order and advances the read\n * pointer by 2.\n *\n * @return the uint16.\n */\nutil.DataBuffer.prototype.getInt16Le = function() {\n  var rval = this.data.getInt16(this.read, true);\n  this.read += 2;\n  return rval;\n};\n\n/**\n * Gets a uint24 from this buffer in little-endian order and advances the read\n * pointer by 3.\n *\n * @return the uint24.\n */\nutil.DataBuffer.prototype.getInt24Le = function() {\n  var rval = (\n    this.data.getInt8(this.read) ^\n    this.data.getInt16(this.read + 1, true) << 8);\n  this.read += 3;\n  return rval;\n};\n\n/**\n * Gets a uint32 from this buffer in little-endian order and advances the read\n * pointer by 4.\n *\n * @return the word.\n */\nutil.DataBuffer.prototype.getInt32Le = function() {\n  var rval = this.data.getInt32(this.read, true);\n  this.read += 4;\n  return rval;\n};\n\n/**\n * Gets an n-bit integer from this buffer in big-endian order and advances the\n * read pointer by n/8.\n *\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return the integer.\n */\nutil.DataBuffer.prototype.getInt = function(n) {\n  _checkBitsParam(n);\n  var rval = 0;\n  do {\n    // TODO: Use (rval * 0x100) if adding support for 33 to 53 bits.\n    rval = (rval << 8) + this.data.getInt8(this.read++);\n    n -= 8;\n  } while(n > 0);\n  return rval;\n};\n\n/**\n * Gets a signed n-bit integer from this buffer in big-endian order, using\n * two's complement, and advances the read pointer by n/8.\n *\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return the integer.\n */\nutil.DataBuffer.prototype.getSignedInt = function(n) {\n  // getInt checks n\n  var x = this.getInt(n);\n  var max = 2 << (n - 2);\n  if(x >= max) {\n    x -= max << 1;\n  }\n  return x;\n};\n\n/**\n * Reads bytes out as a binary encoded string and clears them from the\n * buffer.\n *\n * @param count the number of bytes to read, undefined or null for all.\n *\n * @return a binary encoded string of bytes.\n */\nutil.DataBuffer.prototype.getBytes = function(count) {\n  // TODO: deprecate this method, it is poorly named and\n  // this.toString('binary') replaces it\n  // add a toTypedArray()/toArrayBuffer() function\n  var rval;\n  if(count) {\n    // read count bytes\n    count = Math.min(this.length(), count);\n    rval = this.data.slice(this.read, this.read + count);\n    this.read += count;\n  } else if(count === 0) {\n    rval = '';\n  } else {\n    // read all bytes, optimize to only copy when needed\n    rval = (this.read === 0) ? this.data : this.data.slice(this.read);\n    this.clear();\n  }\n  return rval;\n};\n\n/**\n * Gets a binary encoded string of the bytes from this buffer without\n * modifying the read pointer.\n *\n * @param count the number of bytes to get, omit to get all.\n *\n * @return a string full of binary encoded characters.\n */\nutil.DataBuffer.prototype.bytes = function(count) {\n  // TODO: deprecate this method, it is poorly named, add \"getString()\"\n  return (typeof(count) === 'undefined' ?\n    this.data.slice(this.read) :\n    this.data.slice(this.read, this.read + count));\n};\n\n/**\n * Gets a byte at the given index without modifying the read pointer.\n *\n * @param i the byte index.\n *\n * @return the byte.\n */\nutil.DataBuffer.prototype.at = function(i) {\n  return this.data.getUint8(this.read + i);\n};\n\n/**\n * Puts a byte at the given index without modifying the read pointer.\n *\n * @param i the byte index.\n * @param b the byte to put.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.setAt = function(i, b) {\n  this.data.setUint8(i, b);\n  return this;\n};\n\n/**\n * Gets the last byte without modifying the read pointer.\n *\n * @return the last byte.\n */\nutil.DataBuffer.prototype.last = function() {\n  return this.data.getUint8(this.write - 1);\n};\n\n/**\n * Creates a copy of this buffer.\n *\n * @return the copy.\n */\nutil.DataBuffer.prototype.copy = function() {\n  return new util.DataBuffer(this);\n};\n\n/**\n * Compacts this buffer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.compact = function() {\n  if(this.read > 0) {\n    var src = new Uint8Array(this.data.buffer, this.read);\n    var dst = new Uint8Array(src.byteLength);\n    dst.set(src);\n    this.data = new DataView(dst);\n    this.write -= this.read;\n    this.read = 0;\n  }\n  return this;\n};\n\n/**\n * Clears this buffer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.clear = function() {\n  this.data = new DataView(new ArrayBuffer(0));\n  this.read = this.write = 0;\n  return this;\n};\n\n/**\n * Shortens this buffer by triming bytes off of the end of this buffer.\n *\n * @param count the number of bytes to trim off.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.truncate = function(count) {\n  this.write = Math.max(0, this.length() - count);\n  this.read = Math.min(this.read, this.write);\n  return this;\n};\n\n/**\n * Converts this buffer to a hexadecimal string.\n *\n * @return a hexadecimal string.\n */\nutil.DataBuffer.prototype.toHex = function() {\n  var rval = '';\n  for(var i = this.read; i < this.data.byteLength; ++i) {\n    var b = this.data.getUint8(i);\n    if(b < 16) {\n      rval += '0';\n    }\n    rval += b.toString(16);\n  }\n  return rval;\n};\n\n/**\n * Converts this buffer to a string, using the given encoding. If no\n * encoding is given, 'utf8' (UTF-8) is used.\n *\n * @param [encoding] the encoding to use: 'binary', 'utf8', 'utf16', 'hex',\n *          'base64' (default: 'utf8').\n *\n * @return a string representation of the bytes in this buffer.\n */\nutil.DataBuffer.prototype.toString = function(encoding) {\n  var view = new Uint8Array(this.data, this.read, this.length());\n  encoding = encoding || 'utf8';\n\n  // encode to string\n  if(encoding === 'binary' || encoding === 'raw') {\n    return util.binary.raw.encode(view);\n  }\n  if(encoding === 'hex') {\n    return util.binary.hex.encode(view);\n  }\n  if(encoding === 'base64') {\n    return util.binary.base64.encode(view);\n  }\n\n  // decode to text\n  if(encoding === 'utf8') {\n    return util.text.utf8.decode(view);\n  }\n  if(encoding === 'utf16') {\n    return util.text.utf16.decode(view);\n  }\n\n  throw new Error('Invalid encoding: ' + encoding);\n};\n\n/** End Buffer w/UInt8Array backing */\n\n/**\n * Creates a buffer that stores bytes. A value may be given to populate the\n * buffer with data. This value can either be string of encoded bytes or a\n * regular string of characters. When passing a string of binary encoded\n * bytes, the encoding `raw` should be given. This is also the default. When\n * passing a string of characters, the encoding `utf8` should be given.\n *\n * @param [input] a string with encoded bytes to store in the buffer.\n * @param [encoding] (default: 'raw', other: 'utf8').\n */\nutil.createBuffer = function(input, encoding) {\n  // TODO: deprecate, use new ByteBuffer() instead\n  encoding = encoding || 'raw';\n  if(input !== undefined && encoding === 'utf8') {\n    input = util.encodeUtf8(input);\n  }\n  return new util.ByteBuffer(input);\n};\n\n/**\n * Fills a string with a particular value. If you want the string to be a byte\n * string, pass in String.fromCharCode(theByte).\n *\n * @param c the character to fill the string with, use String.fromCharCode\n *          to fill the string with a byte value.\n * @param n the number of characters of value c to fill with.\n *\n * @return the filled string.\n */\nutil.fillString = function(c, n) {\n  var s = '';\n  while(n > 0) {\n    if(n & 1) {\n      s += c;\n    }\n    n >>>= 1;\n    if(n > 0) {\n      c += c;\n    }\n  }\n  return s;\n};\n\n/**\n * Performs a per byte XOR between two byte strings and returns the result as a\n * string of bytes.\n *\n * @param s1 first string of bytes.\n * @param s2 second string of bytes.\n * @param n the number of bytes to XOR.\n *\n * @return the XOR'd result.\n */\nutil.xorBytes = function(s1, s2, n) {\n  var s3 = '';\n  var b = '';\n  var t = '';\n  var i = 0;\n  var c = 0;\n  for(; n > 0; --n, ++i) {\n    b = s1.charCodeAt(i) ^ s2.charCodeAt(i);\n    if(c >= 10) {\n      s3 += t;\n      t = '';\n      c = 0;\n    }\n    t += String.fromCharCode(b);\n    ++c;\n  }\n  s3 += t;\n  return s3;\n};\n\n/**\n * Converts a hex string into a 'binary' encoded string of bytes.\n *\n * @param hex the hexadecimal string to convert.\n *\n * @return the binary-encoded string of bytes.\n */\nutil.hexToBytes = function(hex) {\n  // TODO: deprecate: \"Deprecated. Use util.binary.hex.decode instead.\"\n  var rval = '';\n  var i = 0;\n  if(hex.length & 1 == 1) {\n    // odd number of characters, convert first character alone\n    i = 1;\n    rval += String.fromCharCode(parseInt(hex[0], 16));\n  }\n  // convert 2 characters (1 byte) at a time\n  for(; i < hex.length; i += 2) {\n    rval += String.fromCharCode(parseInt(hex.substr(i, 2), 16));\n  }\n  return rval;\n};\n\n/**\n * Converts a 'binary' encoded string of bytes to hex.\n *\n * @param bytes the byte string to convert.\n *\n * @return the string of hexadecimal characters.\n */\nutil.bytesToHex = function(bytes) {\n  // TODO: deprecate: \"Deprecated. Use util.binary.hex.encode instead.\"\n  return util.createBuffer(bytes).toHex();\n};\n\n/**\n * Converts an 32-bit integer to 4-big-endian byte string.\n *\n * @param i the integer.\n *\n * @return the byte string.\n */\nutil.int32ToBytes = function(i) {\n  return (\n    String.fromCharCode(i >> 24 & 0xFF) +\n    String.fromCharCode(i >> 16 & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i & 0xFF));\n};\n\n// base64 characters, reverse mapping\nvar _base64 =\n  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nvar _base64Idx = [\n/*43 -43 = 0*/\n/*'+',  1,  2,  3,'/' */\n   62, -1, -1, -1, 63,\n\n/*'0','1','2','3','4','5','6','7','8','9' */\n   52, 53, 54, 55, 56, 57, 58, 59, 60, 61,\n\n/*15, 16, 17,'=', 19, 20, 21 */\n  -1, -1, -1, 64, -1, -1, -1,\n\n/*65 - 43 = 22*/\n/*'A','B','C','D','E','F','G','H','I','J','K','L','M', */\n   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,\n\n/*'N','O','P','Q','R','S','T','U','V','W','X','Y','Z' */\n   13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,\n\n/*91 - 43 = 48 */\n/*48, 49, 50, 51, 52, 53 */\n  -1, -1, -1, -1, -1, -1,\n\n/*97 - 43 = 54*/\n/*'a','b','c','d','e','f','g','h','i','j','k','l','m' */\n   26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,\n\n/*'n','o','p','q','r','s','t','u','v','w','x','y','z' */\n   39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51\n];\n\n// base58 characters (Bitcoin alphabet)\nvar _base58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Base64 encodes a 'binary' encoded string of bytes.\n *\n * @param input the binary encoded string of bytes to base64-encode.\n * @param maxline the maximum number of encoded characters per line to use,\n *          defaults to none.\n *\n * @return the base64-encoded output.\n */\nutil.encode64 = function(input, maxline) {\n  // TODO: deprecate: \"Deprecated. Use util.binary.base64.encode instead.\"\n  var line = '';\n  var output = '';\n  var chr1, chr2, chr3;\n  var i = 0;\n  while(i < input.length) {\n    chr1 = input.charCodeAt(i++);\n    chr2 = input.charCodeAt(i++);\n    chr3 = input.charCodeAt(i++);\n\n    // encode 4 character group\n    line += _base64.charAt(chr1 >> 2);\n    line += _base64.charAt(((chr1 & 3) << 4) | (chr2 >> 4));\n    if(isNaN(chr2)) {\n      line += '==';\n    } else {\n      line += _base64.charAt(((chr2 & 15) << 2) | (chr3 >> 6));\n      line += isNaN(chr3) ? '=' : _base64.charAt(chr3 & 63);\n    }\n\n    if(maxline && line.length > maxline) {\n      output += line.substr(0, maxline) + '\\r\\n';\n      line = line.substr(maxline);\n    }\n  }\n  output += line;\n  return output;\n};\n\n/**\n * Base64 decodes a string into a 'binary' encoded string of bytes.\n *\n * @param input the base64-encoded input.\n *\n * @return the binary encoded string.\n */\nutil.decode64 = function(input) {\n  // TODO: deprecate: \"Deprecated. Use util.binary.base64.decode instead.\"\n\n  // remove all non-base64 characters\n  input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, '');\n\n  var output = '';\n  var enc1, enc2, enc3, enc4;\n  var i = 0;\n\n  while(i < input.length) {\n    enc1 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc2 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc3 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc4 = _base64Idx[input.charCodeAt(i++) - 43];\n\n    output += String.fromCharCode((enc1 << 2) | (enc2 >> 4));\n    if(enc3 !== 64) {\n      // decoded at least 2 bytes\n      output += String.fromCharCode(((enc2 & 15) << 4) | (enc3 >> 2));\n      if(enc4 !== 64) {\n        // decoded 3 bytes\n        output += String.fromCharCode(((enc3 & 3) << 6) | enc4);\n      }\n    }\n  }\n\n  return output;\n};\n\n/**\n * Encodes the given string of characters (a standard JavaScript\n * string) as a binary encoded string where the bytes represent\n * a UTF-8 encoded string of characters. Non-ASCII characters will be\n * encoded as multiple bytes according to UTF-8.\n *\n * @param str a standard string of characters to encode.\n *\n * @return the binary encoded string.\n */\nutil.encodeUtf8 = function(str) {\n  return unescape(encodeURIComponent(str));\n};\n\n/**\n * Decodes a binary encoded string that contains bytes that\n * represent a UTF-8 encoded string of characters -- into a\n * string of characters (a standard JavaScript string).\n *\n * @param str the binary encoded string to decode.\n *\n * @return the resulting standard string of characters.\n */\nutil.decodeUtf8 = function(str) {\n  return decodeURIComponent(escape(str));\n};\n\n// binary encoding/decoding tools\n// FIXME: Experimental. Do not use yet.\nutil.binary = {\n  raw: {},\n  hex: {},\n  base64: {},\n  base58: {},\n  baseN : {\n    encode: baseN.encode,\n    decode: baseN.decode\n  }\n};\n\n/**\n * Encodes a Uint8Array as a binary-encoded string. This encoding uses\n * a value between 0 and 255 for each character.\n *\n * @param bytes the Uint8Array to encode.\n *\n * @return the binary-encoded string.\n */\nutil.binary.raw.encode = function(bytes) {\n  return String.fromCharCode.apply(null, bytes);\n};\n\n/**\n * Decodes a binary-encoded string to a Uint8Array. This encoding uses\n * a value between 0 and 255 for each character.\n *\n * @param str the binary-encoded string to decode.\n * @param [output] an optional Uint8Array to write the output to; if it\n *          is too small, an exception will be thrown.\n * @param [offset] the start offset for writing to the output (default: 0).\n *\n * @return the Uint8Array or the number of bytes written if output was given.\n */\nutil.binary.raw.decode = function(str, output, offset) {\n  var out = output;\n  if(!out) {\n    out = new Uint8Array(str.length);\n  }\n  offset = offset || 0;\n  var j = offset;\n  for(var i = 0; i < str.length; ++i) {\n    out[j++] = str.charCodeAt(i);\n  }\n  return output ? (j - offset) : out;\n};\n\n/**\n * Encodes a 'binary' string, ArrayBuffer, DataView, TypedArray, or\n * ByteBuffer as a string of hexadecimal characters.\n *\n * @param bytes the bytes to convert.\n *\n * @return the string of hexadecimal characters.\n */\nutil.binary.hex.encode = util.bytesToHex;\n\n/**\n * Decodes a hex-encoded string to a Uint8Array.\n *\n * @param hex the hexadecimal string to convert.\n * @param [output] an optional Uint8Array to write the output to; if it\n *          is too small, an exception will be thrown.\n * @param [offset] the start offset for writing to the output (default: 0).\n *\n * @return the Uint8Array or the number of bytes written if output was given.\n */\nutil.binary.hex.decode = function(hex, output, offset) {\n  var out = output;\n  if(!out) {\n    out = new Uint8Array(Math.ceil(hex.length / 2));\n  }\n  offset = offset || 0;\n  var i = 0, j = offset;\n  if(hex.length & 1) {\n    // odd number of characters, convert first character alone\n    i = 1;\n    out[j++] = parseInt(hex[0], 16);\n  }\n  // convert 2 characters (1 byte) at a time\n  for(; i < hex.length; i += 2) {\n    out[j++] = parseInt(hex.substr(i, 2), 16);\n  }\n  return output ? (j - offset) : out;\n};\n\n/**\n * Base64-encodes a Uint8Array.\n *\n * @param input the Uint8Array to encode.\n * @param maxline the maximum number of encoded characters per line to use,\n *          defaults to none.\n *\n * @return the base64-encoded output string.\n */\nutil.binary.base64.encode = function(input, maxline) {\n  var line = '';\n  var output = '';\n  var chr1, chr2, chr3;\n  var i = 0;\n  while(i < input.byteLength) {\n    chr1 = input[i++];\n    chr2 = input[i++];\n    chr3 = input[i++];\n\n    // encode 4 character group\n    line += _base64.charAt(chr1 >> 2);\n    line += _base64.charAt(((chr1 & 3) << 4) | (chr2 >> 4));\n    if(isNaN(chr2)) {\n      line += '==';\n    } else {\n      line += _base64.charAt(((chr2 & 15) << 2) | (chr3 >> 6));\n      line += isNaN(chr3) ? '=' : _base64.charAt(chr3 & 63);\n    }\n\n    if(maxline && line.length > maxline) {\n      output += line.substr(0, maxline) + '\\r\\n';\n      line = line.substr(maxline);\n    }\n  }\n  output += line;\n  return output;\n};\n\n/**\n * Decodes a base64-encoded string to a Uint8Array.\n *\n * @param input the base64-encoded input string.\n * @param [output] an optional Uint8Array to write the output to; if it\n *          is too small, an exception will be thrown.\n * @param [offset] the start offset for writing to the output (default: 0).\n *\n * @return the Uint8Array or the number of bytes written if output was given.\n */\nutil.binary.base64.decode = function(input, output, offset) {\n  var out = output;\n  if(!out) {\n    out = new Uint8Array(Math.ceil(input.length / 4) * 3);\n  }\n\n  // remove all non-base64 characters\n  input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, '');\n\n  offset = offset || 0;\n  var enc1, enc2, enc3, enc4;\n  var i = 0, j = offset;\n\n  while(i < input.length) {\n    enc1 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc2 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc3 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc4 = _base64Idx[input.charCodeAt(i++) - 43];\n\n    out[j++] = (enc1 << 2) | (enc2 >> 4);\n    if(enc3 !== 64) {\n      // decoded at least 2 bytes\n      out[j++] = ((enc2 & 15) << 4) | (enc3 >> 2);\n      if(enc4 !== 64) {\n        // decoded 3 bytes\n        out[j++] = ((enc3 & 3) << 6) | enc4;\n      }\n    }\n  }\n\n  // make sure result is the exact decoded length\n  return output ? (j - offset) : out.subarray(0, j);\n};\n\n// add support for base58 encoding/decoding with Bitcoin alphabet\nutil.binary.base58.encode = function(input, maxline) {\n  return util.binary.baseN.encode(input, _base58, maxline);\n};\nutil.binary.base58.decode = function(input, maxline) {\n  return util.binary.baseN.decode(input, _base58, maxline);\n};\n\n// text encoding/decoding tools\n// FIXME: Experimental. Do not use yet.\nutil.text = {\n  utf8: {},\n  utf16: {}\n};\n\n/**\n * Encodes the given string as UTF-8 in a Uint8Array.\n *\n * @param str the string to encode.\n * @param [output] an optional Uint8Array to write the output to; if it\n *          is too small, an exception will be thrown.\n * @param [offset] the start offset for writing to the output (default: 0).\n *\n * @return the Uint8Array or the number of bytes written if output was given.\n */\nutil.text.utf8.encode = function(str, output, offset) {\n  str = util.encodeUtf8(str);\n  var out = output;\n  if(!out) {\n    out = new Uint8Array(str.length);\n  }\n  offset = offset || 0;\n  var j = offset;\n  for(var i = 0; i < str.length; ++i) {\n    out[j++] = str.charCodeAt(i);\n  }\n  return output ? (j - offset) : out;\n};\n\n/**\n * Decodes the UTF-8 contents from a Uint8Array.\n *\n * @param bytes the Uint8Array to decode.\n *\n * @return the resulting string.\n */\nutil.text.utf8.decode = function(bytes) {\n  return util.decodeUtf8(String.fromCharCode.apply(null, bytes));\n};\n\n/**\n * Encodes the given string as UTF-16 in a Uint8Array.\n *\n * @param str the string to encode.\n * @param [output] an optional Uint8Array to write the output to; if it\n *          is too small, an exception will be thrown.\n * @param [offset] the start offset for writing to the output (default: 0).\n *\n * @return the Uint8Array or the number of bytes written if output was given.\n */\nutil.text.utf16.encode = function(str, output, offset) {\n  var out = output;\n  if(!out) {\n    out = new Uint8Array(str.length * 2);\n  }\n  var view = new Uint16Array(out.buffer);\n  offset = offset || 0;\n  var j = offset;\n  var k = offset;\n  for(var i = 0; i < str.length; ++i) {\n    view[k++] = str.charCodeAt(i);\n    j += 2;\n  }\n  return output ? (j - offset) : out;\n};\n\n/**\n * Decodes the UTF-16 contents from a Uint8Array.\n *\n * @param bytes the Uint8Array to decode.\n *\n * @return the resulting string.\n */\nutil.text.utf16.decode = function(bytes) {\n  return String.fromCharCode.apply(null, new Uint16Array(bytes.buffer));\n};\n\n/**\n * Deflates the given data using a flash interface.\n *\n * @param api the flash interface.\n * @param bytes the data.\n * @param raw true to return only raw deflate data, false to include zlib\n *          header and trailer.\n *\n * @return the deflated data as a string.\n */\nutil.deflate = function(api, bytes, raw) {\n  bytes = util.decode64(api.deflate(util.encode64(bytes)).rval);\n\n  // strip zlib header and trailer if necessary\n  if(raw) {\n    // zlib header is 2 bytes (CMF,FLG) where FLG indicates that\n    // there is a 4-byte DICT (alder-32) block before the data if\n    // its 5th bit is set\n    var start = 2;\n    var flg = bytes.charCodeAt(1);\n    if(flg & 0x20) {\n      start = 6;\n    }\n    // zlib trailer is 4 bytes of adler-32\n    bytes = bytes.substring(start, bytes.length - 4);\n  }\n\n  return bytes;\n};\n\n/**\n * Inflates the given data using a flash interface.\n *\n * @param api the flash interface.\n * @param bytes the data.\n * @param raw true if the incoming data has no zlib header or trailer and is\n *          raw DEFLATE data.\n *\n * @return the inflated data as a string, null on error.\n */\nutil.inflate = function(api, bytes, raw) {\n  // TODO: add zlib header and trailer if necessary/possible\n  var rval = api.inflate(util.encode64(bytes)).rval;\n  return (rval === null) ? null : util.decode64(rval);\n};\n\n/**\n * Sets a storage object.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n * @param obj the storage object, null to remove.\n */\nvar _setStorageObject = function(api, id, obj) {\n  if(!api) {\n    throw new Error('WebStorage not available.');\n  }\n\n  var rval;\n  if(obj === null) {\n    rval = api.removeItem(id);\n  } else {\n    // json-encode and base64-encode object\n    obj = util.encode64(JSON.stringify(obj));\n    rval = api.setItem(id, obj);\n  }\n\n  // handle potential flash error\n  if(typeof(rval) !== 'undefined' && rval.rval !== true) {\n    var error = new Error(rval.error.message);\n    error.id = rval.error.id;\n    error.name = rval.error.name;\n    throw error;\n  }\n};\n\n/**\n * Gets a storage object.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n *\n * @return the storage object entry or null if none exists.\n */\nvar _getStorageObject = function(api, id) {\n  if(!api) {\n    throw new Error('WebStorage not available.');\n  }\n\n  // get the existing entry\n  var rval = api.getItem(id);\n\n  /* Note: We check api.init because we can't do (api == localStorage)\n    on IE because of \"Class doesn't support Automation\" exception. Only\n    the flash api has an init method so this works too, but we need a\n    better solution in the future. */\n\n  // flash returns item wrapped in an object, handle special case\n  if(api.init) {\n    if(rval.rval === null) {\n      if(rval.error) {\n        var error = new Error(rval.error.message);\n        error.id = rval.error.id;\n        error.name = rval.error.name;\n        throw error;\n      }\n      // no error, but also no item\n      rval = null;\n    } else {\n      rval = rval.rval;\n    }\n  }\n\n  // handle decoding\n  if(rval !== null) {\n    // base64-decode and json-decode data\n    rval = JSON.parse(util.decode64(rval));\n  }\n\n  return rval;\n};\n\n/**\n * Stores an item in local storage.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n * @param key the key for the item.\n * @param data the data for the item (any javascript object/primitive).\n */\nvar _setItem = function(api, id, key, data) {\n  // get storage object\n  var obj = _getStorageObject(api, id);\n  if(obj === null) {\n    // create a new storage object\n    obj = {};\n  }\n  // update key\n  obj[key] = data;\n\n  // set storage object\n  _setStorageObject(api, id, obj);\n};\n\n/**\n * Gets an item from local storage.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n * @param key the key for the item.\n *\n * @return the item.\n */\nvar _getItem = function(api, id, key) {\n  // get storage object\n  var rval = _getStorageObject(api, id);\n  if(rval !== null) {\n    // return data at key\n    rval = (key in rval) ? rval[key] : null;\n  }\n\n  return rval;\n};\n\n/**\n * Removes an item from local storage.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n * @param key the key for the item.\n */\nvar _removeItem = function(api, id, key) {\n  // get storage object\n  var obj = _getStorageObject(api, id);\n  if(obj !== null && key in obj) {\n    // remove key\n    delete obj[key];\n\n    // see if entry has no keys remaining\n    var empty = true;\n    for(var prop in obj) {\n      empty = false;\n      break;\n    }\n    if(empty) {\n      // remove entry entirely if no keys are left\n      obj = null;\n    }\n\n    // set storage object\n    _setStorageObject(api, id, obj);\n  }\n};\n\n/**\n * Clears the local disk storage identified by the given ID.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n */\nvar _clearItems = function(api, id) {\n  _setStorageObject(api, id, null);\n};\n\n/**\n * Calls a storage function.\n *\n * @param func the function to call.\n * @param args the arguments for the function.\n * @param location the location argument.\n *\n * @return the return value from the function.\n */\nvar _callStorageFunction = function(func, args, location) {\n  var rval = null;\n\n  // default storage types\n  if(typeof(location) === 'undefined') {\n    location = ['web', 'flash'];\n  }\n\n  // apply storage types in order of preference\n  var type;\n  var done = false;\n  var exception = null;\n  for(var idx in location) {\n    type = location[idx];\n    try {\n      if(type === 'flash' || type === 'both') {\n        if(args[0] === null) {\n          throw new Error('Flash local storage not available.');\n        }\n        rval = func.apply(this, args);\n        done = (type === 'flash');\n      }\n      if(type === 'web' || type === 'both') {\n        args[0] = localStorage;\n        rval = func.apply(this, args);\n        done = true;\n      }\n    } catch(ex) {\n      exception = ex;\n    }\n    if(done) {\n      break;\n    }\n  }\n\n  if(!done) {\n    throw exception;\n  }\n\n  return rval;\n};\n\n/**\n * Stores an item on local disk.\n *\n * The available types of local storage include 'flash', 'web', and 'both'.\n *\n * The type 'flash' refers to flash local storage (SharedObject). In order\n * to use flash local storage, the 'api' parameter must be valid. The type\n * 'web' refers to WebStorage, if supported by the browser. The type 'both'\n * refers to storing using both 'flash' and 'web', not just one or the\n * other.\n *\n * The location array should list the storage types to use in order of\n * preference:\n *\n * ['flash']: flash only storage\n * ['web']: web only storage\n * ['both']: try to store in both\n * ['flash','web']: store in flash first, but if not available, 'web'\n * ['web','flash']: store in web first, but if not available, 'flash'\n *\n * The location array defaults to: ['web', 'flash']\n *\n * @param api the flash interface, null to use only WebStorage.\n * @param id the storage ID to use.\n * @param key the key for the item.\n * @param data the data for the item (any javascript object/primitive).\n * @param location an array with the preferred types of storage to use.\n */\nutil.setItem = function(api, id, key, data, location) {\n  _callStorageFunction(_setItem, arguments, location);\n};\n\n/**\n * Gets an item on local disk.\n *\n * Set setItem() for details on storage types.\n *\n * @param api the flash interface, null to use only WebStorage.\n * @param id the storage ID to use.\n * @param key the key for the item.\n * @param location an array with the preferred types of storage to use.\n *\n * @return the item.\n */\nutil.getItem = function(api, id, key, location) {\n  return _callStorageFunction(_getItem, arguments, location);\n};\n\n/**\n * Removes an item on local disk.\n *\n * Set setItem() for details on storage types.\n *\n * @param api the flash interface.\n * @param id the storage ID to use.\n * @param key the key for the item.\n * @param location an array with the preferred types of storage to use.\n */\nutil.removeItem = function(api, id, key, location) {\n  _callStorageFunction(_removeItem, arguments, location);\n};\n\n/**\n * Clears the local disk storage identified by the given ID.\n *\n * Set setItem() for details on storage types.\n *\n * @param api the flash interface if flash is available.\n * @param id the storage ID to use.\n * @param location an array with the preferred types of storage to use.\n */\nutil.clearItems = function(api, id, location) {\n  _callStorageFunction(_clearItems, arguments, location);\n};\n\n/**\n * Check if an object is empty.\n *\n * Taken from:\n * http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object-from-json/679937#679937\n *\n * @param object the object to check.\n */\nutil.isEmpty = function(obj) {\n  for(var prop in obj) {\n    if(obj.hasOwnProperty(prop)) {\n      return false;\n    }\n  }\n  return true;\n};\n\n/**\n * Format with simple printf-style interpolation.\n *\n * %%: literal '%'\n * %s,%o: convert next argument into a string.\n *\n * @param format the string to format.\n * @param ... arguments to interpolate into the format string.\n */\nutil.format = function(format) {\n  var re = /%./g;\n  // current match\n  var match;\n  // current part\n  var part;\n  // current arg index\n  var argi = 0;\n  // collected parts to recombine later\n  var parts = [];\n  // last index found\n  var last = 0;\n  // loop while matches remain\n  while((match = re.exec(format))) {\n    part = format.substring(last, re.lastIndex - 2);\n    // don't add empty strings (ie, parts between %s%s)\n    if(part.length > 0) {\n      parts.push(part);\n    }\n    last = re.lastIndex;\n    // switch on % code\n    var code = match[0][1];\n    switch(code) {\n    case 's':\n    case 'o':\n      // check if enough arguments were given\n      if(argi < arguments.length) {\n        parts.push(arguments[argi++ + 1]);\n      } else {\n        parts.push('<?>');\n      }\n      break;\n    // FIXME: do proper formating for numbers, etc\n    //case 'f':\n    //case 'd':\n    case '%':\n      parts.push('%');\n      break;\n    default:\n      parts.push('<%' + code + '?>');\n    }\n  }\n  // add trailing part of format string\n  parts.push(format.substring(last));\n  return parts.join('');\n};\n\n/**\n * Formats a number.\n *\n * http://snipplr.com/view/5945/javascript-numberformat--ported-from-php/\n */\nutil.formatNumber = function(number, decimals, dec_point, thousands_sep) {\n  // http://kevin.vanzonneveld.net\n  // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)\n  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n  // +     bugfix by: Michael White (http://crestidg.com)\n  // +     bugfix by: Benjamin Lupton\n  // +     bugfix by: Allan Jensen (http://www.winternet.no)\n  // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)\n  // *     example 1: number_format(1234.5678, 2, '.', '');\n  // *     returns 1: 1234.57\n\n  var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;\n  var d = dec_point === undefined ? ',' : dec_point;\n  var t = thousands_sep === undefined ?\n   '.' : thousands_sep, s = n < 0 ? '-' : '';\n  var i = parseInt((n = Math.abs(+n || 0).toFixed(c)), 10) + '';\n  var j = (i.length > 3) ? i.length % 3 : 0;\n  return s + (j ? i.substr(0, j) + t : '') +\n    i.substr(j).replace(/(\\d{3})(?=\\d)/g, '$1' + t) +\n    (c ? d + Math.abs(n - i).toFixed(c).slice(2) : '');\n};\n\n/**\n * Formats a byte size.\n *\n * http://snipplr.com/view/5949/format-humanize-file-byte-size-presentation-in-javascript/\n */\nutil.formatSize = function(size) {\n  if(size >= 1073741824) {\n    size = util.formatNumber(size / 1073741824, 2, '.', '') + ' GiB';\n  } else if(size >= 1048576) {\n    size = util.formatNumber(size / 1048576, 2, '.', '') + ' MiB';\n  } else if(size >= 1024) {\n    size = util.formatNumber(size / 1024, 0) + ' KiB';\n  } else {\n    size = util.formatNumber(size, 0) + ' bytes';\n  }\n  return size;\n};\n\n/**\n * Converts an IPv4 or IPv6 string representation into bytes (in network order).\n *\n * @param ip the IPv4 or IPv6 address to convert.\n *\n * @return the 4-byte IPv6 or 16-byte IPv6 address or null if the address can't\n *         be parsed.\n */\nutil.bytesFromIP = function(ip) {\n  if(ip.indexOf('.') !== -1) {\n    return util.bytesFromIPv4(ip);\n  }\n  if(ip.indexOf(':') !== -1) {\n    return util.bytesFromIPv6(ip);\n  }\n  return null;\n};\n\n/**\n * Converts an IPv4 string representation into bytes (in network order).\n *\n * @param ip the IPv4 address to convert.\n *\n * @return the 4-byte address or null if the address can't be parsed.\n */\nutil.bytesFromIPv4 = function(ip) {\n  ip = ip.split('.');\n  if(ip.length !== 4) {\n    return null;\n  }\n  var b = util.createBuffer();\n  for(var i = 0; i < ip.length; ++i) {\n    var num = parseInt(ip[i], 10);\n    if(isNaN(num)) {\n      return null;\n    }\n    b.putByte(num);\n  }\n  return b.getBytes();\n};\n\n/**\n * Converts an IPv6 string representation into bytes (in network order).\n *\n * @param ip the IPv6 address to convert.\n *\n * @return the 16-byte address or null if the address can't be parsed.\n */\nutil.bytesFromIPv6 = function(ip) {\n  var blanks = 0;\n  ip = ip.split(':').filter(function(e) {\n    if(e.length === 0) ++blanks;\n    return true;\n  });\n  var zeros = (8 - ip.length + blanks) * 2;\n  var b = util.createBuffer();\n  for(var i = 0; i < 8; ++i) {\n    if(!ip[i] || ip[i].length === 0) {\n      b.fillWithByte(0, zeros);\n      zeros = 0;\n      continue;\n    }\n    var bytes = util.hexToBytes(ip[i]);\n    if(bytes.length < 2) {\n      b.putByte(0);\n    }\n    b.putBytes(bytes);\n  }\n  return b.getBytes();\n};\n\n/**\n * Converts 4-bytes into an IPv4 string representation or 16-bytes into\n * an IPv6 string representation. The bytes must be in network order.\n *\n * @param bytes the bytes to convert.\n *\n * @return the IPv4 or IPv6 string representation if 4 or 16 bytes,\n *         respectively, are given, otherwise null.\n */\nutil.bytesToIP = function(bytes) {\n  if(bytes.length === 4) {\n    return util.bytesToIPv4(bytes);\n  }\n  if(bytes.length === 16) {\n    return util.bytesToIPv6(bytes);\n  }\n  return null;\n};\n\n/**\n * Converts 4-bytes into an IPv4 string representation. The bytes must be\n * in network order.\n *\n * @param bytes the bytes to convert.\n *\n * @return the IPv4 string representation or null for an invalid # of bytes.\n */\nutil.bytesToIPv4 = function(bytes) {\n  if(bytes.length !== 4) {\n    return null;\n  }\n  var ip = [];\n  for(var i = 0; i < bytes.length; ++i) {\n    ip.push(bytes.charCodeAt(i));\n  }\n  return ip.join('.');\n};\n\n/**\n * Converts 16-bytes into an IPv16 string representation. The bytes must be\n * in network order.\n *\n * @param bytes the bytes to convert.\n *\n * @return the IPv16 string representation or null for an invalid # of bytes.\n */\nutil.bytesToIPv6 = function(bytes) {\n  if(bytes.length !== 16) {\n    return null;\n  }\n  var ip = [];\n  var zeroGroups = [];\n  var zeroMaxGroup = 0;\n  for(var i = 0; i < bytes.length; i += 2) {\n    var hex = util.bytesToHex(bytes[i] + bytes[i + 1]);\n    // canonicalize zero representation\n    while(hex[0] === '0' && hex !== '0') {\n      hex = hex.substr(1);\n    }\n    if(hex === '0') {\n      var last = zeroGroups[zeroGroups.length - 1];\n      var idx = ip.length;\n      if(!last || idx !== last.end + 1) {\n        zeroGroups.push({start: idx, end: idx});\n      } else {\n        last.end = idx;\n        if((last.end - last.start) >\n          (zeroGroups[zeroMaxGroup].end - zeroGroups[zeroMaxGroup].start)) {\n          zeroMaxGroup = zeroGroups.length - 1;\n        }\n      }\n    }\n    ip.push(hex);\n  }\n  if(zeroGroups.length > 0) {\n    var group = zeroGroups[zeroMaxGroup];\n    // only shorten group of length > 0\n    if(group.end - group.start > 0) {\n      ip.splice(group.start, group.end - group.start + 1, '');\n      if(group.start === 0) {\n        ip.unshift('');\n      }\n      if(group.end === 7) {\n        ip.push('');\n      }\n    }\n  }\n  return ip.join(':');\n};\n\n/**\n * Estimates the number of processes that can be run concurrently. If\n * creating Web Workers, keep in mind that the main JavaScript process needs\n * its own core.\n *\n * @param options the options to use:\n *          update true to force an update (not use the cached value).\n * @param callback(err, max) called once the operation completes.\n */\nutil.estimateCores = function(options, callback) {\n  if(typeof options === 'function') {\n    callback = options;\n    options = {};\n  }\n  options = options || {};\n  if('cores' in util && !options.update) {\n    return callback(null, util.cores);\n  }\n  if(typeof navigator !== 'undefined' &&\n    'hardwareConcurrency' in navigator &&\n    navigator.hardwareConcurrency > 0) {\n    util.cores = navigator.hardwareConcurrency;\n    return callback(null, util.cores);\n  }\n  if(typeof Worker === 'undefined') {\n    // workers not available\n    util.cores = 1;\n    return callback(null, util.cores);\n  }\n  if(typeof Blob === 'undefined') {\n    // can't estimate, default to 2\n    util.cores = 2;\n    return callback(null, util.cores);\n  }\n\n  // create worker concurrency estimation code as blob\n  var blobUrl = URL.createObjectURL(new Blob(['(',\n    function() {\n      self.addEventListener('message', function(e) {\n        // run worker for 4 ms\n        var st = Date.now();\n        var et = st + 4;\n        while(Date.now() < et);\n        self.postMessage({st: st, et: et});\n      });\n    }.toString(),\n  ')()'], {type: 'application/javascript'}));\n\n  // take 5 samples using 16 workers\n  sample([], 5, 16);\n\n  function sample(max, samples, numWorkers) {\n    if(samples === 0) {\n      // get overlap average\n      var avg = Math.floor(max.reduce(function(avg, x) {\n        return avg + x;\n      }, 0) / max.length);\n      util.cores = Math.max(1, avg);\n      URL.revokeObjectURL(blobUrl);\n      return callback(null, util.cores);\n    }\n    map(numWorkers, function(err, results) {\n      max.push(reduce(numWorkers, results));\n      sample(max, samples - 1, numWorkers);\n    });\n  }\n\n  function map(numWorkers, callback) {\n    var workers = [];\n    var results = [];\n    for(var i = 0; i < numWorkers; ++i) {\n      var worker = new Worker(blobUrl);\n      worker.addEventListener('message', function(e) {\n        results.push(e.data);\n        if(results.length === numWorkers) {\n          for(var i = 0; i < numWorkers; ++i) {\n            workers[i].terminate();\n          }\n          callback(null, results);\n        }\n      });\n      workers.push(worker);\n    }\n    for(var i = 0; i < numWorkers; ++i) {\n      workers[i].postMessage(i);\n    }\n  }\n\n  function reduce(numWorkers, results) {\n    // find overlapping time windows\n    var overlaps = [];\n    for(var n = 0; n < numWorkers; ++n) {\n      var r1 = results[n];\n      var overlap = overlaps[n] = [];\n      for(var i = 0; i < numWorkers; ++i) {\n        if(n === i) {\n          continue;\n        }\n        var r2 = results[i];\n        if((r1.st > r2.st && r1.st < r2.et) ||\n          (r2.st > r1.st && r2.st < r1.et)) {\n          overlap.push(i);\n        }\n      }\n    }\n    // get maximum overlaps ... don't include overlapping worker itself\n    // as the main JS process was also being scheduled during the work and\n    // would have to be subtracted from the estimate anyway\n    return overlaps.reduce(function(max, overlap) {\n      return Math.max(max, overlap.length);\n    }, 0);\n  }\n};\n","/**\n * Cipher base API.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./util');\n\nmodule.exports = forge.cipher = forge.cipher || {};\n\n// registered algorithms\nforge.cipher.algorithms = forge.cipher.algorithms || {};\n\n/**\n * Creates a cipher object that can be used to encrypt data using the given\n * algorithm and key. The algorithm may be provided as a string value for a\n * previously registered algorithm or it may be given as a cipher algorithm\n * API object.\n *\n * @param algorithm the algorithm to use, either a string or an algorithm API\n *          object.\n * @param key the key to use, as a binary-encoded string of bytes or a\n *          byte buffer.\n *\n * @return the cipher.\n */\nforge.cipher.createCipher = function(algorithm, key) {\n  var api = algorithm;\n  if(typeof api === 'string') {\n    api = forge.cipher.getAlgorithm(api);\n    if(api) {\n      api = api();\n    }\n  }\n  if(!api) {\n    throw new Error('Unsupported algorithm: ' + algorithm);\n  }\n\n  // assume block cipher\n  return new forge.cipher.BlockCipher({\n    algorithm: api,\n    key: key,\n    decrypt: false\n  });\n};\n\n/**\n * Creates a decipher object that can be used to decrypt data using the given\n * algorithm and key. The algorithm may be provided as a string value for a\n * previously registered algorithm or it may be given as a cipher algorithm\n * API object.\n *\n * @param algorithm the algorithm to use, either a string or an algorithm API\n *          object.\n * @param key the key to use, as a binary-encoded string of bytes or a\n *          byte buffer.\n *\n * @return the cipher.\n */\nforge.cipher.createDecipher = function(algorithm, key) {\n  var api = algorithm;\n  if(typeof api === 'string') {\n    api = forge.cipher.getAlgorithm(api);\n    if(api) {\n      api = api();\n    }\n  }\n  if(!api) {\n    throw new Error('Unsupported algorithm: ' + algorithm);\n  }\n\n  // assume block cipher\n  return new forge.cipher.BlockCipher({\n    algorithm: api,\n    key: key,\n    decrypt: true\n  });\n};\n\n/**\n * Registers an algorithm by name. If the name was already registered, the\n * algorithm API object will be overwritten.\n *\n * @param name the name of the algorithm.\n * @param algorithm the algorithm API object.\n */\nforge.cipher.registerAlgorithm = function(name, algorithm) {\n  name = name.toUpperCase();\n  forge.cipher.algorithms[name] = algorithm;\n};\n\n/**\n * Gets a registered algorithm by name.\n *\n * @param name the name of the algorithm.\n *\n * @return the algorithm, if found, null if not.\n */\nforge.cipher.getAlgorithm = function(name) {\n  name = name.toUpperCase();\n  if(name in forge.cipher.algorithms) {\n    return forge.cipher.algorithms[name];\n  }\n  return null;\n};\n\nvar BlockCipher = forge.cipher.BlockCipher = function(options) {\n  this.algorithm = options.algorithm;\n  this.mode = this.algorithm.mode;\n  this.blockSize = this.mode.blockSize;\n  this._finish = false;\n  this._input = null;\n  this.output = null;\n  this._op = options.decrypt ? this.mode.decrypt : this.mode.encrypt;\n  this._decrypt = options.decrypt;\n  this.algorithm.initialize(options);\n};\n\n/**\n * Starts or restarts the encryption or decryption process, whichever\n * was previously configured.\n *\n * For non-GCM mode, the IV may be a binary-encoded string of bytes, an array\n * of bytes, a byte buffer, or an array of 32-bit integers. If the IV is in\n * bytes, then it must be Nb (16) bytes in length. If the IV is given in as\n * 32-bit integers, then it must be 4 integers long.\n *\n * Note: an IV is not required or used in ECB mode.\n *\n * For GCM-mode, the IV must be given as a binary-encoded string of bytes or\n * a byte buffer. The number of bytes should be 12 (96 bits) as recommended\n * by NIST SP-800-38D but another length may be given.\n *\n * @param options the options to use:\n *          iv the initialization vector to use as a binary-encoded string of\n *            bytes, null to reuse the last ciphered block from a previous\n *            update() (this \"residue\" method is for legacy support only).\n *          additionalData additional authentication data as a binary-encoded\n *            string of bytes, for 'GCM' mode, (default: none).\n *          tagLength desired length of authentication tag, in bits, for\n *            'GCM' mode (0-128, default: 128).\n *          tag the authentication tag to check if decrypting, as a\n *             binary-encoded string of bytes.\n *          output the output the buffer to write to, null to create one.\n */\nBlockCipher.prototype.start = function(options) {\n  options = options || {};\n  var opts = {};\n  for(var key in options) {\n    opts[key] = options[key];\n  }\n  opts.decrypt = this._decrypt;\n  this._finish = false;\n  this._input = forge.util.createBuffer();\n  this.output = options.output || forge.util.createBuffer();\n  this.mode.start(opts);\n};\n\n/**\n * Updates the next block according to the cipher mode.\n *\n * @param input the buffer to read from.\n */\nBlockCipher.prototype.update = function(input) {\n  if(input) {\n    // input given, so empty it into the input buffer\n    this._input.putBuffer(input);\n  }\n\n  // do cipher operation until it needs more input and not finished\n  while(!this._op.call(this.mode, this._input, this.output, this._finish) &&\n    !this._finish) {}\n\n  // free consumed memory from input buffer\n  this._input.compact();\n};\n\n/**\n * Finishes encrypting or decrypting.\n *\n * @param pad a padding function to use in CBC mode, null for default,\n *          signature(blockSize, buffer, decrypt).\n *\n * @return true if successful, false on error.\n */\nBlockCipher.prototype.finish = function(pad) {\n  // backwards-compatibility w/deprecated padding API\n  // Note: will overwrite padding functions even after another start() call\n  if(pad && (this.mode.name === 'ECB' || this.mode.name === 'CBC')) {\n    this.mode.pad = function(input) {\n      return pad(this.blockSize, input, false);\n    };\n    this.mode.unpad = function(output) {\n      return pad(this.blockSize, output, true);\n    };\n  }\n\n  // build options for padding and afterFinish functions\n  var options = {};\n  options.decrypt = this._decrypt;\n\n  // get # of bytes that won't fill a block\n  options.overflow = this._input.length() % this.blockSize;\n\n  if(!this._decrypt && this.mode.pad) {\n    if(!this.mode.pad(this._input, options)) {\n      return false;\n    }\n  }\n\n  // do final update\n  this._finish = true;\n  this.update();\n\n  if(this._decrypt && this.mode.unpad) {\n    if(!this.mode.unpad(this.output, options)) {\n      return false;\n    }\n  }\n\n  if(this.mode.afterFinish) {\n    if(!this.mode.afterFinish(this.output, options)) {\n      return false;\n    }\n  }\n\n  return true;\n};\n","/**\n * Supported cipher modes.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./util');\n\nforge.cipher = forge.cipher || {};\n\n// supported cipher modes\nvar modes = module.exports = forge.cipher.modes = forge.cipher.modes || {};\n\n/** Electronic codebook (ECB) (Don't use this; it's not secure) **/\n\nmodes.ecb = function(options) {\n  options = options || {};\n  this.name = 'ECB';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = new Array(this._ints);\n  this._outBlock = new Array(this._ints);\n};\n\nmodes.ecb.prototype.start = function(options) {};\n\nmodes.ecb.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {\n    return true;\n  }\n\n  // get next block\n  for(var i = 0; i < this._ints; ++i) {\n    this._inBlock[i] = input.getInt32();\n  }\n\n  // encrypt block\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // write output\n  for(var i = 0; i < this._ints; ++i) {\n    output.putInt32(this._outBlock[i]);\n  }\n};\n\nmodes.ecb.prototype.decrypt = function(input, output, finish) {\n  // not enough input to decrypt\n  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {\n    return true;\n  }\n\n  // get next block\n  for(var i = 0; i < this._ints; ++i) {\n    this._inBlock[i] = input.getInt32();\n  }\n\n  // decrypt block\n  this.cipher.decrypt(this._inBlock, this._outBlock);\n\n  // write output\n  for(var i = 0; i < this._ints; ++i) {\n    output.putInt32(this._outBlock[i]);\n  }\n};\n\nmodes.ecb.prototype.pad = function(input, options) {\n  // add PKCS#7 padding to block (each pad byte is the\n  // value of the number of pad bytes)\n  var padding = (input.length() === this.blockSize ?\n    this.blockSize : (this.blockSize - input.length()));\n  input.fillWithByte(padding, padding);\n  return true;\n};\n\nmodes.ecb.prototype.unpad = function(output, options) {\n  // check for error: input data not a multiple of blockSize\n  if(options.overflow > 0) {\n    return false;\n  }\n\n  // ensure padding byte count is valid\n  var len = output.length();\n  var count = output.at(len - 1);\n  if(count > (this.blockSize << 2)) {\n    return false;\n  }\n\n  // trim off padding bytes\n  output.truncate(count);\n  return true;\n};\n\n/** Cipher-block Chaining (CBC) **/\n\nmodes.cbc = function(options) {\n  options = options || {};\n  this.name = 'CBC';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = new Array(this._ints);\n  this._outBlock = new Array(this._ints);\n};\n\nmodes.cbc.prototype.start = function(options) {\n  // Note: legacy support for using IV residue (has security flaws)\n  // if IV is null, reuse block from previous processing\n  if(options.iv === null) {\n    // must have a previous block\n    if(!this._prev) {\n      throw new Error('Invalid IV parameter.');\n    }\n    this._iv = this._prev.slice(0);\n  } else if(!('iv' in options)) {\n    throw new Error('Invalid IV parameter.');\n  } else {\n    // save IV as \"previous\" block\n    this._iv = transformIV(options.iv, this.blockSize);\n    this._prev = this._iv.slice(0);\n  }\n};\n\nmodes.cbc.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {\n    return true;\n  }\n\n  // get next block\n  // CBC XOR's IV (or previous block) with plaintext\n  for(var i = 0; i < this._ints; ++i) {\n    this._inBlock[i] = this._prev[i] ^ input.getInt32();\n  }\n\n  // encrypt block\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // write output, save previous block\n  for(var i = 0; i < this._ints; ++i) {\n    output.putInt32(this._outBlock[i]);\n  }\n  this._prev = this._outBlock;\n};\n\nmodes.cbc.prototype.decrypt = function(input, output, finish) {\n  // not enough input to decrypt\n  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {\n    return true;\n  }\n\n  // get next block\n  for(var i = 0; i < this._ints; ++i) {\n    this._inBlock[i] = input.getInt32();\n  }\n\n  // decrypt block\n  this.cipher.decrypt(this._inBlock, this._outBlock);\n\n  // write output, save previous ciphered block\n  // CBC XOR's IV (or previous block) with ciphertext\n  for(var i = 0; i < this._ints; ++i) {\n    output.putInt32(this._prev[i] ^ this._outBlock[i]);\n  }\n  this._prev = this._inBlock.slice(0);\n};\n\nmodes.cbc.prototype.pad = function(input, options) {\n  // add PKCS#7 padding to block (each pad byte is the\n  // value of the number of pad bytes)\n  var padding = (input.length() === this.blockSize ?\n    this.blockSize : (this.blockSize - input.length()));\n  input.fillWithByte(padding, padding);\n  return true;\n};\n\nmodes.cbc.prototype.unpad = function(output, options) {\n  // check for error: input data not a multiple of blockSize\n  if(options.overflow > 0) {\n    return false;\n  }\n\n  // ensure padding byte count is valid\n  var len = output.length();\n  var count = output.at(len - 1);\n  if(count > (this.blockSize << 2)) {\n    return false;\n  }\n\n  // trim off padding bytes\n  output.truncate(count);\n  return true;\n};\n\n/** Cipher feedback (CFB) **/\n\nmodes.cfb = function(options) {\n  options = options || {};\n  this.name = 'CFB';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = null;\n  this._outBlock = new Array(this._ints);\n  this._partialBlock = new Array(this._ints);\n  this._partialOutput = forge.util.createBuffer();\n  this._partialBytes = 0;\n};\n\nmodes.cfb.prototype.start = function(options) {\n  if(!('iv' in options)) {\n    throw new Error('Invalid IV parameter.');\n  }\n  // use IV as first input\n  this._iv = transformIV(options.iv, this.blockSize);\n  this._inBlock = this._iv.slice(0);\n  this._partialBytes = 0;\n};\n\nmodes.cfb.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  var inputLength = input.length();\n  if(inputLength === 0) {\n    return true;\n  }\n\n  // encrypt block\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // handle full block\n  if(this._partialBytes === 0 && inputLength >= this.blockSize) {\n    // XOR input with output, write input as output\n    for(var i = 0; i < this._ints; ++i) {\n      this._inBlock[i] = input.getInt32() ^ this._outBlock[i];\n      output.putInt32(this._inBlock[i]);\n    }\n    return;\n  }\n\n  // handle partial block\n  var partialBytes = (this.blockSize - inputLength) % this.blockSize;\n  if(partialBytes > 0) {\n    partialBytes = this.blockSize - partialBytes;\n  }\n\n  // XOR input with output, write input as partial output\n  this._partialOutput.clear();\n  for(var i = 0; i < this._ints; ++i) {\n    this._partialBlock[i] = input.getInt32() ^ this._outBlock[i];\n    this._partialOutput.putInt32(this._partialBlock[i]);\n  }\n\n  if(partialBytes > 0) {\n    // block still incomplete, restore input buffer\n    input.read -= this.blockSize;\n  } else {\n    // block complete, update input block\n    for(var i = 0; i < this._ints; ++i) {\n      this._inBlock[i] = this._partialBlock[i];\n    }\n  }\n\n  // skip any previous partial bytes\n  if(this._partialBytes > 0) {\n    this._partialOutput.getBytes(this._partialBytes);\n  }\n\n  if(partialBytes > 0 && !finish) {\n    output.putBytes(this._partialOutput.getBytes(\n      partialBytes - this._partialBytes));\n    this._partialBytes = partialBytes;\n    return true;\n  }\n\n  output.putBytes(this._partialOutput.getBytes(\n    inputLength - this._partialBytes));\n  this._partialBytes = 0;\n};\n\nmodes.cfb.prototype.decrypt = function(input, output, finish) {\n  // not enough input to decrypt\n  var inputLength = input.length();\n  if(inputLength === 0) {\n    return true;\n  }\n\n  // encrypt block (CFB always uses encryption mode)\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // handle full block\n  if(this._partialBytes === 0 && inputLength >= this.blockSize) {\n    // XOR input with output, write input as output\n    for(var i = 0; i < this._ints; ++i) {\n      this._inBlock[i] = input.getInt32();\n      output.putInt32(this._inBlock[i] ^ this._outBlock[i]);\n    }\n    return;\n  }\n\n  // handle partial block\n  var partialBytes = (this.blockSize - inputLength) % this.blockSize;\n  if(partialBytes > 0) {\n    partialBytes = this.blockSize - partialBytes;\n  }\n\n  // XOR input with output, write input as partial output\n  this._partialOutput.clear();\n  for(var i = 0; i < this._ints; ++i) {\n    this._partialBlock[i] = input.getInt32();\n    this._partialOutput.putInt32(this._partialBlock[i] ^ this._outBlock[i]);\n  }\n\n  if(partialBytes > 0) {\n    // block still incomplete, restore input buffer\n    input.read -= this.blockSize;\n  } else {\n    // block complete, update input block\n    for(var i = 0; i < this._ints; ++i) {\n      this._inBlock[i] = this._partialBlock[i];\n    }\n  }\n\n  // skip any previous partial bytes\n  if(this._partialBytes > 0) {\n    this._partialOutput.getBytes(this._partialBytes);\n  }\n\n  if(partialBytes > 0 && !finish) {\n    output.putBytes(this._partialOutput.getBytes(\n      partialBytes - this._partialBytes));\n    this._partialBytes = partialBytes;\n    return true;\n  }\n\n  output.putBytes(this._partialOutput.getBytes(\n    inputLength - this._partialBytes));\n  this._partialBytes = 0;\n};\n\n/** Output feedback (OFB) **/\n\nmodes.ofb = function(options) {\n  options = options || {};\n  this.name = 'OFB';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = null;\n  this._outBlock = new Array(this._ints);\n  this._partialOutput = forge.util.createBuffer();\n  this._partialBytes = 0;\n};\n\nmodes.ofb.prototype.start = function(options) {\n  if(!('iv' in options)) {\n    throw new Error('Invalid IV parameter.');\n  }\n  // use IV as first input\n  this._iv = transformIV(options.iv, this.blockSize);\n  this._inBlock = this._iv.slice(0);\n  this._partialBytes = 0;\n};\n\nmodes.ofb.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  var inputLength = input.length();\n  if(input.length() === 0) {\n    return true;\n  }\n\n  // encrypt block (OFB always uses encryption mode)\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // handle full block\n  if(this._partialBytes === 0 && inputLength >= this.blockSize) {\n    // XOR input with output and update next input\n    for(var i = 0; i < this._ints; ++i) {\n      output.putInt32(input.getInt32() ^ this._outBlock[i]);\n      this._inBlock[i] = this._outBlock[i];\n    }\n    return;\n  }\n\n  // handle partial block\n  var partialBytes = (this.blockSize - inputLength) % this.blockSize;\n  if(partialBytes > 0) {\n    partialBytes = this.blockSize - partialBytes;\n  }\n\n  // XOR input with output\n  this._partialOutput.clear();\n  for(var i = 0; i < this._ints; ++i) {\n    this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]);\n  }\n\n  if(partialBytes > 0) {\n    // block still incomplete, restore input buffer\n    input.read -= this.blockSize;\n  } else {\n    // block complete, update input block\n    for(var i = 0; i < this._ints; ++i) {\n      this._inBlock[i] = this._outBlock[i];\n    }\n  }\n\n  // skip any previous partial bytes\n  if(this._partialBytes > 0) {\n    this._partialOutput.getBytes(this._partialBytes);\n  }\n\n  if(partialBytes > 0 && !finish) {\n    output.putBytes(this._partialOutput.getBytes(\n      partialBytes - this._partialBytes));\n    this._partialBytes = partialBytes;\n    return true;\n  }\n\n  output.putBytes(this._partialOutput.getBytes(\n    inputLength - this._partialBytes));\n  this._partialBytes = 0;\n};\n\nmodes.ofb.prototype.decrypt = modes.ofb.prototype.encrypt;\n\n/** Counter (CTR) **/\n\nmodes.ctr = function(options) {\n  options = options || {};\n  this.name = 'CTR';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = null;\n  this._outBlock = new Array(this._ints);\n  this._partialOutput = forge.util.createBuffer();\n  this._partialBytes = 0;\n};\n\nmodes.ctr.prototype.start = function(options) {\n  if(!('iv' in options)) {\n    throw new Error('Invalid IV parameter.');\n  }\n  // use IV as first input\n  this._iv = transformIV(options.iv, this.blockSize);\n  this._inBlock = this._iv.slice(0);\n  this._partialBytes = 0;\n};\n\nmodes.ctr.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  var inputLength = input.length();\n  if(inputLength === 0) {\n    return true;\n  }\n\n  // encrypt block (CTR always uses encryption mode)\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // handle full block\n  if(this._partialBytes === 0 && inputLength >= this.blockSize) {\n    // XOR input with output\n    for(var i = 0; i < this._ints; ++i) {\n      output.putInt32(input.getInt32() ^ this._outBlock[i]);\n    }\n  } else {\n    // handle partial block\n    var partialBytes = (this.blockSize - inputLength) % this.blockSize;\n    if(partialBytes > 0) {\n      partialBytes = this.blockSize - partialBytes;\n    }\n\n    // XOR input with output\n    this._partialOutput.clear();\n    for(var i = 0; i < this._ints; ++i) {\n      this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]);\n    }\n\n    if(partialBytes > 0) {\n      // block still incomplete, restore input buffer\n      input.read -= this.blockSize;\n    }\n\n    // skip any previous partial bytes\n    if(this._partialBytes > 0) {\n      this._partialOutput.getBytes(this._partialBytes);\n    }\n\n    if(partialBytes > 0 && !finish) {\n      output.putBytes(this._partialOutput.getBytes(\n        partialBytes - this._partialBytes));\n      this._partialBytes = partialBytes;\n      return true;\n    }\n\n    output.putBytes(this._partialOutput.getBytes(\n      inputLength - this._partialBytes));\n    this._partialBytes = 0;\n  }\n\n  // block complete, increment counter (input block)\n  inc32(this._inBlock);\n};\n\nmodes.ctr.prototype.decrypt = modes.ctr.prototype.encrypt;\n\n/** Galois/Counter Mode (GCM) **/\n\nmodes.gcm = function(options) {\n  options = options || {};\n  this.name = 'GCM';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = new Array(this._ints);\n  this._outBlock = new Array(this._ints);\n  this._partialOutput = forge.util.createBuffer();\n  this._partialBytes = 0;\n\n  // R is actually this value concatenated with 120 more zero bits, but\n  // we only XOR against R so the other zeros have no effect -- we just\n  // apply this value to the first integer in a block\n  this._R = 0xE1000000;\n};\n\nmodes.gcm.prototype.start = function(options) {\n  if(!('iv' in options)) {\n    throw new Error('Invalid IV parameter.');\n  }\n  // ensure IV is a byte buffer\n  var iv = forge.util.createBuffer(options.iv);\n\n  // no ciphered data processed yet\n  this._cipherLength = 0;\n\n  // default additional data is none\n  var additionalData;\n  if('additionalData' in options) {\n    additionalData = forge.util.createBuffer(options.additionalData);\n  } else {\n    additionalData = forge.util.createBuffer();\n  }\n\n  // default tag length is 128 bits\n  if('tagLength' in options) {\n    this._tagLength = options.tagLength;\n  } else {\n    this._tagLength = 128;\n  }\n\n  // if tag is given, ensure tag matches tag length\n  this._tag = null;\n  if(options.decrypt) {\n    // save tag to check later\n    this._tag = forge.util.createBuffer(options.tag).getBytes();\n    if(this._tag.length !== (this._tagLength / 8)) {\n      throw new Error('Authentication tag does not match tag length.');\n    }\n  }\n\n  // create tmp storage for hash calculation\n  this._hashBlock = new Array(this._ints);\n\n  // no tag generated yet\n  this.tag = null;\n\n  // generate hash subkey\n  // (apply block cipher to \"zero\" block)\n  this._hashSubkey = new Array(this._ints);\n  this.cipher.encrypt([0, 0, 0, 0], this._hashSubkey);\n\n  // generate table M\n  // use 4-bit tables (32 component decomposition of a 16 byte value)\n  // 8-bit tables take more space and are known to have security\n  // vulnerabilities (in native implementations)\n  this.componentBits = 4;\n  this._m = this.generateHashTable(this._hashSubkey, this.componentBits);\n\n  // Note: support IV length different from 96 bits? (only supporting\n  // 96 bits is recommended by NIST SP-800-38D)\n  // generate J_0\n  var ivLength = iv.length();\n  if(ivLength === 12) {\n    // 96-bit IV\n    this._j0 = [iv.getInt32(), iv.getInt32(), iv.getInt32(), 1];\n  } else {\n    // IV is NOT 96-bits\n    this._j0 = [0, 0, 0, 0];\n    while(iv.length() > 0) {\n      this._j0 = this.ghash(\n        this._hashSubkey, this._j0,\n        [iv.getInt32(), iv.getInt32(), iv.getInt32(), iv.getInt32()]);\n    }\n    this._j0 = this.ghash(\n      this._hashSubkey, this._j0, [0, 0].concat(from64To32(ivLength * 8)));\n  }\n\n  // generate ICB (initial counter block)\n  this._inBlock = this._j0.slice(0);\n  inc32(this._inBlock);\n  this._partialBytes = 0;\n\n  // consume authentication data\n  additionalData = forge.util.createBuffer(additionalData);\n  // save additional data length as a BE 64-bit number\n  this._aDataLength = from64To32(additionalData.length() * 8);\n  // pad additional data to 128 bit (16 byte) block size\n  var overflow = additionalData.length() % this.blockSize;\n  if(overflow) {\n    additionalData.fillWithByte(0, this.blockSize - overflow);\n  }\n  this._s = [0, 0, 0, 0];\n  while(additionalData.length() > 0) {\n    this._s = this.ghash(this._hashSubkey, this._s, [\n      additionalData.getInt32(),\n      additionalData.getInt32(),\n      additionalData.getInt32(),\n      additionalData.getInt32()\n    ]);\n  }\n};\n\nmodes.gcm.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  var inputLength = input.length();\n  if(inputLength === 0) {\n    return true;\n  }\n\n  // encrypt block\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // handle full block\n  if(this._partialBytes === 0 && inputLength >= this.blockSize) {\n    // XOR input with output\n    for(var i = 0; i < this._ints; ++i) {\n      output.putInt32(this._outBlock[i] ^= input.getInt32());\n    }\n    this._cipherLength += this.blockSize;\n  } else {\n    // handle partial block\n    var partialBytes = (this.blockSize - inputLength) % this.blockSize;\n    if(partialBytes > 0) {\n      partialBytes = this.blockSize - partialBytes;\n    }\n\n    // XOR input with output\n    this._partialOutput.clear();\n    for(var i = 0; i < this._ints; ++i) {\n      this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]);\n    }\n\n    if(partialBytes <= 0 || finish) {\n      // handle overflow prior to hashing\n      if(finish) {\n        // get block overflow\n        var overflow = inputLength % this.blockSize;\n        this._cipherLength += overflow;\n        // truncate for hash function\n        this._partialOutput.truncate(this.blockSize - overflow);\n      } else {\n        this._cipherLength += this.blockSize;\n      }\n\n      // get output block for hashing\n      for(var i = 0; i < this._ints; ++i) {\n        this._outBlock[i] = this._partialOutput.getInt32();\n      }\n      this._partialOutput.read -= this.blockSize;\n    }\n\n    // skip any previous partial bytes\n    if(this._partialBytes > 0) {\n      this._partialOutput.getBytes(this._partialBytes);\n    }\n\n    if(partialBytes > 0 && !finish) {\n      // block still incomplete, restore input buffer, get partial output,\n      // and return early\n      input.read -= this.blockSize;\n      output.putBytes(this._partialOutput.getBytes(\n        partialBytes - this._partialBytes));\n      this._partialBytes = partialBytes;\n      return true;\n    }\n\n    output.putBytes(this._partialOutput.getBytes(\n      inputLength - this._partialBytes));\n    this._partialBytes = 0;\n  }\n\n  // update hash block S\n  this._s = this.ghash(this._hashSubkey, this._s, this._outBlock);\n\n  // increment counter (input block)\n  inc32(this._inBlock);\n};\n\nmodes.gcm.prototype.decrypt = function(input, output, finish) {\n  // not enough input to decrypt\n  var inputLength = input.length();\n  if(inputLength < this.blockSize && !(finish && inputLength > 0)) {\n    return true;\n  }\n\n  // encrypt block (GCM always uses encryption mode)\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // increment counter (input block)\n  inc32(this._inBlock);\n\n  // update hash block S\n  this._hashBlock[0] = input.getInt32();\n  this._hashBlock[1] = input.getInt32();\n  this._hashBlock[2] = input.getInt32();\n  this._hashBlock[3] = input.getInt32();\n  this._s = this.ghash(this._hashSubkey, this._s, this._hashBlock);\n\n  // XOR hash input with output\n  for(var i = 0; i < this._ints; ++i) {\n    output.putInt32(this._outBlock[i] ^ this._hashBlock[i]);\n  }\n\n  // increment cipher data length\n  if(inputLength < this.blockSize) {\n    this._cipherLength += inputLength % this.blockSize;\n  } else {\n    this._cipherLength += this.blockSize;\n  }\n};\n\nmodes.gcm.prototype.afterFinish = function(output, options) {\n  var rval = true;\n\n  // handle overflow\n  if(options.decrypt && options.overflow) {\n    output.truncate(this.blockSize - options.overflow);\n  }\n\n  // handle authentication tag\n  this.tag = forge.util.createBuffer();\n\n  // concatenate additional data length with cipher length\n  var lengths = this._aDataLength.concat(from64To32(this._cipherLength * 8));\n\n  // include lengths in hash\n  this._s = this.ghash(this._hashSubkey, this._s, lengths);\n\n  // do GCTR(J_0, S)\n  var tag = [];\n  this.cipher.encrypt(this._j0, tag);\n  for(var i = 0; i < this._ints; ++i) {\n    this.tag.putInt32(this._s[i] ^ tag[i]);\n  }\n\n  // trim tag to length\n  this.tag.truncate(this.tag.length() % (this._tagLength / 8));\n\n  // check authentication tag\n  if(options.decrypt && this.tag.bytes() !== this._tag) {\n    rval = false;\n  }\n\n  return rval;\n};\n\n/**\n * See NIST SP-800-38D 6.3 (Algorithm 1). This function performs Galois\n * field multiplication. The field, GF(2^128), is defined by the polynomial:\n *\n * x^128 + x^7 + x^2 + x + 1\n *\n * Which is represented in little-endian binary form as: 11100001 (0xe1). When\n * the value of a coefficient is 1, a bit is set. The value R, is the\n * concatenation of this value and 120 zero bits, yielding a 128-bit value\n * which matches the block size.\n *\n * This function will multiply two elements (vectors of bytes), X and Y, in\n * the field GF(2^128). The result is initialized to zero. For each bit of\n * X (out of 128), x_i, if x_i is set, then the result is multiplied (XOR'd)\n * by the current value of Y. For each bit, the value of Y will be raised by\n * a power of x (multiplied by the polynomial x). This can be achieved by\n * shifting Y once to the right. If the current value of Y, prior to being\n * multiplied by x, has 0 as its LSB, then it is a 127th degree polynomial.\n * Otherwise, we must divide by R after shifting to find the remainder.\n *\n * @param x the first block to multiply by the second.\n * @param y the second block to multiply by the first.\n *\n * @return the block result of the multiplication.\n */\nmodes.gcm.prototype.multiply = function(x, y) {\n  var z_i = [0, 0, 0, 0];\n  var v_i = y.slice(0);\n\n  // calculate Z_128 (block has 128 bits)\n  for(var i = 0; i < 128; ++i) {\n    // if x_i is 0, Z_{i+1} = Z_i (unchanged)\n    // else Z_{i+1} = Z_i ^ V_i\n    // get x_i by finding 32-bit int position, then left shift 1 by remainder\n    var x_i = x[(i / 32) | 0] & (1 << (31 - i % 32));\n    if(x_i) {\n      z_i[0] ^= v_i[0];\n      z_i[1] ^= v_i[1];\n      z_i[2] ^= v_i[2];\n      z_i[3] ^= v_i[3];\n    }\n\n    // if LSB(V_i) is 1, V_i = V_i >> 1\n    // else V_i = (V_i >> 1) ^ R\n    this.pow(v_i, v_i);\n  }\n\n  return z_i;\n};\n\nmodes.gcm.prototype.pow = function(x, out) {\n  // if LSB(x) is 1, x = x >>> 1\n  // else x = (x >>> 1) ^ R\n  var lsb = x[3] & 1;\n\n  // always do x >>> 1:\n  // starting with the rightmost integer, shift each integer to the right\n  // one bit, pulling in the bit from the integer to the left as its top\n  // most bit (do this for the last 3 integers)\n  for(var i = 3; i > 0; --i) {\n    out[i] = (x[i] >>> 1) | ((x[i - 1] & 1) << 31);\n  }\n  // shift the first integer normally\n  out[0] = x[0] >>> 1;\n\n  // if lsb was not set, then polynomial had a degree of 127 and doesn't\n  // need to divided; otherwise, XOR with R to find the remainder; we only\n  // need to XOR the first integer since R technically ends w/120 zero bits\n  if(lsb) {\n    out[0] ^= this._R;\n  }\n};\n\nmodes.gcm.prototype.tableMultiply = function(x) {\n  // assumes 4-bit tables are used\n  var z = [0, 0, 0, 0];\n  for(var i = 0; i < 32; ++i) {\n    var idx = (i / 8) | 0;\n    var x_i = (x[idx] >>> ((7 - (i % 8)) * 4)) & 0xF;\n    var ah = this._m[i][x_i];\n    z[0] ^= ah[0];\n    z[1] ^= ah[1];\n    z[2] ^= ah[2];\n    z[3] ^= ah[3];\n  }\n  return z;\n};\n\n/**\n * A continuing version of the GHASH algorithm that operates on a single\n * block. The hash block, last hash value (Ym) and the new block to hash\n * are given.\n *\n * @param h the hash block.\n * @param y the previous value for Ym, use [0, 0, 0, 0] for a new hash.\n * @param x the block to hash.\n *\n * @return the hashed value (Ym).\n */\nmodes.gcm.prototype.ghash = function(h, y, x) {\n  y[0] ^= x[0];\n  y[1] ^= x[1];\n  y[2] ^= x[2];\n  y[3] ^= x[3];\n  return this.tableMultiply(y);\n  //return this.multiply(y, h);\n};\n\n/**\n * Precomputes a table for multiplying against the hash subkey. This\n * mechanism provides a substantial speed increase over multiplication\n * performed without a table. The table-based multiplication this table is\n * for solves X * H by multiplying each component of X by H and then\n * composing the results together using XOR.\n *\n * This function can be used to generate tables with different bit sizes\n * for the components, however, this implementation assumes there are\n * 32 components of X (which is a 16 byte vector), therefore each component\n * takes 4-bits (so the table is constructed with bits=4).\n *\n * @param h the hash subkey.\n * @param bits the bit size for a component.\n */\nmodes.gcm.prototype.generateHashTable = function(h, bits) {\n  // TODO: There are further optimizations that would use only the\n  // first table M_0 (or some variant) along with a remainder table;\n  // this can be explored in the future\n  var multiplier = 8 / bits;\n  var perInt = 4 * multiplier;\n  var size = 16 * multiplier;\n  var m = new Array(size);\n  for(var i = 0; i < size; ++i) {\n    var tmp = [0, 0, 0, 0];\n    var idx = (i / perInt) | 0;\n    var shft = ((perInt - 1 - (i % perInt)) * bits);\n    tmp[idx] = (1 << (bits - 1)) << shft;\n    m[i] = this.generateSubHashTable(this.multiply(tmp, h), bits);\n  }\n  return m;\n};\n\n/**\n * Generates a table for multiplying against the hash subkey for one\n * particular component (out of all possible component values).\n *\n * @param mid the pre-multiplied value for the middle key of the table.\n * @param bits the bit size for a component.\n */\nmodes.gcm.prototype.generateSubHashTable = function(mid, bits) {\n  // compute the table quickly by minimizing the number of\n  // POW operations -- they only need to be performed for powers of 2,\n  // all other entries can be composed from those powers using XOR\n  var size = 1 << bits;\n  var half = size >>> 1;\n  var m = new Array(size);\n  m[half] = mid.slice(0);\n  var i = half >>> 1;\n  while(i > 0) {\n    // raise m0[2 * i] and store in m0[i]\n    this.pow(m[2 * i], m[i] = []);\n    i >>= 1;\n  }\n  i = 2;\n  while(i < half) {\n    for(var j = 1; j < i; ++j) {\n      var m_i = m[i];\n      var m_j = m[j];\n      m[i + j] = [\n        m_i[0] ^ m_j[0],\n        m_i[1] ^ m_j[1],\n        m_i[2] ^ m_j[2],\n        m_i[3] ^ m_j[3]\n      ];\n    }\n    i *= 2;\n  }\n  m[0] = [0, 0, 0, 0];\n  /* Note: We could avoid storing these by doing composition during multiply\n  calculate top half using composition by speed is preferred. */\n  for(i = half + 1; i < size; ++i) {\n    var c = m[i ^ half];\n    m[i] = [mid[0] ^ c[0], mid[1] ^ c[1], mid[2] ^ c[2], mid[3] ^ c[3]];\n  }\n  return m;\n};\n\n/** Utility functions */\n\nfunction transformIV(iv, blockSize) {\n  if(typeof iv === 'string') {\n    // convert iv string into byte buffer\n    iv = forge.util.createBuffer(iv);\n  }\n\n  if(forge.util.isArray(iv) && iv.length > 4) {\n    // convert iv byte array into byte buffer\n    var tmp = iv;\n    iv = forge.util.createBuffer();\n    for(var i = 0; i < tmp.length; ++i) {\n      iv.putByte(tmp[i]);\n    }\n  }\n\n  if(iv.length() < blockSize) {\n    throw new Error(\n      'Invalid IV length; got ' + iv.length() +\n      ' bytes and expected ' + blockSize + ' bytes.');\n  }\n\n  if(!forge.util.isArray(iv)) {\n    // convert iv byte buffer into 32-bit integer array\n    var ints = [];\n    var blocks = blockSize / 4;\n    for(var i = 0; i < blocks; ++i) {\n      ints.push(iv.getInt32());\n    }\n    iv = ints;\n  }\n\n  return iv;\n}\n\nfunction inc32(block) {\n  // increment last 32 bits of block only\n  block[block.length - 1] = (block[block.length - 1] + 1) & 0xFFFFFFFF;\n}\n\nfunction from64To32(num) {\n  // convert 64-bit number to two BE Int32s\n  return [(num / 0x100000000) | 0, num & 0xFFFFFFFF];\n}\n","/**\n * Advanced Encryption Standard (AES) implementation.\n *\n * This implementation is based on the public domain library 'jscrypto' which\n * was written by:\n *\n * Emily Stark (estark@stanford.edu)\n * Mike Hamburg (mhamburg@stanford.edu)\n * Dan Boneh (dabo@cs.stanford.edu)\n *\n * Parts of this code are based on the OpenSSL implementation of AES:\n * http://www.openssl.org\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./cipher');\nrequire('./cipherModes');\nrequire('./util');\n\n/* AES API */\nmodule.exports = forge.aes = forge.aes || {};\n\n/**\n * Deprecated. Instead, use:\n *\n * var cipher = forge.cipher.createCipher('AES-<mode>', key);\n * cipher.start({iv: iv});\n *\n * Creates an AES cipher object to encrypt data using the given symmetric key.\n * The output will be stored in the 'output' member of the returned cipher.\n *\n * The key and iv may be given as a string of bytes, an array of bytes,\n * a byte buffer, or an array of 32-bit words.\n *\n * @param key the symmetric key to use.\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.aes.startEncrypting = function(key, iv, output, mode) {\n  var cipher = _createCipher({\n    key: key,\n    output: output,\n    decrypt: false,\n    mode: mode\n  });\n  cipher.start(iv);\n  return cipher;\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var cipher = forge.cipher.createCipher('AES-<mode>', key);\n *\n * Creates an AES cipher object to encrypt data using the given symmetric key.\n *\n * The key may be given as a string of bytes, an array of bytes, a\n * byte buffer, or an array of 32-bit words.\n *\n * @param key the symmetric key to use.\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.aes.createEncryptionCipher = function(key, mode) {\n  return _createCipher({\n    key: key,\n    output: null,\n    decrypt: false,\n    mode: mode\n  });\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var decipher = forge.cipher.createDecipher('AES-<mode>', key);\n * decipher.start({iv: iv});\n *\n * Creates an AES cipher object to decrypt data using the given symmetric key.\n * The output will be stored in the 'output' member of the returned cipher.\n *\n * The key and iv may be given as a string of bytes, an array of bytes,\n * a byte buffer, or an array of 32-bit words.\n *\n * @param key the symmetric key to use.\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.aes.startDecrypting = function(key, iv, output, mode) {\n  var cipher = _createCipher({\n    key: key,\n    output: output,\n    decrypt: true,\n    mode: mode\n  });\n  cipher.start(iv);\n  return cipher;\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var decipher = forge.cipher.createDecipher('AES-<mode>', key);\n *\n * Creates an AES cipher object to decrypt data using the given symmetric key.\n *\n * The key may be given as a string of bytes, an array of bytes, a\n * byte buffer, or an array of 32-bit words.\n *\n * @param key the symmetric key to use.\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.aes.createDecryptionCipher = function(key, mode) {\n  return _createCipher({\n    key: key,\n    output: null,\n    decrypt: true,\n    mode: mode\n  });\n};\n\n/**\n * Creates a new AES cipher algorithm object.\n *\n * @param name the name of the algorithm.\n * @param mode the mode factory function.\n *\n * @return the AES algorithm object.\n */\nforge.aes.Algorithm = function(name, mode) {\n  if(!init) {\n    initialize();\n  }\n  var self = this;\n  self.name = name;\n  self.mode = new mode({\n    blockSize: 16,\n    cipher: {\n      encrypt: function(inBlock, outBlock) {\n        return _updateBlock(self._w, inBlock, outBlock, false);\n      },\n      decrypt: function(inBlock, outBlock) {\n        return _updateBlock(self._w, inBlock, outBlock, true);\n      }\n    }\n  });\n  self._init = false;\n};\n\n/**\n * Initializes this AES algorithm by expanding its key.\n *\n * @param options the options to use.\n *          key the key to use with this algorithm.\n *          decrypt true if the algorithm should be initialized for decryption,\n *            false for encryption.\n */\nforge.aes.Algorithm.prototype.initialize = function(options) {\n  if(this._init) {\n    return;\n  }\n\n  var key = options.key;\n  var tmp;\n\n  /* Note: The key may be a string of bytes, an array of bytes, a byte\n    buffer, or an array of 32-bit integers. If the key is in bytes, then\n    it must be 16, 24, or 32 bytes in length. If it is in 32-bit\n    integers, it must be 4, 6, or 8 integers long. */\n\n  if(typeof key === 'string' &&\n    (key.length === 16 || key.length === 24 || key.length === 32)) {\n    // convert key string into byte buffer\n    key = forge.util.createBuffer(key);\n  } else if(forge.util.isArray(key) &&\n    (key.length === 16 || key.length === 24 || key.length === 32)) {\n    // convert key integer array into byte buffer\n    tmp = key;\n    key = forge.util.createBuffer();\n    for(var i = 0; i < tmp.length; ++i) {\n      key.putByte(tmp[i]);\n    }\n  }\n\n  // convert key byte buffer into 32-bit integer array\n  if(!forge.util.isArray(key)) {\n    tmp = key;\n    key = [];\n\n    // key lengths of 16, 24, 32 bytes allowed\n    var len = tmp.length();\n    if(len === 16 || len === 24 || len === 32) {\n      len = len >>> 2;\n      for(var i = 0; i < len; ++i) {\n        key.push(tmp.getInt32());\n      }\n    }\n  }\n\n  // key must be an array of 32-bit integers by now\n  if(!forge.util.isArray(key) ||\n    !(key.length === 4 || key.length === 6 || key.length === 8)) {\n    throw new Error('Invalid key parameter.');\n  }\n\n  // encryption operation is always used for these modes\n  var mode = this.mode.name;\n  var encryptOp = (['CFB', 'OFB', 'CTR', 'GCM'].indexOf(mode) !== -1);\n\n  // do key expansion\n  this._w = _expandKey(key, options.decrypt && !encryptOp);\n  this._init = true;\n};\n\n/**\n * Expands a key. Typically only used for testing.\n *\n * @param key the symmetric key to expand, as an array of 32-bit words.\n * @param decrypt true to expand for decryption, false for encryption.\n *\n * @return the expanded key.\n */\nforge.aes._expandKey = function(key, decrypt) {\n  if(!init) {\n    initialize();\n  }\n  return _expandKey(key, decrypt);\n};\n\n/**\n * Updates a single block. Typically only used for testing.\n *\n * @param w the expanded key to use.\n * @param input an array of block-size 32-bit words.\n * @param output an array of block-size 32-bit words.\n * @param decrypt true to decrypt, false to encrypt.\n */\nforge.aes._updateBlock = _updateBlock;\n\n/** Register AES algorithms **/\n\nregisterAlgorithm('AES-ECB', forge.cipher.modes.ecb);\nregisterAlgorithm('AES-CBC', forge.cipher.modes.cbc);\nregisterAlgorithm('AES-CFB', forge.cipher.modes.cfb);\nregisterAlgorithm('AES-OFB', forge.cipher.modes.ofb);\nregisterAlgorithm('AES-CTR', forge.cipher.modes.ctr);\nregisterAlgorithm('AES-GCM', forge.cipher.modes.gcm);\n\nfunction registerAlgorithm(name, mode) {\n  var factory = function() {\n    return new forge.aes.Algorithm(name, mode);\n  };\n  forge.cipher.registerAlgorithm(name, factory);\n}\n\n/** AES implementation **/\n\nvar init = false; // not yet initialized\nvar Nb = 4;       // number of words comprising the state (AES = 4)\nvar sbox;         // non-linear substitution table used in key expansion\nvar isbox;        // inversion of sbox\nvar rcon;         // round constant word array\nvar mix;          // mix-columns table\nvar imix;         // inverse mix-columns table\n\n/**\n * Performs initialization, ie: precomputes tables to optimize for speed.\n *\n * One way to understand how AES works is to imagine that 'addition' and\n * 'multiplication' are interfaces that require certain mathematical\n * properties to hold true (ie: they are associative) but they might have\n * different implementations and produce different kinds of results ...\n * provided that their mathematical properties remain true. AES defines\n * its own methods of addition and multiplication but keeps some important\n * properties the same, ie: associativity and distributivity. The\n * explanation below tries to shed some light on how AES defines addition\n * and multiplication of bytes and 32-bit words in order to perform its\n * encryption and decryption algorithms.\n *\n * The basics:\n *\n * The AES algorithm views bytes as binary representations of polynomials\n * that have either 1 or 0 as the coefficients. It defines the addition\n * or subtraction of two bytes as the XOR operation. It also defines the\n * multiplication of two bytes as a finite field referred to as GF(2^8)\n * (Note: 'GF' means \"Galois Field\" which is a field that contains a finite\n * number of elements so GF(2^8) has 256 elements).\n *\n * This means that any two bytes can be represented as binary polynomials;\n * when they multiplied together and modularly reduced by an irreducible\n * polynomial of the 8th degree, the results are the field GF(2^8). The\n * specific irreducible polynomial that AES uses in hexadecimal is 0x11b.\n * This multiplication is associative with 0x01 as the identity:\n *\n * (b * 0x01 = GF(b, 0x01) = b).\n *\n * The operation GF(b, 0x02) can be performed at the byte level by left\n * shifting b once and then XOR'ing it (to perform the modular reduction)\n * with 0x11b if b is >= 128. Repeated application of the multiplication\n * of 0x02 can be used to implement the multiplication of any two bytes.\n *\n * For instance, multiplying 0x57 and 0x13, denoted as GF(0x57, 0x13), can\n * be performed by factoring 0x13 into 0x01, 0x02, and 0x10. Then these\n * factors can each be multiplied by 0x57 and then added together. To do\n * the multiplication, values for 0x57 multiplied by each of these 3 factors\n * can be precomputed and stored in a table. To add them, the values from\n * the table are XOR'd together.\n *\n * AES also defines addition and multiplication of words, that is 4-byte\n * numbers represented as polynomials of 3 degrees where the coefficients\n * are the values of the bytes.\n *\n * The word [a0, a1, a2, a3] is a polynomial a3x^3 + a2x^2 + a1x + a0.\n *\n * Addition is performed by XOR'ing like powers of x. Multiplication\n * is performed in two steps, the first is an algebriac expansion as\n * you would do normally (where addition is XOR). But the result is\n * a polynomial larger than 3 degrees and thus it cannot fit in a word. So\n * next the result is modularly reduced by an AES-specific polynomial of\n * degree 4 which will always produce a polynomial of less than 4 degrees\n * such that it will fit in a word. In AES, this polynomial is x^4 + 1.\n *\n * The modular product of two polynomials 'a' and 'b' is thus:\n *\n * d(x) = d3x^3 + d2x^2 + d1x + d0\n * with\n * d0 = GF(a0, b0) ^ GF(a3, b1) ^ GF(a2, b2) ^ GF(a1, b3)\n * d1 = GF(a1, b0) ^ GF(a0, b1) ^ GF(a3, b2) ^ GF(a2, b3)\n * d2 = GF(a2, b0) ^ GF(a1, b1) ^ GF(a0, b2) ^ GF(a3, b3)\n * d3 = GF(a3, b0) ^ GF(a2, b1) ^ GF(a1, b2) ^ GF(a0, b3)\n *\n * As a matrix:\n *\n * [d0] = [a0 a3 a2 a1][b0]\n * [d1]   [a1 a0 a3 a2][b1]\n * [d2]   [a2 a1 a0 a3][b2]\n * [d3]   [a3 a2 a1 a0][b3]\n *\n * Special polynomials defined by AES (0x02 == {02}):\n * a(x)    = {03}x^3 + {01}x^2 + {01}x + {02}\n * a^-1(x) = {0b}x^3 + {0d}x^2 + {09}x + {0e}.\n *\n * These polynomials are used in the MixColumns() and InverseMixColumns()\n * operations, respectively, to cause each element in the state to affect\n * the output (referred to as diffusing).\n *\n * RotWord() uses: a0 = a1 = a2 = {00} and a3 = {01}, which is the\n * polynomial x3.\n *\n * The ShiftRows() method modifies the last 3 rows in the state (where\n * the state is 4 words with 4 bytes per word) by shifting bytes cyclically.\n * The 1st byte in the second row is moved to the end of the row. The 1st\n * and 2nd bytes in the third row are moved to the end of the row. The 1st,\n * 2nd, and 3rd bytes are moved in the fourth row.\n *\n * More details on how AES arithmetic works:\n *\n * In the polynomial representation of binary numbers, XOR performs addition\n * and subtraction and multiplication in GF(2^8) denoted as GF(a, b)\n * corresponds with the multiplication of polynomials modulo an irreducible\n * polynomial of degree 8. In other words, for AES, GF(a, b) will multiply\n * polynomial 'a' with polynomial 'b' and then do a modular reduction by\n * an AES-specific irreducible polynomial of degree 8.\n *\n * A polynomial is irreducible if its only divisors are one and itself. For\n * the AES algorithm, this irreducible polynomial is:\n *\n * m(x) = x^8 + x^4 + x^3 + x + 1,\n *\n * or {01}{1b} in hexadecimal notation, where each coefficient is a bit:\n * 100011011 = 283 = 0x11b.\n *\n * For example, GF(0x57, 0x83) = 0xc1 because\n *\n * 0x57 = 87  = 01010111 = x^6 + x^4 + x^2 + x + 1\n * 0x85 = 131 = 10000101 = x^7 + x + 1\n *\n * (x^6 + x^4 + x^2 + x + 1) * (x^7 + x + 1)\n * =  x^13 + x^11 + x^9 + x^8 + x^7 +\n *    x^7 + x^5 + x^3 + x^2 + x +\n *    x^6 + x^4 + x^2 + x + 1\n * =  x^13 + x^11 + x^9 + x^8 + x^6 + x^5 + x^4 + x^3 + 1 = y\n *    y modulo (x^8 + x^4 + x^3 + x + 1)\n * =  x^7 + x^6 + 1.\n *\n * The modular reduction by m(x) guarantees the result will be a binary\n * polynomial of less than degree 8, so that it can fit in a byte.\n *\n * The operation to multiply a binary polynomial b with x (the polynomial\n * x in binary representation is 00000010) is:\n *\n * b_7x^8 + b_6x^7 + b_5x^6 + b_4x^5 + b_3x^4 + b_2x^3 + b_1x^2 + b_0x^1\n *\n * To get GF(b, x) we must reduce that by m(x). If b_7 is 0 (that is the\n * most significant bit is 0 in b) then the result is already reduced. If\n * it is 1, then we can reduce it by subtracting m(x) via an XOR.\n *\n * It follows that multiplication by x (00000010 or 0x02) can be implemented\n * by performing a left shift followed by a conditional bitwise XOR with\n * 0x1b. This operation on bytes is denoted by xtime(). Multiplication by\n * higher powers of x can be implemented by repeated application of xtime().\n *\n * By adding intermediate results, multiplication by any constant can be\n * implemented. For instance:\n *\n * GF(0x57, 0x13) = 0xfe because:\n *\n * xtime(b) = (b & 128) ? (b << 1 ^ 0x11b) : (b << 1)\n *\n * Note: We XOR with 0x11b instead of 0x1b because in javascript our\n * datatype for b can be larger than 1 byte, so a left shift will not\n * automatically eliminate bits that overflow a byte ... by XOR'ing the\n * overflow bit with 1 (the extra one from 0x11b) we zero it out.\n *\n * GF(0x57, 0x02) = xtime(0x57) = 0xae\n * GF(0x57, 0x04) = xtime(0xae) = 0x47\n * GF(0x57, 0x08) = xtime(0x47) = 0x8e\n * GF(0x57, 0x10) = xtime(0x8e) = 0x07\n *\n * GF(0x57, 0x13) = GF(0x57, (0x01 ^ 0x02 ^ 0x10))\n *\n * And by the distributive property (since XOR is addition and GF() is\n * multiplication):\n *\n * = GF(0x57, 0x01) ^ GF(0x57, 0x02) ^ GF(0x57, 0x10)\n * = 0x57 ^ 0xae ^ 0x07\n * = 0xfe.\n */\nfunction initialize() {\n  init = true;\n\n  /* Populate the Rcon table. These are the values given by\n    [x^(i-1),{00},{00},{00}] where x^(i-1) are powers of x (and x = 0x02)\n    in the field of GF(2^8), where i starts at 1.\n\n    rcon[0] = [0x00, 0x00, 0x00, 0x00]\n    rcon[1] = [0x01, 0x00, 0x00, 0x00] 2^(1-1) = 2^0 = 1\n    rcon[2] = [0x02, 0x00, 0x00, 0x00] 2^(2-1) = 2^1 = 2\n    ...\n    rcon[9]  = [0x1B, 0x00, 0x00, 0x00] 2^(9-1)  = 2^8 = 0x1B\n    rcon[10] = [0x36, 0x00, 0x00, 0x00] 2^(10-1) = 2^9 = 0x36\n\n    We only store the first byte because it is the only one used.\n  */\n  rcon = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36];\n\n  // compute xtime table which maps i onto GF(i, 0x02)\n  var xtime = new Array(256);\n  for(var i = 0; i < 128; ++i) {\n    xtime[i] = i << 1;\n    xtime[i + 128] = (i + 128) << 1 ^ 0x11B;\n  }\n\n  // compute all other tables\n  sbox = new Array(256);\n  isbox = new Array(256);\n  mix = new Array(4);\n  imix = new Array(4);\n  for(var i = 0; i < 4; ++i) {\n    mix[i] = new Array(256);\n    imix[i] = new Array(256);\n  }\n  var e = 0, ei = 0, e2, e4, e8, sx, sx2, me, ime;\n  for(var i = 0; i < 256; ++i) {\n    /* We need to generate the SubBytes() sbox and isbox tables so that\n      we can perform byte substitutions. This requires us to traverse\n      all of the elements in GF, find their multiplicative inverses,\n      and apply to each the following affine transformation:\n\n      bi' = bi ^ b(i + 4) mod 8 ^ b(i + 5) mod 8 ^ b(i + 6) mod 8 ^\n            b(i + 7) mod 8 ^ ci\n      for 0 <= i < 8, where bi is the ith bit of the byte, and ci is the\n      ith bit of a byte c with the value {63} or {01100011}.\n\n      It is possible to traverse every possible value in a Galois field\n      using what is referred to as a 'generator'. There are many\n      generators (128 out of 256): 3,5,6,9,11,82 to name a few. To fully\n      traverse GF we iterate 255 times, multiplying by our generator\n      each time.\n\n      On each iteration we can determine the multiplicative inverse for\n      the current element.\n\n      Suppose there is an element in GF 'e'. For a given generator 'g',\n      e = g^x. The multiplicative inverse of e is g^(255 - x). It turns\n      out that if use the inverse of a generator as another generator\n      it will produce all of the corresponding multiplicative inverses\n      at the same time. For this reason, we choose 5 as our inverse\n      generator because it only requires 2 multiplies and 1 add and its\n      inverse, 82, requires relatively few operations as well.\n\n      In order to apply the affine transformation, the multiplicative\n      inverse 'ei' of 'e' can be repeatedly XOR'd (4 times) with a\n      bit-cycling of 'ei'. To do this 'ei' is first stored in 's' and\n      'x'. Then 's' is left shifted and the high bit of 's' is made the\n      low bit. The resulting value is stored in 's'. Then 'x' is XOR'd\n      with 's' and stored in 'x'. On each subsequent iteration the same\n      operation is performed. When 4 iterations are complete, 'x' is\n      XOR'd with 'c' (0x63) and the transformed value is stored in 'x'.\n      For example:\n\n      s = 01000001\n      x = 01000001\n\n      iteration 1: s = 10000010, x ^= s\n      iteration 2: s = 00000101, x ^= s\n      iteration 3: s = 00001010, x ^= s\n      iteration 4: s = 00010100, x ^= s\n      x ^= 0x63\n\n      This can be done with a loop where s = (s << 1) | (s >> 7). However,\n      it can also be done by using a single 16-bit (in this case 32-bit)\n      number 'sx'. Since XOR is an associative operation, we can set 'sx'\n      to 'ei' and then XOR it with 'sx' left-shifted 1,2,3, and 4 times.\n      The most significant bits will flow into the high 8 bit positions\n      and be correctly XOR'd with one another. All that remains will be\n      to cycle the high 8 bits by XOR'ing them all with the lower 8 bits\n      afterwards.\n\n      At the same time we're populating sbox and isbox we can precompute\n      the multiplication we'll need to do to do MixColumns() later.\n    */\n\n    // apply affine transformation\n    sx = ei ^ (ei << 1) ^ (ei << 2) ^ (ei << 3) ^ (ei << 4);\n    sx = (sx >> 8) ^ (sx & 255) ^ 0x63;\n\n    // update tables\n    sbox[e] = sx;\n    isbox[sx] = e;\n\n    /* Mixing columns is done using matrix multiplication. The columns\n      that are to be mixed are each a single word in the current state.\n      The state has Nb columns (4 columns). Therefore each column is a\n      4 byte word. So to mix the columns in a single column 'c' where\n      its rows are r0, r1, r2, and r3, we use the following matrix\n      multiplication:\n\n      [2 3 1 1]*[r0,c]=[r'0,c]\n      [1 2 3 1] [r1,c] [r'1,c]\n      [1 1 2 3] [r2,c] [r'2,c]\n      [3 1 1 2] [r3,c] [r'3,c]\n\n      r0, r1, r2, and r3 are each 1 byte of one of the words in the\n      state (a column). To do matrix multiplication for each mixed\n      column c' we multiply the corresponding row from the left matrix\n      with the corresponding column from the right matrix. In total, we\n      get 4 equations:\n\n      r0,c' = 2*r0,c + 3*r1,c + 1*r2,c + 1*r3,c\n      r1,c' = 1*r0,c + 2*r1,c + 3*r2,c + 1*r3,c\n      r2,c' = 1*r0,c + 1*r1,c + 2*r2,c + 3*r3,c\n      r3,c' = 3*r0,c + 1*r1,c + 1*r2,c + 2*r3,c\n\n      As usual, the multiplication is as previously defined and the\n      addition is XOR. In order to optimize mixing columns we can store\n      the multiplication results in tables. If you think of the whole\n      column as a word (it might help to visualize by mentally rotating\n      the equations above by counterclockwise 90 degrees) then you can\n      see that it would be useful to map the multiplications performed on\n      each byte (r0, r1, r2, r3) onto a word as well. For instance, we\n      could map 2*r0,1*r0,1*r0,3*r0 onto a word by storing 2*r0 in the\n      highest 8 bits and 3*r0 in the lowest 8 bits (with the other two\n      respectively in the middle). This means that a table can be\n      constructed that uses r0 as an index to the word. We can do the\n      same with r1, r2, and r3, creating a total of 4 tables.\n\n      To construct a full c', we can just look up each byte of c in\n      their respective tables and XOR the results together.\n\n      Also, to build each table we only have to calculate the word\n      for 2,1,1,3 for every byte ... which we can do on each iteration\n      of this loop since we will iterate over every byte. After we have\n      calculated 2,1,1,3 we can get the results for the other tables\n      by cycling the byte at the end to the beginning. For instance\n      we can take the result of table 2,1,1,3 and produce table 3,2,1,1\n      by moving the right most byte to the left most position just like\n      how you can imagine the 3 moved out of 2,1,1,3 and to the front\n      to produce 3,2,1,1.\n\n      There is another optimization in that the same multiples of\n      the current element we need in order to advance our generator\n      to the next iteration can be reused in performing the 2,1,1,3\n      calculation. We also calculate the inverse mix column tables,\n      with e,9,d,b being the inverse of 2,1,1,3.\n\n      When we're done, and we need to actually mix columns, the first\n      byte of each state word should be put through mix[0] (2,1,1,3),\n      the second through mix[1] (3,2,1,1) and so forth. Then they should\n      be XOR'd together to produce the fully mixed column.\n    */\n\n    // calculate mix and imix table values\n    sx2 = xtime[sx];\n    e2 = xtime[e];\n    e4 = xtime[e2];\n    e8 = xtime[e4];\n    me =\n      (sx2 << 24) ^  // 2\n      (sx << 16) ^   // 1\n      (sx << 8) ^    // 1\n      (sx ^ sx2);    // 3\n    ime =\n      (e2 ^ e4 ^ e8) << 24 ^  // E (14)\n      (e ^ e8) << 16 ^        // 9\n      (e ^ e4 ^ e8) << 8 ^    // D (13)\n      (e ^ e2 ^ e8);          // B (11)\n    // produce each of the mix tables by rotating the 2,1,1,3 value\n    for(var n = 0; n < 4; ++n) {\n      mix[n][e] = me;\n      imix[n][sx] = ime;\n      // cycle the right most byte to the left most position\n      // ie: 2,1,1,3 becomes 3,2,1,1\n      me = me << 24 | me >>> 8;\n      ime = ime << 24 | ime >>> 8;\n    }\n\n    // get next element and inverse\n    if(e === 0) {\n      // 1 is the inverse of 1\n      e = ei = 1;\n    } else {\n      // e = 2e + 2*2*2*(10e)) = multiply e by 82 (chosen generator)\n      // ei = ei + 2*2*ei = multiply ei by 5 (inverse generator)\n      e = e2 ^ xtime[xtime[xtime[e2 ^ e8]]];\n      ei ^= xtime[xtime[ei]];\n    }\n  }\n}\n\n/**\n * Generates a key schedule using the AES key expansion algorithm.\n *\n * The AES algorithm takes the Cipher Key, K, and performs a Key Expansion\n * routine to generate a key schedule. The Key Expansion generates a total\n * of Nb*(Nr + 1) words: the algorithm requires an initial set of Nb words,\n * and each of the Nr rounds requires Nb words of key data. The resulting\n * key schedule consists of a linear array of 4-byte words, denoted [wi ],\n * with i in the range 0 <= i < Nb(Nr + 1).\n *\n * KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)\n * AES-128 (Nb=4, Nk=4, Nr=10)\n * AES-192 (Nb=4, Nk=6, Nr=12)\n * AES-256 (Nb=4, Nk=8, Nr=14)\n * Note: Nr=Nk+6.\n *\n * Nb is the number of columns (32-bit words) comprising the State (or\n * number of bytes in a block). For AES, Nb=4.\n *\n * @param key the key to schedule (as an array of 32-bit words).\n * @param decrypt true to modify the key schedule to decrypt, false not to.\n *\n * @return the generated key schedule.\n */\nfunction _expandKey(key, decrypt) {\n  // copy the key's words to initialize the key schedule\n  var w = key.slice(0);\n\n  /* RotWord() will rotate a word, moving the first byte to the last\n    byte's position (shifting the other bytes left).\n\n    We will be getting the value of Rcon at i / Nk. 'i' will iterate\n    from Nk to (Nb * Nr+1). Nk = 4 (4 byte key), Nb = 4 (4 words in\n    a block), Nr = Nk + 6 (10). Therefore 'i' will iterate from\n    4 to 44 (exclusive). Each time we iterate 4 times, i / Nk will\n    increase by 1. We use a counter iNk to keep track of this.\n   */\n\n  // go through the rounds expanding the key\n  var temp, iNk = 1;\n  var Nk = w.length;\n  var Nr1 = Nk + 6 + 1;\n  var end = Nb * Nr1;\n  for(var i = Nk; i < end; ++i) {\n    temp = w[i - 1];\n    if(i % Nk === 0) {\n      // temp = SubWord(RotWord(temp)) ^ Rcon[i / Nk]\n      temp =\n        sbox[temp >>> 16 & 255] << 24 ^\n        sbox[temp >>> 8 & 255] << 16 ^\n        sbox[temp & 255] << 8 ^\n        sbox[temp >>> 24] ^ (rcon[iNk] << 24);\n      iNk++;\n    } else if(Nk > 6 && (i % Nk === 4)) {\n      // temp = SubWord(temp)\n      temp =\n        sbox[temp >>> 24] << 24 ^\n        sbox[temp >>> 16 & 255] << 16 ^\n        sbox[temp >>> 8 & 255] << 8 ^\n        sbox[temp & 255];\n    }\n    w[i] = w[i - Nk] ^ temp;\n  }\n\n  /* When we are updating a cipher block we always use the code path for\n     encryption whether we are decrypting or not (to shorten code and\n     simplify the generation of look up tables). However, because there\n     are differences in the decryption algorithm, other than just swapping\n     in different look up tables, we must transform our key schedule to\n     account for these changes:\n\n     1. The decryption algorithm gets its key rounds in reverse order.\n     2. The decryption algorithm adds the round key before mixing columns\n       instead of afterwards.\n\n     We don't need to modify our key schedule to handle the first case,\n     we can just traverse the key schedule in reverse order when decrypting.\n\n     The second case requires a little work.\n\n     The tables we built for performing rounds will take an input and then\n     perform SubBytes() and MixColumns() or, for the decrypt version,\n     InvSubBytes() and InvMixColumns(). But the decrypt algorithm requires\n     us to AddRoundKey() before InvMixColumns(). This means we'll need to\n     apply some transformations to the round key to inverse-mix its columns\n     so they'll be correct for moving AddRoundKey() to after the state has\n     had its columns inverse-mixed.\n\n     To inverse-mix the columns of the state when we're decrypting we use a\n     lookup table that will apply InvSubBytes() and InvMixColumns() at the\n     same time. However, the round key's bytes are not inverse-substituted\n     in the decryption algorithm. To get around this problem, we can first\n     substitute the bytes in the round key so that when we apply the\n     transformation via the InvSubBytes()+InvMixColumns() table, it will\n     undo our substitution leaving us with the original value that we\n     want -- and then inverse-mix that value.\n\n     This change will correctly alter our key schedule so that we can XOR\n     each round key with our already transformed decryption state. This\n     allows us to use the same code path as the encryption algorithm.\n\n     We make one more change to the decryption key. Since the decryption\n     algorithm runs in reverse from the encryption algorithm, we reverse\n     the order of the round keys to avoid having to iterate over the key\n     schedule backwards when running the encryption algorithm later in\n     decryption mode. In addition to reversing the order of the round keys,\n     we also swap each round key's 2nd and 4th rows. See the comments\n     section where rounds are performed for more details about why this is\n     done. These changes are done inline with the other substitution\n     described above.\n  */\n  if(decrypt) {\n    var tmp;\n    var m0 = imix[0];\n    var m1 = imix[1];\n    var m2 = imix[2];\n    var m3 = imix[3];\n    var wnew = w.slice(0);\n    end = w.length;\n    for(var i = 0, wi = end - Nb; i < end; i += Nb, wi -= Nb) {\n      // do not sub the first or last round key (round keys are Nb\n      // words) as no column mixing is performed before they are added,\n      // but do change the key order\n      if(i === 0 || i === (end - Nb)) {\n        wnew[i] = w[wi];\n        wnew[i + 1] = w[wi + 3];\n        wnew[i + 2] = w[wi + 2];\n        wnew[i + 3] = w[wi + 1];\n      } else {\n        // substitute each round key byte because the inverse-mix\n        // table will inverse-substitute it (effectively cancel the\n        // substitution because round key bytes aren't sub'd in\n        // decryption mode) and swap indexes 3 and 1\n        for(var n = 0; n < Nb; ++n) {\n          tmp = w[wi + n];\n          wnew[i + (3&-n)] =\n            m0[sbox[tmp >>> 24]] ^\n            m1[sbox[tmp >>> 16 & 255]] ^\n            m2[sbox[tmp >>> 8 & 255]] ^\n            m3[sbox[tmp & 255]];\n        }\n      }\n    }\n    w = wnew;\n  }\n\n  return w;\n}\n\n/**\n * Updates a single block (16 bytes) using AES. The update will either\n * encrypt or decrypt the block.\n *\n * @param w the key schedule.\n * @param input the input block (an array of 32-bit words).\n * @param output the updated output block.\n * @param decrypt true to decrypt the block, false to encrypt it.\n */\nfunction _updateBlock(w, input, output, decrypt) {\n  /*\n  Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])\n  begin\n    byte state[4,Nb]\n    state = in\n    AddRoundKey(state, w[0, Nb-1])\n    for round = 1 step 1 to Nr-1\n      SubBytes(state)\n      ShiftRows(state)\n      MixColumns(state)\n      AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])\n    end for\n    SubBytes(state)\n    ShiftRows(state)\n    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])\n    out = state\n  end\n\n  InvCipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])\n  begin\n    byte state[4,Nb]\n    state = in\n    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])\n    for round = Nr-1 step -1 downto 1\n      InvShiftRows(state)\n      InvSubBytes(state)\n      AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])\n      InvMixColumns(state)\n    end for\n    InvShiftRows(state)\n    InvSubBytes(state)\n    AddRoundKey(state, w[0, Nb-1])\n    out = state\n  end\n  */\n\n  // Encrypt: AddRoundKey(state, w[0, Nb-1])\n  // Decrypt: AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])\n  var Nr = w.length / 4 - 1;\n  var m0, m1, m2, m3, sub;\n  if(decrypt) {\n    m0 = imix[0];\n    m1 = imix[1];\n    m2 = imix[2];\n    m3 = imix[3];\n    sub = isbox;\n  } else {\n    m0 = mix[0];\n    m1 = mix[1];\n    m2 = mix[2];\n    m3 = mix[3];\n    sub = sbox;\n  }\n  var a, b, c, d, a2, b2, c2;\n  a = input[0] ^ w[0];\n  b = input[decrypt ? 3 : 1] ^ w[1];\n  c = input[2] ^ w[2];\n  d = input[decrypt ? 1 : 3] ^ w[3];\n  var i = 3;\n\n  /* In order to share code we follow the encryption algorithm when both\n    encrypting and decrypting. To account for the changes required in the\n    decryption algorithm, we use different lookup tables when decrypting\n    and use a modified key schedule to account for the difference in the\n    order of transformations applied when performing rounds. We also get\n    key rounds in reverse order (relative to encryption). */\n  for(var round = 1; round < Nr; ++round) {\n    /* As described above, we'll be using table lookups to perform the\n      column mixing. Each column is stored as a word in the state (the\n      array 'input' has one column as a word at each index). In order to\n      mix a column, we perform these transformations on each row in c,\n      which is 1 byte in each word. The new column for c0 is c'0:\n\n               m0      m1      m2      m3\n      r0,c'0 = 2*r0,c0 + 3*r1,c0 + 1*r2,c0 + 1*r3,c0\n      r1,c'0 = 1*r0,c0 + 2*r1,c0 + 3*r2,c0 + 1*r3,c0\n      r2,c'0 = 1*r0,c0 + 1*r1,c0 + 2*r2,c0 + 3*r3,c0\n      r3,c'0 = 3*r0,c0 + 1*r1,c0 + 1*r2,c0 + 2*r3,c0\n\n      So using mix tables where c0 is a word with r0 being its upper\n      8 bits and r3 being its lower 8 bits:\n\n      m0[c0 >> 24] will yield this word: [2*r0,1*r0,1*r0,3*r0]\n      ...\n      m3[c0 & 255] will yield this word: [1*r3,1*r3,3*r3,2*r3]\n\n      Therefore to mix the columns in each word in the state we\n      do the following (& 255 omitted for brevity):\n      c'0,r0 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]\n      c'0,r1 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]\n      c'0,r2 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]\n      c'0,r3 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]\n\n      However, before mixing, the algorithm requires us to perform\n      ShiftRows(). The ShiftRows() transformation cyclically shifts the\n      last 3 rows of the state over different offsets. The first row\n      (r = 0) is not shifted.\n\n      s'_r,c = s_r,(c + shift(r, Nb) mod Nb\n      for 0 < r < 4 and 0 <= c < Nb and\n      shift(1, 4) = 1\n      shift(2, 4) = 2\n      shift(3, 4) = 3.\n\n      This causes the first byte in r = 1 to be moved to the end of\n      the row, the first 2 bytes in r = 2 to be moved to the end of\n      the row, the first 3 bytes in r = 3 to be moved to the end of\n      the row:\n\n      r1: [c0 c1 c2 c3] => [c1 c2 c3 c0]\n      r2: [c0 c1 c2 c3]    [c2 c3 c0 c1]\n      r3: [c0 c1 c2 c3]    [c3 c0 c1 c2]\n\n      We can make these substitutions inline with our column mixing to\n      generate an updated set of equations to produce each word in the\n      state (note the columns have changed positions):\n\n      c0 c1 c2 c3 => c0 c1 c2 c3\n      c0 c1 c2 c3    c1 c2 c3 c0  (cycled 1 byte)\n      c0 c1 c2 c3    c2 c3 c0 c1  (cycled 2 bytes)\n      c0 c1 c2 c3    c3 c0 c1 c2  (cycled 3 bytes)\n\n      Therefore:\n\n      c'0 = 2*r0,c0 + 3*r1,c1 + 1*r2,c2 + 1*r3,c3\n      c'0 = 1*r0,c0 + 2*r1,c1 + 3*r2,c2 + 1*r3,c3\n      c'0 = 1*r0,c0 + 1*r1,c1 + 2*r2,c2 + 3*r3,c3\n      c'0 = 3*r0,c0 + 1*r1,c1 + 1*r2,c2 + 2*r3,c3\n\n      c'1 = 2*r0,c1 + 3*r1,c2 + 1*r2,c3 + 1*r3,c0\n      c'1 = 1*r0,c1 + 2*r1,c2 + 3*r2,c3 + 1*r3,c0\n      c'1 = 1*r0,c1 + 1*r1,c2 + 2*r2,c3 + 3*r3,c0\n      c'1 = 3*r0,c1 + 1*r1,c2 + 1*r2,c3 + 2*r3,c0\n\n      ... and so forth for c'2 and c'3. The important distinction is\n      that the columns are cycling, with c0 being used with the m0\n      map when calculating c0, but c1 being used with the m0 map when\n      calculating c1 ... and so forth.\n\n      When performing the inverse we transform the mirror image and\n      skip the bottom row, instead of the top one, and move upwards:\n\n      c3 c2 c1 c0 => c0 c3 c2 c1  (cycled 3 bytes) *same as encryption\n      c3 c2 c1 c0    c1 c0 c3 c2  (cycled 2 bytes)\n      c3 c2 c1 c0    c2 c1 c0 c3  (cycled 1 byte)  *same as encryption\n      c3 c2 c1 c0    c3 c2 c1 c0\n\n      If you compare the resulting matrices for ShiftRows()+MixColumns()\n      and for InvShiftRows()+InvMixColumns() the 2nd and 4th columns are\n      different (in encrypt mode vs. decrypt mode). So in order to use\n      the same code to handle both encryption and decryption, we will\n      need to do some mapping.\n\n      If in encryption mode we let a=c0, b=c1, c=c2, d=c3, and r<N> be\n      a row number in the state, then the resulting matrix in encryption\n      mode for applying the above transformations would be:\n\n      r1: a b c d\n      r2: b c d a\n      r3: c d a b\n      r4: d a b c\n\n      If we did the same in decryption mode we would get:\n\n      r1: a d c b\n      r2: b a d c\n      r3: c b a d\n      r4: d c b a\n\n      If instead we swap d and b (set b=c3 and d=c1), then we get:\n\n      r1: a b c d\n      r2: d a b c\n      r3: c d a b\n      r4: b c d a\n\n      Now the 1st and 3rd rows are the same as the encryption matrix. All\n      we need to do then to make the mapping exactly the same is to swap\n      the 2nd and 4th rows when in decryption mode. To do this without\n      having to do it on each iteration, we swapped the 2nd and 4th rows\n      in the decryption key schedule. We also have to do the swap above\n      when we first pull in the input and when we set the final output. */\n    a2 =\n      m0[a >>> 24] ^\n      m1[b >>> 16 & 255] ^\n      m2[c >>> 8 & 255] ^\n      m3[d & 255] ^ w[++i];\n    b2 =\n      m0[b >>> 24] ^\n      m1[c >>> 16 & 255] ^\n      m2[d >>> 8 & 255] ^\n      m3[a & 255] ^ w[++i];\n    c2 =\n      m0[c >>> 24] ^\n      m1[d >>> 16 & 255] ^\n      m2[a >>> 8 & 255] ^\n      m3[b & 255] ^ w[++i];\n    d =\n      m0[d >>> 24] ^\n      m1[a >>> 16 & 255] ^\n      m2[b >>> 8 & 255] ^\n      m3[c & 255] ^ w[++i];\n    a = a2;\n    b = b2;\n    c = c2;\n  }\n\n  /*\n    Encrypt:\n    SubBytes(state)\n    ShiftRows(state)\n    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])\n\n    Decrypt:\n    InvShiftRows(state)\n    InvSubBytes(state)\n    AddRoundKey(state, w[0, Nb-1])\n   */\n  // Note: rows are shifted inline\n  output[0] =\n    (sub[a >>> 24] << 24) ^\n    (sub[b >>> 16 & 255] << 16) ^\n    (sub[c >>> 8 & 255] << 8) ^\n    (sub[d & 255]) ^ w[++i];\n  output[decrypt ? 3 : 1] =\n    (sub[b >>> 24] << 24) ^\n    (sub[c >>> 16 & 255] << 16) ^\n    (sub[d >>> 8 & 255] << 8) ^\n    (sub[a & 255]) ^ w[++i];\n  output[2] =\n    (sub[c >>> 24] << 24) ^\n    (sub[d >>> 16 & 255] << 16) ^\n    (sub[a >>> 8 & 255] << 8) ^\n    (sub[b & 255]) ^ w[++i];\n  output[decrypt ? 1 : 3] =\n    (sub[d >>> 24] << 24) ^\n    (sub[a >>> 16 & 255] << 16) ^\n    (sub[b >>> 8 & 255] << 8) ^\n    (sub[c & 255]) ^ w[++i];\n}\n\n/**\n * Deprecated. Instead, use:\n *\n * forge.cipher.createCipher('AES-<mode>', key);\n * forge.cipher.createDecipher('AES-<mode>', key);\n *\n * Creates a deprecated AES cipher object. This object's mode will default to\n * CBC (cipher-block-chaining).\n *\n * The key and iv may be given as a string of bytes, an array of bytes, a\n * byte buffer, or an array of 32-bit words.\n *\n * @param options the options to use.\n *          key the symmetric key to use.\n *          output the buffer to write to.\n *          decrypt true for decryption, false for encryption.\n *          mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nfunction _createCipher(options) {\n  options = options || {};\n  var mode = (options.mode || 'CBC').toUpperCase();\n  var algorithm = 'AES-' + mode;\n\n  var cipher;\n  if(options.decrypt) {\n    cipher = forge.cipher.createDecipher(algorithm, options.key);\n  } else {\n    cipher = forge.cipher.createCipher(algorithm, options.key);\n  }\n\n  // backwards compatible start API\n  var start = cipher.start;\n  cipher.start = function(iv, options) {\n    // backwards compatibility: support second arg as output buffer\n    var output = null;\n    if(options instanceof forge.util.ByteBuffer) {\n      output = options;\n      options = {};\n    }\n    options = options || {};\n    options.output = output;\n    options.iv = iv;\n    start.call(cipher, options);\n  };\n\n  return cipher;\n}\n","/**\n * Object IDs for ASN.1.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2013 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\n\nforge.pki = forge.pki || {};\nvar oids = module.exports = forge.pki.oids = forge.oids = forge.oids || {};\n\n// set id to name mapping and name to id mapping\nfunction _IN(id, name) {\n  oids[id] = name;\n  oids[name] = id;\n}\n// set id to name mapping only\nfunction _I_(id, name) {\n  oids[id] = name;\n}\n\n// algorithm OIDs\n_IN('1.2.840.113549.1.1.1', 'rsaEncryption');\n// Note: md2 & md4 not implemented\n//_IN('1.2.840.113549.1.1.2', 'md2WithRSAEncryption');\n//_IN('1.2.840.113549.1.1.3', 'md4WithRSAEncryption');\n_IN('1.2.840.113549.1.1.4', 'md5WithRSAEncryption');\n_IN('1.2.840.113549.1.1.5', 'sha1WithRSAEncryption');\n_IN('1.2.840.113549.1.1.7', 'RSAES-OAEP');\n_IN('1.2.840.113549.1.1.8', 'mgf1');\n_IN('1.2.840.113549.1.1.9', 'pSpecified');\n_IN('1.2.840.113549.1.1.10', 'RSASSA-PSS');\n_IN('1.2.840.113549.1.1.11', 'sha256WithRSAEncryption');\n_IN('1.2.840.113549.1.1.12', 'sha384WithRSAEncryption');\n_IN('1.2.840.113549.1.1.13', 'sha512WithRSAEncryption');\n// Edwards-curve Digital Signature Algorithm (EdDSA) Ed25519\n_IN('1.3.101.112', 'EdDSA25519');\n\n_IN('1.2.840.10040.4.3', 'dsa-with-sha1');\n\n_IN('1.3.14.3.2.7', 'desCBC');\n\n_IN('1.3.14.3.2.26', 'sha1');\n// Deprecated equivalent of sha1WithRSAEncryption\n_IN('1.3.14.3.2.29', 'sha1WithRSASignature');\n_IN('2.16.840.1.101.3.4.2.1', 'sha256');\n_IN('2.16.840.1.101.3.4.2.2', 'sha384');\n_IN('2.16.840.1.101.3.4.2.3', 'sha512');\n_IN('2.16.840.1.101.3.4.2.4', 'sha224');\n_IN('2.16.840.1.101.3.4.2.5', 'sha512-224');\n_IN('2.16.840.1.101.3.4.2.6', 'sha512-256');\n_IN('1.2.840.113549.2.2', 'md2');\n_IN('1.2.840.113549.2.5', 'md5');\n\n// pkcs#7 content types\n_IN('1.2.840.113549.1.7.1', 'data');\n_IN('1.2.840.113549.1.7.2', 'signedData');\n_IN('1.2.840.113549.1.7.3', 'envelopedData');\n_IN('1.2.840.113549.1.7.4', 'signedAndEnvelopedData');\n_IN('1.2.840.113549.1.7.5', 'digestedData');\n_IN('1.2.840.113549.1.7.6', 'encryptedData');\n\n// pkcs#9 oids\n_IN('1.2.840.113549.1.9.1', 'emailAddress');\n_IN('1.2.840.113549.1.9.2', 'unstructuredName');\n_IN('1.2.840.113549.1.9.3', 'contentType');\n_IN('1.2.840.113549.1.9.4', 'messageDigest');\n_IN('1.2.840.113549.1.9.5', 'signingTime');\n_IN('1.2.840.113549.1.9.6', 'counterSignature');\n_IN('1.2.840.113549.1.9.7', 'challengePassword');\n_IN('1.2.840.113549.1.9.8', 'unstructuredAddress');\n_IN('1.2.840.113549.1.9.14', 'extensionRequest');\n\n_IN('1.2.840.113549.1.9.20', 'friendlyName');\n_IN('1.2.840.113549.1.9.21', 'localKeyId');\n_IN('1.2.840.113549.1.9.22.1', 'x509Certificate');\n\n// pkcs#12 safe bags\n_IN('1.2.840.113549.1.12.10.1.1', 'keyBag');\n_IN('1.2.840.113549.1.12.10.1.2', 'pkcs8ShroudedKeyBag');\n_IN('1.2.840.113549.1.12.10.1.3', 'certBag');\n_IN('1.2.840.113549.1.12.10.1.4', 'crlBag');\n_IN('1.2.840.113549.1.12.10.1.5', 'secretBag');\n_IN('1.2.840.113549.1.12.10.1.6', 'safeContentsBag');\n\n// password-based-encryption for pkcs#12\n_IN('1.2.840.113549.1.5.13', 'pkcs5PBES2');\n_IN('1.2.840.113549.1.5.12', 'pkcs5PBKDF2');\n\n_IN('1.2.840.113549.1.12.1.1', 'pbeWithSHAAnd128BitRC4');\n_IN('1.2.840.113549.1.12.1.2', 'pbeWithSHAAnd40BitRC4');\n_IN('1.2.840.113549.1.12.1.3', 'pbeWithSHAAnd3-KeyTripleDES-CBC');\n_IN('1.2.840.113549.1.12.1.4', 'pbeWithSHAAnd2-KeyTripleDES-CBC');\n_IN('1.2.840.113549.1.12.1.5', 'pbeWithSHAAnd128BitRC2-CBC');\n_IN('1.2.840.113549.1.12.1.6', 'pbewithSHAAnd40BitRC2-CBC');\n\n// hmac OIDs\n_IN('1.2.840.113549.2.7', 'hmacWithSHA1');\n_IN('1.2.840.113549.2.8', 'hmacWithSHA224');\n_IN('1.2.840.113549.2.9', 'hmacWithSHA256');\n_IN('1.2.840.113549.2.10', 'hmacWithSHA384');\n_IN('1.2.840.113549.2.11', 'hmacWithSHA512');\n\n// symmetric key algorithm oids\n_IN('1.2.840.113549.3.7', 'des-EDE3-CBC');\n_IN('2.16.840.1.101.3.4.1.2', 'aes128-CBC');\n_IN('2.16.840.1.101.3.4.1.22', 'aes192-CBC');\n_IN('2.16.840.1.101.3.4.1.42', 'aes256-CBC');\n\n// certificate issuer/subject OIDs\n_IN('2.5.4.3', 'commonName');\n_IN('2.5.4.4', 'surname');\n_IN('2.5.4.5', 'serialNumber');\n_IN('2.5.4.6', 'countryName');\n_IN('2.5.4.7', 'localityName');\n_IN('2.5.4.8', 'stateOrProvinceName');\n_IN('2.5.4.9', 'streetAddress');\n_IN('2.5.4.10', 'organizationName');\n_IN('2.5.4.11', 'organizationalUnitName');\n_IN('2.5.4.12', 'title');\n_IN('2.5.4.13', 'description');\n_IN('2.5.4.15', 'businessCategory');\n_IN('2.5.4.17', 'postalCode');\n_IN('2.5.4.42', 'givenName');\n_IN('1.3.6.1.4.1.311.60.2.1.2', 'jurisdictionOfIncorporationStateOrProvinceName');\n_IN('1.3.6.1.4.1.311.60.2.1.3', 'jurisdictionOfIncorporationCountryName');\n\n// X.509 extension OIDs\n_IN('2.16.840.1.113730.1.1', 'nsCertType');\n_IN('2.16.840.1.113730.1.13', 'nsComment'); // deprecated in theory; still widely used\n_I_('2.5.29.1', 'authorityKeyIdentifier'); // deprecated, use .35\n_I_('2.5.29.2', 'keyAttributes'); // obsolete use .37 or .15\n_I_('2.5.29.3', 'certificatePolicies'); // deprecated, use .32\n_I_('2.5.29.4', 'keyUsageRestriction'); // obsolete use .37 or .15\n_I_('2.5.29.5', 'policyMapping'); // deprecated use .33\n_I_('2.5.29.6', 'subtreesConstraint'); // obsolete use .30\n_I_('2.5.29.7', 'subjectAltName'); // deprecated use .17\n_I_('2.5.29.8', 'issuerAltName'); // deprecated use .18\n_I_('2.5.29.9', 'subjectDirectoryAttributes');\n_I_('2.5.29.10', 'basicConstraints'); // deprecated use .19\n_I_('2.5.29.11', 'nameConstraints'); // deprecated use .30\n_I_('2.5.29.12', 'policyConstraints'); // deprecated use .36\n_I_('2.5.29.13', 'basicConstraints'); // deprecated use .19\n_IN('2.5.29.14', 'subjectKeyIdentifier');\n_IN('2.5.29.15', 'keyUsage');\n_I_('2.5.29.16', 'privateKeyUsagePeriod');\n_IN('2.5.29.17', 'subjectAltName');\n_IN('2.5.29.18', 'issuerAltName');\n_IN('2.5.29.19', 'basicConstraints');\n_I_('2.5.29.20', 'cRLNumber');\n_I_('2.5.29.21', 'cRLReason');\n_I_('2.5.29.22', 'expirationDate');\n_I_('2.5.29.23', 'instructionCode');\n_I_('2.5.29.24', 'invalidityDate');\n_I_('2.5.29.25', 'cRLDistributionPoints'); // deprecated use .31\n_I_('2.5.29.26', 'issuingDistributionPoint'); // deprecated use .28\n_I_('2.5.29.27', 'deltaCRLIndicator');\n_I_('2.5.29.28', 'issuingDistributionPoint');\n_I_('2.5.29.29', 'certificateIssuer');\n_I_('2.5.29.30', 'nameConstraints');\n_IN('2.5.29.31', 'cRLDistributionPoints');\n_IN('2.5.29.32', 'certificatePolicies');\n_I_('2.5.29.33', 'policyMappings');\n_I_('2.5.29.34', 'policyConstraints'); // deprecated use .36\n_IN('2.5.29.35', 'authorityKeyIdentifier');\n_I_('2.5.29.36', 'policyConstraints');\n_IN('2.5.29.37', 'extKeyUsage');\n_I_('2.5.29.46', 'freshestCRL');\n_I_('2.5.29.54', 'inhibitAnyPolicy');\n\n// extKeyUsage purposes\n_IN('1.3.6.1.4.1.11129.2.4.2', 'timestampList');\n_IN('1.3.6.1.5.5.7.1.1', 'authorityInfoAccess');\n_IN('1.3.6.1.5.5.7.3.1', 'serverAuth');\n_IN('1.3.6.1.5.5.7.3.2', 'clientAuth');\n_IN('1.3.6.1.5.5.7.3.3', 'codeSigning');\n_IN('1.3.6.1.5.5.7.3.4', 'emailProtection');\n_IN('1.3.6.1.5.5.7.3.8', 'timeStamping');\n","/**\n * Javascript implementation of Abstract Syntax Notation Number One.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2015 Digital Bazaar, Inc.\n *\n * An API for storing data using the Abstract Syntax Notation Number One\n * format using DER (Distinguished Encoding Rules) encoding. This encoding is\n * commonly used to store data for PKI, i.e. X.509 Certificates, and this\n * implementation exists for that purpose.\n *\n * Abstract Syntax Notation Number One (ASN.1) is used to define the abstract\n * syntax of information without restricting the way the information is encoded\n * for transmission. It provides a standard that allows for open systems\n * communication. ASN.1 defines the syntax of information data and a number of\n * simple data types as well as a notation for describing them and specifying\n * values for them.\n *\n * The RSA algorithm creates public and private keys that are often stored in\n * X.509 or PKCS#X formats -- which use ASN.1 (encoded in DER format). This\n * class provides the most basic functionality required to store and load DSA\n * keys that are encoded according to ASN.1.\n *\n * The most common binary encodings for ASN.1 are BER (Basic Encoding Rules)\n * and DER (Distinguished Encoding Rules). DER is just a subset of BER that\n * has stricter requirements for how data must be encoded.\n *\n * Each ASN.1 structure has a tag (a byte identifying the ASN.1 structure type)\n * and a byte array for the value of this ASN1 structure which may be data or a\n * list of ASN.1 structures.\n *\n * Each ASN.1 structure using BER is (Tag-Length-Value):\n *\n * | byte 0 | bytes X | bytes Y |\n * |--------|---------|----------\n * |  tag   | length  |  value  |\n *\n * ASN.1 allows for tags to be of \"High-tag-number form\" which allows a tag to\n * be two or more octets, but that is not supported by this class. A tag is\n * only 1 byte. Bits 1-5 give the tag number (ie the data type within a\n * particular 'class'), 6 indicates whether or not the ASN.1 value is\n * constructed from other ASN.1 values, and bits 7 and 8 give the 'class'. If\n * bits 7 and 8 are both zero, the class is UNIVERSAL. If only bit 7 is set,\n * then the class is APPLICATION. If only bit 8 is set, then the class is\n * CONTEXT_SPECIFIC. If both bits 7 and 8 are set, then the class is PRIVATE.\n * The tag numbers for the data types for the class UNIVERSAL are listed below:\n *\n * UNIVERSAL 0 Reserved for use by the encoding rules\n * UNIVERSAL 1 Boolean type\n * UNIVERSAL 2 Integer type\n * UNIVERSAL 3 Bitstring type\n * UNIVERSAL 4 Octetstring type\n * UNIVERSAL 5 Null type\n * UNIVERSAL 6 Object identifier type\n * UNIVERSAL 7 Object descriptor type\n * UNIVERSAL 8 External type and Instance-of type\n * UNIVERSAL 9 Real type\n * UNIVERSAL 10 Enumerated type\n * UNIVERSAL 11 Embedded-pdv type\n * UNIVERSAL 12 UTF8String type\n * UNIVERSAL 13 Relative object identifier type\n * UNIVERSAL 14-15 Reserved for future editions\n * UNIVERSAL 16 Sequence and Sequence-of types\n * UNIVERSAL 17 Set and Set-of types\n * UNIVERSAL 18-22, 25-30 Character string types\n * UNIVERSAL 23-24 Time types\n *\n * The length of an ASN.1 structure is specified after the tag identifier.\n * There is a definite form and an indefinite form. The indefinite form may\n * be used if the encoding is constructed and not all immediately available.\n * The indefinite form is encoded using a length byte with only the 8th bit\n * set. The end of the constructed object is marked using end-of-contents\n * octets (two zero bytes).\n *\n * The definite form looks like this:\n *\n * The length may take up 1 or more bytes, it depends on the length of the\n * value of the ASN.1 structure. DER encoding requires that if the ASN.1\n * structure has a value that has a length greater than 127, more than 1 byte\n * will be used to store its length, otherwise just one byte will be used.\n * This is strict.\n *\n * In the case that the length of the ASN.1 value is less than 127, 1 octet\n * (byte) is used to store the \"short form\" length. The 8th bit has a value of\n * 0 indicating the length is \"short form\" and not \"long form\" and bits 7-1\n * give the length of the data. (The 8th bit is the left-most, most significant\n * bit: also known as big endian or network format).\n *\n * In the case that the length of the ASN.1 value is greater than 127, 2 to\n * 127 octets (bytes) are used to store the \"long form\" length. The first\n * byte's 8th bit is set to 1 to indicate the length is \"long form.\" Bits 7-1\n * give the number of additional octets. All following octets are in base 256\n * with the most significant digit first (typical big-endian binary unsigned\n * integer storage). So, for instance, if the length of a value was 257, the\n * first byte would be set to:\n *\n * 10000010 = 130 = 0x82.\n *\n * This indicates there are 2 octets (base 256) for the length. The second and\n * third bytes (the octets just mentioned) would store the length in base 256:\n *\n * octet 2: 00000001 = 1 * 256^1 = 256\n * octet 3: 00000001 = 1 * 256^0 = 1\n * total = 257\n *\n * The algorithm for converting a js integer value of 257 to base-256 is:\n *\n * var value = 257;\n * var bytes = [];\n * bytes[0] = (value >>> 8) & 0xFF; // most significant byte first\n * bytes[1] = value & 0xFF;        // least significant byte last\n *\n * On the ASN.1 UNIVERSAL Object Identifier (OID) type:\n *\n * An OID can be written like: \"value1.value2.value3...valueN\"\n *\n * The DER encoding rules:\n *\n * The first byte has the value 40 * value1 + value2.\n * The following bytes, if any, encode the remaining values. Each value is\n * encoded in base 128, most significant digit first (big endian), with as\n * few digits as possible, and the most significant bit of each byte set\n * to 1 except the last in each value's encoding. For example: Given the\n * OID \"1.2.840.113549\", its DER encoding is (remember each byte except the\n * last one in each encoding is OR'd with 0x80):\n *\n * byte 1: 40 * 1 + 2 = 42 = 0x2A.\n * bytes 2-3: 128 * 6 + 72 = 840 = 6 72 = 6 72 = 0x0648 = 0x8648\n * bytes 4-6: 16384 * 6 + 128 * 119 + 13 = 6 119 13 = 0x06770D = 0x86F70D\n *\n * The final value is: 0x2A864886F70D.\n * The full OID (including ASN.1 tag and length of 6 bytes) is:\n * 0x06062A864886F70D\n */\nvar forge = require('./forge');\nrequire('./util');\nrequire('./oids');\n\n/* ASN.1 API */\nvar asn1 = module.exports = forge.asn1 = forge.asn1 || {};\n\n/**\n * ASN.1 classes.\n */\nasn1.Class = {\n  UNIVERSAL:        0x00,\n  APPLICATION:      0x40,\n  CONTEXT_SPECIFIC: 0x80,\n  PRIVATE:          0xC0\n};\n\n/**\n * ASN.1 types. Not all types are supported by this implementation, only\n * those necessary to implement a simple PKI are implemented.\n */\nasn1.Type = {\n  NONE:             0,\n  BOOLEAN:          1,\n  INTEGER:          2,\n  BITSTRING:        3,\n  OCTETSTRING:      4,\n  NULL:             5,\n  OID:              6,\n  ODESC:            7,\n  EXTERNAL:         8,\n  REAL:             9,\n  ENUMERATED:      10,\n  EMBEDDED:        11,\n  UTF8:            12,\n  ROID:            13,\n  SEQUENCE:        16,\n  SET:             17,\n  PRINTABLESTRING: 19,\n  IA5STRING:       22,\n  UTCTIME:         23,\n  GENERALIZEDTIME: 24,\n  BMPSTRING:       30\n};\n\n/**\n * Creates a new asn1 object.\n *\n * @param tagClass the tag class for the object.\n * @param type the data type (tag number) for the object.\n * @param constructed true if the asn1 object is in constructed form.\n * @param value the value for the object, if it is not constructed.\n * @param [options] the options to use:\n *          [bitStringContents] the plain BIT STRING content including padding\n *            byte.\n *\n * @return the asn1 object.\n */\nasn1.create = function(tagClass, type, constructed, value, options) {\n  /* An asn1 object has a tagClass, a type, a constructed flag, and a\n    value. The value's type depends on the constructed flag. If\n    constructed, it will contain a list of other asn1 objects. If not,\n    it will contain the ASN.1 value as an array of bytes formatted\n    according to the ASN.1 data type. */\n\n  // remove undefined values\n  if(forge.util.isArray(value)) {\n    var tmp = [];\n    for(var i = 0; i < value.length; ++i) {\n      if(value[i] !== undefined) {\n        tmp.push(value[i]);\n      }\n    }\n    value = tmp;\n  }\n\n  var obj = {\n    tagClass: tagClass,\n    type: type,\n    constructed: constructed,\n    composed: constructed || forge.util.isArray(value),\n    value: value\n  };\n  if(options && 'bitStringContents' in options) {\n    // TODO: copy byte buffer if it's a buffer not a string\n    obj.bitStringContents = options.bitStringContents;\n    // TODO: add readonly flag to avoid this overhead\n    // save copy to detect changes\n    obj.original = asn1.copy(obj);\n  }\n  return obj;\n};\n\n/**\n * Copies an asn1 object.\n *\n * @param obj the asn1 object.\n * @param [options] copy options:\n *          [excludeBitStringContents] true to not copy bitStringContents\n *\n * @return the a copy of the asn1 object.\n */\nasn1.copy = function(obj, options) {\n  var copy;\n\n  if(forge.util.isArray(obj)) {\n    copy = [];\n    for(var i = 0; i < obj.length; ++i) {\n      copy.push(asn1.copy(obj[i], options));\n    }\n    return copy;\n  }\n\n  if(typeof obj === 'string') {\n    // TODO: copy byte buffer if it's a buffer not a string\n    return obj;\n  }\n\n  copy = {\n    tagClass: obj.tagClass,\n    type: obj.type,\n    constructed: obj.constructed,\n    composed: obj.composed,\n    value: asn1.copy(obj.value, options)\n  };\n  if(options && !options.excludeBitStringContents) {\n    // TODO: copy byte buffer if it's a buffer not a string\n    copy.bitStringContents = obj.bitStringContents;\n  }\n  return copy;\n};\n\n/**\n * Compares asn1 objects for equality.\n *\n * Note this function does not run in constant time.\n *\n * @param obj1 the first asn1 object.\n * @param obj2 the second asn1 object.\n * @param [options] compare options:\n *          [includeBitStringContents] true to compare bitStringContents\n *\n * @return true if the asn1 objects are equal.\n */\nasn1.equals = function(obj1, obj2, options) {\n  if(forge.util.isArray(obj1)) {\n    if(!forge.util.isArray(obj2)) {\n      return false;\n    }\n    if(obj1.length !== obj2.length) {\n      return false;\n    }\n    for(var i = 0; i < obj1.length; ++i) {\n      if(!asn1.equals(obj1[i], obj2[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  if(typeof obj1 !== typeof obj2) {\n    return false;\n  }\n\n  if(typeof obj1 === 'string') {\n    return obj1 === obj2;\n  }\n\n  var equal = obj1.tagClass === obj2.tagClass &&\n    obj1.type === obj2.type &&\n    obj1.constructed === obj2.constructed &&\n    obj1.composed === obj2.composed &&\n    asn1.equals(obj1.value, obj2.value);\n  if(options && options.includeBitStringContents) {\n    equal = equal && (obj1.bitStringContents === obj2.bitStringContents);\n  }\n\n  return equal;\n};\n\n/**\n * Gets the length of a BER-encoded ASN.1 value.\n *\n * In case the length is not specified, undefined is returned.\n *\n * @param b the BER-encoded ASN.1 byte buffer, starting with the first\n *          length byte.\n *\n * @return the length of the BER-encoded ASN.1 value or undefined.\n */\nasn1.getBerValueLength = function(b) {\n  // TODO: move this function and related DER/BER functions to a der.js\n  // file; better abstract ASN.1 away from der/ber.\n  var b2 = b.getByte();\n  if(b2 === 0x80) {\n    return undefined;\n  }\n\n  // see if the length is \"short form\" or \"long form\" (bit 8 set)\n  var length;\n  var longForm = b2 & 0x80;\n  if(!longForm) {\n    // length is just the first byte\n    length = b2;\n  } else {\n    // the number of bytes the length is specified in bits 7 through 1\n    // and each length byte is in big-endian base-256\n    length = b.getInt((b2 & 0x7F) << 3);\n  }\n  return length;\n};\n\n/**\n * Check if the byte buffer has enough bytes. Throws an Error if not.\n *\n * @param bytes the byte buffer to parse from.\n * @param remaining the bytes remaining in the current parsing state.\n * @param n the number of bytes the buffer must have.\n */\nfunction _checkBufferLength(bytes, remaining, n) {\n  if(n > remaining) {\n    var error = new Error('Too few bytes to parse DER.');\n    error.available = bytes.length();\n    error.remaining = remaining;\n    error.requested = n;\n    throw error;\n  }\n}\n\n/**\n * Gets the length of a BER-encoded ASN.1 value.\n *\n * In case the length is not specified, undefined is returned.\n *\n * @param bytes the byte buffer to parse from.\n * @param remaining the bytes remaining in the current parsing state.\n *\n * @return the length of the BER-encoded ASN.1 value or undefined.\n */\nvar _getValueLength = function(bytes, remaining) {\n  // TODO: move this function and related DER/BER functions to a der.js\n  // file; better abstract ASN.1 away from der/ber.\n  // fromDer already checked that this byte exists\n  var b2 = bytes.getByte();\n  remaining--;\n  if(b2 === 0x80) {\n    return undefined;\n  }\n\n  // see if the length is \"short form\" or \"long form\" (bit 8 set)\n  var length;\n  var longForm = b2 & 0x80;\n  if(!longForm) {\n    // length is just the first byte\n    length = b2;\n  } else {\n    // the number of bytes the length is specified in bits 7 through 1\n    // and each length byte is in big-endian base-256\n    var longFormBytes = b2 & 0x7F;\n    _checkBufferLength(bytes, remaining, longFormBytes);\n    length = bytes.getInt(longFormBytes << 3);\n  }\n  // FIXME: this will only happen for 32 bit getInt with high bit set\n  if(length < 0) {\n    throw new Error('Negative length: ' + length);\n  }\n  return length;\n};\n\n/**\n * Parses an asn1 object from a byte buffer in DER format.\n *\n * @param bytes the byte buffer to parse from.\n * @param [strict] true to be strict when checking value lengths, false to\n *          allow truncated values (default: true).\n * @param [options] object with options or boolean strict flag\n *          [strict] true to be strict when checking value lengths, false to\n *            allow truncated values (default: true).\n *          [parseAllBytes] true to ensure all bytes are parsed\n *            (default: true)\n *          [decodeBitStrings] true to attempt to decode the content of\n *            BIT STRINGs (not OCTET STRINGs) using strict mode. Note that\n *            without schema support to understand the data context this can\n *            erroneously decode values that happen to be valid ASN.1. This\n *            flag will be deprecated or removed as soon as schema support is\n *            available. (default: true)\n *\n * @throws Will throw an error for various malformed input conditions.\n *\n * @return the parsed asn1 object.\n */\nasn1.fromDer = function(bytes, options) {\n  if(options === undefined) {\n    options = {\n      strict: true,\n      parseAllBytes: true,\n      decodeBitStrings: true\n    };\n  }\n  if(typeof options === 'boolean') {\n    options = {\n      strict: options,\n      parseAllBytes: true,\n      decodeBitStrings: true\n    };\n  }\n  if(!('strict' in options)) {\n    options.strict = true;\n  }\n  if(!('parseAllBytes' in options)) {\n    options.parseAllBytes = true;\n  }\n  if(!('decodeBitStrings' in options)) {\n    options.decodeBitStrings = true;\n  }\n\n  // wrap in buffer if needed\n  if(typeof bytes === 'string') {\n    bytes = forge.util.createBuffer(bytes);\n  }\n\n  var byteCount = bytes.length();\n  var value = _fromDer(bytes, bytes.length(), 0, options);\n  if(options.parseAllBytes && bytes.length() !== 0) {\n    var error = new Error('Unparsed DER bytes remain after ASN.1 parsing.');\n    error.byteCount = byteCount;\n    error.remaining = bytes.length();\n    throw error;\n  }\n  return value;\n};\n\n/**\n * Internal function to parse an asn1 object from a byte buffer in DER format.\n *\n * @param bytes the byte buffer to parse from.\n * @param remaining the number of bytes remaining for this chunk.\n * @param depth the current parsing depth.\n * @param options object with same options as fromDer().\n *\n * @return the parsed asn1 object.\n */\nfunction _fromDer(bytes, remaining, depth, options) {\n  // temporary storage for consumption calculations\n  var start;\n\n  // minimum length for ASN.1 DER structure is 2\n  _checkBufferLength(bytes, remaining, 2);\n\n  // get the first byte\n  var b1 = bytes.getByte();\n  // consumed one byte\n  remaining--;\n\n  // get the tag class\n  var tagClass = (b1 & 0xC0);\n\n  // get the type (bits 1-5)\n  var type = b1 & 0x1F;\n\n  // get the variable value length and adjust remaining bytes\n  start = bytes.length();\n  var length = _getValueLength(bytes, remaining);\n  remaining -= start - bytes.length();\n\n  // ensure there are enough bytes to get the value\n  if(length !== undefined && length > remaining) {\n    if(options.strict) {\n      var error = new Error('Too few bytes to read ASN.1 value.');\n      error.available = bytes.length();\n      error.remaining = remaining;\n      error.requested = length;\n      throw error;\n    }\n    // Note: be lenient with truncated values and use remaining state bytes\n    length = remaining;\n  }\n\n  // value storage\n  var value;\n  // possible BIT STRING contents storage\n  var bitStringContents;\n\n  // constructed flag is bit 6 (32 = 0x20) of the first byte\n  var constructed = ((b1 & 0x20) === 0x20);\n  if(constructed) {\n    // parse child asn1 objects from the value\n    value = [];\n    if(length === undefined) {\n      // asn1 object of indefinite length, read until end tag\n      for(;;) {\n        _checkBufferLength(bytes, remaining, 2);\n        if(bytes.bytes(2) === String.fromCharCode(0, 0)) {\n          bytes.getBytes(2);\n          remaining -= 2;\n          break;\n        }\n        start = bytes.length();\n        value.push(_fromDer(bytes, remaining, depth + 1, options));\n        remaining -= start - bytes.length();\n      }\n    } else {\n      // parsing asn1 object of definite length\n      while(length > 0) {\n        start = bytes.length();\n        value.push(_fromDer(bytes, length, depth + 1, options));\n        remaining -= start - bytes.length();\n        length -= start - bytes.length();\n      }\n    }\n  }\n\n  // if a BIT STRING, save the contents including padding\n  if(value === undefined && tagClass === asn1.Class.UNIVERSAL &&\n    type === asn1.Type.BITSTRING) {\n    bitStringContents = bytes.bytes(length);\n  }\n\n  // determine if a non-constructed value should be decoded as a composed\n  // value that contains other ASN.1 objects. BIT STRINGs (and OCTET STRINGs)\n  // can be used this way.\n  if(value === undefined && options.decodeBitStrings &&\n    tagClass === asn1.Class.UNIVERSAL &&\n    // FIXME: OCTET STRINGs not yet supported here\n    // .. other parts of forge expect to decode OCTET STRINGs manually\n    (type === asn1.Type.BITSTRING /*|| type === asn1.Type.OCTETSTRING*/) &&\n    length > 1) {\n    // save read position\n    var savedRead = bytes.read;\n    var savedRemaining = remaining;\n    var unused = 0;\n    if(type === asn1.Type.BITSTRING) {\n      /* The first octet gives the number of bits by which the length of the\n        bit string is less than the next multiple of eight (this is called\n        the \"number of unused bits\").\n\n        The second and following octets give the value of the bit string\n        converted to an octet string. */\n      _checkBufferLength(bytes, remaining, 1);\n      unused = bytes.getByte();\n      remaining--;\n    }\n    // if all bits are used, maybe the BIT/OCTET STRING holds ASN.1 objs\n    if(unused === 0) {\n      try {\n        // attempt to parse child asn1 object from the value\n        // (stored in array to signal composed value)\n        start = bytes.length();\n        var subOptions = {\n          // enforce strict mode to avoid parsing ASN.1 from plain data\n          strict: true,\n          decodeBitStrings: true\n        };\n        var composed = _fromDer(bytes, remaining, depth + 1, subOptions);\n        var used = start - bytes.length();\n        remaining -= used;\n        if(type == asn1.Type.BITSTRING) {\n          used++;\n        }\n\n        // if the data all decoded and the class indicates UNIVERSAL or\n        // CONTEXT_SPECIFIC then assume we've got an encapsulated ASN.1 object\n        var tc = composed.tagClass;\n        if(used === length &&\n          (tc === asn1.Class.UNIVERSAL || tc === asn1.Class.CONTEXT_SPECIFIC)) {\n          value = [composed];\n        }\n      } catch(ex) {\n      }\n    }\n    if(value === undefined) {\n      // restore read position\n      bytes.read = savedRead;\n      remaining = savedRemaining;\n    }\n  }\n\n  if(value === undefined) {\n    // asn1 not constructed or composed, get raw value\n    // TODO: do DER to OID conversion and vice-versa in .toDer?\n\n    if(length === undefined) {\n      if(options.strict) {\n        throw new Error('Non-constructed ASN.1 object of indefinite length.');\n      }\n      // be lenient and use remaining state bytes\n      length = remaining;\n    }\n\n    if(type === asn1.Type.BMPSTRING) {\n      value = '';\n      for(; length > 0; length -= 2) {\n        _checkBufferLength(bytes, remaining, 2);\n        value += String.fromCharCode(bytes.getInt16());\n        remaining -= 2;\n      }\n    } else {\n      value = bytes.getBytes(length);\n      remaining -= length;\n    }\n  }\n\n  // add BIT STRING contents if available\n  var asn1Options = bitStringContents === undefined ? null : {\n    bitStringContents: bitStringContents\n  };\n\n  // create and return asn1 object\n  return asn1.create(tagClass, type, constructed, value, asn1Options);\n}\n\n/**\n * Converts the given asn1 object to a buffer of bytes in DER format.\n *\n * @param asn1 the asn1 object to convert to bytes.\n *\n * @return the buffer of bytes.\n */\nasn1.toDer = function(obj) {\n  var bytes = forge.util.createBuffer();\n\n  // build the first byte\n  var b1 = obj.tagClass | obj.type;\n\n  // for storing the ASN.1 value\n  var value = forge.util.createBuffer();\n\n  // use BIT STRING contents if available and data not changed\n  var useBitStringContents = false;\n  if('bitStringContents' in obj) {\n    useBitStringContents = true;\n    if(obj.original) {\n      useBitStringContents = asn1.equals(obj, obj.original);\n    }\n  }\n\n  if(useBitStringContents) {\n    value.putBytes(obj.bitStringContents);\n  } else if(obj.composed) {\n    // if composed, use each child asn1 object's DER bytes as value\n    // turn on 6th bit (0x20 = 32) to indicate asn1 is constructed\n    // from other asn1 objects\n    if(obj.constructed) {\n      b1 |= 0x20;\n    } else {\n      // type is a bit string, add unused bits of 0x00\n      value.putByte(0x00);\n    }\n\n    // add all of the child DER bytes together\n    for(var i = 0; i < obj.value.length; ++i) {\n      if(obj.value[i] !== undefined) {\n        value.putBuffer(asn1.toDer(obj.value[i]));\n      }\n    }\n  } else {\n    // use asn1.value directly\n    if(obj.type === asn1.Type.BMPSTRING) {\n      for(var i = 0; i < obj.value.length; ++i) {\n        value.putInt16(obj.value.charCodeAt(i));\n      }\n    } else {\n      // ensure integer is minimally-encoded\n      // TODO: should all leading bytes be stripped vs just one?\n      // .. ex '00 00 01' => '01'?\n      if(obj.type === asn1.Type.INTEGER &&\n        obj.value.length > 1 &&\n        // leading 0x00 for positive integer\n        ((obj.value.charCodeAt(0) === 0 &&\n        (obj.value.charCodeAt(1) & 0x80) === 0) ||\n        // leading 0xFF for negative integer\n        (obj.value.charCodeAt(0) === 0xFF &&\n        (obj.value.charCodeAt(1) & 0x80) === 0x80))) {\n        value.putBytes(obj.value.substr(1));\n      } else {\n        value.putBytes(obj.value);\n      }\n    }\n  }\n\n  // add tag byte\n  bytes.putByte(b1);\n\n  // use \"short form\" encoding\n  if(value.length() <= 127) {\n    // one byte describes the length\n    // bit 8 = 0 and bits 7-1 = length\n    bytes.putByte(value.length() & 0x7F);\n  } else {\n    // use \"long form\" encoding\n    // 2 to 127 bytes describe the length\n    // first byte: bit 8 = 1 and bits 7-1 = # of additional bytes\n    // other bytes: length in base 256, big-endian\n    var len = value.length();\n    var lenBytes = '';\n    do {\n      lenBytes += String.fromCharCode(len & 0xFF);\n      len = len >>> 8;\n    } while(len > 0);\n\n    // set first byte to # bytes used to store the length and turn on\n    // bit 8 to indicate long-form length is used\n    bytes.putByte(lenBytes.length | 0x80);\n\n    // concatenate length bytes in reverse since they were generated\n    // little endian and we need big endian\n    for(var i = lenBytes.length - 1; i >= 0; --i) {\n      bytes.putByte(lenBytes.charCodeAt(i));\n    }\n  }\n\n  // concatenate value bytes\n  bytes.putBuffer(value);\n  return bytes;\n};\n\n/**\n * Converts an OID dot-separated string to a byte buffer. The byte buffer\n * contains only the DER-encoded value, not any tag or length bytes.\n *\n * @param oid the OID dot-separated string.\n *\n * @return the byte buffer.\n */\nasn1.oidToDer = function(oid) {\n  // split OID into individual values\n  var values = oid.split('.');\n  var bytes = forge.util.createBuffer();\n\n  // first byte is 40 * value1 + value2\n  bytes.putByte(40 * parseInt(values[0], 10) + parseInt(values[1], 10));\n  // other bytes are each value in base 128 with 8th bit set except for\n  // the last byte for each value\n  var last, valueBytes, value, b;\n  for(var i = 2; i < values.length; ++i) {\n    // produce value bytes in reverse because we don't know how many\n    // bytes it will take to store the value\n    last = true;\n    valueBytes = [];\n    value = parseInt(values[i], 10);\n    do {\n      b = value & 0x7F;\n      value = value >>> 7;\n      // if value is not last, then turn on 8th bit\n      if(!last) {\n        b |= 0x80;\n      }\n      valueBytes.push(b);\n      last = false;\n    } while(value > 0);\n\n    // add value bytes in reverse (needs to be in big endian)\n    for(var n = valueBytes.length - 1; n >= 0; --n) {\n      bytes.putByte(valueBytes[n]);\n    }\n  }\n\n  return bytes;\n};\n\n/**\n * Converts a DER-encoded byte buffer to an OID dot-separated string. The\n * byte buffer should contain only the DER-encoded value, not any tag or\n * length bytes.\n *\n * @param bytes the byte buffer.\n *\n * @return the OID dot-separated string.\n */\nasn1.derToOid = function(bytes) {\n  var oid;\n\n  // wrap in buffer if needed\n  if(typeof bytes === 'string') {\n    bytes = forge.util.createBuffer(bytes);\n  }\n\n  // first byte is 40 * value1 + value2\n  var b = bytes.getByte();\n  oid = Math.floor(b / 40) + '.' + (b % 40);\n\n  // other bytes are each value in base 128 with 8th bit set except for\n  // the last byte for each value\n  var value = 0;\n  while(bytes.length() > 0) {\n    b = bytes.getByte();\n    value = value << 7;\n    // not the last byte for the value\n    if(b & 0x80) {\n      value += b & 0x7F;\n    } else {\n      // last byte\n      oid += '.' + (value + b);\n      value = 0;\n    }\n  }\n\n  return oid;\n};\n\n/**\n * Converts a UTCTime value to a date.\n *\n * Note: GeneralizedTime has 4 digits for the year and is used for X.509\n * dates past 2049. Parsing that structure hasn't been implemented yet.\n *\n * @param utc the UTCTime value to convert.\n *\n * @return the date.\n */\nasn1.utcTimeToDate = function(utc) {\n  /* The following formats can be used:\n\n    YYMMDDhhmmZ\n    YYMMDDhhmm+hh'mm'\n    YYMMDDhhmm-hh'mm'\n    YYMMDDhhmmssZ\n    YYMMDDhhmmss+hh'mm'\n    YYMMDDhhmmss-hh'mm'\n\n    Where:\n\n    YY is the least significant two digits of the year\n    MM is the month (01 to 12)\n    DD is the day (01 to 31)\n    hh is the hour (00 to 23)\n    mm are the minutes (00 to 59)\n    ss are the seconds (00 to 59)\n    Z indicates that local time is GMT, + indicates that local time is\n    later than GMT, and - indicates that local time is earlier than GMT\n    hh' is the absolute value of the offset from GMT in hours\n    mm' is the absolute value of the offset from GMT in minutes */\n  var date = new Date();\n\n  // if YY >= 50 use 19xx, if YY < 50 use 20xx\n  var year = parseInt(utc.substr(0, 2), 10);\n  year = (year >= 50) ? 1900 + year : 2000 + year;\n  var MM = parseInt(utc.substr(2, 2), 10) - 1; // use 0-11 for month\n  var DD = parseInt(utc.substr(4, 2), 10);\n  var hh = parseInt(utc.substr(6, 2), 10);\n  var mm = parseInt(utc.substr(8, 2), 10);\n  var ss = 0;\n\n  // not just YYMMDDhhmmZ\n  if(utc.length > 11) {\n    // get character after minutes\n    var c = utc.charAt(10);\n    var end = 10;\n\n    // see if seconds are present\n    if(c !== '+' && c !== '-') {\n      // get seconds\n      ss = parseInt(utc.substr(10, 2), 10);\n      end += 2;\n    }\n  }\n\n  // update date\n  date.setUTCFullYear(year, MM, DD);\n  date.setUTCHours(hh, mm, ss, 0);\n\n  if(end) {\n    // get +/- after end of time\n    c = utc.charAt(end);\n    if(c === '+' || c === '-') {\n      // get hours+minutes offset\n      var hhoffset = parseInt(utc.substr(end + 1, 2), 10);\n      var mmoffset = parseInt(utc.substr(end + 4, 2), 10);\n\n      // calculate offset in milliseconds\n      var offset = hhoffset * 60 + mmoffset;\n      offset *= 60000;\n\n      // apply offset\n      if(c === '+') {\n        date.setTime(+date - offset);\n      } else {\n        date.setTime(+date + offset);\n      }\n    }\n  }\n\n  return date;\n};\n\n/**\n * Converts a GeneralizedTime value to a date.\n *\n * @param gentime the GeneralizedTime value to convert.\n *\n * @return the date.\n */\nasn1.generalizedTimeToDate = function(gentime) {\n  /* The following formats can be used:\n\n    YYYYMMDDHHMMSS\n    YYYYMMDDHHMMSS.fff\n    YYYYMMDDHHMMSSZ\n    YYYYMMDDHHMMSS.fffZ\n    YYYYMMDDHHMMSS+hh'mm'\n    YYYYMMDDHHMMSS.fff+hh'mm'\n    YYYYMMDDHHMMSS-hh'mm'\n    YYYYMMDDHHMMSS.fff-hh'mm'\n\n    Where:\n\n    YYYY is the year\n    MM is the month (01 to 12)\n    DD is the day (01 to 31)\n    hh is the hour (00 to 23)\n    mm are the minutes (00 to 59)\n    ss are the seconds (00 to 59)\n    .fff is the second fraction, accurate to three decimal places\n    Z indicates that local time is GMT, + indicates that local time is\n    later than GMT, and - indicates that local time is earlier than GMT\n    hh' is the absolute value of the offset from GMT in hours\n    mm' is the absolute value of the offset from GMT in minutes */\n  var date = new Date();\n\n  var YYYY = parseInt(gentime.substr(0, 4), 10);\n  var MM = parseInt(gentime.substr(4, 2), 10) - 1; // use 0-11 for month\n  var DD = parseInt(gentime.substr(6, 2), 10);\n  var hh = parseInt(gentime.substr(8, 2), 10);\n  var mm = parseInt(gentime.substr(10, 2), 10);\n  var ss = parseInt(gentime.substr(12, 2), 10);\n  var fff = 0;\n  var offset = 0;\n  var isUTC = false;\n\n  if(gentime.charAt(gentime.length - 1) === 'Z') {\n    isUTC = true;\n  }\n\n  var end = gentime.length - 5, c = gentime.charAt(end);\n  if(c === '+' || c === '-') {\n    // get hours+minutes offset\n    var hhoffset = parseInt(gentime.substr(end + 1, 2), 10);\n    var mmoffset = parseInt(gentime.substr(end + 4, 2), 10);\n\n    // calculate offset in milliseconds\n    offset = hhoffset * 60 + mmoffset;\n    offset *= 60000;\n\n    // apply offset\n    if(c === '+') {\n      offset *= -1;\n    }\n\n    isUTC = true;\n  }\n\n  // check for second fraction\n  if(gentime.charAt(14) === '.') {\n    fff = parseFloat(gentime.substr(14), 10) * 1000;\n  }\n\n  if(isUTC) {\n    date.setUTCFullYear(YYYY, MM, DD);\n    date.setUTCHours(hh, mm, ss, fff);\n\n    // apply offset\n    date.setTime(+date + offset);\n  } else {\n    date.setFullYear(YYYY, MM, DD);\n    date.setHours(hh, mm, ss, fff);\n  }\n\n  return date;\n};\n\n/**\n * Converts a date to a UTCTime value.\n *\n * Note: GeneralizedTime has 4 digits for the year and is used for X.509\n * dates past 2049. Converting to a GeneralizedTime hasn't been\n * implemented yet.\n *\n * @param date the date to convert.\n *\n * @return the UTCTime value.\n */\nasn1.dateToUtcTime = function(date) {\n  // TODO: validate; currently assumes proper format\n  if(typeof date === 'string') {\n    return date;\n  }\n\n  var rval = '';\n\n  // create format YYMMDDhhmmssZ\n  var format = [];\n  format.push(('' + date.getUTCFullYear()).substr(2));\n  format.push('' + (date.getUTCMonth() + 1));\n  format.push('' + date.getUTCDate());\n  format.push('' + date.getUTCHours());\n  format.push('' + date.getUTCMinutes());\n  format.push('' + date.getUTCSeconds());\n\n  // ensure 2 digits are used for each format entry\n  for(var i = 0; i < format.length; ++i) {\n    if(format[i].length < 2) {\n      rval += '0';\n    }\n    rval += format[i];\n  }\n  rval += 'Z';\n\n  return rval;\n};\n\n/**\n * Converts a date to a GeneralizedTime value.\n *\n * @param date the date to convert.\n *\n * @return the GeneralizedTime value as a string.\n */\nasn1.dateToGeneralizedTime = function(date) {\n  // TODO: validate; currently assumes proper format\n  if(typeof date === 'string') {\n    return date;\n  }\n\n  var rval = '';\n\n  // create format YYYYMMDDHHMMSSZ\n  var format = [];\n  format.push('' + date.getUTCFullYear());\n  format.push('' + (date.getUTCMonth() + 1));\n  format.push('' + date.getUTCDate());\n  format.push('' + date.getUTCHours());\n  format.push('' + date.getUTCMinutes());\n  format.push('' + date.getUTCSeconds());\n\n  // ensure 2 digits are used for each format entry\n  for(var i = 0; i < format.length; ++i) {\n    if(format[i].length < 2) {\n      rval += '0';\n    }\n    rval += format[i];\n  }\n  rval += 'Z';\n\n  return rval;\n};\n\n/**\n * Converts a javascript integer to a DER-encoded byte buffer to be used\n * as the value for an INTEGER type.\n *\n * @param x the integer.\n *\n * @return the byte buffer.\n */\nasn1.integerToDer = function(x) {\n  var rval = forge.util.createBuffer();\n  if(x >= -0x80 && x < 0x80) {\n    return rval.putSignedInt(x, 8);\n  }\n  if(x >= -0x8000 && x < 0x8000) {\n    return rval.putSignedInt(x, 16);\n  }\n  if(x >= -0x800000 && x < 0x800000) {\n    return rval.putSignedInt(x, 24);\n  }\n  if(x >= -0x80000000 && x < 0x80000000) {\n    return rval.putSignedInt(x, 32);\n  }\n  var error = new Error('Integer too large; max is 32-bits.');\n  error.integer = x;\n  throw error;\n};\n\n/**\n * Converts a DER-encoded byte buffer to a javascript integer. This is\n * typically used to decode the value of an INTEGER type.\n *\n * @param bytes the byte buffer.\n *\n * @return the integer.\n */\nasn1.derToInteger = function(bytes) {\n  // wrap in buffer if needed\n  if(typeof bytes === 'string') {\n    bytes = forge.util.createBuffer(bytes);\n  }\n\n  var n = bytes.length() * 8;\n  if(n > 32) {\n    throw new Error('Integer too large; max is 32-bits.');\n  }\n  return bytes.getSignedInt(n);\n};\n\n/**\n * Validates that the given ASN.1 object is at least a super set of the\n * given ASN.1 structure. Only tag classes and types are checked. An\n * optional map may also be provided to capture ASN.1 values while the\n * structure is checked.\n *\n * To capture an ASN.1 value, set an object in the validator's 'capture'\n * parameter to the key to use in the capture map. To capture the full\n * ASN.1 object, specify 'captureAsn1'. To capture BIT STRING bytes, including\n * the leading unused bits counter byte, specify 'captureBitStringContents'.\n * To capture BIT STRING bytes, without the leading unused bits counter byte,\n * specify 'captureBitStringValue'.\n *\n * Objects in the validator may set a field 'optional' to true to indicate\n * that it isn't necessary to pass validation.\n *\n * @param obj the ASN.1 object to validate.\n * @param v the ASN.1 structure validator.\n * @param capture an optional map to capture values in.\n * @param errors an optional array for storing validation errors.\n *\n * @return true on success, false on failure.\n */\nasn1.validate = function(obj, v, capture, errors) {\n  var rval = false;\n\n  // ensure tag class and type are the same if specified\n  if((obj.tagClass === v.tagClass || typeof(v.tagClass) === 'undefined') &&\n    (obj.type === v.type || typeof(v.type) === 'undefined')) {\n    // ensure constructed flag is the same if specified\n    if(obj.constructed === v.constructed ||\n      typeof(v.constructed) === 'undefined') {\n      rval = true;\n\n      // handle sub values\n      if(v.value && forge.util.isArray(v.value)) {\n        var j = 0;\n        for(var i = 0; rval && i < v.value.length; ++i) {\n          rval = v.value[i].optional || false;\n          if(obj.value[j]) {\n            rval = asn1.validate(obj.value[j], v.value[i], capture, errors);\n            if(rval) {\n              ++j;\n            } else if(v.value[i].optional) {\n              rval = true;\n            }\n          }\n          if(!rval && errors) {\n            errors.push(\n              '[' + v.name + '] ' +\n              'Tag class \"' + v.tagClass + '\", type \"' +\n              v.type + '\" expected value length \"' +\n              v.value.length + '\", got \"' +\n              obj.value.length + '\"');\n          }\n        }\n      }\n\n      if(rval && capture) {\n        if(v.capture) {\n          capture[v.capture] = obj.value;\n        }\n        if(v.captureAsn1) {\n          capture[v.captureAsn1] = obj;\n        }\n        if(v.captureBitStringContents && 'bitStringContents' in obj) {\n          capture[v.captureBitStringContents] = obj.bitStringContents;\n        }\n        if(v.captureBitStringValue && 'bitStringContents' in obj) {\n          var value;\n          if(obj.bitStringContents.length < 2) {\n            capture[v.captureBitStringValue] = '';\n          } else {\n            // FIXME: support unused bits with data shifting\n            var unused = obj.bitStringContents.charCodeAt(0);\n            if(unused !== 0) {\n              throw new Error(\n                'captureBitStringValue only supported for zero unused bits');\n            }\n            capture[v.captureBitStringValue] = obj.bitStringContents.slice(1);\n          }\n        }\n      }\n    } else if(errors) {\n      errors.push(\n        '[' + v.name + '] ' +\n        'Expected constructed \"' + v.constructed + '\", got \"' +\n        obj.constructed + '\"');\n    }\n  } else if(errors) {\n    if(obj.tagClass !== v.tagClass) {\n      errors.push(\n        '[' + v.name + '] ' +\n        'Expected tag class \"' + v.tagClass + '\", got \"' +\n        obj.tagClass + '\"');\n    }\n    if(obj.type !== v.type) {\n      errors.push(\n        '[' + v.name + '] ' +\n        'Expected type \"' + v.type + '\", got \"' + obj.type + '\"');\n    }\n  }\n  return rval;\n};\n\n// regex for testing for non-latin characters\nvar _nonLatinRegex = /[^\\\\u0000-\\\\u00ff]/;\n\n/**\n * Pretty prints an ASN.1 object to a string.\n *\n * @param obj the object to write out.\n * @param level the level in the tree.\n * @param indentation the indentation to use.\n *\n * @return the string.\n */\nasn1.prettyPrint = function(obj, level, indentation) {\n  var rval = '';\n\n  // set default level and indentation\n  level = level || 0;\n  indentation = indentation || 2;\n\n  // start new line for deep levels\n  if(level > 0) {\n    rval += '\\n';\n  }\n\n  // create indent\n  var indent = '';\n  for(var i = 0; i < level * indentation; ++i) {\n    indent += ' ';\n  }\n\n  // print class:type\n  rval += indent + 'Tag: ';\n  switch(obj.tagClass) {\n  case asn1.Class.UNIVERSAL:\n    rval += 'Universal:';\n    break;\n  case asn1.Class.APPLICATION:\n    rval += 'Application:';\n    break;\n  case asn1.Class.CONTEXT_SPECIFIC:\n    rval += 'Context-Specific:';\n    break;\n  case asn1.Class.PRIVATE:\n    rval += 'Private:';\n    break;\n  }\n\n  if(obj.tagClass === asn1.Class.UNIVERSAL) {\n    rval += obj.type;\n\n    // known types\n    switch(obj.type) {\n    case asn1.Type.NONE:\n      rval += ' (None)';\n      break;\n    case asn1.Type.BOOLEAN:\n      rval += ' (Boolean)';\n      break;\n    case asn1.Type.INTEGER:\n      rval += ' (Integer)';\n      break;\n    case asn1.Type.BITSTRING:\n      rval += ' (Bit string)';\n      break;\n    case asn1.Type.OCTETSTRING:\n      rval += ' (Octet string)';\n      break;\n    case asn1.Type.NULL:\n      rval += ' (Null)';\n      break;\n    case asn1.Type.OID:\n      rval += ' (Object Identifier)';\n      break;\n    case asn1.Type.ODESC:\n      rval += ' (Object Descriptor)';\n      break;\n    case asn1.Type.EXTERNAL:\n      rval += ' (External or Instance of)';\n      break;\n    case asn1.Type.REAL:\n      rval += ' (Real)';\n      break;\n    case asn1.Type.ENUMERATED:\n      rval += ' (Enumerated)';\n      break;\n    case asn1.Type.EMBEDDED:\n      rval += ' (Embedded PDV)';\n      break;\n    case asn1.Type.UTF8:\n      rval += ' (UTF8)';\n      break;\n    case asn1.Type.ROID:\n      rval += ' (Relative Object Identifier)';\n      break;\n    case asn1.Type.SEQUENCE:\n      rval += ' (Sequence)';\n      break;\n    case asn1.Type.SET:\n      rval += ' (Set)';\n      break;\n    case asn1.Type.PRINTABLESTRING:\n      rval += ' (Printable String)';\n      break;\n    case asn1.Type.IA5String:\n      rval += ' (IA5String (ASCII))';\n      break;\n    case asn1.Type.UTCTIME:\n      rval += ' (UTC time)';\n      break;\n    case asn1.Type.GENERALIZEDTIME:\n      rval += ' (Generalized time)';\n      break;\n    case asn1.Type.BMPSTRING:\n      rval += ' (BMP String)';\n      break;\n    }\n  } else {\n    rval += obj.type;\n  }\n\n  rval += '\\n';\n  rval += indent + 'Constructed: ' + obj.constructed + '\\n';\n\n  if(obj.composed) {\n    var subvalues = 0;\n    var sub = '';\n    for(var i = 0; i < obj.value.length; ++i) {\n      if(obj.value[i] !== undefined) {\n        subvalues += 1;\n        sub += asn1.prettyPrint(obj.value[i], level + 1, indentation);\n        if((i + 1) < obj.value.length) {\n          sub += ',';\n        }\n      }\n    }\n    rval += indent + 'Sub values: ' + subvalues + sub;\n  } else {\n    rval += indent + 'Value: ';\n    if(obj.type === asn1.Type.OID) {\n      var oid = asn1.derToOid(obj.value);\n      rval += oid;\n      if(forge.pki && forge.pki.oids) {\n        if(oid in forge.pki.oids) {\n          rval += ' (' + forge.pki.oids[oid] + ') ';\n        }\n      }\n    }\n    if(obj.type === asn1.Type.INTEGER) {\n      try {\n        rval += asn1.derToInteger(obj.value);\n      } catch(ex) {\n        rval += '0x' + forge.util.bytesToHex(obj.value);\n      }\n    } else if(obj.type === asn1.Type.BITSTRING) {\n      // TODO: shift bits as needed to display without padding\n      if(obj.value.length > 1) {\n        // remove unused bits field\n        rval += '0x' + forge.util.bytesToHex(obj.value.slice(1));\n      } else {\n        rval += '(none)';\n      }\n      // show unused bit count\n      if(obj.value.length > 0) {\n        var unused = obj.value.charCodeAt(0);\n        if(unused == 1) {\n          rval += ' (1 unused bit shown)';\n        } else if(unused > 1) {\n          rval += ' (' + unused + ' unused bits shown)';\n        }\n      }\n    } else if(obj.type === asn1.Type.OCTETSTRING) {\n      if(!_nonLatinRegex.test(obj.value)) {\n        rval += '(' + obj.value + ') ';\n      }\n      rval += '0x' + forge.util.bytesToHex(obj.value);\n    } else if(obj.type === asn1.Type.UTF8) {\n      try {\n        rval += forge.util.decodeUtf8(obj.value);\n      } catch(e) {\n        if(e.message === 'URI malformed') {\n          rval +=\n            '0x' + forge.util.bytesToHex(obj.value) + ' (malformed UTF8)';\n        } else {\n          throw e;\n        }\n      }\n    } else if(obj.type === asn1.Type.PRINTABLESTRING ||\n      obj.type === asn1.Type.IA5String) {\n      rval += obj.value;\n    } else if(_nonLatinRegex.test(obj.value)) {\n      rval += '0x' + forge.util.bytesToHex(obj.value);\n    } else if(obj.value.length === 0) {\n      rval += '[null]';\n    } else {\n      rval += obj.value;\n    }\n  }\n\n  return rval;\n};\n","/**\n * Node.js module for Forge message digests.\n *\n * @author Dave Longley\n *\n * Copyright 2011-2017 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\n\nmodule.exports = forge.md = forge.md || {};\nforge.md.algorithms = forge.md.algorithms || {};\n","/**\n * Hash-based Message Authentication Code implementation. Requires a message\n * digest object that can be obtained, for example, from forge.md.sha1 or\n * forge.md.md5.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2012 Digital Bazaar, Inc. All rights reserved.\n */\nvar forge = require('./forge');\nrequire('./md');\nrequire('./util');\n\n/* HMAC API */\nvar hmac = module.exports = forge.hmac = forge.hmac || {};\n\n/**\n * Creates an HMAC object that uses the given message digest object.\n *\n * @return an HMAC object.\n */\nhmac.create = function() {\n  // the hmac key to use\n  var _key = null;\n\n  // the message digest to use\n  var _md = null;\n\n  // the inner padding\n  var _ipadding = null;\n\n  // the outer padding\n  var _opadding = null;\n\n  // hmac context\n  var ctx = {};\n\n  /**\n   * Starts or restarts the HMAC with the given key and message digest.\n   *\n   * @param md the message digest to use, null to reuse the previous one,\n   *           a string to use builtin 'sha1', 'md5', 'sha256'.\n   * @param key the key to use as a string, array of bytes, byte buffer,\n   *           or null to reuse the previous key.\n   */\n  ctx.start = function(md, key) {\n    if(md !== null) {\n      if(typeof md === 'string') {\n        // create builtin message digest\n        md = md.toLowerCase();\n        if(md in forge.md.algorithms) {\n          _md = forge.md.algorithms[md].create();\n        } else {\n          throw new Error('Unknown hash algorithm \"' + md + '\"');\n        }\n      } else {\n        // store message digest\n        _md = md;\n      }\n    }\n\n    if(key === null) {\n      // reuse previous key\n      key = _key;\n    } else {\n      if(typeof key === 'string') {\n        // convert string into byte buffer\n        key = forge.util.createBuffer(key);\n      } else if(forge.util.isArray(key)) {\n        // convert byte array into byte buffer\n        var tmp = key;\n        key = forge.util.createBuffer();\n        for(var i = 0; i < tmp.length; ++i) {\n          key.putByte(tmp[i]);\n        }\n      }\n\n      // if key is longer than blocksize, hash it\n      var keylen = key.length();\n      if(keylen > _md.blockLength) {\n        _md.start();\n        _md.update(key.bytes());\n        key = _md.digest();\n      }\n\n      // mix key into inner and outer padding\n      // ipadding = [0x36 * blocksize] ^ key\n      // opadding = [0x5C * blocksize] ^ key\n      _ipadding = forge.util.createBuffer();\n      _opadding = forge.util.createBuffer();\n      keylen = key.length();\n      for(var i = 0; i < keylen; ++i) {\n        var tmp = key.at(i);\n        _ipadding.putByte(0x36 ^ tmp);\n        _opadding.putByte(0x5C ^ tmp);\n      }\n\n      // if key is shorter than blocksize, add additional padding\n      if(keylen < _md.blockLength) {\n        var tmp = _md.blockLength - keylen;\n        for(var i = 0; i < tmp; ++i) {\n          _ipadding.putByte(0x36);\n          _opadding.putByte(0x5C);\n        }\n      }\n      _key = key;\n      _ipadding = _ipadding.bytes();\n      _opadding = _opadding.bytes();\n    }\n\n    // digest is done like so: hash(opadding | hash(ipadding | message))\n\n    // prepare to do inner hash\n    // hash(ipadding | message)\n    _md.start();\n    _md.update(_ipadding);\n  };\n\n  /**\n   * Updates the HMAC with the given message bytes.\n   *\n   * @param bytes the bytes to update with.\n   */\n  ctx.update = function(bytes) {\n    _md.update(bytes);\n  };\n\n  /**\n   * Produces the Message Authentication Code (MAC).\n   *\n   * @return a byte buffer containing the digest value.\n   */\n  ctx.getMac = function() {\n    // digest is done like so: hash(opadding | hash(ipadding | message))\n    // here we do the outer hashing\n    var inner = _md.digest().bytes();\n    _md.start();\n    _md.update(_opadding);\n    _md.update(inner);\n    return _md.digest();\n  };\n  // alias for getMac\n  ctx.digest = ctx.getMac;\n\n  return ctx;\n};\n","/**\n * Message Digest Algorithm 5 with 128-bit digest (MD5) implementation.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./md');\nrequire('./util');\n\nvar md5 = module.exports = forge.md5 = forge.md5 || {};\nforge.md.md5 = forge.md.algorithms.md5 = md5;\n\n/**\n * Creates an MD5 message digest object.\n *\n * @return a message digest object.\n */\nmd5.create = function() {\n  // do initialization as necessary\n  if(!_initialized) {\n    _init();\n  }\n\n  // MD5 state contains four 32-bit integers\n  var _state = null;\n\n  // input buffer\n  var _input = forge.util.createBuffer();\n\n  // used for word storage\n  var _w = new Array(16);\n\n  // message digest object\n  var md = {\n    algorithm: 'md5',\n    blockLength: 64,\n    digestLength: 16,\n    // 56-bit length of message so far (does not including padding)\n    messageLength: 0,\n    // true message length\n    fullMessageLength: null,\n    // size of message length in bytes\n    messageLengthSize: 8\n  };\n\n  /**\n   * Starts the digest.\n   *\n   * @return this digest object.\n   */\n  md.start = function() {\n    // up to 56-bit message length for convenience\n    md.messageLength = 0;\n\n    // full message length (set md.messageLength64 for backwards-compatibility)\n    md.fullMessageLength = md.messageLength64 = [];\n    var int32s = md.messageLengthSize / 4;\n    for(var i = 0; i < int32s; ++i) {\n      md.fullMessageLength.push(0);\n    }\n    _input = forge.util.createBuffer();\n    _state = {\n      h0: 0x67452301,\n      h1: 0xEFCDAB89,\n      h2: 0x98BADCFE,\n      h3: 0x10325476\n    };\n    return md;\n  };\n  // start digest automatically for first time\n  md.start();\n\n  /**\n   * Updates the digest with the given message input. The given input can\n   * treated as raw input (no encoding will be applied) or an encoding of\n   * 'utf8' maybe given to encode the input using UTF-8.\n   *\n   * @param msg the message input to update with.\n   * @param encoding the encoding to use (default: 'raw', other: 'utf8').\n   *\n   * @return this digest object.\n   */\n  md.update = function(msg, encoding) {\n    if(encoding === 'utf8') {\n      msg = forge.util.encodeUtf8(msg);\n    }\n\n    // update message length\n    var len = msg.length;\n    md.messageLength += len;\n    len = [(len / 0x100000000) >>> 0, len >>> 0];\n    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {\n      md.fullMessageLength[i] += len[1];\n      len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0);\n      md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0;\n      len[0] = (len[1] / 0x100000000) >>> 0;\n    }\n\n    // add bytes to input buffer\n    _input.putBytes(msg);\n\n    // process bytes\n    _update(_state, _w, _input);\n\n    // compact input buffer every 2K or if empty\n    if(_input.read > 2048 || _input.length() === 0) {\n      _input.compact();\n    }\n\n    return md;\n  };\n\n  /**\n   * Produces the digest.\n   *\n   * @return a byte buffer containing the digest value.\n   */\n  md.digest = function() {\n    /* Note: Here we copy the remaining bytes in the input buffer and\n    add the appropriate MD5 padding. Then we do the final update\n    on a copy of the state so that if the user wants to get\n    intermediate digests they can do so. */\n\n    /* Determine the number of bytes that must be added to the message\n    to ensure its length is congruent to 448 mod 512. In other words,\n    the data to be digested must be a multiple of 512 bits (or 128 bytes).\n    This data includes the message, some padding, and the length of the\n    message. Since the length of the message will be encoded as 8 bytes (64\n    bits), that means that the last segment of the data must have 56 bytes\n    (448 bits) of message and padding. Therefore, the length of the message\n    plus the padding must be congruent to 448 mod 512 because\n    512 - 128 = 448.\n\n    In order to fill up the message length it must be filled with\n    padding that begins with 1 bit followed by all 0 bits. Padding\n    must *always* be present, so if the message length is already\n    congruent to 448 mod 512, then 512 padding bits must be added. */\n\n    var finalBlock = forge.util.createBuffer();\n    finalBlock.putBytes(_input.bytes());\n\n    // compute remaining size to be digested (include message length size)\n    var remaining = (\n      md.fullMessageLength[md.fullMessageLength.length - 1] +\n      md.messageLengthSize);\n\n    // add padding for overflow blockSize - overflow\n    // _padding starts with 1 byte with first bit is set (byte value 128), then\n    // there may be up to (blockSize - 1) other pad bytes\n    var overflow = remaining & (md.blockLength - 1);\n    finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow));\n\n    // serialize message length in bits in little-endian order; since length\n    // is stored in bytes we multiply by 8 and add carry\n    var bits, carry = 0;\n    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {\n      bits = md.fullMessageLength[i] * 8 + carry;\n      carry = (bits / 0x100000000) >>> 0;\n      finalBlock.putInt32Le(bits >>> 0);\n    }\n\n    var s2 = {\n      h0: _state.h0,\n      h1: _state.h1,\n      h2: _state.h2,\n      h3: _state.h3\n    };\n    _update(s2, _w, finalBlock);\n    var rval = forge.util.createBuffer();\n    rval.putInt32Le(s2.h0);\n    rval.putInt32Le(s2.h1);\n    rval.putInt32Le(s2.h2);\n    rval.putInt32Le(s2.h3);\n    return rval;\n  };\n\n  return md;\n};\n\n// padding, constant tables for calculating md5\nvar _padding = null;\nvar _g = null;\nvar _r = null;\nvar _k = null;\nvar _initialized = false;\n\n/**\n * Initializes the constant tables.\n */\nfunction _init() {\n  // create padding\n  _padding = String.fromCharCode(128);\n  _padding += forge.util.fillString(String.fromCharCode(0x00), 64);\n\n  // g values\n  _g = [\n    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n    1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12,\n    5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2,\n    0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9];\n\n  // rounds table\n  _r = [\n    7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,\n    5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,\n    4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,\n    6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21];\n\n  // get the result of abs(sin(i + 1)) as a 32-bit integer\n  _k = new Array(64);\n  for(var i = 0; i < 64; ++i) {\n    _k[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 0x100000000);\n  }\n\n  // now initialized\n  _initialized = true;\n}\n\n/**\n * Updates an MD5 state with the given byte buffer.\n *\n * @param s the MD5 state to update.\n * @param w the array to use to store words.\n * @param bytes the byte buffer to update with.\n */\nfunction _update(s, w, bytes) {\n  // consume 512 bit (64 byte) chunks\n  var t, a, b, c, d, f, r, i;\n  var len = bytes.length();\n  while(len >= 64) {\n    // initialize hash value for this chunk\n    a = s.h0;\n    b = s.h1;\n    c = s.h2;\n    d = s.h3;\n\n    // round 1\n    for(i = 0; i < 16; ++i) {\n      w[i] = bytes.getInt32Le();\n      f = d ^ (b & (c ^ d));\n      t = (a + f + _k[i] + w[i]);\n      r = _r[i];\n      a = d;\n      d = c;\n      c = b;\n      b += (t << r) | (t >>> (32 - r));\n    }\n    // round 2\n    for(; i < 32; ++i) {\n      f = c ^ (d & (b ^ c));\n      t = (a + f + _k[i] + w[_g[i]]);\n      r = _r[i];\n      a = d;\n      d = c;\n      c = b;\n      b += (t << r) | (t >>> (32 - r));\n    }\n    // round 3\n    for(; i < 48; ++i) {\n      f = b ^ c ^ d;\n      t = (a + f + _k[i] + w[_g[i]]);\n      r = _r[i];\n      a = d;\n      d = c;\n      c = b;\n      b += (t << r) | (t >>> (32 - r));\n    }\n    // round 4\n    for(; i < 64; ++i) {\n      f = c ^ (b | ~d);\n      t = (a + f + _k[i] + w[_g[i]]);\n      r = _r[i];\n      a = d;\n      d = c;\n      c = b;\n      b += (t << r) | (t >>> (32 - r));\n    }\n\n    // update hash state\n    s.h0 = (s.h0 + a) | 0;\n    s.h1 = (s.h1 + b) | 0;\n    s.h2 = (s.h2 + c) | 0;\n    s.h3 = (s.h3 + d) | 0;\n\n    len -= 64;\n  }\n}\n","/**\n * Javascript implementation of basic PEM (Privacy Enhanced Mail) algorithms.\n *\n * See: RFC 1421.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2013-2014 Digital Bazaar, Inc.\n *\n * A Forge PEM object has the following fields:\n *\n * type: identifies the type of message (eg: \"RSA PRIVATE KEY\").\n *\n * procType: identifies the type of processing performed on the message,\n *   it has two subfields: version and type, eg: 4,ENCRYPTED.\n *\n * contentDomain: identifies the type of content in the message, typically\n *   only uses the value: \"RFC822\".\n *\n * dekInfo: identifies the message encryption algorithm and mode and includes\n *   any parameters for the algorithm, it has two subfields: algorithm and\n *   parameters, eg: DES-CBC,F8143EDE5960C597.\n *\n * headers: contains all other PEM encapsulated headers -- where order is\n *   significant (for pairing data like recipient ID + key info).\n *\n * body: the binary-encoded body.\n */\nvar forge = require('./forge');\nrequire('./util');\n\n// shortcut for pem API\nvar pem = module.exports = forge.pem = forge.pem || {};\n\n/**\n * Encodes (serializes) the given PEM object.\n *\n * @param msg the PEM message object to encode.\n * @param options the options to use:\n *          maxline the maximum characters per line for the body, (default: 64).\n *\n * @return the PEM-formatted string.\n */\npem.encode = function(msg, options) {\n  options = options || {};\n  var rval = '-----BEGIN ' + msg.type + '-----\\r\\n';\n\n  // encode special headers\n  var header;\n  if(msg.procType) {\n    header = {\n      name: 'Proc-Type',\n      values: [String(msg.procType.version), msg.procType.type]\n    };\n    rval += foldHeader(header);\n  }\n  if(msg.contentDomain) {\n    header = {name: 'Content-Domain', values: [msg.contentDomain]};\n    rval += foldHeader(header);\n  }\n  if(msg.dekInfo) {\n    header = {name: 'DEK-Info', values: [msg.dekInfo.algorithm]};\n    if(msg.dekInfo.parameters) {\n      header.values.push(msg.dekInfo.parameters);\n    }\n    rval += foldHeader(header);\n  }\n\n  if(msg.headers) {\n    // encode all other headers\n    for(var i = 0; i < msg.headers.length; ++i) {\n      rval += foldHeader(msg.headers[i]);\n    }\n  }\n\n  // terminate header\n  if(msg.procType) {\n    rval += '\\r\\n';\n  }\n\n  // add body\n  rval += forge.util.encode64(msg.body, options.maxline || 64) + '\\r\\n';\n\n  rval += '-----END ' + msg.type + '-----\\r\\n';\n  return rval;\n};\n\n/**\n * Decodes (deserializes) all PEM messages found in the given string.\n *\n * @param str the PEM-formatted string to decode.\n *\n * @return the PEM message objects in an array.\n */\npem.decode = function(str) {\n  var rval = [];\n\n  // split string into PEM messages (be lenient w/EOF on BEGIN line)\n  var rMessage = /\\s*-----BEGIN ([A-Z0-9- ]+)-----\\r?\\n?([\\x21-\\x7e\\s]+?(?:\\r?\\n\\r?\\n))?([:A-Za-z0-9+\\/=\\s]+?)-----END \\1-----/g;\n  var rHeader = /([\\x21-\\x7e]+):\\s*([\\x21-\\x7e\\s^:]+)/;\n  var rCRLF = /\\r?\\n/;\n  var match;\n  while(true) {\n    match = rMessage.exec(str);\n    if(!match) {\n      break;\n    }\n\n    // accept \"NEW CERTIFICATE REQUEST\" as \"CERTIFICATE REQUEST\"\n    // https://datatracker.ietf.org/doc/html/rfc7468#section-7\n    var type = match[1];\n    if(type === 'NEW CERTIFICATE REQUEST') {\n      type = 'CERTIFICATE REQUEST';\n    }\n\n    var msg = {\n      type: type,\n      procType: null,\n      contentDomain: null,\n      dekInfo: null,\n      headers: [],\n      body: forge.util.decode64(match[3])\n    };\n    rval.push(msg);\n\n    // no headers\n    if(!match[2]) {\n      continue;\n    }\n\n    // parse headers\n    var lines = match[2].split(rCRLF);\n    var li = 0;\n    while(match && li < lines.length) {\n      // get line, trim any rhs whitespace\n      var line = lines[li].replace(/\\s+$/, '');\n\n      // RFC2822 unfold any following folded lines\n      for(var nl = li + 1; nl < lines.length; ++nl) {\n        var next = lines[nl];\n        if(!/\\s/.test(next[0])) {\n          break;\n        }\n        line += next;\n        li = nl;\n      }\n\n      // parse header\n      match = line.match(rHeader);\n      if(match) {\n        var header = {name: match[1], values: []};\n        var values = match[2].split(',');\n        for(var vi = 0; vi < values.length; ++vi) {\n          header.values.push(ltrim(values[vi]));\n        }\n\n        // Proc-Type must be the first header\n        if(!msg.procType) {\n          if(header.name !== 'Proc-Type') {\n            throw new Error('Invalid PEM formatted message. The first ' +\n              'encapsulated header must be \"Proc-Type\".');\n          } else if(header.values.length !== 2) {\n            throw new Error('Invalid PEM formatted message. The \"Proc-Type\" ' +\n              'header must have two subfields.');\n          }\n          msg.procType = {version: values[0], type: values[1]};\n        } else if(!msg.contentDomain && header.name === 'Content-Domain') {\n          // special-case Content-Domain\n          msg.contentDomain = values[0] || '';\n        } else if(!msg.dekInfo && header.name === 'DEK-Info') {\n          // special-case DEK-Info\n          if(header.values.length === 0) {\n            throw new Error('Invalid PEM formatted message. The \"DEK-Info\" ' +\n              'header must have at least one subfield.');\n          }\n          msg.dekInfo = {algorithm: values[0], parameters: values[1] || null};\n        } else {\n          msg.headers.push(header);\n        }\n      }\n\n      ++li;\n    }\n\n    if(msg.procType === 'ENCRYPTED' && !msg.dekInfo) {\n      throw new Error('Invalid PEM formatted message. The \"DEK-Info\" ' +\n        'header must be present if \"Proc-Type\" is \"ENCRYPTED\".');\n    }\n  }\n\n  if(rval.length === 0) {\n    throw new Error('Invalid PEM formatted message.');\n  }\n\n  return rval;\n};\n\nfunction foldHeader(header) {\n  var rval = header.name + ': ';\n\n  // ensure values with CRLF are folded\n  var values = [];\n  var insertSpace = function(match, $1) {\n    return ' ' + $1;\n  };\n  for(var i = 0; i < header.values.length; ++i) {\n    values.push(header.values[i].replace(/^(\\S+\\r\\n)/, insertSpace));\n  }\n  rval += values.join(',') + '\\r\\n';\n\n  // do folding\n  var length = 0;\n  var candidate = -1;\n  for(var i = 0; i < rval.length; ++i, ++length) {\n    if(length > 65 && candidate !== -1) {\n      var insert = rval[candidate];\n      if(insert === ',') {\n        ++candidate;\n        rval = rval.substr(0, candidate) + '\\r\\n ' + rval.substr(candidate);\n      } else {\n        rval = rval.substr(0, candidate) +\n          '\\r\\n' + insert + rval.substr(candidate + 1);\n      }\n      length = (i - candidate - 1);\n      candidate = -1;\n      ++i;\n    } else if(rval[i] === ' ' || rval[i] === '\\t' || rval[i] === ',') {\n      candidate = i;\n    }\n  }\n\n  return rval;\n}\n\nfunction ltrim(str) {\n  return str.replace(/^\\s+/, '');\n}\n","/**\n * DES (Data Encryption Standard) implementation.\n *\n * This implementation supports DES as well as 3DES-EDE in ECB and CBC mode.\n * It is based on the BSD-licensed implementation by Paul Tero:\n *\n * Paul Tero, July 2001\n * http://www.tero.co.uk/des/\n *\n * Optimised for performance with large blocks by\n * Michael Hayworth, November 2001\n * http://www.netdealing.com\n *\n * THIS SOFTWARE IS PROVIDED \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * @author Stefan Siegl\n * @author Dave Longley\n *\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n * Copyright (c) 2012-2014 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./cipher');\nrequire('./cipherModes');\nrequire('./util');\n\n/* DES API */\nmodule.exports = forge.des = forge.des || {};\n\n/**\n * Deprecated. Instead, use:\n *\n * var cipher = forge.cipher.createCipher('DES-<mode>', key);\n * cipher.start({iv: iv});\n *\n * Creates an DES cipher object to encrypt data using the given symmetric key.\n * The output will be stored in the 'output' member of the returned cipher.\n *\n * The key and iv may be given as binary-encoded strings of bytes or\n * byte buffers.\n *\n * @param key the symmetric key to use (64 or 192 bits).\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n * @param mode the cipher mode to use (default: 'CBC' if IV is\n *          given, 'ECB' if null).\n *\n * @return the cipher.\n */\nforge.des.startEncrypting = function(key, iv, output, mode) {\n  var cipher = _createCipher({\n    key: key,\n    output: output,\n    decrypt: false,\n    mode: mode || (iv === null ? 'ECB' : 'CBC')\n  });\n  cipher.start(iv);\n  return cipher;\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var cipher = forge.cipher.createCipher('DES-<mode>', key);\n *\n * Creates an DES cipher object to encrypt data using the given symmetric key.\n *\n * The key may be given as a binary-encoded string of bytes or a byte buffer.\n *\n * @param key the symmetric key to use (64 or 192 bits).\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.des.createEncryptionCipher = function(key, mode) {\n  return _createCipher({\n    key: key,\n    output: null,\n    decrypt: false,\n    mode: mode\n  });\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var decipher = forge.cipher.createDecipher('DES-<mode>', key);\n * decipher.start({iv: iv});\n *\n * Creates an DES cipher object to decrypt data using the given symmetric key.\n * The output will be stored in the 'output' member of the returned cipher.\n *\n * The key and iv may be given as binary-encoded strings of bytes or\n * byte buffers.\n *\n * @param key the symmetric key to use (64 or 192 bits).\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n * @param mode the cipher mode to use (default: 'CBC' if IV is\n *          given, 'ECB' if null).\n *\n * @return the cipher.\n */\nforge.des.startDecrypting = function(key, iv, output, mode) {\n  var cipher = _createCipher({\n    key: key,\n    output: output,\n    decrypt: true,\n    mode: mode || (iv === null ? 'ECB' : 'CBC')\n  });\n  cipher.start(iv);\n  return cipher;\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var decipher = forge.cipher.createDecipher('DES-<mode>', key);\n *\n * Creates an DES cipher object to decrypt data using the given symmetric key.\n *\n * The key may be given as a binary-encoded string of bytes or a byte buffer.\n *\n * @param key the symmetric key to use (64 or 192 bits).\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.des.createDecryptionCipher = function(key, mode) {\n  return _createCipher({\n    key: key,\n    output: null,\n    decrypt: true,\n    mode: mode\n  });\n};\n\n/**\n * Creates a new DES cipher algorithm object.\n *\n * @param name the name of the algorithm.\n * @param mode the mode factory function.\n *\n * @return the DES algorithm object.\n */\nforge.des.Algorithm = function(name, mode) {\n  var self = this;\n  self.name = name;\n  self.mode = new mode({\n    blockSize: 8,\n    cipher: {\n      encrypt: function(inBlock, outBlock) {\n        return _updateBlock(self._keys, inBlock, outBlock, false);\n      },\n      decrypt: function(inBlock, outBlock) {\n        return _updateBlock(self._keys, inBlock, outBlock, true);\n      }\n    }\n  });\n  self._init = false;\n};\n\n/**\n * Initializes this DES algorithm by expanding its key.\n *\n * @param options the options to use.\n *          key the key to use with this algorithm.\n *          decrypt true if the algorithm should be initialized for decryption,\n *            false for encryption.\n */\nforge.des.Algorithm.prototype.initialize = function(options) {\n  if(this._init) {\n    return;\n  }\n\n  var key = forge.util.createBuffer(options.key);\n  if(this.name.indexOf('3DES') === 0) {\n    if(key.length() !== 24) {\n      throw new Error('Invalid Triple-DES key size: ' + key.length() * 8);\n    }\n  }\n\n  // do key expansion to 16 or 48 subkeys (single or triple DES)\n  this._keys = _createKeys(key);\n  this._init = true;\n};\n\n/** Register DES algorithms **/\n\nregisterAlgorithm('DES-ECB', forge.cipher.modes.ecb);\nregisterAlgorithm('DES-CBC', forge.cipher.modes.cbc);\nregisterAlgorithm('DES-CFB', forge.cipher.modes.cfb);\nregisterAlgorithm('DES-OFB', forge.cipher.modes.ofb);\nregisterAlgorithm('DES-CTR', forge.cipher.modes.ctr);\n\nregisterAlgorithm('3DES-ECB', forge.cipher.modes.ecb);\nregisterAlgorithm('3DES-CBC', forge.cipher.modes.cbc);\nregisterAlgorithm('3DES-CFB', forge.cipher.modes.cfb);\nregisterAlgorithm('3DES-OFB', forge.cipher.modes.ofb);\nregisterAlgorithm('3DES-CTR', forge.cipher.modes.ctr);\n\nfunction registerAlgorithm(name, mode) {\n  var factory = function() {\n    return new forge.des.Algorithm(name, mode);\n  };\n  forge.cipher.registerAlgorithm(name, factory);\n}\n\n/** DES implementation **/\n\nvar spfunction1 = [0x1010400,0,0x10000,0x1010404,0x1010004,0x10404,0x4,0x10000,0x400,0x1010400,0x1010404,0x400,0x1000404,0x1010004,0x1000000,0x4,0x404,0x1000400,0x1000400,0x10400,0x10400,0x1010000,0x1010000,0x1000404,0x10004,0x1000004,0x1000004,0x10004,0,0x404,0x10404,0x1000000,0x10000,0x1010404,0x4,0x1010000,0x1010400,0x1000000,0x1000000,0x400,0x1010004,0x10000,0x10400,0x1000004,0x400,0x4,0x1000404,0x10404,0x1010404,0x10004,0x1010000,0x1000404,0x1000004,0x404,0x10404,0x1010400,0x404,0x1000400,0x1000400,0,0x10004,0x10400,0,0x1010004];\nvar spfunction2 = [-0x7fef7fe0,-0x7fff8000,0x8000,0x108020,0x100000,0x20,-0x7fefffe0,-0x7fff7fe0,-0x7fffffe0,-0x7fef7fe0,-0x7fef8000,-0x80000000,-0x7fff8000,0x100000,0x20,-0x7fefffe0,0x108000,0x100020,-0x7fff7fe0,0,-0x80000000,0x8000,0x108020,-0x7ff00000,0x100020,-0x7fffffe0,0,0x108000,0x8020,-0x7fef8000,-0x7ff00000,0x8020,0,0x108020,-0x7fefffe0,0x100000,-0x7fff7fe0,-0x7ff00000,-0x7fef8000,0x8000,-0x7ff00000,-0x7fff8000,0x20,-0x7fef7fe0,0x108020,0x20,0x8000,-0x80000000,0x8020,-0x7fef8000,0x100000,-0x7fffffe0,0x100020,-0x7fff7fe0,-0x7fffffe0,0x100020,0x108000,0,-0x7fff8000,0x8020,-0x80000000,-0x7fefffe0,-0x7fef7fe0,0x108000];\nvar spfunction3 = [0x208,0x8020200,0,0x8020008,0x8000200,0,0x20208,0x8000200,0x20008,0x8000008,0x8000008,0x20000,0x8020208,0x20008,0x8020000,0x208,0x8000000,0x8,0x8020200,0x200,0x20200,0x8020000,0x8020008,0x20208,0x8000208,0x20200,0x20000,0x8000208,0x8,0x8020208,0x200,0x8000000,0x8020200,0x8000000,0x20008,0x208,0x20000,0x8020200,0x8000200,0,0x200,0x20008,0x8020208,0x8000200,0x8000008,0x200,0,0x8020008,0x8000208,0x20000,0x8000000,0x8020208,0x8,0x20208,0x20200,0x8000008,0x8020000,0x8000208,0x208,0x8020000,0x20208,0x8,0x8020008,0x20200];\nvar spfunction4 = [0x802001,0x2081,0x2081,0x80,0x802080,0x800081,0x800001,0x2001,0,0x802000,0x802000,0x802081,0x81,0,0x800080,0x800001,0x1,0x2000,0x800000,0x802001,0x80,0x800000,0x2001,0x2080,0x800081,0x1,0x2080,0x800080,0x2000,0x802080,0x802081,0x81,0x800080,0x800001,0x802000,0x802081,0x81,0,0,0x802000,0x2080,0x800080,0x800081,0x1,0x802001,0x2081,0x2081,0x80,0x802081,0x81,0x1,0x2000,0x800001,0x2001,0x802080,0x800081,0x2001,0x2080,0x800000,0x802001,0x80,0x800000,0x2000,0x802080];\nvar spfunction5 = [0x100,0x2080100,0x2080000,0x42000100,0x80000,0x100,0x40000000,0x2080000,0x40080100,0x80000,0x2000100,0x40080100,0x42000100,0x42080000,0x80100,0x40000000,0x2000000,0x40080000,0x40080000,0,0x40000100,0x42080100,0x42080100,0x2000100,0x42080000,0x40000100,0,0x42000000,0x2080100,0x2000000,0x42000000,0x80100,0x80000,0x42000100,0x100,0x2000000,0x40000000,0x2080000,0x42000100,0x40080100,0x2000100,0x40000000,0x42080000,0x2080100,0x40080100,0x100,0x2000000,0x42080000,0x42080100,0x80100,0x42000000,0x42080100,0x2080000,0,0x40080000,0x42000000,0x80100,0x2000100,0x40000100,0x80000,0,0x40080000,0x2080100,0x40000100];\nvar spfunction6 = [0x20000010,0x20400000,0x4000,0x20404010,0x20400000,0x10,0x20404010,0x400000,0x20004000,0x404010,0x400000,0x20000010,0x400010,0x20004000,0x20000000,0x4010,0,0x400010,0x20004010,0x4000,0x404000,0x20004010,0x10,0x20400010,0x20400010,0,0x404010,0x20404000,0x4010,0x404000,0x20404000,0x20000000,0x20004000,0x10,0x20400010,0x404000,0x20404010,0x400000,0x4010,0x20000010,0x400000,0x20004000,0x20000000,0x4010,0x20000010,0x20404010,0x404000,0x20400000,0x404010,0x20404000,0,0x20400010,0x10,0x4000,0x20400000,0x404010,0x4000,0x400010,0x20004010,0,0x20404000,0x20000000,0x400010,0x20004010];\nvar spfunction7 = [0x200000,0x4200002,0x4000802,0,0x800,0x4000802,0x200802,0x4200800,0x4200802,0x200000,0,0x4000002,0x2,0x4000000,0x4200002,0x802,0x4000800,0x200802,0x200002,0x4000800,0x4000002,0x4200000,0x4200800,0x200002,0x4200000,0x800,0x802,0x4200802,0x200800,0x2,0x4000000,0x200800,0x4000000,0x200800,0x200000,0x4000802,0x4000802,0x4200002,0x4200002,0x2,0x200002,0x4000000,0x4000800,0x200000,0x4200800,0x802,0x200802,0x4200800,0x802,0x4000002,0x4200802,0x4200000,0x200800,0,0x2,0x4200802,0,0x200802,0x4200000,0x800,0x4000002,0x4000800,0x800,0x200002];\nvar spfunction8 = [0x10001040,0x1000,0x40000,0x10041040,0x10000000,0x10001040,0x40,0x10000000,0x40040,0x10040000,0x10041040,0x41000,0x10041000,0x41040,0x1000,0x40,0x10040000,0x10000040,0x10001000,0x1040,0x41000,0x40040,0x10040040,0x10041000,0x1040,0,0,0x10040040,0x10000040,0x10001000,0x41040,0x40000,0x41040,0x40000,0x10041000,0x1000,0x40,0x10040040,0x1000,0x41040,0x10001000,0x40,0x10000040,0x10040000,0x10040040,0x10000000,0x40000,0x10001040,0,0x10041040,0x40040,0x10000040,0x10040000,0x10001000,0x10001040,0,0x10041040,0x41000,0x41000,0x1040,0x1040,0x40040,0x10000000,0x10041000];\n\n/**\n * Create necessary sub keys.\n *\n * @param key the 64-bit or 192-bit key.\n *\n * @return the expanded keys.\n */\nfunction _createKeys(key) {\n  var pc2bytes0  = [0,0x4,0x20000000,0x20000004,0x10000,0x10004,0x20010000,0x20010004,0x200,0x204,0x20000200,0x20000204,0x10200,0x10204,0x20010200,0x20010204],\n      pc2bytes1  = [0,0x1,0x100000,0x100001,0x4000000,0x4000001,0x4100000,0x4100001,0x100,0x101,0x100100,0x100101,0x4000100,0x4000101,0x4100100,0x4100101],\n      pc2bytes2  = [0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808,0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808],\n      pc2bytes3  = [0,0x200000,0x8000000,0x8200000,0x2000,0x202000,0x8002000,0x8202000,0x20000,0x220000,0x8020000,0x8220000,0x22000,0x222000,0x8022000,0x8222000],\n      pc2bytes4  = [0,0x40000,0x10,0x40010,0,0x40000,0x10,0x40010,0x1000,0x41000,0x1010,0x41010,0x1000,0x41000,0x1010,0x41010],\n      pc2bytes5  = [0,0x400,0x20,0x420,0,0x400,0x20,0x420,0x2000000,0x2000400,0x2000020,0x2000420,0x2000000,0x2000400,0x2000020,0x2000420],\n      pc2bytes6  = [0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002,0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002],\n      pc2bytes7  = [0,0x10000,0x800,0x10800,0x20000000,0x20010000,0x20000800,0x20010800,0x20000,0x30000,0x20800,0x30800,0x20020000,0x20030000,0x20020800,0x20030800],\n      pc2bytes8  = [0,0x40000,0,0x40000,0x2,0x40002,0x2,0x40002,0x2000000,0x2040000,0x2000000,0x2040000,0x2000002,0x2040002,0x2000002,0x2040002],\n      pc2bytes9  = [0,0x10000000,0x8,0x10000008,0,0x10000000,0x8,0x10000008,0x400,0x10000400,0x408,0x10000408,0x400,0x10000400,0x408,0x10000408],\n      pc2bytes10 = [0,0x20,0,0x20,0x100000,0x100020,0x100000,0x100020,0x2000,0x2020,0x2000,0x2020,0x102000,0x102020,0x102000,0x102020],\n      pc2bytes11 = [0,0x1000000,0x200,0x1000200,0x200000,0x1200000,0x200200,0x1200200,0x4000000,0x5000000,0x4000200,0x5000200,0x4200000,0x5200000,0x4200200,0x5200200],\n      pc2bytes12 = [0,0x1000,0x8000000,0x8001000,0x80000,0x81000,0x8080000,0x8081000,0x10,0x1010,0x8000010,0x8001010,0x80010,0x81010,0x8080010,0x8081010],\n      pc2bytes13 = [0,0x4,0x100,0x104,0,0x4,0x100,0x104,0x1,0x5,0x101,0x105,0x1,0x5,0x101,0x105];\n\n  // how many iterations (1 for des, 3 for triple des)\n  // changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys\n  var iterations = key.length() > 8 ? 3 : 1;\n\n  // stores the return keys\n  var keys = [];\n\n  // now define the left shifts which need to be done\n  var shifts = [0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0];\n\n  var n = 0, tmp;\n  for(var j = 0; j < iterations; j++) {\n    var left = key.getInt32();\n    var right = key.getInt32();\n\n    tmp = ((left >>> 4) ^ right) & 0x0f0f0f0f;\n    right ^= tmp;\n    left ^= (tmp << 4);\n\n    tmp = ((right >>> -16) ^ left) & 0x0000ffff;\n    left ^= tmp;\n    right ^= (tmp << -16);\n\n    tmp = ((left >>> 2) ^ right) & 0x33333333;\n    right ^= tmp;\n    left ^= (tmp << 2);\n\n    tmp = ((right >>> -16) ^ left) & 0x0000ffff;\n    left ^= tmp;\n    right ^= (tmp << -16);\n\n    tmp = ((left >>> 1) ^ right) & 0x55555555;\n    right ^= tmp;\n    left ^= (tmp << 1);\n\n    tmp = ((right >>> 8) ^ left) & 0x00ff00ff;\n    left ^= tmp;\n    right ^= (tmp << 8);\n\n    tmp = ((left >>> 1) ^ right) & 0x55555555;\n    right ^= tmp;\n    left ^= (tmp << 1);\n\n    // right needs to be shifted and OR'd with last four bits of left\n    tmp = (left << 8) | ((right >>> 20) & 0x000000f0);\n\n    // left needs to be put upside down\n    left = ((right << 24) | ((right << 8) & 0xff0000) |\n      ((right >>> 8) & 0xff00) | ((right >>> 24) & 0xf0));\n    right = tmp;\n\n    // now go through and perform these shifts on the left and right keys\n    for(var i = 0; i < shifts.length; ++i) {\n      //shift the keys either one or two bits to the left\n      if(shifts[i]) {\n        left = (left << 2) | (left >>> 26);\n        right = (right << 2) | (right >>> 26);\n      } else {\n        left = (left << 1) | (left >>> 27);\n        right = (right << 1) | (right >>> 27);\n      }\n      left &= -0xf;\n      right &= -0xf;\n\n      // now apply PC-2, in such a way that E is easier when encrypting or\n      // decrypting this conversion will look like PC-2 except only the last 6\n      // bits of each byte are used rather than 48 consecutive bits and the\n      // order of lines will be according to how the S selection functions will\n      // be applied: S2, S4, S6, S8, S1, S3, S5, S7\n      var lefttmp = (\n        pc2bytes0[left >>> 28] | pc2bytes1[(left >>> 24) & 0xf] |\n        pc2bytes2[(left >>> 20) & 0xf] | pc2bytes3[(left >>> 16) & 0xf] |\n        pc2bytes4[(left >>> 12) & 0xf] | pc2bytes5[(left >>> 8) & 0xf] |\n        pc2bytes6[(left >>> 4) & 0xf]);\n      var righttmp = (\n        pc2bytes7[right >>> 28] | pc2bytes8[(right >>> 24) & 0xf] |\n        pc2bytes9[(right >>> 20) & 0xf] | pc2bytes10[(right >>> 16) & 0xf] |\n        pc2bytes11[(right >>> 12) & 0xf] | pc2bytes12[(right >>> 8) & 0xf] |\n        pc2bytes13[(right >>> 4) & 0xf]);\n      tmp = ((righttmp >>> 16) ^ lefttmp) & 0x0000ffff;\n      keys[n++] = lefttmp ^ tmp;\n      keys[n++] = righttmp ^ (tmp << 16);\n    }\n  }\n\n  return keys;\n}\n\n/**\n * Updates a single block (1 byte) using DES. The update will either\n * encrypt or decrypt the block.\n *\n * @param keys the expanded keys.\n * @param input the input block (an array of 32-bit words).\n * @param output the updated output block.\n * @param decrypt true to decrypt the block, false to encrypt it.\n */\nfunction _updateBlock(keys, input, output, decrypt) {\n  // set up loops for single or triple DES\n  var iterations = keys.length === 32 ? 3 : 9;\n  var looping;\n  if(iterations === 3) {\n    looping = decrypt ? [30, -2, -2] : [0, 32, 2];\n  } else {\n    looping = (decrypt ?\n      [94, 62, -2, 32, 64, 2, 30, -2, -2] :\n      [0, 32, 2, 62, 30, -2, 64, 96, 2]);\n  }\n\n  var tmp;\n\n  var left = input[0];\n  var right = input[1];\n\n  // first each 64 bit chunk of the message must be permuted according to IP\n  tmp = ((left >>> 4) ^ right) & 0x0f0f0f0f;\n  right ^= tmp;\n  left ^= (tmp << 4);\n\n  tmp = ((left >>> 16) ^ right) & 0x0000ffff;\n  right ^= tmp;\n  left ^= (tmp << 16);\n\n  tmp = ((right >>> 2) ^ left) & 0x33333333;\n  left ^= tmp;\n  right ^= (tmp << 2);\n\n  tmp = ((right >>> 8) ^ left) & 0x00ff00ff;\n  left ^= tmp;\n  right ^= (tmp << 8);\n\n  tmp = ((left >>> 1) ^ right) & 0x55555555;\n  right ^= tmp;\n  left ^= (tmp << 1);\n\n  // rotate left 1 bit\n  left = ((left << 1) | (left >>> 31));\n  right = ((right << 1) | (right >>> 31));\n\n  for(var j = 0; j < iterations; j += 3) {\n    var endloop = looping[j + 1];\n    var loopinc = looping[j + 2];\n\n    // now go through and perform the encryption or decryption\n    for(var i = looping[j]; i != endloop; i += loopinc) {\n      var right1 = right ^ keys[i];\n      var right2 = ((right >>> 4) | (right << 28)) ^ keys[i + 1];\n\n      // passing these bytes through the S selection functions\n      tmp = left;\n      left = right;\n      right = tmp ^ (\n        spfunction2[(right1 >>> 24) & 0x3f] |\n        spfunction4[(right1 >>> 16) & 0x3f] |\n        spfunction6[(right1 >>>  8) & 0x3f] |\n        spfunction8[right1 & 0x3f] |\n        spfunction1[(right2 >>> 24) & 0x3f] |\n        spfunction3[(right2 >>> 16) & 0x3f] |\n        spfunction5[(right2 >>>  8) & 0x3f] |\n        spfunction7[right2 & 0x3f]);\n    }\n    // unreverse left and right\n    tmp = left;\n    left = right;\n    right = tmp;\n  }\n\n  // rotate right 1 bit\n  left = ((left >>> 1) | (left << 31));\n  right = ((right >>> 1) | (right << 31));\n\n  // now perform IP-1, which is IP in the opposite direction\n  tmp = ((left >>> 1) ^ right) & 0x55555555;\n  right ^= tmp;\n  left ^= (tmp << 1);\n\n  tmp = ((right >>> 8) ^ left) & 0x00ff00ff;\n  left ^= tmp;\n  right ^= (tmp << 8);\n\n  tmp = ((right >>> 2) ^ left) & 0x33333333;\n  left ^= tmp;\n  right ^= (tmp << 2);\n\n  tmp = ((left >>> 16) ^ right) & 0x0000ffff;\n  right ^= tmp;\n  left ^= (tmp << 16);\n\n  tmp = ((left >>> 4) ^ right) & 0x0f0f0f0f;\n  right ^= tmp;\n  left ^= (tmp << 4);\n\n  output[0] = left;\n  output[1] = right;\n}\n\n/**\n * Deprecated. Instead, use:\n *\n * forge.cipher.createCipher('DES-<mode>', key);\n * forge.cipher.createDecipher('DES-<mode>', key);\n *\n * Creates a deprecated DES cipher object. This object's mode will default to\n * CBC (cipher-block-chaining).\n *\n * The key may be given as a binary-encoded string of bytes or a byte buffer.\n *\n * @param options the options to use.\n *          key the symmetric key to use (64 or 192 bits).\n *          output the buffer to write to.\n *          decrypt true for decryption, false for encryption.\n *          mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nfunction _createCipher(options) {\n  options = options || {};\n  var mode = (options.mode || 'CBC').toUpperCase();\n  var algorithm = 'DES-' + mode;\n\n  var cipher;\n  if(options.decrypt) {\n    cipher = forge.cipher.createDecipher(algorithm, options.key);\n  } else {\n    cipher = forge.cipher.createCipher(algorithm, options.key);\n  }\n\n  // backwards compatible start API\n  var start = cipher.start;\n  cipher.start = function(iv, options) {\n    // backwards compatibility: support second arg as output buffer\n    var output = null;\n    if(options instanceof forge.util.ByteBuffer) {\n      output = options;\n      options = {};\n    }\n    options = options || {};\n    options.output = output;\n    options.iv = iv;\n    start.call(cipher, options);\n  };\n\n  return cipher;\n}\n","export default {}","/**\n * Password-Based Key-Derivation Function #2 implementation.\n *\n * See RFC 2898 for details.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2013 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./hmac');\nrequire('./md');\nrequire('./util');\n\nvar pkcs5 = forge.pkcs5 = forge.pkcs5 || {};\n\nvar crypto;\nif(forge.util.isNodejs && !forge.options.usePureJavaScript) {\n  crypto = require('crypto');\n}\n\n/**\n * Derives a key from a password.\n *\n * @param p the password as a binary-encoded string of bytes.\n * @param s the salt as a binary-encoded string of bytes.\n * @param c the iteration count, a positive integer.\n * @param dkLen the intended length, in bytes, of the derived key,\n *          (max: 2^32 - 1) * hash length of the PRF.\n * @param [md] the message digest (or algorithm identifier as a string) to use\n *          in the PRF, defaults to SHA-1.\n * @param [callback(err, key)] presence triggers asynchronous version, called\n *          once the operation completes.\n *\n * @return the derived key, as a binary-encoded string of bytes, for the\n *           synchronous version (if no callback is specified).\n */\nmodule.exports = forge.pbkdf2 = pkcs5.pbkdf2 = function(\n  p, s, c, dkLen, md, callback) {\n  if(typeof md === 'function') {\n    callback = md;\n    md = null;\n  }\n\n  // use native implementation if possible and not disabled, note that\n  // some node versions only support SHA-1, others allow digest to be changed\n  if(forge.util.isNodejs && !forge.options.usePureJavaScript &&\n    crypto.pbkdf2 && (md === null || typeof md !== 'object') &&\n    (crypto.pbkdf2Sync.length > 4 || (!md || md === 'sha1'))) {\n    if(typeof md !== 'string') {\n      // default prf to SHA-1\n      md = 'sha1';\n    }\n    p = Buffer.from(p, 'binary');\n    s = Buffer.from(s, 'binary');\n    if(!callback) {\n      if(crypto.pbkdf2Sync.length === 4) {\n        return crypto.pbkdf2Sync(p, s, c, dkLen).toString('binary');\n      }\n      return crypto.pbkdf2Sync(p, s, c, dkLen, md).toString('binary');\n    }\n    if(crypto.pbkdf2Sync.length === 4) {\n      return crypto.pbkdf2(p, s, c, dkLen, function(err, key) {\n        if(err) {\n          return callback(err);\n        }\n        callback(null, key.toString('binary'));\n      });\n    }\n    return crypto.pbkdf2(p, s, c, dkLen, md, function(err, key) {\n      if(err) {\n        return callback(err);\n      }\n      callback(null, key.toString('binary'));\n    });\n  }\n\n  if(typeof md === 'undefined' || md === null) {\n    // default prf to SHA-1\n    md = 'sha1';\n  }\n  if(typeof md === 'string') {\n    if(!(md in forge.md.algorithms)) {\n      throw new Error('Unknown hash algorithm: ' + md);\n    }\n    md = forge.md[md].create();\n  }\n\n  var hLen = md.digestLength;\n\n  /* 1. If dkLen > (2^32 - 1) * hLen, output \"derived key too long\" and\n    stop. */\n  if(dkLen > (0xFFFFFFFF * hLen)) {\n    var err = new Error('Derived key is too long.');\n    if(callback) {\n      return callback(err);\n    }\n    throw err;\n  }\n\n  /* 2. Let len be the number of hLen-octet blocks in the derived key,\n    rounding up, and let r be the number of octets in the last\n    block:\n\n    len = CEIL(dkLen / hLen),\n    r = dkLen - (len - 1) * hLen. */\n  var len = Math.ceil(dkLen / hLen);\n  var r = dkLen - (len - 1) * hLen;\n\n  /* 3. For each block of the derived key apply the function F defined\n    below to the password P, the salt S, the iteration count c, and\n    the block index to compute the block:\n\n    T_1 = F(P, S, c, 1),\n    T_2 = F(P, S, c, 2),\n    ...\n    T_len = F(P, S, c, len),\n\n    where the function F is defined as the exclusive-or sum of the\n    first c iterates of the underlying pseudorandom function PRF\n    applied to the password P and the concatenation of the salt S\n    and the block index i:\n\n    F(P, S, c, i) = u_1 XOR u_2 XOR ... XOR u_c\n\n    where\n\n    u_1 = PRF(P, S || INT(i)),\n    u_2 = PRF(P, u_1),\n    ...\n    u_c = PRF(P, u_{c-1}).\n\n    Here, INT(i) is a four-octet encoding of the integer i, most\n    significant octet first. */\n  var prf = forge.hmac.create();\n  prf.start(md, p);\n  var dk = '';\n  var xor, u_c, u_c1;\n\n  // sync version\n  if(!callback) {\n    for(var i = 1; i <= len; ++i) {\n      // PRF(P, S || INT(i)) (first iteration)\n      prf.start(null, null);\n      prf.update(s);\n      prf.update(forge.util.int32ToBytes(i));\n      xor = u_c1 = prf.digest().getBytes();\n\n      // PRF(P, u_{c-1}) (other iterations)\n      for(var j = 2; j <= c; ++j) {\n        prf.start(null, null);\n        prf.update(u_c1);\n        u_c = prf.digest().getBytes();\n        // F(p, s, c, i)\n        xor = forge.util.xorBytes(xor, u_c, hLen);\n        u_c1 = u_c;\n      }\n\n      /* 4. Concatenate the blocks and extract the first dkLen octets to\n        produce a derived key DK:\n\n        DK = T_1 || T_2 ||  ...  || T_len<0..r-1> */\n      dk += (i < len) ? xor : xor.substr(0, r);\n    }\n    /* 5. Output the derived key DK. */\n    return dk;\n  }\n\n  // async version\n  var i = 1, j;\n  function outer() {\n    if(i > len) {\n      // done\n      return callback(null, dk);\n    }\n\n    // PRF(P, S || INT(i)) (first iteration)\n    prf.start(null, null);\n    prf.update(s);\n    prf.update(forge.util.int32ToBytes(i));\n    xor = u_c1 = prf.digest().getBytes();\n\n    // PRF(P, u_{c-1}) (other iterations)\n    j = 2;\n    inner();\n  }\n\n  function inner() {\n    if(j <= c) {\n      prf.start(null, null);\n      prf.update(u_c1);\n      u_c = prf.digest().getBytes();\n      // F(p, s, c, i)\n      xor = forge.util.xorBytes(xor, u_c, hLen);\n      u_c1 = u_c;\n      ++j;\n      return forge.util.setImmediate(inner);\n    }\n\n    /* 4. Concatenate the blocks and extract the first dkLen octets to\n      produce a derived key DK:\n\n      DK = T_1 || T_2 ||  ...  || T_len<0..r-1> */\n    dk += (i < len) ? xor : xor.substr(0, r);\n\n    ++i;\n    outer();\n  }\n\n  outer();\n};\n","/**\n * Secure Hash Algorithm with 256-bit digest (SHA-256) implementation.\n *\n * See FIPS 180-2 for details.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2015 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./md');\nrequire('./util');\n\nvar sha256 = module.exports = forge.sha256 = forge.sha256 || {};\nforge.md.sha256 = forge.md.algorithms.sha256 = sha256;\n\n/**\n * Creates a SHA-256 message digest object.\n *\n * @return a message digest object.\n */\nsha256.create = function() {\n  // do initialization as necessary\n  if(!_initialized) {\n    _init();\n  }\n\n  // SHA-256 state contains eight 32-bit integers\n  var _state = null;\n\n  // input buffer\n  var _input = forge.util.createBuffer();\n\n  // used for word storage\n  var _w = new Array(64);\n\n  // message digest object\n  var md = {\n    algorithm: 'sha256',\n    blockLength: 64,\n    digestLength: 32,\n    // 56-bit length of message so far (does not including padding)\n    messageLength: 0,\n    // true message length\n    fullMessageLength: null,\n    // size of message length in bytes\n    messageLengthSize: 8\n  };\n\n  /**\n   * Starts the digest.\n   *\n   * @return this digest object.\n   */\n  md.start = function() {\n    // up to 56-bit message length for convenience\n    md.messageLength = 0;\n\n    // full message length (set md.messageLength64 for backwards-compatibility)\n    md.fullMessageLength = md.messageLength64 = [];\n    var int32s = md.messageLengthSize / 4;\n    for(var i = 0; i < int32s; ++i) {\n      md.fullMessageLength.push(0);\n    }\n    _input = forge.util.createBuffer();\n    _state = {\n      h0: 0x6A09E667,\n      h1: 0xBB67AE85,\n      h2: 0x3C6EF372,\n      h3: 0xA54FF53A,\n      h4: 0x510E527F,\n      h5: 0x9B05688C,\n      h6: 0x1F83D9AB,\n      h7: 0x5BE0CD19\n    };\n    return md;\n  };\n  // start digest automatically for first time\n  md.start();\n\n  /**\n   * Updates the digest with the given message input. The given input can\n   * treated as raw input (no encoding will be applied) or an encoding of\n   * 'utf8' maybe given to encode the input using UTF-8.\n   *\n   * @param msg the message input to update with.\n   * @param encoding the encoding to use (default: 'raw', other: 'utf8').\n   *\n   * @return this digest object.\n   */\n  md.update = function(msg, encoding) {\n    if(encoding === 'utf8') {\n      msg = forge.util.encodeUtf8(msg);\n    }\n\n    // update message length\n    var len = msg.length;\n    md.messageLength += len;\n    len = [(len / 0x100000000) >>> 0, len >>> 0];\n    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {\n      md.fullMessageLength[i] += len[1];\n      len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0);\n      md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0;\n      len[0] = ((len[1] / 0x100000000) >>> 0);\n    }\n\n    // add bytes to input buffer\n    _input.putBytes(msg);\n\n    // process bytes\n    _update(_state, _w, _input);\n\n    // compact input buffer every 2K or if empty\n    if(_input.read > 2048 || _input.length() === 0) {\n      _input.compact();\n    }\n\n    return md;\n  };\n\n  /**\n   * Produces the digest.\n   *\n   * @return a byte buffer containing the digest value.\n   */\n  md.digest = function() {\n    /* Note: Here we copy the remaining bytes in the input buffer and\n    add the appropriate SHA-256 padding. Then we do the final update\n    on a copy of the state so that if the user wants to get\n    intermediate digests they can do so. */\n\n    /* Determine the number of bytes that must be added to the message\n    to ensure its length is congruent to 448 mod 512. In other words,\n    the data to be digested must be a multiple of 512 bits (or 128 bytes).\n    This data includes the message, some padding, and the length of the\n    message. Since the length of the message will be encoded as 8 bytes (64\n    bits), that means that the last segment of the data must have 56 bytes\n    (448 bits) of message and padding. Therefore, the length of the message\n    plus the padding must be congruent to 448 mod 512 because\n    512 - 128 = 448.\n\n    In order to fill up the message length it must be filled with\n    padding that begins with 1 bit followed by all 0 bits. Padding\n    must *always* be present, so if the message length is already\n    congruent to 448 mod 512, then 512 padding bits must be added. */\n\n    var finalBlock = forge.util.createBuffer();\n    finalBlock.putBytes(_input.bytes());\n\n    // compute remaining size to be digested (include message length size)\n    var remaining = (\n      md.fullMessageLength[md.fullMessageLength.length - 1] +\n      md.messageLengthSize);\n\n    // add padding for overflow blockSize - overflow\n    // _padding starts with 1 byte with first bit is set (byte value 128), then\n    // there may be up to (blockSize - 1) other pad bytes\n    var overflow = remaining & (md.blockLength - 1);\n    finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow));\n\n    // serialize message length in bits in big-endian order; since length\n    // is stored in bytes we multiply by 8 and add carry from next int\n    var next, carry;\n    var bits = md.fullMessageLength[0] * 8;\n    for(var i = 0; i < md.fullMessageLength.length - 1; ++i) {\n      next = md.fullMessageLength[i + 1] * 8;\n      carry = (next / 0x100000000) >>> 0;\n      bits += carry;\n      finalBlock.putInt32(bits >>> 0);\n      bits = next >>> 0;\n    }\n    finalBlock.putInt32(bits);\n\n    var s2 = {\n      h0: _state.h0,\n      h1: _state.h1,\n      h2: _state.h2,\n      h3: _state.h3,\n      h4: _state.h4,\n      h5: _state.h5,\n      h6: _state.h6,\n      h7: _state.h7\n    };\n    _update(s2, _w, finalBlock);\n    var rval = forge.util.createBuffer();\n    rval.putInt32(s2.h0);\n    rval.putInt32(s2.h1);\n    rval.putInt32(s2.h2);\n    rval.putInt32(s2.h3);\n    rval.putInt32(s2.h4);\n    rval.putInt32(s2.h5);\n    rval.putInt32(s2.h6);\n    rval.putInt32(s2.h7);\n    return rval;\n  };\n\n  return md;\n};\n\n// sha-256 padding bytes not initialized yet\nvar _padding = null;\nvar _initialized = false;\n\n// table of constants\nvar _k = null;\n\n/**\n * Initializes the constant tables.\n */\nfunction _init() {\n  // create padding\n  _padding = String.fromCharCode(128);\n  _padding += forge.util.fillString(String.fromCharCode(0x00), 64);\n\n  // create K table for SHA-256\n  _k = [\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n    0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n    0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n    0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n    0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n    0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];\n\n  // now initialized\n  _initialized = true;\n}\n\n/**\n * Updates a SHA-256 state with the given byte buffer.\n *\n * @param s the SHA-256 state to update.\n * @param w the array to use to store words.\n * @param bytes the byte buffer to update with.\n */\nfunction _update(s, w, bytes) {\n  // consume 512 bit (64 byte) chunks\n  var t1, t2, s0, s1, ch, maj, i, a, b, c, d, e, f, g, h;\n  var len = bytes.length();\n  while(len >= 64) {\n    // the w array will be populated with sixteen 32-bit big-endian words\n    // and then extended into 64 32-bit words according to SHA-256\n    for(i = 0; i < 16; ++i) {\n      w[i] = bytes.getInt32();\n    }\n    for(; i < 64; ++i) {\n      // XOR word 2 words ago rot right 17, rot right 19, shft right 10\n      t1 = w[i - 2];\n      t1 =\n        ((t1 >>> 17) | (t1 << 15)) ^\n        ((t1 >>> 19) | (t1 << 13)) ^\n        (t1 >>> 10);\n      // XOR word 15 words ago rot right 7, rot right 18, shft right 3\n      t2 = w[i - 15];\n      t2 =\n        ((t2 >>> 7) | (t2 << 25)) ^\n        ((t2 >>> 18) | (t2 << 14)) ^\n        (t2 >>> 3);\n      // sum(t1, word 7 ago, t2, word 16 ago) modulo 2^32\n      w[i] = (t1 + w[i - 7] + t2 + w[i - 16]) | 0;\n    }\n\n    // initialize hash value for this chunk\n    a = s.h0;\n    b = s.h1;\n    c = s.h2;\n    d = s.h3;\n    e = s.h4;\n    f = s.h5;\n    g = s.h6;\n    h = s.h7;\n\n    // round function\n    for(i = 0; i < 64; ++i) {\n      // Sum1(e)\n      s1 =\n        ((e >>> 6) | (e << 26)) ^\n        ((e >>> 11) | (e << 21)) ^\n        ((e >>> 25) | (e << 7));\n      // Ch(e, f, g) (optimized the same way as SHA-1)\n      ch = g ^ (e & (f ^ g));\n      // Sum0(a)\n      s0 =\n        ((a >>> 2) | (a << 30)) ^\n        ((a >>> 13) | (a << 19)) ^\n        ((a >>> 22) | (a << 10));\n      // Maj(a, b, c) (optimized the same way as SHA-1)\n      maj = (a & b) | (c & (a ^ b));\n\n      // main algorithm\n      t1 = h + s1 + ch + _k[i] + w[i];\n      t2 = s0 + maj;\n      h = g;\n      g = f;\n      f = e;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      // can't truncate with `| 0`\n      e = (d + t1) >>> 0;\n      d = c;\n      c = b;\n      b = a;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      // can't truncate with `| 0`\n      a = (t1 + t2) >>> 0;\n    }\n\n    // update hash state\n    s.h0 = (s.h0 + a) | 0;\n    s.h1 = (s.h1 + b) | 0;\n    s.h2 = (s.h2 + c) | 0;\n    s.h3 = (s.h3 + d) | 0;\n    s.h4 = (s.h4 + e) | 0;\n    s.h5 = (s.h5 + f) | 0;\n    s.h6 = (s.h6 + g) | 0;\n    s.h7 = (s.h7 + h) | 0;\n    len -= 64;\n  }\n}\n","/**\n * A javascript implementation of a cryptographically-secure\n * Pseudo Random Number Generator (PRNG). The Fortuna algorithm is followed\n * here though the use of SHA-256 is not enforced; when generating an\n * a PRNG context, the hashing algorithm and block cipher used for\n * the generator are specified via a plugin.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./util');\n\nvar _crypto = null;\nif(forge.util.isNodejs && !forge.options.usePureJavaScript &&\n  !process.versions['node-webkit']) {\n  _crypto = require('crypto');\n}\n\n/* PRNG API */\nvar prng = module.exports = forge.prng = forge.prng || {};\n\n/**\n * Creates a new PRNG context.\n *\n * A PRNG plugin must be passed in that will provide:\n *\n * 1. A function that initializes the key and seed of a PRNG context. It\n *   will be given a 16 byte key and a 16 byte seed. Any key expansion\n *   or transformation of the seed from a byte string into an array of\n *   integers (or similar) should be performed.\n * 2. The cryptographic function used by the generator. It takes a key and\n *   a seed.\n * 3. A seed increment function. It takes the seed and returns seed + 1.\n * 4. An api to create a message digest.\n *\n * For an example, see random.js.\n *\n * @param plugin the PRNG plugin to use.\n */\nprng.create = function(plugin) {\n  var ctx = {\n    plugin: plugin,\n    key: null,\n    seed: null,\n    time: null,\n    // number of reseeds so far\n    reseeds: 0,\n    // amount of data generated so far\n    generated: 0,\n    // no initial key bytes\n    keyBytes: ''\n  };\n\n  // create 32 entropy pools (each is a message digest)\n  var md = plugin.md;\n  var pools = new Array(32);\n  for(var i = 0; i < 32; ++i) {\n    pools[i] = md.create();\n  }\n  ctx.pools = pools;\n\n  // entropy pools are written to cyclically, starting at index 0\n  ctx.pool = 0;\n\n  /**\n   * Generates random bytes. The bytes may be generated synchronously or\n   * asynchronously. Web workers must use the asynchronous interface or\n   * else the behavior is undefined.\n   *\n   * @param count the number of random bytes to generate.\n   * @param [callback(err, bytes)] called once the operation completes.\n   *\n   * @return count random bytes as a string.\n   */\n  ctx.generate = function(count, callback) {\n    // do synchronously\n    if(!callback) {\n      return ctx.generateSync(count);\n    }\n\n    // simple generator using counter-based CBC\n    var cipher = ctx.plugin.cipher;\n    var increment = ctx.plugin.increment;\n    var formatKey = ctx.plugin.formatKey;\n    var formatSeed = ctx.plugin.formatSeed;\n    var b = forge.util.createBuffer();\n\n    // paranoid deviation from Fortuna:\n    // reset key for every request to protect previously\n    // generated random bytes should the key be discovered;\n    // there is no 100ms based reseeding because of this\n    // forced reseed for every `generate` call\n    ctx.key = null;\n\n    generate();\n\n    function generate(err) {\n      if(err) {\n        return callback(err);\n      }\n\n      // sufficient bytes generated\n      if(b.length() >= count) {\n        return callback(null, b.getBytes(count));\n      }\n\n      // if amount of data generated is greater than 1 MiB, trigger reseed\n      if(ctx.generated > 0xfffff) {\n        ctx.key = null;\n      }\n\n      if(ctx.key === null) {\n        // prevent stack overflow\n        return forge.util.nextTick(function() {\n          _reseed(generate);\n        });\n      }\n\n      // generate the random bytes\n      var bytes = cipher(ctx.key, ctx.seed);\n      ctx.generated += bytes.length;\n      b.putBytes(bytes);\n\n      // generate bytes for a new key and seed\n      ctx.key = formatKey(cipher(ctx.key, increment(ctx.seed)));\n      ctx.seed = formatSeed(cipher(ctx.key, ctx.seed));\n\n      forge.util.setImmediate(generate);\n    }\n  };\n\n  /**\n   * Generates random bytes synchronously.\n   *\n   * @param count the number of random bytes to generate.\n   *\n   * @return count random bytes as a string.\n   */\n  ctx.generateSync = function(count) {\n    // simple generator using counter-based CBC\n    var cipher = ctx.plugin.cipher;\n    var increment = ctx.plugin.increment;\n    var formatKey = ctx.plugin.formatKey;\n    var formatSeed = ctx.plugin.formatSeed;\n\n    // paranoid deviation from Fortuna:\n    // reset key for every request to protect previously\n    // generated random bytes should the key be discovered;\n    // there is no 100ms based reseeding because of this\n    // forced reseed for every `generateSync` call\n    ctx.key = null;\n\n    var b = forge.util.createBuffer();\n    while(b.length() < count) {\n      // if amount of data generated is greater than 1 MiB, trigger reseed\n      if(ctx.generated > 0xfffff) {\n        ctx.key = null;\n      }\n\n      if(ctx.key === null) {\n        _reseedSync();\n      }\n\n      // generate the random bytes\n      var bytes = cipher(ctx.key, ctx.seed);\n      ctx.generated += bytes.length;\n      b.putBytes(bytes);\n\n      // generate bytes for a new key and seed\n      ctx.key = formatKey(cipher(ctx.key, increment(ctx.seed)));\n      ctx.seed = formatSeed(cipher(ctx.key, ctx.seed));\n    }\n\n    return b.getBytes(count);\n  };\n\n  /**\n   * Private function that asynchronously reseeds a generator.\n   *\n   * @param callback(err) called once the operation completes.\n   */\n  function _reseed(callback) {\n    if(ctx.pools[0].messageLength >= 32) {\n      _seed();\n      return callback();\n    }\n    // not enough seed data...\n    var needed = (32 - ctx.pools[0].messageLength) << 5;\n    ctx.seedFile(needed, function(err, bytes) {\n      if(err) {\n        return callback(err);\n      }\n      ctx.collect(bytes);\n      _seed();\n      callback();\n    });\n  }\n\n  /**\n   * Private function that synchronously reseeds a generator.\n   */\n  function _reseedSync() {\n    if(ctx.pools[0].messageLength >= 32) {\n      return _seed();\n    }\n    // not enough seed data...\n    var needed = (32 - ctx.pools[0].messageLength) << 5;\n    ctx.collect(ctx.seedFileSync(needed));\n    _seed();\n  }\n\n  /**\n   * Private function that seeds a generator once enough bytes are available.\n   */\n  function _seed() {\n    // update reseed count\n    ctx.reseeds = (ctx.reseeds === 0xffffffff) ? 0 : ctx.reseeds + 1;\n\n    // goal is to update `key` via:\n    // key = hash(key + s)\n    //   where 's' is all collected entropy from selected pools, then...\n\n    // create a plugin-based message digest\n    var md = ctx.plugin.md.create();\n\n    // consume current key bytes\n    md.update(ctx.keyBytes);\n\n    // digest the entropy of pools whose index k meet the\n    // condition 'n mod 2^k == 0' where n is the number of reseeds\n    var _2powK = 1;\n    for(var k = 0; k < 32; ++k) {\n      if(ctx.reseeds % _2powK === 0) {\n        md.update(ctx.pools[k].digest().getBytes());\n        ctx.pools[k].start();\n      }\n      _2powK = _2powK << 1;\n    }\n\n    // get digest for key bytes\n    ctx.keyBytes = md.digest().getBytes();\n\n    // paranoid deviation from Fortuna:\n    // update `seed` via `seed = hash(key)`\n    // instead of initializing to zero once and only\n    // ever incrementing it\n    md.start();\n    md.update(ctx.keyBytes);\n    var seedBytes = md.digest().getBytes();\n\n    // update state\n    ctx.key = ctx.plugin.formatKey(ctx.keyBytes);\n    ctx.seed = ctx.plugin.formatSeed(seedBytes);\n    ctx.generated = 0;\n  }\n\n  /**\n   * The built-in default seedFile. This seedFile is used when entropy\n   * is needed immediately.\n   *\n   * @param needed the number of bytes that are needed.\n   *\n   * @return the random bytes.\n   */\n  function defaultSeedFile(needed) {\n    // use window.crypto.getRandomValues strong source of entropy if available\n    var getRandomValues = null;\n    var globalScope = forge.util.globalScope;\n    var _crypto = globalScope.crypto || globalScope.msCrypto;\n    if(_crypto && _crypto.getRandomValues) {\n      getRandomValues = function(arr) {\n        return _crypto.getRandomValues(arr);\n      };\n    }\n\n    var b = forge.util.createBuffer();\n    if(getRandomValues) {\n      while(b.length() < needed) {\n        // max byte length is 65536 before QuotaExceededError is thrown\n        // http://www.w3.org/TR/WebCryptoAPI/#RandomSource-method-getRandomValues\n        var count = Math.max(1, Math.min(needed - b.length(), 65536) / 4);\n        var entropy = new Uint32Array(Math.floor(count));\n        try {\n          getRandomValues(entropy);\n          for(var i = 0; i < entropy.length; ++i) {\n            b.putInt32(entropy[i]);\n          }\n        } catch(e) {\n          /* only ignore QuotaExceededError */\n          if(!(typeof QuotaExceededError !== 'undefined' &&\n            e instanceof QuotaExceededError)) {\n            throw e;\n          }\n        }\n      }\n    }\n\n    // be sad and add some weak random data\n    if(b.length() < needed) {\n      /* Draws from Park-Miller \"minimal standard\" 31 bit PRNG,\n      implemented with David G. Carta's optimization: with 32 bit math\n      and without division (Public Domain). */\n      var hi, lo, next;\n      var seed = Math.floor(Math.random() * 0x010000);\n      while(b.length() < needed) {\n        lo = 16807 * (seed & 0xFFFF);\n        hi = 16807 * (seed >> 16);\n        lo += (hi & 0x7FFF) << 16;\n        lo += hi >> 15;\n        lo = (lo & 0x7FFFFFFF) + (lo >> 31);\n        seed = lo & 0xFFFFFFFF;\n\n        // consume lower 3 bytes of seed\n        for(var i = 0; i < 3; ++i) {\n          // throw in more pseudo random\n          next = seed >>> (i << 3);\n          next ^= Math.floor(Math.random() * 0x0100);\n          b.putByte(next & 0xFF);\n        }\n      }\n    }\n\n    return b.getBytes(needed);\n  }\n  // initialize seed file APIs\n  if(_crypto) {\n    // use nodejs async API\n    ctx.seedFile = function(needed, callback) {\n      _crypto.randomBytes(needed, function(err, bytes) {\n        if(err) {\n          return callback(err);\n        }\n        callback(null, bytes.toString());\n      });\n    };\n    // use nodejs sync API\n    ctx.seedFileSync = function(needed) {\n      return _crypto.randomBytes(needed).toString();\n    };\n  } else {\n    ctx.seedFile = function(needed, callback) {\n      try {\n        callback(null, defaultSeedFile(needed));\n      } catch(e) {\n        callback(e);\n      }\n    };\n    ctx.seedFileSync = defaultSeedFile;\n  }\n\n  /**\n   * Adds entropy to a prng ctx's accumulator.\n   *\n   * @param bytes the bytes of entropy as a string.\n   */\n  ctx.collect = function(bytes) {\n    // iterate over pools distributing entropy cyclically\n    var count = bytes.length;\n    for(var i = 0; i < count; ++i) {\n      ctx.pools[ctx.pool].update(bytes.substr(i, 1));\n      ctx.pool = (ctx.pool === 31) ? 0 : ctx.pool + 1;\n    }\n  };\n\n  /**\n   * Collects an integer of n bits.\n   *\n   * @param i the integer entropy.\n   * @param n the number of bits in the integer.\n   */\n  ctx.collectInt = function(i, n) {\n    var bytes = '';\n    for(var x = 0; x < n; x += 8) {\n      bytes += String.fromCharCode((i >> x) & 0xFF);\n    }\n    ctx.collect(bytes);\n  };\n\n  /**\n   * Registers a Web Worker to receive immediate entropy from the main thread.\n   * This method is required until Web Workers can access the native crypto\n   * API. This method should be called twice for each created worker, once in\n   * the main thread, and once in the worker itself.\n   *\n   * @param worker the worker to register.\n   */\n  ctx.registerWorker = function(worker) {\n    // worker receives random bytes\n    if(worker === self) {\n      ctx.seedFile = function(needed, callback) {\n        function listener(e) {\n          var data = e.data;\n          if(data.forge && data.forge.prng) {\n            self.removeEventListener('message', listener);\n            callback(data.forge.prng.err, data.forge.prng.bytes);\n          }\n        }\n        self.addEventListener('message', listener);\n        self.postMessage({forge: {prng: {needed: needed}}});\n      };\n    } else {\n      // main thread sends random bytes upon request\n      var listener = function(e) {\n        var data = e.data;\n        if(data.forge && data.forge.prng) {\n          ctx.seedFile(data.forge.prng.needed, function(err, bytes) {\n            worker.postMessage({forge: {prng: {err: err, bytes: bytes}}});\n          });\n        }\n      };\n      // TODO: do we need to remove the event listener when the worker dies?\n      worker.addEventListener('message', listener);\n    }\n  };\n\n  return ctx;\n};\n","/**\n * An API for getting cryptographically-secure random bytes. The bytes are\n * generated using the Fortuna algorithm devised by Bruce Schneier and\n * Niels Ferguson.\n *\n * Getting strong random bytes is not yet easy to do in javascript. The only\n * truish random entropy that can be collected is from the mouse, keyboard, or\n * from timing with respect to page loads, etc. This generator makes a poor\n * attempt at providing random bytes when those sources haven't yet provided\n * enough entropy to initially seed or to reseed the PRNG.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2009-2014 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./aes');\nrequire('./sha256');\nrequire('./prng');\nrequire('./util');\n\n(function() {\n\n// forge.random already defined\nif(forge.random && forge.random.getBytes) {\n  module.exports = forge.random;\n  return;\n}\n\n(function(jQuery) {\n\n// the default prng plugin, uses AES-128\nvar prng_aes = {};\nvar _prng_aes_output = new Array(4);\nvar _prng_aes_buffer = forge.util.createBuffer();\nprng_aes.formatKey = function(key) {\n  // convert the key into 32-bit integers\n  var tmp = forge.util.createBuffer(key);\n  key = new Array(4);\n  key[0] = tmp.getInt32();\n  key[1] = tmp.getInt32();\n  key[2] = tmp.getInt32();\n  key[3] = tmp.getInt32();\n\n  // return the expanded key\n  return forge.aes._expandKey(key, false);\n};\nprng_aes.formatSeed = function(seed) {\n  // convert seed into 32-bit integers\n  var tmp = forge.util.createBuffer(seed);\n  seed = new Array(4);\n  seed[0] = tmp.getInt32();\n  seed[1] = tmp.getInt32();\n  seed[2] = tmp.getInt32();\n  seed[3] = tmp.getInt32();\n  return seed;\n};\nprng_aes.cipher = function(key, seed) {\n  forge.aes._updateBlock(key, seed, _prng_aes_output, false);\n  _prng_aes_buffer.putInt32(_prng_aes_output[0]);\n  _prng_aes_buffer.putInt32(_prng_aes_output[1]);\n  _prng_aes_buffer.putInt32(_prng_aes_output[2]);\n  _prng_aes_buffer.putInt32(_prng_aes_output[3]);\n  return _prng_aes_buffer.getBytes();\n};\nprng_aes.increment = function(seed) {\n  // FIXME: do we care about carry or signed issues?\n  ++seed[3];\n  return seed;\n};\nprng_aes.md = forge.md.sha256;\n\n/**\n * Creates a new PRNG.\n */\nfunction spawnPrng() {\n  var ctx = forge.prng.create(prng_aes);\n\n  /**\n   * Gets random bytes. If a native secure crypto API is unavailable, this\n   * method tries to make the bytes more unpredictable by drawing from data that\n   * can be collected from the user of the browser, eg: mouse movement.\n   *\n   * If a callback is given, this method will be called asynchronously.\n   *\n   * @param count the number of random bytes to get.\n   * @param [callback(err, bytes)] called once the operation completes.\n   *\n   * @return the random bytes in a string.\n   */\n  ctx.getBytes = function(count, callback) {\n    return ctx.generate(count, callback);\n  };\n\n  /**\n   * Gets random bytes asynchronously. If a native secure crypto API is\n   * unavailable, this method tries to make the bytes more unpredictable by\n   * drawing from data that can be collected from the user of the browser,\n   * eg: mouse movement.\n   *\n   * @param count the number of random bytes to get.\n   *\n   * @return the random bytes in a string.\n   */\n  ctx.getBytesSync = function(count) {\n    return ctx.generate(count);\n  };\n\n  return ctx;\n}\n\n// create default prng context\nvar _ctx = spawnPrng();\n\n// add other sources of entropy only if window.crypto.getRandomValues is not\n// available -- otherwise this source will be automatically used by the prng\nvar getRandomValues = null;\nvar globalScope = forge.util.globalScope;\nvar _crypto = globalScope.crypto || globalScope.msCrypto;\nif(_crypto && _crypto.getRandomValues) {\n  getRandomValues = function(arr) {\n    return _crypto.getRandomValues(arr);\n  };\n}\n\nif(forge.options.usePureJavaScript ||\n  (!forge.util.isNodejs && !getRandomValues)) {\n  // if this is a web worker, do not use weak entropy, instead register to\n  // receive strong entropy asynchronously from the main thread\n  if(typeof window === 'undefined' || window.document === undefined) {\n    // FIXME:\n  }\n\n  // get load time entropy\n  _ctx.collectInt(+new Date(), 32);\n\n  // add some entropy from navigator object\n  if(typeof(navigator) !== 'undefined') {\n    var _navBytes = '';\n    for(var key in navigator) {\n      try {\n        if(typeof(navigator[key]) == 'string') {\n          _navBytes += navigator[key];\n        }\n      } catch(e) {\n        /* Some navigator keys might not be accessible, e.g. the geolocation\n          attribute throws an exception if touched in Mozilla chrome://\n          context.\n\n          Silently ignore this and just don't use this as a source of\n          entropy. */\n      }\n    }\n    _ctx.collect(_navBytes);\n    _navBytes = null;\n  }\n\n  // add mouse and keyboard collectors if jquery is available\n  if(jQuery) {\n    // set up mouse entropy capture\n    jQuery().mousemove(function(e) {\n      // add mouse coords\n      _ctx.collectInt(e.clientX, 16);\n      _ctx.collectInt(e.clientY, 16);\n    });\n\n    // set up keyboard entropy capture\n    jQuery().keypress(function(e) {\n      _ctx.collectInt(e.charCode, 8);\n    });\n  }\n}\n\n/* Random API */\nif(!forge.random) {\n  forge.random = _ctx;\n} else {\n  // extend forge.random with _ctx\n  for(var key in _ctx) {\n    forge.random[key] = _ctx[key];\n  }\n}\n\n// expose spawn PRNG\nforge.random.createInstance = spawnPrng;\n\nmodule.exports = forge.random;\n\n})(typeof(jQuery) !== 'undefined' ? jQuery : null);\n\n})();\n","/**\n * RC2 implementation.\n *\n * @author Stefan Siegl\n *\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n *\n * Information on the RC2 cipher is available from RFC #2268,\n * http://www.ietf.org/rfc/rfc2268.txt\n */\nvar forge = require('./forge');\nrequire('./util');\n\nvar piTable = [\n  0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d,\n  0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2,\n  0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x09, 0x81, 0x7d, 0x32,\n  0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0x0b, 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82,\n  0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc,\n  0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26,\n  0x6f, 0xbf, 0x0e, 0xda, 0x46, 0x69, 0x07, 0x57, 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x03,\n  0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, 0x06, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7,\n  0x08, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a,\n  0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, 0x04, 0x18, 0xa4, 0xec,\n  0xc2, 0xe0, 0x41, 0x6e, 0x0f, 0x51, 0xcb, 0xcc, 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39,\n  0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x02, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31,\n  0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, 0x05, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9,\n  0xd3, 0x00, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, 0x63, 0x16, 0x01, 0x3f, 0x58, 0xe2, 0x89, 0xa9,\n  0x0d, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, 0x0c, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e,\n  0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0x0a, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad\n];\n\nvar s = [1, 2, 3, 5];\n\n/**\n * Rotate a word left by given number of bits.\n *\n * Bits that are shifted out on the left are put back in on the right\n * hand side.\n *\n * @param word The word to shift left.\n * @param bits The number of bits to shift by.\n * @return The rotated word.\n */\nvar rol = function(word, bits) {\n  return ((word << bits) & 0xffff) | ((word & 0xffff) >> (16 - bits));\n};\n\n/**\n * Rotate a word right by given number of bits.\n *\n * Bits that are shifted out on the right are put back in on the left\n * hand side.\n *\n * @param word The word to shift right.\n * @param bits The number of bits to shift by.\n * @return The rotated word.\n */\nvar ror = function(word, bits) {\n  return ((word & 0xffff) >> bits) | ((word << (16 - bits)) & 0xffff);\n};\n\n/* RC2 API */\nmodule.exports = forge.rc2 = forge.rc2 || {};\n\n/**\n * Perform RC2 key expansion as per RFC #2268, section 2.\n *\n * @param key variable-length user key (between 1 and 128 bytes)\n * @param effKeyBits number of effective key bits (default: 128)\n * @return the expanded RC2 key (ByteBuffer of 128 bytes)\n */\nforge.rc2.expandKey = function(key, effKeyBits) {\n  if(typeof key === 'string') {\n    key = forge.util.createBuffer(key);\n  }\n  effKeyBits = effKeyBits || 128;\n\n  /* introduce variables that match the names used in RFC #2268 */\n  var L = key;\n  var T = key.length();\n  var T1 = effKeyBits;\n  var T8 = Math.ceil(T1 / 8);\n  var TM = 0xff >> (T1 & 0x07);\n  var i;\n\n  for(i = T; i < 128; i++) {\n    L.putByte(piTable[(L.at(i - 1) + L.at(i - T)) & 0xff]);\n  }\n\n  L.setAt(128 - T8, piTable[L.at(128 - T8) & TM]);\n\n  for(i = 127 - T8; i >= 0; i--) {\n    L.setAt(i, piTable[L.at(i + 1) ^ L.at(i + T8)]);\n  }\n\n  return L;\n};\n\n/**\n * Creates a RC2 cipher object.\n *\n * @param key the symmetric key to use (as base for key generation).\n * @param bits the number of effective key bits.\n * @param encrypt false for decryption, true for encryption.\n *\n * @return the cipher.\n */\nvar createCipher = function(key, bits, encrypt) {\n  var _finish = false, _input = null, _output = null, _iv = null;\n  var mixRound, mashRound;\n  var i, j, K = [];\n\n  /* Expand key and fill into K[] Array */\n  key = forge.rc2.expandKey(key, bits);\n  for(i = 0; i < 64; i++) {\n    K.push(key.getInt16Le());\n  }\n\n  if(encrypt) {\n    /**\n     * Perform one mixing round \"in place\".\n     *\n     * @param R Array of four words to perform mixing on.\n     */\n    mixRound = function(R) {\n      for(i = 0; i < 4; i++) {\n        R[i] += K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) +\n          ((~R[(i + 3) % 4]) & R[(i + 1) % 4]);\n        R[i] = rol(R[i], s[i]);\n        j++;\n      }\n    };\n\n    /**\n     * Perform one mashing round \"in place\".\n     *\n     * @param R Array of four words to perform mashing on.\n     */\n    mashRound = function(R) {\n      for(i = 0; i < 4; i++) {\n        R[i] += K[R[(i + 3) % 4] & 63];\n      }\n    };\n  } else {\n    /**\n     * Perform one r-mixing round \"in place\".\n     *\n     * @param R Array of four words to perform mixing on.\n     */\n    mixRound = function(R) {\n      for(i = 3; i >= 0; i--) {\n        R[i] = ror(R[i], s[i]);\n        R[i] -= K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) +\n          ((~R[(i + 3) % 4]) & R[(i + 1) % 4]);\n        j--;\n      }\n    };\n\n    /**\n     * Perform one r-mashing round \"in place\".\n     *\n     * @param R Array of four words to perform mashing on.\n     */\n    mashRound = function(R) {\n      for(i = 3; i >= 0; i--) {\n        R[i] -= K[R[(i + 3) % 4] & 63];\n      }\n    };\n  }\n\n  /**\n   * Run the specified cipher execution plan.\n   *\n   * This function takes four words from the input buffer, applies the IV on\n   * it (if requested) and runs the provided execution plan.\n   *\n   * The plan must be put together in form of a array of arrays.  Where the\n   * outer one is simply a list of steps to perform and the inner one needs\n   * to have two elements: the first one telling how many rounds to perform,\n   * the second one telling what to do (i.e. the function to call).\n   *\n   * @param {Array} plan The plan to execute.\n   */\n  var runPlan = function(plan) {\n    var R = [];\n\n    /* Get data from input buffer and fill the four words into R */\n    for(i = 0; i < 4; i++) {\n      var val = _input.getInt16Le();\n\n      if(_iv !== null) {\n        if(encrypt) {\n          /* We're encrypting, apply the IV first. */\n          val ^= _iv.getInt16Le();\n        } else {\n          /* We're decryption, keep cipher text for next block. */\n          _iv.putInt16Le(val);\n        }\n      }\n\n      R.push(val & 0xffff);\n    }\n\n    /* Reset global \"j\" variable as per spec. */\n    j = encrypt ? 0 : 63;\n\n    /* Run execution plan. */\n    for(var ptr = 0; ptr < plan.length; ptr++) {\n      for(var ctr = 0; ctr < plan[ptr][0]; ctr++) {\n        plan[ptr][1](R);\n      }\n    }\n\n    /* Write back result to output buffer. */\n    for(i = 0; i < 4; i++) {\n      if(_iv !== null) {\n        if(encrypt) {\n          /* We're encrypting in CBC-mode, feed back encrypted bytes into\n             IV buffer to carry it forward to next block. */\n          _iv.putInt16Le(R[i]);\n        } else {\n          R[i] ^= _iv.getInt16Le();\n        }\n      }\n\n      _output.putInt16Le(R[i]);\n    }\n  };\n\n  /* Create cipher object */\n  var cipher = null;\n  cipher = {\n    /**\n     * Starts or restarts the encryption or decryption process, whichever\n     * was previously configured.\n     *\n     * To use the cipher in CBC mode, iv may be given either as a string\n     * of bytes, or as a byte buffer.  For ECB mode, give null as iv.\n     *\n     * @param iv the initialization vector to use, null for ECB mode.\n     * @param output the output the buffer to write to, null to create one.\n     */\n    start: function(iv, output) {\n      if(iv) {\n        /* CBC mode */\n        if(typeof iv === 'string') {\n          iv = forge.util.createBuffer(iv);\n        }\n      }\n\n      _finish = false;\n      _input = forge.util.createBuffer();\n      _output = output || new forge.util.createBuffer();\n      _iv = iv;\n\n      cipher.output = _output;\n    },\n\n    /**\n     * Updates the next block.\n     *\n     * @param input the buffer to read from.\n     */\n    update: function(input) {\n      if(!_finish) {\n        // not finishing, so fill the input buffer with more input\n        _input.putBuffer(input);\n      }\n\n      while(_input.length() >= 8) {\n        runPlan([\n            [ 5, mixRound ],\n            [ 1, mashRound ],\n            [ 6, mixRound ],\n            [ 1, mashRound ],\n            [ 5, mixRound ]\n          ]);\n      }\n    },\n\n    /**\n     * Finishes encrypting or decrypting.\n     *\n     * @param pad a padding function to use, null for PKCS#7 padding,\n     *           signature(blockSize, buffer, decrypt).\n     *\n     * @return true if successful, false on error.\n     */\n    finish: function(pad) {\n      var rval = true;\n\n      if(encrypt) {\n        if(pad) {\n          rval = pad(8, _input, !encrypt);\n        } else {\n          // add PKCS#7 padding to block (each pad byte is the\n          // value of the number of pad bytes)\n          var padding = (_input.length() === 8) ? 8 : (8 - _input.length());\n          _input.fillWithByte(padding, padding);\n        }\n      }\n\n      if(rval) {\n        // do final update\n        _finish = true;\n        cipher.update();\n      }\n\n      if(!encrypt) {\n        // check for error: input data not a multiple of block size\n        rval = (_input.length() === 0);\n        if(rval) {\n          if(pad) {\n            rval = pad(8, _output, !encrypt);\n          } else {\n            // ensure padding byte count is valid\n            var len = _output.length();\n            var count = _output.at(len - 1);\n\n            if(count > len) {\n              rval = false;\n            } else {\n              // trim off padding bytes\n              _output.truncate(count);\n            }\n          }\n        }\n      }\n\n      return rval;\n    }\n  };\n\n  return cipher;\n};\n\n/**\n * Creates an RC2 cipher object to encrypt data in ECB or CBC mode using the\n * given symmetric key. The output will be stored in the 'output' member\n * of the returned cipher.\n *\n * The key and iv may be given as a string of bytes or a byte buffer.\n * The cipher is initialized to use 128 effective key bits.\n *\n * @param key the symmetric key to use.\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n *\n * @return the cipher.\n */\nforge.rc2.startEncrypting = function(key, iv, output) {\n  var cipher = forge.rc2.createEncryptionCipher(key, 128);\n  cipher.start(iv, output);\n  return cipher;\n};\n\n/**\n * Creates an RC2 cipher object to encrypt data in ECB or CBC mode using the\n * given symmetric key.\n *\n * The key may be given as a string of bytes or a byte buffer.\n *\n * To start encrypting call start() on the cipher with an iv and optional\n * output buffer.\n *\n * @param key the symmetric key to use.\n *\n * @return the cipher.\n */\nforge.rc2.createEncryptionCipher = function(key, bits) {\n  return createCipher(key, bits, true);\n};\n\n/**\n * Creates an RC2 cipher object to decrypt data in ECB or CBC mode using the\n * given symmetric key. The output will be stored in the 'output' member\n * of the returned cipher.\n *\n * The key and iv may be given as a string of bytes or a byte buffer.\n * The cipher is initialized to use 128 effective key bits.\n *\n * @param key the symmetric key to use.\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n *\n * @return the cipher.\n */\nforge.rc2.startDecrypting = function(key, iv, output) {\n  var cipher = forge.rc2.createDecryptionCipher(key, 128);\n  cipher.start(iv, output);\n  return cipher;\n};\n\n/**\n * Creates an RC2 cipher object to decrypt data in ECB or CBC mode using the\n * given symmetric key.\n *\n * The key may be given as a string of bytes or a byte buffer.\n *\n * To start decrypting call start() on the cipher with an iv and optional\n * output buffer.\n *\n * @param key the symmetric key to use.\n *\n * @return the cipher.\n */\nforge.rc2.createDecryptionCipher = function(key, bits) {\n  return createCipher(key, bits, false);\n};\n","// Copyright (c) 2005  Tom Wu\n// All Rights Reserved.\n// See \"LICENSE\" for details.\n\n// Basic JavaScript BN library - subset useful for RSA encryption.\n\n/*\nLicensing (LICENSE)\n-------------------\n\nThis software is covered under the following copyright:\n*/\n/*\n * Copyright (c) 2003-2005  Tom Wu\n * All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS-IS\" AND WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY\n * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.\n *\n * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\n * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\n * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\n * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\n * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * In addition, the following condition applies:\n *\n * All redistributions must retain an intact copy of this copyright notice\n * and disclaimer.\n */\n/*\nAddress all questions regarding this license to:\n\n  Tom Wu\n  tjw@cs.Stanford.EDU\n*/\nvar forge = require('./forge');\n\nmodule.exports = forge.jsbn = forge.jsbn || {};\n\n// Bits per digit\nvar dbits;\n\n// JavaScript engine analysis\nvar canary = 0xdeadbeefcafe;\nvar j_lm = ((canary&0xffffff)==0xefcafe);\n\n// (public) Constructor\nfunction BigInteger(a,b,c) {\n  this.data = [];\n  if(a != null)\n    if(\"number\" == typeof a) this.fromNumber(a,b,c);\n    else if(b == null && \"string\" != typeof a) this.fromString(a,256);\n    else this.fromString(a,b);\n}\nforge.jsbn.BigInteger = BigInteger;\n\n// return new, unset BigInteger\nfunction nbi() { return new BigInteger(null); }\n\n// am: Compute w_j += (x*this_i), propagate carries,\n// c is initial carry, returns final carry.\n// c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n// We need to select the fastest one that works in this environment.\n\n// am1: use a single mult and divide to get the high bits,\n// max digit bits should be 26 because\n// max internal value = 2*dvalue^2-2*dvalue (< 2^53)\nfunction am1(i,x,w,j,c,n) {\n  while(--n >= 0) {\n    var v = x*this.data[i++]+w.data[j]+c;\n    c = Math.floor(v/0x4000000);\n    w.data[j++] = v&0x3ffffff;\n  }\n  return c;\n}\n// am2 avoids a big mult-and-extract completely.\n// Max digit bits should be <= 30 because we do bitwise ops\n// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\nfunction am2(i,x,w,j,c,n) {\n  var xl = x&0x7fff, xh = x>>15;\n  while(--n >= 0) {\n    var l = this.data[i]&0x7fff;\n    var h = this.data[i++]>>15;\n    var m = xh*l+h*xl;\n    l = xl*l+((m&0x7fff)<<15)+w.data[j]+(c&0x3fffffff);\n    c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);\n    w.data[j++] = l&0x3fffffff;\n  }\n  return c;\n}\n// Alternately, set max digit bits to 28 since some\n// browsers slow down when dealing with 32-bit numbers.\nfunction am3(i,x,w,j,c,n) {\n  var xl = x&0x3fff, xh = x>>14;\n  while(--n >= 0) {\n    var l = this.data[i]&0x3fff;\n    var h = this.data[i++]>>14;\n    var m = xh*l+h*xl;\n    l = xl*l+((m&0x3fff)<<14)+w.data[j]+c;\n    c = (l>>28)+(m>>14)+xh*h;\n    w.data[j++] = l&0xfffffff;\n  }\n  return c;\n}\n\n// node.js (no browser)\nif(typeof(navigator) === 'undefined')\n{\n   BigInteger.prototype.am = am3;\n   dbits = 28;\n} else if(j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n  BigInteger.prototype.am = am2;\n  dbits = 30;\n} else if(j_lm && (navigator.appName != \"Netscape\")) {\n  BigInteger.prototype.am = am1;\n  dbits = 26;\n} else { // Mozilla/Netscape seems to prefer am3\n  BigInteger.prototype.am = am3;\n  dbits = 28;\n}\n\nBigInteger.prototype.DB = dbits;\nBigInteger.prototype.DM = ((1<<dbits)-1);\nBigInteger.prototype.DV = (1<<dbits);\n\nvar BI_FP = 52;\nBigInteger.prototype.FV = Math.pow(2,BI_FP);\nBigInteger.prototype.F1 = BI_FP-dbits;\nBigInteger.prototype.F2 = 2*dbits-BI_FP;\n\n// Digit conversions\nvar BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\nvar BI_RC = new Array();\nvar rr,vv;\nrr = \"0\".charCodeAt(0);\nfor(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\nrr = \"a\".charCodeAt(0);\nfor(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\nrr = \"A\".charCodeAt(0);\nfor(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\nfunction int2char(n) { return BI_RM.charAt(n); }\nfunction intAt(s,i) {\n  var c = BI_RC[s.charCodeAt(i)];\n  return (c==null)?-1:c;\n}\n\n// (protected) copy this to r\nfunction bnpCopyTo(r) {\n  for(var i = this.t-1; i >= 0; --i) r.data[i] = this.data[i];\n  r.t = this.t;\n  r.s = this.s;\n}\n\n// (protected) set from integer value x, -DV <= x < DV\nfunction bnpFromInt(x) {\n  this.t = 1;\n  this.s = (x<0)?-1:0;\n  if(x > 0) this.data[0] = x;\n  else if(x < -1) this.data[0] = x+this.DV;\n  else this.t = 0;\n}\n\n// return bigint initialized to value\nfunction nbv(i) { var r = nbi(); r.fromInt(i); return r; }\n\n// (protected) set from string and radix\nfunction bnpFromString(s,b) {\n  var k;\n  if(b == 16) k = 4;\n  else if(b == 8) k = 3;\n  else if(b == 256) k = 8; // byte array\n  else if(b == 2) k = 1;\n  else if(b == 32) k = 5;\n  else if(b == 4) k = 2;\n  else { this.fromRadix(s,b); return; }\n  this.t = 0;\n  this.s = 0;\n  var i = s.length, mi = false, sh = 0;\n  while(--i >= 0) {\n    var x = (k==8)?s[i]&0xff:intAt(s,i);\n    if(x < 0) {\n      if(s.charAt(i) == \"-\") mi = true;\n      continue;\n    }\n    mi = false;\n    if(sh == 0)\n      this.data[this.t++] = x;\n    else if(sh+k > this.DB) {\n      this.data[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;\n      this.data[this.t++] = (x>>(this.DB-sh));\n    } else\n      this.data[this.t-1] |= x<<sh;\n    sh += k;\n    if(sh >= this.DB) sh -= this.DB;\n  }\n  if(k == 8 && (s[0]&0x80) != 0) {\n    this.s = -1;\n    if(sh > 0) this.data[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;\n  }\n  this.clamp();\n  if(mi) BigInteger.ZERO.subTo(this,this);\n}\n\n// (protected) clamp off excess high words\nfunction bnpClamp() {\n  var c = this.s&this.DM;\n  while(this.t > 0 && this.data[this.t-1] == c) --this.t;\n}\n\n// (public) return string representation in given radix\nfunction bnToString(b) {\n  if(this.s < 0) return \"-\"+this.negate().toString(b);\n  var k;\n  if(b == 16) k = 4;\n  else if(b == 8) k = 3;\n  else if(b == 2) k = 1;\n  else if(b == 32) k = 5;\n  else if(b == 4) k = 2;\n  else return this.toRadix(b);\n  var km = (1<<k)-1, d, m = false, r = \"\", i = this.t;\n  var p = this.DB-(i*this.DB)%k;\n  if(i-- > 0) {\n    if(p < this.DB && (d = this.data[i]>>p) > 0) { m = true; r = int2char(d); }\n    while(i >= 0) {\n      if(p < k) {\n        d = (this.data[i]&((1<<p)-1))<<(k-p);\n        d |= this.data[--i]>>(p+=this.DB-k);\n      } else {\n        d = (this.data[i]>>(p-=k))&km;\n        if(p <= 0) { p += this.DB; --i; }\n      }\n      if(d > 0) m = true;\n      if(m) r += int2char(d);\n    }\n  }\n  return m?r:\"0\";\n}\n\n// (public) -this\nfunction bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }\n\n// (public) |this|\nfunction bnAbs() { return (this.s<0)?this.negate():this; }\n\n// (public) return + if this > a, - if this < a, 0 if equal\nfunction bnCompareTo(a) {\n  var r = this.s-a.s;\n  if(r != 0) return r;\n  var i = this.t;\n  r = i-a.t;\n  if(r != 0) return (this.s<0)?-r:r;\n  while(--i >= 0) if((r=this.data[i]-a.data[i]) != 0) return r;\n  return 0;\n}\n\n// returns bit length of the integer x\nfunction nbits(x) {\n  var r = 1, t;\n  if((t=x>>>16) != 0) { x = t; r += 16; }\n  if((t=x>>8) != 0) { x = t; r += 8; }\n  if((t=x>>4) != 0) { x = t; r += 4; }\n  if((t=x>>2) != 0) { x = t; r += 2; }\n  if((t=x>>1) != 0) { x = t; r += 1; }\n  return r;\n}\n\n// (public) return the number of bits in \"this\"\nfunction bnBitLength() {\n  if(this.t <= 0) return 0;\n  return this.DB*(this.t-1)+nbits(this.data[this.t-1]^(this.s&this.DM));\n}\n\n// (protected) r = this << n*DB\nfunction bnpDLShiftTo(n,r) {\n  var i;\n  for(i = this.t-1; i >= 0; --i) r.data[i+n] = this.data[i];\n  for(i = n-1; i >= 0; --i) r.data[i] = 0;\n  r.t = this.t+n;\n  r.s = this.s;\n}\n\n// (protected) r = this >> n*DB\nfunction bnpDRShiftTo(n,r) {\n  for(var i = n; i < this.t; ++i) r.data[i-n] = this.data[i];\n  r.t = Math.max(this.t-n,0);\n  r.s = this.s;\n}\n\n// (protected) r = this << n\nfunction bnpLShiftTo(n,r) {\n  var bs = n%this.DB;\n  var cbs = this.DB-bs;\n  var bm = (1<<cbs)-1;\n  var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;\n  for(i = this.t-1; i >= 0; --i) {\n    r.data[i+ds+1] = (this.data[i]>>cbs)|c;\n    c = (this.data[i]&bm)<<bs;\n  }\n  for(i = ds-1; i >= 0; --i) r.data[i] = 0;\n  r.data[ds] = c;\n  r.t = this.t+ds+1;\n  r.s = this.s;\n  r.clamp();\n}\n\n// (protected) r = this >> n\nfunction bnpRShiftTo(n,r) {\n  r.s = this.s;\n  var ds = Math.floor(n/this.DB);\n  if(ds >= this.t) { r.t = 0; return; }\n  var bs = n%this.DB;\n  var cbs = this.DB-bs;\n  var bm = (1<<bs)-1;\n  r.data[0] = this.data[ds]>>bs;\n  for(var i = ds+1; i < this.t; ++i) {\n    r.data[i-ds-1] |= (this.data[i]&bm)<<cbs;\n    r.data[i-ds] = this.data[i]>>bs;\n  }\n  if(bs > 0) r.data[this.t-ds-1] |= (this.s&bm)<<cbs;\n  r.t = this.t-ds;\n  r.clamp();\n}\n\n// (protected) r = this - a\nfunction bnpSubTo(a,r) {\n  var i = 0, c = 0, m = Math.min(a.t,this.t);\n  while(i < m) {\n    c += this.data[i]-a.data[i];\n    r.data[i++] = c&this.DM;\n    c >>= this.DB;\n  }\n  if(a.t < this.t) {\n    c -= a.s;\n    while(i < this.t) {\n      c += this.data[i];\n      r.data[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    c += this.s;\n  } else {\n    c += this.s;\n    while(i < a.t) {\n      c -= a.data[i];\n      r.data[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    c -= a.s;\n  }\n  r.s = (c<0)?-1:0;\n  if(c < -1) r.data[i++] = this.DV+c;\n  else if(c > 0) r.data[i++] = c;\n  r.t = i;\n  r.clamp();\n}\n\n// (protected) r = this * a, r != this,a (HAC 14.12)\n// \"this\" should be the larger one if appropriate.\nfunction bnpMultiplyTo(a,r) {\n  var x = this.abs(), y = a.abs();\n  var i = x.t;\n  r.t = i+y.t;\n  while(--i >= 0) r.data[i] = 0;\n  for(i = 0; i < y.t; ++i) r.data[i+x.t] = x.am(0,y.data[i],r,i,0,x.t);\n  r.s = 0;\n  r.clamp();\n  if(this.s != a.s) BigInteger.ZERO.subTo(r,r);\n}\n\n// (protected) r = this^2, r != this (HAC 14.16)\nfunction bnpSquareTo(r) {\n  var x = this.abs();\n  var i = r.t = 2*x.t;\n  while(--i >= 0) r.data[i] = 0;\n  for(i = 0; i < x.t-1; ++i) {\n    var c = x.am(i,x.data[i],r,2*i,0,1);\n    if((r.data[i+x.t]+=x.am(i+1,2*x.data[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {\n      r.data[i+x.t] -= x.DV;\n      r.data[i+x.t+1] = 1;\n    }\n  }\n  if(r.t > 0) r.data[r.t-1] += x.am(i,x.data[i],r,2*i,0,1);\n  r.s = 0;\n  r.clamp();\n}\n\n// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n// r != q, this != m.  q or r may be null.\nfunction bnpDivRemTo(m,q,r) {\n  var pm = m.abs();\n  if(pm.t <= 0) return;\n  var pt = this.abs();\n  if(pt.t < pm.t) {\n    if(q != null) q.fromInt(0);\n    if(r != null) this.copyTo(r);\n    return;\n  }\n  if(r == null) r = nbi();\n  var y = nbi(), ts = this.s, ms = m.s;\n  var nsh = this.DB-nbits(pm.data[pm.t-1]);\t// normalize modulus\n  if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); } else { pm.copyTo(y); pt.copyTo(r); }\n  var ys = y.t;\n  var y0 = y.data[ys-1];\n  if(y0 == 0) return;\n  var yt = y0*(1<<this.F1)+((ys>1)?y.data[ys-2]>>this.F2:0);\n  var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;\n  var i = r.t, j = i-ys, t = (q==null)?nbi():q;\n  y.dlShiftTo(j,t);\n  if(r.compareTo(t) >= 0) {\n    r.data[r.t++] = 1;\n    r.subTo(t,r);\n  }\n  BigInteger.ONE.dlShiftTo(ys,t);\n  t.subTo(y,y);\t// \"negative\" y so we can replace sub with am later\n  while(y.t < ys) y.data[y.t++] = 0;\n  while(--j >= 0) {\n    // Estimate quotient digit\n    var qd = (r.data[--i]==y0)?this.DM:Math.floor(r.data[i]*d1+(r.data[i-1]+e)*d2);\n    if((r.data[i]+=y.am(0,qd,r,j,0,ys)) < qd) {\t// Try it out\n      y.dlShiftTo(j,t);\n      r.subTo(t,r);\n      while(r.data[i] < --qd) r.subTo(t,r);\n    }\n  }\n  if(q != null) {\n    r.drShiftTo(ys,q);\n    if(ts != ms) BigInteger.ZERO.subTo(q,q);\n  }\n  r.t = ys;\n  r.clamp();\n  if(nsh > 0) r.rShiftTo(nsh,r);\t// Denormalize remainder\n  if(ts < 0) BigInteger.ZERO.subTo(r,r);\n}\n\n// (public) this mod a\nfunction bnMod(a) {\n  var r = nbi();\n  this.abs().divRemTo(a,null,r);\n  if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);\n  return r;\n}\n\n// Modular reduction using \"classic\" algorithm\nfunction Classic(m) { this.m = m; }\nfunction cConvert(x) {\n  if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n  else return x;\n}\nfunction cRevert(x) { return x; }\nfunction cReduce(x) { x.divRemTo(this.m,null,x); }\nfunction cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\nfunction cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\nClassic.prototype.convert = cConvert;\nClassic.prototype.revert = cRevert;\nClassic.prototype.reduce = cReduce;\nClassic.prototype.mulTo = cMulTo;\nClassic.prototype.sqrTo = cSqrTo;\n\n// (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n// justification:\n//         xy == 1 (mod m)\n//         xy =  1+km\n//   xy(2-xy) = (1+km)(1-km)\n// x[y(2-xy)] = 1-k^2m^2\n// x[y(2-xy)] == 1 (mod m^2)\n// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n// JS multiply \"overflows\" differently from C/C++, so care is needed here.\nfunction bnpInvDigit() {\n  if(this.t < 1) return 0;\n  var x = this.data[0];\n  if((x&1) == 0) return 0;\n  var y = x&3;\t\t// y == 1/x mod 2^2\n  y = (y*(2-(x&0xf)*y))&0xf;\t// y == 1/x mod 2^4\n  y = (y*(2-(x&0xff)*y))&0xff;\t// y == 1/x mod 2^8\n  y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;\t// y == 1/x mod 2^16\n  // last step - calculate inverse mod DV directly;\n  // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n  y = (y*(2-x*y%this.DV))%this.DV;\t\t// y == 1/x mod 2^dbits\n  // we really want the negative inverse, and -DV < y < DV\n  return (y>0)?this.DV-y:-y;\n}\n\n// Montgomery reduction\nfunction Montgomery(m) {\n  this.m = m;\n  this.mp = m.invDigit();\n  this.mpl = this.mp&0x7fff;\n  this.mph = this.mp>>15;\n  this.um = (1<<(m.DB-15))-1;\n  this.mt2 = 2*m.t;\n}\n\n// xR mod m\nfunction montConvert(x) {\n  var r = nbi();\n  x.abs().dlShiftTo(this.m.t,r);\n  r.divRemTo(this.m,null,r);\n  if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);\n  return r;\n}\n\n// x/R mod m\nfunction montRevert(x) {\n  var r = nbi();\n  x.copyTo(r);\n  this.reduce(r);\n  return r;\n}\n\n// x = x/R mod m (HAC 14.32)\nfunction montReduce(x) {\n  while(x.t <= this.mt2)\t// pad x so am has enough room later\n    x.data[x.t++] = 0;\n  for(var i = 0; i < this.m.t; ++i) {\n    // faster way of calculating u0 = x.data[i]*mp mod DV\n    var j = x.data[i]&0x7fff;\n    var u0 = (j*this.mpl+(((j*this.mph+(x.data[i]>>15)*this.mpl)&this.um)<<15))&x.DM;\n    // use am to combine the multiply-shift-add into one call\n    j = i+this.m.t;\n    x.data[j] += this.m.am(0,u0,x,i,0,this.m.t);\n    // propagate carry\n    while(x.data[j] >= x.DV) { x.data[j] -= x.DV; x.data[++j]++; }\n  }\n  x.clamp();\n  x.drShiftTo(this.m.t,x);\n  if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n}\n\n// r = \"x^2/R mod m\"; x != r\nfunction montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n// r = \"xy/R mod m\"; x,y != r\nfunction montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\nMontgomery.prototype.convert = montConvert;\nMontgomery.prototype.revert = montRevert;\nMontgomery.prototype.reduce = montReduce;\nMontgomery.prototype.mulTo = montMulTo;\nMontgomery.prototype.sqrTo = montSqrTo;\n\n// (protected) true iff this is even\nfunction bnpIsEven() { return ((this.t>0)?(this.data[0]&1):this.s) == 0; }\n\n// (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\nfunction bnpExp(e,z) {\n  if(e > 0xffffffff || e < 1) return BigInteger.ONE;\n  var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;\n  g.copyTo(r);\n  while(--i >= 0) {\n    z.sqrTo(r,r2);\n    if((e&(1<<i)) > 0) z.mulTo(r2,g,r);\n    else { var t = r; r = r2; r2 = t; }\n  }\n  return z.revert(r);\n}\n\n// (public) this^e % m, 0 <= e < 2^32\nfunction bnModPowInt(e,m) {\n  var z;\n  if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);\n  return this.exp(e,z);\n}\n\n// protected\nBigInteger.prototype.copyTo = bnpCopyTo;\nBigInteger.prototype.fromInt = bnpFromInt;\nBigInteger.prototype.fromString = bnpFromString;\nBigInteger.prototype.clamp = bnpClamp;\nBigInteger.prototype.dlShiftTo = bnpDLShiftTo;\nBigInteger.prototype.drShiftTo = bnpDRShiftTo;\nBigInteger.prototype.lShiftTo = bnpLShiftTo;\nBigInteger.prototype.rShiftTo = bnpRShiftTo;\nBigInteger.prototype.subTo = bnpSubTo;\nBigInteger.prototype.multiplyTo = bnpMultiplyTo;\nBigInteger.prototype.squareTo = bnpSquareTo;\nBigInteger.prototype.divRemTo = bnpDivRemTo;\nBigInteger.prototype.invDigit = bnpInvDigit;\nBigInteger.prototype.isEven = bnpIsEven;\nBigInteger.prototype.exp = bnpExp;\n\n// public\nBigInteger.prototype.toString = bnToString;\nBigInteger.prototype.negate = bnNegate;\nBigInteger.prototype.abs = bnAbs;\nBigInteger.prototype.compareTo = bnCompareTo;\nBigInteger.prototype.bitLength = bnBitLength;\nBigInteger.prototype.mod = bnMod;\nBigInteger.prototype.modPowInt = bnModPowInt;\n\n// \"constants\"\nBigInteger.ZERO = nbv(0);\nBigInteger.ONE = nbv(1);\n\n// jsbn2 lib\n\n//Copyright (c) 2005-2009  Tom Wu\n//All Rights Reserved.\n//See \"LICENSE\" for details (See jsbn.js for LICENSE).\n\n//Extended JavaScript BN functions, required for RSA private ops.\n\n//Version 1.1: new BigInteger(\"0\", 10) returns \"proper\" zero\n\n//(public)\nfunction bnClone() { var r = nbi(); this.copyTo(r); return r; }\n\n//(public) return value as integer\nfunction bnIntValue() {\nif(this.s < 0) {\n if(this.t == 1) return this.data[0]-this.DV;\n else if(this.t == 0) return -1;\n} else if(this.t == 1) return this.data[0];\nelse if(this.t == 0) return 0;\n// assumes 16 < DB < 32\nreturn ((this.data[1]&((1<<(32-this.DB))-1))<<this.DB)|this.data[0];\n}\n\n//(public) return value as byte\nfunction bnByteValue() { return (this.t==0)?this.s:(this.data[0]<<24)>>24; }\n\n//(public) return value as short (assumes DB>=16)\nfunction bnShortValue() { return (this.t==0)?this.s:(this.data[0]<<16)>>16; }\n\n//(protected) return x s.t. r^x < DV\nfunction bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }\n\n//(public) 0 if this == 0, 1 if this > 0\nfunction bnSigNum() {\nif(this.s < 0) return -1;\nelse if(this.t <= 0 || (this.t == 1 && this.data[0] <= 0)) return 0;\nelse return 1;\n}\n\n//(protected) convert to radix string\nfunction bnpToRadix(b) {\nif(b == null) b = 10;\nif(this.signum() == 0 || b < 2 || b > 36) return \"0\";\nvar cs = this.chunkSize(b);\nvar a = Math.pow(b,cs);\nvar d = nbv(a), y = nbi(), z = nbi(), r = \"\";\nthis.divRemTo(d,y,z);\nwhile(y.signum() > 0) {\n r = (a+z.intValue()).toString(b).substr(1) + r;\n y.divRemTo(d,y,z);\n}\nreturn z.intValue().toString(b) + r;\n}\n\n//(protected) convert from radix string\nfunction bnpFromRadix(s,b) {\nthis.fromInt(0);\nif(b == null) b = 10;\nvar cs = this.chunkSize(b);\nvar d = Math.pow(b,cs), mi = false, j = 0, w = 0;\nfor(var i = 0; i < s.length; ++i) {\n var x = intAt(s,i);\n if(x < 0) {\n   if(s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n   continue;\n }\n w = b*w+x;\n if(++j >= cs) {\n   this.dMultiply(d);\n   this.dAddOffset(w,0);\n   j = 0;\n   w = 0;\n }\n}\nif(j > 0) {\n this.dMultiply(Math.pow(b,j));\n this.dAddOffset(w,0);\n}\nif(mi) BigInteger.ZERO.subTo(this,this);\n}\n\n//(protected) alternate constructor\nfunction bnpFromNumber(a,b,c) {\nif(\"number\" == typeof b) {\n // new BigInteger(int,int,RNG)\n if(a < 2) this.fromInt(1);\n else {\n   this.fromNumber(a,c);\n   if(!this.testBit(a-1))  // force MSB set\n     this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);\n   if(this.isEven()) this.dAddOffset(1,0); // force odd\n   while(!this.isProbablePrime(b)) {\n     this.dAddOffset(2,0);\n     if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);\n   }\n }\n} else {\n // new BigInteger(int,RNG)\n var x = new Array(), t = a&7;\n x.length = (a>>3)+1;\n b.nextBytes(x);\n if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;\n this.fromString(x,256);\n}\n}\n\n//(public) convert to bigendian byte array\nfunction bnToByteArray() {\nvar i = this.t, r = new Array();\nr[0] = this.s;\nvar p = this.DB-(i*this.DB)%8, d, k = 0;\nif(i-- > 0) {\n if(p < this.DB && (d = this.data[i]>>p) != (this.s&this.DM)>>p)\n   r[k++] = d|(this.s<<(this.DB-p));\n while(i >= 0) {\n   if(p < 8) {\n     d = (this.data[i]&((1<<p)-1))<<(8-p);\n     d |= this.data[--i]>>(p+=this.DB-8);\n   } else {\n     d = (this.data[i]>>(p-=8))&0xff;\n     if(p <= 0) { p += this.DB; --i; }\n   }\n   if((d&0x80) != 0) d |= -256;\n   if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;\n   if(k > 0 || d != this.s) r[k++] = d;\n }\n}\nreturn r;\n}\n\nfunction bnEquals(a) { return(this.compareTo(a)==0); }\nfunction bnMin(a) { return(this.compareTo(a)<0)?this:a; }\nfunction bnMax(a) { return(this.compareTo(a)>0)?this:a; }\n\n//(protected) r = this op a (bitwise)\nfunction bnpBitwiseTo(a,op,r) {\nvar i, f, m = Math.min(a.t,this.t);\nfor(i = 0; i < m; ++i) r.data[i] = op(this.data[i],a.data[i]);\nif(a.t < this.t) {\n f = a.s&this.DM;\n for(i = m; i < this.t; ++i) r.data[i] = op(this.data[i],f);\n r.t = this.t;\n} else {\n f = this.s&this.DM;\n for(i = m; i < a.t; ++i) r.data[i] = op(f,a.data[i]);\n r.t = a.t;\n}\nr.s = op(this.s,a.s);\nr.clamp();\n}\n\n//(public) this & a\nfunction op_and(x,y) { return x&y; }\nfunction bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }\n\n//(public) this | a\nfunction op_or(x,y) { return x|y; }\nfunction bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }\n\n//(public) this ^ a\nfunction op_xor(x,y) { return x^y; }\nfunction bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }\n\n//(public) this & ~a\nfunction op_andnot(x,y) { return x&~y; }\nfunction bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }\n\n//(public) ~this\nfunction bnNot() {\nvar r = nbi();\nfor(var i = 0; i < this.t; ++i) r.data[i] = this.DM&~this.data[i];\nr.t = this.t;\nr.s = ~this.s;\nreturn r;\n}\n\n//(public) this << n\nfunction bnShiftLeft(n) {\nvar r = nbi();\nif(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);\nreturn r;\n}\n\n//(public) this >> n\nfunction bnShiftRight(n) {\nvar r = nbi();\nif(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);\nreturn r;\n}\n\n//return index of lowest 1-bit in x, x < 2^31\nfunction lbit(x) {\nif(x == 0) return -1;\nvar r = 0;\nif((x&0xffff) == 0) { x >>= 16; r += 16; }\nif((x&0xff) == 0) { x >>= 8; r += 8; }\nif((x&0xf) == 0) { x >>= 4; r += 4; }\nif((x&3) == 0) { x >>= 2; r += 2; }\nif((x&1) == 0) ++r;\nreturn r;\n}\n\n//(public) returns index of lowest 1-bit (or -1 if none)\nfunction bnGetLowestSetBit() {\nfor(var i = 0; i < this.t; ++i)\n if(this.data[i] != 0) return i*this.DB+lbit(this.data[i]);\nif(this.s < 0) return this.t*this.DB;\nreturn -1;\n}\n\n//return number of 1 bits in x\nfunction cbit(x) {\nvar r = 0;\nwhile(x != 0) { x &= x-1; ++r; }\nreturn r;\n}\n\n//(public) return number of set bits\nfunction bnBitCount() {\nvar r = 0, x = this.s&this.DM;\nfor(var i = 0; i < this.t; ++i) r += cbit(this.data[i]^x);\nreturn r;\n}\n\n//(public) true iff nth bit is set\nfunction bnTestBit(n) {\nvar j = Math.floor(n/this.DB);\nif(j >= this.t) return(this.s!=0);\nreturn((this.data[j]&(1<<(n%this.DB)))!=0);\n}\n\n//(protected) this op (1<<n)\nfunction bnpChangeBit(n,op) {\nvar r = BigInteger.ONE.shiftLeft(n);\nthis.bitwiseTo(r,op,r);\nreturn r;\n}\n\n//(public) this | (1<<n)\nfunction bnSetBit(n) { return this.changeBit(n,op_or); }\n\n//(public) this & ~(1<<n)\nfunction bnClearBit(n) { return this.changeBit(n,op_andnot); }\n\n//(public) this ^ (1<<n)\nfunction bnFlipBit(n) { return this.changeBit(n,op_xor); }\n\n//(protected) r = this + a\nfunction bnpAddTo(a,r) {\nvar i = 0, c = 0, m = Math.min(a.t,this.t);\nwhile(i < m) {\n c += this.data[i]+a.data[i];\n r.data[i++] = c&this.DM;\n c >>= this.DB;\n}\nif(a.t < this.t) {\n c += a.s;\n while(i < this.t) {\n   c += this.data[i];\n   r.data[i++] = c&this.DM;\n   c >>= this.DB;\n }\n c += this.s;\n} else {\n c += this.s;\n while(i < a.t) {\n   c += a.data[i];\n   r.data[i++] = c&this.DM;\n   c >>= this.DB;\n }\n c += a.s;\n}\nr.s = (c<0)?-1:0;\nif(c > 0) r.data[i++] = c;\nelse if(c < -1) r.data[i++] = this.DV+c;\nr.t = i;\nr.clamp();\n}\n\n//(public) this + a\nfunction bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }\n\n//(public) this - a\nfunction bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }\n\n//(public) this * a\nfunction bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }\n\n//(public) this / a\nfunction bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }\n\n//(public) this % a\nfunction bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }\n\n//(public) [this/a,this%a]\nfunction bnDivideAndRemainder(a) {\nvar q = nbi(), r = nbi();\nthis.divRemTo(a,q,r);\nreturn new Array(q,r);\n}\n\n//(protected) this *= n, this >= 0, 1 < n < DV\nfunction bnpDMultiply(n) {\nthis.data[this.t] = this.am(0,n-1,this,0,0,this.t);\n++this.t;\nthis.clamp();\n}\n\n//(protected) this += n << w words, this >= 0\nfunction bnpDAddOffset(n,w) {\nif(n == 0) return;\nwhile(this.t <= w) this.data[this.t++] = 0;\nthis.data[w] += n;\nwhile(this.data[w] >= this.DV) {\n this.data[w] -= this.DV;\n if(++w >= this.t) this.data[this.t++] = 0;\n ++this.data[w];\n}\n}\n\n//A \"null\" reducer\nfunction NullExp() {}\nfunction nNop(x) { return x; }\nfunction nMulTo(x,y,r) { x.multiplyTo(y,r); }\nfunction nSqrTo(x,r) { x.squareTo(r); }\n\nNullExp.prototype.convert = nNop;\nNullExp.prototype.revert = nNop;\nNullExp.prototype.mulTo = nMulTo;\nNullExp.prototype.sqrTo = nSqrTo;\n\n//(public) this^e\nfunction bnPow(e) { return this.exp(e,new NullExp()); }\n\n//(protected) r = lower n words of \"this * a\", a.t <= n\n//\"this\" should be the larger one if appropriate.\nfunction bnpMultiplyLowerTo(a,n,r) {\nvar i = Math.min(this.t+a.t,n);\nr.s = 0; // assumes a,this >= 0\nr.t = i;\nwhile(i > 0) r.data[--i] = 0;\nvar j;\nfor(j = r.t-this.t; i < j; ++i) r.data[i+this.t] = this.am(0,a.data[i],r,i,0,this.t);\nfor(j = Math.min(a.t,n); i < j; ++i) this.am(0,a.data[i],r,i,0,n-i);\nr.clamp();\n}\n\n//(protected) r = \"this * a\" without lower n words, n > 0\n//\"this\" should be the larger one if appropriate.\nfunction bnpMultiplyUpperTo(a,n,r) {\n--n;\nvar i = r.t = this.t+a.t-n;\nr.s = 0; // assumes a,this >= 0\nwhile(--i >= 0) r.data[i] = 0;\nfor(i = Math.max(n-this.t,0); i < a.t; ++i)\n r.data[this.t+i-n] = this.am(n-i,a.data[i],r,0,0,this.t+i-n);\nr.clamp();\nr.drShiftTo(1,r);\n}\n\n//Barrett modular reduction\nfunction Barrett(m) {\n// setup Barrett\nthis.r2 = nbi();\nthis.q3 = nbi();\nBigInteger.ONE.dlShiftTo(2*m.t,this.r2);\nthis.mu = this.r2.divide(m);\nthis.m = m;\n}\n\nfunction barrettConvert(x) {\nif(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);\nelse if(x.compareTo(this.m) < 0) return x;\nelse { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }\n}\n\nfunction barrettRevert(x) { return x; }\n\n//x = x mod m (HAC 14.42)\nfunction barrettReduce(x) {\nx.drShiftTo(this.m.t-1,this.r2);\nif(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }\nthis.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);\nthis.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);\nwhile(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);\nx.subTo(this.r2,x);\nwhile(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n}\n\n//r = x^2 mod m; x != r\nfunction barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n//r = x*y mod m; x,y != r\nfunction barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\nBarrett.prototype.convert = barrettConvert;\nBarrett.prototype.revert = barrettRevert;\nBarrett.prototype.reduce = barrettReduce;\nBarrett.prototype.mulTo = barrettMulTo;\nBarrett.prototype.sqrTo = barrettSqrTo;\n\n//(public) this^e % m (HAC 14.85)\nfunction bnModPow(e,m) {\nvar i = e.bitLength(), k, r = nbv(1), z;\nif(i <= 0) return r;\nelse if(i < 18) k = 1;\nelse if(i < 48) k = 3;\nelse if(i < 144) k = 4;\nelse if(i < 768) k = 5;\nelse k = 6;\nif(i < 8)\n z = new Classic(m);\nelse if(m.isEven())\n z = new Barrett(m);\nelse\n z = new Montgomery(m);\n\n// precomputation\nvar g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;\ng[1] = z.convert(this);\nif(k > 1) {\n var g2 = nbi();\n z.sqrTo(g[1],g2);\n while(n <= km) {\n   g[n] = nbi();\n   z.mulTo(g2,g[n-2],g[n]);\n   n += 2;\n }\n}\n\nvar j = e.t-1, w, is1 = true, r2 = nbi(), t;\ni = nbits(e.data[j])-1;\nwhile(j >= 0) {\n if(i >= k1) w = (e.data[j]>>(i-k1))&km;\n else {\n   w = (e.data[j]&((1<<(i+1))-1))<<(k1-i);\n   if(j > 0) w |= e.data[j-1]>>(this.DB+i-k1);\n }\n\n n = k;\n while((w&1) == 0) { w >>= 1; --n; }\n if((i -= n) < 0) { i += this.DB; --j; }\n if(is1) {  // ret == 1, don't bother squaring or multiplying it\n   g[w].copyTo(r);\n   is1 = false;\n } else {\n   while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }\n   if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }\n   z.mulTo(r2,g[w],r);\n }\n\n while(j >= 0 && (e.data[j]&(1<<i)) == 0) {\n   z.sqrTo(r,r2); t = r; r = r2; r2 = t;\n   if(--i < 0) { i = this.DB-1; --j; }\n }\n}\nreturn z.revert(r);\n}\n\n//(public) gcd(this,a) (HAC 14.54)\nfunction bnGCD(a) {\nvar x = (this.s<0)?this.negate():this.clone();\nvar y = (a.s<0)?a.negate():a.clone();\nif(x.compareTo(y) < 0) { var t = x; x = y; y = t; }\nvar i = x.getLowestSetBit(), g = y.getLowestSetBit();\nif(g < 0) return x;\nif(i < g) g = i;\nif(g > 0) {\n x.rShiftTo(g,x);\n y.rShiftTo(g,y);\n}\nwhile(x.signum() > 0) {\n if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);\n if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);\n if(x.compareTo(y) >= 0) {\n   x.subTo(y,x);\n   x.rShiftTo(1,x);\n } else {\n   y.subTo(x,y);\n   y.rShiftTo(1,y);\n }\n}\nif(g > 0) y.lShiftTo(g,y);\nreturn y;\n}\n\n//(protected) this % n, n < 2^26\nfunction bnpModInt(n) {\nif(n <= 0) return 0;\nvar d = this.DV%n, r = (this.s<0)?n-1:0;\nif(this.t > 0)\n if(d == 0) r = this.data[0]%n;\n else for(var i = this.t-1; i >= 0; --i) r = (d*r+this.data[i])%n;\nreturn r;\n}\n\n//(public) 1/this % m (HAC 14.61)\nfunction bnModInverse(m) {\nvar ac = m.isEven();\nif((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;\nvar u = m.clone(), v = this.clone();\nvar a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);\nwhile(u.signum() != 0) {\n while(u.isEven()) {\n   u.rShiftTo(1,u);\n   if(ac) {\n     if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }\n     a.rShiftTo(1,a);\n   } else if(!b.isEven()) b.subTo(m,b);\n   b.rShiftTo(1,b);\n }\n while(v.isEven()) {\n   v.rShiftTo(1,v);\n   if(ac) {\n     if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }\n     c.rShiftTo(1,c);\n   } else if(!d.isEven()) d.subTo(m,d);\n   d.rShiftTo(1,d);\n }\n if(u.compareTo(v) >= 0) {\n   u.subTo(v,u);\n   if(ac) a.subTo(c,a);\n   b.subTo(d,b);\n } else {\n   v.subTo(u,v);\n   if(ac) c.subTo(a,c);\n   d.subTo(b,d);\n }\n}\nif(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;\nif(d.compareTo(m) >= 0) return d.subtract(m);\nif(d.signum() < 0) d.addTo(m,d); else return d;\nif(d.signum() < 0) return d.add(m); else return d;\n}\n\nvar lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509];\nvar lplim = (1<<26)/lowprimes[lowprimes.length-1];\n\n//(public) test primality with certainty >= 1-.5^t\nfunction bnIsProbablePrime(t) {\nvar i, x = this.abs();\nif(x.t == 1 && x.data[0] <= lowprimes[lowprimes.length-1]) {\n for(i = 0; i < lowprimes.length; ++i)\n   if(x.data[0] == lowprimes[i]) return true;\n return false;\n}\nif(x.isEven()) return false;\ni = 1;\nwhile(i < lowprimes.length) {\n var m = lowprimes[i], j = i+1;\n while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];\n m = x.modInt(m);\n while(i < j) if(m%lowprimes[i++] == 0) return false;\n}\nreturn x.millerRabin(t);\n}\n\n//(protected) true if probably prime (HAC 4.24, Miller-Rabin)\nfunction bnpMillerRabin(t) {\nvar n1 = this.subtract(BigInteger.ONE);\nvar k = n1.getLowestSetBit();\nif(k <= 0) return false;\nvar r = n1.shiftRight(k);\nvar prng = bnGetPrng();\nvar a;\nfor(var i = 0; i < t; ++i) {\n // select witness 'a' at random from between 1 and n1\n do {\n   a = new BigInteger(this.bitLength(), prng);\n }\n while(a.compareTo(BigInteger.ONE) <= 0 || a.compareTo(n1) >= 0);\n var y = a.modPow(r,this);\n if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\n   var j = 1;\n   while(j++ < k && y.compareTo(n1) != 0) {\n     y = y.modPowInt(2,this);\n     if(y.compareTo(BigInteger.ONE) == 0) return false;\n   }\n   if(y.compareTo(n1) != 0) return false;\n }\n}\nreturn true;\n}\n\n// get pseudo random number generator\nfunction bnGetPrng() {\n  // create prng with api that matches BigInteger secure random\n  return {\n    // x is an array to fill with bytes\n    nextBytes: function(x) {\n      for(var i = 0; i < x.length; ++i) {\n        x[i] = Math.floor(Math.random() * 0x0100);\n      }\n    }\n  };\n}\n\n//protected\nBigInteger.prototype.chunkSize = bnpChunkSize;\nBigInteger.prototype.toRadix = bnpToRadix;\nBigInteger.prototype.fromRadix = bnpFromRadix;\nBigInteger.prototype.fromNumber = bnpFromNumber;\nBigInteger.prototype.bitwiseTo = bnpBitwiseTo;\nBigInteger.prototype.changeBit = bnpChangeBit;\nBigInteger.prototype.addTo = bnpAddTo;\nBigInteger.prototype.dMultiply = bnpDMultiply;\nBigInteger.prototype.dAddOffset = bnpDAddOffset;\nBigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\nBigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\nBigInteger.prototype.modInt = bnpModInt;\nBigInteger.prototype.millerRabin = bnpMillerRabin;\n\n//public\nBigInteger.prototype.clone = bnClone;\nBigInteger.prototype.intValue = bnIntValue;\nBigInteger.prototype.byteValue = bnByteValue;\nBigInteger.prototype.shortValue = bnShortValue;\nBigInteger.prototype.signum = bnSigNum;\nBigInteger.prototype.toByteArray = bnToByteArray;\nBigInteger.prototype.equals = bnEquals;\nBigInteger.prototype.min = bnMin;\nBigInteger.prototype.max = bnMax;\nBigInteger.prototype.and = bnAnd;\nBigInteger.prototype.or = bnOr;\nBigInteger.prototype.xor = bnXor;\nBigInteger.prototype.andNot = bnAndNot;\nBigInteger.prototype.not = bnNot;\nBigInteger.prototype.shiftLeft = bnShiftLeft;\nBigInteger.prototype.shiftRight = bnShiftRight;\nBigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\nBigInteger.prototype.bitCount = bnBitCount;\nBigInteger.prototype.testBit = bnTestBit;\nBigInteger.prototype.setBit = bnSetBit;\nBigInteger.prototype.clearBit = bnClearBit;\nBigInteger.prototype.flipBit = bnFlipBit;\nBigInteger.prototype.add = bnAdd;\nBigInteger.prototype.subtract = bnSubtract;\nBigInteger.prototype.multiply = bnMultiply;\nBigInteger.prototype.divide = bnDivide;\nBigInteger.prototype.remainder = bnRemainder;\nBigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\nBigInteger.prototype.modPow = bnModPow;\nBigInteger.prototype.modInverse = bnModInverse;\nBigInteger.prototype.pow = bnPow;\nBigInteger.prototype.gcd = bnGCD;\nBigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n\n//BigInteger interfaces not implemented in jsbn:\n\n//BigInteger(int signum, byte[] magnitude)\n//double doubleValue()\n//float floatValue()\n//int hashCode()\n//long longValue()\n//static BigInteger valueOf(long val)\n","/**\n * Secure Hash Algorithm with 160-bit digest (SHA-1) implementation.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2015 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./md');\nrequire('./util');\n\nvar sha1 = module.exports = forge.sha1 = forge.sha1 || {};\nforge.md.sha1 = forge.md.algorithms.sha1 = sha1;\n\n/**\n * Creates a SHA-1 message digest object.\n *\n * @return a message digest object.\n */\nsha1.create = function() {\n  // do initialization as necessary\n  if(!_initialized) {\n    _init();\n  }\n\n  // SHA-1 state contains five 32-bit integers\n  var _state = null;\n\n  // input buffer\n  var _input = forge.util.createBuffer();\n\n  // used for word storage\n  var _w = new Array(80);\n\n  // message digest object\n  var md = {\n    algorithm: 'sha1',\n    blockLength: 64,\n    digestLength: 20,\n    // 56-bit length of message so far (does not including padding)\n    messageLength: 0,\n    // true message length\n    fullMessageLength: null,\n    // size of message length in bytes\n    messageLengthSize: 8\n  };\n\n  /**\n   * Starts the digest.\n   *\n   * @return this digest object.\n   */\n  md.start = function() {\n    // up to 56-bit message length for convenience\n    md.messageLength = 0;\n\n    // full message length (set md.messageLength64 for backwards-compatibility)\n    md.fullMessageLength = md.messageLength64 = [];\n    var int32s = md.messageLengthSize / 4;\n    for(var i = 0; i < int32s; ++i) {\n      md.fullMessageLength.push(0);\n    }\n    _input = forge.util.createBuffer();\n    _state = {\n      h0: 0x67452301,\n      h1: 0xEFCDAB89,\n      h2: 0x98BADCFE,\n      h3: 0x10325476,\n      h4: 0xC3D2E1F0\n    };\n    return md;\n  };\n  // start digest automatically for first time\n  md.start();\n\n  /**\n   * Updates the digest with the given message input. The given input can\n   * treated as raw input (no encoding will be applied) or an encoding of\n   * 'utf8' maybe given to encode the input using UTF-8.\n   *\n   * @param msg the message input to update with.\n   * @param encoding the encoding to use (default: 'raw', other: 'utf8').\n   *\n   * @return this digest object.\n   */\n  md.update = function(msg, encoding) {\n    if(encoding === 'utf8') {\n      msg = forge.util.encodeUtf8(msg);\n    }\n\n    // update message length\n    var len = msg.length;\n    md.messageLength += len;\n    len = [(len / 0x100000000) >>> 0, len >>> 0];\n    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {\n      md.fullMessageLength[i] += len[1];\n      len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0);\n      md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0;\n      len[0] = ((len[1] / 0x100000000) >>> 0);\n    }\n\n    // add bytes to input buffer\n    _input.putBytes(msg);\n\n    // process bytes\n    _update(_state, _w, _input);\n\n    // compact input buffer every 2K or if empty\n    if(_input.read > 2048 || _input.length() === 0) {\n      _input.compact();\n    }\n\n    return md;\n  };\n\n  /**\n   * Produces the digest.\n   *\n   * @return a byte buffer containing the digest value.\n   */\n  md.digest = function() {\n    /* Note: Here we copy the remaining bytes in the input buffer and\n    add the appropriate SHA-1 padding. Then we do the final update\n    on a copy of the state so that if the user wants to get\n    intermediate digests they can do so. */\n\n    /* Determine the number of bytes that must be added to the message\n    to ensure its length is congruent to 448 mod 512. In other words,\n    the data to be digested must be a multiple of 512 bits (or 128 bytes).\n    This data includes the message, some padding, and the length of the\n    message. Since the length of the message will be encoded as 8 bytes (64\n    bits), that means that the last segment of the data must have 56 bytes\n    (448 bits) of message and padding. Therefore, the length of the message\n    plus the padding must be congruent to 448 mod 512 because\n    512 - 128 = 448.\n\n    In order to fill up the message length it must be filled with\n    padding that begins with 1 bit followed by all 0 bits. Padding\n    must *always* be present, so if the message length is already\n    congruent to 448 mod 512, then 512 padding bits must be added. */\n\n    var finalBlock = forge.util.createBuffer();\n    finalBlock.putBytes(_input.bytes());\n\n    // compute remaining size to be digested (include message length size)\n    var remaining = (\n      md.fullMessageLength[md.fullMessageLength.length - 1] +\n      md.messageLengthSize);\n\n    // add padding for overflow blockSize - overflow\n    // _padding starts with 1 byte with first bit is set (byte value 128), then\n    // there may be up to (blockSize - 1) other pad bytes\n    var overflow = remaining & (md.blockLength - 1);\n    finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow));\n\n    // serialize message length in bits in big-endian order; since length\n    // is stored in bytes we multiply by 8 and add carry from next int\n    var next, carry;\n    var bits = md.fullMessageLength[0] * 8;\n    for(var i = 0; i < md.fullMessageLength.length - 1; ++i) {\n      next = md.fullMessageLength[i + 1] * 8;\n      carry = (next / 0x100000000) >>> 0;\n      bits += carry;\n      finalBlock.putInt32(bits >>> 0);\n      bits = next >>> 0;\n    }\n    finalBlock.putInt32(bits);\n\n    var s2 = {\n      h0: _state.h0,\n      h1: _state.h1,\n      h2: _state.h2,\n      h3: _state.h3,\n      h4: _state.h4\n    };\n    _update(s2, _w, finalBlock);\n    var rval = forge.util.createBuffer();\n    rval.putInt32(s2.h0);\n    rval.putInt32(s2.h1);\n    rval.putInt32(s2.h2);\n    rval.putInt32(s2.h3);\n    rval.putInt32(s2.h4);\n    return rval;\n  };\n\n  return md;\n};\n\n// sha-1 padding bytes not initialized yet\nvar _padding = null;\nvar _initialized = false;\n\n/**\n * Initializes the constant tables.\n */\nfunction _init() {\n  // create padding\n  _padding = String.fromCharCode(128);\n  _padding += forge.util.fillString(String.fromCharCode(0x00), 64);\n\n  // now initialized\n  _initialized = true;\n}\n\n/**\n * Updates a SHA-1 state with the given byte buffer.\n *\n * @param s the SHA-1 state to update.\n * @param w the array to use to store words.\n * @param bytes the byte buffer to update with.\n */\nfunction _update(s, w, bytes) {\n  // consume 512 bit (64 byte) chunks\n  var t, a, b, c, d, e, f, i;\n  var len = bytes.length();\n  while(len >= 64) {\n    // the w array will be populated with sixteen 32-bit big-endian words\n    // and then extended into 80 32-bit words according to SHA-1 algorithm\n    // and for 32-79 using Max Locktyukhin's optimization\n\n    // initialize hash value for this chunk\n    a = s.h0;\n    b = s.h1;\n    c = s.h2;\n    d = s.h3;\n    e = s.h4;\n\n    // round 1\n    for(i = 0; i < 16; ++i) {\n      t = bytes.getInt32();\n      w[i] = t;\n      f = d ^ (b & (c ^ d));\n      t = ((a << 5) | (a >>> 27)) + f + e + 0x5A827999 + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n    for(; i < 20; ++i) {\n      t = (w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]);\n      t = (t << 1) | (t >>> 31);\n      w[i] = t;\n      f = d ^ (b & (c ^ d));\n      t = ((a << 5) | (a >>> 27)) + f + e + 0x5A827999 + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n    // round 2\n    for(; i < 32; ++i) {\n      t = (w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]);\n      t = (t << 1) | (t >>> 31);\n      w[i] = t;\n      f = b ^ c ^ d;\n      t = ((a << 5) | (a >>> 27)) + f + e + 0x6ED9EBA1 + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n    for(; i < 40; ++i) {\n      t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]);\n      t = (t << 2) | (t >>> 30);\n      w[i] = t;\n      f = b ^ c ^ d;\n      t = ((a << 5) | (a >>> 27)) + f + e + 0x6ED9EBA1 + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n    // round 3\n    for(; i < 60; ++i) {\n      t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]);\n      t = (t << 2) | (t >>> 30);\n      w[i] = t;\n      f = (b & c) | (d & (b ^ c));\n      t = ((a << 5) | (a >>> 27)) + f + e + 0x8F1BBCDC + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n    // round 4\n    for(; i < 80; ++i) {\n      t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]);\n      t = (t << 2) | (t >>> 30);\n      w[i] = t;\n      f = b ^ c ^ d;\n      t = ((a << 5) | (a >>> 27)) + f + e + 0xCA62C1D6 + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n\n    // update hash state\n    s.h0 = (s.h0 + a) | 0;\n    s.h1 = (s.h1 + b) | 0;\n    s.h2 = (s.h2 + c) | 0;\n    s.h3 = (s.h3 + d) | 0;\n    s.h4 = (s.h4 + e) | 0;\n\n    len -= 64;\n  }\n}\n","/**\n * Partial implementation of PKCS#1 v2.2: RSA-OEAP\n *\n * Modified but based on the following MIT and BSD licensed code:\n *\n * https://github.com/kjur/jsjws/blob/master/rsa.js:\n *\n * The 'jsjws'(JSON Web Signature JavaScript Library) License\n *\n * Copyright (c) 2012 Kenji Urushima\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * http://webrsa.cvs.sourceforge.net/viewvc/webrsa/Client/RSAES-OAEP.js?content-type=text%2Fplain:\n *\n * RSAES-OAEP.js\n * $Id: RSAES-OAEP.js,v 1.1.1.1 2003/03/19 15:37:20 ellispritchard Exp $\n * JavaScript Implementation of PKCS #1 v2.1 RSA CRYPTOGRAPHY STANDARD (RSA Laboratories, June 14, 2002)\n * Copyright (C) Ellis Pritchard, Guardian Unlimited 2003.\n * Contact: ellis@nukinetics.com\n * Distributed under the BSD License.\n *\n * Official documentation: http://www.rsa.com/rsalabs/node.asp?id=2125\n *\n * @author Evan Jones (http://evanjones.ca/)\n * @author Dave Longley\n *\n * Copyright (c) 2013-2014 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./util');\nrequire('./random');\nrequire('./sha1');\n\n// shortcut for PKCS#1 API\nvar pkcs1 = module.exports = forge.pkcs1 = forge.pkcs1 || {};\n\n/**\n * Encode the given RSAES-OAEP message (M) using key, with optional label (L)\n * and seed.\n *\n * This method does not perform RSA encryption, it only encodes the message\n * using RSAES-OAEP.\n *\n * @param key the RSA key to use.\n * @param message the message to encode.\n * @param options the options to use:\n *          label an optional label to use.\n *          seed the seed to use.\n *          md the message digest object to use, undefined for SHA-1.\n *          mgf1 optional mgf1 parameters:\n *            md the message digest object to use for MGF1.\n *\n * @return the encoded message bytes.\n */\npkcs1.encode_rsa_oaep = function(key, message, options) {\n  // parse arguments\n  var label;\n  var seed;\n  var md;\n  var mgf1Md;\n  // legacy args (label, seed, md)\n  if(typeof options === 'string') {\n    label = options;\n    seed = arguments[3] || undefined;\n    md = arguments[4] || undefined;\n  } else if(options) {\n    label = options.label || undefined;\n    seed = options.seed || undefined;\n    md = options.md || undefined;\n    if(options.mgf1 && options.mgf1.md) {\n      mgf1Md = options.mgf1.md;\n    }\n  }\n\n  // default OAEP to SHA-1 message digest\n  if(!md) {\n    md = forge.md.sha1.create();\n  } else {\n    md.start();\n  }\n\n  // default MGF-1 to same as OAEP\n  if(!mgf1Md) {\n    mgf1Md = md;\n  }\n\n  // compute length in bytes and check output\n  var keyLength = Math.ceil(key.n.bitLength() / 8);\n  var maxLength = keyLength - 2 * md.digestLength - 2;\n  if(message.length > maxLength) {\n    var error = new Error('RSAES-OAEP input message length is too long.');\n    error.length = message.length;\n    error.maxLength = maxLength;\n    throw error;\n  }\n\n  if(!label) {\n    label = '';\n  }\n  md.update(label, 'raw');\n  var lHash = md.digest();\n\n  var PS = '';\n  var PS_length = maxLength - message.length;\n  for(var i = 0; i < PS_length; i++) {\n    PS += '\\x00';\n  }\n\n  var DB = lHash.getBytes() + PS + '\\x01' + message;\n\n  if(!seed) {\n    seed = forge.random.getBytes(md.digestLength);\n  } else if(seed.length !== md.digestLength) {\n    var error = new Error('Invalid RSAES-OAEP seed. The seed length must ' +\n      'match the digest length.');\n    error.seedLength = seed.length;\n    error.digestLength = md.digestLength;\n    throw error;\n  }\n\n  var dbMask = rsa_mgf1(seed, keyLength - md.digestLength - 1, mgf1Md);\n  var maskedDB = forge.util.xorBytes(DB, dbMask, DB.length);\n\n  var seedMask = rsa_mgf1(maskedDB, md.digestLength, mgf1Md);\n  var maskedSeed = forge.util.xorBytes(seed, seedMask, seed.length);\n\n  // return encoded message\n  return '\\x00' + maskedSeed + maskedDB;\n};\n\n/**\n * Decode the given RSAES-OAEP encoded message (EM) using key, with optional\n * label (L).\n *\n * This method does not perform RSA decryption, it only decodes the message\n * using RSAES-OAEP.\n *\n * @param key the RSA key to use.\n * @param em the encoded message to decode.\n * @param options the options to use:\n *          label an optional label to use.\n *          md the message digest object to use for OAEP, undefined for SHA-1.\n *          mgf1 optional mgf1 parameters:\n *            md the message digest object to use for MGF1.\n *\n * @return the decoded message bytes.\n */\npkcs1.decode_rsa_oaep = function(key, em, options) {\n  // parse args\n  var label;\n  var md;\n  var mgf1Md;\n  // legacy args\n  if(typeof options === 'string') {\n    label = options;\n    md = arguments[3] || undefined;\n  } else if(options) {\n    label = options.label || undefined;\n    md = options.md || undefined;\n    if(options.mgf1 && options.mgf1.md) {\n      mgf1Md = options.mgf1.md;\n    }\n  }\n\n  // compute length in bytes\n  var keyLength = Math.ceil(key.n.bitLength() / 8);\n\n  if(em.length !== keyLength) {\n    var error = new Error('RSAES-OAEP encoded message length is invalid.');\n    error.length = em.length;\n    error.expectedLength = keyLength;\n    throw error;\n  }\n\n  // default OAEP to SHA-1 message digest\n  if(md === undefined) {\n    md = forge.md.sha1.create();\n  } else {\n    md.start();\n  }\n\n  // default MGF-1 to same as OAEP\n  if(!mgf1Md) {\n    mgf1Md = md;\n  }\n\n  if(keyLength < 2 * md.digestLength + 2) {\n    throw new Error('RSAES-OAEP key is too short for the hash function.');\n  }\n\n  if(!label) {\n    label = '';\n  }\n  md.update(label, 'raw');\n  var lHash = md.digest().getBytes();\n\n  // split the message into its parts\n  var y = em.charAt(0);\n  var maskedSeed = em.substring(1, md.digestLength + 1);\n  var maskedDB = em.substring(1 + md.digestLength);\n\n  var seedMask = rsa_mgf1(maskedDB, md.digestLength, mgf1Md);\n  var seed = forge.util.xorBytes(maskedSeed, seedMask, maskedSeed.length);\n\n  var dbMask = rsa_mgf1(seed, keyLength - md.digestLength - 1, mgf1Md);\n  var db = forge.util.xorBytes(maskedDB, dbMask, maskedDB.length);\n\n  var lHashPrime = db.substring(0, md.digestLength);\n\n  // constant time check that all values match what is expected\n  var error = (y !== '\\x00');\n\n  // constant time check lHash vs lHashPrime\n  for(var i = 0; i < md.digestLength; ++i) {\n    error |= (lHash.charAt(i) !== lHashPrime.charAt(i));\n  }\n\n  // \"constant time\" find the 0x1 byte separating the padding (zeros) from the\n  // message\n  // TODO: It must be possible to do this in a better/smarter way?\n  var in_ps = 1;\n  var index = md.digestLength;\n  for(var j = md.digestLength; j < db.length; j++) {\n    var code = db.charCodeAt(j);\n\n    var is_0 = (code & 0x1) ^ 0x1;\n\n    // non-zero if not 0 or 1 in the ps section\n    var error_mask = in_ps ? 0xfffe : 0x0000;\n    error |= (code & error_mask);\n\n    // latch in_ps to zero after we find 0x1\n    in_ps = in_ps & is_0;\n    index += in_ps;\n  }\n\n  if(error || db.charCodeAt(index) !== 0x1) {\n    throw new Error('Invalid RSAES-OAEP padding.');\n  }\n\n  return db.substring(index + 1);\n};\n\nfunction rsa_mgf1(seed, maskLength, hash) {\n  // default to SHA-1 message digest\n  if(!hash) {\n    hash = forge.md.sha1.create();\n  }\n  var t = '';\n  var count = Math.ceil(maskLength / hash.digestLength);\n  for(var i = 0; i < count; ++i) {\n    var c = String.fromCharCode(\n      (i >> 24) & 0xFF, (i >> 16) & 0xFF, (i >> 8) & 0xFF, i & 0xFF);\n    hash.start();\n    hash.update(seed + c);\n    t += hash.digest().getBytes();\n  }\n  return t.substring(0, maskLength);\n}\n","/**\n * Prime number generation API.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2014 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./util');\nrequire('./jsbn');\nrequire('./random');\n\n(function() {\n\n// forge.prime already defined\nif(forge.prime) {\n  module.exports = forge.prime;\n  return;\n}\n\n/* PRIME API */\nvar prime = module.exports = forge.prime = forge.prime || {};\n\nvar BigInteger = forge.jsbn.BigInteger;\n\n// primes are 30k+i for i = 1, 7, 11, 13, 17, 19, 23, 29\nvar GCD_30_DELTA = [6, 4, 2, 4, 2, 4, 6, 2];\nvar THIRTY = new BigInteger(null);\nTHIRTY.fromInt(30);\nvar op_or = function(x, y) {return x|y;};\n\n/**\n * Generates a random probable prime with the given number of bits.\n *\n * Alternative algorithms can be specified by name as a string or as an\n * object with custom options like so:\n *\n * {\n *   name: 'PRIMEINC',\n *   options: {\n *     maxBlockTime: <the maximum amount of time to block the main\n *       thread before allowing I/O other JS to run>,\n *     millerRabinTests: <the number of miller-rabin tests to run>,\n *     workerScript: <the worker script URL>,\n *     workers: <the number of web workers (if supported) to use,\n *       -1 to use estimated cores minus one>.\n *     workLoad: the size of the work load, ie: number of possible prime\n *       numbers for each web worker to check per work assignment,\n *       (default: 100).\n *   }\n * }\n *\n * @param bits the number of bits for the prime number.\n * @param options the options to use.\n *          [algorithm] the algorithm to use (default: 'PRIMEINC').\n *          [prng] a custom crypto-secure pseudo-random number generator to use,\n *            that must define \"getBytesSync\".\n *\n * @return callback(err, num) called once the operation completes.\n */\nprime.generateProbablePrime = function(bits, options, callback) {\n  if(typeof options === 'function') {\n    callback = options;\n    options = {};\n  }\n  options = options || {};\n\n  // default to PRIMEINC algorithm\n  var algorithm = options.algorithm || 'PRIMEINC';\n  if(typeof algorithm === 'string') {\n    algorithm = {name: algorithm};\n  }\n  algorithm.options = algorithm.options || {};\n\n  // create prng with api that matches BigInteger secure random\n  var prng = options.prng || forge.random;\n  var rng = {\n    // x is an array to fill with bytes\n    nextBytes: function(x) {\n      var b = prng.getBytesSync(x.length);\n      for(var i = 0; i < x.length; ++i) {\n        x[i] = b.charCodeAt(i);\n      }\n    }\n  };\n\n  if(algorithm.name === 'PRIMEINC') {\n    return primeincFindPrime(bits, rng, algorithm.options, callback);\n  }\n\n  throw new Error('Invalid prime generation algorithm: ' + algorithm.name);\n};\n\nfunction primeincFindPrime(bits, rng, options, callback) {\n  if('workers' in options) {\n    return primeincFindPrimeWithWorkers(bits, rng, options, callback);\n  }\n  return primeincFindPrimeWithoutWorkers(bits, rng, options, callback);\n}\n\nfunction primeincFindPrimeWithoutWorkers(bits, rng, options, callback) {\n  // initialize random number\n  var num = generateRandom(bits, rng);\n\n  /* Note: All primes are of the form 30k+i for i < 30 and gcd(30, i)=1. The\n  number we are given is always aligned at 30k + 1. Each time the number is\n  determined not to be prime we add to get to the next 'i', eg: if the number\n  was at 30k + 1 we add 6. */\n  var deltaIdx = 0;\n\n  // get required number of MR tests\n  var mrTests = getMillerRabinTests(num.bitLength());\n  if('millerRabinTests' in options) {\n    mrTests = options.millerRabinTests;\n  }\n\n  // find prime nearest to 'num' for maxBlockTime ms\n  // 10 ms gives 5ms of leeway for other calculations before dropping\n  // below 60fps (1000/60 == 16.67), but in reality, the number will\n  // likely be higher due to an 'atomic' big int modPow\n  var maxBlockTime = 10;\n  if('maxBlockTime' in options) {\n    maxBlockTime = options.maxBlockTime;\n  }\n\n  _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback);\n}\n\nfunction _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback) {\n  var start = +new Date();\n  do {\n    // overflow, regenerate random number\n    if(num.bitLength() > bits) {\n      num = generateRandom(bits, rng);\n    }\n    // do primality test\n    if(num.isProbablePrime(mrTests)) {\n      return callback(null, num);\n    }\n    // get next potential prime\n    num.dAddOffset(GCD_30_DELTA[deltaIdx++ % 8], 0);\n  } while(maxBlockTime < 0 || (+new Date() - start < maxBlockTime));\n\n  // keep trying later\n  forge.util.setImmediate(function() {\n    _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback);\n  });\n}\n\n// NOTE: This algorithm is indeterminate in nature because workers\n// run in parallel looking at different segments of numbers. Even if this\n// algorithm is run twice with the same input from a predictable RNG, it\n// may produce different outputs.\nfunction primeincFindPrimeWithWorkers(bits, rng, options, callback) {\n  // web workers unavailable\n  if(typeof Worker === 'undefined') {\n    return primeincFindPrimeWithoutWorkers(bits, rng, options, callback);\n  }\n\n  // initialize random number\n  var num = generateRandom(bits, rng);\n\n  // use web workers to generate keys\n  var numWorkers = options.workers;\n  var workLoad = options.workLoad || 100;\n  var range = workLoad * 30 / 8;\n  var workerScript = options.workerScript || 'forge/prime.worker.js';\n  if(numWorkers === -1) {\n    return forge.util.estimateCores(function(err, cores) {\n      if(err) {\n        // default to 2\n        cores = 2;\n      }\n      numWorkers = cores - 1;\n      generate();\n    });\n  }\n  generate();\n\n  function generate() {\n    // require at least 1 worker\n    numWorkers = Math.max(1, numWorkers);\n\n    // TODO: consider optimizing by starting workers outside getPrime() ...\n    // note that in order to clean up they will have to be made internally\n    // asynchronous which may actually be slower\n\n    // start workers immediately\n    var workers = [];\n    for(var i = 0; i < numWorkers; ++i) {\n      // FIXME: fix path or use blob URLs\n      workers[i] = new Worker(workerScript);\n    }\n    var running = numWorkers;\n\n    // listen for requests from workers and assign ranges to find prime\n    for(var i = 0; i < numWorkers; ++i) {\n      workers[i].addEventListener('message', workerMessage);\n    }\n\n    /* Note: The distribution of random numbers is unknown. Therefore, each\n    web worker is continuously allocated a range of numbers to check for a\n    random number until one is found.\n\n    Every 30 numbers will be checked just 8 times, because prime numbers\n    have the form:\n\n    30k+i, for i < 30 and gcd(30, i)=1 (there are 8 values of i for this)\n\n    Therefore, if we want a web worker to run N checks before asking for\n    a new range of numbers, each range must contain N*30/8 numbers.\n\n    For 100 checks (workLoad), this is a range of 375. */\n\n    var found = false;\n    function workerMessage(e) {\n      // ignore message, prime already found\n      if(found) {\n        return;\n      }\n\n      --running;\n      var data = e.data;\n      if(data.found) {\n        // terminate all workers\n        for(var i = 0; i < workers.length; ++i) {\n          workers[i].terminate();\n        }\n        found = true;\n        return callback(null, new BigInteger(data.prime, 16));\n      }\n\n      // overflow, regenerate random number\n      if(num.bitLength() > bits) {\n        num = generateRandom(bits, rng);\n      }\n\n      // assign new range to check\n      var hex = num.toString(16);\n\n      // start prime search\n      e.target.postMessage({\n        hex: hex,\n        workLoad: workLoad\n      });\n\n      num.dAddOffset(range, 0);\n    }\n  }\n}\n\n/**\n * Generates a random number using the given number of bits and RNG.\n *\n * @param bits the number of bits for the number.\n * @param rng the random number generator to use.\n *\n * @return the random number.\n */\nfunction generateRandom(bits, rng) {\n  var num = new BigInteger(bits, rng);\n  // force MSB set\n  var bits1 = bits - 1;\n  if(!num.testBit(bits1)) {\n    num.bitwiseTo(BigInteger.ONE.shiftLeft(bits1), op_or, num);\n  }\n  // align number on 30k+1 boundary\n  num.dAddOffset(31 - num.mod(THIRTY).byteValue(), 0);\n  return num;\n}\n\n/**\n * Returns the required number of Miller-Rabin tests to generate a\n * prime with an error probability of (1/2)^80.\n *\n * See Handbook of Applied Cryptography Chapter 4, Table 4.4.\n *\n * @param bits the bit size.\n *\n * @return the required number of iterations.\n */\nfunction getMillerRabinTests(bits) {\n  if(bits <= 100) return 27;\n  if(bits <= 150) return 18;\n  if(bits <= 200) return 15;\n  if(bits <= 250) return 12;\n  if(bits <= 300) return 9;\n  if(bits <= 350) return 8;\n  if(bits <= 400) return 7;\n  if(bits <= 500) return 6;\n  if(bits <= 600) return 5;\n  if(bits <= 800) return 4;\n  if(bits <= 1250) return 3;\n  return 2;\n}\n\n})();\n","/**\n * Javascript implementation of basic RSA algorithms.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n *\n * The only algorithm currently supported for PKI is RSA.\n *\n * An RSA key is often stored in ASN.1 DER format. The SubjectPublicKeyInfo\n * ASN.1 structure is composed of an algorithm of type AlgorithmIdentifier\n * and a subjectPublicKey of type bit string.\n *\n * The AlgorithmIdentifier contains an Object Identifier (OID) and parameters\n * for the algorithm, if any. In the case of RSA, there aren't any.\n *\n * SubjectPublicKeyInfo ::= SEQUENCE {\n *   algorithm AlgorithmIdentifier,\n *   subjectPublicKey BIT STRING\n * }\n *\n * AlgorithmIdentifer ::= SEQUENCE {\n *   algorithm OBJECT IDENTIFIER,\n *   parameters ANY DEFINED BY algorithm OPTIONAL\n * }\n *\n * For an RSA public key, the subjectPublicKey is:\n *\n * RSAPublicKey ::= SEQUENCE {\n *   modulus            INTEGER,    -- n\n *   publicExponent     INTEGER     -- e\n * }\n *\n * PrivateKeyInfo ::= SEQUENCE {\n *   version                   Version,\n *   privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,\n *   privateKey                PrivateKey,\n *   attributes           [0]  IMPLICIT Attributes OPTIONAL\n * }\n *\n * Version ::= INTEGER\n * PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier\n * PrivateKey ::= OCTET STRING\n * Attributes ::= SET OF Attribute\n *\n * An RSA private key as the following structure:\n *\n * RSAPrivateKey ::= SEQUENCE {\n *   version Version,\n *   modulus INTEGER, -- n\n *   publicExponent INTEGER, -- e\n *   privateExponent INTEGER, -- d\n *   prime1 INTEGER, -- p\n *   prime2 INTEGER, -- q\n *   exponent1 INTEGER, -- d mod (p-1)\n *   exponent2 INTEGER, -- d mod (q-1)\n *   coefficient INTEGER -- (inverse of q) mod p\n * }\n *\n * Version ::= INTEGER\n *\n * The OID for the RSA key algorithm is: 1.2.840.113549.1.1.1\n */\nvar forge = require('./forge');\nrequire('./asn1');\nrequire('./jsbn');\nrequire('./oids');\nrequire('./pkcs1');\nrequire('./prime');\nrequire('./random');\nrequire('./util');\n\nif(typeof BigInteger === 'undefined') {\n  var BigInteger = forge.jsbn.BigInteger;\n}\n\nvar _crypto = forge.util.isNodejs ? require('crypto') : null;\n\n// shortcut for asn.1 API\nvar asn1 = forge.asn1;\n\n// shortcut for util API\nvar util = forge.util;\n\n/*\n * RSA encryption and decryption, see RFC 2313.\n */\nforge.pki = forge.pki || {};\nmodule.exports = forge.pki.rsa = forge.rsa = forge.rsa || {};\nvar pki = forge.pki;\n\n// for finding primes, which are 30k+i for i = 1, 7, 11, 13, 17, 19, 23, 29\nvar GCD_30_DELTA = [6, 4, 2, 4, 2, 4, 6, 2];\n\n// validator for a PrivateKeyInfo structure\nvar privateKeyValidator = {\n  // PrivateKeyInfo\n  name: 'PrivateKeyInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    // Version (INTEGER)\n    name: 'PrivateKeyInfo.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyVersion'\n  }, {\n    // privateKeyAlgorithm\n    name: 'PrivateKeyInfo.privateKeyAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'AlgorithmIdentifier.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'privateKeyOid'\n    }]\n  }, {\n    // PrivateKey\n    name: 'PrivateKeyInfo',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'privateKey'\n  }]\n};\n\n// validator for an RSA private key\nvar rsaPrivateKeyValidator = {\n  // RSAPrivateKey\n  name: 'RSAPrivateKey',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    // Version (INTEGER)\n    name: 'RSAPrivateKey.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyVersion'\n  }, {\n    // modulus (n)\n    name: 'RSAPrivateKey.modulus',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyModulus'\n  }, {\n    // publicExponent (e)\n    name: 'RSAPrivateKey.publicExponent',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyPublicExponent'\n  }, {\n    // privateExponent (d)\n    name: 'RSAPrivateKey.privateExponent',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyPrivateExponent'\n  }, {\n    // prime1 (p)\n    name: 'RSAPrivateKey.prime1',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyPrime1'\n  }, {\n    // prime2 (q)\n    name: 'RSAPrivateKey.prime2',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyPrime2'\n  }, {\n    // exponent1 (d mod (p-1))\n    name: 'RSAPrivateKey.exponent1',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyExponent1'\n  }, {\n    // exponent2 (d mod (q-1))\n    name: 'RSAPrivateKey.exponent2',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyExponent2'\n  }, {\n    // coefficient ((inverse of q) mod p)\n    name: 'RSAPrivateKey.coefficient',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyCoefficient'\n  }]\n};\n\n// validator for an RSA public key\nvar rsaPublicKeyValidator = {\n  // RSAPublicKey\n  name: 'RSAPublicKey',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    // modulus (n)\n    name: 'RSAPublicKey.modulus',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'publicKeyModulus'\n  }, {\n    // publicExponent (e)\n    name: 'RSAPublicKey.exponent',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'publicKeyExponent'\n  }]\n};\n\n// validator for an SubjectPublicKeyInfo structure\n// Note: Currently only works with an RSA public key\nvar publicKeyValidator = forge.pki.rsa.publicKeyValidator = {\n  name: 'SubjectPublicKeyInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  captureAsn1: 'subjectPublicKeyInfo',\n  value: [{\n    name: 'SubjectPublicKeyInfo.AlgorithmIdentifier',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'AlgorithmIdentifier.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'publicKeyOid'\n    }]\n  }, {\n    // subjectPublicKey\n    name: 'SubjectPublicKeyInfo.subjectPublicKey',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.BITSTRING,\n    constructed: false,\n    value: [{\n      // RSAPublicKey\n      name: 'SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      optional: true,\n      captureAsn1: 'rsaPublicKey'\n    }]\n  }]\n};\n\n// validator for a DigestInfo structure\nvar digestInfoValidator = {\n  name: 'DigestInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'DigestInfo.DigestAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'DigestInfo.DigestAlgorithm.algorithmIdentifier',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'algorithmIdentifier'\n    }, {\n      // NULL paramters\n      name: 'DigestInfo.DigestAlgorithm.parameters',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.NULL,\n      // captured only to check existence for md2 and md5\n      capture: 'parameters',\n      optional: true,\n      constructed: false\n    }]\n  }, {\n    // digest\n    name: 'DigestInfo.digest',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'digest'\n  }]\n};\n\n/**\n * Wrap digest in DigestInfo object.\n *\n * This function implements EMSA-PKCS1-v1_5-ENCODE as per RFC 3447.\n *\n * DigestInfo ::= SEQUENCE {\n *   digestAlgorithm DigestAlgorithmIdentifier,\n *   digest Digest\n * }\n *\n * DigestAlgorithmIdentifier ::= AlgorithmIdentifier\n * Digest ::= OCTET STRING\n *\n * @param md the message digest object with the hash to sign.\n *\n * @return the encoded message (ready for RSA encrytion)\n */\nvar emsaPkcs1v15encode = function(md) {\n  // get the oid for the algorithm\n  var oid;\n  if(md.algorithm in pki.oids) {\n    oid = pki.oids[md.algorithm];\n  } else {\n    var error = new Error('Unknown message digest algorithm.');\n    error.algorithm = md.algorithm;\n    throw error;\n  }\n  var oidBytes = asn1.oidToDer(oid).getBytes();\n\n  // create the digest info\n  var digestInfo = asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n  var digestAlgorithm = asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n  digestAlgorithm.value.push(asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.OID, false, oidBytes));\n  digestAlgorithm.value.push(asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.NULL, false, ''));\n  var digest = asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING,\n    false, md.digest().getBytes());\n  digestInfo.value.push(digestAlgorithm);\n  digestInfo.value.push(digest);\n\n  // encode digest info\n  return asn1.toDer(digestInfo).getBytes();\n};\n\n/**\n * Performs x^c mod n (RSA encryption or decryption operation).\n *\n * @param x the number to raise and mod.\n * @param key the key to use.\n * @param pub true if the key is public, false if private.\n *\n * @return the result of x^c mod n.\n */\nvar _modPow = function(x, key, pub) {\n  if(pub) {\n    return x.modPow(key.e, key.n);\n  }\n\n  if(!key.p || !key.q) {\n    // allow calculation without CRT params (slow)\n    return x.modPow(key.d, key.n);\n  }\n\n  // pre-compute dP, dQ, and qInv if necessary\n  if(!key.dP) {\n    key.dP = key.d.mod(key.p.subtract(BigInteger.ONE));\n  }\n  if(!key.dQ) {\n    key.dQ = key.d.mod(key.q.subtract(BigInteger.ONE));\n  }\n  if(!key.qInv) {\n    key.qInv = key.q.modInverse(key.p);\n  }\n\n  /* Chinese remainder theorem (CRT) states:\n\n    Suppose n1, n2, ..., nk are positive integers which are pairwise\n    coprime (n1 and n2 have no common factors other than 1). For any\n    integers x1, x2, ..., xk there exists an integer x solving the\n    system of simultaneous congruences (where ~= means modularly\n    congruent so a ~= b mod n means a mod n = b mod n):\n\n    x ~= x1 mod n1\n    x ~= x2 mod n2\n    ...\n    x ~= xk mod nk\n\n    This system of congruences has a single simultaneous solution x\n    between 0 and n - 1. Furthermore, each xk solution and x itself\n    is congruent modulo the product n = n1*n2*...*nk.\n    So x1 mod n = x2 mod n = xk mod n = x mod n.\n\n    The single simultaneous solution x can be solved with the following\n    equation:\n\n    x = sum(xi*ri*si) mod n where ri = n/ni and si = ri^-1 mod ni.\n\n    Where x is less than n, xi = x mod ni.\n\n    For RSA we are only concerned with k = 2. The modulus n = pq, where\n    p and q are coprime. The RSA decryption algorithm is:\n\n    y = x^d mod n\n\n    Given the above:\n\n    x1 = x^d mod p\n    r1 = n/p = q\n    s1 = q^-1 mod p\n    x2 = x^d mod q\n    r2 = n/q = p\n    s2 = p^-1 mod q\n\n    So y = (x1r1s1 + x2r2s2) mod n\n         = ((x^d mod p)q(q^-1 mod p) + (x^d mod q)p(p^-1 mod q)) mod n\n\n    According to Fermat's Little Theorem, if the modulus P is prime,\n    for any integer A not evenly divisible by P, A^(P-1) ~= 1 mod P.\n    Since A is not divisible by P it follows that if:\n    N ~= M mod (P - 1), then A^N mod P = A^M mod P. Therefore:\n\n    A^N mod P = A^(M mod (P - 1)) mod P. (The latter takes less effort\n    to calculate). In order to calculate x^d mod p more quickly the\n    exponent d mod (p - 1) is stored in the RSA private key (the same\n    is done for x^d mod q). These values are referred to as dP and dQ\n    respectively. Therefore we now have:\n\n    y = ((x^dP mod p)q(q^-1 mod p) + (x^dQ mod q)p(p^-1 mod q)) mod n\n\n    Since we'll be reducing x^dP by modulo p (same for q) we can also\n    reduce x by p (and q respectively) before hand. Therefore, let\n\n    xp = ((x mod p)^dP mod p), and\n    xq = ((x mod q)^dQ mod q), yielding:\n\n    y = (xp*q*(q^-1 mod p) + xq*p*(p^-1 mod q)) mod n\n\n    This can be further reduced to a simple algorithm that only\n    requires 1 inverse (the q inverse is used) to be used and stored.\n    The algorithm is called Garner's algorithm. If qInv is the\n    inverse of q, we simply calculate:\n\n    y = (qInv*(xp - xq) mod p) * q + xq\n\n    However, there are two further complications. First, we need to\n    ensure that xp > xq to prevent signed BigIntegers from being used\n    so we add p until this is true (since we will be mod'ing with\n    p anyway). Then, there is a known timing attack on algorithms\n    using the CRT. To mitigate this risk, \"cryptographic blinding\"\n    should be used. This requires simply generating a random number r\n    between 0 and n-1 and its inverse and multiplying x by r^e before\n    calculating y and then multiplying y by r^-1 afterwards. Note that\n    r must be coprime with n (gcd(r, n) === 1) in order to have an\n    inverse.\n  */\n\n  // cryptographic blinding\n  var r;\n  do {\n    r = new BigInteger(\n      forge.util.bytesToHex(forge.random.getBytes(key.n.bitLength() / 8)),\n      16);\n  } while(r.compareTo(key.n) >= 0 || !r.gcd(key.n).equals(BigInteger.ONE));\n  x = x.multiply(r.modPow(key.e, key.n)).mod(key.n);\n\n  // calculate xp and xq\n  var xp = x.mod(key.p).modPow(key.dP, key.p);\n  var xq = x.mod(key.q).modPow(key.dQ, key.q);\n\n  // xp must be larger than xq to avoid signed bit usage\n  while(xp.compareTo(xq) < 0) {\n    xp = xp.add(key.p);\n  }\n\n  // do last step\n  var y = xp.subtract(xq)\n    .multiply(key.qInv).mod(key.p)\n    .multiply(key.q).add(xq);\n\n  // remove effect of random for cryptographic blinding\n  y = y.multiply(r.modInverse(key.n)).mod(key.n);\n\n  return y;\n};\n\n/**\n * NOTE: THIS METHOD IS DEPRECATED, use 'sign' on a private key object or\n * 'encrypt' on a public key object instead.\n *\n * Performs RSA encryption.\n *\n * The parameter bt controls whether to put padding bytes before the\n * message passed in. Set bt to either true or false to disable padding\n * completely (in order to handle e.g. EMSA-PSS encoding seperately before),\n * signaling whether the encryption operation is a public key operation\n * (i.e. encrypting data) or not, i.e. private key operation (data signing).\n *\n * For PKCS#1 v1.5 padding pass in the block type to use, i.e. either 0x01\n * (for signing) or 0x02 (for encryption). The key operation mode (private\n * or public) is derived from this flag in that case).\n *\n * @param m the message to encrypt as a byte string.\n * @param key the RSA key to use.\n * @param bt for PKCS#1 v1.5 padding, the block type to use\n *   (0x01 for private key, 0x02 for public),\n *   to disable padding: true = public key, false = private key.\n *\n * @return the encrypted bytes as a string.\n */\npki.rsa.encrypt = function(m, key, bt) {\n  var pub = bt;\n  var eb;\n\n  // get the length of the modulus in bytes\n  var k = Math.ceil(key.n.bitLength() / 8);\n\n  if(bt !== false && bt !== true) {\n    // legacy, default to PKCS#1 v1.5 padding\n    pub = (bt === 0x02);\n    eb = _encodePkcs1_v1_5(m, key, bt);\n  } else {\n    eb = forge.util.createBuffer();\n    eb.putBytes(m);\n  }\n\n  // load encryption block as big integer 'x'\n  // FIXME: hex conversion inefficient, get BigInteger w/byte strings\n  var x = new BigInteger(eb.toHex(), 16);\n\n  // do RSA encryption\n  var y = _modPow(x, key, pub);\n\n  // convert y into the encrypted data byte string, if y is shorter in\n  // bytes than k, then prepend zero bytes to fill up ed\n  // FIXME: hex conversion inefficient, get BigInteger w/byte strings\n  var yhex = y.toString(16);\n  var ed = forge.util.createBuffer();\n  var zeros = k - Math.ceil(yhex.length / 2);\n  while(zeros > 0) {\n    ed.putByte(0x00);\n    --zeros;\n  }\n  ed.putBytes(forge.util.hexToBytes(yhex));\n  return ed.getBytes();\n};\n\n/**\n * NOTE: THIS METHOD IS DEPRECATED, use 'decrypt' on a private key object or\n * 'verify' on a public key object instead.\n *\n * Performs RSA decryption.\n *\n * The parameter ml controls whether to apply PKCS#1 v1.5 padding\n * or not.  Set ml = false to disable padding removal completely\n * (in order to handle e.g. EMSA-PSS later on) and simply pass back\n * the RSA encryption block.\n *\n * @param ed the encrypted data to decrypt in as a byte string.\n * @param key the RSA key to use.\n * @param pub true for a public key operation, false for private.\n * @param ml the message length, if known, false to disable padding.\n *\n * @return the decrypted message as a byte string.\n */\npki.rsa.decrypt = function(ed, key, pub, ml) {\n  // get the length of the modulus in bytes\n  var k = Math.ceil(key.n.bitLength() / 8);\n\n  // error if the length of the encrypted data ED is not k\n  if(ed.length !== k) {\n    var error = new Error('Encrypted message length is invalid.');\n    error.length = ed.length;\n    error.expected = k;\n    throw error;\n  }\n\n  // convert encrypted data into a big integer\n  // FIXME: hex conversion inefficient, get BigInteger w/byte strings\n  var y = new BigInteger(forge.util.createBuffer(ed).toHex(), 16);\n\n  // y must be less than the modulus or it wasn't the result of\n  // a previous mod operation (encryption) using that modulus\n  if(y.compareTo(key.n) >= 0) {\n    throw new Error('Encrypted message is invalid.');\n  }\n\n  // do RSA decryption\n  var x = _modPow(y, key, pub);\n\n  // create the encryption block, if x is shorter in bytes than k, then\n  // prepend zero bytes to fill up eb\n  // FIXME: hex conversion inefficient, get BigInteger w/byte strings\n  var xhex = x.toString(16);\n  var eb = forge.util.createBuffer();\n  var zeros = k - Math.ceil(xhex.length / 2);\n  while(zeros > 0) {\n    eb.putByte(0x00);\n    --zeros;\n  }\n  eb.putBytes(forge.util.hexToBytes(xhex));\n\n  if(ml !== false) {\n    // legacy, default to PKCS#1 v1.5 padding\n    return _decodePkcs1_v1_5(eb.getBytes(), key, pub);\n  }\n\n  // return message\n  return eb.getBytes();\n};\n\n/**\n * Creates an RSA key-pair generation state object. It is used to allow\n * key-generation to be performed in steps. It also allows for a UI to\n * display progress updates.\n *\n * @param bits the size for the private key in bits, defaults to 2048.\n * @param e the public exponent to use, defaults to 65537 (0x10001).\n * @param [options] the options to use.\n *          prng a custom crypto-secure pseudo-random number generator to use,\n *            that must define \"getBytesSync\".\n *          algorithm the algorithm to use (default: 'PRIMEINC').\n *\n * @return the state object to use to generate the key-pair.\n */\npki.rsa.createKeyPairGenerationState = function(bits, e, options) {\n  // TODO: migrate step-based prime generation code to forge.prime\n\n  // set default bits\n  if(typeof(bits) === 'string') {\n    bits = parseInt(bits, 10);\n  }\n  bits = bits || 2048;\n\n  // create prng with api that matches BigInteger secure random\n  options = options || {};\n  var prng = options.prng || forge.random;\n  var rng = {\n    // x is an array to fill with bytes\n    nextBytes: function(x) {\n      var b = prng.getBytesSync(x.length);\n      for(var i = 0; i < x.length; ++i) {\n        x[i] = b.charCodeAt(i);\n      }\n    }\n  };\n\n  var algorithm = options.algorithm || 'PRIMEINC';\n\n  // create PRIMEINC algorithm state\n  var rval;\n  if(algorithm === 'PRIMEINC') {\n    rval = {\n      algorithm: algorithm,\n      state: 0,\n      bits: bits,\n      rng: rng,\n      eInt: e || 65537,\n      e: new BigInteger(null),\n      p: null,\n      q: null,\n      qBits: bits >> 1,\n      pBits: bits - (bits >> 1),\n      pqState: 0,\n      num: null,\n      keys: null\n    };\n    rval.e.fromInt(rval.eInt);\n  } else {\n    throw new Error('Invalid key generation algorithm: ' + algorithm);\n  }\n\n  return rval;\n};\n\n/**\n * Attempts to runs the key-generation algorithm for at most n seconds\n * (approximately) using the given state. When key-generation has completed,\n * the keys will be stored in state.keys.\n *\n * To use this function to update a UI while generating a key or to prevent\n * causing browser lockups/warnings, set \"n\" to a value other than 0. A\n * simple pattern for generating a key and showing a progress indicator is:\n *\n * var state = pki.rsa.createKeyPairGenerationState(2048);\n * var step = function() {\n *   // step key-generation, run algorithm for 100 ms, repeat\n *   if(!forge.pki.rsa.stepKeyPairGenerationState(state, 100)) {\n *     setTimeout(step, 1);\n *   } else {\n *     // key-generation complete\n *     // TODO: turn off progress indicator here\n *     // TODO: use the generated key-pair in \"state.keys\"\n *   }\n * };\n * // TODO: turn on progress indicator here\n * setTimeout(step, 0);\n *\n * @param state the state to use.\n * @param n the maximum number of milliseconds to run the algorithm for, 0\n *          to run the algorithm to completion.\n *\n * @return true if the key-generation completed, false if not.\n */\npki.rsa.stepKeyPairGenerationState = function(state, n) {\n  // set default algorithm if not set\n  if(!('algorithm' in state)) {\n    state.algorithm = 'PRIMEINC';\n  }\n\n  // TODO: migrate step-based prime generation code to forge.prime\n  // TODO: abstract as PRIMEINC algorithm\n\n  // do key generation (based on Tom Wu's rsa.js, see jsbn.js license)\n  // with some minor optimizations and designed to run in steps\n\n  // local state vars\n  var THIRTY = new BigInteger(null);\n  THIRTY.fromInt(30);\n  var deltaIdx = 0;\n  var op_or = function(x, y) {return x | y;};\n\n  // keep stepping until time limit is reached or done\n  var t1 = +new Date();\n  var t2;\n  var total = 0;\n  while(state.keys === null && (n <= 0 || total < n)) {\n    // generate p or q\n    if(state.state === 0) {\n      /* Note: All primes are of the form:\n\n        30k+i, for i < 30 and gcd(30, i)=1, where there are 8 values for i\n\n        When we generate a random number, we always align it at 30k + 1. Each\n        time the number is determined not to be prime we add to get to the\n        next 'i', eg: if the number was at 30k + 1 we add 6. */\n      var bits = (state.p === null) ? state.pBits : state.qBits;\n      var bits1 = bits - 1;\n\n      // get a random number\n      if(state.pqState === 0) {\n        state.num = new BigInteger(bits, state.rng);\n        // force MSB set\n        if(!state.num.testBit(bits1)) {\n          state.num.bitwiseTo(\n            BigInteger.ONE.shiftLeft(bits1), op_or, state.num);\n        }\n        // align number on 30k+1 boundary\n        state.num.dAddOffset(31 - state.num.mod(THIRTY).byteValue(), 0);\n        deltaIdx = 0;\n\n        ++state.pqState;\n      } else if(state.pqState === 1) {\n        // try to make the number a prime\n        if(state.num.bitLength() > bits) {\n          // overflow, try again\n          state.pqState = 0;\n          // do primality test\n        } else if(state.num.isProbablePrime(\n          _getMillerRabinTests(state.num.bitLength()))) {\n          ++state.pqState;\n        } else {\n          // get next potential prime\n          state.num.dAddOffset(GCD_30_DELTA[deltaIdx++ % 8], 0);\n        }\n      } else if(state.pqState === 2) {\n        // ensure number is coprime with e\n        state.pqState =\n          (state.num.subtract(BigInteger.ONE).gcd(state.e)\n            .compareTo(BigInteger.ONE) === 0) ? 3 : 0;\n      } else if(state.pqState === 3) {\n        // store p or q\n        state.pqState = 0;\n        if(state.p === null) {\n          state.p = state.num;\n        } else {\n          state.q = state.num;\n        }\n\n        // advance state if both p and q are ready\n        if(state.p !== null && state.q !== null) {\n          ++state.state;\n        }\n        state.num = null;\n      }\n    } else if(state.state === 1) {\n      // ensure p is larger than q (swap them if not)\n      if(state.p.compareTo(state.q) < 0) {\n        state.num = state.p;\n        state.p = state.q;\n        state.q = state.num;\n      }\n      ++state.state;\n    } else if(state.state === 2) {\n      // compute phi: (p - 1)(q - 1) (Euler's totient function)\n      state.p1 = state.p.subtract(BigInteger.ONE);\n      state.q1 = state.q.subtract(BigInteger.ONE);\n      state.phi = state.p1.multiply(state.q1);\n      ++state.state;\n    } else if(state.state === 3) {\n      // ensure e and phi are coprime\n      if(state.phi.gcd(state.e).compareTo(BigInteger.ONE) === 0) {\n        // phi and e are coprime, advance\n        ++state.state;\n      } else {\n        // phi and e aren't coprime, so generate a new p and q\n        state.p = null;\n        state.q = null;\n        state.state = 0;\n      }\n    } else if(state.state === 4) {\n      // create n, ensure n is has the right number of bits\n      state.n = state.p.multiply(state.q);\n\n      // ensure n is right number of bits\n      if(state.n.bitLength() === state.bits) {\n        // success, advance\n        ++state.state;\n      } else {\n        // failed, get new q\n        state.q = null;\n        state.state = 0;\n      }\n    } else if(state.state === 5) {\n      // set keys\n      var d = state.e.modInverse(state.phi);\n      state.keys = {\n        privateKey: pki.rsa.setPrivateKey(\n          state.n, state.e, d, state.p, state.q,\n          d.mod(state.p1), d.mod(state.q1),\n          state.q.modInverse(state.p)),\n        publicKey: pki.rsa.setPublicKey(state.n, state.e)\n      };\n    }\n\n    // update timing\n    t2 = +new Date();\n    total += t2 - t1;\n    t1 = t2;\n  }\n\n  return state.keys !== null;\n};\n\n/**\n * Generates an RSA public-private key pair in a single call.\n *\n * To generate a key-pair in steps (to allow for progress updates and to\n * prevent blocking or warnings in slow browsers) then use the key-pair\n * generation state functions.\n *\n * To generate a key-pair asynchronously (either through web-workers, if\n * available, or by breaking up the work on the main thread), pass a\n * callback function.\n *\n * @param [bits] the size for the private key in bits, defaults to 2048.\n * @param [e] the public exponent to use, defaults to 65537.\n * @param [options] options for key-pair generation, if given then 'bits'\n *            and 'e' must *not* be given:\n *          bits the size for the private key in bits, (default: 2048).\n *          e the public exponent to use, (default: 65537 (0x10001)).\n *          workerScript the worker script URL.\n *          workers the number of web workers (if supported) to use,\n *            (default: 2).\n *          workLoad the size of the work load, ie: number of possible prime\n *            numbers for each web worker to check per work assignment,\n *            (default: 100).\n *          prng a custom crypto-secure pseudo-random number generator to use,\n *            that must define \"getBytesSync\". Disables use of native APIs.\n *          algorithm the algorithm to use (default: 'PRIMEINC').\n * @param [callback(err, keypair)] called once the operation completes.\n *\n * @return an object with privateKey and publicKey properties.\n */\npki.rsa.generateKeyPair = function(bits, e, options, callback) {\n  // (bits), (options), (callback)\n  if(arguments.length === 1) {\n    if(typeof bits === 'object') {\n      options = bits;\n      bits = undefined;\n    } else if(typeof bits === 'function') {\n      callback = bits;\n      bits = undefined;\n    }\n  } else if(arguments.length === 2) {\n    // (bits, e), (bits, options), (bits, callback), (options, callback)\n    if(typeof bits === 'number') {\n      if(typeof e === 'function') {\n        callback = e;\n        e = undefined;\n      } else if(typeof e !== 'number') {\n        options = e;\n        e = undefined;\n      }\n    } else {\n      options = bits;\n      callback = e;\n      bits = undefined;\n      e = undefined;\n    }\n  } else if(arguments.length === 3) {\n    // (bits, e, options), (bits, e, callback), (bits, options, callback)\n    if(typeof e === 'number') {\n      if(typeof options === 'function') {\n        callback = options;\n        options = undefined;\n      }\n    } else {\n      callback = options;\n      options = e;\n      e = undefined;\n    }\n  }\n  options = options || {};\n  if(bits === undefined) {\n    bits = options.bits || 2048;\n  }\n  if(e === undefined) {\n    e = options.e || 0x10001;\n  }\n\n  // use native code if permitted, available, and parameters are acceptable\n  if(!forge.options.usePureJavaScript && !options.prng &&\n    bits >= 256 && bits <= 16384 && (e === 0x10001 || e === 3)) {\n    if(callback) {\n      // try native async\n      if(_detectNodeCrypto('generateKeyPair')) {\n        return _crypto.generateKeyPair('rsa', {\n          modulusLength: bits,\n          publicExponent: e,\n          publicKeyEncoding: {\n            type: 'spki',\n            format: 'pem'\n          },\n          privateKeyEncoding: {\n            type: 'pkcs8',\n            format: 'pem'\n          }\n        }, function(err, pub, priv) {\n          if(err) {\n            return callback(err);\n          }\n          callback(null, {\n            privateKey: pki.privateKeyFromPem(priv),\n            publicKey: pki.publicKeyFromPem(pub)\n          });\n        });\n      }\n      if(_detectSubtleCrypto('generateKey') &&\n        _detectSubtleCrypto('exportKey')) {\n        // use standard native generateKey\n        return util.globalScope.crypto.subtle.generateKey({\n          name: 'RSASSA-PKCS1-v1_5',\n          modulusLength: bits,\n          publicExponent: _intToUint8Array(e),\n          hash: {name: 'SHA-256'}\n        }, true /* key can be exported*/, ['sign', 'verify'])\n        .then(function(pair) {\n          return util.globalScope.crypto.subtle.exportKey(\n            'pkcs8', pair.privateKey);\n        // avoiding catch(function(err) {...}) to support IE <= 8\n        }).then(undefined, function(err) {\n          callback(err);\n        }).then(function(pkcs8) {\n          if(pkcs8) {\n            var privateKey = pki.privateKeyFromAsn1(\n              asn1.fromDer(forge.util.createBuffer(pkcs8)));\n            callback(null, {\n              privateKey: privateKey,\n              publicKey: pki.setRsaPublicKey(privateKey.n, privateKey.e)\n            });\n          }\n        });\n      }\n      if(_detectSubtleMsCrypto('generateKey') &&\n        _detectSubtleMsCrypto('exportKey')) {\n        var genOp = util.globalScope.msCrypto.subtle.generateKey({\n          name: 'RSASSA-PKCS1-v1_5',\n          modulusLength: bits,\n          publicExponent: _intToUint8Array(e),\n          hash: {name: 'SHA-256'}\n        }, true /* key can be exported*/, ['sign', 'verify']);\n        genOp.oncomplete = function(e) {\n          var pair = e.target.result;\n          var exportOp = util.globalScope.msCrypto.subtle.exportKey(\n            'pkcs8', pair.privateKey);\n          exportOp.oncomplete = function(e) {\n            var pkcs8 = e.target.result;\n            var privateKey = pki.privateKeyFromAsn1(\n              asn1.fromDer(forge.util.createBuffer(pkcs8)));\n            callback(null, {\n              privateKey: privateKey,\n              publicKey: pki.setRsaPublicKey(privateKey.n, privateKey.e)\n            });\n          };\n          exportOp.onerror = function(err) {\n            callback(err);\n          };\n        };\n        genOp.onerror = function(err) {\n          callback(err);\n        };\n        return;\n      }\n    } else {\n      // try native sync\n      if(_detectNodeCrypto('generateKeyPairSync')) {\n        var keypair = _crypto.generateKeyPairSync('rsa', {\n          modulusLength: bits,\n          publicExponent: e,\n          publicKeyEncoding: {\n            type: 'spki',\n            format: 'pem'\n          },\n          privateKeyEncoding: {\n            type: 'pkcs8',\n            format: 'pem'\n          }\n        });\n        return {\n          privateKey: pki.privateKeyFromPem(keypair.privateKey),\n          publicKey: pki.publicKeyFromPem(keypair.publicKey)\n        };\n      }\n    }\n  }\n\n  // use JavaScript implementation\n  var state = pki.rsa.createKeyPairGenerationState(bits, e, options);\n  if(!callback) {\n    pki.rsa.stepKeyPairGenerationState(state, 0);\n    return state.keys;\n  }\n  _generateKeyPair(state, options, callback);\n};\n\n/**\n * Sets an RSA public key from BigIntegers modulus and exponent.\n *\n * @param n the modulus.\n * @param e the exponent.\n *\n * @return the public key.\n */\npki.setRsaPublicKey = pki.rsa.setPublicKey = function(n, e) {\n  var key = {\n    n: n,\n    e: e\n  };\n\n  /**\n   * Encrypts the given data with this public key. Newer applications\n   * should use the 'RSA-OAEP' decryption scheme, 'RSAES-PKCS1-V1_5' is for\n   * legacy applications.\n   *\n   * @param data the byte string to encrypt.\n   * @param scheme the encryption scheme to use:\n   *          'RSAES-PKCS1-V1_5' (default),\n   *          'RSA-OAEP',\n   *          'RAW', 'NONE', or null to perform raw RSA encryption,\n   *          an object with an 'encode' property set to a function\n   *          with the signature 'function(data, key)' that returns\n   *          a binary-encoded string representing the encoded data.\n   * @param schemeOptions any scheme-specific options.\n   *\n   * @return the encrypted byte string.\n   */\n  key.encrypt = function(data, scheme, schemeOptions) {\n    if(typeof scheme === 'string') {\n      scheme = scheme.toUpperCase();\n    } else if(scheme === undefined) {\n      scheme = 'RSAES-PKCS1-V1_5';\n    }\n\n    if(scheme === 'RSAES-PKCS1-V1_5') {\n      scheme = {\n        encode: function(m, key, pub) {\n          return _encodePkcs1_v1_5(m, key, 0x02).getBytes();\n        }\n      };\n    } else if(scheme === 'RSA-OAEP' || scheme === 'RSAES-OAEP') {\n      scheme = {\n        encode: function(m, key) {\n          return forge.pkcs1.encode_rsa_oaep(key, m, schemeOptions);\n        }\n      };\n    } else if(['RAW', 'NONE', 'NULL', null].indexOf(scheme) !== -1) {\n      scheme = {encode: function(e) {return e;}};\n    } else if(typeof scheme === 'string') {\n      throw new Error('Unsupported encryption scheme: \"' + scheme + '\".');\n    }\n\n    // do scheme-based encoding then rsa encryption\n    var e = scheme.encode(data, key, true);\n    return pki.rsa.encrypt(e, key, true);\n  };\n\n  /**\n   * Verifies the given signature against the given digest.\n   *\n   * PKCS#1 supports multiple (currently two) signature schemes:\n   * RSASSA-PKCS1-V1_5 and RSASSA-PSS.\n   *\n   * By default this implementation uses the \"old scheme\", i.e.\n   * RSASSA-PKCS1-V1_5, in which case once RSA-decrypted, the\n   * signature is an OCTET STRING that holds a DigestInfo.\n   *\n   * DigestInfo ::= SEQUENCE {\n   *   digestAlgorithm DigestAlgorithmIdentifier,\n   *   digest Digest\n   * }\n   * DigestAlgorithmIdentifier ::= AlgorithmIdentifier\n   * Digest ::= OCTET STRING\n   *\n   * To perform PSS signature verification, provide an instance\n   * of Forge PSS object as the scheme parameter.\n   *\n   * @param digest the message digest hash to compare against the signature,\n   *          as a binary-encoded string.\n   * @param signature the signature to verify, as a binary-encoded string.\n   * @param scheme signature verification scheme to use:\n   *          'RSASSA-PKCS1-V1_5' or undefined for RSASSA PKCS#1 v1.5,\n   *          a Forge PSS object for RSASSA-PSS,\n   *          'NONE' or null for none, DigestInfo will not be expected, but\n   *            PKCS#1 v1.5 padding will still be used.\n   * @param options optional verify options\n   *          _parseAllDigestBytes testing flag to control parsing of all\n   *            digest bytes. Unsupported and not for general usage.\n   *            (default: true)\n   *\n   * @return true if the signature was verified, false if not.\n   */\n  key.verify = function(digest, signature, scheme, options) {\n    if(typeof scheme === 'string') {\n      scheme = scheme.toUpperCase();\n    } else if(scheme === undefined) {\n      scheme = 'RSASSA-PKCS1-V1_5';\n    }\n    if(options === undefined) {\n      options = {\n        _parseAllDigestBytes: true\n      };\n    }\n    if(!('_parseAllDigestBytes' in options)) {\n      options._parseAllDigestBytes = true;\n    }\n\n    if(scheme === 'RSASSA-PKCS1-V1_5') {\n      scheme = {\n        verify: function(digest, d) {\n          // remove padding\n          d = _decodePkcs1_v1_5(d, key, true);\n          // d is ASN.1 BER-encoded DigestInfo\n          var obj = asn1.fromDer(d, {\n            parseAllBytes: options._parseAllDigestBytes\n          });\n\n          // validate DigestInfo\n          var capture = {};\n          var errors = [];\n          if(!asn1.validate(obj, digestInfoValidator, capture, errors)) {\n            var error = new Error(\n              'ASN.1 object does not contain a valid RSASSA-PKCS1-v1_5 ' +\n              'DigestInfo value.');\n            error.errors = errors;\n            throw error;\n          }\n          // check hash algorithm identifier\n          // see PKCS1-v1-5DigestAlgorithms in RFC 8017\n          // FIXME: add support to vaidator for strict value choices\n          var oid = asn1.derToOid(capture.algorithmIdentifier);\n          if(!(oid === forge.oids.md2 ||\n            oid === forge.oids.md5 ||\n            oid === forge.oids.sha1 ||\n            oid === forge.oids.sha224 ||\n            oid === forge.oids.sha256 ||\n            oid === forge.oids.sha384 ||\n            oid === forge.oids.sha512 ||\n            oid === forge.oids['sha512-224'] ||\n            oid === forge.oids['sha512-256'])) {\n            var error = new Error(\n              'Unknown RSASSA-PKCS1-v1_5 DigestAlgorithm identifier.');\n            error.oid = oid;\n            throw error;\n          }\n\n          // special check for md2 and md5 that NULL parameters exist\n          if(oid === forge.oids.md2 || oid === forge.oids.md5) {\n            if(!('parameters' in capture)) {\n              throw new Error(\n                'ASN.1 object does not contain a valid RSASSA-PKCS1-v1_5 ' +\n                'DigestInfo value. ' +\n                'Missing algorithm identifer NULL parameters.');\n            }\n          }\n\n          // compare the given digest to the decrypted one\n          return digest === capture.digest;\n        }\n      };\n    } else if(scheme === 'NONE' || scheme === 'NULL' || scheme === null) {\n      scheme = {\n        verify: function(digest, d) {\n          // remove padding\n          d = _decodePkcs1_v1_5(d, key, true);\n          return digest === d;\n        }\n      };\n    }\n\n    // do rsa decryption w/o any decoding, then verify -- which does decoding\n    var d = pki.rsa.decrypt(signature, key, true, false);\n    return scheme.verify(digest, d, key.n.bitLength());\n  };\n\n  return key;\n};\n\n/**\n * Sets an RSA private key from BigIntegers modulus, exponent, primes,\n * prime exponents, and modular multiplicative inverse.\n *\n * @param n the modulus.\n * @param e the public exponent.\n * @param d the private exponent ((inverse of e) mod n).\n * @param p the first prime.\n * @param q the second prime.\n * @param dP exponent1 (d mod (p-1)).\n * @param dQ exponent2 (d mod (q-1)).\n * @param qInv ((inverse of q) mod p)\n *\n * @return the private key.\n */\npki.setRsaPrivateKey = pki.rsa.setPrivateKey = function(\n  n, e, d, p, q, dP, dQ, qInv) {\n  var key = {\n    n: n,\n    e: e,\n    d: d,\n    p: p,\n    q: q,\n    dP: dP,\n    dQ: dQ,\n    qInv: qInv\n  };\n\n  /**\n   * Decrypts the given data with this private key. The decryption scheme\n   * must match the one used to encrypt the data.\n   *\n   * @param data the byte string to decrypt.\n   * @param scheme the decryption scheme to use:\n   *          'RSAES-PKCS1-V1_5' (default),\n   *          'RSA-OAEP',\n   *          'RAW', 'NONE', or null to perform raw RSA decryption.\n   * @param schemeOptions any scheme-specific options.\n   *\n   * @return the decrypted byte string.\n   */\n  key.decrypt = function(data, scheme, schemeOptions) {\n    if(typeof scheme === 'string') {\n      scheme = scheme.toUpperCase();\n    } else if(scheme === undefined) {\n      scheme = 'RSAES-PKCS1-V1_5';\n    }\n\n    // do rsa decryption w/o any decoding\n    var d = pki.rsa.decrypt(data, key, false, false);\n\n    if(scheme === 'RSAES-PKCS1-V1_5') {\n      scheme = {decode: _decodePkcs1_v1_5};\n    } else if(scheme === 'RSA-OAEP' || scheme === 'RSAES-OAEP') {\n      scheme = {\n        decode: function(d, key) {\n          return forge.pkcs1.decode_rsa_oaep(key, d, schemeOptions);\n        }\n      };\n    } else if(['RAW', 'NONE', 'NULL', null].indexOf(scheme) !== -1) {\n      scheme = {decode: function(d) {return d;}};\n    } else {\n      throw new Error('Unsupported encryption scheme: \"' + scheme + '\".');\n    }\n\n    // decode according to scheme\n    return scheme.decode(d, key, false);\n  };\n\n  /**\n   * Signs the given digest, producing a signature.\n   *\n   * PKCS#1 supports multiple (currently two) signature schemes:\n   * RSASSA-PKCS1-V1_5 and RSASSA-PSS.\n   *\n   * By default this implementation uses the \"old scheme\", i.e.\n   * RSASSA-PKCS1-V1_5. In order to generate a PSS signature, provide\n   * an instance of Forge PSS object as the scheme parameter.\n   *\n   * @param md the message digest object with the hash to sign.\n   * @param scheme the signature scheme to use:\n   *          'RSASSA-PKCS1-V1_5' or undefined for RSASSA PKCS#1 v1.5,\n   *          a Forge PSS object for RSASSA-PSS,\n   *          'NONE' or null for none, DigestInfo will not be used but\n   *            PKCS#1 v1.5 padding will still be used.\n   *\n   * @return the signature as a byte string.\n   */\n  key.sign = function(md, scheme) {\n    /* Note: The internal implementation of RSA operations is being\n      transitioned away from a PKCS#1 v1.5 hard-coded scheme. Some legacy\n      code like the use of an encoding block identifier 'bt' will eventually\n      be removed. */\n\n    // private key operation\n    var bt = false;\n\n    if(typeof scheme === 'string') {\n      scheme = scheme.toUpperCase();\n    }\n\n    if(scheme === undefined || scheme === 'RSASSA-PKCS1-V1_5') {\n      scheme = {encode: emsaPkcs1v15encode};\n      bt = 0x01;\n    } else if(scheme === 'NONE' || scheme === 'NULL' || scheme === null) {\n      scheme = {encode: function() {return md;}};\n      bt = 0x01;\n    }\n\n    // encode and then encrypt\n    var d = scheme.encode(md, key.n.bitLength());\n    return pki.rsa.encrypt(d, key, bt);\n  };\n\n  return key;\n};\n\n/**\n * Wraps an RSAPrivateKey ASN.1 object in an ASN.1 PrivateKeyInfo object.\n *\n * @param rsaKey the ASN.1 RSAPrivateKey.\n *\n * @return the ASN.1 PrivateKeyInfo.\n */\npki.wrapRsaPrivateKey = function(rsaKey) {\n  // PrivateKeyInfo\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version (0)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(0).getBytes()),\n    // privateKeyAlgorithm\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(pki.oids.rsaEncryption).getBytes()),\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n    ]),\n    // PrivateKey\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n      asn1.toDer(rsaKey).getBytes())\n  ]);\n};\n\n/**\n * Converts a private key from an ASN.1 object.\n *\n * @param obj the ASN.1 representation of a PrivateKeyInfo containing an\n *          RSAPrivateKey or an RSAPrivateKey.\n *\n * @return the private key.\n */\npki.privateKeyFromAsn1 = function(obj) {\n  // get PrivateKeyInfo\n  var capture = {};\n  var errors = [];\n  if(asn1.validate(obj, privateKeyValidator, capture, errors)) {\n    obj = asn1.fromDer(forge.util.createBuffer(capture.privateKey));\n  }\n\n  // get RSAPrivateKey\n  capture = {};\n  errors = [];\n  if(!asn1.validate(obj, rsaPrivateKeyValidator, capture, errors)) {\n    var error = new Error('Cannot read private key. ' +\n      'ASN.1 object does not contain an RSAPrivateKey.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // Note: Version is currently ignored.\n  // capture.privateKeyVersion\n  // FIXME: inefficient, get a BigInteger that uses byte strings\n  var n, e, d, p, q, dP, dQ, qInv;\n  n = forge.util.createBuffer(capture.privateKeyModulus).toHex();\n  e = forge.util.createBuffer(capture.privateKeyPublicExponent).toHex();\n  d = forge.util.createBuffer(capture.privateKeyPrivateExponent).toHex();\n  p = forge.util.createBuffer(capture.privateKeyPrime1).toHex();\n  q = forge.util.createBuffer(capture.privateKeyPrime2).toHex();\n  dP = forge.util.createBuffer(capture.privateKeyExponent1).toHex();\n  dQ = forge.util.createBuffer(capture.privateKeyExponent2).toHex();\n  qInv = forge.util.createBuffer(capture.privateKeyCoefficient).toHex();\n\n  // set private key\n  return pki.setRsaPrivateKey(\n    new BigInteger(n, 16),\n    new BigInteger(e, 16),\n    new BigInteger(d, 16),\n    new BigInteger(p, 16),\n    new BigInteger(q, 16),\n    new BigInteger(dP, 16),\n    new BigInteger(dQ, 16),\n    new BigInteger(qInv, 16));\n};\n\n/**\n * Converts a private key to an ASN.1 RSAPrivateKey.\n *\n * @param key the private key.\n *\n * @return the ASN.1 representation of an RSAPrivateKey.\n */\npki.privateKeyToAsn1 = pki.privateKeyToRSAPrivateKey = function(key) {\n  // RSAPrivateKey\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version (0 = only 2 primes, 1 multiple primes)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(0).getBytes()),\n    // modulus (n)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.n)),\n    // publicExponent (e)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.e)),\n    // privateExponent (d)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.d)),\n    // privateKeyPrime1 (p)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.p)),\n    // privateKeyPrime2 (q)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.q)),\n    // privateKeyExponent1 (dP)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.dP)),\n    // privateKeyExponent2 (dQ)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.dQ)),\n    // coefficient (qInv)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.qInv))\n  ]);\n};\n\n/**\n * Converts a public key from an ASN.1 SubjectPublicKeyInfo or RSAPublicKey.\n *\n * @param obj the asn1 representation of a SubjectPublicKeyInfo or RSAPublicKey.\n *\n * @return the public key.\n */\npki.publicKeyFromAsn1 = function(obj) {\n  // get SubjectPublicKeyInfo\n  var capture = {};\n  var errors = [];\n  if(asn1.validate(obj, publicKeyValidator, capture, errors)) {\n    // get oid\n    var oid = asn1.derToOid(capture.publicKeyOid);\n    if(oid !== pki.oids.rsaEncryption) {\n      var error = new Error('Cannot read public key. Unknown OID.');\n      error.oid = oid;\n      throw error;\n    }\n    obj = capture.rsaPublicKey;\n  }\n\n  // get RSA params\n  errors = [];\n  if(!asn1.validate(obj, rsaPublicKeyValidator, capture, errors)) {\n    var error = new Error('Cannot read public key. ' +\n      'ASN.1 object does not contain an RSAPublicKey.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // FIXME: inefficient, get a BigInteger that uses byte strings\n  var n = forge.util.createBuffer(capture.publicKeyModulus).toHex();\n  var e = forge.util.createBuffer(capture.publicKeyExponent).toHex();\n\n  // set public key\n  return pki.setRsaPublicKey(\n    new BigInteger(n, 16),\n    new BigInteger(e, 16));\n};\n\n/**\n * Converts a public key to an ASN.1 SubjectPublicKeyInfo.\n *\n * @param key the public key.\n *\n * @return the asn1 representation of a SubjectPublicKeyInfo.\n */\npki.publicKeyToAsn1 = pki.publicKeyToSubjectPublicKeyInfo = function(key) {\n  // SubjectPublicKeyInfo\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // AlgorithmIdentifier\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(pki.oids.rsaEncryption).getBytes()),\n      // parameters (null)\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n    ]),\n    // subjectPublicKey\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, [\n      pki.publicKeyToRSAPublicKey(key)\n    ])\n  ]);\n};\n\n/**\n * Converts a public key to an ASN.1 RSAPublicKey.\n *\n * @param key the public key.\n *\n * @return the asn1 representation of a RSAPublicKey.\n */\npki.publicKeyToRSAPublicKey = function(key) {\n  // RSAPublicKey\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // modulus (n)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.n)),\n    // publicExponent (e)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.e))\n  ]);\n};\n\n/**\n * Encodes a message using PKCS#1 v1.5 padding.\n *\n * @param m the message to encode.\n * @param key the RSA key to use.\n * @param bt the block type to use, i.e. either 0x01 (for signing) or 0x02\n *          (for encryption).\n *\n * @return the padded byte buffer.\n */\nfunction _encodePkcs1_v1_5(m, key, bt) {\n  var eb = forge.util.createBuffer();\n\n  // get the length of the modulus in bytes\n  var k = Math.ceil(key.n.bitLength() / 8);\n\n  /* use PKCS#1 v1.5 padding */\n  if(m.length > (k - 11)) {\n    var error = new Error('Message is too long for PKCS#1 v1.5 padding.');\n    error.length = m.length;\n    error.max = k - 11;\n    throw error;\n  }\n\n  /* A block type BT, a padding string PS, and the data D shall be\n    formatted into an octet string EB, the encryption block:\n\n    EB = 00 || BT || PS || 00 || D\n\n    The block type BT shall be a single octet indicating the structure of\n    the encryption block. For this version of the document it shall have\n    value 00, 01, or 02. For a private-key operation, the block type\n    shall be 00 or 01. For a public-key operation, it shall be 02.\n\n    The padding string PS shall consist of k-3-||D|| octets. For block\n    type 00, the octets shall have value 00; for block type 01, they\n    shall have value FF; and for block type 02, they shall be\n    pseudorandomly generated and nonzero. This makes the length of the\n    encryption block EB equal to k. */\n\n  // build the encryption block\n  eb.putByte(0x00);\n  eb.putByte(bt);\n\n  // create the padding\n  var padNum = k - 3 - m.length;\n  var padByte;\n  // private key op\n  if(bt === 0x00 || bt === 0x01) {\n    padByte = (bt === 0x00) ? 0x00 : 0xFF;\n    for(var i = 0; i < padNum; ++i) {\n      eb.putByte(padByte);\n    }\n  } else {\n    // public key op\n    // pad with random non-zero values\n    while(padNum > 0) {\n      var numZeros = 0;\n      var padBytes = forge.random.getBytes(padNum);\n      for(var i = 0; i < padNum; ++i) {\n        padByte = padBytes.charCodeAt(i);\n        if(padByte === 0) {\n          ++numZeros;\n        } else {\n          eb.putByte(padByte);\n        }\n      }\n      padNum = numZeros;\n    }\n  }\n\n  // zero followed by message\n  eb.putByte(0x00);\n  eb.putBytes(m);\n\n  return eb;\n}\n\n/**\n * Decodes a message using PKCS#1 v1.5 padding.\n *\n * @param em the message to decode.\n * @param key the RSA key to use.\n * @param pub true if the key is a public key, false if it is private.\n * @param ml the message length, if specified.\n *\n * @return the decoded bytes.\n */\nfunction _decodePkcs1_v1_5(em, key, pub, ml) {\n  // get the length of the modulus in bytes\n  var k = Math.ceil(key.n.bitLength() / 8);\n\n  /* It is an error if any of the following conditions occurs:\n\n    1. The encryption block EB cannot be parsed unambiguously.\n    2. The padding string PS consists of fewer than eight octets\n      or is inconsisent with the block type BT.\n    3. The decryption process is a public-key operation and the block\n      type BT is not 00 or 01, or the decryption process is a\n      private-key operation and the block type is not 02.\n   */\n\n  // parse the encryption block\n  var eb = forge.util.createBuffer(em);\n  var first = eb.getByte();\n  var bt = eb.getByte();\n  if(first !== 0x00 ||\n    (pub && bt !== 0x00 && bt !== 0x01) ||\n    (!pub && bt != 0x02) ||\n    (pub && bt === 0x00 && typeof(ml) === 'undefined')) {\n    throw new Error('Encryption block is invalid.');\n  }\n\n  var padNum = 0;\n  if(bt === 0x00) {\n    // check all padding bytes for 0x00\n    padNum = k - 3 - ml;\n    for(var i = 0; i < padNum; ++i) {\n      if(eb.getByte() !== 0x00) {\n        throw new Error('Encryption block is invalid.');\n      }\n    }\n  } else if(bt === 0x01) {\n    // find the first byte that isn't 0xFF, should be after all padding\n    padNum = 0;\n    while(eb.length() > 1) {\n      if(eb.getByte() !== 0xFF) {\n        --eb.read;\n        break;\n      }\n      ++padNum;\n    }\n  } else if(bt === 0x02) {\n    // look for 0x00 byte\n    padNum = 0;\n    while(eb.length() > 1) {\n      if(eb.getByte() === 0x00) {\n        --eb.read;\n        break;\n      }\n      ++padNum;\n    }\n  }\n\n  // zero must be 0x00 and padNum must be (k - 3 - message length)\n  var zero = eb.getByte();\n  if(zero !== 0x00 || padNum !== (k - 3 - eb.length())) {\n    throw new Error('Encryption block is invalid.');\n  }\n\n  return eb.getBytes();\n}\n\n/**\n * Runs the key-generation algorithm asynchronously, either in the background\n * via Web Workers, or using the main thread and setImmediate.\n *\n * @param state the key-pair generation state.\n * @param [options] options for key-pair generation:\n *          workerScript the worker script URL.\n *          workers the number of web workers (if supported) to use,\n *            (default: 2, -1 to use estimated cores minus one).\n *          workLoad the size of the work load, ie: number of possible prime\n *            numbers for each web worker to check per work assignment,\n *            (default: 100).\n * @param callback(err, keypair) called once the operation completes.\n */\nfunction _generateKeyPair(state, options, callback) {\n  if(typeof options === 'function') {\n    callback = options;\n    options = {};\n  }\n  options = options || {};\n\n  var opts = {\n    algorithm: {\n      name: options.algorithm || 'PRIMEINC',\n      options: {\n        workers: options.workers || 2,\n        workLoad: options.workLoad || 100,\n        workerScript: options.workerScript\n      }\n    }\n  };\n  if('prng' in options) {\n    opts.prng = options.prng;\n  }\n\n  generate();\n\n  function generate() {\n    // find p and then q (done in series to simplify)\n    getPrime(state.pBits, function(err, num) {\n      if(err) {\n        return callback(err);\n      }\n      state.p = num;\n      if(state.q !== null) {\n        return finish(err, state.q);\n      }\n      getPrime(state.qBits, finish);\n    });\n  }\n\n  function getPrime(bits, callback) {\n    forge.prime.generateProbablePrime(bits, opts, callback);\n  }\n\n  function finish(err, num) {\n    if(err) {\n      return callback(err);\n    }\n\n    // set q\n    state.q = num;\n\n    // ensure p is larger than q (swap them if not)\n    if(state.p.compareTo(state.q) < 0) {\n      var tmp = state.p;\n      state.p = state.q;\n      state.q = tmp;\n    }\n\n    // ensure p is coprime with e\n    if(state.p.subtract(BigInteger.ONE).gcd(state.e)\n      .compareTo(BigInteger.ONE) !== 0) {\n      state.p = null;\n      generate();\n      return;\n    }\n\n    // ensure q is coprime with e\n    if(state.q.subtract(BigInteger.ONE).gcd(state.e)\n      .compareTo(BigInteger.ONE) !== 0) {\n      state.q = null;\n      getPrime(state.qBits, finish);\n      return;\n    }\n\n    // compute phi: (p - 1)(q - 1) (Euler's totient function)\n    state.p1 = state.p.subtract(BigInteger.ONE);\n    state.q1 = state.q.subtract(BigInteger.ONE);\n    state.phi = state.p1.multiply(state.q1);\n\n    // ensure e and phi are coprime\n    if(state.phi.gcd(state.e).compareTo(BigInteger.ONE) !== 0) {\n      // phi and e aren't coprime, so generate a new p and q\n      state.p = state.q = null;\n      generate();\n      return;\n    }\n\n    // create n, ensure n is has the right number of bits\n    state.n = state.p.multiply(state.q);\n    if(state.n.bitLength() !== state.bits) {\n      // failed, get new q\n      state.q = null;\n      getPrime(state.qBits, finish);\n      return;\n    }\n\n    // set keys\n    var d = state.e.modInverse(state.phi);\n    state.keys = {\n      privateKey: pki.rsa.setPrivateKey(\n        state.n, state.e, d, state.p, state.q,\n        d.mod(state.p1), d.mod(state.q1),\n        state.q.modInverse(state.p)),\n      publicKey: pki.rsa.setPublicKey(state.n, state.e)\n    };\n\n    callback(null, state.keys);\n  }\n}\n\n/**\n * Converts a positive BigInteger into 2's-complement big-endian bytes.\n *\n * @param b the big integer to convert.\n *\n * @return the bytes.\n */\nfunction _bnToBytes(b) {\n  // prepend 0x00 if first byte >= 0x80\n  var hex = b.toString(16);\n  if(hex[0] >= '8') {\n    hex = '00' + hex;\n  }\n  var bytes = forge.util.hexToBytes(hex);\n\n  // ensure integer is minimally-encoded\n  if(bytes.length > 1 &&\n    // leading 0x00 for positive integer\n    ((bytes.charCodeAt(0) === 0 &&\n    (bytes.charCodeAt(1) & 0x80) === 0) ||\n    // leading 0xFF for negative integer\n    (bytes.charCodeAt(0) === 0xFF &&\n    (bytes.charCodeAt(1) & 0x80) === 0x80))) {\n    return bytes.substr(1);\n  }\n  return bytes;\n}\n\n/**\n * Returns the required number of Miller-Rabin tests to generate a\n * prime with an error probability of (1/2)^80.\n *\n * See Handbook of Applied Cryptography Chapter 4, Table 4.4.\n *\n * @param bits the bit size.\n *\n * @return the required number of iterations.\n */\nfunction _getMillerRabinTests(bits) {\n  if(bits <= 100) return 27;\n  if(bits <= 150) return 18;\n  if(bits <= 200) return 15;\n  if(bits <= 250) return 12;\n  if(bits <= 300) return 9;\n  if(bits <= 350) return 8;\n  if(bits <= 400) return 7;\n  if(bits <= 500) return 6;\n  if(bits <= 600) return 5;\n  if(bits <= 800) return 4;\n  if(bits <= 1250) return 3;\n  return 2;\n}\n\n/**\n * Performs feature detection on the Node crypto interface.\n *\n * @param fn the feature (function) to detect.\n *\n * @return true if detected, false if not.\n */\nfunction _detectNodeCrypto(fn) {\n  return forge.util.isNodejs && typeof _crypto[fn] === 'function';\n}\n\n/**\n * Performs feature detection on the SubtleCrypto interface.\n *\n * @param fn the feature (function) to detect.\n *\n * @return true if detected, false if not.\n */\nfunction _detectSubtleCrypto(fn) {\n  return (typeof util.globalScope !== 'undefined' &&\n    typeof util.globalScope.crypto === 'object' &&\n    typeof util.globalScope.crypto.subtle === 'object' &&\n    typeof util.globalScope.crypto.subtle[fn] === 'function');\n}\n\n/**\n * Performs feature detection on the deprecated Microsoft Internet Explorer\n * outdated SubtleCrypto interface. This function should only be used after\n * checking for the modern, standard SubtleCrypto interface.\n *\n * @param fn the feature (function) to detect.\n *\n * @return true if detected, false if not.\n */\nfunction _detectSubtleMsCrypto(fn) {\n  return (typeof util.globalScope !== 'undefined' &&\n    typeof util.globalScope.msCrypto === 'object' &&\n    typeof util.globalScope.msCrypto.subtle === 'object' &&\n    typeof util.globalScope.msCrypto.subtle[fn] === 'function');\n}\n\nfunction _intToUint8Array(x) {\n  var bytes = forge.util.hexToBytes(x.toString(16));\n  var buffer = new Uint8Array(bytes.length);\n  for(var i = 0; i < bytes.length; ++i) {\n    buffer[i] = bytes.charCodeAt(i);\n  }\n  return buffer;\n}\n\nfunction _privateKeyFromJwk(jwk) {\n  if(jwk.kty !== 'RSA') {\n    throw new Error(\n      'Unsupported key algorithm \"' + jwk.kty + '\"; algorithm must be \"RSA\".');\n  }\n  return pki.setRsaPrivateKey(\n    _base64ToBigInt(jwk.n),\n    _base64ToBigInt(jwk.e),\n    _base64ToBigInt(jwk.d),\n    _base64ToBigInt(jwk.p),\n    _base64ToBigInt(jwk.q),\n    _base64ToBigInt(jwk.dp),\n    _base64ToBigInt(jwk.dq),\n    _base64ToBigInt(jwk.qi));\n}\n\nfunction _publicKeyFromJwk(jwk) {\n  if(jwk.kty !== 'RSA') {\n    throw new Error('Key algorithm must be \"RSA\".');\n  }\n  return pki.setRsaPublicKey(\n    _base64ToBigInt(jwk.n),\n    _base64ToBigInt(jwk.e));\n}\n\nfunction _base64ToBigInt(b64) {\n  return new BigInteger(forge.util.bytesToHex(forge.util.decode64(b64)), 16);\n}\n","/**\n * Password-based encryption functions.\n *\n * @author Dave Longley\n * @author Stefan Siegl <stesie@brokenpipe.de>\n *\n * Copyright (c) 2010-2013 Digital Bazaar, Inc.\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n *\n * An EncryptedPrivateKeyInfo:\n *\n * EncryptedPrivateKeyInfo ::= SEQUENCE {\n *   encryptionAlgorithm  EncryptionAlgorithmIdentifier,\n *   encryptedData        EncryptedData }\n *\n * EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier\n *\n * EncryptedData ::= OCTET STRING\n */\nvar forge = require('./forge');\nrequire('./aes');\nrequire('./asn1');\nrequire('./des');\nrequire('./md');\nrequire('./oids');\nrequire('./pbkdf2');\nrequire('./pem');\nrequire('./random');\nrequire('./rc2');\nrequire('./rsa');\nrequire('./util');\n\nif(typeof BigInteger === 'undefined') {\n  var BigInteger = forge.jsbn.BigInteger;\n}\n\n// shortcut for asn.1 API\nvar asn1 = forge.asn1;\n\n/* Password-based encryption implementation. */\nvar pki = forge.pki = forge.pki || {};\nmodule.exports = pki.pbe = forge.pbe = forge.pbe || {};\nvar oids = pki.oids;\n\n// validator for an EncryptedPrivateKeyInfo structure\n// Note: Currently only works w/algorithm params\nvar encryptedPrivateKeyValidator = {\n  name: 'EncryptedPrivateKeyInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'EncryptedPrivateKeyInfo.encryptionAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'AlgorithmIdentifier.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'encryptionOid'\n    }, {\n      name: 'AlgorithmIdentifier.parameters',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      captureAsn1: 'encryptionParams'\n    }]\n  }, {\n    // encryptedData\n    name: 'EncryptedPrivateKeyInfo.encryptedData',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'encryptedData'\n  }]\n};\n\n// validator for a PBES2Algorithms structure\n// Note: Currently only works w/PBKDF2 + AES encryption schemes\nvar PBES2AlgorithmsValidator = {\n  name: 'PBES2Algorithms',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'PBES2Algorithms.keyDerivationFunc',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'PBES2Algorithms.keyDerivationFunc.oid',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'kdfOid'\n    }, {\n      name: 'PBES2Algorithms.params',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      value: [{\n        name: 'PBES2Algorithms.params.salt',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OCTETSTRING,\n        constructed: false,\n        capture: 'kdfSalt'\n      }, {\n        name: 'PBES2Algorithms.params.iterationCount',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.INTEGER,\n        constructed: false,\n        capture: 'kdfIterationCount'\n      }, {\n        name: 'PBES2Algorithms.params.keyLength',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.INTEGER,\n        constructed: false,\n        optional: true,\n        capture: 'keyLength'\n      }, {\n        // prf\n        name: 'PBES2Algorithms.params.prf',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.SEQUENCE,\n        constructed: true,\n        optional: true,\n        value: [{\n          name: 'PBES2Algorithms.params.prf.algorithm',\n          tagClass: asn1.Class.UNIVERSAL,\n          type: asn1.Type.OID,\n          constructed: false,\n          capture: 'prfOid'\n        }]\n      }]\n    }]\n  }, {\n    name: 'PBES2Algorithms.encryptionScheme',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'PBES2Algorithms.encryptionScheme.oid',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'encOid'\n    }, {\n      name: 'PBES2Algorithms.encryptionScheme.iv',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OCTETSTRING,\n      constructed: false,\n      capture: 'encIv'\n    }]\n  }]\n};\n\nvar pkcs12PbeParamsValidator = {\n  name: 'pkcs-12PbeParams',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'pkcs-12PbeParams.salt',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'salt'\n  }, {\n    name: 'pkcs-12PbeParams.iterations',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'iterations'\n  }]\n};\n\n/**\n * Encrypts a ASN.1 PrivateKeyInfo object, producing an EncryptedPrivateKeyInfo.\n *\n * PBES2Algorithms ALGORITHM-IDENTIFIER ::=\n *   { {PBES2-params IDENTIFIED BY id-PBES2}, ...}\n *\n * id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13}\n *\n * PBES2-params ::= SEQUENCE {\n *   keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}},\n *   encryptionScheme AlgorithmIdentifier {{PBES2-Encs}}\n * }\n *\n * PBES2-KDFs ALGORITHM-IDENTIFIER ::=\n *   { {PBKDF2-params IDENTIFIED BY id-PBKDF2}, ... }\n *\n * PBES2-Encs ALGORITHM-IDENTIFIER ::= { ... }\n *\n * PBKDF2-params ::= SEQUENCE {\n *   salt CHOICE {\n *     specified OCTET STRING,\n *     otherSource AlgorithmIdentifier {{PBKDF2-SaltSources}}\n *   },\n *   iterationCount INTEGER (1..MAX),\n *   keyLength INTEGER (1..MAX) OPTIONAL,\n *   prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1\n * }\n *\n * @param obj the ASN.1 PrivateKeyInfo object.\n * @param password the password to encrypt with.\n * @param options:\n *          algorithm the encryption algorithm to use\n *            ('aes128', 'aes192', 'aes256', '3des'), defaults to 'aes128'.\n *          count the iteration count to use.\n *          saltSize the salt size to use.\n *          prfAlgorithm the PRF message digest algorithm to use\n *            ('sha1', 'sha224', 'sha256', 'sha384', 'sha512')\n *\n * @return the ASN.1 EncryptedPrivateKeyInfo.\n */\npki.encryptPrivateKeyInfo = function(obj, password, options) {\n  // set default options\n  options = options || {};\n  options.saltSize = options.saltSize || 8;\n  options.count = options.count || 2048;\n  options.algorithm = options.algorithm || 'aes128';\n  options.prfAlgorithm = options.prfAlgorithm || 'sha1';\n\n  // generate PBE params\n  var salt = forge.random.getBytesSync(options.saltSize);\n  var count = options.count;\n  var countBytes = asn1.integerToDer(count);\n  var dkLen;\n  var encryptionAlgorithm;\n  var encryptedData;\n  if(options.algorithm.indexOf('aes') === 0 || options.algorithm === 'des') {\n    // do PBES2\n    var ivLen, encOid, cipherFn;\n    switch(options.algorithm) {\n    case 'aes128':\n      dkLen = 16;\n      ivLen = 16;\n      encOid = oids['aes128-CBC'];\n      cipherFn = forge.aes.createEncryptionCipher;\n      break;\n    case 'aes192':\n      dkLen = 24;\n      ivLen = 16;\n      encOid = oids['aes192-CBC'];\n      cipherFn = forge.aes.createEncryptionCipher;\n      break;\n    case 'aes256':\n      dkLen = 32;\n      ivLen = 16;\n      encOid = oids['aes256-CBC'];\n      cipherFn = forge.aes.createEncryptionCipher;\n      break;\n    case 'des':\n      dkLen = 8;\n      ivLen = 8;\n      encOid = oids['desCBC'];\n      cipherFn = forge.des.createEncryptionCipher;\n      break;\n    default:\n      var error = new Error('Cannot encrypt private key. Unknown encryption algorithm.');\n      error.algorithm = options.algorithm;\n      throw error;\n    }\n\n    // get PRF message digest\n    var prfAlgorithm = 'hmacWith' + options.prfAlgorithm.toUpperCase();\n    var md = prfAlgorithmToMessageDigest(prfAlgorithm);\n\n    // encrypt private key using pbe SHA-1 and AES/DES\n    var dk = forge.pkcs5.pbkdf2(password, salt, count, dkLen, md);\n    var iv = forge.random.getBytesSync(ivLen);\n    var cipher = cipherFn(dk);\n    cipher.start(iv);\n    cipher.update(asn1.toDer(obj));\n    cipher.finish();\n    encryptedData = cipher.output.getBytes();\n\n    // get PBKDF2-params\n    var params = createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm);\n\n    encryptionAlgorithm = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(oids['pkcs5PBES2']).getBytes()),\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // keyDerivationFunc\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n            asn1.oidToDer(oids['pkcs5PBKDF2']).getBytes()),\n          // PBKDF2-params\n          params\n        ]),\n        // encryptionScheme\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n            asn1.oidToDer(encOid).getBytes()),\n          // iv\n          asn1.create(\n            asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, iv)\n        ])\n      ])\n    ]);\n  } else if(options.algorithm === '3des') {\n    // Do PKCS12 PBE\n    dkLen = 24;\n\n    var saltBytes = new forge.util.ByteBuffer(salt);\n    var dk = pki.pbe.generatePkcs12Key(password, saltBytes, 1, count, dkLen);\n    var iv = pki.pbe.generatePkcs12Key(password, saltBytes, 2, count, dkLen);\n    var cipher = forge.des.createEncryptionCipher(dk);\n    cipher.start(iv);\n    cipher.update(asn1.toDer(obj));\n    cipher.finish();\n    encryptedData = cipher.output.getBytes();\n\n    encryptionAlgorithm = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(oids['pbeWithSHAAnd3-KeyTripleDES-CBC']).getBytes()),\n      // pkcs-12PbeParams\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // salt\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, salt),\n        // iteration count\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n          countBytes.getBytes())\n      ])\n    ]);\n  } else {\n    var error = new Error('Cannot encrypt private key. Unknown encryption algorithm.');\n    error.algorithm = options.algorithm;\n    throw error;\n  }\n\n  // EncryptedPrivateKeyInfo\n  var rval = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // encryptionAlgorithm\n    encryptionAlgorithm,\n    // encryptedData\n    asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, encryptedData)\n  ]);\n  return rval;\n};\n\n/**\n * Decrypts a ASN.1 PrivateKeyInfo object.\n *\n * @param obj the ASN.1 EncryptedPrivateKeyInfo object.\n * @param password the password to decrypt with.\n *\n * @return the ASN.1 PrivateKeyInfo on success, null on failure.\n */\npki.decryptPrivateKeyInfo = function(obj, password) {\n  var rval = null;\n\n  // get PBE params\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, encryptedPrivateKeyValidator, capture, errors)) {\n    var error = new Error('Cannot read encrypted private key. ' +\n      'ASN.1 object is not a supported EncryptedPrivateKeyInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // get cipher\n  var oid = asn1.derToOid(capture.encryptionOid);\n  var cipher = pki.pbe.getCipher(oid, capture.encryptionParams, password);\n\n  // get encrypted data\n  var encrypted = forge.util.createBuffer(capture.encryptedData);\n\n  cipher.update(encrypted);\n  if(cipher.finish()) {\n    rval = asn1.fromDer(cipher.output);\n  }\n\n  return rval;\n};\n\n/**\n * Converts a EncryptedPrivateKeyInfo to PEM format.\n *\n * @param epki the EncryptedPrivateKeyInfo.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted encrypted private key.\n */\npki.encryptedPrivateKeyToPem = function(epki, maxline) {\n  // convert to DER, then PEM-encode\n  var msg = {\n    type: 'ENCRYPTED PRIVATE KEY',\n    body: asn1.toDer(epki).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Converts a PEM-encoded EncryptedPrivateKeyInfo to ASN.1 format. Decryption\n * is not performed.\n *\n * @param pem the EncryptedPrivateKeyInfo in PEM-format.\n *\n * @return the ASN.1 EncryptedPrivateKeyInfo.\n */\npki.encryptedPrivateKeyFromPem = function(pem) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'ENCRYPTED PRIVATE KEY') {\n    var error = new Error('Could not convert encrypted private key from PEM; ' +\n      'PEM header type is \"ENCRYPTED PRIVATE KEY\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert encrypted private key from PEM; ' +\n      'PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  return asn1.fromDer(msg.body);\n};\n\n/**\n * Encrypts an RSA private key. By default, the key will be wrapped in\n * a PrivateKeyInfo and encrypted to produce a PKCS#8 EncryptedPrivateKeyInfo.\n * This is the standard, preferred way to encrypt a private key.\n *\n * To produce a non-standard PEM-encrypted private key that uses encapsulated\n * headers to indicate the encryption algorithm (old-style non-PKCS#8 OpenSSL\n * private key encryption), set the 'legacy' option to true. Note: Using this\n * option will cause the iteration count to be forced to 1.\n *\n * Note: The 'des' algorithm is supported, but it is not considered to be\n * secure because it only uses a single 56-bit key. If possible, it is highly\n * recommended that a different algorithm be used.\n *\n * @param rsaKey the RSA key to encrypt.\n * @param password the password to use.\n * @param options:\n *          algorithm: the encryption algorithm to use\n *            ('aes128', 'aes192', 'aes256', '3des', 'des').\n *          count: the iteration count to use.\n *          saltSize: the salt size to use.\n *          legacy: output an old non-PKCS#8 PEM-encrypted+encapsulated\n *            headers (DEK-Info) private key.\n *\n * @return the PEM-encoded ASN.1 EncryptedPrivateKeyInfo.\n */\npki.encryptRsaPrivateKey = function(rsaKey, password, options) {\n  // standard PKCS#8\n  options = options || {};\n  if(!options.legacy) {\n    // encrypt PrivateKeyInfo\n    var rval = pki.wrapRsaPrivateKey(pki.privateKeyToAsn1(rsaKey));\n    rval = pki.encryptPrivateKeyInfo(rval, password, options);\n    return pki.encryptedPrivateKeyToPem(rval);\n  }\n\n  // legacy non-PKCS#8\n  var algorithm;\n  var iv;\n  var dkLen;\n  var cipherFn;\n  switch(options.algorithm) {\n  case 'aes128':\n    algorithm = 'AES-128-CBC';\n    dkLen = 16;\n    iv = forge.random.getBytesSync(16);\n    cipherFn = forge.aes.createEncryptionCipher;\n    break;\n  case 'aes192':\n    algorithm = 'AES-192-CBC';\n    dkLen = 24;\n    iv = forge.random.getBytesSync(16);\n    cipherFn = forge.aes.createEncryptionCipher;\n    break;\n  case 'aes256':\n    algorithm = 'AES-256-CBC';\n    dkLen = 32;\n    iv = forge.random.getBytesSync(16);\n    cipherFn = forge.aes.createEncryptionCipher;\n    break;\n  case '3des':\n    algorithm = 'DES-EDE3-CBC';\n    dkLen = 24;\n    iv = forge.random.getBytesSync(8);\n    cipherFn = forge.des.createEncryptionCipher;\n    break;\n  case 'des':\n    algorithm = 'DES-CBC';\n    dkLen = 8;\n    iv = forge.random.getBytesSync(8);\n    cipherFn = forge.des.createEncryptionCipher;\n    break;\n  default:\n    var error = new Error('Could not encrypt RSA private key; unsupported ' +\n      'encryption algorithm \"' + options.algorithm + '\".');\n    error.algorithm = options.algorithm;\n    throw error;\n  }\n\n  // encrypt private key using OpenSSL legacy key derivation\n  var dk = forge.pbe.opensslDeriveBytes(password, iv.substr(0, 8), dkLen);\n  var cipher = cipherFn(dk);\n  cipher.start(iv);\n  cipher.update(asn1.toDer(pki.privateKeyToAsn1(rsaKey)));\n  cipher.finish();\n\n  var msg = {\n    type: 'RSA PRIVATE KEY',\n    procType: {\n      version: '4',\n      type: 'ENCRYPTED'\n    },\n    dekInfo: {\n      algorithm: algorithm,\n      parameters: forge.util.bytesToHex(iv).toUpperCase()\n    },\n    body: cipher.output.getBytes()\n  };\n  return forge.pem.encode(msg);\n};\n\n/**\n * Decrypts an RSA private key.\n *\n * @param pem the PEM-formatted EncryptedPrivateKeyInfo to decrypt.\n * @param password the password to use.\n *\n * @return the RSA key on success, null on failure.\n */\npki.decryptRsaPrivateKey = function(pem, password) {\n  var rval = null;\n\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'ENCRYPTED PRIVATE KEY' &&\n    msg.type !== 'PRIVATE KEY' &&\n    msg.type !== 'RSA PRIVATE KEY') {\n    var error = new Error('Could not convert private key from PEM; PEM header type ' +\n      'is not \"ENCRYPTED PRIVATE KEY\", \"PRIVATE KEY\", or \"RSA PRIVATE KEY\".');\n    error.headerType = error;\n    throw error;\n  }\n\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    var dkLen;\n    var cipherFn;\n    switch(msg.dekInfo.algorithm) {\n    case 'DES-CBC':\n      dkLen = 8;\n      cipherFn = forge.des.createDecryptionCipher;\n      break;\n    case 'DES-EDE3-CBC':\n      dkLen = 24;\n      cipherFn = forge.des.createDecryptionCipher;\n      break;\n    case 'AES-128-CBC':\n      dkLen = 16;\n      cipherFn = forge.aes.createDecryptionCipher;\n      break;\n    case 'AES-192-CBC':\n      dkLen = 24;\n      cipherFn = forge.aes.createDecryptionCipher;\n      break;\n    case 'AES-256-CBC':\n      dkLen = 32;\n      cipherFn = forge.aes.createDecryptionCipher;\n      break;\n    case 'RC2-40-CBC':\n      dkLen = 5;\n      cipherFn = function(key) {\n        return forge.rc2.createDecryptionCipher(key, 40);\n      };\n      break;\n    case 'RC2-64-CBC':\n      dkLen = 8;\n      cipherFn = function(key) {\n        return forge.rc2.createDecryptionCipher(key, 64);\n      };\n      break;\n    case 'RC2-128-CBC':\n      dkLen = 16;\n      cipherFn = function(key) {\n        return forge.rc2.createDecryptionCipher(key, 128);\n      };\n      break;\n    default:\n      var error = new Error('Could not decrypt private key; unsupported ' +\n        'encryption algorithm \"' + msg.dekInfo.algorithm + '\".');\n      error.algorithm = msg.dekInfo.algorithm;\n      throw error;\n    }\n\n    // use OpenSSL legacy key derivation\n    var iv = forge.util.hexToBytes(msg.dekInfo.parameters);\n    var dk = forge.pbe.opensslDeriveBytes(password, iv.substr(0, 8), dkLen);\n    var cipher = cipherFn(dk);\n    cipher.start(iv);\n    cipher.update(forge.util.createBuffer(msg.body));\n    if(cipher.finish()) {\n      rval = cipher.output.getBytes();\n    } else {\n      return rval;\n    }\n  } else {\n    rval = msg.body;\n  }\n\n  if(msg.type === 'ENCRYPTED PRIVATE KEY') {\n    rval = pki.decryptPrivateKeyInfo(asn1.fromDer(rval), password);\n  } else {\n    // decryption already performed above\n    rval = asn1.fromDer(rval);\n  }\n\n  if(rval !== null) {\n    rval = pki.privateKeyFromAsn1(rval);\n  }\n\n  return rval;\n};\n\n/**\n * Derives a PKCS#12 key.\n *\n * @param password the password to derive the key material from, null or\n *          undefined for none.\n * @param salt the salt, as a ByteBuffer, to use.\n * @param id the PKCS#12 ID byte (1 = key material, 2 = IV, 3 = MAC).\n * @param iter the iteration count.\n * @param n the number of bytes to derive from the password.\n * @param md the message digest to use, defaults to SHA-1.\n *\n * @return a ByteBuffer with the bytes derived from the password.\n */\npki.pbe.generatePkcs12Key = function(password, salt, id, iter, n, md) {\n  var j, l;\n\n  if(typeof md === 'undefined' || md === null) {\n    if(!('sha1' in forge.md)) {\n      throw new Error('\"sha1\" hash algorithm unavailable.');\n    }\n    md = forge.md.sha1.create();\n  }\n\n  var u = md.digestLength;\n  var v = md.blockLength;\n  var result = new forge.util.ByteBuffer();\n\n  /* Convert password to Unicode byte buffer + trailing 0-byte. */\n  var passBuf = new forge.util.ByteBuffer();\n  if(password !== null && password !== undefined) {\n    for(l = 0; l < password.length; l++) {\n      passBuf.putInt16(password.charCodeAt(l));\n    }\n    passBuf.putInt16(0);\n  }\n\n  /* Length of salt and password in BYTES. */\n  var p = passBuf.length();\n  var s = salt.length();\n\n  /* 1. Construct a string, D (the \"diversifier\"), by concatenating\n        v copies of ID. */\n  var D = new forge.util.ByteBuffer();\n  D.fillWithByte(id, v);\n\n  /* 2. Concatenate copies of the salt together to create a string S of length\n        v * ceil(s / v) bytes (the final copy of the salt may be trunacted\n        to create S).\n        Note that if the salt is the empty string, then so is S. */\n  var Slen = v * Math.ceil(s / v);\n  var S = new forge.util.ByteBuffer();\n  for(l = 0; l < Slen; l++) {\n    S.putByte(salt.at(l % s));\n  }\n\n  /* 3. Concatenate copies of the password together to create a string P of\n        length v * ceil(p / v) bytes (the final copy of the password may be\n        truncated to create P).\n        Note that if the password is the empty string, then so is P. */\n  var Plen = v * Math.ceil(p / v);\n  var P = new forge.util.ByteBuffer();\n  for(l = 0; l < Plen; l++) {\n    P.putByte(passBuf.at(l % p));\n  }\n\n  /* 4. Set I=S||P to be the concatenation of S and P. */\n  var I = S;\n  I.putBuffer(P);\n\n  /* 5. Set c=ceil(n / u). */\n  var c = Math.ceil(n / u);\n\n  /* 6. For i=1, 2, ..., c, do the following: */\n  for(var i = 1; i <= c; i++) {\n    /* a) Set Ai=H^r(D||I). (l.e. the rth hash of D||I, H(H(H(...H(D||I)))) */\n    var buf = new forge.util.ByteBuffer();\n    buf.putBytes(D.bytes());\n    buf.putBytes(I.bytes());\n    for(var round = 0; round < iter; round++) {\n      md.start();\n      md.update(buf.getBytes());\n      buf = md.digest();\n    }\n\n    /* b) Concatenate copies of Ai to create a string B of length v bytes (the\n          final copy of Ai may be truncated to create B). */\n    var B = new forge.util.ByteBuffer();\n    for(l = 0; l < v; l++) {\n      B.putByte(buf.at(l % u));\n    }\n\n    /* c) Treating I as a concatenation I0, I1, ..., Ik-1 of v-byte blocks,\n          where k=ceil(s / v) + ceil(p / v), modify I by setting\n          Ij=(Ij+B+1) mod 2v for each j.  */\n    var k = Math.ceil(s / v) + Math.ceil(p / v);\n    var Inew = new forge.util.ByteBuffer();\n    for(j = 0; j < k; j++) {\n      var chunk = new forge.util.ByteBuffer(I.getBytes(v));\n      var x = 0x1ff;\n      for(l = B.length() - 1; l >= 0; l--) {\n        x = x >> 8;\n        x += B.at(l) + chunk.at(l);\n        chunk.setAt(l, x & 0xff);\n      }\n      Inew.putBuffer(chunk);\n    }\n    I = Inew;\n\n    /* Add Ai to A. */\n    result.putBuffer(buf);\n  }\n\n  result.truncate(result.length() - n);\n  return result;\n};\n\n/**\n * Get new Forge cipher object instance.\n *\n * @param oid the OID (in string notation).\n * @param params the ASN.1 params object.\n * @param password the password to decrypt with.\n *\n * @return new cipher object instance.\n */\npki.pbe.getCipher = function(oid, params, password) {\n  switch(oid) {\n  case pki.oids['pkcs5PBES2']:\n    return pki.pbe.getCipherForPBES2(oid, params, password);\n\n  case pki.oids['pbeWithSHAAnd3-KeyTripleDES-CBC']:\n  case pki.oids['pbewithSHAAnd40BitRC2-CBC']:\n    return pki.pbe.getCipherForPKCS12PBE(oid, params, password);\n\n  default:\n    var error = new Error('Cannot read encrypted PBE data block. Unsupported OID.');\n    error.oid = oid;\n    error.supportedOids = [\n      'pkcs5PBES2',\n      'pbeWithSHAAnd3-KeyTripleDES-CBC',\n      'pbewithSHAAnd40BitRC2-CBC'\n    ];\n    throw error;\n  }\n};\n\n/**\n * Get new Forge cipher object instance according to PBES2 params block.\n *\n * The returned cipher instance is already started using the IV\n * from PBES2 parameter block.\n *\n * @param oid the PKCS#5 PBKDF2 OID (in string notation).\n * @param params the ASN.1 PBES2-params object.\n * @param password the password to decrypt with.\n *\n * @return new cipher object instance.\n */\npki.pbe.getCipherForPBES2 = function(oid, params, password) {\n  // get PBE params\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(params, PBES2AlgorithmsValidator, capture, errors)) {\n    var error = new Error('Cannot read password-based-encryption algorithm ' +\n      'parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // check oids\n  oid = asn1.derToOid(capture.kdfOid);\n  if(oid !== pki.oids['pkcs5PBKDF2']) {\n    var error = new Error('Cannot read encrypted private key. ' +\n      'Unsupported key derivation function OID.');\n    error.oid = oid;\n    error.supportedOids = ['pkcs5PBKDF2'];\n    throw error;\n  }\n  oid = asn1.derToOid(capture.encOid);\n  if(oid !== pki.oids['aes128-CBC'] &&\n    oid !== pki.oids['aes192-CBC'] &&\n    oid !== pki.oids['aes256-CBC'] &&\n    oid !== pki.oids['des-EDE3-CBC'] &&\n    oid !== pki.oids['desCBC']) {\n    var error = new Error('Cannot read encrypted private key. ' +\n      'Unsupported encryption scheme OID.');\n    error.oid = oid;\n    error.supportedOids = [\n      'aes128-CBC', 'aes192-CBC', 'aes256-CBC', 'des-EDE3-CBC', 'desCBC'];\n    throw error;\n  }\n\n  // set PBE params\n  var salt = capture.kdfSalt;\n  var count = forge.util.createBuffer(capture.kdfIterationCount);\n  count = count.getInt(count.length() << 3);\n  var dkLen;\n  var cipherFn;\n  switch(pki.oids[oid]) {\n  case 'aes128-CBC':\n    dkLen = 16;\n    cipherFn = forge.aes.createDecryptionCipher;\n    break;\n  case 'aes192-CBC':\n    dkLen = 24;\n    cipherFn = forge.aes.createDecryptionCipher;\n    break;\n  case 'aes256-CBC':\n    dkLen = 32;\n    cipherFn = forge.aes.createDecryptionCipher;\n    break;\n  case 'des-EDE3-CBC':\n    dkLen = 24;\n    cipherFn = forge.des.createDecryptionCipher;\n    break;\n  case 'desCBC':\n    dkLen = 8;\n    cipherFn = forge.des.createDecryptionCipher;\n    break;\n  }\n\n  // get PRF message digest\n  var md = prfOidToMessageDigest(capture.prfOid);\n\n  // decrypt private key using pbe with chosen PRF and AES/DES\n  var dk = forge.pkcs5.pbkdf2(password, salt, count, dkLen, md);\n  var iv = capture.encIv;\n  var cipher = cipherFn(dk);\n  cipher.start(iv);\n\n  return cipher;\n};\n\n/**\n * Get new Forge cipher object instance for PKCS#12 PBE.\n *\n * The returned cipher instance is already started using the key & IV\n * derived from the provided password and PKCS#12 PBE salt.\n *\n * @param oid The PKCS#12 PBE OID (in string notation).\n * @param params The ASN.1 PKCS#12 PBE-params object.\n * @param password The password to decrypt with.\n *\n * @return the new cipher object instance.\n */\npki.pbe.getCipherForPKCS12PBE = function(oid, params, password) {\n  // get PBE params\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(params, pkcs12PbeParamsValidator, capture, errors)) {\n    var error = new Error('Cannot read password-based-encryption algorithm ' +\n      'parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  var salt = forge.util.createBuffer(capture.salt);\n  var count = forge.util.createBuffer(capture.iterations);\n  count = count.getInt(count.length() << 3);\n\n  var dkLen, dIvLen, cipherFn;\n  switch(oid) {\n    case pki.oids['pbeWithSHAAnd3-KeyTripleDES-CBC']:\n      dkLen = 24;\n      dIvLen = 8;\n      cipherFn = forge.des.startDecrypting;\n      break;\n\n    case pki.oids['pbewithSHAAnd40BitRC2-CBC']:\n      dkLen = 5;\n      dIvLen = 8;\n      cipherFn = function(key, iv) {\n        var cipher = forge.rc2.createDecryptionCipher(key, 40);\n        cipher.start(iv, null);\n        return cipher;\n      };\n      break;\n\n    default:\n      var error = new Error('Cannot read PKCS #12 PBE data block. Unsupported OID.');\n      error.oid = oid;\n      throw error;\n  }\n\n  // get PRF message digest\n  var md = prfOidToMessageDigest(capture.prfOid);\n  var key = pki.pbe.generatePkcs12Key(password, salt, 1, count, dkLen, md);\n  md.start();\n  var iv = pki.pbe.generatePkcs12Key(password, salt, 2, count, dIvLen, md);\n\n  return cipherFn(key, iv);\n};\n\n/**\n * OpenSSL's legacy key derivation function.\n *\n * See: http://www.openssl.org/docs/crypto/EVP_BytesToKey.html\n *\n * @param password the password to derive the key from.\n * @param salt the salt to use, null for none.\n * @param dkLen the number of bytes needed for the derived key.\n * @param [options] the options to use:\n *          [md] an optional message digest object to use.\n */\npki.pbe.opensslDeriveBytes = function(password, salt, dkLen, md) {\n  if(typeof md === 'undefined' || md === null) {\n    if(!('md5' in forge.md)) {\n      throw new Error('\"md5\" hash algorithm unavailable.');\n    }\n    md = forge.md.md5.create();\n  }\n  if(salt === null) {\n    salt = '';\n  }\n  var digests = [hash(md, password + salt)];\n  for(var length = 16, i = 1; length < dkLen; ++i, length += 16) {\n    digests.push(hash(md, digests[i - 1] + password + salt));\n  }\n  return digests.join('').substr(0, dkLen);\n};\n\nfunction hash(md, bytes) {\n  return md.start().update(bytes).digest().getBytes();\n}\n\nfunction prfOidToMessageDigest(prfOid) {\n  // get PRF algorithm, default to SHA-1\n  var prfAlgorithm;\n  if(!prfOid) {\n    prfAlgorithm = 'hmacWithSHA1';\n  } else {\n    prfAlgorithm = pki.oids[asn1.derToOid(prfOid)];\n    if(!prfAlgorithm) {\n      var error = new Error('Unsupported PRF OID.');\n      error.oid = prfOid;\n      error.supported = [\n        'hmacWithSHA1', 'hmacWithSHA224', 'hmacWithSHA256', 'hmacWithSHA384',\n        'hmacWithSHA512'];\n      throw error;\n    }\n  }\n  return prfAlgorithmToMessageDigest(prfAlgorithm);\n}\n\nfunction prfAlgorithmToMessageDigest(prfAlgorithm) {\n  var factory = forge.md;\n  switch(prfAlgorithm) {\n  case 'hmacWithSHA224':\n    factory = forge.md.sha512;\n  case 'hmacWithSHA1':\n  case 'hmacWithSHA256':\n  case 'hmacWithSHA384':\n  case 'hmacWithSHA512':\n    prfAlgorithm = prfAlgorithm.substr(8).toLowerCase();\n    break;\n  default:\n    var error = new Error('Unsupported PRF algorithm.');\n    error.algorithm = prfAlgorithm;\n    error.supported = [\n      'hmacWithSHA1', 'hmacWithSHA224', 'hmacWithSHA256', 'hmacWithSHA384',\n      'hmacWithSHA512'];\n    throw error;\n  }\n  if(!factory || !(prfAlgorithm in factory)) {\n    throw new Error('Unknown hash algorithm: ' + prfAlgorithm);\n  }\n  return factory[prfAlgorithm].create();\n}\n\nfunction createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm) {\n  var params = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // salt\n    asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, salt),\n    // iteration count\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      countBytes.getBytes())\n  ]);\n  // when PRF algorithm is not SHA-1 default, add key length and PRF algorithm\n  if(prfAlgorithm !== 'hmacWithSHA1') {\n    params.value.push(\n      // key length\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        forge.util.hexToBytes(dkLen.toString(16))),\n      // AlgorithmIdentifier\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // algorithm\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids[prfAlgorithm]).getBytes()),\n        // parameters (null)\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n      ]));\n  }\n  return params;\n}\n","/**\n * Javascript implementation of ASN.1 validators for PKCS#7 v1.5.\n *\n * @author Dave Longley\n * @author Stefan Siegl\n *\n * Copyright (c) 2012-2015 Digital Bazaar, Inc.\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n *\n * The ASN.1 representation of PKCS#7 is as follows\n * (see RFC #2315 for details, http://www.ietf.org/rfc/rfc2315.txt):\n *\n * A PKCS#7 message consists of a ContentInfo on root level, which may\n * contain any number of further ContentInfo nested into it.\n *\n * ContentInfo ::= SEQUENCE {\n *   contentType                ContentType,\n *   content               [0]  EXPLICIT ANY DEFINED BY contentType OPTIONAL\n * }\n *\n * ContentType ::= OBJECT IDENTIFIER\n *\n * EnvelopedData ::= SEQUENCE {\n *   version                    Version,\n *   recipientInfos             RecipientInfos,\n *   encryptedContentInfo       EncryptedContentInfo\n * }\n *\n * EncryptedData ::= SEQUENCE {\n *   version                    Version,\n *   encryptedContentInfo       EncryptedContentInfo\n * }\n *\n * id-signedData OBJECT IDENTIFIER ::= { iso(1) member-body(2)\n *   us(840) rsadsi(113549) pkcs(1) pkcs7(7) 2 }\n *\n * SignedData ::= SEQUENCE {\n *   version           INTEGER,\n *   digestAlgorithms  DigestAlgorithmIdentifiers,\n *   contentInfo       ContentInfo,\n *   certificates      [0] IMPLICIT Certificates OPTIONAL,\n *   crls              [1] IMPLICIT CertificateRevocationLists OPTIONAL,\n *   signerInfos       SignerInfos\n * }\n *\n * SignerInfos ::= SET OF SignerInfo\n *\n * SignerInfo ::= SEQUENCE {\n *   version                    Version,\n *   issuerAndSerialNumber      IssuerAndSerialNumber,\n *   digestAlgorithm            DigestAlgorithmIdentifier,\n *   authenticatedAttributes    [0] IMPLICIT Attributes OPTIONAL,\n *   digestEncryptionAlgorithm  DigestEncryptionAlgorithmIdentifier,\n *   encryptedDigest            EncryptedDigest,\n *   unauthenticatedAttributes  [1] IMPLICIT Attributes OPTIONAL\n * }\n *\n * EncryptedDigest ::= OCTET STRING\n *\n * Attributes ::= SET OF Attribute\n *\n * Attribute ::= SEQUENCE {\n *   attrType    OBJECT IDENTIFIER,\n *   attrValues  SET OF AttributeValue\n * }\n *\n * AttributeValue ::= ANY\n *\n * Version ::= INTEGER\n *\n * RecipientInfos ::= SET OF RecipientInfo\n *\n * EncryptedContentInfo ::= SEQUENCE {\n *   contentType                 ContentType,\n *   contentEncryptionAlgorithm  ContentEncryptionAlgorithmIdentifier,\n *   encryptedContent       [0]  IMPLICIT EncryptedContent OPTIONAL\n * }\n *\n * ContentEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier\n *\n * The AlgorithmIdentifier contains an Object Identifier (OID) and parameters\n * for the algorithm, if any. In the case of AES and DES3, there is only one,\n * the IV.\n *\n * AlgorithmIdentifer ::= SEQUENCE {\n *    algorithm OBJECT IDENTIFIER,\n *    parameters ANY DEFINED BY algorithm OPTIONAL\n * }\n *\n * EncryptedContent ::= OCTET STRING\n *\n * RecipientInfo ::= SEQUENCE {\n *   version                     Version,\n *   issuerAndSerialNumber       IssuerAndSerialNumber,\n *   keyEncryptionAlgorithm      KeyEncryptionAlgorithmIdentifier,\n *   encryptedKey                EncryptedKey\n * }\n *\n * IssuerAndSerialNumber ::= SEQUENCE {\n *   issuer                      Name,\n *   serialNumber                CertificateSerialNumber\n * }\n *\n * CertificateSerialNumber ::= INTEGER\n *\n * KeyEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier\n *\n * EncryptedKey ::= OCTET STRING\n */\nvar forge = require('./forge');\nrequire('./asn1');\nrequire('./util');\n\n// shortcut for ASN.1 API\nvar asn1 = forge.asn1;\n\n// shortcut for PKCS#7 API\nvar p7v = module.exports = forge.pkcs7asn1 = forge.pkcs7asn1 || {};\nforge.pkcs7 = forge.pkcs7 || {};\nforge.pkcs7.asn1 = p7v;\n\nvar contentInfoValidator = {\n  name: 'ContentInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'ContentInfo.ContentType',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'contentType'\n  }, {\n    name: 'ContentInfo.content',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    constructed: true,\n    optional: true,\n    captureAsn1: 'content'\n  }]\n};\np7v.contentInfoValidator = contentInfoValidator;\n\nvar encryptedContentInfoValidator = {\n  name: 'EncryptedContentInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'EncryptedContentInfo.contentType',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'contentType'\n  }, {\n    name: 'EncryptedContentInfo.contentEncryptionAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'EncryptedContentInfo.contentEncryptionAlgorithm.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'encAlgorithm'\n    }, {\n      name: 'EncryptedContentInfo.contentEncryptionAlgorithm.parameter',\n      tagClass: asn1.Class.UNIVERSAL,\n      captureAsn1: 'encParameter'\n    }]\n  }, {\n    name: 'EncryptedContentInfo.encryptedContent',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    /* The PKCS#7 structure output by OpenSSL somewhat differs from what\n     * other implementations do generate.\n     *\n     * OpenSSL generates a structure like this:\n     * SEQUENCE {\n     *    ...\n     *    [0]\n     *       26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38\n     *       C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45\n     *       ...\n     * }\n     *\n     * Whereas other implementations (and this PKCS#7 module) generate:\n     * SEQUENCE {\n     *    ...\n     *    [0] {\n     *       OCTET STRING\n     *          26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38\n     *          C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45\n     *          ...\n     *    }\n     * }\n     *\n     * In order to support both, we just capture the context specific\n     * field here.  The OCTET STRING bit is removed below.\n     */\n    capture: 'encryptedContent',\n    captureAsn1: 'encryptedContentAsn1'\n  }]\n};\n\np7v.envelopedDataValidator = {\n  name: 'EnvelopedData',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'EnvelopedData.Version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'version'\n  }, {\n    name: 'EnvelopedData.RecipientInfos',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SET,\n    constructed: true,\n    captureAsn1: 'recipientInfos'\n  }].concat(encryptedContentInfoValidator)\n};\n\np7v.encryptedDataValidator = {\n  name: 'EncryptedData',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'EncryptedData.Version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'version'\n  }].concat(encryptedContentInfoValidator)\n};\n\nvar signerValidator = {\n  name: 'SignerInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'SignerInfo.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false\n  }, {\n    name: 'SignerInfo.issuerAndSerialNumber',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'SignerInfo.issuerAndSerialNumber.issuer',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      captureAsn1: 'issuer'\n    }, {\n      name: 'SignerInfo.issuerAndSerialNumber.serialNumber',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.INTEGER,\n      constructed: false,\n      capture: 'serial'\n    }]\n  }, {\n    name: 'SignerInfo.digestAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'SignerInfo.digestAlgorithm.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'digestAlgorithm'\n    }, {\n      name: 'SignerInfo.digestAlgorithm.parameter',\n      tagClass: asn1.Class.UNIVERSAL,\n      constructed: false,\n      captureAsn1: 'digestParameter',\n      optional: true\n    }]\n  }, {\n    name: 'SignerInfo.authenticatedAttributes',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    constructed: true,\n    optional: true,\n    capture: 'authenticatedAttributes'\n  }, {\n    name: 'SignerInfo.digestEncryptionAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    capture: 'signatureAlgorithm'\n  }, {\n    name: 'SignerInfo.encryptedDigest',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'signature'\n  }, {\n    name: 'SignerInfo.unauthenticatedAttributes',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 1,\n    constructed: true,\n    optional: true,\n    capture: 'unauthenticatedAttributes'\n  }]\n};\n\np7v.signedDataValidator = {\n  name: 'SignedData',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'SignedData.Version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'version'\n  }, {\n    name: 'SignedData.DigestAlgorithms',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SET,\n    constructed: true,\n    captureAsn1: 'digestAlgorithms'\n  },\n  contentInfoValidator,\n  {\n    name: 'SignedData.Certificates',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    optional: true,\n    captureAsn1: 'certificates'\n  }, {\n    name: 'SignedData.CertificateRevocationLists',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 1,\n    optional: true,\n    captureAsn1: 'crls'\n  }, {\n    name: 'SignedData.SignerInfos',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SET,\n    capture: 'signerInfos',\n    optional: true,\n    value: [signerValidator]\n  }]\n};\n\np7v.recipientInfoValidator = {\n  name: 'RecipientInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'RecipientInfo.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'version'\n  }, {\n    name: 'RecipientInfo.issuerAndSerial',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'RecipientInfo.issuerAndSerial.issuer',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      captureAsn1: 'issuer'\n    }, {\n      name: 'RecipientInfo.issuerAndSerial.serialNumber',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.INTEGER,\n      constructed: false,\n      capture: 'serial'\n    }]\n  }, {\n    name: 'RecipientInfo.keyEncryptionAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'RecipientInfo.keyEncryptionAlgorithm.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'encAlgorithm'\n    }, {\n      name: 'RecipientInfo.keyEncryptionAlgorithm.parameter',\n      tagClass: asn1.Class.UNIVERSAL,\n      constructed: false,\n      captureAsn1: 'encParameter',\n      optional: true\n    }]\n  }, {\n    name: 'RecipientInfo.encryptedKey',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'encKey'\n  }]\n};\n","/**\n * Javascript implementation of mask generation function MGF1.\n *\n * @author Stefan Siegl\n * @author Dave Longley\n *\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n * Copyright (c) 2014 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./util');\n\nforge.mgf = forge.mgf || {};\nvar mgf1 = module.exports = forge.mgf.mgf1 = forge.mgf1 = forge.mgf1 || {};\n\n/**\n * Creates a MGF1 mask generation function object.\n *\n * @param md the message digest API to use (eg: forge.md.sha1.create()).\n *\n * @return a mask generation function object.\n */\nmgf1.create = function(md) {\n  var mgf = {\n    /**\n     * Generate mask of specified length.\n     *\n     * @param {String} seed The seed for mask generation.\n     * @param maskLen Number of bytes to generate.\n     * @return {String} The generated mask.\n     */\n    generate: function(seed, maskLen) {\n      /* 2. Let T be the empty octet string. */\n      var t = new forge.util.ByteBuffer();\n\n      /* 3. For counter from 0 to ceil(maskLen / hLen), do the following: */\n      var len = Math.ceil(maskLen / md.digestLength);\n      for(var i = 0; i < len; i++) {\n        /* a. Convert counter to an octet string C of length 4 octets */\n        var c = new forge.util.ByteBuffer();\n        c.putInt32(i);\n\n        /* b. Concatenate the hash of the seed mgfSeed and C to the octet\n         * string T: */\n        md.start();\n        md.update(seed + c.getBytes());\n        t.putBuffer(md.digest());\n      }\n\n      /* Output the leading maskLen octets of T as the octet string mask. */\n      t.truncate(t.length() - maskLen);\n      return t.getBytes();\n    }\n  };\n\n  return mgf;\n};\n","/**\n * Node.js module for Forge mask generation functions.\n *\n * @author Stefan Siegl\n *\n * Copyright 2012 Stefan Siegl <stesie@brokenpipe.de>\n */\nvar forge = require('./forge');\nrequire('./mgf1');\n\nmodule.exports = forge.mgf = forge.mgf || {};\nforge.mgf.mgf1 = forge.mgf1;\n","/**\n * Javascript implementation of PKCS#1 PSS signature padding.\n *\n * @author Stefan Siegl\n *\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n */\nvar forge = require('./forge');\nrequire('./random');\nrequire('./util');\n\n// shortcut for PSS API\nvar pss = module.exports = forge.pss = forge.pss || {};\n\n/**\n * Creates a PSS signature scheme object.\n *\n * There are several ways to provide a salt for encoding:\n *\n * 1. Specify the saltLength only and the built-in PRNG will generate it.\n * 2. Specify the saltLength and a custom PRNG with 'getBytesSync' defined that\n *   will be used.\n * 3. Specify the salt itself as a forge.util.ByteBuffer.\n *\n * @param options the options to use:\n *          md the message digest object to use, a forge md instance.\n *          mgf the mask generation function to use, a forge mgf instance.\n *          [saltLength] the length of the salt in octets.\n *          [prng] the pseudo-random number generator to use to produce a salt.\n *          [salt] the salt to use when encoding.\n *\n * @return a signature scheme object.\n */\npss.create = function(options) {\n  // backwards compatibility w/legacy args: hash, mgf, sLen\n  if(arguments.length === 3) {\n    options = {\n      md: arguments[0],\n      mgf: arguments[1],\n      saltLength: arguments[2]\n    };\n  }\n\n  var hash = options.md;\n  var mgf = options.mgf;\n  var hLen = hash.digestLength;\n\n  var salt_ = options.salt || null;\n  if(typeof salt_ === 'string') {\n    // assume binary-encoded string\n    salt_ = forge.util.createBuffer(salt_);\n  }\n\n  var sLen;\n  if('saltLength' in options) {\n    sLen = options.saltLength;\n  } else if(salt_ !== null) {\n    sLen = salt_.length();\n  } else {\n    throw new Error('Salt length not specified or specific salt not given.');\n  }\n\n  if(salt_ !== null && salt_.length() !== sLen) {\n    throw new Error('Given salt length does not match length of given salt.');\n  }\n\n  var prng = options.prng || forge.random;\n\n  var pssobj = {};\n\n  /**\n   * Encodes a PSS signature.\n   *\n   * This function implements EMSA-PSS-ENCODE as per RFC 3447, section 9.1.1.\n   *\n   * @param md the message digest object with the hash to sign.\n   * @param modsBits the length of the RSA modulus in bits.\n   *\n   * @return the encoded message as a binary-encoded string of length\n   *           ceil((modBits - 1) / 8).\n   */\n  pssobj.encode = function(md, modBits) {\n    var i;\n    var emBits = modBits - 1;\n    var emLen = Math.ceil(emBits / 8);\n\n    /* 2. Let mHash = Hash(M), an octet string of length hLen. */\n    var mHash = md.digest().getBytes();\n\n    /* 3. If emLen < hLen + sLen + 2, output \"encoding error\" and stop. */\n    if(emLen < hLen + sLen + 2) {\n      throw new Error('Message is too long to encrypt.');\n    }\n\n    /* 4. Generate a random octet string salt of length sLen; if sLen = 0,\n     *    then salt is the empty string. */\n    var salt;\n    if(salt_ === null) {\n      salt = prng.getBytesSync(sLen);\n    } else {\n      salt = salt_.bytes();\n    }\n\n    /* 5. Let M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt; */\n    var m_ = new forge.util.ByteBuffer();\n    m_.fillWithByte(0, 8);\n    m_.putBytes(mHash);\n    m_.putBytes(salt);\n\n    /* 6. Let H = Hash(M'), an octet string of length hLen. */\n    hash.start();\n    hash.update(m_.getBytes());\n    var h = hash.digest().getBytes();\n\n    /* 7. Generate an octet string PS consisting of emLen - sLen - hLen - 2\n     *    zero octets.  The length of PS may be 0. */\n    var ps = new forge.util.ByteBuffer();\n    ps.fillWithByte(0, emLen - sLen - hLen - 2);\n\n    /* 8. Let DB = PS || 0x01 || salt; DB is an octet string of length\n     *    emLen - hLen - 1. */\n    ps.putByte(0x01);\n    ps.putBytes(salt);\n    var db = ps.getBytes();\n\n    /* 9. Let dbMask = MGF(H, emLen - hLen - 1). */\n    var maskLen = emLen - hLen - 1;\n    var dbMask = mgf.generate(h, maskLen);\n\n    /* 10. Let maskedDB = DB \\xor dbMask. */\n    var maskedDB = '';\n    for(i = 0; i < maskLen; i++) {\n      maskedDB += String.fromCharCode(db.charCodeAt(i) ^ dbMask.charCodeAt(i));\n    }\n\n    /* 11. Set the leftmost 8emLen - emBits bits of the leftmost octet in\n     *     maskedDB to zero. */\n    var mask = (0xFF00 >> (8 * emLen - emBits)) & 0xFF;\n    maskedDB = String.fromCharCode(maskedDB.charCodeAt(0) & ~mask) +\n      maskedDB.substr(1);\n\n    /* 12. Let EM = maskedDB || H || 0xbc.\n     * 13. Output EM. */\n    return maskedDB + h + String.fromCharCode(0xbc);\n  };\n\n  /**\n   * Verifies a PSS signature.\n   *\n   * This function implements EMSA-PSS-VERIFY as per RFC 3447, section 9.1.2.\n   *\n   * @param mHash the message digest hash, as a binary-encoded string, to\n   *         compare against the signature.\n   * @param em the encoded message, as a binary-encoded string\n   *          (RSA decryption result).\n   * @param modsBits the length of the RSA modulus in bits.\n   *\n   * @return true if the signature was verified, false if not.\n   */\n  pssobj.verify = function(mHash, em, modBits) {\n    var i;\n    var emBits = modBits - 1;\n    var emLen = Math.ceil(emBits / 8);\n\n    /* c. Convert the message representative m to an encoded message EM\n     *    of length emLen = ceil((modBits - 1) / 8) octets, where modBits\n     *    is the length in bits of the RSA modulus n */\n    em = em.substr(-emLen);\n\n    /* 3. If emLen < hLen + sLen + 2, output \"inconsistent\" and stop. */\n    if(emLen < hLen + sLen + 2) {\n      throw new Error('Inconsistent parameters to PSS signature verification.');\n    }\n\n    /* 4. If the rightmost octet of EM does not have hexadecimal value\n     *    0xbc, output \"inconsistent\" and stop. */\n    if(em.charCodeAt(emLen - 1) !== 0xbc) {\n      throw new Error('Encoded message does not end in 0xBC.');\n    }\n\n    /* 5. Let maskedDB be the leftmost emLen - hLen - 1 octets of EM, and\n     *    let H be the next hLen octets. */\n    var maskLen = emLen - hLen - 1;\n    var maskedDB = em.substr(0, maskLen);\n    var h = em.substr(maskLen, hLen);\n\n    /* 6. If the leftmost 8emLen - emBits bits of the leftmost octet in\n     *    maskedDB are not all equal to zero, output \"inconsistent\" and stop. */\n    var mask = (0xFF00 >> (8 * emLen - emBits)) & 0xFF;\n    if((maskedDB.charCodeAt(0) & mask) !== 0) {\n      throw new Error('Bits beyond keysize not zero as expected.');\n    }\n\n    /* 7. Let dbMask = MGF(H, emLen - hLen - 1). */\n    var dbMask = mgf.generate(h, maskLen);\n\n    /* 8. Let DB = maskedDB \\xor dbMask. */\n    var db = '';\n    for(i = 0; i < maskLen; i++) {\n      db += String.fromCharCode(maskedDB.charCodeAt(i) ^ dbMask.charCodeAt(i));\n    }\n\n    /* 9. Set the leftmost 8emLen - emBits bits of the leftmost octet\n     * in DB to zero. */\n    db = String.fromCharCode(db.charCodeAt(0) & ~mask) + db.substr(1);\n\n    /* 10. If the emLen - hLen - sLen - 2 leftmost octets of DB are not zero\n     * or if the octet at position emLen - hLen - sLen - 1 (the leftmost\n     * position is \"position 1\") does not have hexadecimal value 0x01,\n     * output \"inconsistent\" and stop. */\n    var checkLen = emLen - hLen - sLen - 2;\n    for(i = 0; i < checkLen; i++) {\n      if(db.charCodeAt(i) !== 0x00) {\n        throw new Error('Leftmost octets not zero as expected');\n      }\n    }\n\n    if(db.charCodeAt(checkLen) !== 0x01) {\n      throw new Error('Inconsistent PSS signature, 0x01 marker not found');\n    }\n\n    /* 11. Let salt be the last sLen octets of DB. */\n    var salt = db.substr(-sLen);\n\n    /* 12.  Let M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt */\n    var m_ = new forge.util.ByteBuffer();\n    m_.fillWithByte(0, 8);\n    m_.putBytes(mHash);\n    m_.putBytes(salt);\n\n    /* 13. Let H' = Hash(M'), an octet string of length hLen. */\n    hash.start();\n    hash.update(m_.getBytes());\n    var h_ = hash.digest().getBytes();\n\n    /* 14. If H = H', output \"consistent.\" Otherwise, output \"inconsistent.\" */\n    return h === h_;\n  };\n\n  return pssobj;\n};\n","/**\n * Javascript implementation of X.509 and related components (such as\n * Certification Signing Requests) of a Public Key Infrastructure.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n *\n * The ASN.1 representation of an X.509v3 certificate is as follows\n * (see RFC 2459):\n *\n * Certificate ::= SEQUENCE {\n *   tbsCertificate       TBSCertificate,\n *   signatureAlgorithm   AlgorithmIdentifier,\n *   signatureValue       BIT STRING\n * }\n *\n * TBSCertificate ::= SEQUENCE {\n *   version         [0]  EXPLICIT Version DEFAULT v1,\n *   serialNumber         CertificateSerialNumber,\n *   signature            AlgorithmIdentifier,\n *   issuer               Name,\n *   validity             Validity,\n *   subject              Name,\n *   subjectPublicKeyInfo SubjectPublicKeyInfo,\n *   issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,\n *                        -- If present, version shall be v2 or v3\n *   subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,\n *                        -- If present, version shall be v2 or v3\n *   extensions      [3]  EXPLICIT Extensions OPTIONAL\n *                        -- If present, version shall be v3\n * }\n *\n * Version ::= INTEGER  { v1(0), v2(1), v3(2) }\n *\n * CertificateSerialNumber ::= INTEGER\n *\n * Name ::= CHOICE {\n *   // only one possible choice for now\n *   RDNSequence\n * }\n *\n * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName\n *\n * RelativeDistinguishedName ::= SET OF AttributeTypeAndValue\n *\n * AttributeTypeAndValue ::= SEQUENCE {\n *   type     AttributeType,\n *   value    AttributeValue\n * }\n * AttributeType ::= OBJECT IDENTIFIER\n * AttributeValue ::= ANY DEFINED BY AttributeType\n *\n * Validity ::= SEQUENCE {\n *   notBefore      Time,\n *   notAfter       Time\n * }\n *\n * Time ::= CHOICE {\n *   utcTime        UTCTime,\n *   generalTime    GeneralizedTime\n * }\n *\n * UniqueIdentifier ::= BIT STRING\n *\n * SubjectPublicKeyInfo ::= SEQUENCE {\n *   algorithm            AlgorithmIdentifier,\n *   subjectPublicKey     BIT STRING\n * }\n *\n * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension\n *\n * Extension ::= SEQUENCE {\n *   extnID      OBJECT IDENTIFIER,\n *   critical    BOOLEAN DEFAULT FALSE,\n *   extnValue   OCTET STRING\n * }\n *\n * The only key algorithm currently supported for PKI is RSA.\n *\n * RSASSA-PSS signatures are described in RFC 3447 and RFC 4055.\n *\n * PKCS#10 v1.7 describes certificate signing requests:\n *\n * CertificationRequestInfo:\n *\n * CertificationRequestInfo ::= SEQUENCE {\n *   version       INTEGER { v1(0) } (v1,...),\n *   subject       Name,\n *   subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},\n *   attributes    [0] Attributes{{ CRIAttributes }}\n * }\n *\n * Attributes { ATTRIBUTE:IOSet } ::= SET OF Attribute{{ IOSet }}\n *\n * CRIAttributes  ATTRIBUTE  ::= {\n *   ... -- add any locally defined attributes here -- }\n *\n * Attribute { ATTRIBUTE:IOSet } ::= SEQUENCE {\n *   type   ATTRIBUTE.&id({IOSet}),\n *   values SET SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{@type})\n * }\n *\n * CertificationRequest ::= SEQUENCE {\n *   certificationRequestInfo CertificationRequestInfo,\n *   signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},\n *   signature          BIT STRING\n * }\n */\nvar forge = require('./forge');\nrequire('./aes');\nrequire('./asn1');\nrequire('./des');\nrequire('./md');\nrequire('./mgf');\nrequire('./oids');\nrequire('./pem');\nrequire('./pss');\nrequire('./rsa');\nrequire('./util');\n\n// shortcut for asn.1 API\nvar asn1 = forge.asn1;\n\n/* Public Key Infrastructure (PKI) implementation. */\nvar pki = module.exports = forge.pki = forge.pki || {};\nvar oids = pki.oids;\n\n// short name OID mappings\nvar _shortNames = {};\n_shortNames['CN'] = oids['commonName'];\n_shortNames['commonName'] = 'CN';\n_shortNames['C'] = oids['countryName'];\n_shortNames['countryName'] = 'C';\n_shortNames['L'] = oids['localityName'];\n_shortNames['localityName'] = 'L';\n_shortNames['ST'] = oids['stateOrProvinceName'];\n_shortNames['stateOrProvinceName'] = 'ST';\n_shortNames['O'] = oids['organizationName'];\n_shortNames['organizationName'] = 'O';\n_shortNames['OU'] = oids['organizationalUnitName'];\n_shortNames['organizationalUnitName'] = 'OU';\n_shortNames['E'] = oids['emailAddress'];\n_shortNames['emailAddress'] = 'E';\n\n// validator for an SubjectPublicKeyInfo structure\n// Note: Currently only works with an RSA public key\nvar publicKeyValidator = forge.pki.rsa.publicKeyValidator;\n\n// validator for an X.509v3 certificate\nvar x509CertificateValidator = {\n  name: 'Certificate',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'Certificate.TBSCertificate',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    captureAsn1: 'tbsCertificate',\n    value: [{\n      name: 'Certificate.TBSCertificate.version',\n      tagClass: asn1.Class.CONTEXT_SPECIFIC,\n      type: 0,\n      constructed: true,\n      optional: true,\n      value: [{\n        name: 'Certificate.TBSCertificate.version.integer',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.INTEGER,\n        constructed: false,\n        capture: 'certVersion'\n      }]\n    }, {\n      name: 'Certificate.TBSCertificate.serialNumber',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.INTEGER,\n      constructed: false,\n      capture: 'certSerialNumber'\n    }, {\n      name: 'Certificate.TBSCertificate.signature',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      value: [{\n        name: 'Certificate.TBSCertificate.signature.algorithm',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OID,\n        constructed: false,\n        capture: 'certinfoSignatureOid'\n      }, {\n        name: 'Certificate.TBSCertificate.signature.parameters',\n        tagClass: asn1.Class.UNIVERSAL,\n        optional: true,\n        captureAsn1: 'certinfoSignatureParams'\n      }]\n    }, {\n      name: 'Certificate.TBSCertificate.issuer',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      captureAsn1: 'certIssuer'\n    }, {\n      name: 'Certificate.TBSCertificate.validity',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      // Note: UTC and generalized times may both appear so the capture\n      // names are based on their detected order, the names used below\n      // are only for the common case, which validity time really means\n      // \"notBefore\" and which means \"notAfter\" will be determined by order\n      value: [{\n        // notBefore (Time) (UTC time case)\n        name: 'Certificate.TBSCertificate.validity.notBefore (utc)',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.UTCTIME,\n        constructed: false,\n        optional: true,\n        capture: 'certValidity1UTCTime'\n      }, {\n        // notBefore (Time) (generalized time case)\n        name: 'Certificate.TBSCertificate.validity.notBefore (generalized)',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.GENERALIZEDTIME,\n        constructed: false,\n        optional: true,\n        capture: 'certValidity2GeneralizedTime'\n      }, {\n        // notAfter (Time) (only UTC time is supported)\n        name: 'Certificate.TBSCertificate.validity.notAfter (utc)',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.UTCTIME,\n        constructed: false,\n        optional: true,\n        capture: 'certValidity3UTCTime'\n      }, {\n        // notAfter (Time) (only UTC time is supported)\n        name: 'Certificate.TBSCertificate.validity.notAfter (generalized)',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.GENERALIZEDTIME,\n        constructed: false,\n        optional: true,\n        capture: 'certValidity4GeneralizedTime'\n      }]\n    }, {\n      // Name (subject) (RDNSequence)\n      name: 'Certificate.TBSCertificate.subject',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      captureAsn1: 'certSubject'\n    },\n    // SubjectPublicKeyInfo\n    publicKeyValidator,\n    {\n      // issuerUniqueID (optional)\n      name: 'Certificate.TBSCertificate.issuerUniqueID',\n      tagClass: asn1.Class.CONTEXT_SPECIFIC,\n      type: 1,\n      constructed: true,\n      optional: true,\n      value: [{\n        name: 'Certificate.TBSCertificate.issuerUniqueID.id',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.BITSTRING,\n        constructed: false,\n        // TODO: support arbitrary bit length ids\n        captureBitStringValue: 'certIssuerUniqueId'\n      }]\n    }, {\n      // subjectUniqueID (optional)\n      name: 'Certificate.TBSCertificate.subjectUniqueID',\n      tagClass: asn1.Class.CONTEXT_SPECIFIC,\n      type: 2,\n      constructed: true,\n      optional: true,\n      value: [{\n        name: 'Certificate.TBSCertificate.subjectUniqueID.id',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.BITSTRING,\n        constructed: false,\n        // TODO: support arbitrary bit length ids\n        captureBitStringValue: 'certSubjectUniqueId'\n      }]\n    }, {\n      // Extensions (optional)\n      name: 'Certificate.TBSCertificate.extensions',\n      tagClass: asn1.Class.CONTEXT_SPECIFIC,\n      type: 3,\n      constructed: true,\n      captureAsn1: 'certExtensions',\n      optional: true\n    }]\n  }, {\n    // AlgorithmIdentifier (signature algorithm)\n    name: 'Certificate.signatureAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      // algorithm\n      name: 'Certificate.signatureAlgorithm.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'certSignatureOid'\n    }, {\n      name: 'Certificate.TBSCertificate.signature.parameters',\n      tagClass: asn1.Class.UNIVERSAL,\n      optional: true,\n      captureAsn1: 'certSignatureParams'\n    }]\n  }, {\n    // SignatureValue\n    name: 'Certificate.signatureValue',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.BITSTRING,\n    constructed: false,\n    captureBitStringValue: 'certSignature'\n  }]\n};\n\nvar rsassaPssParameterValidator = {\n  name: 'rsapss',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'rsapss.hashAlgorithm',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    constructed: true,\n    value: [{\n      name: 'rsapss.hashAlgorithm.AlgorithmIdentifier',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Class.SEQUENCE,\n      constructed: true,\n      optional: true,\n      value: [{\n        name: 'rsapss.hashAlgorithm.AlgorithmIdentifier.algorithm',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OID,\n        constructed: false,\n        capture: 'hashOid'\n        /* parameter block omitted, for SHA1 NULL anyhow. */\n      }]\n    }]\n  }, {\n    name: 'rsapss.maskGenAlgorithm',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 1,\n    constructed: true,\n    value: [{\n      name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Class.SEQUENCE,\n      constructed: true,\n      optional: true,\n      value: [{\n        name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier.algorithm',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OID,\n        constructed: false,\n        capture: 'maskGenOid'\n      }, {\n        name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier.params',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.SEQUENCE,\n        constructed: true,\n        value: [{\n          name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier.params.algorithm',\n          tagClass: asn1.Class.UNIVERSAL,\n          type: asn1.Type.OID,\n          constructed: false,\n          capture: 'maskGenHashOid'\n          /* parameter block omitted, for SHA1 NULL anyhow. */\n        }]\n      }]\n    }]\n  }, {\n    name: 'rsapss.saltLength',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 2,\n    optional: true,\n    value: [{\n      name: 'rsapss.saltLength.saltLength',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Class.INTEGER,\n      constructed: false,\n      capture: 'saltLength'\n    }]\n  }, {\n    name: 'rsapss.trailerField',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 3,\n    optional: true,\n    value: [{\n      name: 'rsapss.trailer.trailer',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Class.INTEGER,\n      constructed: false,\n      capture: 'trailer'\n    }]\n  }]\n};\n\n// validator for a CertificationRequestInfo structure\nvar certificationRequestInfoValidator = {\n  name: 'CertificationRequestInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  captureAsn1: 'certificationRequestInfo',\n  value: [{\n    name: 'CertificationRequestInfo.integer',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'certificationRequestInfoVersion'\n  }, {\n    // Name (subject) (RDNSequence)\n    name: 'CertificationRequestInfo.subject',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    captureAsn1: 'certificationRequestInfoSubject'\n  },\n  // SubjectPublicKeyInfo\n  publicKeyValidator,\n  {\n    name: 'CertificationRequestInfo.attributes',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    constructed: true,\n    optional: true,\n    capture: 'certificationRequestInfoAttributes',\n    value: [{\n      name: 'CertificationRequestInfo.attributes',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      value: [{\n        name: 'CertificationRequestInfo.attributes.type',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OID,\n        constructed: false\n      }, {\n        name: 'CertificationRequestInfo.attributes.value',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.SET,\n        constructed: true\n      }]\n    }]\n  }]\n};\n\n// validator for a CertificationRequest structure\nvar certificationRequestValidator = {\n  name: 'CertificationRequest',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  captureAsn1: 'csr',\n  value: [\n    certificationRequestInfoValidator, {\n      // AlgorithmIdentifier (signature algorithm)\n      name: 'CertificationRequest.signatureAlgorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      value: [{\n        // algorithm\n        name: 'CertificationRequest.signatureAlgorithm.algorithm',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OID,\n        constructed: false,\n        capture: 'csrSignatureOid'\n      }, {\n        name: 'CertificationRequest.signatureAlgorithm.parameters',\n        tagClass: asn1.Class.UNIVERSAL,\n        optional: true,\n        captureAsn1: 'csrSignatureParams'\n      }]\n    }, {\n      // signature\n      name: 'CertificationRequest.signature',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.BITSTRING,\n      constructed: false,\n      captureBitStringValue: 'csrSignature'\n    }\n  ]\n};\n\n/**\n * Converts an RDNSequence of ASN.1 DER-encoded RelativeDistinguishedName\n * sets into an array with objects that have type and value properties.\n *\n * @param rdn the RDNSequence to convert.\n * @param md a message digest to append type and value to if provided.\n */\npki.RDNAttributesAsArray = function(rdn, md) {\n  var rval = [];\n\n  // each value in 'rdn' in is a SET of RelativeDistinguishedName\n  var set, attr, obj;\n  for(var si = 0; si < rdn.value.length; ++si) {\n    // get the RelativeDistinguishedName set\n    set = rdn.value[si];\n\n    // each value in the SET is an AttributeTypeAndValue sequence\n    // containing first a type (an OID) and second a value (defined by\n    // the OID)\n    for(var i = 0; i < set.value.length; ++i) {\n      obj = {};\n      attr = set.value[i];\n      obj.type = asn1.derToOid(attr.value[0].value);\n      obj.value = attr.value[1].value;\n      obj.valueTagClass = attr.value[1].type;\n      // if the OID is known, get its name and short name\n      if(obj.type in oids) {\n        obj.name = oids[obj.type];\n        if(obj.name in _shortNames) {\n          obj.shortName = _shortNames[obj.name];\n        }\n      }\n      if(md) {\n        md.update(obj.type);\n        md.update(obj.value);\n      }\n      rval.push(obj);\n    }\n  }\n\n  return rval;\n};\n\n/**\n * Converts ASN.1 CRIAttributes into an array with objects that have type and\n * value properties.\n *\n * @param attributes the CRIAttributes to convert.\n */\npki.CRIAttributesAsArray = function(attributes) {\n  var rval = [];\n\n  // each value in 'attributes' in is a SEQUENCE with an OID and a SET\n  for(var si = 0; si < attributes.length; ++si) {\n    // get the attribute sequence\n    var seq = attributes[si];\n\n    // each value in the SEQUENCE containing first a type (an OID) and\n    // second a set of values (defined by the OID)\n    var type = asn1.derToOid(seq.value[0].value);\n    var values = seq.value[1].value;\n    for(var vi = 0; vi < values.length; ++vi) {\n      var obj = {};\n      obj.type = type;\n      obj.value = values[vi].value;\n      obj.valueTagClass = values[vi].type;\n      // if the OID is known, get its name and short name\n      if(obj.type in oids) {\n        obj.name = oids[obj.type];\n        if(obj.name in _shortNames) {\n          obj.shortName = _shortNames[obj.name];\n        }\n      }\n      // parse extensions\n      if(obj.type === oids.extensionRequest) {\n        obj.extensions = [];\n        for(var ei = 0; ei < obj.value.length; ++ei) {\n          obj.extensions.push(pki.certificateExtensionFromAsn1(obj.value[ei]));\n        }\n      }\n      rval.push(obj);\n    }\n  }\n\n  return rval;\n};\n\n/**\n * Gets an issuer or subject attribute from its name, type, or short name.\n *\n * @param obj the issuer or subject object.\n * @param options a short name string or an object with:\n *          shortName the short name for the attribute.\n *          name the name for the attribute.\n *          type the type for the attribute.\n *\n * @return the attribute.\n */\nfunction _getAttribute(obj, options) {\n  if(typeof options === 'string') {\n    options = {shortName: options};\n  }\n\n  var rval = null;\n  var attr;\n  for(var i = 0; rval === null && i < obj.attributes.length; ++i) {\n    attr = obj.attributes[i];\n    if(options.type && options.type === attr.type) {\n      rval = attr;\n    } else if(options.name && options.name === attr.name) {\n      rval = attr;\n    } else if(options.shortName && options.shortName === attr.shortName) {\n      rval = attr;\n    }\n  }\n  return rval;\n}\n\n/**\n * Converts signature parameters from ASN.1 structure.\n *\n * Currently only RSASSA-PSS supported.  The PKCS#1 v1.5 signature scheme had\n * no parameters.\n *\n * RSASSA-PSS-params  ::=  SEQUENCE  {\n *   hashAlgorithm      [0] HashAlgorithm DEFAULT\n *                             sha1Identifier,\n *   maskGenAlgorithm   [1] MaskGenAlgorithm DEFAULT\n *                             mgf1SHA1Identifier,\n *   saltLength         [2] INTEGER DEFAULT 20,\n *   trailerField       [3] INTEGER DEFAULT 1\n * }\n *\n * HashAlgorithm  ::=  AlgorithmIdentifier\n *\n * MaskGenAlgorithm  ::=  AlgorithmIdentifier\n *\n * AlgorithmIdentifer ::= SEQUENCE {\n *   algorithm OBJECT IDENTIFIER,\n *   parameters ANY DEFINED BY algorithm OPTIONAL\n * }\n *\n * @param oid The OID specifying the signature algorithm\n * @param obj The ASN.1 structure holding the parameters\n * @param fillDefaults Whether to use return default values where omitted\n * @return signature parameter object\n */\nvar _readSignatureParameters = function(oid, obj, fillDefaults) {\n  var params = {};\n\n  if(oid !== oids['RSASSA-PSS']) {\n    return params;\n  }\n\n  if(fillDefaults) {\n    params = {\n      hash: {\n        algorithmOid: oids['sha1']\n      },\n      mgf: {\n        algorithmOid: oids['mgf1'],\n        hash: {\n          algorithmOid: oids['sha1']\n        }\n      },\n      saltLength: 20\n    };\n  }\n\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, rsassaPssParameterValidator, capture, errors)) {\n    var error = new Error('Cannot read RSASSA-PSS parameter block.');\n    error.errors = errors;\n    throw error;\n  }\n\n  if(capture.hashOid !== undefined) {\n    params.hash = params.hash || {};\n    params.hash.algorithmOid = asn1.derToOid(capture.hashOid);\n  }\n\n  if(capture.maskGenOid !== undefined) {\n    params.mgf = params.mgf || {};\n    params.mgf.algorithmOid = asn1.derToOid(capture.maskGenOid);\n    params.mgf.hash = params.mgf.hash || {};\n    params.mgf.hash.algorithmOid = asn1.derToOid(capture.maskGenHashOid);\n  }\n\n  if(capture.saltLength !== undefined) {\n    params.saltLength = capture.saltLength.charCodeAt(0);\n  }\n\n  return params;\n};\n\n/**\n * Create signature digest for OID.\n *\n * @param options\n *   signatureOid: the OID specifying the signature algorithm.\n *   type: a human readable type for error messages\n * @return a created md instance. throws if unknown oid.\n */\nvar _createSignatureDigest = function(options) {\n  switch(oids[options.signatureOid]) {\n    case 'sha1WithRSAEncryption':\n    // deprecated alias\n    case 'sha1WithRSASignature':\n      return forge.md.sha1.create();\n    case 'md5WithRSAEncryption':\n      return forge.md.md5.create();\n    case 'sha256WithRSAEncryption':\n      return forge.md.sha256.create();\n    case 'sha384WithRSAEncryption':\n      return forge.md.sha384.create();\n    case 'sha512WithRSAEncryption':\n      return forge.md.sha512.create();\n    case 'RSASSA-PSS':\n      return forge.md.sha256.create();\n    default:\n      var error = new Error(\n        'Could not compute ' + options.type + ' digest. ' +\n        'Unknown signature OID.');\n      error.signatureOid = options.signatureOid;\n      throw error;\n  }\n};\n\n/**\n * Verify signature on certificate or CSR.\n *\n * @param options:\n *   certificate the certificate or CSR to verify.\n *   md the signature digest.\n *   signature the signature\n * @return a created md instance. throws if unknown oid.\n */\nvar _verifySignature = function(options) {\n  var cert = options.certificate;\n  var scheme;\n\n  switch(cert.signatureOid) {\n    case oids.sha1WithRSAEncryption:\n    // deprecated alias\n    case oids.sha1WithRSASignature:\n      /* use PKCS#1 v1.5 padding scheme */\n      break;\n    case oids['RSASSA-PSS']:\n      var hash, mgf;\n\n      /* initialize mgf */\n      hash = oids[cert.signatureParameters.mgf.hash.algorithmOid];\n      if(hash === undefined || forge.md[hash] === undefined) {\n        var error = new Error('Unsupported MGF hash function.');\n        error.oid = cert.signatureParameters.mgf.hash.algorithmOid;\n        error.name = hash;\n        throw error;\n      }\n\n      mgf = oids[cert.signatureParameters.mgf.algorithmOid];\n      if(mgf === undefined || forge.mgf[mgf] === undefined) {\n        var error = new Error('Unsupported MGF function.');\n        error.oid = cert.signatureParameters.mgf.algorithmOid;\n        error.name = mgf;\n        throw error;\n      }\n\n      mgf = forge.mgf[mgf].create(forge.md[hash].create());\n\n      /* initialize hash function */\n      hash = oids[cert.signatureParameters.hash.algorithmOid];\n      if(hash === undefined || forge.md[hash] === undefined) {\n        var error = new Error('Unsupported RSASSA-PSS hash function.');\n        error.oid = cert.signatureParameters.hash.algorithmOid;\n        error.name = hash;\n        throw error;\n      }\n\n      scheme = forge.pss.create(\n        forge.md[hash].create(), mgf, cert.signatureParameters.saltLength\n      );\n      break;\n  }\n\n  // verify signature on cert using public key\n  return cert.publicKey.verify(\n    options.md.digest().getBytes(), options.signature, scheme\n  );\n};\n\n/**\n * Converts an X.509 certificate from PEM format.\n *\n * Note: If the certificate is to be verified then compute hash should\n * be set to true. This will scan the TBSCertificate part of the ASN.1\n * object while it is converted so it doesn't need to be converted back\n * to ASN.1-DER-encoding later.\n *\n * @param pem the PEM-formatted certificate.\n * @param computeHash true to compute the hash for verification.\n * @param strict true to be strict when checking ASN.1 value lengths, false to\n *          allow truncated values (default: true).\n *\n * @return the certificate.\n */\npki.certificateFromPem = function(pem, computeHash, strict) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'CERTIFICATE' &&\n    msg.type !== 'X509 CERTIFICATE' &&\n    msg.type !== 'TRUSTED CERTIFICATE') {\n    var error = new Error(\n      'Could not convert certificate from PEM; PEM header type ' +\n      'is not \"CERTIFICATE\", \"X509 CERTIFICATE\", or \"TRUSTED CERTIFICATE\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error(\n      'Could not convert certificate from PEM; PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  var obj = asn1.fromDer(msg.body, strict);\n\n  return pki.certificateFromAsn1(obj, computeHash);\n};\n\n/**\n * Converts an X.509 certificate to PEM format.\n *\n * @param cert the certificate.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted certificate.\n */\npki.certificateToPem = function(cert, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var msg = {\n    type: 'CERTIFICATE',\n    body: asn1.toDer(pki.certificateToAsn1(cert)).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Converts an RSA public key from PEM format.\n *\n * @param pem the PEM-formatted public key.\n *\n * @return the public key.\n */\npki.publicKeyFromPem = function(pem) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'PUBLIC KEY' && msg.type !== 'RSA PUBLIC KEY') {\n    var error = new Error('Could not convert public key from PEM; PEM header ' +\n      'type is not \"PUBLIC KEY\" or \"RSA PUBLIC KEY\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert public key from PEM; PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  var obj = asn1.fromDer(msg.body);\n\n  return pki.publicKeyFromAsn1(obj);\n};\n\n/**\n * Converts an RSA public key to PEM format (using a SubjectPublicKeyInfo).\n *\n * @param key the public key.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted public key.\n */\npki.publicKeyToPem = function(key, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var msg = {\n    type: 'PUBLIC KEY',\n    body: asn1.toDer(pki.publicKeyToAsn1(key)).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Converts an RSA public key to PEM format (using an RSAPublicKey).\n *\n * @param key the public key.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted public key.\n */\npki.publicKeyToRSAPublicKeyPem = function(key, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var msg = {\n    type: 'RSA PUBLIC KEY',\n    body: asn1.toDer(pki.publicKeyToRSAPublicKey(key)).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Gets a fingerprint for the given public key.\n *\n * @param options the options to use.\n *          [md] the message digest object to use (defaults to forge.md.sha1).\n *          [type] the type of fingerprint, such as 'RSAPublicKey',\n *            'SubjectPublicKeyInfo' (defaults to 'RSAPublicKey').\n *          [encoding] an alternative output encoding, such as 'hex'\n *            (defaults to none, outputs a byte buffer).\n *          [delimiter] the delimiter to use between bytes for 'hex' encoded\n *            output, eg: ':' (defaults to none).\n *\n * @return the fingerprint as a byte buffer or other encoding based on options.\n */\npki.getPublicKeyFingerprint = function(key, options) {\n  options = options || {};\n  var md = options.md || forge.md.sha1.create();\n  var type = options.type || 'RSAPublicKey';\n\n  var bytes;\n  switch(type) {\n    case 'RSAPublicKey':\n      bytes = asn1.toDer(pki.publicKeyToRSAPublicKey(key)).getBytes();\n      break;\n    case 'SubjectPublicKeyInfo':\n      bytes = asn1.toDer(pki.publicKeyToAsn1(key)).getBytes();\n      break;\n    default:\n      throw new Error('Unknown fingerprint type \"' + options.type + '\".');\n  }\n\n  // hash public key bytes\n  md.start();\n  md.update(bytes);\n  var digest = md.digest();\n  if(options.encoding === 'hex') {\n    var hex = digest.toHex();\n    if(options.delimiter) {\n      return hex.match(/.{2}/g).join(options.delimiter);\n    }\n    return hex;\n  } else if(options.encoding === 'binary') {\n    return digest.getBytes();\n  } else if(options.encoding) {\n    throw new Error('Unknown encoding \"' + options.encoding + '\".');\n  }\n  return digest;\n};\n\n/**\n * Converts a PKCS#10 certification request (CSR) from PEM format.\n *\n * Note: If the certification request is to be verified then compute hash\n * should be set to true. This will scan the CertificationRequestInfo part of\n * the ASN.1 object while it is converted so it doesn't need to be converted\n * back to ASN.1-DER-encoding later.\n *\n * @param pem the PEM-formatted certificate.\n * @param computeHash true to compute the hash for verification.\n * @param strict true to be strict when checking ASN.1 value lengths, false to\n *          allow truncated values (default: true).\n *\n * @return the certification request (CSR).\n */\npki.certificationRequestFromPem = function(pem, computeHash, strict) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'CERTIFICATE REQUEST') {\n    var error = new Error('Could not convert certification request from PEM; ' +\n      'PEM header type is not \"CERTIFICATE REQUEST\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert certification request from PEM; ' +\n      'PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  var obj = asn1.fromDer(msg.body, strict);\n\n  return pki.certificationRequestFromAsn1(obj, computeHash);\n};\n\n/**\n * Converts a PKCS#10 certification request (CSR) to PEM format.\n *\n * @param csr the certification request.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted certification request.\n */\npki.certificationRequestToPem = function(csr, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var msg = {\n    type: 'CERTIFICATE REQUEST',\n    body: asn1.toDer(pki.certificationRequestToAsn1(csr)).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Creates an empty X.509v3 RSA certificate.\n *\n * @return the certificate.\n */\npki.createCertificate = function() {\n  var cert = {};\n  cert.version = 0x02;\n  cert.serialNumber = '00';\n  cert.signatureOid = null;\n  cert.signature = null;\n  cert.siginfo = {};\n  cert.siginfo.algorithmOid = null;\n  cert.validity = {};\n  cert.validity.notBefore = new Date();\n  cert.validity.notAfter = new Date();\n\n  cert.issuer = {};\n  cert.issuer.getField = function(sn) {\n    return _getAttribute(cert.issuer, sn);\n  };\n  cert.issuer.addField = function(attr) {\n    _fillMissingFields([attr]);\n    cert.issuer.attributes.push(attr);\n  };\n  cert.issuer.attributes = [];\n  cert.issuer.hash = null;\n\n  cert.subject = {};\n  cert.subject.getField = function(sn) {\n    return _getAttribute(cert.subject, sn);\n  };\n  cert.subject.addField = function(attr) {\n    _fillMissingFields([attr]);\n    cert.subject.attributes.push(attr);\n  };\n  cert.subject.attributes = [];\n  cert.subject.hash = null;\n\n  cert.extensions = [];\n  cert.publicKey = null;\n  cert.md = null;\n\n  /**\n   * Sets the subject of this certificate.\n   *\n   * @param attrs the array of subject attributes to use.\n   * @param uniqueId an optional a unique ID to use.\n   */\n  cert.setSubject = function(attrs, uniqueId) {\n    // set new attributes, clear hash\n    _fillMissingFields(attrs);\n    cert.subject.attributes = attrs;\n    delete cert.subject.uniqueId;\n    if(uniqueId) {\n      // TODO: support arbitrary bit length ids\n      cert.subject.uniqueId = uniqueId;\n    }\n    cert.subject.hash = null;\n  };\n\n  /**\n   * Sets the issuer of this certificate.\n   *\n   * @param attrs the array of issuer attributes to use.\n   * @param uniqueId an optional a unique ID to use.\n   */\n  cert.setIssuer = function(attrs, uniqueId) {\n    // set new attributes, clear hash\n    _fillMissingFields(attrs);\n    cert.issuer.attributes = attrs;\n    delete cert.issuer.uniqueId;\n    if(uniqueId) {\n      // TODO: support arbitrary bit length ids\n      cert.issuer.uniqueId = uniqueId;\n    }\n    cert.issuer.hash = null;\n  };\n\n  /**\n   * Sets the extensions of this certificate.\n   *\n   * @param exts the array of extensions to use.\n   */\n  cert.setExtensions = function(exts) {\n    for(var i = 0; i < exts.length; ++i) {\n      _fillMissingExtensionFields(exts[i], {cert: cert});\n    }\n    // set new extensions\n    cert.extensions = exts;\n  };\n\n  /**\n   * Gets an extension by its name or id.\n   *\n   * @param options the name to use or an object with:\n   *          name the name to use.\n   *          id the id to use.\n   *\n   * @return the extension or null if not found.\n   */\n  cert.getExtension = function(options) {\n    if(typeof options === 'string') {\n      options = {name: options};\n    }\n\n    var rval = null;\n    var ext;\n    for(var i = 0; rval === null && i < cert.extensions.length; ++i) {\n      ext = cert.extensions[i];\n      if(options.id && ext.id === options.id) {\n        rval = ext;\n      } else if(options.name && ext.name === options.name) {\n        rval = ext;\n      }\n    }\n    return rval;\n  };\n\n  /**\n   * Signs this certificate using the given private key.\n   *\n   * @param key the private key to sign with.\n   * @param md the message digest object to use (defaults to forge.md.sha1).\n   */\n  cert.sign = function(key, md) {\n    // TODO: get signature OID from private key\n    cert.md = md || forge.md.sha1.create();\n    var algorithmOid = oids[cert.md.algorithm + 'WithRSAEncryption'];\n    if(!algorithmOid) {\n      var error = new Error('Could not compute certificate digest. ' +\n        'Unknown message digest algorithm OID.');\n      error.algorithm = cert.md.algorithm;\n      throw error;\n    }\n    cert.signatureOid = cert.siginfo.algorithmOid = algorithmOid;\n\n    // get TBSCertificate, convert to DER\n    cert.tbsCertificate = pki.getTBSCertificate(cert);\n    var bytes = asn1.toDer(cert.tbsCertificate);\n\n    // digest and sign\n    cert.md.update(bytes.getBytes());\n    cert.signature = key.sign(cert.md);\n  };\n\n  /**\n   * Attempts verify the signature on the passed certificate using this\n   * certificate's public key.\n   *\n   * @param child the certificate to verify.\n   *\n   * @return true if verified, false if not.\n   */\n  cert.verify = function(child) {\n    var rval = false;\n\n    if(!cert.issued(child)) {\n      var issuer = child.issuer;\n      var subject = cert.subject;\n      var error = new Error(\n        'The parent certificate did not issue the given child ' +\n        'certificate; the child certificate\\'s issuer does not match the ' +\n        'parent\\'s subject.');\n      error.expectedIssuer = subject.attributes;\n      error.actualIssuer = issuer.attributes;\n      throw error;\n    }\n\n    var md = child.md;\n    if(md === null) {\n      // create digest for OID signature types\n      md = _createSignatureDigest({\n        signatureOid: child.signatureOid,\n        type: 'certificate'\n      });\n\n      // produce DER formatted TBSCertificate and digest it\n      var tbsCertificate = child.tbsCertificate || pki.getTBSCertificate(child);\n      var bytes = asn1.toDer(tbsCertificate);\n      md.update(bytes.getBytes());\n    }\n\n    if(md !== null) {\n      rval = _verifySignature({\n        certificate: cert, md: md, signature: child.signature\n      });\n    }\n\n    return rval;\n  };\n\n  /**\n   * Returns true if this certificate's issuer matches the passed\n   * certificate's subject. Note that no signature check is performed.\n   *\n   * @param parent the certificate to check.\n   *\n   * @return true if this certificate's issuer matches the passed certificate's\n   *         subject.\n   */\n  cert.isIssuer = function(parent) {\n    var rval = false;\n\n    var i = cert.issuer;\n    var s = parent.subject;\n\n    // compare hashes if present\n    if(i.hash && s.hash) {\n      rval = (i.hash === s.hash);\n    } else if(i.attributes.length === s.attributes.length) {\n      // all attributes are the same so issuer matches subject\n      rval = true;\n      var iattr, sattr;\n      for(var n = 0; rval && n < i.attributes.length; ++n) {\n        iattr = i.attributes[n];\n        sattr = s.attributes[n];\n        if(iattr.type !== sattr.type || iattr.value !== sattr.value) {\n          // attribute mismatch\n          rval = false;\n        }\n      }\n    }\n\n    return rval;\n  };\n\n  /**\n   * Returns true if this certificate's subject matches the issuer of the\n   * given certificate). Note that not signature check is performed.\n   *\n   * @param child the certificate to check.\n   *\n   * @return true if this certificate's subject matches the passed\n   *         certificate's issuer.\n   */\n  cert.issued = function(child) {\n    return child.isIssuer(cert);\n  };\n\n  /**\n   * Generates the subjectKeyIdentifier for this certificate as byte buffer.\n   *\n   * @return the subjectKeyIdentifier for this certificate as byte buffer.\n   */\n  cert.generateSubjectKeyIdentifier = function() {\n    /* See: 4.2.1.2 section of the the RFC3280, keyIdentifier is either:\n\n      (1) The keyIdentifier is composed of the 160-bit SHA-1 hash of the\n        value of the BIT STRING subjectPublicKey (excluding the tag,\n        length, and number of unused bits).\n\n      (2) The keyIdentifier is composed of a four bit type field with\n        the value 0100 followed by the least significant 60 bits of the\n        SHA-1 hash of the value of the BIT STRING subjectPublicKey\n        (excluding the tag, length, and number of unused bit string bits).\n    */\n\n    // skipping the tag, length, and number of unused bits is the same\n    // as just using the RSAPublicKey (for RSA keys, which are the\n    // only ones supported)\n    return pki.getPublicKeyFingerprint(cert.publicKey, {type: 'RSAPublicKey'});\n  };\n\n  /**\n   * Verifies the subjectKeyIdentifier extension value for this certificate\n   * against its public key. If no extension is found, false will be\n   * returned.\n   *\n   * @return true if verified, false if not.\n   */\n  cert.verifySubjectKeyIdentifier = function() {\n    var oid = oids['subjectKeyIdentifier'];\n    for(var i = 0; i < cert.extensions.length; ++i) {\n      var ext = cert.extensions[i];\n      if(ext.id === oid) {\n        var ski = cert.generateSubjectKeyIdentifier().getBytes();\n        return (forge.util.hexToBytes(ext.subjectKeyIdentifier) === ski);\n      }\n    }\n    return false;\n  };\n\n  return cert;\n};\n\n/**\n * Converts an X.509v3 RSA certificate from an ASN.1 object.\n *\n * Note: If the certificate is to be verified then compute hash should\n * be set to true. There is currently no implementation for converting\n * a certificate back to ASN.1 so the TBSCertificate part of the ASN.1\n * object needs to be scanned before the cert object is created.\n *\n * @param obj the asn1 representation of an X.509v3 RSA certificate.\n * @param computeHash true to compute the hash for verification.\n *\n * @return the certificate.\n */\npki.certificateFromAsn1 = function(obj, computeHash) {\n  // validate certificate and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, x509CertificateValidator, capture, errors)) {\n    var error = new Error('Cannot read X.509 certificate. ' +\n      'ASN.1 object is not an X509v3 Certificate.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // get oid\n  var oid = asn1.derToOid(capture.publicKeyOid);\n  if(oid !== pki.oids.rsaEncryption) {\n    throw new Error('Cannot read public key. OID is not RSA.');\n  }\n\n  // create certificate\n  var cert = pki.createCertificate();\n  cert.version = capture.certVersion ?\n    capture.certVersion.charCodeAt(0) : 0;\n  var serial = forge.util.createBuffer(capture.certSerialNumber);\n  cert.serialNumber = serial.toHex();\n  cert.signatureOid = forge.asn1.derToOid(capture.certSignatureOid);\n  cert.signatureParameters = _readSignatureParameters(\n    cert.signatureOid, capture.certSignatureParams, true);\n  cert.siginfo.algorithmOid = forge.asn1.derToOid(capture.certinfoSignatureOid);\n  cert.siginfo.parameters = _readSignatureParameters(cert.siginfo.algorithmOid,\n    capture.certinfoSignatureParams, false);\n  cert.signature = capture.certSignature;\n\n  var validity = [];\n  if(capture.certValidity1UTCTime !== undefined) {\n    validity.push(asn1.utcTimeToDate(capture.certValidity1UTCTime));\n  }\n  if(capture.certValidity2GeneralizedTime !== undefined) {\n    validity.push(asn1.generalizedTimeToDate(\n      capture.certValidity2GeneralizedTime));\n  }\n  if(capture.certValidity3UTCTime !== undefined) {\n    validity.push(asn1.utcTimeToDate(capture.certValidity3UTCTime));\n  }\n  if(capture.certValidity4GeneralizedTime !== undefined) {\n    validity.push(asn1.generalizedTimeToDate(\n      capture.certValidity4GeneralizedTime));\n  }\n  if(validity.length > 2) {\n    throw new Error('Cannot read notBefore/notAfter validity times; more ' +\n      'than two times were provided in the certificate.');\n  }\n  if(validity.length < 2) {\n    throw new Error('Cannot read notBefore/notAfter validity times; they ' +\n      'were not provided as either UTCTime or GeneralizedTime.');\n  }\n  cert.validity.notBefore = validity[0];\n  cert.validity.notAfter = validity[1];\n\n  // keep TBSCertificate to preserve signature when exporting\n  cert.tbsCertificate = capture.tbsCertificate;\n\n  if(computeHash) {\n    // create digest for OID signature type\n    cert.md = _createSignatureDigest({\n      signatureOid: cert.signatureOid,\n      type: 'certificate'\n    });\n\n    // produce DER formatted TBSCertificate and digest it\n    var bytes = asn1.toDer(cert.tbsCertificate);\n    cert.md.update(bytes.getBytes());\n  }\n\n  // handle issuer, build issuer message digest\n  var imd = forge.md.sha1.create();\n  var ibytes = asn1.toDer(capture.certIssuer);\n  imd.update(ibytes.getBytes());\n  cert.issuer.getField = function(sn) {\n    return _getAttribute(cert.issuer, sn);\n  };\n  cert.issuer.addField = function(attr) {\n    _fillMissingFields([attr]);\n    cert.issuer.attributes.push(attr);\n  };\n  cert.issuer.attributes = pki.RDNAttributesAsArray(capture.certIssuer);\n  if(capture.certIssuerUniqueId) {\n    cert.issuer.uniqueId = capture.certIssuerUniqueId;\n  }\n  cert.issuer.hash = imd.digest().toHex();\n\n  // handle subject, build subject message digest\n  var smd = forge.md.sha1.create();\n  var sbytes = asn1.toDer(capture.certSubject);\n  smd.update(sbytes.getBytes());\n  cert.subject.getField = function(sn) {\n    return _getAttribute(cert.subject, sn);\n  };\n  cert.subject.addField = function(attr) {\n    _fillMissingFields([attr]);\n    cert.subject.attributes.push(attr);\n  };\n  cert.subject.attributes = pki.RDNAttributesAsArray(capture.certSubject);\n  if(capture.certSubjectUniqueId) {\n    cert.subject.uniqueId = capture.certSubjectUniqueId;\n  }\n  cert.subject.hash = smd.digest().toHex();\n\n  // handle extensions\n  if(capture.certExtensions) {\n    cert.extensions = pki.certificateExtensionsFromAsn1(capture.certExtensions);\n  } else {\n    cert.extensions = [];\n  }\n\n  // convert RSA public key from ASN.1\n  cert.publicKey = pki.publicKeyFromAsn1(capture.subjectPublicKeyInfo);\n\n  return cert;\n};\n\n/**\n * Converts an ASN.1 extensions object (with extension sequences as its\n * values) into an array of extension objects with types and values.\n *\n * Supported extensions:\n *\n * id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }\n * KeyUsage ::= BIT STRING {\n *   digitalSignature        (0),\n *   nonRepudiation          (1),\n *   keyEncipherment         (2),\n *   dataEncipherment        (3),\n *   keyAgreement            (4),\n *   keyCertSign             (5),\n *   cRLSign                 (6),\n *   encipherOnly            (7),\n *   decipherOnly            (8)\n * }\n *\n * id-ce-basicConstraints OBJECT IDENTIFIER ::=  { id-ce 19 }\n * BasicConstraints ::= SEQUENCE {\n *   cA                      BOOLEAN DEFAULT FALSE,\n *   pathLenConstraint       INTEGER (0..MAX) OPTIONAL\n * }\n *\n * subjectAltName EXTENSION ::= {\n *   SYNTAX GeneralNames\n *   IDENTIFIED BY id-ce-subjectAltName\n * }\n *\n * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName\n *\n * GeneralName ::= CHOICE {\n *   otherName      [0] INSTANCE OF OTHER-NAME,\n *   rfc822Name     [1] IA5String,\n *   dNSName        [2] IA5String,\n *   x400Address    [3] ORAddress,\n *   directoryName  [4] Name,\n *   ediPartyName   [5] EDIPartyName,\n *   uniformResourceIdentifier [6] IA5String,\n *   IPAddress      [7] OCTET STRING,\n *   registeredID   [8] OBJECT IDENTIFIER\n * }\n *\n * OTHER-NAME ::= TYPE-IDENTIFIER\n *\n * EDIPartyName ::= SEQUENCE {\n *   nameAssigner [0] DirectoryString {ub-name} OPTIONAL,\n *   partyName    [1] DirectoryString {ub-name}\n * }\n *\n * @param exts the extensions ASN.1 with extension sequences to parse.\n *\n * @return the array.\n */\npki.certificateExtensionsFromAsn1 = function(exts) {\n  var rval = [];\n  for(var i = 0; i < exts.value.length; ++i) {\n    // get extension sequence\n    var extseq = exts.value[i];\n    for(var ei = 0; ei < extseq.value.length; ++ei) {\n      rval.push(pki.certificateExtensionFromAsn1(extseq.value[ei]));\n    }\n  }\n\n  return rval;\n};\n\n/**\n * Parses a single certificate extension from ASN.1.\n *\n * @param ext the extension in ASN.1 format.\n *\n * @return the parsed extension as an object.\n */\npki.certificateExtensionFromAsn1 = function(ext) {\n  // an extension has:\n  // [0] extnID      OBJECT IDENTIFIER\n  // [1] critical    BOOLEAN DEFAULT FALSE\n  // [2] extnValue   OCTET STRING\n  var e = {};\n  e.id = asn1.derToOid(ext.value[0].value);\n  e.critical = false;\n  if(ext.value[1].type === asn1.Type.BOOLEAN) {\n    e.critical = (ext.value[1].value.charCodeAt(0) !== 0x00);\n    e.value = ext.value[2].value;\n  } else {\n    e.value = ext.value[1].value;\n  }\n  // if the oid is known, get its name\n  if(e.id in oids) {\n    e.name = oids[e.id];\n\n    // handle key usage\n    if(e.name === 'keyUsage') {\n      // get value as BIT STRING\n      var ev = asn1.fromDer(e.value);\n      var b2 = 0x00;\n      var b3 = 0x00;\n      if(ev.value.length > 1) {\n        // skip first byte, just indicates unused bits which\n        // will be padded with 0s anyway\n        // get bytes with flag bits\n        b2 = ev.value.charCodeAt(1);\n        b3 = ev.value.length > 2 ? ev.value.charCodeAt(2) : 0;\n      }\n      // set flags\n      e.digitalSignature = (b2 & 0x80) === 0x80;\n      e.nonRepudiation = (b2 & 0x40) === 0x40;\n      e.keyEncipherment = (b2 & 0x20) === 0x20;\n      e.dataEncipherment = (b2 & 0x10) === 0x10;\n      e.keyAgreement = (b2 & 0x08) === 0x08;\n      e.keyCertSign = (b2 & 0x04) === 0x04;\n      e.cRLSign = (b2 & 0x02) === 0x02;\n      e.encipherOnly = (b2 & 0x01) === 0x01;\n      e.decipherOnly = (b3 & 0x80) === 0x80;\n    } else if(e.name === 'basicConstraints') {\n      // handle basic constraints\n      // get value as SEQUENCE\n      var ev = asn1.fromDer(e.value);\n      // get cA BOOLEAN flag (defaults to false)\n      if(ev.value.length > 0 && ev.value[0].type === asn1.Type.BOOLEAN) {\n        e.cA = (ev.value[0].value.charCodeAt(0) !== 0x00);\n      } else {\n        e.cA = false;\n      }\n      // get path length constraint\n      var value = null;\n      if(ev.value.length > 0 && ev.value[0].type === asn1.Type.INTEGER) {\n        value = ev.value[0].value;\n      } else if(ev.value.length > 1) {\n        value = ev.value[1].value;\n      }\n      if(value !== null) {\n        e.pathLenConstraint = asn1.derToInteger(value);\n      }\n    } else if(e.name === 'extKeyUsage') {\n      // handle extKeyUsage\n      // value is a SEQUENCE of OIDs\n      var ev = asn1.fromDer(e.value);\n      for(var vi = 0; vi < ev.value.length; ++vi) {\n        var oid = asn1.derToOid(ev.value[vi].value);\n        if(oid in oids) {\n          e[oids[oid]] = true;\n        } else {\n          e[oid] = true;\n        }\n      }\n    } else if(e.name === 'nsCertType') {\n      // handle nsCertType\n      // get value as BIT STRING\n      var ev = asn1.fromDer(e.value);\n      var b2 = 0x00;\n      if(ev.value.length > 1) {\n        // skip first byte, just indicates unused bits which\n        // will be padded with 0s anyway\n        // get bytes with flag bits\n        b2 = ev.value.charCodeAt(1);\n      }\n      // set flags\n      e.client = (b2 & 0x80) === 0x80;\n      e.server = (b2 & 0x40) === 0x40;\n      e.email = (b2 & 0x20) === 0x20;\n      e.objsign = (b2 & 0x10) === 0x10;\n      e.reserved = (b2 & 0x08) === 0x08;\n      e.sslCA = (b2 & 0x04) === 0x04;\n      e.emailCA = (b2 & 0x02) === 0x02;\n      e.objCA = (b2 & 0x01) === 0x01;\n    } else if(\n      e.name === 'subjectAltName' ||\n      e.name === 'issuerAltName') {\n      // handle subjectAltName/issuerAltName\n      e.altNames = [];\n\n      // ev is a SYNTAX SEQUENCE\n      var gn;\n      var ev = asn1.fromDer(e.value);\n      for(var n = 0; n < ev.value.length; ++n) {\n        // get GeneralName\n        gn = ev.value[n];\n\n        var altName = {\n          type: gn.type,\n          value: gn.value\n        };\n        e.altNames.push(altName);\n\n        // Note: Support for types 1,2,6,7,8\n        switch(gn.type) {\n          // rfc822Name\n          case 1:\n          // dNSName\n          case 2:\n          // uniformResourceIdentifier (URI)\n          case 6:\n            break;\n          // IPAddress\n          case 7:\n            // convert to IPv4/IPv6 string representation\n            altName.ip = forge.util.bytesToIP(gn.value);\n            break;\n          // registeredID\n          case 8:\n            altName.oid = asn1.derToOid(gn.value);\n            break;\n          default:\n            // unsupported\n        }\n      }\n    } else if(e.name === 'subjectKeyIdentifier') {\n      // value is an OCTETSTRING w/the hash of the key-type specific\n      // public key structure (eg: RSAPublicKey)\n      var ev = asn1.fromDer(e.value);\n      e.subjectKeyIdentifier = forge.util.bytesToHex(ev.value);\n    }\n  }\n  return e;\n};\n\n/**\n * Converts a PKCS#10 certification request (CSR) from an ASN.1 object.\n *\n * Note: If the certification request is to be verified then compute hash\n * should be set to true. There is currently no implementation for converting\n * a certificate back to ASN.1 so the CertificationRequestInfo part of the\n * ASN.1 object needs to be scanned before the csr object is created.\n *\n * @param obj the asn1 representation of a PKCS#10 certification request (CSR).\n * @param computeHash true to compute the hash for verification.\n *\n * @return the certification request (CSR).\n */\npki.certificationRequestFromAsn1 = function(obj, computeHash) {\n  // validate certification request and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, certificationRequestValidator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#10 certificate request. ' +\n      'ASN.1 object is not a PKCS#10 CertificationRequest.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // get oid\n  var oid = asn1.derToOid(capture.publicKeyOid);\n  if(oid !== pki.oids.rsaEncryption) {\n    throw new Error('Cannot read public key. OID is not RSA.');\n  }\n\n  // create certification request\n  var csr = pki.createCertificationRequest();\n  csr.version = capture.csrVersion ? capture.csrVersion.charCodeAt(0) : 0;\n  csr.signatureOid = forge.asn1.derToOid(capture.csrSignatureOid);\n  csr.signatureParameters = _readSignatureParameters(\n    csr.signatureOid, capture.csrSignatureParams, true);\n  csr.siginfo.algorithmOid = forge.asn1.derToOid(capture.csrSignatureOid);\n  csr.siginfo.parameters = _readSignatureParameters(\n    csr.siginfo.algorithmOid, capture.csrSignatureParams, false);\n  csr.signature = capture.csrSignature;\n\n  // keep CertificationRequestInfo to preserve signature when exporting\n  csr.certificationRequestInfo = capture.certificationRequestInfo;\n\n  if(computeHash) {\n    // create digest for OID signature type\n    csr.md = _createSignatureDigest({\n      signatureOid: csr.signatureOid,\n      type: 'certification request'\n    });\n\n    // produce DER formatted CertificationRequestInfo and digest it\n    var bytes = asn1.toDer(csr.certificationRequestInfo);\n    csr.md.update(bytes.getBytes());\n  }\n\n  // handle subject, build subject message digest\n  var smd = forge.md.sha1.create();\n  csr.subject.getField = function(sn) {\n    return _getAttribute(csr.subject, sn);\n  };\n  csr.subject.addField = function(attr) {\n    _fillMissingFields([attr]);\n    csr.subject.attributes.push(attr);\n  };\n  csr.subject.attributes = pki.RDNAttributesAsArray(\n    capture.certificationRequestInfoSubject, smd);\n  csr.subject.hash = smd.digest().toHex();\n\n  // convert RSA public key from ASN.1\n  csr.publicKey = pki.publicKeyFromAsn1(capture.subjectPublicKeyInfo);\n\n  // convert attributes from ASN.1\n  csr.getAttribute = function(sn) {\n    return _getAttribute(csr, sn);\n  };\n  csr.addAttribute = function(attr) {\n    _fillMissingFields([attr]);\n    csr.attributes.push(attr);\n  };\n  csr.attributes = pki.CRIAttributesAsArray(\n    capture.certificationRequestInfoAttributes || []);\n\n  return csr;\n};\n\n/**\n * Creates an empty certification request (a CSR or certificate signing\n * request). Once created, its public key and attributes can be set and then\n * it can be signed.\n *\n * @return the empty certification request.\n */\npki.createCertificationRequest = function() {\n  var csr = {};\n  csr.version = 0x00;\n  csr.signatureOid = null;\n  csr.signature = null;\n  csr.siginfo = {};\n  csr.siginfo.algorithmOid = null;\n\n  csr.subject = {};\n  csr.subject.getField = function(sn) {\n    return _getAttribute(csr.subject, sn);\n  };\n  csr.subject.addField = function(attr) {\n    _fillMissingFields([attr]);\n    csr.subject.attributes.push(attr);\n  };\n  csr.subject.attributes = [];\n  csr.subject.hash = null;\n\n  csr.publicKey = null;\n  csr.attributes = [];\n  csr.getAttribute = function(sn) {\n    return _getAttribute(csr, sn);\n  };\n  csr.addAttribute = function(attr) {\n    _fillMissingFields([attr]);\n    csr.attributes.push(attr);\n  };\n  csr.md = null;\n\n  /**\n   * Sets the subject of this certification request.\n   *\n   * @param attrs the array of subject attributes to use.\n   */\n  csr.setSubject = function(attrs) {\n    // set new attributes\n    _fillMissingFields(attrs);\n    csr.subject.attributes = attrs;\n    csr.subject.hash = null;\n  };\n\n  /**\n   * Sets the attributes of this certification request.\n   *\n   * @param attrs the array of attributes to use.\n   */\n  csr.setAttributes = function(attrs) {\n    // set new attributes\n    _fillMissingFields(attrs);\n    csr.attributes = attrs;\n  };\n\n  /**\n   * Signs this certification request using the given private key.\n   *\n   * @param key the private key to sign with.\n   * @param md the message digest object to use (defaults to forge.md.sha1).\n   */\n  csr.sign = function(key, md) {\n    // TODO: get signature OID from private key\n    csr.md = md || forge.md.sha1.create();\n    var algorithmOid = oids[csr.md.algorithm + 'WithRSAEncryption'];\n    if(!algorithmOid) {\n      var error = new Error('Could not compute certification request digest. ' +\n        'Unknown message digest algorithm OID.');\n      error.algorithm = csr.md.algorithm;\n      throw error;\n    }\n    csr.signatureOid = csr.siginfo.algorithmOid = algorithmOid;\n\n    // get CertificationRequestInfo, convert to DER\n    csr.certificationRequestInfo = pki.getCertificationRequestInfo(csr);\n    var bytes = asn1.toDer(csr.certificationRequestInfo);\n\n    // digest and sign\n    csr.md.update(bytes.getBytes());\n    csr.signature = key.sign(csr.md);\n  };\n\n  /**\n   * Attempts verify the signature on the passed certification request using\n   * its public key.\n   *\n   * A CSR that has been exported to a file in PEM format can be verified using\n   * OpenSSL using this command:\n   *\n   * openssl req -in <the-csr-pem-file> -verify -noout -text\n   *\n   * @return true if verified, false if not.\n   */\n  csr.verify = function() {\n    var rval = false;\n\n    var md = csr.md;\n    if(md === null) {\n      md = _createSignatureDigest({\n        signatureOid: csr.signatureOid,\n        type: 'certification request'\n      });\n\n      // produce DER formatted CertificationRequestInfo and digest it\n      var cri = csr.certificationRequestInfo ||\n        pki.getCertificationRequestInfo(csr);\n      var bytes = asn1.toDer(cri);\n      md.update(bytes.getBytes());\n    }\n\n    if(md !== null) {\n      rval = _verifySignature({\n        certificate: csr, md: md, signature: csr.signature\n      });\n    }\n\n    return rval;\n  };\n\n  return csr;\n};\n\n/**\n * Converts an X.509 subject or issuer to an ASN.1 RDNSequence.\n *\n * @param obj the subject or issuer (distinguished name).\n *\n * @return the ASN.1 RDNSequence.\n */\nfunction _dnToAsn1(obj) {\n  // create an empty RDNSequence\n  var rval = asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n\n  // iterate over attributes\n  var attr, set;\n  var attrs = obj.attributes;\n  for(var i = 0; i < attrs.length; ++i) {\n    attr = attrs[i];\n    var value = attr.value;\n\n    // reuse tag class for attribute value if available\n    var valueTagClass = asn1.Type.PRINTABLESTRING;\n    if('valueTagClass' in attr) {\n      valueTagClass = attr.valueTagClass;\n\n      if(valueTagClass === asn1.Type.UTF8) {\n        value = forge.util.encodeUtf8(value);\n      }\n      // FIXME: handle more encodings\n    }\n\n    // create a RelativeDistinguishedName set\n    // each value in the set is an AttributeTypeAndValue first\n    // containing the type (an OID) and second the value\n    set = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // AttributeType\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(attr.type).getBytes()),\n        // AttributeValue\n        asn1.create(asn1.Class.UNIVERSAL, valueTagClass, false, value)\n      ])\n    ]);\n    rval.value.push(set);\n  }\n\n  return rval;\n}\n\n/**\n * Gets all printable attributes (typically of an issuer or subject) in a\n * simplified JSON format for display.\n *\n * @param attrs the attributes.\n *\n * @return the JSON for display.\n */\nfunction _getAttributesAsJson(attrs) {\n  var rval = {};\n  for(var i = 0; i < attrs.length; ++i) {\n    var attr = attrs[i];\n    if(attr.shortName && (\n      attr.valueTagClass === asn1.Type.UTF8 ||\n      attr.valueTagClass === asn1.Type.PRINTABLESTRING ||\n      attr.valueTagClass === asn1.Type.IA5STRING)) {\n      var value = attr.value;\n      if(attr.valueTagClass === asn1.Type.UTF8) {\n        value = forge.util.encodeUtf8(attr.value);\n      }\n      if(!(attr.shortName in rval)) {\n        rval[attr.shortName] = value;\n      } else if(forge.util.isArray(rval[attr.shortName])) {\n        rval[attr.shortName].push(value);\n      } else {\n        rval[attr.shortName] = [rval[attr.shortName], value];\n      }\n    }\n  }\n  return rval;\n}\n\n/**\n * Fills in missing fields in attributes.\n *\n * @param attrs the attributes to fill missing fields in.\n */\nfunction _fillMissingFields(attrs) {\n  var attr;\n  for(var i = 0; i < attrs.length; ++i) {\n    attr = attrs[i];\n\n    // populate missing name\n    if(typeof attr.name === 'undefined') {\n      if(attr.type && attr.type in pki.oids) {\n        attr.name = pki.oids[attr.type];\n      } else if(attr.shortName && attr.shortName in _shortNames) {\n        attr.name = pki.oids[_shortNames[attr.shortName]];\n      }\n    }\n\n    // populate missing type (OID)\n    if(typeof attr.type === 'undefined') {\n      if(attr.name && attr.name in pki.oids) {\n        attr.type = pki.oids[attr.name];\n      } else {\n        var error = new Error('Attribute type not specified.');\n        error.attribute = attr;\n        throw error;\n      }\n    }\n\n    // populate missing shortname\n    if(typeof attr.shortName === 'undefined') {\n      if(attr.name && attr.name in _shortNames) {\n        attr.shortName = _shortNames[attr.name];\n      }\n    }\n\n    // convert extensions to value\n    if(attr.type === oids.extensionRequest) {\n      attr.valueConstructed = true;\n      attr.valueTagClass = asn1.Type.SEQUENCE;\n      if(!attr.value && attr.extensions) {\n        attr.value = [];\n        for(var ei = 0; ei < attr.extensions.length; ++ei) {\n          attr.value.push(pki.certificateExtensionToAsn1(\n            _fillMissingExtensionFields(attr.extensions[ei])));\n        }\n      }\n    }\n\n    if(typeof attr.value === 'undefined') {\n      var error = new Error('Attribute value not specified.');\n      error.attribute = attr;\n      throw error;\n    }\n  }\n}\n\n/**\n * Fills in missing fields in certificate extensions.\n *\n * @param e the extension.\n * @param [options] the options to use.\n *          [cert] the certificate the extensions are for.\n *\n * @return the extension.\n */\nfunction _fillMissingExtensionFields(e, options) {\n  options = options || {};\n\n  // populate missing name\n  if(typeof e.name === 'undefined') {\n    if(e.id && e.id in pki.oids) {\n      e.name = pki.oids[e.id];\n    }\n  }\n\n  // populate missing id\n  if(typeof e.id === 'undefined') {\n    if(e.name && e.name in pki.oids) {\n      e.id = pki.oids[e.name];\n    } else {\n      var error = new Error('Extension ID not specified.');\n      error.extension = e;\n      throw error;\n    }\n  }\n\n  if(typeof e.value !== 'undefined') {\n    return e;\n  }\n\n  // handle missing value:\n\n  // value is a BIT STRING\n  if(e.name === 'keyUsage') {\n    // build flags\n    var unused = 0;\n    var b2 = 0x00;\n    var b3 = 0x00;\n    if(e.digitalSignature) {\n      b2 |= 0x80;\n      unused = 7;\n    }\n    if(e.nonRepudiation) {\n      b2 |= 0x40;\n      unused = 6;\n    }\n    if(e.keyEncipherment) {\n      b2 |= 0x20;\n      unused = 5;\n    }\n    if(e.dataEncipherment) {\n      b2 |= 0x10;\n      unused = 4;\n    }\n    if(e.keyAgreement) {\n      b2 |= 0x08;\n      unused = 3;\n    }\n    if(e.keyCertSign) {\n      b2 |= 0x04;\n      unused = 2;\n    }\n    if(e.cRLSign) {\n      b2 |= 0x02;\n      unused = 1;\n    }\n    if(e.encipherOnly) {\n      b2 |= 0x01;\n      unused = 0;\n    }\n    if(e.decipherOnly) {\n      b3 |= 0x80;\n      unused = 7;\n    }\n\n    // create bit string\n    var value = String.fromCharCode(unused);\n    if(b3 !== 0) {\n      value += String.fromCharCode(b2) + String.fromCharCode(b3);\n    } else if(b2 !== 0) {\n      value += String.fromCharCode(b2);\n    }\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, value);\n  } else if(e.name === 'basicConstraints') {\n    // basicConstraints is a SEQUENCE\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n    // cA BOOLEAN flag defaults to false\n    if(e.cA) {\n      e.value.value.push(asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.BOOLEAN, false,\n        String.fromCharCode(0xFF)));\n    }\n    if('pathLenConstraint' in e) {\n      e.value.value.push(asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        asn1.integerToDer(e.pathLenConstraint).getBytes()));\n    }\n  } else if(e.name === 'extKeyUsage') {\n    // extKeyUsage is a SEQUENCE of OIDs\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n    var seq = e.value.value;\n    for(var key in e) {\n      if(e[key] !== true) {\n        continue;\n      }\n      // key is name in OID map\n      if(key in oids) {\n        seq.push(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID,\n          false, asn1.oidToDer(oids[key]).getBytes()));\n      } else if(key.indexOf('.') !== -1) {\n        // assume key is an OID\n        seq.push(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID,\n          false, asn1.oidToDer(key).getBytes()));\n      }\n    }\n  } else if(e.name === 'nsCertType') {\n    // nsCertType is a BIT STRING\n    // build flags\n    var unused = 0;\n    var b2 = 0x00;\n\n    if(e.client) {\n      b2 |= 0x80;\n      unused = 7;\n    }\n    if(e.server) {\n      b2 |= 0x40;\n      unused = 6;\n    }\n    if(e.email) {\n      b2 |= 0x20;\n      unused = 5;\n    }\n    if(e.objsign) {\n      b2 |= 0x10;\n      unused = 4;\n    }\n    if(e.reserved) {\n      b2 |= 0x08;\n      unused = 3;\n    }\n    if(e.sslCA) {\n      b2 |= 0x04;\n      unused = 2;\n    }\n    if(e.emailCA) {\n      b2 |= 0x02;\n      unused = 1;\n    }\n    if(e.objCA) {\n      b2 |= 0x01;\n      unused = 0;\n    }\n\n    // create bit string\n    var value = String.fromCharCode(unused);\n    if(b2 !== 0) {\n      value += String.fromCharCode(b2);\n    }\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, value);\n  } else if(e.name === 'subjectAltName' || e.name === 'issuerAltName') {\n    // SYNTAX SEQUENCE\n    e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n\n    var altName;\n    for(var n = 0; n < e.altNames.length; ++n) {\n      altName = e.altNames[n];\n      var value = altName.value;\n      // handle IP\n      if(altName.type === 7 && altName.ip) {\n        value = forge.util.bytesFromIP(altName.ip);\n        if(value === null) {\n          var error = new Error(\n            'Extension \"ip\" value is not a valid IPv4 or IPv6 address.');\n          error.extension = e;\n          throw error;\n        }\n      } else if(altName.type === 8) {\n        // handle OID\n        if(altName.oid) {\n          value = asn1.oidToDer(asn1.oidToDer(altName.oid));\n        } else {\n          // deprecated ... convert value to OID\n          value = asn1.oidToDer(value);\n        }\n      }\n      e.value.value.push(asn1.create(\n        asn1.Class.CONTEXT_SPECIFIC, altName.type, false,\n        value));\n    }\n  } else if(e.name === 'nsComment' && options.cert) {\n    // sanity check value is ASCII (req'd) and not too big\n    if(!(/^[\\x00-\\x7F]*$/.test(e.comment)) ||\n      (e.comment.length < 1) || (e.comment.length > 128)) {\n      throw new Error('Invalid \"nsComment\" content.');\n    }\n    // IA5STRING opaque comment\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.IA5STRING, false, e.comment);\n  } else if(e.name === 'subjectKeyIdentifier' && options.cert) {\n    var ski = options.cert.generateSubjectKeyIdentifier();\n    e.subjectKeyIdentifier = ski.toHex();\n    // OCTETSTRING w/digest\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, ski.getBytes());\n  } else if(e.name === 'authorityKeyIdentifier' && options.cert) {\n    // SYNTAX SEQUENCE\n    e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n    var seq = e.value.value;\n\n    if(e.keyIdentifier) {\n      var keyIdentifier = (e.keyIdentifier === true ?\n        options.cert.generateSubjectKeyIdentifier().getBytes() :\n        e.keyIdentifier);\n      seq.push(\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, false, keyIdentifier));\n    }\n\n    if(e.authorityCertIssuer) {\n      var authorityCertIssuer = [\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 4, true, [\n          _dnToAsn1(e.authorityCertIssuer === true ?\n            options.cert.issuer : e.authorityCertIssuer)\n        ])\n      ];\n      seq.push(\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, authorityCertIssuer));\n    }\n\n    if(e.serialNumber) {\n      var serialNumber = forge.util.hexToBytes(e.serialNumber === true ?\n        options.cert.serialNumber : e.serialNumber);\n      seq.push(\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, false, serialNumber));\n    }\n  } else if(e.name === 'cRLDistributionPoints') {\n    e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n    var seq = e.value.value;\n\n    // Create sub SEQUENCE of DistributionPointName\n    var subSeq = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n\n    // Create fullName CHOICE\n    var fullNameGeneralNames = asn1.create(\n      asn1.Class.CONTEXT_SPECIFIC, 0, true, []);\n    var altName;\n    for(var n = 0; n < e.altNames.length; ++n) {\n      altName = e.altNames[n];\n      var value = altName.value;\n      // handle IP\n      if(altName.type === 7 && altName.ip) {\n        value = forge.util.bytesFromIP(altName.ip);\n        if(value === null) {\n          var error = new Error(\n            'Extension \"ip\" value is not a valid IPv4 or IPv6 address.');\n          error.extension = e;\n          throw error;\n        }\n      } else if(altName.type === 8) {\n        // handle OID\n        if(altName.oid) {\n          value = asn1.oidToDer(asn1.oidToDer(altName.oid));\n        } else {\n          // deprecated ... convert value to OID\n          value = asn1.oidToDer(value);\n        }\n      }\n      fullNameGeneralNames.value.push(asn1.create(\n        asn1.Class.CONTEXT_SPECIFIC, altName.type, false,\n        value));\n    }\n\n    // Add to the parent SEQUENCE\n    subSeq.value.push(asn1.create(\n      asn1.Class.CONTEXT_SPECIFIC, 0, true, [fullNameGeneralNames]));\n    seq.push(subSeq);\n  }\n\n  // ensure value has been defined by now\n  if(typeof e.value === 'undefined') {\n    var error = new Error('Extension value not specified.');\n    error.extension = e;\n    throw error;\n  }\n\n  return e;\n}\n\n/**\n * Convert signature parameters object to ASN.1\n *\n * @param {String} oid Signature algorithm OID\n * @param params The signature parametrs object\n * @return ASN.1 object representing signature parameters\n */\nfunction _signatureParametersToAsn1(oid, params) {\n  switch(oid) {\n    case oids['RSASSA-PSS']:\n      var parts = [];\n\n      if(params.hash.algorithmOid !== undefined) {\n        parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n              asn1.oidToDer(params.hash.algorithmOid).getBytes()),\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n          ])\n        ]));\n      }\n\n      if(params.mgf.algorithmOid !== undefined) {\n        parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n              asn1.oidToDer(params.mgf.algorithmOid).getBytes()),\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n              asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n                asn1.oidToDer(params.mgf.hash.algorithmOid).getBytes()),\n              asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n            ])\n          ])\n        ]));\n      }\n\n      if(params.saltLength !== undefined) {\n        parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n            asn1.integerToDer(params.saltLength).getBytes())\n        ]));\n      }\n\n      return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, parts);\n\n    default:\n      return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '');\n  }\n}\n\n/**\n * Converts a certification request's attributes to an ASN.1 set of\n * CRIAttributes.\n *\n * @param csr certification request.\n *\n * @return the ASN.1 set of CRIAttributes.\n */\nfunction _CRIAttributesToAsn1(csr) {\n  // create an empty context-specific container\n  var rval = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, []);\n\n  // no attributes, return empty container\n  if(csr.attributes.length === 0) {\n    return rval;\n  }\n\n  // each attribute has a sequence with a type and a set of values\n  var attrs = csr.attributes;\n  for(var i = 0; i < attrs.length; ++i) {\n    var attr = attrs[i];\n    var value = attr.value;\n\n    // reuse tag class for attribute value if available\n    var valueTagClass = asn1.Type.UTF8;\n    if('valueTagClass' in attr) {\n      valueTagClass = attr.valueTagClass;\n    }\n    if(valueTagClass === asn1.Type.UTF8) {\n      value = forge.util.encodeUtf8(value);\n    }\n    var valueConstructed = false;\n    if('valueConstructed' in attr) {\n      valueConstructed = attr.valueConstructed;\n    }\n    // FIXME: handle more encodings\n\n    // create a RelativeDistinguishedName set\n    // each value in the set is an AttributeTypeAndValue first\n    // containing the type (an OID) and second the value\n    var seq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // AttributeType\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(attr.type).getBytes()),\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [\n        // AttributeValue\n        asn1.create(\n          asn1.Class.UNIVERSAL, valueTagClass, valueConstructed, value)\n      ])\n    ]);\n    rval.value.push(seq);\n  }\n\n  return rval;\n}\n\nvar jan_1_1950 = new Date('1950-01-01T00:00:00Z');\nvar jan_1_2050 = new Date('2050-01-01T00:00:00Z');\n\n/**\n * Converts a Date object to ASN.1\n * Handles the different format before and after 1st January 2050\n *\n * @param date date object.\n *\n * @return the ASN.1 object representing the date.\n */\nfunction _dateToAsn1(date) {\n  if(date >= jan_1_1950 && date < jan_1_2050) {\n    return asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.UTCTIME, false,\n      asn1.dateToUtcTime(date));\n  } else {\n    return asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.GENERALIZEDTIME, false,\n      asn1.dateToGeneralizedTime(date));\n  }\n}\n\n/**\n * Gets the ASN.1 TBSCertificate part of an X.509v3 certificate.\n *\n * @param cert the certificate.\n *\n * @return the asn1 TBSCertificate.\n */\npki.getTBSCertificate = function(cert) {\n  // TBSCertificate\n  var notBefore = _dateToAsn1(cert.validity.notBefore);\n  var notAfter = _dateToAsn1(cert.validity.notAfter);\n  var tbs = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version\n    asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n      // integer\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        asn1.integerToDer(cert.version).getBytes())\n    ]),\n    // serialNumber\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      forge.util.hexToBytes(cert.serialNumber)),\n    // signature\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(cert.siginfo.algorithmOid).getBytes()),\n      // parameters\n      _signatureParametersToAsn1(\n        cert.siginfo.algorithmOid, cert.siginfo.parameters)\n    ]),\n    // issuer\n    _dnToAsn1(cert.issuer),\n    // validity\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      notBefore,\n      notAfter\n    ]),\n    // subject\n    _dnToAsn1(cert.subject),\n    // SubjectPublicKeyInfo\n    pki.publicKeyToAsn1(cert.publicKey)\n  ]);\n\n  if(cert.issuer.uniqueId) {\n    // issuerUniqueID (optional)\n    tbs.value.push(\n      asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, [\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,\n          // TODO: support arbitrary bit length ids\n          String.fromCharCode(0x00) +\n          cert.issuer.uniqueId\n        )\n      ])\n    );\n  }\n  if(cert.subject.uniqueId) {\n    // subjectUniqueID (optional)\n    tbs.value.push(\n      asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, true, [\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,\n          // TODO: support arbitrary bit length ids\n          String.fromCharCode(0x00) +\n          cert.subject.uniqueId\n        )\n      ])\n    );\n  }\n\n  if(cert.extensions.length > 0) {\n    // extensions (optional)\n    tbs.value.push(pki.certificateExtensionsToAsn1(cert.extensions));\n  }\n\n  return tbs;\n};\n\n/**\n * Gets the ASN.1 CertificationRequestInfo part of a\n * PKCS#10 CertificationRequest.\n *\n * @param csr the certification request.\n *\n * @return the asn1 CertificationRequestInfo.\n */\npki.getCertificationRequestInfo = function(csr) {\n  // CertificationRequestInfo\n  var cri = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(csr.version).getBytes()),\n    // subject\n    _dnToAsn1(csr.subject),\n    // SubjectPublicKeyInfo\n    pki.publicKeyToAsn1(csr.publicKey),\n    // attributes\n    _CRIAttributesToAsn1(csr)\n  ]);\n\n  return cri;\n};\n\n/**\n * Converts a DistinguishedName (subject or issuer) to an ASN.1 object.\n *\n * @param dn the DistinguishedName.\n *\n * @return the asn1 representation of a DistinguishedName.\n */\npki.distinguishedNameToAsn1 = function(dn) {\n  return _dnToAsn1(dn);\n};\n\n/**\n * Converts an X.509v3 RSA certificate to an ASN.1 object.\n *\n * @param cert the certificate.\n *\n * @return the asn1 representation of an X.509v3 RSA certificate.\n */\npki.certificateToAsn1 = function(cert) {\n  // prefer cached TBSCertificate over generating one\n  var tbsCertificate = cert.tbsCertificate || pki.getTBSCertificate(cert);\n\n  // Certificate\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // TBSCertificate\n    tbsCertificate,\n    // AlgorithmIdentifier (signature algorithm)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(cert.signatureOid).getBytes()),\n      // parameters\n      _signatureParametersToAsn1(cert.signatureOid, cert.signatureParameters)\n    ]),\n    // SignatureValue\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,\n      String.fromCharCode(0x00) + cert.signature)\n  ]);\n};\n\n/**\n * Converts X.509v3 certificate extensions to ASN.1.\n *\n * @param exts the extensions to convert.\n *\n * @return the extensions in ASN.1 format.\n */\npki.certificateExtensionsToAsn1 = function(exts) {\n  // create top-level extension container\n  var rval = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 3, true, []);\n\n  // create extension sequence (stores a sequence for each extension)\n  var seq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n  rval.value.push(seq);\n\n  for(var i = 0; i < exts.length; ++i) {\n    seq.value.push(pki.certificateExtensionToAsn1(exts[i]));\n  }\n\n  return rval;\n};\n\n/**\n * Converts a single certificate extension to ASN.1.\n *\n * @param ext the extension to convert.\n *\n * @return the extension in ASN.1 format.\n */\npki.certificateExtensionToAsn1 = function(ext) {\n  // create a sequence for each extension\n  var extseq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n\n  // extnID (OID)\n  extseq.value.push(asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n    asn1.oidToDer(ext.id).getBytes()));\n\n  // critical defaults to false\n  if(ext.critical) {\n    // critical BOOLEAN DEFAULT FALSE\n    extseq.value.push(asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.BOOLEAN, false,\n      String.fromCharCode(0xFF)));\n  }\n\n  var value = ext.value;\n  if(typeof ext.value !== 'string') {\n    // value is asn.1\n    value = asn1.toDer(value).getBytes();\n  }\n\n  // extnValue (OCTET STRING)\n  extseq.value.push(asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, value));\n\n  return extseq;\n};\n\n/**\n * Converts a PKCS#10 certification request to an ASN.1 object.\n *\n * @param csr the certification request.\n *\n * @return the asn1 representation of a certification request.\n */\npki.certificationRequestToAsn1 = function(csr) {\n  // prefer cached CertificationRequestInfo over generating one\n  var cri = csr.certificationRequestInfo ||\n    pki.getCertificationRequestInfo(csr);\n\n  // Certificate\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // CertificationRequestInfo\n    cri,\n    // AlgorithmIdentifier (signature algorithm)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(csr.signatureOid).getBytes()),\n      // parameters\n      _signatureParametersToAsn1(csr.signatureOid, csr.signatureParameters)\n    ]),\n    // signature\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,\n      String.fromCharCode(0x00) + csr.signature)\n  ]);\n};\n\n/**\n * Creates a CA store.\n *\n * @param certs an optional array of certificate objects or PEM-formatted\n *          certificate strings to add to the CA store.\n *\n * @return the CA store.\n */\npki.createCaStore = function(certs) {\n  // create CA store\n  var caStore = {\n    // stored certificates\n    certs: {}\n  };\n\n  /**\n   * Gets the certificate that issued the passed certificate or its\n   * 'parent'.\n   *\n   * @param cert the certificate to get the parent for.\n   *\n   * @return the parent certificate or null if none was found.\n   */\n  caStore.getIssuer = function(cert) {\n    var rval = getBySubject(cert.issuer);\n\n    // see if there are multiple matches\n    /*if(forge.util.isArray(rval)) {\n      // TODO: resolve multiple matches by checking\n      // authorityKey/subjectKey/issuerUniqueID/other identifiers, etc.\n      // FIXME: or alternatively do authority key mapping\n      // if possible (X.509v1 certs can't work?)\n      throw new Error('Resolving multiple issuer matches not implemented yet.');\n    }*/\n\n    return rval;\n  };\n\n  /**\n   * Adds a trusted certificate to the store.\n   *\n   * @param cert the certificate to add as a trusted certificate (either a\n   *          pki.certificate object or a PEM-formatted certificate).\n   */\n  caStore.addCertificate = function(cert) {\n    // convert from pem if necessary\n    if(typeof cert === 'string') {\n      cert = forge.pki.certificateFromPem(cert);\n    }\n\n    ensureSubjectHasHash(cert.subject);\n\n    if(!caStore.hasCertificate(cert)) { // avoid duplicate certificates in store\n      if(cert.subject.hash in caStore.certs) {\n        // subject hash already exists, append to array\n        var tmp = caStore.certs[cert.subject.hash];\n        if(!forge.util.isArray(tmp)) {\n          tmp = [tmp];\n        }\n        tmp.push(cert);\n        caStore.certs[cert.subject.hash] = tmp;\n      } else {\n        caStore.certs[cert.subject.hash] = cert;\n      }\n    }\n  };\n\n  /**\n   * Checks to see if the given certificate is in the store.\n   *\n   * @param cert the certificate to check (either a pki.certificate or a\n   *          PEM-formatted certificate).\n   *\n   * @return true if the certificate is in the store, false if not.\n   */\n  caStore.hasCertificate = function(cert) {\n    // convert from pem if necessary\n    if(typeof cert === 'string') {\n      cert = forge.pki.certificateFromPem(cert);\n    }\n\n    var match = getBySubject(cert.subject);\n    if(!match) {\n      return false;\n    }\n    if(!forge.util.isArray(match)) {\n      match = [match];\n    }\n    // compare DER-encoding of certificates\n    var der1 = asn1.toDer(pki.certificateToAsn1(cert)).getBytes();\n    for(var i = 0; i < match.length; ++i) {\n      var der2 = asn1.toDer(pki.certificateToAsn1(match[i])).getBytes();\n      if(der1 === der2) {\n        return true;\n      }\n    }\n    return false;\n  };\n\n  /**\n   * Lists all of the certificates kept in the store.\n   *\n   * @return an array of all of the pki.certificate objects in the store.\n   */\n  caStore.listAllCertificates = function() {\n    var certList = [];\n\n    for(var hash in caStore.certs) {\n      if(caStore.certs.hasOwnProperty(hash)) {\n        var value = caStore.certs[hash];\n        if(!forge.util.isArray(value)) {\n          certList.push(value);\n        } else {\n          for(var i = 0; i < value.length; ++i) {\n            certList.push(value[i]);\n          }\n        }\n      }\n    }\n\n    return certList;\n  };\n\n  /**\n   * Removes a certificate from the store.\n   *\n   * @param cert the certificate to remove (either a pki.certificate or a\n   *          PEM-formatted certificate).\n   *\n   * @return the certificate that was removed or null if the certificate\n   *           wasn't in store.\n   */\n  caStore.removeCertificate = function(cert) {\n    var result;\n\n    // convert from pem if necessary\n    if(typeof cert === 'string') {\n      cert = forge.pki.certificateFromPem(cert);\n    }\n    ensureSubjectHasHash(cert.subject);\n    if(!caStore.hasCertificate(cert)) {\n      return null;\n    }\n\n    var match = getBySubject(cert.subject);\n\n    if(!forge.util.isArray(match)) {\n      result = caStore.certs[cert.subject.hash];\n      delete caStore.certs[cert.subject.hash];\n      return result;\n    }\n\n    // compare DER-encoding of certificates\n    var der1 = asn1.toDer(pki.certificateToAsn1(cert)).getBytes();\n    for(var i = 0; i < match.length; ++i) {\n      var der2 = asn1.toDer(pki.certificateToAsn1(match[i])).getBytes();\n      if(der1 === der2) {\n        result = match[i];\n        match.splice(i, 1);\n      }\n    }\n    if(match.length === 0) {\n      delete caStore.certs[cert.subject.hash];\n    }\n\n    return result;\n  };\n\n  function getBySubject(subject) {\n    ensureSubjectHasHash(subject);\n    return caStore.certs[subject.hash] || null;\n  }\n\n  function ensureSubjectHasHash(subject) {\n    // produce subject hash if it doesn't exist\n    if(!subject.hash) {\n      var md = forge.md.sha1.create();\n      subject.attributes = pki.RDNAttributesAsArray(_dnToAsn1(subject), md);\n      subject.hash = md.digest().toHex();\n    }\n  }\n\n  // auto-add passed in certs\n  if(certs) {\n    // parse PEM-formatted certificates as necessary\n    for(var i = 0; i < certs.length; ++i) {\n      var cert = certs[i];\n      caStore.addCertificate(cert);\n    }\n  }\n\n  return caStore;\n};\n\n/**\n * Certificate verification errors, based on TLS.\n */\npki.certificateError = {\n  bad_certificate: 'forge.pki.BadCertificate',\n  unsupported_certificate: 'forge.pki.UnsupportedCertificate',\n  certificate_revoked: 'forge.pki.CertificateRevoked',\n  certificate_expired: 'forge.pki.CertificateExpired',\n  certificate_unknown: 'forge.pki.CertificateUnknown',\n  unknown_ca: 'forge.pki.UnknownCertificateAuthority'\n};\n\n/**\n * Verifies a certificate chain against the given Certificate Authority store\n * with an optional custom verify callback.\n *\n * @param caStore a certificate store to verify against.\n * @param chain the certificate chain to verify, with the root or highest\n *          authority at the end (an array of certificates).\n * @param options a callback to be called for every certificate in the chain or\n *                  an object with:\n *                  verify a callback to be called for every certificate in the\n *                    chain\n *                  validityCheckDate the date against which the certificate\n *                    validity period should be checked. Pass null to not check\n *                    the validity period. By default, the current date is used.\n *\n * The verify callback has the following signature:\n *\n * verified - Set to true if certificate was verified, otherwise the\n *   pki.certificateError for why the certificate failed.\n * depth - The current index in the chain, where 0 is the end point's cert.\n * certs - The certificate chain, *NOTE* an empty chain indicates an anonymous\n *   end point.\n *\n * The function returns true on success and on failure either the appropriate\n * pki.certificateError or an object with 'error' set to the appropriate\n * pki.certificateError and 'message' set to a custom error message.\n *\n * @return true if successful, error thrown if not.\n */\npki.verifyCertificateChain = function(caStore, chain, options) {\n  /* From: RFC3280 - Internet X.509 Public Key Infrastructure Certificate\n    Section 6: Certification Path Validation\n    See inline parentheticals related to this particular implementation.\n\n    The primary goal of path validation is to verify the binding between\n    a subject distinguished name or a subject alternative name and subject\n    public key, as represented in the end entity certificate, based on the\n    public key of the trust anchor. This requires obtaining a sequence of\n    certificates that support that binding. That sequence should be provided\n    in the passed 'chain'. The trust anchor should be in the given CA\n    store. The 'end entity' certificate is the certificate provided by the\n    end point (typically a server) and is the first in the chain.\n\n    To meet this goal, the path validation process verifies, among other\n    things, that a prospective certification path (a sequence of n\n    certificates or a 'chain') satisfies the following conditions:\n\n    (a) for all x in {1, ..., n-1}, the subject of certificate x is\n          the issuer of certificate x+1;\n\n    (b) certificate 1 is issued by the trust anchor;\n\n    (c) certificate n is the certificate to be validated; and\n\n    (d) for all x in {1, ..., n}, the certificate was valid at the\n          time in question.\n\n    Note that here 'n' is index 0 in the chain and 1 is the last certificate\n    in the chain and it must be signed by a certificate in the connection's\n    CA store.\n\n    The path validation process also determines the set of certificate\n    policies that are valid for this path, based on the certificate policies\n    extension, policy mapping extension, policy constraints extension, and\n    inhibit any-policy extension.\n\n    Note: Policy mapping extension not supported (Not Required).\n\n    Note: If the certificate has an unsupported critical extension, then it\n    must be rejected.\n\n    Note: A certificate is self-issued if the DNs that appear in the subject\n    and issuer fields are identical and are not empty.\n\n    The path validation algorithm assumes the following seven inputs are\n    provided to the path processing logic. What this specific implementation\n    will use is provided parenthetically:\n\n    (a) a prospective certification path of length n (the 'chain')\n    (b) the current date/time: ('now').\n    (c) user-initial-policy-set: A set of certificate policy identifiers\n          naming the policies that are acceptable to the certificate user.\n          The user-initial-policy-set contains the special value any-policy\n          if the user is not concerned about certificate policy\n          (Not implemented. Any policy is accepted).\n    (d) trust anchor information, describing a CA that serves as a trust\n          anchor for the certification path. The trust anchor information\n          includes:\n\n      (1)  the trusted issuer name,\n      (2)  the trusted public key algorithm,\n      (3)  the trusted public key, and\n      (4)  optionally, the trusted public key parameters associated\n             with the public key.\n\n      (Trust anchors are provided via certificates in the CA store).\n\n      The trust anchor information may be provided to the path processing\n      procedure in the form of a self-signed certificate. The trusted anchor\n      information is trusted because it was delivered to the path processing\n      procedure by some trustworthy out-of-band procedure. If the trusted\n      public key algorithm requires parameters, then the parameters are\n      provided along with the trusted public key (No parameters used in this\n      implementation).\n\n    (e) initial-policy-mapping-inhibit, which indicates if policy mapping is\n          allowed in the certification path.\n          (Not implemented, no policy checking)\n\n    (f) initial-explicit-policy, which indicates if the path must be valid\n          for at least one of the certificate policies in the user-initial-\n          policy-set.\n          (Not implemented, no policy checking)\n\n    (g) initial-any-policy-inhibit, which indicates whether the\n          anyPolicy OID should be processed if it is included in a\n          certificate.\n          (Not implemented, so any policy is valid provided that it is\n          not marked as critical) */\n\n  /* Basic Path Processing:\n\n    For each certificate in the 'chain', the following is checked:\n\n    1. The certificate validity period includes the current time.\n    2. The certificate was signed by its parent (where the parent is either\n       the next in the chain or from the CA store). Allow processing to\n       continue to the next step if no parent is found but the certificate is\n       in the CA store.\n    3. TODO: The certificate has not been revoked.\n    4. The certificate issuer name matches the parent's subject name.\n    5. TODO: If the certificate is self-issued and not the final certificate\n       in the chain, skip this step, otherwise verify that the subject name\n       is within one of the permitted subtrees of X.500 distinguished names\n       and that each of the alternative names in the subjectAltName extension\n       (critical or non-critical) is within one of the permitted subtrees for\n       that name type.\n    6. TODO: If the certificate is self-issued and not the final certificate\n       in the chain, skip this step, otherwise verify that the subject name\n       is not within one of the excluded subtrees for X.500 distinguished\n       names and none of the subjectAltName extension names are excluded for\n       that name type.\n    7. The other steps in the algorithm for basic path processing involve\n       handling the policy extension which is not presently supported in this\n       implementation. Instead, if a critical policy extension is found, the\n       certificate is rejected as not supported.\n    8. If the certificate is not the first or if its the only certificate in\n       the chain (having no parent from the CA store or is self-signed) and it\n       has a critical key usage extension, verify that the keyCertSign bit is\n       set. If the key usage extension exists, verify that the basic\n       constraints extension exists. If the basic constraints extension exists,\n       verify that the cA flag is set. If pathLenConstraint is set, ensure that\n       the number of certificates that precede in the chain (come earlier\n       in the chain as implemented below), excluding the very first in the\n       chain (typically the end-entity one), isn't greater than the\n       pathLenConstraint. This constraint limits the number of intermediate\n       CAs that may appear below a CA before only end-entity certificates\n       may be issued. */\n\n  // if a verify callback is passed as the third parameter, package it within\n  // the options object. This is to support a legacy function signature that\n  // expected the verify callback as the third parameter.\n  if(typeof options === 'function') {\n    options = {verify: options};\n  }\n  options = options || {};\n\n  // copy cert chain references to another array to protect against changes\n  // in verify callback\n  chain = chain.slice(0);\n  var certs = chain.slice(0);\n\n  var validityCheckDate = options.validityCheckDate;\n  // if no validityCheckDate is specified, default to the current date. Make\n  // sure to maintain the value null because it indicates that the validity\n  // period should not be checked.\n  if(typeof validityCheckDate === 'undefined') {\n    validityCheckDate = new Date();\n  }\n\n  // verify each cert in the chain using its parent, where the parent\n  // is either the next in the chain or from the CA store\n  var first = true;\n  var error = null;\n  var depth = 0;\n  do {\n    var cert = chain.shift();\n    var parent = null;\n    var selfSigned = false;\n\n    if(validityCheckDate) {\n      // 1. check valid time\n      if(validityCheckDate < cert.validity.notBefore ||\n         validityCheckDate > cert.validity.notAfter) {\n        error = {\n          message: 'Certificate is not valid yet or has expired.',\n          error: pki.certificateError.certificate_expired,\n          notBefore: cert.validity.notBefore,\n          notAfter: cert.validity.notAfter,\n          // TODO: we might want to reconsider renaming 'now' to\n          // 'validityCheckDate' should this API be changed in the future.\n          now: validityCheckDate\n        };\n      }\n    }\n\n    // 2. verify with parent from chain or CA store\n    if(error === null) {\n      parent = chain[0] || caStore.getIssuer(cert);\n      if(parent === null) {\n        // check for self-signed cert\n        if(cert.isIssuer(cert)) {\n          selfSigned = true;\n          parent = cert;\n        }\n      }\n\n      if(parent) {\n        // FIXME: current CA store implementation might have multiple\n        // certificates where the issuer can't be determined from the\n        // certificate (happens rarely with, eg: old certificates) so normalize\n        // by always putting parents into an array\n        // TODO: there's may be an extreme degenerate case currently uncovered\n        // where an old intermediate certificate seems to have a matching parent\n        // but none of the parents actually verify ... but the intermediate\n        // is in the CA and it should pass this check; needs investigation\n        var parents = parent;\n        if(!forge.util.isArray(parents)) {\n          parents = [parents];\n        }\n\n        // try to verify with each possible parent (typically only one)\n        var verified = false;\n        while(!verified && parents.length > 0) {\n          parent = parents.shift();\n          try {\n            verified = parent.verify(cert);\n          } catch(ex) {\n            // failure to verify, don't care why, try next one\n          }\n        }\n\n        if(!verified) {\n          error = {\n            message: 'Certificate signature is invalid.',\n            error: pki.certificateError.bad_certificate\n          };\n        }\n      }\n\n      if(error === null && (!parent || selfSigned) &&\n        !caStore.hasCertificate(cert)) {\n        // no parent issuer and certificate itself is not trusted\n        error = {\n          message: 'Certificate is not trusted.',\n          error: pki.certificateError.unknown_ca\n        };\n      }\n    }\n\n    // TODO: 3. check revoked\n\n    // 4. check for matching issuer/subject\n    if(error === null && parent && !cert.isIssuer(parent)) {\n      // parent is not issuer\n      error = {\n        message: 'Certificate issuer is invalid.',\n        error: pki.certificateError.bad_certificate\n      };\n    }\n\n    // 5. TODO: check names with permitted names tree\n\n    // 6. TODO: check names against excluded names tree\n\n    // 7. check for unsupported critical extensions\n    if(error === null) {\n      // supported extensions\n      var se = {\n        keyUsage: true,\n        basicConstraints: true\n      };\n      for(var i = 0; error === null && i < cert.extensions.length; ++i) {\n        var ext = cert.extensions[i];\n        if(ext.critical && !(ext.name in se)) {\n          error = {\n            message:\n              'Certificate has an unsupported critical extension.',\n            error: pki.certificateError.unsupported_certificate\n          };\n        }\n      }\n    }\n\n    // 8. check for CA if cert is not first or is the only certificate\n    // remaining in chain with no parent or is self-signed\n    if(error === null &&\n      (!first || (chain.length === 0 && (!parent || selfSigned)))) {\n      // first check keyUsage extension and then basic constraints\n      var bcExt = cert.getExtension('basicConstraints');\n      var keyUsageExt = cert.getExtension('keyUsage');\n      if(keyUsageExt !== null) {\n        // keyCertSign must be true and there must be a basic\n        // constraints extension\n        if(!keyUsageExt.keyCertSign || bcExt === null) {\n          // bad certificate\n          error = {\n            message:\n              'Certificate keyUsage or basicConstraints conflict ' +\n              'or indicate that the certificate is not a CA. ' +\n              'If the certificate is the only one in the chain or ' +\n              'isn\\'t the first then the certificate must be a ' +\n              'valid CA.',\n            error: pki.certificateError.bad_certificate\n          };\n        }\n      }\n      // basic constraints cA flag must be set\n      if(error === null && bcExt !== null && !bcExt.cA) {\n        // bad certificate\n        error = {\n          message:\n            'Certificate basicConstraints indicates the certificate ' +\n            'is not a CA.',\n          error: pki.certificateError.bad_certificate\n        };\n      }\n      // if error is not null and keyUsage is available, then we know it\n      // has keyCertSign and there is a basic constraints extension too,\n      // which means we can check pathLenConstraint (if it exists)\n      if(error === null && keyUsageExt !== null &&\n        'pathLenConstraint' in bcExt) {\n        // pathLen is the maximum # of intermediate CA certs that can be\n        // found between the current certificate and the end-entity (depth 0)\n        // certificate; this number does not include the end-entity (depth 0,\n        // last in the chain) even if it happens to be a CA certificate itself\n        var pathLen = depth - 1;\n        if(pathLen > bcExt.pathLenConstraint) {\n          // pathLenConstraint violated, bad certificate\n          error = {\n            message:\n              'Certificate basicConstraints pathLenConstraint violated.',\n            error: pki.certificateError.bad_certificate\n          };\n        }\n      }\n    }\n\n    // call application callback\n    var vfd = (error === null) ? true : error.error;\n    var ret = options.verify ? options.verify(vfd, depth, certs) : vfd;\n    if(ret === true) {\n      // clear any set error\n      error = null;\n    } else {\n      // if passed basic tests, set default message and alert\n      if(vfd === true) {\n        error = {\n          message: 'The application rejected the certificate.',\n          error: pki.certificateError.bad_certificate\n        };\n      }\n\n      // check for custom error info\n      if(ret || ret === 0) {\n        // set custom message and error\n        if(typeof ret === 'object' && !forge.util.isArray(ret)) {\n          if(ret.message) {\n            error.message = ret.message;\n          }\n          if(ret.error) {\n            error.error = ret.error;\n          }\n        } else if(typeof ret === 'string') {\n          // set custom error\n          error.error = ret;\n        }\n      }\n\n      // throw error\n      throw error;\n    }\n\n    // no longer first cert in chain\n    first = false;\n    ++depth;\n  } while(chain.length > 0);\n\n  return true;\n};\n","/**\n * Javascript implementation of PKCS#12.\n *\n * @author Dave Longley\n * @author Stefan Siegl <stesie@brokenpipe.de>\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n *\n * The ASN.1 representation of PKCS#12 is as follows\n * (see ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12-tc1.pdf for details)\n *\n * PFX ::= SEQUENCE {\n *   version  INTEGER {v3(3)}(v3,...),\n *   authSafe ContentInfo,\n *   macData  MacData OPTIONAL\n * }\n *\n * MacData ::= SEQUENCE {\n *   mac DigestInfo,\n *   macSalt OCTET STRING,\n *   iterations INTEGER DEFAULT 1\n * }\n * Note: The iterations default is for historical reasons and its use is\n * deprecated. A higher value, like 1024, is recommended.\n *\n * DigestInfo is defined in PKCS#7 as follows:\n *\n * DigestInfo ::= SEQUENCE {\n *   digestAlgorithm DigestAlgorithmIdentifier,\n *   digest Digest\n * }\n *\n * DigestAlgorithmIdentifier ::= AlgorithmIdentifier\n *\n * The AlgorithmIdentifier contains an Object Identifier (OID) and parameters\n * for the algorithm, if any. In the case of SHA1 there is none.\n *\n * AlgorithmIdentifer ::= SEQUENCE {\n *    algorithm OBJECT IDENTIFIER,\n *    parameters ANY DEFINED BY algorithm OPTIONAL\n * }\n *\n * Digest ::= OCTET STRING\n *\n *\n * ContentInfo ::= SEQUENCE {\n *   contentType ContentType,\n *   content     [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL\n * }\n *\n * ContentType ::= OBJECT IDENTIFIER\n *\n * AuthenticatedSafe ::= SEQUENCE OF ContentInfo\n * -- Data if unencrypted\n * -- EncryptedData if password-encrypted\n * -- EnvelopedData if public key-encrypted\n *\n *\n * SafeContents ::= SEQUENCE OF SafeBag\n *\n * SafeBag ::= SEQUENCE {\n *   bagId     BAG-TYPE.&id ({PKCS12BagSet})\n *   bagValue  [0] EXPLICIT BAG-TYPE.&Type({PKCS12BagSet}{@bagId}),\n *   bagAttributes SET OF PKCS12Attribute OPTIONAL\n * }\n *\n * PKCS12Attribute ::= SEQUENCE {\n *   attrId ATTRIBUTE.&id ({PKCS12AttrSet}),\n *   attrValues SET OF ATTRIBUTE.&Type ({PKCS12AttrSet}{@attrId})\n * } -- This type is compatible with the X.500 type 'Attribute'\n *\n * PKCS12AttrSet ATTRIBUTE ::= {\n *   friendlyName | -- from PKCS #9\n *   localKeyId, -- from PKCS #9\n *   ... -- Other attributes are allowed\n * }\n *\n * CertBag ::= SEQUENCE {\n *   certId    BAG-TYPE.&id   ({CertTypes}),\n *   certValue [0] EXPLICIT BAG-TYPE.&Type ({CertTypes}{@certId})\n * }\n *\n * x509Certificate BAG-TYPE ::= {OCTET STRING IDENTIFIED BY {certTypes 1}}\n *   -- DER-encoded X.509 certificate stored in OCTET STRING\n *\n * sdsiCertificate BAG-TYPE ::= {IA5String IDENTIFIED BY {certTypes 2}}\n * -- Base64-encoded SDSI certificate stored in IA5String\n *\n * CertTypes BAG-TYPE ::= {\n *   x509Certificate |\n *   sdsiCertificate,\n *   ... -- For future extensions\n * }\n */\nvar forge = require('./forge');\nrequire('./asn1');\nrequire('./hmac');\nrequire('./oids');\nrequire('./pkcs7asn1');\nrequire('./pbe');\nrequire('./random');\nrequire('./rsa');\nrequire('./sha1');\nrequire('./util');\nrequire('./x509');\n\n// shortcut for asn.1 & PKI API\nvar asn1 = forge.asn1;\nvar pki = forge.pki;\n\n// shortcut for PKCS#12 API\nvar p12 = module.exports = forge.pkcs12 = forge.pkcs12 || {};\n\nvar contentInfoValidator = {\n  name: 'ContentInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,  // a ContentInfo\n  constructed: true,\n  value: [{\n    name: 'ContentInfo.contentType',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'contentType'\n  }, {\n    name: 'ContentInfo.content',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    constructed: true,\n    captureAsn1: 'content'\n  }]\n};\n\nvar pfxValidator = {\n  name: 'PFX',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'PFX.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'version'\n  },\n  contentInfoValidator, {\n    name: 'PFX.macData',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    optional: true,\n    captureAsn1: 'mac',\n    value: [{\n      name: 'PFX.macData.mac',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,  // DigestInfo\n      constructed: true,\n      value: [{\n        name: 'PFX.macData.mac.digestAlgorithm',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.SEQUENCE,  // DigestAlgorithmIdentifier\n        constructed: true,\n        value: [{\n          name: 'PFX.macData.mac.digestAlgorithm.algorithm',\n          tagClass: asn1.Class.UNIVERSAL,\n          type: asn1.Type.OID,\n          constructed: false,\n          capture: 'macAlgorithm'\n        }, {\n          name: 'PFX.macData.mac.digestAlgorithm.parameters',\n          tagClass: asn1.Class.UNIVERSAL,\n          captureAsn1: 'macAlgorithmParameters'\n        }]\n      }, {\n        name: 'PFX.macData.mac.digest',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OCTETSTRING,\n        constructed: false,\n        capture: 'macDigest'\n      }]\n    }, {\n      name: 'PFX.macData.macSalt',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OCTETSTRING,\n      constructed: false,\n      capture: 'macSalt'\n    }, {\n      name: 'PFX.macData.iterations',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.INTEGER,\n      constructed: false,\n      optional: true,\n      capture: 'macIterations'\n    }]\n  }]\n};\n\nvar safeBagValidator = {\n  name: 'SafeBag',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'SafeBag.bagId',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'bagId'\n  }, {\n    name: 'SafeBag.bagValue',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    constructed: true,\n    captureAsn1: 'bagValue'\n  }, {\n    name: 'SafeBag.bagAttributes',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SET,\n    constructed: true,\n    optional: true,\n    capture: 'bagAttributes'\n  }]\n};\n\nvar attributeValidator = {\n  name: 'Attribute',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'Attribute.attrId',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'oid'\n  }, {\n    name: 'Attribute.attrValues',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SET,\n    constructed: true,\n    capture: 'values'\n  }]\n};\n\nvar certBagValidator = {\n  name: 'CertBag',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'CertBag.certId',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'certId'\n  }, {\n    name: 'CertBag.certValue',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    constructed: true,\n    /* So far we only support X.509 certificates (which are wrapped in\n       an OCTET STRING, hence hard code that here). */\n    value: [{\n      name: 'CertBag.certValue[0]',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Class.OCTETSTRING,\n      constructed: false,\n      capture: 'cert'\n    }]\n  }]\n};\n\n/**\n * Search SafeContents structure for bags with matching attributes.\n *\n * The search can optionally be narrowed by a certain bag type.\n *\n * @param safeContents the SafeContents structure to search in.\n * @param attrName the name of the attribute to compare against.\n * @param attrValue the attribute value to search for.\n * @param [bagType] bag type to narrow search by.\n *\n * @return an array of matching bags.\n */\nfunction _getBagsByAttribute(safeContents, attrName, attrValue, bagType) {\n  var result = [];\n\n  for(var i = 0; i < safeContents.length; i++) {\n    for(var j = 0; j < safeContents[i].safeBags.length; j++) {\n      var bag = safeContents[i].safeBags[j];\n      if(bagType !== undefined && bag.type !== bagType) {\n        continue;\n      }\n      // only filter by bag type, no attribute specified\n      if(attrName === null) {\n        result.push(bag);\n        continue;\n      }\n      if(bag.attributes[attrName] !== undefined &&\n        bag.attributes[attrName].indexOf(attrValue) >= 0) {\n        result.push(bag);\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Converts a PKCS#12 PFX in ASN.1 notation into a PFX object.\n *\n * @param obj The PKCS#12 PFX in ASN.1 notation.\n * @param strict true to use strict DER decoding, false not to (default: true).\n * @param {String} password Password to decrypt with (optional).\n *\n * @return PKCS#12 PFX object.\n */\np12.pkcs12FromAsn1 = function(obj, strict, password) {\n  // handle args\n  if(typeof strict === 'string') {\n    password = strict;\n    strict = true;\n  } else if(strict === undefined) {\n    strict = true;\n  }\n\n  // validate PFX and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, pfxValidator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#12 PFX. ' +\n      'ASN.1 object is not an PKCS#12 PFX.');\n    error.errors = error;\n    throw error;\n  }\n\n  var pfx = {\n    version: capture.version.charCodeAt(0),\n    safeContents: [],\n\n    /**\n     * Gets bags with matching attributes.\n     *\n     * @param filter the attributes to filter by:\n     *          [localKeyId] the localKeyId to search for.\n     *          [localKeyIdHex] the localKeyId in hex to search for.\n     *          [friendlyName] the friendly name to search for.\n     *          [bagType] bag type to narrow each attribute search by.\n     *\n     * @return a map of attribute type to an array of matching bags or, if no\n     *           attribute was given but a bag type, the map key will be the\n     *           bag type.\n     */\n    getBags: function(filter) {\n      var rval = {};\n\n      var localKeyId;\n      if('localKeyId' in filter) {\n        localKeyId = filter.localKeyId;\n      } else if('localKeyIdHex' in filter) {\n        localKeyId = forge.util.hexToBytes(filter.localKeyIdHex);\n      }\n\n      // filter on bagType only\n      if(localKeyId === undefined && !('friendlyName' in filter) &&\n        'bagType' in filter) {\n        rval[filter.bagType] = _getBagsByAttribute(\n          pfx.safeContents, null, null, filter.bagType);\n      }\n\n      if(localKeyId !== undefined) {\n        rval.localKeyId = _getBagsByAttribute(\n          pfx.safeContents, 'localKeyId',\n          localKeyId, filter.bagType);\n      }\n      if('friendlyName' in filter) {\n        rval.friendlyName = _getBagsByAttribute(\n          pfx.safeContents, 'friendlyName',\n          filter.friendlyName, filter.bagType);\n      }\n\n      return rval;\n    },\n\n    /**\n     * DEPRECATED: use getBags() instead.\n     *\n     * Get bags with matching friendlyName attribute.\n     *\n     * @param friendlyName the friendly name to search for.\n     * @param [bagType] bag type to narrow search by.\n     *\n     * @return an array of bags with matching friendlyName attribute.\n     */\n    getBagsByFriendlyName: function(friendlyName, bagType) {\n      return _getBagsByAttribute(\n        pfx.safeContents, 'friendlyName', friendlyName, bagType);\n    },\n\n    /**\n     * DEPRECATED: use getBags() instead.\n     *\n     * Get bags with matching localKeyId attribute.\n     *\n     * @param localKeyId the localKeyId to search for.\n     * @param [bagType] bag type to narrow search by.\n     *\n     * @return an array of bags with matching localKeyId attribute.\n     */\n    getBagsByLocalKeyId: function(localKeyId, bagType) {\n      return _getBagsByAttribute(\n        pfx.safeContents, 'localKeyId', localKeyId, bagType);\n    }\n  };\n\n  if(capture.version.charCodeAt(0) !== 3) {\n    var error = new Error('PKCS#12 PFX of version other than 3 not supported.');\n    error.version = capture.version.charCodeAt(0);\n    throw error;\n  }\n\n  if(asn1.derToOid(capture.contentType) !== pki.oids.data) {\n    var error = new Error('Only PKCS#12 PFX in password integrity mode supported.');\n    error.oid = asn1.derToOid(capture.contentType);\n    throw error;\n  }\n\n  var data = capture.content.value[0];\n  if(data.tagClass !== asn1.Class.UNIVERSAL ||\n     data.type !== asn1.Type.OCTETSTRING) {\n    throw new Error('PKCS#12 authSafe content data is not an OCTET STRING.');\n  }\n  data = _decodePkcs7Data(data);\n\n  // check for MAC\n  if(capture.mac) {\n    var md = null;\n    var macKeyBytes = 0;\n    var macAlgorithm = asn1.derToOid(capture.macAlgorithm);\n    switch(macAlgorithm) {\n    case pki.oids.sha1:\n      md = forge.md.sha1.create();\n      macKeyBytes = 20;\n      break;\n    case pki.oids.sha256:\n      md = forge.md.sha256.create();\n      macKeyBytes = 32;\n      break;\n    case pki.oids.sha384:\n      md = forge.md.sha384.create();\n      macKeyBytes = 48;\n      break;\n    case pki.oids.sha512:\n      md = forge.md.sha512.create();\n      macKeyBytes = 64;\n      break;\n    case pki.oids.md5:\n      md = forge.md.md5.create();\n      macKeyBytes = 16;\n      break;\n    }\n    if(md === null) {\n      throw new Error('PKCS#12 uses unsupported MAC algorithm: ' + macAlgorithm);\n    }\n\n    // verify MAC (iterations default to 1)\n    var macSalt = new forge.util.ByteBuffer(capture.macSalt);\n    var macIterations = (('macIterations' in capture) ?\n      parseInt(forge.util.bytesToHex(capture.macIterations), 16) : 1);\n    var macKey = p12.generateKey(\n      password, macSalt, 3, macIterations, macKeyBytes, md);\n    var mac = forge.hmac.create();\n    mac.start(md, macKey);\n    mac.update(data.value);\n    var macValue = mac.getMac();\n    if(macValue.getBytes() !== capture.macDigest) {\n      throw new Error('PKCS#12 MAC could not be verified. Invalid password?');\n    }\n  }\n\n  _decodeAuthenticatedSafe(pfx, data.value, strict, password);\n  return pfx;\n};\n\n/**\n * Decodes PKCS#7 Data. PKCS#7 (RFC 2315) defines \"Data\" as an OCTET STRING,\n * but it is sometimes an OCTET STRING that is composed/constructed of chunks,\n * each its own OCTET STRING. This is BER-encoding vs. DER-encoding. This\n * function transforms this corner-case into the usual simple,\n * non-composed/constructed OCTET STRING.\n *\n * This function may be moved to ASN.1 at some point to better deal with\n * more BER-encoding issues, should they arise.\n *\n * @param data the ASN.1 Data object to transform.\n */\nfunction _decodePkcs7Data(data) {\n  // handle special case of \"chunked\" data content: an octet string composed\n  // of other octet strings\n  if(data.composed || data.constructed) {\n    var value = forge.util.createBuffer();\n    for(var i = 0; i < data.value.length; ++i) {\n      value.putBytes(data.value[i].value);\n    }\n    data.composed = data.constructed = false;\n    data.value = value.getBytes();\n  }\n  return data;\n}\n\n/**\n * Decode PKCS#12 AuthenticatedSafe (BER encoded) into PFX object.\n *\n * The AuthenticatedSafe is a BER-encoded SEQUENCE OF ContentInfo.\n *\n * @param pfx The PKCS#12 PFX object to fill.\n * @param {String} authSafe BER-encoded AuthenticatedSafe.\n * @param strict true to use strict DER decoding, false not to.\n * @param {String} password Password to decrypt with (optional).\n */\nfunction _decodeAuthenticatedSafe(pfx, authSafe, strict, password) {\n  authSafe = asn1.fromDer(authSafe, strict);  /* actually it's BER encoded */\n\n  if(authSafe.tagClass !== asn1.Class.UNIVERSAL ||\n     authSafe.type !== asn1.Type.SEQUENCE ||\n     authSafe.constructed !== true) {\n    throw new Error('PKCS#12 AuthenticatedSafe expected to be a ' +\n      'SEQUENCE OF ContentInfo');\n  }\n\n  for(var i = 0; i < authSafe.value.length; i++) {\n    var contentInfo = authSafe.value[i];\n\n    // validate contentInfo and capture data\n    var capture = {};\n    var errors = [];\n    if(!asn1.validate(contentInfo, contentInfoValidator, capture, errors)) {\n      var error = new Error('Cannot read ContentInfo.');\n      error.errors = errors;\n      throw error;\n    }\n\n    var obj = {\n      encrypted: false\n    };\n    var safeContents = null;\n    var data = capture.content.value[0];\n    switch(asn1.derToOid(capture.contentType)) {\n    case pki.oids.data:\n      if(data.tagClass !== asn1.Class.UNIVERSAL ||\n         data.type !== asn1.Type.OCTETSTRING) {\n        throw new Error('PKCS#12 SafeContents Data is not an OCTET STRING.');\n      }\n      safeContents = _decodePkcs7Data(data).value;\n      break;\n    case pki.oids.encryptedData:\n      safeContents = _decryptSafeContents(data, password);\n      obj.encrypted = true;\n      break;\n    default:\n      var error = new Error('Unsupported PKCS#12 contentType.');\n      error.contentType = asn1.derToOid(capture.contentType);\n      throw error;\n    }\n\n    obj.safeBags = _decodeSafeContents(safeContents, strict, password);\n    pfx.safeContents.push(obj);\n  }\n}\n\n/**\n * Decrypt PKCS#7 EncryptedData structure.\n *\n * @param data ASN.1 encoded EncryptedContentInfo object.\n * @param password The user-provided password.\n *\n * @return The decrypted SafeContents (ASN.1 object).\n */\nfunction _decryptSafeContents(data, password) {\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(\n    data, forge.pkcs7.asn1.encryptedDataValidator, capture, errors)) {\n    var error = new Error('Cannot read EncryptedContentInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  var oid = asn1.derToOid(capture.contentType);\n  if(oid !== pki.oids.data) {\n    var error = new Error(\n      'PKCS#12 EncryptedContentInfo ContentType is not Data.');\n    error.oid = oid;\n    throw error;\n  }\n\n  // get cipher\n  oid = asn1.derToOid(capture.encAlgorithm);\n  var cipher = pki.pbe.getCipher(oid, capture.encParameter, password);\n\n  // get encrypted data\n  var encryptedContentAsn1 = _decodePkcs7Data(capture.encryptedContentAsn1);\n  var encrypted = forge.util.createBuffer(encryptedContentAsn1.value);\n\n  cipher.update(encrypted);\n  if(!cipher.finish()) {\n    throw new Error('Failed to decrypt PKCS#12 SafeContents.');\n  }\n\n  return cipher.output.getBytes();\n}\n\n/**\n * Decode PKCS#12 SafeContents (BER-encoded) into array of Bag objects.\n *\n * The safeContents is a BER-encoded SEQUENCE OF SafeBag.\n *\n * @param {String} safeContents BER-encoded safeContents.\n * @param strict true to use strict DER decoding, false not to.\n * @param {String} password Password to decrypt with (optional).\n *\n * @return {Array} Array of Bag objects.\n */\nfunction _decodeSafeContents(safeContents, strict, password) {\n  // if strict and no safe contents, return empty safes\n  if(!strict && safeContents.length === 0) {\n    return [];\n  }\n\n  // actually it's BER-encoded\n  safeContents = asn1.fromDer(safeContents, strict);\n\n  if(safeContents.tagClass !== asn1.Class.UNIVERSAL ||\n    safeContents.type !== asn1.Type.SEQUENCE ||\n    safeContents.constructed !== true) {\n    throw new Error(\n      'PKCS#12 SafeContents expected to be a SEQUENCE OF SafeBag.');\n  }\n\n  var res = [];\n  for(var i = 0; i < safeContents.value.length; i++) {\n    var safeBag = safeContents.value[i];\n\n    // validate SafeBag and capture data\n    var capture = {};\n    var errors = [];\n    if(!asn1.validate(safeBag, safeBagValidator, capture, errors)) {\n      var error = new Error('Cannot read SafeBag.');\n      error.errors = errors;\n      throw error;\n    }\n\n    /* Create bag object and push to result array. */\n    var bag = {\n      type: asn1.derToOid(capture.bagId),\n      attributes: _decodeBagAttributes(capture.bagAttributes)\n    };\n    res.push(bag);\n\n    var validator, decoder;\n    var bagAsn1 = capture.bagValue.value[0];\n    switch(bag.type) {\n      case pki.oids.pkcs8ShroudedKeyBag:\n        /* bagAsn1 has a EncryptedPrivateKeyInfo, which we need to decrypt.\n           Afterwards we can handle it like a keyBag,\n           which is a PrivateKeyInfo. */\n        bagAsn1 = pki.decryptPrivateKeyInfo(bagAsn1, password);\n        if(bagAsn1 === null) {\n          throw new Error(\n            'Unable to decrypt PKCS#8 ShroudedKeyBag, wrong password?');\n        }\n\n        /* fall through */\n      case pki.oids.keyBag:\n        /* A PKCS#12 keyBag is a simple PrivateKeyInfo as understood by our\n           PKI module, hence we don't have to do validation/capturing here,\n           just pass what we already got. */\n        try {\n          bag.key = pki.privateKeyFromAsn1(bagAsn1);\n        } catch(e) {\n          // ignore unknown key type, pass asn1 value\n          bag.key = null;\n          bag.asn1 = bagAsn1;\n        }\n        continue;  /* Nothing more to do. */\n\n      case pki.oids.certBag:\n        /* A PKCS#12 certBag can wrap both X.509 and sdsi certificates.\n           Therefore put the SafeBag content through another validator to\n           capture the fields.  Afterwards check & store the results. */\n        validator = certBagValidator;\n        decoder = function() {\n          if(asn1.derToOid(capture.certId) !== pki.oids.x509Certificate) {\n            var error = new Error(\n              'Unsupported certificate type, only X.509 supported.');\n            error.oid = asn1.derToOid(capture.certId);\n            throw error;\n          }\n\n          // true=produce cert hash\n          var certAsn1 = asn1.fromDer(capture.cert, strict);\n          try {\n            bag.cert = pki.certificateFromAsn1(certAsn1, true);\n          } catch(e) {\n            // ignore unknown cert type, pass asn1 value\n            bag.cert = null;\n            bag.asn1 = certAsn1;\n          }\n        };\n        break;\n\n      default:\n        var error = new Error('Unsupported PKCS#12 SafeBag type.');\n        error.oid = bag.type;\n        throw error;\n    }\n\n    /* Validate SafeBag value (i.e. CertBag, etc.) and capture data if needed. */\n    if(validator !== undefined &&\n       !asn1.validate(bagAsn1, validator, capture, errors)) {\n      var error = new Error('Cannot read PKCS#12 ' + validator.name);\n      error.errors = errors;\n      throw error;\n    }\n\n    /* Call decoder function from above to store the results. */\n    decoder();\n  }\n\n  return res;\n}\n\n/**\n * Decode PKCS#12 SET OF PKCS12Attribute into JavaScript object.\n *\n * @param attributes SET OF PKCS12Attribute (ASN.1 object).\n *\n * @return the decoded attributes.\n */\nfunction _decodeBagAttributes(attributes) {\n  var decodedAttrs = {};\n\n  if(attributes !== undefined) {\n    for(var i = 0; i < attributes.length; ++i) {\n      var capture = {};\n      var errors = [];\n      if(!asn1.validate(attributes[i], attributeValidator, capture, errors)) {\n        var error = new Error('Cannot read PKCS#12 BagAttribute.');\n        error.errors = errors;\n        throw error;\n      }\n\n      var oid = asn1.derToOid(capture.oid);\n      if(pki.oids[oid] === undefined) {\n        // unsupported attribute type, ignore.\n        continue;\n      }\n\n      decodedAttrs[pki.oids[oid]] = [];\n      for(var j = 0; j < capture.values.length; ++j) {\n        decodedAttrs[pki.oids[oid]].push(capture.values[j].value);\n      }\n    }\n  }\n\n  return decodedAttrs;\n}\n\n/**\n * Wraps a private key and certificate in a PKCS#12 PFX wrapper. If a\n * password is provided then the private key will be encrypted.\n *\n * An entire certificate chain may also be included. To do this, pass\n * an array for the \"cert\" parameter where the first certificate is\n * the one that is paired with the private key and each subsequent one\n * verifies the previous one. The certificates may be in PEM format or\n * have been already parsed by Forge.\n *\n * @todo implement password-based-encryption for the whole package\n *\n * @param key the private key.\n * @param cert the certificate (may be an array of certificates in order\n *          to specify a certificate chain).\n * @param password the password to use, null for none.\n * @param options:\n *          algorithm the encryption algorithm to use\n *            ('aes128', 'aes192', 'aes256', '3des'), defaults to 'aes128'.\n *          count the iteration count to use.\n *          saltSize the salt size to use.\n *          useMac true to include a MAC, false not to, defaults to true.\n *          localKeyId the local key ID to use, in hex.\n *          friendlyName the friendly name to use.\n *          generateLocalKeyId true to generate a random local key ID,\n *            false not to, defaults to true.\n *\n * @return the PKCS#12 PFX ASN.1 object.\n */\np12.toPkcs12Asn1 = function(key, cert, password, options) {\n  // set default options\n  options = options || {};\n  options.saltSize = options.saltSize || 8;\n  options.count = options.count || 2048;\n  options.algorithm = options.algorithm || options.encAlgorithm || 'aes128';\n  if(!('useMac' in options)) {\n    options.useMac = true;\n  }\n  if(!('localKeyId' in options)) {\n    options.localKeyId = null;\n  }\n  if(!('generateLocalKeyId' in options)) {\n    options.generateLocalKeyId = true;\n  }\n\n  var localKeyId = options.localKeyId;\n  var bagAttrs;\n  if(localKeyId !== null) {\n    localKeyId = forge.util.hexToBytes(localKeyId);\n  } else if(options.generateLocalKeyId) {\n    // use SHA-1 of paired cert, if available\n    if(cert) {\n      var pairedCert = forge.util.isArray(cert) ? cert[0] : cert;\n      if(typeof pairedCert === 'string') {\n        pairedCert = pki.certificateFromPem(pairedCert);\n      }\n      var sha1 = forge.md.sha1.create();\n      sha1.update(asn1.toDer(pki.certificateToAsn1(pairedCert)).getBytes());\n      localKeyId = sha1.digest().getBytes();\n    } else {\n      // FIXME: consider using SHA-1 of public key (which can be generated\n      // from private key components), see: cert.generateSubjectKeyIdentifier\n      // generate random bytes\n      localKeyId = forge.random.getBytes(20);\n    }\n  }\n\n  var attrs = [];\n  if(localKeyId !== null) {\n    attrs.push(\n      // localKeyID\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // attrId\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids.localKeyId).getBytes()),\n        // attrValues\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n            localKeyId)\n        ])\n      ]));\n  }\n  if('friendlyName' in options) {\n    attrs.push(\n      // friendlyName\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // attrId\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids.friendlyName).getBytes()),\n        // attrValues\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BMPSTRING, false,\n            options.friendlyName)\n        ])\n      ]));\n  }\n\n  if(attrs.length > 0) {\n    bagAttrs = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, attrs);\n  }\n\n  // collect contents for AuthenticatedSafe\n  var contents = [];\n\n  // create safe bag(s) for certificate chain\n  var chain = [];\n  if(cert !== null) {\n    if(forge.util.isArray(cert)) {\n      chain = cert;\n    } else {\n      chain = [cert];\n    }\n  }\n\n  var certSafeBags = [];\n  for(var i = 0; i < chain.length; ++i) {\n    // convert cert from PEM as necessary\n    cert = chain[i];\n    if(typeof cert === 'string') {\n      cert = pki.certificateFromPem(cert);\n    }\n\n    // SafeBag\n    var certBagAttrs = (i === 0) ? bagAttrs : undefined;\n    var certAsn1 = pki.certificateToAsn1(cert);\n    var certSafeBag =\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // bagId\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids.certBag).getBytes()),\n        // bagValue\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          // CertBag\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n            // certId\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n              asn1.oidToDer(pki.oids.x509Certificate).getBytes()),\n            // certValue (x509Certificate)\n            asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n              asn1.create(\n                asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n                asn1.toDer(certAsn1).getBytes())\n            ])])]),\n        // bagAttributes (OPTIONAL)\n        certBagAttrs\n      ]);\n    certSafeBags.push(certSafeBag);\n  }\n\n  if(certSafeBags.length > 0) {\n    // SafeContents\n    var certSafeContents = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, certSafeBags);\n\n    // ContentInfo\n    var certCI =\n      // PKCS#7 ContentInfo\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // contentType\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          // OID for the content type is 'data'\n          asn1.oidToDer(pki.oids.data).getBytes()),\n        // content\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          asn1.create(\n            asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n            asn1.toDer(certSafeContents).getBytes())\n        ])\n      ]);\n    contents.push(certCI);\n  }\n\n  // create safe contents for private key\n  var keyBag = null;\n  if(key !== null) {\n    // SafeBag\n    var pkAsn1 = pki.wrapRsaPrivateKey(pki.privateKeyToAsn1(key));\n    if(password === null) {\n      // no encryption\n      keyBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // bagId\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids.keyBag).getBytes()),\n        // bagValue\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          // PrivateKeyInfo\n          pkAsn1\n        ]),\n        // bagAttributes (OPTIONAL)\n        bagAttrs\n      ]);\n    } else {\n      // encrypted PrivateKeyInfo\n      keyBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // bagId\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids.pkcs8ShroudedKeyBag).getBytes()),\n        // bagValue\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          // EncryptedPrivateKeyInfo\n          pki.encryptPrivateKeyInfo(pkAsn1, password, options)\n        ]),\n        // bagAttributes (OPTIONAL)\n        bagAttrs\n      ]);\n    }\n\n    // SafeContents\n    var keySafeContents =\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [keyBag]);\n\n    // ContentInfo\n    var keyCI =\n      // PKCS#7 ContentInfo\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // contentType\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          // OID for the content type is 'data'\n          asn1.oidToDer(pki.oids.data).getBytes()),\n        // content\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          asn1.create(\n            asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n            asn1.toDer(keySafeContents).getBytes())\n        ])\n      ]);\n    contents.push(keyCI);\n  }\n\n  // create AuthenticatedSafe by stringing together the contents\n  var safe = asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, contents);\n\n  var macData;\n  if(options.useMac) {\n    // MacData\n    var sha1 = forge.md.sha1.create();\n    var macSalt = new forge.util.ByteBuffer(\n      forge.random.getBytes(options.saltSize));\n    var count = options.count;\n    // 160-bit key\n    var key = p12.generateKey(password, macSalt, 3, count, 20);\n    var mac = forge.hmac.create();\n    mac.start(sha1, key);\n    mac.update(asn1.toDer(safe).getBytes());\n    var macValue = mac.getMac();\n    macData = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // mac DigestInfo\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // digestAlgorithm\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          // algorithm = SHA-1\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n            asn1.oidToDer(pki.oids.sha1).getBytes()),\n          // parameters = Null\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n        ]),\n        // digest\n        asn1.create(\n          asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING,\n          false, macValue.getBytes())\n      ]),\n      // macSalt OCTET STRING\n      asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, macSalt.getBytes()),\n      // iterations INTEGER (XXX: Only support count < 65536)\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        asn1.integerToDer(count).getBytes()\n      )\n    ]);\n  }\n\n  // PFX\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version (3)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(3).getBytes()),\n    // PKCS#7 ContentInfo\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // contentType\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        // OID for the content type is 'data'\n        asn1.oidToDer(pki.oids.data).getBytes()),\n      // content\n      asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n        asn1.create(\n          asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n          asn1.toDer(safe).getBytes())\n      ])\n    ]),\n    macData\n  ]);\n};\n\n/**\n * Derives a PKCS#12 key.\n *\n * @param password the password to derive the key material from, null or\n *          undefined for none.\n * @param salt the salt, as a ByteBuffer, to use.\n * @param id the PKCS#12 ID byte (1 = key material, 2 = IV, 3 = MAC).\n * @param iter the iteration count.\n * @param n the number of bytes to derive from the password.\n * @param md the message digest to use, defaults to SHA-1.\n *\n * @return a ByteBuffer with the bytes derived from the password.\n */\np12.generateKey = forge.pbe.generatePkcs12Key;\n","/**\n * Javascript implementation of a basic Public Key Infrastructure, including\n * support for RSA public and private keys.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2013 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./asn1');\nrequire('./oids');\nrequire('./pbe');\nrequire('./pem');\nrequire('./pbkdf2');\nrequire('./pkcs12');\nrequire('./pss');\nrequire('./rsa');\nrequire('./util');\nrequire('./x509');\n\n// shortcut for asn.1 API\nvar asn1 = forge.asn1;\n\n/* Public Key Infrastructure (PKI) implementation. */\nvar pki = module.exports = forge.pki = forge.pki || {};\n\n/**\n * NOTE: THIS METHOD IS DEPRECATED. Use pem.decode() instead.\n *\n * Converts PEM-formatted data to DER.\n *\n * @param pem the PEM-formatted data.\n *\n * @return the DER-formatted data.\n */\npki.pemToDer = function(pem) {\n  var msg = forge.pem.decode(pem)[0];\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert PEM to DER; PEM is encrypted.');\n  }\n  return forge.util.createBuffer(msg.body);\n};\n\n/**\n * Converts an RSA private key from PEM format.\n *\n * @param pem the PEM-formatted private key.\n *\n * @return the private key.\n */\npki.privateKeyFromPem = function(pem) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'PRIVATE KEY' && msg.type !== 'RSA PRIVATE KEY') {\n    var error = new Error('Could not convert private key from PEM; PEM ' +\n      'header type is not \"PRIVATE KEY\" or \"RSA PRIVATE KEY\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert private key from PEM; PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  var obj = asn1.fromDer(msg.body);\n\n  return pki.privateKeyFromAsn1(obj);\n};\n\n/**\n * Converts an RSA private key to PEM format.\n *\n * @param key the private key.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted private key.\n */\npki.privateKeyToPem = function(key, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var msg = {\n    type: 'RSA PRIVATE KEY',\n    body: asn1.toDer(pki.privateKeyToAsn1(key)).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Converts a PrivateKeyInfo to PEM format.\n *\n * @param pki the PrivateKeyInfo.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted private key.\n */\npki.privateKeyInfoToPem = function(pki, maxline) {\n  // convert to DER, then PEM-encode\n  var msg = {\n    type: 'PRIVATE KEY',\n    body: asn1.toDer(pki).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n","/**\n * A Javascript implementation of Transport Layer Security (TLS).\n *\n * @author Dave Longley\n *\n * Copyright (c) 2009-2014 Digital Bazaar, Inc.\n *\n * The TLS Handshake Protocol involves the following steps:\n *\n * - Exchange hello messages to agree on algorithms, exchange random values,\n * and check for session resumption.\n *\n * - Exchange the necessary cryptographic parameters to allow the client and\n * server to agree on a premaster secret.\n *\n * - Exchange certificates and cryptographic information to allow the client\n * and server to authenticate themselves.\n *\n * - Generate a master secret from the premaster secret and exchanged random\n * values.\n *\n * - Provide security parameters to the record layer.\n *\n * - Allow the client and server to verify that their peer has calculated the\n * same security parameters and that the handshake occurred without tampering\n * by an attacker.\n *\n * Up to 4 different messages may be sent during a key exchange. The server\n * certificate, the server key exchange, the client certificate, and the\n * client key exchange.\n *\n * A typical handshake (from the client's perspective).\n *\n * 1. Client sends ClientHello.\n * 2. Client receives ServerHello.\n * 3. Client receives optional Certificate.\n * 4. Client receives optional ServerKeyExchange.\n * 5. Client receives ServerHelloDone.\n * 6. Client sends optional Certificate.\n * 7. Client sends ClientKeyExchange.\n * 8. Client sends optional CertificateVerify.\n * 9. Client sends ChangeCipherSpec.\n * 10. Client sends Finished.\n * 11. Client receives ChangeCipherSpec.\n * 12. Client receives Finished.\n * 13. Client sends/receives application data.\n *\n * To reuse an existing session:\n *\n * 1. Client sends ClientHello with session ID for reuse.\n * 2. Client receives ServerHello with same session ID if reusing.\n * 3. Client receives ChangeCipherSpec message if reusing.\n * 4. Client receives Finished.\n * 5. Client sends ChangeCipherSpec.\n * 6. Client sends Finished.\n *\n * Note: Client ignores HelloRequest if in the middle of a handshake.\n *\n * Record Layer:\n *\n * The record layer fragments information blocks into TLSPlaintext records\n * carrying data in chunks of 2^14 bytes or less. Client message boundaries are\n * not preserved in the record layer (i.e., multiple client messages of the\n * same ContentType MAY be coalesced into a single TLSPlaintext record, or a\n * single message MAY be fragmented across several records).\n *\n * struct {\n *   uint8 major;\n *   uint8 minor;\n * } ProtocolVersion;\n *\n * struct {\n *   ContentType type;\n *   ProtocolVersion version;\n *   uint16 length;\n *   opaque fragment[TLSPlaintext.length];\n * } TLSPlaintext;\n *\n * type:\n *   The higher-level protocol used to process the enclosed fragment.\n *\n * version:\n *   The version of the protocol being employed. TLS Version 1.2 uses version\n *   {3, 3}. TLS Version 1.0 uses version {3, 1}. Note that a client that\n *   supports multiple versions of TLS may not know what version will be\n *   employed before it receives the ServerHello.\n *\n * length:\n *   The length (in bytes) of the following TLSPlaintext.fragment. The length\n *   MUST NOT exceed 2^14 = 16384 bytes.\n *\n * fragment:\n *   The application data. This data is transparent and treated as an\n *   independent block to be dealt with by the higher-level protocol specified\n *   by the type field.\n *\n * Implementations MUST NOT send zero-length fragments of Handshake, Alert, or\n * ChangeCipherSpec content types. Zero-length fragments of Application data\n * MAY be sent as they are potentially useful as a traffic analysis\n * countermeasure.\n *\n * Note: Data of different TLS record layer content types MAY be interleaved.\n * Application data is generally of lower precedence for transmission than\n * other content types. However, records MUST be delivered to the network in\n * the same order as they are protected by the record layer. Recipients MUST\n * receive and process interleaved application layer traffic during handshakes\n * subsequent to the first one on a connection.\n *\n * struct {\n *   ContentType type;       // same as TLSPlaintext.type\n *   ProtocolVersion version;// same as TLSPlaintext.version\n *   uint16 length;\n *   opaque fragment[TLSCompressed.length];\n * } TLSCompressed;\n *\n * length:\n *   The length (in bytes) of the following TLSCompressed.fragment.\n *   The length MUST NOT exceed 2^14 + 1024.\n *\n * fragment:\n *   The compressed form of TLSPlaintext.fragment.\n *\n * Note: A CompressionMethod.null operation is an identity operation; no fields\n * are altered. In this implementation, since no compression is supported,\n * uncompressed records are always the same as compressed records.\n *\n * Encryption Information:\n *\n * The encryption and MAC functions translate a TLSCompressed structure into a\n * TLSCiphertext. The decryption functions reverse the process. The MAC of the\n * record also includes a sequence number so that missing, extra, or repeated\n * messages are detectable.\n *\n * struct {\n *   ContentType type;\n *   ProtocolVersion version;\n *   uint16 length;\n *   select (SecurityParameters.cipher_type) {\n *     case stream: GenericStreamCipher;\n *     case block:  GenericBlockCipher;\n *     case aead:   GenericAEADCipher;\n *   } fragment;\n * } TLSCiphertext;\n *\n * type:\n *   The type field is identical to TLSCompressed.type.\n *\n * version:\n *   The version field is identical to TLSCompressed.version.\n *\n * length:\n *   The length (in bytes) of the following TLSCiphertext.fragment.\n *   The length MUST NOT exceed 2^14 + 2048.\n *\n * fragment:\n *   The encrypted form of TLSCompressed.fragment, with the MAC.\n *\n * Note: Only CBC Block Ciphers are supported by this implementation.\n *\n * The TLSCompressed.fragment structures are converted to/from block\n * TLSCiphertext.fragment structures.\n *\n * struct {\n *   opaque IV[SecurityParameters.record_iv_length];\n *   block-ciphered struct {\n *     opaque content[TLSCompressed.length];\n *     opaque MAC[SecurityParameters.mac_length];\n *     uint8 padding[GenericBlockCipher.padding_length];\n *     uint8 padding_length;\n *   };\n * } GenericBlockCipher;\n *\n * The MAC is generated as described in Section 6.2.3.1.\n *\n * IV:\n *   The Initialization Vector (IV) SHOULD be chosen at random, and MUST be\n *   unpredictable. Note that in versions of TLS prior to 1.1, there was no\n *   IV field, and the last ciphertext block of the previous record (the \"CBC\n *   residue\") was used as the IV. This was changed to prevent the attacks\n *   described in [CBCATT]. For block ciphers, the IV length is of length\n *   SecurityParameters.record_iv_length, which is equal to the\n *   SecurityParameters.block_size.\n *\n * padding:\n *   Padding that is added to force the length of the plaintext to be an\n *   integral multiple of the block cipher's block length. The padding MAY be\n *   any length up to 255 bytes, as long as it results in the\n *   TLSCiphertext.length being an integral multiple of the block length.\n *   Lengths longer than necessary might be desirable to frustrate attacks on\n *   a protocol that are based on analysis of the lengths of exchanged\n *   messages. Each uint8 in the padding data vector MUST be filled with the\n *   padding length value. The receiver MUST check this padding and MUST use\n *   the bad_record_mac alert to indicate padding errors.\n *\n * padding_length:\n *   The padding length MUST be such that the total size of the\n *   GenericBlockCipher structure is a multiple of the cipher's block length.\n *   Legal values range from zero to 255, inclusive. This length specifies the\n *   length of the padding field exclusive of the padding_length field itself.\n *\n * The encrypted data length (TLSCiphertext.length) is one more than the sum of\n * SecurityParameters.block_length, TLSCompressed.length,\n * SecurityParameters.mac_length, and padding_length.\n *\n * Example: If the block length is 8 bytes, the content length\n * (TLSCompressed.length) is 61 bytes, and the MAC length is 20 bytes, then the\n * length before padding is 82 bytes (this does not include the IV. Thus, the\n * padding length modulo 8 must be equal to 6 in order to make the total length\n * an even multiple of 8 bytes (the block length). The padding length can be\n * 6, 14, 22, and so on, through 254. If the padding length were the minimum\n * necessary, 6, the padding would be 6 bytes, each containing the value 6.\n * Thus, the last 8 octets of the GenericBlockCipher before block encryption\n * would be xx 06 06 06 06 06 06 06, where xx is the last octet of the MAC.\n *\n * Note: With block ciphers in CBC mode (Cipher Block Chaining), it is critical\n * that the entire plaintext of the record be known before any ciphertext is\n * transmitted. Otherwise, it is possible for the attacker to mount the attack\n * described in [CBCATT].\n *\n * Implementation note: Canvel et al. [CBCTIME] have demonstrated a timing\n * attack on CBC padding based on the time required to compute the MAC. In\n * order to defend against this attack, implementations MUST ensure that\n * record processing time is essentially the same whether or not the padding\n * is correct. In general, the best way to do this is to compute the MAC even\n * if the padding is incorrect, and only then reject the packet. For instance,\n * if the pad appears to be incorrect, the implementation might assume a\n * zero-length pad and then compute the MAC. This leaves a small timing\n * channel, since MAC performance depends, to some extent, on the size of the\n * data fragment, but it is not believed to be large enough to be exploitable,\n * due to the large block size of existing MACs and the small size of the\n * timing signal.\n */\nvar forge = require('./forge');\nrequire('./asn1');\nrequire('./hmac');\nrequire('./md5');\nrequire('./pem');\nrequire('./pki');\nrequire('./random');\nrequire('./sha1');\nrequire('./util');\n\n/**\n * Generates pseudo random bytes by mixing the result of two hash functions,\n * MD5 and SHA-1.\n *\n * prf_TLS1(secret, label, seed) =\n *   P_MD5(S1, label + seed) XOR P_SHA-1(S2, label + seed);\n *\n * Each P_hash function functions as follows:\n *\n * P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +\n *                        HMAC_hash(secret, A(2) + seed) +\n *                        HMAC_hash(secret, A(3) + seed) + ...\n * A() is defined as:\n *   A(0) = seed\n *   A(i) = HMAC_hash(secret, A(i-1))\n *\n * The '+' operator denotes concatenation.\n *\n * As many iterations A(N) as are needed are performed to generate enough\n * pseudo random byte output. If an iteration creates more data than is\n * necessary, then it is truncated.\n *\n * Therefore:\n * A(1) = HMAC_hash(secret, A(0))\n *      = HMAC_hash(secret, seed)\n * A(2) = HMAC_hash(secret, A(1))\n *      = HMAC_hash(secret, HMAC_hash(secret, seed))\n *\n * Therefore:\n * P_hash(secret, seed) =\n *   HMAC_hash(secret, HMAC_hash(secret, A(0)) + seed) +\n *   HMAC_hash(secret, HMAC_hash(secret, A(1)) + seed) +\n *   ...\n *\n * Therefore:\n * P_hash(secret, seed) =\n *   HMAC_hash(secret, HMAC_hash(secret, seed) + seed) +\n *   HMAC_hash(secret, HMAC_hash(secret, HMAC_hash(secret, seed)) + seed) +\n *   ...\n *\n * @param secret the secret to use.\n * @param label the label to use.\n * @param seed the seed value to use.\n * @param length the number of bytes to generate.\n *\n * @return the pseudo random bytes in a byte buffer.\n */\nvar prf_TLS1 = function(secret, label, seed, length) {\n  var rval = forge.util.createBuffer();\n\n  /* For TLS 1.0, the secret is split in half, into two secrets of equal\n    length. If the secret has an odd length then the last byte of the first\n    half will be the same as the first byte of the second. The length of the\n    two secrets is half of the secret rounded up. */\n  var idx = (secret.length >> 1);\n  var slen = idx + (secret.length & 1);\n  var s1 = secret.substr(0, slen);\n  var s2 = secret.substr(idx, slen);\n  var ai = forge.util.createBuffer();\n  var hmac = forge.hmac.create();\n  seed = label + seed;\n\n  // determine the number of iterations that must be performed to generate\n  // enough output bytes, md5 creates 16 byte hashes, sha1 creates 20\n  var md5itr = Math.ceil(length / 16);\n  var sha1itr = Math.ceil(length / 20);\n\n  // do md5 iterations\n  hmac.start('MD5', s1);\n  var md5bytes = forge.util.createBuffer();\n  ai.putBytes(seed);\n  for(var i = 0; i < md5itr; ++i) {\n    // HMAC_hash(secret, A(i-1))\n    hmac.start(null, null);\n    hmac.update(ai.getBytes());\n    ai.putBuffer(hmac.digest());\n\n    // HMAC_hash(secret, A(i) + seed)\n    hmac.start(null, null);\n    hmac.update(ai.bytes() + seed);\n    md5bytes.putBuffer(hmac.digest());\n  }\n\n  // do sha1 iterations\n  hmac.start('SHA1', s2);\n  var sha1bytes = forge.util.createBuffer();\n  ai.clear();\n  ai.putBytes(seed);\n  for(var i = 0; i < sha1itr; ++i) {\n    // HMAC_hash(secret, A(i-1))\n    hmac.start(null, null);\n    hmac.update(ai.getBytes());\n    ai.putBuffer(hmac.digest());\n\n    // HMAC_hash(secret, A(i) + seed)\n    hmac.start(null, null);\n    hmac.update(ai.bytes() + seed);\n    sha1bytes.putBuffer(hmac.digest());\n  }\n\n  // XOR the md5 bytes with the sha1 bytes\n  rval.putBytes(forge.util.xorBytes(\n    md5bytes.getBytes(), sha1bytes.getBytes(), length));\n\n  return rval;\n};\n\n/**\n * Generates pseudo random bytes using a SHA256 algorithm. For TLS 1.2.\n *\n * @param secret the secret to use.\n * @param label the label to use.\n * @param seed the seed value to use.\n * @param length the number of bytes to generate.\n *\n * @return the pseudo random bytes in a byte buffer.\n */\nvar prf_sha256 = function(secret, label, seed, length) {\n   // FIXME: implement me for TLS 1.2\n};\n\n/**\n * Gets a MAC for a record using the SHA-1 hash algorithm.\n *\n * @param key the mac key.\n * @param state the sequence number (array of two 32-bit integers).\n * @param record the record.\n *\n * @return the sha-1 hash (20 bytes) for the given record.\n */\nvar hmac_sha1 = function(key, seqNum, record) {\n  /* MAC is computed like so:\n  HMAC_hash(\n    key, seqNum +\n      TLSCompressed.type +\n      TLSCompressed.version +\n      TLSCompressed.length +\n      TLSCompressed.fragment)\n  */\n  var hmac = forge.hmac.create();\n  hmac.start('SHA1', key);\n  var b = forge.util.createBuffer();\n  b.putInt32(seqNum[0]);\n  b.putInt32(seqNum[1]);\n  b.putByte(record.type);\n  b.putByte(record.version.major);\n  b.putByte(record.version.minor);\n  b.putInt16(record.length);\n  b.putBytes(record.fragment.bytes());\n  hmac.update(b.getBytes());\n  return hmac.digest().getBytes();\n};\n\n/**\n * Compresses the TLSPlaintext record into a TLSCompressed record using the\n * deflate algorithm.\n *\n * @param c the TLS connection.\n * @param record the TLSPlaintext record to compress.\n * @param s the ConnectionState to use.\n *\n * @return true on success, false on failure.\n */\nvar deflate = function(c, record, s) {\n  var rval = false;\n\n  try {\n    var bytes = c.deflate(record.fragment.getBytes());\n    record.fragment = forge.util.createBuffer(bytes);\n    record.length = bytes.length;\n    rval = true;\n  } catch(ex) {\n    // deflate error, fail out\n  }\n\n  return rval;\n};\n\n/**\n * Decompresses the TLSCompressed record into a TLSPlaintext record using the\n * deflate algorithm.\n *\n * @param c the TLS connection.\n * @param record the TLSCompressed record to decompress.\n * @param s the ConnectionState to use.\n *\n * @return true on success, false on failure.\n */\nvar inflate = function(c, record, s) {\n  var rval = false;\n\n  try {\n    var bytes = c.inflate(record.fragment.getBytes());\n    record.fragment = forge.util.createBuffer(bytes);\n    record.length = bytes.length;\n    rval = true;\n  } catch(ex) {\n    // inflate error, fail out\n  }\n\n  return rval;\n};\n\n/**\n * Reads a TLS variable-length vector from a byte buffer.\n *\n * Variable-length vectors are defined by specifying a subrange of legal\n * lengths, inclusively, using the notation <floor..ceiling>. When these are\n * encoded, the actual length precedes the vector's contents in the byte\n * stream. The length will be in the form of a number consuming as many bytes\n * as required to hold the vector's specified maximum (ceiling) length. A\n * variable-length vector with an actual length field of zero is referred to\n * as an empty vector.\n *\n * @param b the byte buffer.\n * @param lenBytes the number of bytes required to store the length.\n *\n * @return the resulting byte buffer.\n */\nvar readVector = function(b, lenBytes) {\n  var len = 0;\n  switch(lenBytes) {\n  case 1:\n    len = b.getByte();\n    break;\n  case 2:\n    len = b.getInt16();\n    break;\n  case 3:\n    len = b.getInt24();\n    break;\n  case 4:\n    len = b.getInt32();\n    break;\n  }\n\n  // read vector bytes into a new buffer\n  return forge.util.createBuffer(b.getBytes(len));\n};\n\n/**\n * Writes a TLS variable-length vector to a byte buffer.\n *\n * @param b the byte buffer.\n * @param lenBytes the number of bytes required to store the length.\n * @param v the byte buffer vector.\n */\nvar writeVector = function(b, lenBytes, v) {\n  // encode length at the start of the vector, where the number of bytes for\n  // the length is the maximum number of bytes it would take to encode the\n  // vector's ceiling\n  b.putInt(v.length(), lenBytes << 3);\n  b.putBuffer(v);\n};\n\n/**\n * The tls implementation.\n */\nvar tls = {};\n\n/**\n * Version: TLS 1.2 = 3.3, TLS 1.1 = 3.2, TLS 1.0 = 3.1. Both TLS 1.1 and\n * TLS 1.2 were still too new (ie: openSSL didn't implement them) at the time\n * of this implementation so TLS 1.0 was implemented instead.\n */\ntls.Versions = {\n  TLS_1_0: {major: 3, minor: 1},\n  TLS_1_1: {major: 3, minor: 2},\n  TLS_1_2: {major: 3, minor: 3}\n};\ntls.SupportedVersions = [\n  tls.Versions.TLS_1_1,\n  tls.Versions.TLS_1_0\n];\ntls.Version = tls.SupportedVersions[0];\n\n/**\n * Maximum fragment size. True maximum is 16384, but we fragment before that\n * to allow for unusual small increases during compression.\n */\ntls.MaxFragment = 16384 - 1024;\n\n/**\n * Whether this entity is considered the \"client\" or \"server\".\n * enum { server, client } ConnectionEnd;\n */\ntls.ConnectionEnd = {\n  server: 0,\n  client: 1\n};\n\n/**\n * Pseudo-random function algorithm used to generate keys from the master\n * secret.\n * enum { tls_prf_sha256 } PRFAlgorithm;\n */\ntls.PRFAlgorithm = {\n  tls_prf_sha256: 0\n};\n\n/**\n * Bulk encryption algorithms.\n * enum { null, rc4, des3, aes } BulkCipherAlgorithm;\n */\ntls.BulkCipherAlgorithm = {\n  none: null,\n  rc4: 0,\n  des3: 1,\n  aes: 2\n};\n\n/**\n * Cipher types.\n * enum { stream, block, aead } CipherType;\n */\ntls.CipherType = {\n  stream: 0,\n  block: 1,\n  aead: 2\n};\n\n/**\n * MAC (Message Authentication Code) algorithms.\n * enum { null, hmac_md5, hmac_sha1, hmac_sha256,\n *   hmac_sha384, hmac_sha512} MACAlgorithm;\n */\ntls.MACAlgorithm = {\n  none: null,\n  hmac_md5: 0,\n  hmac_sha1: 1,\n  hmac_sha256: 2,\n  hmac_sha384: 3,\n  hmac_sha512: 4\n};\n\n/**\n * Compression algorithms.\n * enum { null(0), deflate(1), (255) } CompressionMethod;\n */\ntls.CompressionMethod = {\n  none: 0,\n  deflate: 1\n};\n\n/**\n * TLS record content types.\n * enum {\n *   change_cipher_spec(20), alert(21), handshake(22),\n *   application_data(23), (255)\n * } ContentType;\n */\ntls.ContentType = {\n  change_cipher_spec: 20,\n  alert: 21,\n  handshake: 22,\n  application_data: 23,\n  heartbeat: 24\n};\n\n/**\n * TLS handshake types.\n * enum {\n *   hello_request(0), client_hello(1), server_hello(2),\n *   certificate(11), server_key_exchange (12),\n *   certificate_request(13), server_hello_done(14),\n *   certificate_verify(15), client_key_exchange(16),\n *   finished(20), (255)\n * } HandshakeType;\n */\ntls.HandshakeType = {\n  hello_request: 0,\n  client_hello: 1,\n  server_hello: 2,\n  certificate: 11,\n  server_key_exchange: 12,\n  certificate_request: 13,\n  server_hello_done: 14,\n  certificate_verify: 15,\n  client_key_exchange: 16,\n  finished: 20\n};\n\n/**\n * TLS Alert Protocol.\n *\n * enum { warning(1), fatal(2), (255) } AlertLevel;\n *\n * enum {\n *   close_notify(0),\n *   unexpected_message(10),\n *   bad_record_mac(20),\n *   decryption_failed(21),\n *   record_overflow(22),\n *   decompression_failure(30),\n *   handshake_failure(40),\n *   bad_certificate(42),\n *   unsupported_certificate(43),\n *   certificate_revoked(44),\n *   certificate_expired(45),\n *   certificate_unknown(46),\n *   illegal_parameter(47),\n *   unknown_ca(48),\n *   access_denied(49),\n *   decode_error(50),\n *   decrypt_error(51),\n *   export_restriction(60),\n *   protocol_version(70),\n *   insufficient_security(71),\n *   internal_error(80),\n *   user_canceled(90),\n *   no_renegotiation(100),\n *   (255)\n * } AlertDescription;\n *\n * struct {\n *   AlertLevel level;\n *   AlertDescription description;\n * } Alert;\n */\ntls.Alert = {};\ntls.Alert.Level = {\n  warning: 1,\n  fatal: 2\n};\ntls.Alert.Description = {\n  close_notify: 0,\n  unexpected_message: 10,\n  bad_record_mac: 20,\n  decryption_failed: 21,\n  record_overflow: 22,\n  decompression_failure: 30,\n  handshake_failure: 40,\n  bad_certificate: 42,\n  unsupported_certificate: 43,\n  certificate_revoked: 44,\n  certificate_expired: 45,\n  certificate_unknown: 46,\n  illegal_parameter: 47,\n  unknown_ca: 48,\n  access_denied: 49,\n  decode_error: 50,\n  decrypt_error: 51,\n  export_restriction: 60,\n  protocol_version: 70,\n  insufficient_security: 71,\n  internal_error: 80,\n  user_canceled: 90,\n  no_renegotiation: 100\n};\n\n/**\n * TLS Heartbeat Message types.\n * enum {\n *   heartbeat_request(1),\n *   heartbeat_response(2),\n *   (255)\n * } HeartbeatMessageType;\n */\ntls.HeartbeatMessageType = {\n  heartbeat_request: 1,\n  heartbeat_response: 2\n};\n\n/**\n * Supported cipher suites.\n */\ntls.CipherSuites = {};\n\n/**\n * Gets a supported cipher suite from its 2 byte ID.\n *\n * @param twoBytes two bytes in a string.\n *\n * @return the matching supported cipher suite or null.\n */\ntls.getCipherSuite = function(twoBytes) {\n  var rval = null;\n  for(var key in tls.CipherSuites) {\n    var cs = tls.CipherSuites[key];\n    if(cs.id[0] === twoBytes.charCodeAt(0) &&\n      cs.id[1] === twoBytes.charCodeAt(1)) {\n      rval = cs;\n      break;\n    }\n  }\n  return rval;\n};\n\n/**\n * Called when an unexpected record is encountered.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleUnexpected = function(c, record) {\n  // if connection is client and closed, ignore unexpected messages\n  var ignore = (!c.open && c.entity === tls.ConnectionEnd.client);\n  if(!ignore) {\n    c.error(c, {\n      message: 'Unexpected message. Received TLS record out of order.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.unexpected_message\n      }\n    });\n  }\n};\n\n/**\n * Called when a client receives a HelloRequest record.\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleHelloRequest = function(c, record, length) {\n  // ignore renegotiation requests from the server during a handshake, but\n  // if handshaking, send a warning alert that renegotation is denied\n  if(!c.handshaking && c.handshakes > 0) {\n    // send alert warning\n    tls.queue(c, tls.createAlert(c, {\n       level: tls.Alert.Level.warning,\n       description: tls.Alert.Description.no_renegotiation\n    }));\n    tls.flush(c);\n  }\n\n  // continue\n  c.process();\n};\n\n/**\n * Parses a hello message from a ClientHello or ServerHello record.\n *\n * @param record the record to parse.\n *\n * @return the parsed message.\n */\ntls.parseHelloMessage = function(c, record, length) {\n  var msg = null;\n\n  var client = (c.entity === tls.ConnectionEnd.client);\n\n  // minimum of 38 bytes in message\n  if(length < 38) {\n    c.error(c, {\n      message: client ?\n        'Invalid ServerHello message. Message too short.' :\n        'Invalid ClientHello message. Message too short.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  } else {\n    // use 'remaining' to calculate # of remaining bytes in the message\n    var b = record.fragment;\n    var remaining = b.length();\n    msg = {\n      version: {\n        major: b.getByte(),\n        minor: b.getByte()\n      },\n      random: forge.util.createBuffer(b.getBytes(32)),\n      session_id: readVector(b, 1),\n      extensions: []\n    };\n    if(client) {\n      msg.cipher_suite = b.getBytes(2);\n      msg.compression_method = b.getByte();\n    } else {\n      msg.cipher_suites = readVector(b, 2);\n      msg.compression_methods = readVector(b, 1);\n    }\n\n    // read extensions if there are any bytes left in the message\n    remaining = length - (remaining - b.length());\n    if(remaining > 0) {\n      // parse extensions\n      var exts = readVector(b, 2);\n      while(exts.length() > 0) {\n        msg.extensions.push({\n          type: [exts.getByte(), exts.getByte()],\n          data: readVector(exts, 2)\n        });\n      }\n\n      // TODO: make extension support modular\n      if(!client) {\n        for(var i = 0; i < msg.extensions.length; ++i) {\n          var ext = msg.extensions[i];\n\n          // support SNI extension\n          if(ext.type[0] === 0x00 && ext.type[1] === 0x00) {\n            // get server name list\n            var snl = readVector(ext.data, 2);\n            while(snl.length() > 0) {\n              // read server name type\n              var snType = snl.getByte();\n\n              // only HostName type (0x00) is known, break out if\n              // another type is detected\n              if(snType !== 0x00) {\n                break;\n              }\n\n              // add host name to server name list\n              c.session.extensions.server_name.serverNameList.push(\n                readVector(snl, 2).getBytes());\n            }\n          }\n        }\n      }\n    }\n\n    // version already set, do not allow version change\n    if(c.session.version) {\n      if(msg.version.major !== c.session.version.major ||\n        msg.version.minor !== c.session.version.minor) {\n        return c.error(c, {\n          message: 'TLS version change is disallowed during renegotiation.',\n          send: true,\n          alert: {\n            level: tls.Alert.Level.fatal,\n            description: tls.Alert.Description.protocol_version\n          }\n        });\n      }\n    }\n\n    // get the chosen (ServerHello) cipher suite\n    if(client) {\n      // FIXME: should be checking configured acceptable cipher suites\n      c.session.cipherSuite = tls.getCipherSuite(msg.cipher_suite);\n    } else {\n      // get a supported preferred (ClientHello) cipher suite\n      // choose the first supported cipher suite\n      var tmp = forge.util.createBuffer(msg.cipher_suites.bytes());\n      while(tmp.length() > 0) {\n        // FIXME: should be checking configured acceptable suites\n        // cipher suites take up 2 bytes\n        c.session.cipherSuite = tls.getCipherSuite(tmp.getBytes(2));\n        if(c.session.cipherSuite !== null) {\n          break;\n        }\n      }\n    }\n\n    // cipher suite not supported\n    if(c.session.cipherSuite === null) {\n      return c.error(c, {\n        message: 'No cipher suites in common.',\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.handshake_failure\n        },\n        cipherSuite: forge.util.bytesToHex(msg.cipher_suite)\n      });\n    }\n\n    // TODO: handle compression methods\n    if(client) {\n      c.session.compressionMethod = msg.compression_method;\n    } else {\n      // no compression\n      c.session.compressionMethod = tls.CompressionMethod.none;\n    }\n  }\n\n  return msg;\n};\n\n/**\n * Creates security parameters for the given connection based on the given\n * hello message.\n *\n * @param c the TLS connection.\n * @param msg the hello message.\n */\ntls.createSecurityParameters = function(c, msg) {\n  /* Note: security params are from TLS 1.2, some values like prf_algorithm\n  are ignored for TLS 1.0/1.1 and the builtin as specified in the spec is\n  used. */\n\n  // TODO: handle other options from server when more supported\n\n  // get client and server randoms\n  var client = (c.entity === tls.ConnectionEnd.client);\n  var msgRandom = msg.random.bytes();\n  var cRandom = client ? c.session.sp.client_random : msgRandom;\n  var sRandom = client ? msgRandom : tls.createRandom().getBytes();\n\n  // create new security parameters\n  c.session.sp = {\n    entity: c.entity,\n    prf_algorithm: tls.PRFAlgorithm.tls_prf_sha256,\n    bulk_cipher_algorithm: null,\n    cipher_type: null,\n    enc_key_length: null,\n    block_length: null,\n    fixed_iv_length: null,\n    record_iv_length: null,\n    mac_algorithm: null,\n    mac_length: null,\n    mac_key_length: null,\n    compression_algorithm: c.session.compressionMethod,\n    pre_master_secret: null,\n    master_secret: null,\n    client_random: cRandom,\n    server_random: sRandom\n  };\n};\n\n/**\n * Called when a client receives a ServerHello record.\n *\n * When a ServerHello message will be sent:\n *   The server will send this message in response to a client hello message\n *   when it was able to find an acceptable set of algorithms. If it cannot\n *   find such a match, it will respond with a handshake failure alert.\n *\n * uint24 length;\n * struct {\n *   ProtocolVersion server_version;\n *   Random random;\n *   SessionID session_id;\n *   CipherSuite cipher_suite;\n *   CompressionMethod compression_method;\n *   select(extensions_present) {\n *     case false:\n *       struct {};\n *     case true:\n *       Extension extensions<0..2^16-1>;\n *   };\n * } ServerHello;\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleServerHello = function(c, record, length) {\n  var msg = tls.parseHelloMessage(c, record, length);\n  if(c.fail) {\n    return;\n  }\n\n  // ensure server version is compatible\n  if(msg.version.minor <= c.version.minor) {\n    c.version.minor = msg.version.minor;\n  } else {\n    return c.error(c, {\n      message: 'Incompatible TLS version.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.protocol_version\n      }\n    });\n  }\n\n  // indicate session version has been set\n  c.session.version = c.version;\n\n  // get the session ID from the message\n  var sessionId = msg.session_id.bytes();\n\n  // if the session ID is not blank and matches the cached one, resume\n  // the session\n  if(sessionId.length > 0 && sessionId === c.session.id) {\n    // resuming session, expect a ChangeCipherSpec next\n    c.expect = SCC;\n    c.session.resuming = true;\n\n    // get new server random\n    c.session.sp.server_random = msg.random.bytes();\n  } else {\n    // not resuming, expect a server Certificate message next\n    c.expect = SCE;\n    c.session.resuming = false;\n\n    // create new security parameters\n    tls.createSecurityParameters(c, msg);\n  }\n\n  // set new session ID\n  c.session.id = sessionId;\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a server receives a ClientHello record.\n *\n * When a ClientHello message will be sent:\n *   When a client first connects to a server it is required to send the\n *   client hello as its first message. The client can also send a client\n *   hello in response to a hello request or on its own initiative in order\n *   to renegotiate the security parameters in an existing connection.\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleClientHello = function(c, record, length) {\n  var msg = tls.parseHelloMessage(c, record, length);\n  if(c.fail) {\n    return;\n  }\n\n  // get the session ID from the message\n  var sessionId = msg.session_id.bytes();\n\n  // see if the given session ID is in the cache\n  var session = null;\n  if(c.sessionCache) {\n    session = c.sessionCache.getSession(sessionId);\n    if(session === null) {\n      // session ID not found\n      sessionId = '';\n    } else if(session.version.major !== msg.version.major ||\n      session.version.minor > msg.version.minor) {\n      // if session version is incompatible with client version, do not resume\n      session = null;\n      sessionId = '';\n    }\n  }\n\n  // no session found to resume, generate a new session ID\n  if(sessionId.length === 0) {\n    sessionId = forge.random.getBytes(32);\n  }\n\n  // update session\n  c.session.id = sessionId;\n  c.session.clientHelloVersion = msg.version;\n  c.session.sp = {};\n  if(session) {\n    // use version and security parameters from resumed session\n    c.version = c.session.version = session.version;\n    c.session.sp = session.sp;\n  } else {\n    // use highest compatible minor version\n    var version;\n    for(var i = 1; i < tls.SupportedVersions.length; ++i) {\n      version = tls.SupportedVersions[i];\n      if(version.minor <= msg.version.minor) {\n        break;\n      }\n    }\n    c.version = {major: version.major, minor: version.minor};\n    c.session.version = c.version;\n  }\n\n  // if a session is set, resume it\n  if(session !== null) {\n    // resuming session, expect a ChangeCipherSpec next\n    c.expect = CCC;\n    c.session.resuming = true;\n\n    // get new client random\n    c.session.sp.client_random = msg.random.bytes();\n  } else {\n    // not resuming, expect a Certificate or ClientKeyExchange\n    c.expect = (c.verifyClient !== false) ? CCE : CKE;\n    c.session.resuming = false;\n\n    // create new security parameters\n    tls.createSecurityParameters(c, msg);\n  }\n\n  // connection now open\n  c.open = true;\n\n  // queue server hello\n  tls.queue(c, tls.createRecord(c, {\n    type: tls.ContentType.handshake,\n    data: tls.createServerHello(c)\n  }));\n\n  if(c.session.resuming) {\n    // queue change cipher spec message\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.change_cipher_spec,\n      data: tls.createChangeCipherSpec()\n    }));\n\n    // create pending state\n    c.state.pending = tls.createConnectionState(c);\n\n    // change current write state to pending write state\n    c.state.current.write = c.state.pending.write;\n\n    // queue finished\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.handshake,\n      data: tls.createFinished(c)\n    }));\n  } else {\n    // queue server certificate\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.handshake,\n      data: tls.createCertificate(c)\n    }));\n\n    if(!c.fail) {\n      // queue server key exchange\n      tls.queue(c, tls.createRecord(c, {\n        type: tls.ContentType.handshake,\n        data: tls.createServerKeyExchange(c)\n      }));\n\n      // request client certificate if set\n      if(c.verifyClient !== false) {\n        // queue certificate request\n        tls.queue(c, tls.createRecord(c, {\n          type: tls.ContentType.handshake,\n          data: tls.createCertificateRequest(c)\n        }));\n      }\n\n      // queue server hello done\n      tls.queue(c, tls.createRecord(c, {\n        type: tls.ContentType.handshake,\n        data: tls.createServerHelloDone(c)\n      }));\n    }\n  }\n\n  // send records\n  tls.flush(c);\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a client receives a Certificate record.\n *\n * When this message will be sent:\n *   The server must send a certificate whenever the agreed-upon key exchange\n *   method is not an anonymous one. This message will always immediately\n *   follow the server hello message.\n *\n * Meaning of this message:\n *   The certificate type must be appropriate for the selected cipher suite's\n *   key exchange algorithm, and is generally an X.509v3 certificate. It must\n *   contain a key which matches the key exchange method, as follows. Unless\n *   otherwise specified, the signing algorithm for the certificate must be\n *   the same as the algorithm for the certificate key. Unless otherwise\n *   specified, the public key may be of any length.\n *\n * opaque ASN.1Cert<1..2^24-1>;\n * struct {\n *   ASN.1Cert certificate_list<1..2^24-1>;\n * } Certificate;\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleCertificate = function(c, record, length) {\n  // minimum of 3 bytes in message\n  if(length < 3) {\n    return c.error(c, {\n      message: 'Invalid Certificate message. Message too short.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  }\n\n  var b = record.fragment;\n  var msg = {\n    certificate_list: readVector(b, 3)\n  };\n\n  /* The sender's certificate will be first in the list (chain), each\n    subsequent one that follows will certify the previous one, but root\n    certificates (self-signed) that specify the certificate authority may\n    be omitted under the assumption that clients must already possess it. */\n  var cert, asn1;\n  var certs = [];\n  try {\n    while(msg.certificate_list.length() > 0) {\n      // each entry in msg.certificate_list is a vector with 3 len bytes\n      cert = readVector(msg.certificate_list, 3);\n      asn1 = forge.asn1.fromDer(cert);\n      cert = forge.pki.certificateFromAsn1(asn1, true);\n      certs.push(cert);\n    }\n  } catch(ex) {\n    return c.error(c, {\n      message: 'Could not parse certificate list.',\n      cause: ex,\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.bad_certificate\n      }\n    });\n  }\n\n  // ensure at least 1 certificate was provided if in client-mode\n  // or if verifyClient was set to true to require a certificate\n  // (as opposed to 'optional')\n  var client = (c.entity === tls.ConnectionEnd.client);\n  if((client || c.verifyClient === true) && certs.length === 0) {\n    // error, no certificate\n    c.error(c, {\n      message: client ?\n        'No server certificate provided.' :\n        'No client certificate provided.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  } else if(certs.length === 0) {\n    // no certs to verify\n    // expect a ServerKeyExchange or ClientKeyExchange message next\n    c.expect = client ? SKE : CKE;\n  } else {\n    // save certificate in session\n    if(client) {\n      c.session.serverCertificate = certs[0];\n    } else {\n      c.session.clientCertificate = certs[0];\n    }\n\n    if(tls.verifyCertificateChain(c, certs)) {\n      // expect a ServerKeyExchange or ClientKeyExchange message next\n      c.expect = client ? SKE : CKE;\n    }\n  }\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a client receives a ServerKeyExchange record.\n *\n * When this message will be sent:\n *   This message will be sent immediately after the server certificate\n *   message (or the server hello message, if this is an anonymous\n *   negotiation).\n *\n *   The server key exchange message is sent by the server only when the\n *   server certificate message (if sent) does not contain enough data to\n *   allow the client to exchange a premaster secret.\n *\n * Meaning of this message:\n *   This message conveys cryptographic information to allow the client to\n *   communicate the premaster secret: either an RSA public key to encrypt\n *   the premaster secret with, or a Diffie-Hellman public key with which the\n *   client can complete a key exchange (with the result being the premaster\n *   secret.)\n *\n * enum {\n *   dhe_dss, dhe_rsa, dh_anon, rsa, dh_dss, dh_rsa\n * } KeyExchangeAlgorithm;\n *\n * struct {\n *   opaque dh_p<1..2^16-1>;\n *   opaque dh_g<1..2^16-1>;\n *   opaque dh_Ys<1..2^16-1>;\n * } ServerDHParams;\n *\n * struct {\n *   select(KeyExchangeAlgorithm) {\n *     case dh_anon:\n *       ServerDHParams params;\n *     case dhe_dss:\n *     case dhe_rsa:\n *       ServerDHParams params;\n *       digitally-signed struct {\n *         opaque client_random[32];\n *         opaque server_random[32];\n *         ServerDHParams params;\n *       } signed_params;\n *     case rsa:\n *     case dh_dss:\n *     case dh_rsa:\n *       struct {};\n *   };\n * } ServerKeyExchange;\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleServerKeyExchange = function(c, record, length) {\n  // this implementation only supports RSA, no Diffie-Hellman support\n  // so any length > 0 is invalid\n  if(length > 0) {\n    return c.error(c, {\n      message: 'Invalid key parameters. Only RSA is supported.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.unsupported_certificate\n      }\n    });\n  }\n\n  // expect an optional CertificateRequest message next\n  c.expect = SCR;\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a client receives a ClientKeyExchange record.\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleClientKeyExchange = function(c, record, length) {\n  // this implementation only supports RSA, no Diffie-Hellman support\n  // so any length < 48 is invalid\n  if(length < 48) {\n    return c.error(c, {\n      message: 'Invalid key parameters. Only RSA is supported.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.unsupported_certificate\n      }\n    });\n  }\n\n  var b = record.fragment;\n  var msg = {\n    enc_pre_master_secret: readVector(b, 2).getBytes()\n  };\n\n  // do rsa decryption\n  var privateKey = null;\n  if(c.getPrivateKey) {\n    try {\n      privateKey = c.getPrivateKey(c, c.session.serverCertificate);\n      privateKey = forge.pki.privateKeyFromPem(privateKey);\n    } catch(ex) {\n      c.error(c, {\n        message: 'Could not get private key.',\n        cause: ex,\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.internal_error\n        }\n      });\n    }\n  }\n\n  if(privateKey === null) {\n    return c.error(c, {\n      message: 'No private key set.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.internal_error\n      }\n    });\n  }\n\n  try {\n    // decrypt 48-byte pre-master secret\n    var sp = c.session.sp;\n    sp.pre_master_secret = privateKey.decrypt(msg.enc_pre_master_secret);\n\n    // ensure client hello version matches first 2 bytes\n    var version = c.session.clientHelloVersion;\n    if(version.major !== sp.pre_master_secret.charCodeAt(0) ||\n      version.minor !== sp.pre_master_secret.charCodeAt(1)) {\n      // error, do not send alert (see BLEI attack below)\n      throw new Error('TLS version rollback attack detected.');\n    }\n  } catch(ex) {\n    /* Note: Daniel Bleichenbacher [BLEI] can be used to attack a\n      TLS server which is using PKCS#1 encoded RSA, so instead of\n      failing here, we generate 48 random bytes and use that as\n      the pre-master secret. */\n    sp.pre_master_secret = forge.random.getBytes(48);\n  }\n\n  // expect a CertificateVerify message if a Certificate was received that\n  // does not have fixed Diffie-Hellman params, otherwise expect\n  // ChangeCipherSpec\n  c.expect = CCC;\n  if(c.session.clientCertificate !== null) {\n    // only RSA support, so expect CertificateVerify\n    // TODO: support Diffie-Hellman\n    c.expect = CCV;\n  }\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a client receives a CertificateRequest record.\n *\n * When this message will be sent:\n *   A non-anonymous server can optionally request a certificate from the\n *   client, if appropriate for the selected cipher suite. This message, if\n *   sent, will immediately follow the Server Key Exchange message (if it is\n *   sent; otherwise, the Server Certificate message).\n *\n * enum {\n *   rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4),\n *   rsa_ephemeral_dh_RESERVED(5), dss_ephemeral_dh_RESERVED(6),\n *   fortezza_dms_RESERVED(20), (255)\n * } ClientCertificateType;\n *\n * opaque DistinguishedName<1..2^16-1>;\n *\n * struct {\n *   ClientCertificateType certificate_types<1..2^8-1>;\n *   SignatureAndHashAlgorithm supported_signature_algorithms<2^16-1>;\n *   DistinguishedName certificate_authorities<0..2^16-1>;\n * } CertificateRequest;\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleCertificateRequest = function(c, record, length) {\n  // minimum of 3 bytes in message\n  if(length < 3) {\n    return c.error(c, {\n      message: 'Invalid CertificateRequest. Message too short.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  }\n\n  // TODO: TLS 1.2+ has different format including\n  // SignatureAndHashAlgorithm after cert types\n  var b = record.fragment;\n  var msg = {\n    certificate_types: readVector(b, 1),\n    certificate_authorities: readVector(b, 2)\n  };\n\n  // save certificate request in session\n  c.session.certificateRequest = msg;\n\n  // expect a ServerHelloDone message next\n  c.expect = SHD;\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a server receives a CertificateVerify record.\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleCertificateVerify = function(c, record, length) {\n  if(length < 2) {\n    return c.error(c, {\n      message: 'Invalid CertificateVerify. Message too short.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  }\n\n  // rewind to get full bytes for message so it can be manually\n  // digested below (special case for CertificateVerify messages because\n  // they must be digested *after* handling as opposed to all others)\n  var b = record.fragment;\n  b.read -= 4;\n  var msgBytes = b.bytes();\n  b.read += 4;\n\n  var msg = {\n    signature: readVector(b, 2).getBytes()\n  };\n\n  // TODO: add support for DSA\n\n  // generate data to verify\n  var verify = forge.util.createBuffer();\n  verify.putBuffer(c.session.md5.digest());\n  verify.putBuffer(c.session.sha1.digest());\n  verify = verify.getBytes();\n\n  try {\n    var cert = c.session.clientCertificate;\n    /*b = forge.pki.rsa.decrypt(\n      msg.signature, cert.publicKey, true, verify.length);\n    if(b !== verify) {*/\n    if(!cert.publicKey.verify(verify, msg.signature, 'NONE')) {\n      throw new Error('CertificateVerify signature does not match.');\n    }\n\n    // digest message now that it has been handled\n    c.session.md5.update(msgBytes);\n    c.session.sha1.update(msgBytes);\n  } catch(ex) {\n    return c.error(c, {\n      message: 'Bad signature in CertificateVerify.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.handshake_failure\n      }\n    });\n  }\n\n  // expect ChangeCipherSpec\n  c.expect = CCC;\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a client receives a ServerHelloDone record.\n *\n * When this message will be sent:\n *   The server hello done message is sent by the server to indicate the end\n *   of the server hello and associated messages. After sending this message\n *   the server will wait for a client response.\n *\n * Meaning of this message:\n *   This message means that the server is done sending messages to support\n *   the key exchange, and the client can proceed with its phase of the key\n *   exchange.\n *\n *   Upon receipt of the server hello done message the client should verify\n *   that the server provided a valid certificate if required and check that\n *   the server hello parameters are acceptable.\n *\n * struct {} ServerHelloDone;\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleServerHelloDone = function(c, record, length) {\n  // len must be 0 bytes\n  if(length > 0) {\n    return c.error(c, {\n      message: 'Invalid ServerHelloDone message. Invalid length.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.record_overflow\n      }\n    });\n  }\n\n  if(c.serverCertificate === null) {\n    // no server certificate was provided\n    var error = {\n      message: 'No server certificate provided. Not enough security.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.insufficient_security\n      }\n    };\n\n    // call application callback\n    var depth = 0;\n    var ret = c.verify(c, error.alert.description, depth, []);\n    if(ret !== true) {\n      // check for custom alert info\n      if(ret || ret === 0) {\n        // set custom message and alert description\n        if(typeof ret === 'object' && !forge.util.isArray(ret)) {\n          if(ret.message) {\n            error.message = ret.message;\n          }\n          if(ret.alert) {\n            error.alert.description = ret.alert;\n          }\n        } else if(typeof ret === 'number') {\n          // set custom alert description\n          error.alert.description = ret;\n        }\n      }\n\n      // send error\n      return c.error(c, error);\n    }\n  }\n\n  // create client certificate message if requested\n  if(c.session.certificateRequest !== null) {\n    record = tls.createRecord(c, {\n      type: tls.ContentType.handshake,\n      data: tls.createCertificate(c)\n    });\n    tls.queue(c, record);\n  }\n\n  // create client key exchange message\n  record = tls.createRecord(c, {\n     type: tls.ContentType.handshake,\n     data: tls.createClientKeyExchange(c)\n  });\n  tls.queue(c, record);\n\n  // expect no messages until the following callback has been called\n  c.expect = SER;\n\n  // create callback to handle client signature (for client-certs)\n  var callback = function(c, signature) {\n    if(c.session.certificateRequest !== null &&\n      c.session.clientCertificate !== null) {\n      // create certificate verify message\n      tls.queue(c, tls.createRecord(c, {\n        type: tls.ContentType.handshake,\n        data: tls.createCertificateVerify(c, signature)\n      }));\n    }\n\n    // create change cipher spec message\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.change_cipher_spec,\n      data: tls.createChangeCipherSpec()\n    }));\n\n    // create pending state\n    c.state.pending = tls.createConnectionState(c);\n\n    // change current write state to pending write state\n    c.state.current.write = c.state.pending.write;\n\n    // create finished message\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.handshake,\n      data: tls.createFinished(c)\n    }));\n\n    // expect a server ChangeCipherSpec message next\n    c.expect = SCC;\n\n    // send records\n    tls.flush(c);\n\n    // continue\n    c.process();\n  };\n\n  // if there is no certificate request or no client certificate, do\n  // callback immediately\n  if(c.session.certificateRequest === null ||\n    c.session.clientCertificate === null) {\n    return callback(c, null);\n  }\n\n  // otherwise get the client signature\n  tls.getClientSignature(c, callback);\n};\n\n/**\n * Called when a ChangeCipherSpec record is received.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleChangeCipherSpec = function(c, record) {\n  if(record.fragment.getByte() !== 0x01) {\n    return c.error(c, {\n      message: 'Invalid ChangeCipherSpec message received.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  }\n\n  // create pending state if:\n  // 1. Resuming session in client mode OR\n  // 2. NOT resuming session in server mode\n  var client = (c.entity === tls.ConnectionEnd.client);\n  if((c.session.resuming && client) || (!c.session.resuming && !client)) {\n    c.state.pending = tls.createConnectionState(c);\n  }\n\n  // change current read state to pending read state\n  c.state.current.read = c.state.pending.read;\n\n  // clear pending state if:\n  // 1. NOT resuming session in client mode OR\n  // 2. resuming a session in server mode\n  if((!c.session.resuming && client) || (c.session.resuming && !client)) {\n    c.state.pending = null;\n  }\n\n  // expect a Finished record next\n  c.expect = client ? SFI : CFI;\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a Finished record is received.\n *\n * When this message will be sent:\n *   A finished message is always sent immediately after a change\n *   cipher spec message to verify that the key exchange and\n *   authentication processes were successful. It is essential that a\n *   change cipher spec message be received between the other\n *   handshake messages and the Finished message.\n *\n * Meaning of this message:\n *   The finished message is the first protected with the just-\n *   negotiated algorithms, keys, and secrets. Recipients of finished\n *   messages must verify that the contents are correct.  Once a side\n *   has sent its Finished message and received and validated the\n *   Finished message from its peer, it may begin to send and receive\n *   application data over the connection.\n *\n * struct {\n *   opaque verify_data[verify_data_length];\n * } Finished;\n *\n * verify_data\n *   PRF(master_secret, finished_label, Hash(handshake_messages))\n *     [0..verify_data_length-1];\n *\n * finished_label\n *   For Finished messages sent by the client, the string\n *   \"client finished\". For Finished messages sent by the server, the\n *   string \"server finished\".\n *\n * verify_data_length depends on the cipher suite. If it is not specified\n * by the cipher suite, then it is 12. Versions of TLS < 1.2 always used\n * 12 bytes.\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleFinished = function(c, record, length) {\n  // rewind to get full bytes for message so it can be manually\n  // digested below (special case for Finished messages because they\n  // must be digested *after* handling as opposed to all others)\n  var b = record.fragment;\n  b.read -= 4;\n  var msgBytes = b.bytes();\n  b.read += 4;\n\n  // message contains only verify_data\n  var vd = record.fragment.getBytes();\n\n  // ensure verify data is correct\n  b = forge.util.createBuffer();\n  b.putBuffer(c.session.md5.digest());\n  b.putBuffer(c.session.sha1.digest());\n\n  // set label based on entity type\n  var client = (c.entity === tls.ConnectionEnd.client);\n  var label = client ? 'server finished' : 'client finished';\n\n  // TODO: determine prf function and verify length for TLS 1.2\n  var sp = c.session.sp;\n  var vdl = 12;\n  var prf = prf_TLS1;\n  b = prf(sp.master_secret, label, b.getBytes(), vdl);\n  if(b.getBytes() !== vd) {\n    return c.error(c, {\n      message: 'Invalid verify_data in Finished message.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.decrypt_error\n      }\n    });\n  }\n\n  // digest finished message now that it has been handled\n  c.session.md5.update(msgBytes);\n  c.session.sha1.update(msgBytes);\n\n  // resuming session as client or NOT resuming session as server\n  if((c.session.resuming && client) || (!c.session.resuming && !client)) {\n    // create change cipher spec message\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.change_cipher_spec,\n      data: tls.createChangeCipherSpec()\n    }));\n\n    // change current write state to pending write state, clear pending\n    c.state.current.write = c.state.pending.write;\n    c.state.pending = null;\n\n    // create finished message\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.handshake,\n      data: tls.createFinished(c)\n    }));\n  }\n\n  // expect application data next\n  c.expect = client ? SAD : CAD;\n\n  // handshake complete\n  c.handshaking = false;\n  ++c.handshakes;\n\n  // save access to peer certificate\n  c.peerCertificate = client ?\n    c.session.serverCertificate : c.session.clientCertificate;\n\n  // send records\n  tls.flush(c);\n\n  // now connected\n  c.isConnected = true;\n  c.connected(c);\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when an Alert record is received.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleAlert = function(c, record) {\n  // read alert\n  var b = record.fragment;\n  var alert = {\n    level: b.getByte(),\n    description: b.getByte()\n  };\n\n  // TODO: consider using a table?\n  // get appropriate message\n  var msg;\n  switch(alert.description) {\n  case tls.Alert.Description.close_notify:\n    msg = 'Connection closed.';\n    break;\n  case tls.Alert.Description.unexpected_message:\n    msg = 'Unexpected message.';\n    break;\n  case tls.Alert.Description.bad_record_mac:\n    msg = 'Bad record MAC.';\n    break;\n  case tls.Alert.Description.decryption_failed:\n    msg = 'Decryption failed.';\n    break;\n  case tls.Alert.Description.record_overflow:\n    msg = 'Record overflow.';\n    break;\n  case tls.Alert.Description.decompression_failure:\n    msg = 'Decompression failed.';\n    break;\n  case tls.Alert.Description.handshake_failure:\n    msg = 'Handshake failure.';\n    break;\n  case tls.Alert.Description.bad_certificate:\n    msg = 'Bad certificate.';\n    break;\n  case tls.Alert.Description.unsupported_certificate:\n    msg = 'Unsupported certificate.';\n    break;\n  case tls.Alert.Description.certificate_revoked:\n    msg = 'Certificate revoked.';\n    break;\n  case tls.Alert.Description.certificate_expired:\n    msg = 'Certificate expired.';\n    break;\n  case tls.Alert.Description.certificate_unknown:\n    msg = 'Certificate unknown.';\n    break;\n  case tls.Alert.Description.illegal_parameter:\n    msg = 'Illegal parameter.';\n    break;\n  case tls.Alert.Description.unknown_ca:\n    msg = 'Unknown certificate authority.';\n    break;\n  case tls.Alert.Description.access_denied:\n    msg = 'Access denied.';\n    break;\n  case tls.Alert.Description.decode_error:\n    msg = 'Decode error.';\n    break;\n  case tls.Alert.Description.decrypt_error:\n    msg = 'Decrypt error.';\n    break;\n  case tls.Alert.Description.export_restriction:\n    msg = 'Export restriction.';\n    break;\n  case tls.Alert.Description.protocol_version:\n    msg = 'Unsupported protocol version.';\n    break;\n  case tls.Alert.Description.insufficient_security:\n    msg = 'Insufficient security.';\n    break;\n  case tls.Alert.Description.internal_error:\n    msg = 'Internal error.';\n    break;\n  case tls.Alert.Description.user_canceled:\n    msg = 'User canceled.';\n    break;\n  case tls.Alert.Description.no_renegotiation:\n    msg = 'Renegotiation not supported.';\n    break;\n  default:\n    msg = 'Unknown error.';\n    break;\n  }\n\n  // close connection on close_notify, not an error\n  if(alert.description === tls.Alert.Description.close_notify) {\n    return c.close();\n  }\n\n  // call error handler\n  c.error(c, {\n    message: msg,\n    send: false,\n    // origin is the opposite end\n    origin: (c.entity === tls.ConnectionEnd.client) ? 'server' : 'client',\n    alert: alert\n  });\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a Handshake record is received.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleHandshake = function(c, record) {\n  // get the handshake type and message length\n  var b = record.fragment;\n  var type = b.getByte();\n  var length = b.getInt24();\n\n  // see if the record fragment doesn't yet contain the full message\n  if(length > b.length()) {\n    // cache the record, clear its fragment, and reset the buffer read\n    // pointer before the type and length were read\n    c.fragmented = record;\n    record.fragment = forge.util.createBuffer();\n    b.read -= 4;\n\n    // continue\n    return c.process();\n  }\n\n  // full message now available, clear cache, reset read pointer to\n  // before type and length\n  c.fragmented = null;\n  b.read -= 4;\n\n  // save the handshake bytes for digestion after handler is found\n  // (include type and length of handshake msg)\n  var bytes = b.bytes(length + 4);\n\n  // restore read pointer\n  b.read += 4;\n\n  // handle expected message\n  if(type in hsTable[c.entity][c.expect]) {\n    // initialize server session\n    if(c.entity === tls.ConnectionEnd.server && !c.open && !c.fail) {\n      c.handshaking = true;\n      c.session = {\n        version: null,\n        extensions: {\n          server_name: {\n            serverNameList: []\n          }\n        },\n        cipherSuite: null,\n        compressionMethod: null,\n        serverCertificate: null,\n        clientCertificate: null,\n        md5: forge.md.md5.create(),\n        sha1: forge.md.sha1.create()\n      };\n    }\n\n    /* Update handshake messages digest. Finished and CertificateVerify\n      messages are not digested here. They can't be digested as part of\n      the verify_data that they contain. These messages are manually\n      digested in their handlers. HelloRequest messages are simply never\n      included in the handshake message digest according to spec. */\n    if(type !== tls.HandshakeType.hello_request &&\n      type !== tls.HandshakeType.certificate_verify &&\n      type !== tls.HandshakeType.finished) {\n      c.session.md5.update(bytes);\n      c.session.sha1.update(bytes);\n    }\n\n    // handle specific handshake type record\n    hsTable[c.entity][c.expect][type](c, record, length);\n  } else {\n    // unexpected record\n    tls.handleUnexpected(c, record);\n  }\n};\n\n/**\n * Called when an ApplicationData record is received.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleApplicationData = function(c, record) {\n  // buffer data, notify that its ready\n  c.data.putBuffer(record.fragment);\n  c.dataReady(c);\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a Heartbeat record is received.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleHeartbeat = function(c, record) {\n  // get the heartbeat type and payload\n  var b = record.fragment;\n  var type = b.getByte();\n  var length = b.getInt16();\n  var payload = b.getBytes(length);\n\n  if(type === tls.HeartbeatMessageType.heartbeat_request) {\n    // discard request during handshake or if length is too large\n    if(c.handshaking || length > payload.length) {\n      // continue\n      return c.process();\n    }\n    // retransmit payload\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.heartbeat,\n      data: tls.createHeartbeat(\n        tls.HeartbeatMessageType.heartbeat_response, payload)\n    }));\n    tls.flush(c);\n  } else if(type === tls.HeartbeatMessageType.heartbeat_response) {\n    // check payload against expected payload, discard heartbeat if no match\n    if(payload !== c.expectedHeartbeatPayload) {\n      // continue\n      return c.process();\n    }\n\n    // notify that a valid heartbeat was received\n    if(c.heartbeatReceived) {\n      c.heartbeatReceived(c, forge.util.createBuffer(payload));\n    }\n  }\n\n  // continue\n  c.process();\n};\n\n/**\n * The transistional state tables for receiving TLS records. It maps the\n * current TLS engine state and a received record to a function to handle the\n * record and update the state.\n *\n * For instance, if the current state is SHE, then the TLS engine is expecting\n * a ServerHello record. Once a record is received, the handler function is\n * looked up using the state SHE and the record's content type.\n *\n * The resulting function will either be an error handler or a record handler.\n * The function will take whatever action is appropriate and update the state\n * for the next record.\n *\n * The states are all based on possible server record types. Note that the\n * client will never specifically expect to receive a HelloRequest or an alert\n * from the server so there is no state that reflects this. These messages may\n * occur at any time.\n *\n * There are two tables for mapping states because there is a second tier of\n * types for handshake messages. Once a record with a content type of handshake\n * is received, the handshake record handler will look up the handshake type in\n * the secondary map to get its appropriate handler.\n *\n * Valid message orders are as follows:\n *\n * =======================FULL HANDSHAKE======================\n * Client                                               Server\n *\n * ClientHello                  -------->\n *                                                 ServerHello\n *                                                Certificate*\n *                                          ServerKeyExchange*\n *                                         CertificateRequest*\n *                              <--------      ServerHelloDone\n * Certificate*\n * ClientKeyExchange\n * CertificateVerify*\n * [ChangeCipherSpec]\n * Finished                     -------->\n *                                          [ChangeCipherSpec]\n *                              <--------             Finished\n * Application Data             <------->     Application Data\n *\n * =====================SESSION RESUMPTION=====================\n * Client                                                Server\n *\n * ClientHello                   -------->\n *                                                  ServerHello\n *                                           [ChangeCipherSpec]\n *                               <--------             Finished\n * [ChangeCipherSpec]\n * Finished                      -------->\n * Application Data              <------->     Application Data\n */\n// client expect states (indicate which records are expected to be received)\nvar SHE = 0; // rcv server hello\nvar SCE = 1; // rcv server certificate\nvar SKE = 2; // rcv server key exchange\nvar SCR = 3; // rcv certificate request\nvar SHD = 4; // rcv server hello done\nvar SCC = 5; // rcv change cipher spec\nvar SFI = 6; // rcv finished\nvar SAD = 7; // rcv application data\nvar SER = 8; // not expecting any messages at this point\n\n// server expect states\nvar CHE = 0; // rcv client hello\nvar CCE = 1; // rcv client certificate\nvar CKE = 2; // rcv client key exchange\nvar CCV = 3; // rcv certificate verify\nvar CCC = 4; // rcv change cipher spec\nvar CFI = 5; // rcv finished\nvar CAD = 6; // rcv application data\nvar CER = 7; // not expecting any messages at this point\n\n// map client current expect state and content type to function\nvar __ = tls.handleUnexpected;\nvar R0 = tls.handleChangeCipherSpec;\nvar R1 = tls.handleAlert;\nvar R2 = tls.handleHandshake;\nvar R3 = tls.handleApplicationData;\nvar R4 = tls.handleHeartbeat;\nvar ctTable = [];\nctTable[tls.ConnectionEnd.client] = [\n//      CC,AL,HS,AD,HB\n/*SHE*/[__,R1,R2,__,R4],\n/*SCE*/[__,R1,R2,__,R4],\n/*SKE*/[__,R1,R2,__,R4],\n/*SCR*/[__,R1,R2,__,R4],\n/*SHD*/[__,R1,R2,__,R4],\n/*SCC*/[R0,R1,__,__,R4],\n/*SFI*/[__,R1,R2,__,R4],\n/*SAD*/[__,R1,R2,R3,R4],\n/*SER*/[__,R1,R2,__,R4]\n];\n\n// map server current expect state and content type to function\nctTable[tls.ConnectionEnd.server] = [\n//      CC,AL,HS,AD\n/*CHE*/[__,R1,R2,__,R4],\n/*CCE*/[__,R1,R2,__,R4],\n/*CKE*/[__,R1,R2,__,R4],\n/*CCV*/[__,R1,R2,__,R4],\n/*CCC*/[R0,R1,__,__,R4],\n/*CFI*/[__,R1,R2,__,R4],\n/*CAD*/[__,R1,R2,R3,R4],\n/*CER*/[__,R1,R2,__,R4]\n];\n\n// map client current expect state and handshake type to function\nvar H0 = tls.handleHelloRequest;\nvar H1 = tls.handleServerHello;\nvar H2 = tls.handleCertificate;\nvar H3 = tls.handleServerKeyExchange;\nvar H4 = tls.handleCertificateRequest;\nvar H5 = tls.handleServerHelloDone;\nvar H6 = tls.handleFinished;\nvar hsTable = [];\nhsTable[tls.ConnectionEnd.client] = [\n//      HR,01,SH,03,04,05,06,07,08,09,10,SC,SK,CR,HD,15,CK,17,18,19,FI\n/*SHE*/[__,__,H1,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*SCE*/[H0,__,__,__,__,__,__,__,__,__,__,H2,H3,H4,H5,__,__,__,__,__,__],\n/*SKE*/[H0,__,__,__,__,__,__,__,__,__,__,__,H3,H4,H5,__,__,__,__,__,__],\n/*SCR*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,H4,H5,__,__,__,__,__,__],\n/*SHD*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,__,H5,__,__,__,__,__,__],\n/*SCC*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*SFI*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,H6],\n/*SAD*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*SER*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__]\n];\n\n// map server current expect state and handshake type to function\n// Note: CAD[CH] does not map to FB because renegotation is prohibited\nvar H7 = tls.handleClientHello;\nvar H8 = tls.handleClientKeyExchange;\nvar H9 = tls.handleCertificateVerify;\nhsTable[tls.ConnectionEnd.server] = [\n//      01,CH,02,03,04,05,06,07,08,09,10,CC,12,13,14,CV,CK,17,18,19,FI\n/*CHE*/[__,H7,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*CCE*/[__,__,__,__,__,__,__,__,__,__,__,H2,__,__,__,__,__,__,__,__,__],\n/*CKE*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,H8,__,__,__,__],\n/*CCV*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,H9,__,__,__,__,__],\n/*CCC*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*CFI*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,H6],\n/*CAD*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*CER*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__]\n];\n\n/**\n * Generates the master_secret and keys using the given security parameters.\n *\n * The security parameters for a TLS connection state are defined as such:\n *\n * struct {\n *   ConnectionEnd          entity;\n *   PRFAlgorithm           prf_algorithm;\n *   BulkCipherAlgorithm    bulk_cipher_algorithm;\n *   CipherType             cipher_type;\n *   uint8                  enc_key_length;\n *   uint8                  block_length;\n *   uint8                  fixed_iv_length;\n *   uint8                  record_iv_length;\n *   MACAlgorithm           mac_algorithm;\n *   uint8                  mac_length;\n *   uint8                  mac_key_length;\n *   CompressionMethod      compression_algorithm;\n *   opaque                 master_secret[48];\n *   opaque                 client_random[32];\n *   opaque                 server_random[32];\n * } SecurityParameters;\n *\n * Note that this definition is from TLS 1.2. In TLS 1.0 some of these\n * parameters are ignored because, for instance, the PRFAlgorithm is a\n * builtin-fixed algorithm combining iterations of MD5 and SHA-1 in TLS 1.0.\n *\n * The Record Protocol requires an algorithm to generate keys required by the\n * current connection state.\n *\n * The master secret is expanded into a sequence of secure bytes, which is then\n * split to a client write MAC key, a server write MAC key, a client write\n * encryption key, and a server write encryption key. In TLS 1.0 a client write\n * IV and server write IV are also generated. Each of these is generated from\n * the byte sequence in that order. Unused values are empty. In TLS 1.2, some\n * AEAD ciphers may additionally require a client write IV and a server write\n * IV (see Section 6.2.3.3).\n *\n * When keys, MAC keys, and IVs are generated, the master secret is used as an\n * entropy source.\n *\n * To generate the key material, compute:\n *\n * master_secret = PRF(pre_master_secret, \"master secret\",\n *                     ClientHello.random + ServerHello.random)\n *\n * key_block = PRF(SecurityParameters.master_secret,\n *                 \"key expansion\",\n *                 SecurityParameters.server_random +\n *                 SecurityParameters.client_random);\n *\n * until enough output has been generated. Then, the key_block is\n * partitioned as follows:\n *\n * client_write_MAC_key[SecurityParameters.mac_key_length]\n * server_write_MAC_key[SecurityParameters.mac_key_length]\n * client_write_key[SecurityParameters.enc_key_length]\n * server_write_key[SecurityParameters.enc_key_length]\n * client_write_IV[SecurityParameters.fixed_iv_length]\n * server_write_IV[SecurityParameters.fixed_iv_length]\n *\n * In TLS 1.2, the client_write_IV and server_write_IV are only generated for\n * implicit nonce techniques as described in Section 3.2.1 of [AEAD]. This\n * implementation uses TLS 1.0 so IVs are generated.\n *\n * Implementation note: The currently defined cipher suite which requires the\n * most material is AES_256_CBC_SHA256. It requires 2 x 32 byte keys and 2 x 32\n * byte MAC keys, for a total 128 bytes of key material. In TLS 1.0 it also\n * requires 2 x 16 byte IVs, so it actually takes 160 bytes of key material.\n *\n * @param c the connection.\n * @param sp the security parameters to use.\n *\n * @return the security keys.\n */\ntls.generateKeys = function(c, sp) {\n  // TLS_RSA_WITH_AES_128_CBC_SHA (required to be compliant with TLS 1.2) &\n  // TLS_RSA_WITH_AES_256_CBC_SHA are the only cipher suites implemented\n  // at present\n\n  // TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA is required to be compliant with\n  // TLS 1.0 but we don't care right now because AES is better and we have\n  // an implementation for it\n\n  // TODO: TLS 1.2 implementation\n  /*\n  // determine the PRF\n  var prf;\n  switch(sp.prf_algorithm) {\n  case tls.PRFAlgorithm.tls_prf_sha256:\n    prf = prf_sha256;\n    break;\n  default:\n    // should never happen\n    throw new Error('Invalid PRF');\n  }\n  */\n\n  // TLS 1.0/1.1 implementation\n  var prf = prf_TLS1;\n\n  // concatenate server and client random\n  var random = sp.client_random + sp.server_random;\n\n  // only create master secret if session is new\n  if(!c.session.resuming) {\n    // create master secret, clean up pre-master secret\n    sp.master_secret = prf(\n      sp.pre_master_secret, 'master secret', random, 48).bytes();\n    sp.pre_master_secret = null;\n  }\n\n  // generate the amount of key material needed\n  random = sp.server_random + sp.client_random;\n  var length = 2 * sp.mac_key_length + 2 * sp.enc_key_length;\n\n  // include IV for TLS/1.0\n  var tls10 = (c.version.major === tls.Versions.TLS_1_0.major &&\n    c.version.minor === tls.Versions.TLS_1_0.minor);\n  if(tls10) {\n    length += 2 * sp.fixed_iv_length;\n  }\n  var km = prf(sp.master_secret, 'key expansion', random, length);\n\n  // split the key material into the MAC and encryption keys\n  var rval = {\n    client_write_MAC_key: km.getBytes(sp.mac_key_length),\n    server_write_MAC_key: km.getBytes(sp.mac_key_length),\n    client_write_key: km.getBytes(sp.enc_key_length),\n    server_write_key: km.getBytes(sp.enc_key_length)\n  };\n\n  // include TLS 1.0 IVs\n  if(tls10) {\n    rval.client_write_IV = km.getBytes(sp.fixed_iv_length);\n    rval.server_write_IV = km.getBytes(sp.fixed_iv_length);\n  }\n\n  return rval;\n};\n\n/**\n * Creates a new initialized TLS connection state. A connection state has\n * a read mode and a write mode.\n *\n * compression state:\n *   The current state of the compression algorithm.\n *\n * cipher state:\n *   The current state of the encryption algorithm. This will consist of the\n *   scheduled key for that connection. For stream ciphers, this will also\n *   contain whatever state information is necessary to allow the stream to\n *   continue to encrypt or decrypt data.\n *\n * MAC key:\n *   The MAC key for the connection.\n *\n * sequence number:\n *   Each connection state contains a sequence number, which is maintained\n *   separately for read and write states. The sequence number MUST be set to\n *   zero whenever a connection state is made the active state. Sequence\n *   numbers are of type uint64 and may not exceed 2^64-1. Sequence numbers do\n *   not wrap. If a TLS implementation would need to wrap a sequence number,\n *   it must renegotiate instead. A sequence number is incremented after each\n *   record: specifically, the first record transmitted under a particular\n *   connection state MUST use sequence number 0.\n *\n * @param c the connection.\n *\n * @return the new initialized TLS connection state.\n */\ntls.createConnectionState = function(c) {\n  var client = (c.entity === tls.ConnectionEnd.client);\n\n  var createMode = function() {\n    var mode = {\n      // two 32-bit numbers, first is most significant\n      sequenceNumber: [0, 0],\n      macKey: null,\n      macLength: 0,\n      macFunction: null,\n      cipherState: null,\n      cipherFunction: function(record) {return true;},\n      compressionState: null,\n      compressFunction: function(record) {return true;},\n      updateSequenceNumber: function() {\n        if(mode.sequenceNumber[1] === 0xFFFFFFFF) {\n          mode.sequenceNumber[1] = 0;\n          ++mode.sequenceNumber[0];\n        } else {\n          ++mode.sequenceNumber[1];\n        }\n      }\n    };\n    return mode;\n  };\n  var state = {\n    read: createMode(),\n    write: createMode()\n  };\n\n  // update function in read mode will decrypt then decompress a record\n  state.read.update = function(c, record) {\n    if(!state.read.cipherFunction(record, state.read)) {\n      c.error(c, {\n        message: 'Could not decrypt record or bad MAC.',\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          // doesn't matter if decryption failed or MAC was\n          // invalid, return the same error so as not to reveal\n          // which one occurred\n          description: tls.Alert.Description.bad_record_mac\n        }\n      });\n    } else if(!state.read.compressFunction(c, record, state.read)) {\n      c.error(c, {\n        message: 'Could not decompress record.',\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.decompression_failure\n        }\n      });\n    }\n    return !c.fail;\n  };\n\n  // update function in write mode will compress then encrypt a record\n  state.write.update = function(c, record) {\n    if(!state.write.compressFunction(c, record, state.write)) {\n      // error, but do not send alert since it would require\n      // compression as well\n      c.error(c, {\n        message: 'Could not compress record.',\n        send: false,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.internal_error\n        }\n      });\n    } else if(!state.write.cipherFunction(record, state.write)) {\n      // error, but do not send alert since it would require\n      // encryption as well\n      c.error(c, {\n        message: 'Could not encrypt record.',\n        send: false,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.internal_error\n        }\n      });\n    }\n    return !c.fail;\n  };\n\n  // handle security parameters\n  if(c.session) {\n    var sp = c.session.sp;\n    c.session.cipherSuite.initSecurityParameters(sp);\n\n    // generate keys\n    sp.keys = tls.generateKeys(c, sp);\n    state.read.macKey = client ?\n      sp.keys.server_write_MAC_key : sp.keys.client_write_MAC_key;\n    state.write.macKey = client ?\n      sp.keys.client_write_MAC_key : sp.keys.server_write_MAC_key;\n\n    // cipher suite setup\n    c.session.cipherSuite.initConnectionState(state, c, sp);\n\n    // compression setup\n    switch(sp.compression_algorithm) {\n    case tls.CompressionMethod.none:\n      break;\n    case tls.CompressionMethod.deflate:\n      state.read.compressFunction = inflate;\n      state.write.compressFunction = deflate;\n      break;\n    default:\n      throw new Error('Unsupported compression algorithm.');\n    }\n  }\n\n  return state;\n};\n\n/**\n * Creates a Random structure.\n *\n * struct {\n *   uint32 gmt_unix_time;\n *   opaque random_bytes[28];\n * } Random;\n *\n * gmt_unix_time:\n *   The current time and date in standard UNIX 32-bit format (seconds since\n *   the midnight starting Jan 1, 1970, UTC, ignoring leap seconds) according\n *   to the sender's internal clock. Clocks are not required to be set\n *   correctly by the basic TLS protocol; higher-level or application\n *   protocols may define additional requirements. Note that, for historical\n *   reasons, the data element is named using GMT, the predecessor of the\n *   current worldwide time base, UTC.\n * random_bytes:\n *   28 bytes generated by a secure random number generator.\n *\n * @return the Random structure as a byte array.\n */\ntls.createRandom = function() {\n  // get UTC milliseconds\n  var d = new Date();\n  var utc = +d + d.getTimezoneOffset() * 60000;\n  var rval = forge.util.createBuffer();\n  rval.putInt32(utc);\n  rval.putBytes(forge.random.getBytes(28));\n  return rval;\n};\n\n/**\n * Creates a TLS record with the given type and data.\n *\n * @param c the connection.\n * @param options:\n *   type: the record type.\n *   data: the plain text data in a byte buffer.\n *\n * @return the created record.\n */\ntls.createRecord = function(c, options) {\n  if(!options.data) {\n    return null;\n  }\n  var record = {\n    type: options.type,\n    version: {\n      major: c.version.major,\n      minor: c.version.minor\n    },\n    length: options.data.length(),\n    fragment: options.data\n  };\n  return record;\n};\n\n/**\n * Creates a TLS alert record.\n *\n * @param c the connection.\n * @param alert:\n *   level: the TLS alert level.\n *   description: the TLS alert description.\n *\n * @return the created alert record.\n */\ntls.createAlert = function(c, alert) {\n  var b = forge.util.createBuffer();\n  b.putByte(alert.level);\n  b.putByte(alert.description);\n  return tls.createRecord(c, {\n    type: tls.ContentType.alert,\n    data: b\n  });\n};\n\n/* The structure of a TLS handshake message.\n *\n * struct {\n *    HandshakeType msg_type;    // handshake type\n *    uint24 length;             // bytes in message\n *    select(HandshakeType) {\n *       case hello_request:       HelloRequest;\n *       case client_hello:        ClientHello;\n *       case server_hello:        ServerHello;\n *       case certificate:         Certificate;\n *       case server_key_exchange: ServerKeyExchange;\n *       case certificate_request: CertificateRequest;\n *       case server_hello_done:   ServerHelloDone;\n *       case certificate_verify:  CertificateVerify;\n *       case client_key_exchange: ClientKeyExchange;\n *       case finished:            Finished;\n *    } body;\n * } Handshake;\n */\n\n/**\n * Creates a ClientHello message.\n *\n * opaque SessionID<0..32>;\n * enum { null(0), deflate(1), (255) } CompressionMethod;\n * uint8 CipherSuite[2];\n *\n * struct {\n *   ProtocolVersion client_version;\n *   Random random;\n *   SessionID session_id;\n *   CipherSuite cipher_suites<2..2^16-2>;\n *   CompressionMethod compression_methods<1..2^8-1>;\n *   select(extensions_present) {\n *     case false:\n *       struct {};\n *     case true:\n *       Extension extensions<0..2^16-1>;\n *   };\n * } ClientHello;\n *\n * The extension format for extended client hellos and server hellos is:\n *\n * struct {\n *   ExtensionType extension_type;\n *   opaque extension_data<0..2^16-1>;\n * } Extension;\n *\n * Here:\n *\n * - \"extension_type\" identifies the particular extension type.\n * - \"extension_data\" contains information specific to the particular\n * extension type.\n *\n * The extension types defined in this document are:\n *\n * enum {\n *   server_name(0), max_fragment_length(1),\n *   client_certificate_url(2), trusted_ca_keys(3),\n *   truncated_hmac(4), status_request(5), (65535)\n * } ExtensionType;\n *\n * @param c the connection.\n *\n * @return the ClientHello byte buffer.\n */\ntls.createClientHello = function(c) {\n  // save hello version\n  c.session.clientHelloVersion = {\n    major: c.version.major,\n    minor: c.version.minor\n  };\n\n  // create supported cipher suites\n  var cipherSuites = forge.util.createBuffer();\n  for(var i = 0; i < c.cipherSuites.length; ++i) {\n    var cs = c.cipherSuites[i];\n    cipherSuites.putByte(cs.id[0]);\n    cipherSuites.putByte(cs.id[1]);\n  }\n  var cSuites = cipherSuites.length();\n\n  // create supported compression methods, null always supported, but\n  // also support deflate if connection has inflate and deflate methods\n  var compressionMethods = forge.util.createBuffer();\n  compressionMethods.putByte(tls.CompressionMethod.none);\n  // FIXME: deflate support disabled until issues with raw deflate data\n  // without zlib headers are resolved\n  /*\n  if(c.inflate !== null && c.deflate !== null) {\n    compressionMethods.putByte(tls.CompressionMethod.deflate);\n  }\n  */\n  var cMethods = compressionMethods.length();\n\n  // create TLS SNI (server name indication) extension if virtual host\n  // has been specified, see RFC 3546\n  var extensions = forge.util.createBuffer();\n  if(c.virtualHost) {\n    // create extension struct\n    var ext = forge.util.createBuffer();\n    ext.putByte(0x00); // type server_name (ExtensionType is 2 bytes)\n    ext.putByte(0x00);\n\n    /* In order to provide the server name, clients MAY include an\n     * extension of type \"server_name\" in the (extended) client hello.\n     * The \"extension_data\" field of this extension SHALL contain\n     * \"ServerNameList\" where:\n     *\n     * struct {\n     *   NameType name_type;\n     *   select(name_type) {\n     *     case host_name: HostName;\n     *   } name;\n     * } ServerName;\n     *\n     * enum {\n     *   host_name(0), (255)\n     * } NameType;\n     *\n     * opaque HostName<1..2^16-1>;\n     *\n     * struct {\n     *   ServerName server_name_list<1..2^16-1>\n     * } ServerNameList;\n     */\n    var serverName = forge.util.createBuffer();\n    serverName.putByte(0x00); // type host_name\n    writeVector(serverName, 2, forge.util.createBuffer(c.virtualHost));\n\n    // ServerNameList is in extension_data\n    var snList = forge.util.createBuffer();\n    writeVector(snList, 2, serverName);\n    writeVector(ext, 2, snList);\n    extensions.putBuffer(ext);\n  }\n  var extLength = extensions.length();\n  if(extLength > 0) {\n    // add extension vector length\n    extLength += 2;\n  }\n\n  // determine length of the handshake message\n  // cipher suites and compression methods size will need to be\n  // updated if more get added to the list\n  var sessionId = c.session.id;\n  var length =\n    sessionId.length + 1 + // session ID vector\n    2 +                    // version (major + minor)\n    4 + 28 +               // random time and random bytes\n    2 + cSuites +          // cipher suites vector\n    1 + cMethods +         // compression methods vector\n    extLength;             // extensions vector\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.client_hello);\n  rval.putInt24(length);                     // handshake length\n  rval.putByte(c.version.major);             // major version\n  rval.putByte(c.version.minor);             // minor version\n  rval.putBytes(c.session.sp.client_random); // random time + bytes\n  writeVector(rval, 1, forge.util.createBuffer(sessionId));\n  writeVector(rval, 2, cipherSuites);\n  writeVector(rval, 1, compressionMethods);\n  if(extLength > 0) {\n    writeVector(rval, 2, extensions);\n  }\n  return rval;\n};\n\n/**\n * Creates a ServerHello message.\n *\n * @param c the connection.\n *\n * @return the ServerHello byte buffer.\n */\ntls.createServerHello = function(c) {\n  // determine length of the handshake message\n  var sessionId = c.session.id;\n  var length =\n    sessionId.length + 1 + // session ID vector\n    2 +                    // version (major + minor)\n    4 + 28 +               // random time and random bytes\n    2 +                    // chosen cipher suite\n    1;                     // chosen compression method\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.server_hello);\n  rval.putInt24(length);                     // handshake length\n  rval.putByte(c.version.major);             // major version\n  rval.putByte(c.version.minor);             // minor version\n  rval.putBytes(c.session.sp.server_random); // random time + bytes\n  writeVector(rval, 1, forge.util.createBuffer(sessionId));\n  rval.putByte(c.session.cipherSuite.id[0]);\n  rval.putByte(c.session.cipherSuite.id[1]);\n  rval.putByte(c.session.compressionMethod);\n  return rval;\n};\n\n/**\n * Creates a Certificate message.\n *\n * When this message will be sent:\n *   This is the first message the client can send after receiving a server\n *   hello done message and the first message the server can send after\n *   sending a ServerHello. This client message is only sent if the server\n *   requests a certificate. If no suitable certificate is available, the\n *   client should send a certificate message containing no certificates. If\n *   client authentication is required by the server for the handshake to\n *   continue, it may respond with a fatal handshake failure alert.\n *\n * opaque ASN.1Cert<1..2^24-1>;\n *\n * struct {\n *   ASN.1Cert certificate_list<0..2^24-1>;\n * } Certificate;\n *\n * @param c the connection.\n *\n * @return the Certificate byte buffer.\n */\ntls.createCertificate = function(c) {\n  // TODO: check certificate request to ensure types are supported\n\n  // get a certificate (a certificate as a PEM string)\n  var client = (c.entity === tls.ConnectionEnd.client);\n  var cert = null;\n  if(c.getCertificate) {\n    var hint;\n    if(client) {\n      hint = c.session.certificateRequest;\n    } else {\n      hint = c.session.extensions.server_name.serverNameList;\n    }\n    cert = c.getCertificate(c, hint);\n  }\n\n  // buffer to hold certificate list\n  var certList = forge.util.createBuffer();\n  if(cert !== null) {\n    try {\n      // normalize cert to a chain of certificates\n      if(!forge.util.isArray(cert)) {\n        cert = [cert];\n      }\n      var asn1 = null;\n      for(var i = 0; i < cert.length; ++i) {\n        var msg = forge.pem.decode(cert[i])[0];\n        if(msg.type !== 'CERTIFICATE' &&\n          msg.type !== 'X509 CERTIFICATE' &&\n          msg.type !== 'TRUSTED CERTIFICATE') {\n          var error = new Error('Could not convert certificate from PEM; PEM ' +\n            'header type is not \"CERTIFICATE\", \"X509 CERTIFICATE\", or ' +\n            '\"TRUSTED CERTIFICATE\".');\n          error.headerType = msg.type;\n          throw error;\n        }\n        if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n          throw new Error('Could not convert certificate from PEM; PEM is encrypted.');\n        }\n\n        var der = forge.util.createBuffer(msg.body);\n        if(asn1 === null) {\n          asn1 = forge.asn1.fromDer(der.bytes(), false);\n        }\n\n        // certificate entry is itself a vector with 3 length bytes\n        var certBuffer = forge.util.createBuffer();\n        writeVector(certBuffer, 3, der);\n\n        // add cert vector to cert list vector\n        certList.putBuffer(certBuffer);\n      }\n\n      // save certificate\n      cert = forge.pki.certificateFromAsn1(asn1);\n      if(client) {\n        c.session.clientCertificate = cert;\n      } else {\n        c.session.serverCertificate = cert;\n      }\n    } catch(ex) {\n      return c.error(c, {\n        message: 'Could not send certificate list.',\n        cause: ex,\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.bad_certificate\n        }\n      });\n    }\n  }\n\n  // determine length of the handshake message\n  var length = 3 + certList.length(); // cert list vector\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.certificate);\n  rval.putInt24(length);\n  writeVector(rval, 3, certList);\n  return rval;\n};\n\n/**\n * Creates a ClientKeyExchange message.\n *\n * When this message will be sent:\n *   This message is always sent by the client. It will immediately follow the\n *   client certificate message, if it is sent. Otherwise it will be the first\n *   message sent by the client after it receives the server hello done\n *   message.\n *\n * Meaning of this message:\n *   With this message, the premaster secret is set, either though direct\n *   transmission of the RSA-encrypted secret, or by the transmission of\n *   Diffie-Hellman parameters which will allow each side to agree upon the\n *   same premaster secret. When the key exchange method is DH_RSA or DH_DSS,\n *   client certification has been requested, and the client was able to\n *   respond with a certificate which contained a Diffie-Hellman public key\n *   whose parameters (group and generator) matched those specified by the\n *   server in its certificate, this message will not contain any data.\n *\n * Meaning of this message:\n *   If RSA is being used for key agreement and authentication, the client\n *   generates a 48-byte premaster secret, encrypts it using the public key\n *   from the server's certificate or the temporary RSA key provided in a\n *   server key exchange message, and sends the result in an encrypted\n *   premaster secret message. This structure is a variant of the client\n *   key exchange message, not a message in itself.\n *\n * struct {\n *   select(KeyExchangeAlgorithm) {\n *     case rsa: EncryptedPreMasterSecret;\n *     case diffie_hellman: ClientDiffieHellmanPublic;\n *   } exchange_keys;\n * } ClientKeyExchange;\n *\n * struct {\n *   ProtocolVersion client_version;\n *   opaque random[46];\n * } PreMasterSecret;\n *\n * struct {\n *   public-key-encrypted PreMasterSecret pre_master_secret;\n * } EncryptedPreMasterSecret;\n *\n * A public-key-encrypted element is encoded as a vector <0..2^16-1>.\n *\n * @param c the connection.\n *\n * @return the ClientKeyExchange byte buffer.\n */\ntls.createClientKeyExchange = function(c) {\n  // create buffer to encrypt\n  var b = forge.util.createBuffer();\n\n  // add highest client-supported protocol to help server avoid version\n  // rollback attacks\n  b.putByte(c.session.clientHelloVersion.major);\n  b.putByte(c.session.clientHelloVersion.minor);\n\n  // generate and add 46 random bytes\n  b.putBytes(forge.random.getBytes(46));\n\n  // save pre-master secret\n  var sp = c.session.sp;\n  sp.pre_master_secret = b.getBytes();\n\n  // RSA-encrypt the pre-master secret\n  var key = c.session.serverCertificate.publicKey;\n  b = key.encrypt(sp.pre_master_secret);\n\n  /* Note: The encrypted pre-master secret will be stored in a\n    public-key-encrypted opaque vector that has the length prefixed using\n    2 bytes, so include those 2 bytes in the handshake message length. This\n    is done as a minor optimization instead of calling writeVector(). */\n\n  // determine length of the handshake message\n  var length = b.length + 2;\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.client_key_exchange);\n  rval.putInt24(length);\n  // add vector length bytes\n  rval.putInt16(b.length);\n  rval.putBytes(b);\n  return rval;\n};\n\n/**\n * Creates a ServerKeyExchange message.\n *\n * @param c the connection.\n *\n * @return the ServerKeyExchange byte buffer.\n */\ntls.createServerKeyExchange = function(c) {\n  // this implementation only supports RSA, no Diffie-Hellman support,\n  // so this record is empty\n\n  // determine length of the handshake message\n  var length = 0;\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  if(length > 0) {\n    rval.putByte(tls.HandshakeType.server_key_exchange);\n    rval.putInt24(length);\n  }\n  return rval;\n};\n\n/**\n * Gets the signed data used to verify a client-side certificate. See\n * tls.createCertificateVerify() for details.\n *\n * @param c the connection.\n * @param callback the callback to call once the signed data is ready.\n */\ntls.getClientSignature = function(c, callback) {\n  // generate data to RSA encrypt\n  var b = forge.util.createBuffer();\n  b.putBuffer(c.session.md5.digest());\n  b.putBuffer(c.session.sha1.digest());\n  b = b.getBytes();\n\n  // create default signing function as necessary\n  c.getSignature = c.getSignature || function(c, b, callback) {\n    // do rsa encryption, call callback\n    var privateKey = null;\n    if(c.getPrivateKey) {\n      try {\n        privateKey = c.getPrivateKey(c, c.session.clientCertificate);\n        privateKey = forge.pki.privateKeyFromPem(privateKey);\n      } catch(ex) {\n        c.error(c, {\n          message: 'Could not get private key.',\n          cause: ex,\n          send: true,\n          alert: {\n            level: tls.Alert.Level.fatal,\n            description: tls.Alert.Description.internal_error\n          }\n        });\n      }\n    }\n    if(privateKey === null) {\n      c.error(c, {\n        message: 'No private key set.',\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.internal_error\n        }\n      });\n    } else {\n      b = privateKey.sign(b, null);\n    }\n    callback(c, b);\n  };\n\n  // get client signature\n  c.getSignature(c, b, callback);\n};\n\n/**\n * Creates a CertificateVerify message.\n *\n * Meaning of this message:\n *   This structure conveys the client's Diffie-Hellman public value\n *   (Yc) if it was not already included in the client's certificate.\n *   The encoding used for Yc is determined by the enumerated\n *   PublicValueEncoding. This structure is a variant of the client\n *   key exchange message, not a message in itself.\n *\n * When this message will be sent:\n *   This message is used to provide explicit verification of a client\n *   certificate. This message is only sent following a client\n *   certificate that has signing capability (i.e. all certificates\n *   except those containing fixed Diffie-Hellman parameters). When\n *   sent, it will immediately follow the client key exchange message.\n *\n * struct {\n *   Signature signature;\n * } CertificateVerify;\n *\n * CertificateVerify.signature.md5_hash\n *   MD5(handshake_messages);\n *\n * Certificate.signature.sha_hash\n *   SHA(handshake_messages);\n *\n * Here handshake_messages refers to all handshake messages sent or\n * received starting at client hello up to but not including this\n * message, including the type and length fields of the handshake\n * messages.\n *\n * select(SignatureAlgorithm) {\n *   case anonymous: struct { };\n *   case rsa:\n *     digitally-signed struct {\n *       opaque md5_hash[16];\n *       opaque sha_hash[20];\n *     };\n *   case dsa:\n *     digitally-signed struct {\n *       opaque sha_hash[20];\n *     };\n * } Signature;\n *\n * In digital signing, one-way hash functions are used as input for a\n * signing algorithm. A digitally-signed element is encoded as an opaque\n * vector <0..2^16-1>, where the length is specified by the signing\n * algorithm and key.\n *\n * In RSA signing, a 36-byte structure of two hashes (one SHA and one\n * MD5) is signed (encrypted with the private key). It is encoded with\n * PKCS #1 block type 0 or type 1 as described in [PKCS1].\n *\n * In DSS, the 20 bytes of the SHA hash are run directly through the\n * Digital Signing Algorithm with no additional hashing.\n *\n * @param c the connection.\n * @param signature the signature to include in the message.\n *\n * @return the CertificateVerify byte buffer.\n */\ntls.createCertificateVerify = function(c, signature) {\n  /* Note: The signature will be stored in a \"digitally-signed\" opaque\n    vector that has the length prefixed using 2 bytes, so include those\n    2 bytes in the handshake message length. This is done as a minor\n    optimization instead of calling writeVector(). */\n\n  // determine length of the handshake message\n  var length = signature.length + 2;\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.certificate_verify);\n  rval.putInt24(length);\n  // add vector length bytes\n  rval.putInt16(signature.length);\n  rval.putBytes(signature);\n  return rval;\n};\n\n/**\n * Creates a CertificateRequest message.\n *\n * @param c the connection.\n *\n * @return the CertificateRequest byte buffer.\n */\ntls.createCertificateRequest = function(c) {\n  // TODO: support other certificate types\n  var certTypes = forge.util.createBuffer();\n\n  // common RSA certificate type\n  certTypes.putByte(0x01);\n\n  // add distinguished names from CA store\n  var cAs = forge.util.createBuffer();\n  for(var key in c.caStore.certs) {\n    var cert = c.caStore.certs[key];\n    var dn = forge.pki.distinguishedNameToAsn1(cert.subject);\n    var byteBuffer = forge.asn1.toDer(dn);\n    cAs.putInt16(byteBuffer.length());\n    cAs.putBuffer(byteBuffer);\n  }\n\n  // TODO: TLS 1.2+ has a different format\n\n  // determine length of the handshake message\n  var length =\n    1 + certTypes.length() +\n    2 + cAs.length();\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.certificate_request);\n  rval.putInt24(length);\n  writeVector(rval, 1, certTypes);\n  writeVector(rval, 2, cAs);\n  return rval;\n};\n\n/**\n * Creates a ServerHelloDone message.\n *\n * @param c the connection.\n *\n * @return the ServerHelloDone byte buffer.\n */\ntls.createServerHelloDone = function(c) {\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.server_hello_done);\n  rval.putInt24(0);\n  return rval;\n};\n\n/**\n * Creates a ChangeCipherSpec message.\n *\n * The change cipher spec protocol exists to signal transitions in\n * ciphering strategies. The protocol consists of a single message,\n * which is encrypted and compressed under the current (not the pending)\n * connection state. The message consists of a single byte of value 1.\n *\n * struct {\n *   enum { change_cipher_spec(1), (255) } type;\n * } ChangeCipherSpec;\n *\n * @return the ChangeCipherSpec byte buffer.\n */\ntls.createChangeCipherSpec = function() {\n  var rval = forge.util.createBuffer();\n  rval.putByte(0x01);\n  return rval;\n};\n\n/**\n * Creates a Finished message.\n *\n * struct {\n *   opaque verify_data[12];\n * } Finished;\n *\n * verify_data\n *   PRF(master_secret, finished_label, MD5(handshake_messages) +\n *   SHA-1(handshake_messages)) [0..11];\n *\n * finished_label\n *   For Finished messages sent by the client, the string \"client\n *   finished\". For Finished messages sent by the server, the\n *   string \"server finished\".\n *\n * handshake_messages\n *   All of the data from all handshake messages up to but not\n *   including this message. This is only data visible at the\n *   handshake layer and does not include record layer headers.\n *   This is the concatenation of all the Handshake structures as\n *   defined in 7.4 exchanged thus far.\n *\n * @param c the connection.\n *\n * @return the Finished byte buffer.\n */\ntls.createFinished = function(c) {\n  // generate verify_data\n  var b = forge.util.createBuffer();\n  b.putBuffer(c.session.md5.digest());\n  b.putBuffer(c.session.sha1.digest());\n\n  // TODO: determine prf function and verify length for TLS 1.2\n  var client = (c.entity === tls.ConnectionEnd.client);\n  var sp = c.session.sp;\n  var vdl = 12;\n  var prf = prf_TLS1;\n  var label = client ? 'client finished' : 'server finished';\n  b = prf(sp.master_secret, label, b.getBytes(), vdl);\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.finished);\n  rval.putInt24(b.length());\n  rval.putBuffer(b);\n  return rval;\n};\n\n/**\n * Creates a HeartbeatMessage (See RFC 6520).\n *\n * struct {\n *   HeartbeatMessageType type;\n *   uint16 payload_length;\n *   opaque payload[HeartbeatMessage.payload_length];\n *   opaque padding[padding_length];\n * } HeartbeatMessage;\n *\n * The total length of a HeartbeatMessage MUST NOT exceed 2^14 or\n * max_fragment_length when negotiated as defined in [RFC6066].\n *\n * type: The message type, either heartbeat_request or heartbeat_response.\n *\n * payload_length: The length of the payload.\n *\n * payload: The payload consists of arbitrary content.\n *\n * padding: The padding is random content that MUST be ignored by the\n *   receiver. The length of a HeartbeatMessage is TLSPlaintext.length\n *   for TLS and DTLSPlaintext.length for DTLS. Furthermore, the\n *   length of the type field is 1 byte, and the length of the\n *   payload_length is 2. Therefore, the padding_length is\n *   TLSPlaintext.length - payload_length - 3 for TLS and\n *   DTLSPlaintext.length - payload_length - 3 for DTLS. The\n *   padding_length MUST be at least 16.\n *\n * The sender of a HeartbeatMessage MUST use a random padding of at\n * least 16 bytes. The padding of a received HeartbeatMessage message\n * MUST be ignored.\n *\n * If the payload_length of a received HeartbeatMessage is too large,\n * the received HeartbeatMessage MUST be discarded silently.\n *\n * @param c the connection.\n * @param type the tls.HeartbeatMessageType.\n * @param payload the heartbeat data to send as the payload.\n * @param [payloadLength] the payload length to use, defaults to the\n *          actual payload length.\n *\n * @return the HeartbeatRequest byte buffer.\n */\ntls.createHeartbeat = function(type, payload, payloadLength) {\n  if(typeof payloadLength === 'undefined') {\n    payloadLength = payload.length;\n  }\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(type);               // heartbeat message type\n  rval.putInt16(payloadLength);     // payload length\n  rval.putBytes(payload);           // payload\n  // padding\n  var plaintextLength = rval.length();\n  var paddingLength = Math.max(16, plaintextLength - payloadLength - 3);\n  rval.putBytes(forge.random.getBytes(paddingLength));\n  return rval;\n};\n\n/**\n * Fragments, compresses, encrypts, and queues a record for delivery.\n *\n * @param c the connection.\n * @param record the record to queue.\n */\ntls.queue = function(c, record) {\n  // error during record creation\n  if(!record) {\n    return;\n  }\n\n  if(record.fragment.length() === 0) {\n    if(record.type === tls.ContentType.handshake ||\n      record.type === tls.ContentType.alert ||\n      record.type === tls.ContentType.change_cipher_spec) {\n      // Empty handshake, alert of change cipher spec messages are not allowed per the TLS specification and should not be sent.\n      return;\n    }\n  }\n\n  // if the record is a handshake record, update handshake hashes\n  if(record.type === tls.ContentType.handshake) {\n    var bytes = record.fragment.bytes();\n    c.session.md5.update(bytes);\n    c.session.sha1.update(bytes);\n    bytes = null;\n  }\n\n  // handle record fragmentation\n  var records;\n  if(record.fragment.length() <= tls.MaxFragment) {\n    records = [record];\n  } else {\n    // fragment data as long as it is too long\n    records = [];\n    var data = record.fragment.bytes();\n    while(data.length > tls.MaxFragment) {\n      records.push(tls.createRecord(c, {\n        type: record.type,\n        data: forge.util.createBuffer(data.slice(0, tls.MaxFragment))\n      }));\n      data = data.slice(tls.MaxFragment);\n    }\n    // add last record\n    if(data.length > 0) {\n      records.push(tls.createRecord(c, {\n        type: record.type,\n        data: forge.util.createBuffer(data)\n      }));\n    }\n  }\n\n  // compress and encrypt all fragmented records\n  for(var i = 0; i < records.length && !c.fail; ++i) {\n    // update the record using current write state\n    var rec = records[i];\n    var s = c.state.current.write;\n    if(s.update(c, rec)) {\n      // store record\n      c.records.push(rec);\n    }\n  }\n};\n\n/**\n * Flushes all queued records to the output buffer and calls the\n * tlsDataReady() handler on the given connection.\n *\n * @param c the connection.\n *\n * @return true on success, false on failure.\n */\ntls.flush = function(c) {\n  for(var i = 0; i < c.records.length; ++i) {\n    var record = c.records[i];\n\n    // add record header and fragment\n    c.tlsData.putByte(record.type);\n    c.tlsData.putByte(record.version.major);\n    c.tlsData.putByte(record.version.minor);\n    c.tlsData.putInt16(record.fragment.length());\n    c.tlsData.putBuffer(c.records[i].fragment);\n  }\n  c.records = [];\n  return c.tlsDataReady(c);\n};\n\n/**\n * Maps a pki.certificateError to a tls.Alert.Description.\n *\n * @param error the error to map.\n *\n * @return the alert description.\n */\nvar _certErrorToAlertDesc = function(error) {\n  switch(error) {\n  case true:\n    return true;\n  case forge.pki.certificateError.bad_certificate:\n    return tls.Alert.Description.bad_certificate;\n  case forge.pki.certificateError.unsupported_certificate:\n    return tls.Alert.Description.unsupported_certificate;\n  case forge.pki.certificateError.certificate_revoked:\n    return tls.Alert.Description.certificate_revoked;\n  case forge.pki.certificateError.certificate_expired:\n    return tls.Alert.Description.certificate_expired;\n  case forge.pki.certificateError.certificate_unknown:\n    return tls.Alert.Description.certificate_unknown;\n  case forge.pki.certificateError.unknown_ca:\n    return tls.Alert.Description.unknown_ca;\n  default:\n    return tls.Alert.Description.bad_certificate;\n  }\n};\n\n/**\n * Maps a tls.Alert.Description to a pki.certificateError.\n *\n * @param desc the alert description.\n *\n * @return the certificate error.\n */\nvar _alertDescToCertError = function(desc) {\n  switch(desc) {\n  case true:\n    return true;\n  case tls.Alert.Description.bad_certificate:\n    return forge.pki.certificateError.bad_certificate;\n  case tls.Alert.Description.unsupported_certificate:\n    return forge.pki.certificateError.unsupported_certificate;\n  case tls.Alert.Description.certificate_revoked:\n    return forge.pki.certificateError.certificate_revoked;\n  case tls.Alert.Description.certificate_expired:\n    return forge.pki.certificateError.certificate_expired;\n  case tls.Alert.Description.certificate_unknown:\n    return forge.pki.certificateError.certificate_unknown;\n  case tls.Alert.Description.unknown_ca:\n    return forge.pki.certificateError.unknown_ca;\n  default:\n    return forge.pki.certificateError.bad_certificate;\n  }\n};\n\n/**\n * Verifies a certificate chain against the given connection's\n * Certificate Authority store.\n *\n * @param c the TLS connection.\n * @param chain the certificate chain to verify, with the root or highest\n *          authority at the end.\n *\n * @return true if successful, false if not.\n */\ntls.verifyCertificateChain = function(c, chain) {\n  try {\n    // Make a copy of c.verifyOptions so that we can modify options.verify\n    // without modifying c.verifyOptions.\n    var options = {};\n    for (var key in c.verifyOptions) {\n      options[key] = c.verifyOptions[key];\n    }\n\n    options.verify = function(vfd, depth, chain) {\n      // convert pki.certificateError to tls alert description\n      var desc = _certErrorToAlertDesc(vfd);\n\n      // call application callback\n      var ret = c.verify(c, vfd, depth, chain);\n      if(ret !== true) {\n        if(typeof ret === 'object' && !forge.util.isArray(ret)) {\n          // throw custom error\n          var error = new Error('The application rejected the certificate.');\n          error.send = true;\n          error.alert = {\n            level: tls.Alert.Level.fatal,\n            description: tls.Alert.Description.bad_certificate\n          };\n          if(ret.message) {\n            error.message = ret.message;\n          }\n          if(ret.alert) {\n            error.alert.description = ret.alert;\n          }\n          throw error;\n        }\n\n        // convert tls alert description to pki.certificateError\n        if(ret !== vfd) {\n          ret = _alertDescToCertError(ret);\n        }\n      }\n\n      return ret;\n    };\n\n    // verify chain\n    forge.pki.verifyCertificateChain(c.caStore, chain, options);\n  } catch(ex) {\n    // build tls error if not already customized\n    var err = ex;\n    if(typeof err !== 'object' || forge.util.isArray(err)) {\n      err = {\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: _certErrorToAlertDesc(ex)\n        }\n      };\n    }\n    if(!('send' in err)) {\n      err.send = true;\n    }\n    if(!('alert' in err)) {\n      err.alert = {\n        level: tls.Alert.Level.fatal,\n        description: _certErrorToAlertDesc(err.error)\n      };\n    }\n\n    // send error\n    c.error(c, err);\n  }\n\n  return !c.fail;\n};\n\n/**\n * Creates a new TLS session cache.\n *\n * @param cache optional map of session ID to cached session.\n * @param capacity the maximum size for the cache (default: 100).\n *\n * @return the new TLS session cache.\n */\ntls.createSessionCache = function(cache, capacity) {\n  var rval = null;\n\n  // assume input is already a session cache object\n  if(cache && cache.getSession && cache.setSession && cache.order) {\n    rval = cache;\n  } else {\n    // create cache\n    rval = {};\n    rval.cache = cache || {};\n    rval.capacity = Math.max(capacity || 100, 1);\n    rval.order = [];\n\n    // store order for sessions, delete session overflow\n    for(var key in cache) {\n      if(rval.order.length <= capacity) {\n        rval.order.push(key);\n      } else {\n        delete cache[key];\n      }\n    }\n\n    // get a session from a session ID (or get any session)\n    rval.getSession = function(sessionId) {\n      var session = null;\n      var key = null;\n\n      // if session ID provided, use it\n      if(sessionId) {\n        key = forge.util.bytesToHex(sessionId);\n      } else if(rval.order.length > 0) {\n        // get first session from cache\n        key = rval.order[0];\n      }\n\n      if(key !== null && key in rval.cache) {\n        // get cached session and remove from cache\n        session = rval.cache[key];\n        delete rval.cache[key];\n        for(var i in rval.order) {\n          if(rval.order[i] === key) {\n            rval.order.splice(i, 1);\n            break;\n          }\n        }\n      }\n\n      return session;\n    };\n\n    // set a session in the cache\n    rval.setSession = function(sessionId, session) {\n      // remove session from cache if at capacity\n      if(rval.order.length === rval.capacity) {\n        var key = rval.order.shift();\n        delete rval.cache[key];\n      }\n      // add session to cache\n      var key = forge.util.bytesToHex(sessionId);\n      rval.order.push(key);\n      rval.cache[key] = session;\n    };\n  }\n\n  return rval;\n};\n\n/**\n * Creates a new TLS connection.\n *\n * See public createConnection() docs for more details.\n *\n * @param options the options for this connection.\n *\n * @return the new TLS connection.\n */\ntls.createConnection = function(options) {\n  var caStore = null;\n  if(options.caStore) {\n    // if CA store is an array, convert it to a CA store object\n    if(forge.util.isArray(options.caStore)) {\n      caStore = forge.pki.createCaStore(options.caStore);\n    } else {\n      caStore = options.caStore;\n    }\n  } else {\n    // create empty CA store\n    caStore = forge.pki.createCaStore();\n  }\n\n  // setup default cipher suites\n  var cipherSuites = options.cipherSuites || null;\n  if(cipherSuites === null) {\n    cipherSuites = [];\n    for(var key in tls.CipherSuites) {\n      cipherSuites.push(tls.CipherSuites[key]);\n    }\n  }\n\n  // set default entity\n  var entity = (options.server || false) ?\n    tls.ConnectionEnd.server : tls.ConnectionEnd.client;\n\n  // create session cache if requested\n  var sessionCache = options.sessionCache ?\n    tls.createSessionCache(options.sessionCache) : null;\n\n  // create TLS connection\n  var c = {\n    version: {major: tls.Version.major, minor: tls.Version.minor},\n    entity: entity,\n    sessionId: options.sessionId,\n    caStore: caStore,\n    sessionCache: sessionCache,\n    cipherSuites: cipherSuites,\n    connected: options.connected,\n    virtualHost: options.virtualHost || null,\n    verifyClient: options.verifyClient || false,\n    verify: options.verify || function(cn, vfd, dpth, cts) {return vfd;},\n    verifyOptions: options.verifyOptions || {},\n    getCertificate: options.getCertificate || null,\n    getPrivateKey: options.getPrivateKey || null,\n    getSignature: options.getSignature || null,\n    input: forge.util.createBuffer(),\n    tlsData: forge.util.createBuffer(),\n    data: forge.util.createBuffer(),\n    tlsDataReady: options.tlsDataReady,\n    dataReady: options.dataReady,\n    heartbeatReceived: options.heartbeatReceived,\n    closed: options.closed,\n    error: function(c, ex) {\n      // set origin if not set\n      ex.origin = ex.origin ||\n        ((c.entity === tls.ConnectionEnd.client) ? 'client' : 'server');\n\n      // send TLS alert\n      if(ex.send) {\n        tls.queue(c, tls.createAlert(c, ex.alert));\n        tls.flush(c);\n      }\n\n      // error is fatal by default\n      var fatal = (ex.fatal !== false);\n      if(fatal) {\n        // set fail flag\n        c.fail = true;\n      }\n\n      // call error handler first\n      options.error(c, ex);\n\n      if(fatal) {\n        // fatal error, close connection, do not clear fail\n        c.close(false);\n      }\n    },\n    deflate: options.deflate || null,\n    inflate: options.inflate || null\n  };\n\n  /**\n   * Resets a closed TLS connection for reuse. Called in c.close().\n   *\n   * @param clearFail true to clear the fail flag (default: true).\n   */\n  c.reset = function(clearFail) {\n    c.version = {major: tls.Version.major, minor: tls.Version.minor};\n    c.record = null;\n    c.session = null;\n    c.peerCertificate = null;\n    c.state = {\n      pending: null,\n      current: null\n    };\n    c.expect = (c.entity === tls.ConnectionEnd.client) ? SHE : CHE;\n    c.fragmented = null;\n    c.records = [];\n    c.open = false;\n    c.handshakes = 0;\n    c.handshaking = false;\n    c.isConnected = false;\n    c.fail = !(clearFail || typeof(clearFail) === 'undefined');\n    c.input.clear();\n    c.tlsData.clear();\n    c.data.clear();\n    c.state.current = tls.createConnectionState(c);\n  };\n\n  // do initial reset of connection\n  c.reset();\n\n  /**\n   * Updates the current TLS engine state based on the given record.\n   *\n   * @param c the TLS connection.\n   * @param record the TLS record to act on.\n   */\n  var _update = function(c, record) {\n    // get record handler (align type in table by subtracting lowest)\n    var aligned = record.type - tls.ContentType.change_cipher_spec;\n    var handlers = ctTable[c.entity][c.expect];\n    if(aligned in handlers) {\n      handlers[aligned](c, record);\n    } else {\n      // unexpected record\n      tls.handleUnexpected(c, record);\n    }\n  };\n\n  /**\n   * Reads the record header and initializes the next record on the given\n   * connection.\n   *\n   * @param c the TLS connection with the next record.\n   *\n   * @return 0 if the input data could be processed, otherwise the\n   *         number of bytes required for data to be processed.\n   */\n  var _readRecordHeader = function(c) {\n    var rval = 0;\n\n    // get input buffer and its length\n    var b = c.input;\n    var len = b.length();\n\n    // need at least 5 bytes to initialize a record\n    if(len < 5) {\n      rval = 5 - len;\n    } else {\n      // enough bytes for header\n      // initialize record\n      c.record = {\n        type: b.getByte(),\n        version: {\n          major: b.getByte(),\n          minor: b.getByte()\n        },\n        length: b.getInt16(),\n        fragment: forge.util.createBuffer(),\n        ready: false\n      };\n\n      // check record version\n      var compatibleVersion = (c.record.version.major === c.version.major);\n      if(compatibleVersion && c.session && c.session.version) {\n        // session version already set, require same minor version\n        compatibleVersion = (c.record.version.minor === c.version.minor);\n      }\n      if(!compatibleVersion) {\n        c.error(c, {\n          message: 'Incompatible TLS version.',\n          send: true,\n          alert: {\n            level: tls.Alert.Level.fatal,\n            description: tls.Alert.Description.protocol_version\n          }\n        });\n      }\n    }\n\n    return rval;\n  };\n\n  /**\n   * Reads the next record's contents and appends its message to any\n   * previously fragmented message.\n   *\n   * @param c the TLS connection with the next record.\n   *\n   * @return 0 if the input data could be processed, otherwise the\n   *         number of bytes required for data to be processed.\n   */\n  var _readRecord = function(c) {\n    var rval = 0;\n\n    // ensure there is enough input data to get the entire record\n    var b = c.input;\n    var len = b.length();\n    if(len < c.record.length) {\n      // not enough data yet, return how much is required\n      rval = c.record.length - len;\n    } else {\n      // there is enough data to parse the pending record\n      // fill record fragment and compact input buffer\n      c.record.fragment.putBytes(b.getBytes(c.record.length));\n      b.compact();\n\n      // update record using current read state\n      var s = c.state.current.read;\n      if(s.update(c, c.record)) {\n        // see if there is a previously fragmented message that the\n        // new record's message fragment should be appended to\n        if(c.fragmented !== null) {\n          // if the record type matches a previously fragmented\n          // record, append the record fragment to it\n          if(c.fragmented.type === c.record.type) {\n            // concatenate record fragments\n            c.fragmented.fragment.putBuffer(c.record.fragment);\n            c.record = c.fragmented;\n          } else {\n            // error, invalid fragmented record\n            c.error(c, {\n              message: 'Invalid fragmented record.',\n              send: true,\n              alert: {\n                level: tls.Alert.Level.fatal,\n                description:\n                  tls.Alert.Description.unexpected_message\n              }\n            });\n          }\n        }\n\n        // record is now ready\n        c.record.ready = true;\n      }\n    }\n\n    return rval;\n  };\n\n  /**\n   * Performs a handshake using the TLS Handshake Protocol, as a client.\n   *\n   * This method should only be called if the connection is in client mode.\n   *\n   * @param sessionId the session ID to use, null to start a new one.\n   */\n  c.handshake = function(sessionId) {\n    // error to call this in non-client mode\n    if(c.entity !== tls.ConnectionEnd.client) {\n      // not fatal error\n      c.error(c, {\n        message: 'Cannot initiate handshake as a server.',\n        fatal: false\n      });\n    } else if(c.handshaking) {\n      // handshake is already in progress, fail but not fatal error\n      c.error(c, {\n        message: 'Handshake already in progress.',\n        fatal: false\n      });\n    } else {\n      // clear fail flag on reuse\n      if(c.fail && !c.open && c.handshakes === 0) {\n        c.fail = false;\n      }\n\n      // now handshaking\n      c.handshaking = true;\n\n      // default to blank (new session)\n      sessionId = sessionId || '';\n\n      // if a session ID was specified, try to find it in the cache\n      var session = null;\n      if(sessionId.length > 0) {\n        if(c.sessionCache) {\n          session = c.sessionCache.getSession(sessionId);\n        }\n\n        // matching session not found in cache, clear session ID\n        if(session === null) {\n          sessionId = '';\n        }\n      }\n\n      // no session given, grab a session from the cache, if available\n      if(sessionId.length === 0 && c.sessionCache) {\n        session = c.sessionCache.getSession();\n        if(session !== null) {\n          sessionId = session.id;\n        }\n      }\n\n      // set up session\n      c.session = {\n        id: sessionId,\n        version: null,\n        cipherSuite: null,\n        compressionMethod: null,\n        serverCertificate: null,\n        certificateRequest: null,\n        clientCertificate: null,\n        sp: {},\n        md5: forge.md.md5.create(),\n        sha1: forge.md.sha1.create()\n      };\n\n      // use existing session information\n      if(session) {\n        // only update version on connection, session version not yet set\n        c.version = session.version;\n        c.session.sp = session.sp;\n      }\n\n      // generate new client random\n      c.session.sp.client_random = tls.createRandom().getBytes();\n\n      // connection now open\n      c.open = true;\n\n      // send hello\n      tls.queue(c, tls.createRecord(c, {\n        type: tls.ContentType.handshake,\n        data: tls.createClientHello(c)\n      }));\n      tls.flush(c);\n    }\n  };\n\n  /**\n   * Called when TLS protocol data has been received from somewhere and should\n   * be processed by the TLS engine.\n   *\n   * @param data the TLS protocol data, as a string, to process.\n   *\n   * @return 0 if the data could be processed, otherwise the number of bytes\n   *         required for data to be processed.\n   */\n  c.process = function(data) {\n    var rval = 0;\n\n    // buffer input data\n    if(data) {\n      c.input.putBytes(data);\n    }\n\n    // process next record if no failure, process will be called after\n    // each record is handled (since handling can be asynchronous)\n    if(!c.fail) {\n      // reset record if ready and now empty\n      if(c.record !== null &&\n        c.record.ready && c.record.fragment.isEmpty()) {\n        c.record = null;\n      }\n\n      // if there is no pending record, try to read record header\n      if(c.record === null) {\n        rval = _readRecordHeader(c);\n      }\n\n      // read the next record (if record not yet ready)\n      if(!c.fail && c.record !== null && !c.record.ready) {\n        rval = _readRecord(c);\n      }\n\n      // record ready to be handled, update engine state\n      if(!c.fail && c.record !== null && c.record.ready) {\n        _update(c, c.record);\n      }\n    }\n\n    return rval;\n  };\n\n  /**\n   * Requests that application data be packaged into a TLS record. The\n   * tlsDataReady handler will be called when the TLS record(s) have been\n   * prepared.\n   *\n   * @param data the application data, as a raw 'binary' encoded string, to\n   *          be sent; to send utf-16/utf-8 string data, use the return value\n   *          of util.encodeUtf8(str).\n   *\n   * @return true on success, false on failure.\n   */\n  c.prepare = function(data) {\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.application_data,\n      data: forge.util.createBuffer(data)\n    }));\n    return tls.flush(c);\n  };\n\n  /**\n   * Requests that a heartbeat request be packaged into a TLS record for\n   * transmission. The tlsDataReady handler will be called when TLS record(s)\n   * have been prepared.\n   *\n   * When a heartbeat response has been received, the heartbeatReceived\n   * handler will be called with the matching payload. This handler can\n   * be used to clear a retransmission timer, etc.\n   *\n   * @param payload the heartbeat data to send as the payload in the message.\n   * @param [payloadLength] the payload length to use, defaults to the\n   *          actual payload length.\n   *\n   * @return true on success, false on failure.\n   */\n  c.prepareHeartbeatRequest = function(payload, payloadLength) {\n    if(payload instanceof forge.util.ByteBuffer) {\n      payload = payload.bytes();\n    }\n    if(typeof payloadLength === 'undefined') {\n      payloadLength = payload.length;\n    }\n    c.expectedHeartbeatPayload = payload;\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.heartbeat,\n      data: tls.createHeartbeat(\n        tls.HeartbeatMessageType.heartbeat_request, payload, payloadLength)\n    }));\n    return tls.flush(c);\n  };\n\n  /**\n   * Closes the connection (sends a close_notify alert).\n   *\n   * @param clearFail true to clear the fail flag (default: true).\n   */\n  c.close = function(clearFail) {\n    // save session if connection didn't fail\n    if(!c.fail && c.sessionCache && c.session) {\n      // only need to preserve session ID, version, and security params\n      var session = {\n        id: c.session.id,\n        version: c.session.version,\n        sp: c.session.sp\n      };\n      session.sp.keys = null;\n      c.sessionCache.setSession(session.id, session);\n    }\n\n    if(c.open) {\n      // connection no longer open, clear input\n      c.open = false;\n      c.input.clear();\n\n      // if connected or handshaking, send an alert\n      if(c.isConnected || c.handshaking) {\n        c.isConnected = c.handshaking = false;\n\n        // send close_notify alert\n        tls.queue(c, tls.createAlert(c, {\n          level: tls.Alert.Level.warning,\n          description: tls.Alert.Description.close_notify\n        }));\n        tls.flush(c);\n      }\n\n      // call handler\n      c.closed(c);\n    }\n\n    // reset TLS connection, do not clear fail flag\n    c.reset(clearFail);\n  };\n\n  return c;\n};\n\n/* TLS API */\nmodule.exports = forge.tls = forge.tls || {};\n\n// expose non-functions\nfor(var key in tls) {\n  if(typeof tls[key] !== 'function') {\n    forge.tls[key] = tls[key];\n  }\n}\n\n// expose prf_tls1 for testing\nforge.tls.prf_tls1 = prf_TLS1;\n\n// expose sha1 hmac method\nforge.tls.hmac_sha1 = hmac_sha1;\n\n// expose session cache creation\nforge.tls.createSessionCache = tls.createSessionCache;\n\n/**\n * Creates a new TLS connection. This does not make any assumptions about the\n * transport layer that TLS is working on top of, ie: it does not assume there\n * is a TCP/IP connection or establish one. A TLS connection is totally\n * abstracted away from the layer is runs on top of, it merely establishes a\n * secure channel between a client\" and a \"server\".\n *\n * A TLS connection contains 4 connection states: pending read and write, and\n * current read and write.\n *\n * At initialization, the current read and write states will be null. Only once\n * the security parameters have been set and the keys have been generated can\n * the pending states be converted into current states. Current states will be\n * updated for each record processed.\n *\n * A custom certificate verify callback may be provided to check information\n * like the common name on the server's certificate. It will be called for\n * every certificate in the chain. It has the following signature:\n *\n * variable func(c, certs, index, preVerify)\n * Where:\n * c         The TLS connection\n * verified  Set to true if certificate was verified, otherwise the alert\n *           tls.Alert.Description for why the certificate failed.\n * depth     The current index in the chain, where 0 is the server's cert.\n * certs     The certificate chain, *NOTE* if the server was anonymous then\n *           the chain will be empty.\n *\n * The function returns true on success and on failure either the appropriate\n * tls.Alert.Description or an object with 'alert' set to the appropriate\n * tls.Alert.Description and 'message' set to a custom error message. If true\n * is not returned then the connection will abort using, in order of\n * availability, first the returned alert description, second the preVerify\n * alert description, and lastly the default 'bad_certificate'.\n *\n * There are three callbacks that can be used to make use of client-side\n * certificates where each takes the TLS connection as the first parameter:\n *\n * getCertificate(conn, hint)\n *   The second parameter is a hint as to which certificate should be\n *   returned. If the connection entity is a client, then the hint will be\n *   the CertificateRequest message from the server that is part of the\n *   TLS protocol. If the connection entity is a server, then it will be\n *   the servername list provided via an SNI extension the ClientHello, if\n *   one was provided (empty array if not). The hint can be examined to\n *   determine which certificate to use (advanced). Most implementations\n *   will just return a certificate. The return value must be a\n *   PEM-formatted certificate or an array of PEM-formatted certificates\n *   that constitute a certificate chain, with the first in the array/chain\n *   being the client's certificate.\n * getPrivateKey(conn, certificate)\n *   The second parameter is an forge.pki X.509 certificate object that\n *   is associated with the requested private key. The return value must\n *   be a PEM-formatted private key.\n * getSignature(conn, bytes, callback)\n *   This callback can be used instead of getPrivateKey if the private key\n *   is not directly accessible in javascript or should not be. For\n *   instance, a secure external web service could provide the signature\n *   in exchange for appropriate credentials. The second parameter is a\n *   string of bytes to be signed that are part of the TLS protocol. These\n *   bytes are used to verify that the private key for the previously\n *   provided client-side certificate is accessible to the client. The\n *   callback is a function that takes 2 parameters, the TLS connection\n *   and the RSA encrypted (signed) bytes as a string. This callback must\n *   be called once the signature is ready.\n *\n * @param options the options for this connection:\n *   server: true if the connection is server-side, false for client.\n *   sessionId: a session ID to reuse, null for a new connection.\n *   caStore: an array of certificates to trust.\n *   sessionCache: a session cache to use.\n *   cipherSuites: an optional array of cipher suites to use,\n *     see tls.CipherSuites.\n *   connected: function(conn) called when the first handshake completes.\n *   virtualHost: the virtual server name to use in a TLS SNI extension.\n *   verifyClient: true to require a client certificate in server mode,\n *     'optional' to request one, false not to (default: false).\n *   verify: a handler used to custom verify certificates in the chain.\n *   verifyOptions: an object with options for the certificate chain validation.\n *     See documentation of pki.verifyCertificateChain for possible options.\n *     verifyOptions.verify is ignored. If you wish to specify a verify handler\n *     use the verify key.\n *   getCertificate: an optional callback used to get a certificate or\n *     a chain of certificates (as an array).\n *   getPrivateKey: an optional callback used to get a private key.\n *   getSignature: an optional callback used to get a signature.\n *   tlsDataReady: function(conn) called when TLS protocol data has been\n *     prepared and is ready to be used (typically sent over a socket\n *     connection to its destination), read from conn.tlsData buffer.\n *   dataReady: function(conn) called when application data has\n *     been parsed from a TLS record and should be consumed by the\n *     application, read from conn.data buffer.\n *   closed: function(conn) called when the connection has been closed.\n *   error: function(conn, error) called when there was an error.\n *   deflate: function(inBytes) if provided, will deflate TLS records using\n *     the deflate algorithm if the server supports it.\n *   inflate: function(inBytes) if provided, will inflate TLS records using\n *     the deflate algorithm if the server supports it.\n *\n * @return the new TLS connection.\n */\nforge.tls.createConnection = tls.createConnection;\n","/**\n * A Javascript implementation of AES Cipher Suites for TLS.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2009-2015 Digital Bazaar, Inc.\n *\n */\nvar forge = require('./forge');\nrequire('./aes');\nrequire('./tls');\n\nvar tls = module.exports = forge.tls;\n\n/**\n * Supported cipher suites.\n */\ntls.CipherSuites['TLS_RSA_WITH_AES_128_CBC_SHA'] = {\n  id: [0x00, 0x2f],\n  name: 'TLS_RSA_WITH_AES_128_CBC_SHA',\n  initSecurityParameters: function(sp) {\n    sp.bulk_cipher_algorithm = tls.BulkCipherAlgorithm.aes;\n    sp.cipher_type = tls.CipherType.block;\n    sp.enc_key_length = 16;\n    sp.block_length = 16;\n    sp.fixed_iv_length = 16;\n    sp.record_iv_length = 16;\n    sp.mac_algorithm = tls.MACAlgorithm.hmac_sha1;\n    sp.mac_length = 20;\n    sp.mac_key_length = 20;\n  },\n  initConnectionState: initConnectionState\n};\ntls.CipherSuites['TLS_RSA_WITH_AES_256_CBC_SHA'] = {\n  id: [0x00, 0x35],\n  name: 'TLS_RSA_WITH_AES_256_CBC_SHA',\n  initSecurityParameters: function(sp) {\n    sp.bulk_cipher_algorithm = tls.BulkCipherAlgorithm.aes;\n    sp.cipher_type = tls.CipherType.block;\n    sp.enc_key_length = 32;\n    sp.block_length = 16;\n    sp.fixed_iv_length = 16;\n    sp.record_iv_length = 16;\n    sp.mac_algorithm = tls.MACAlgorithm.hmac_sha1;\n    sp.mac_length = 20;\n    sp.mac_key_length = 20;\n  },\n  initConnectionState: initConnectionState\n};\n\nfunction initConnectionState(state, c, sp) {\n  var client = (c.entity === forge.tls.ConnectionEnd.client);\n\n  // cipher setup\n  state.read.cipherState = {\n    init: false,\n    cipher: forge.cipher.createDecipher('AES-CBC', client ?\n      sp.keys.server_write_key : sp.keys.client_write_key),\n    iv: client ? sp.keys.server_write_IV : sp.keys.client_write_IV\n  };\n  state.write.cipherState = {\n    init: false,\n    cipher: forge.cipher.createCipher('AES-CBC', client ?\n      sp.keys.client_write_key : sp.keys.server_write_key),\n    iv: client ? sp.keys.client_write_IV : sp.keys.server_write_IV\n  };\n  state.read.cipherFunction = decrypt_aes_cbc_sha1;\n  state.write.cipherFunction = encrypt_aes_cbc_sha1;\n\n  // MAC setup\n  state.read.macLength = state.write.macLength = sp.mac_length;\n  state.read.macFunction = state.write.macFunction = tls.hmac_sha1;\n}\n\n/**\n * Encrypts the TLSCompressed record into a TLSCipherText record using AES\n * in CBC mode.\n *\n * @param record the TLSCompressed record to encrypt.\n * @param s the ConnectionState to use.\n *\n * @return true on success, false on failure.\n */\nfunction encrypt_aes_cbc_sha1(record, s) {\n  var rval = false;\n\n  // append MAC to fragment, update sequence number\n  var mac = s.macFunction(s.macKey, s.sequenceNumber, record);\n  record.fragment.putBytes(mac);\n  s.updateSequenceNumber();\n\n  // TLS 1.1+ use an explicit IV every time to protect against CBC attacks\n  var iv;\n  if(record.version.minor === tls.Versions.TLS_1_0.minor) {\n    // use the pre-generated IV when initializing for TLS 1.0, otherwise use\n    // the residue from the previous encryption\n    iv = s.cipherState.init ? null : s.cipherState.iv;\n  } else {\n    iv = forge.random.getBytesSync(16);\n  }\n\n  s.cipherState.init = true;\n\n  // start cipher\n  var cipher = s.cipherState.cipher;\n  cipher.start({iv: iv});\n\n  // TLS 1.1+ write IV into output\n  if(record.version.minor >= tls.Versions.TLS_1_1.minor) {\n    cipher.output.putBytes(iv);\n  }\n\n  // do encryption (default padding is appropriate)\n  cipher.update(record.fragment);\n  if(cipher.finish(encrypt_aes_cbc_sha1_padding)) {\n    // set record fragment to encrypted output\n    record.fragment = cipher.output;\n    record.length = record.fragment.length();\n    rval = true;\n  }\n\n  return rval;\n}\n\n/**\n * Handles padding for aes_cbc_sha1 in encrypt mode.\n *\n * @param blockSize the block size.\n * @param input the input buffer.\n * @param decrypt true in decrypt mode, false in encrypt mode.\n *\n * @return true on success, false on failure.\n */\nfunction encrypt_aes_cbc_sha1_padding(blockSize, input, decrypt) {\n  /* The encrypted data length (TLSCiphertext.length) is one more than the sum\n   of SecurityParameters.block_length, TLSCompressed.length,\n   SecurityParameters.mac_length, and padding_length.\n\n   The padding may be any length up to 255 bytes long, as long as it results in\n   the TLSCiphertext.length being an integral multiple of the block length.\n   Lengths longer than necessary might be desirable to frustrate attacks on a\n   protocol based on analysis of the lengths of exchanged messages. Each uint8\n   in the padding data vector must be filled with the padding length value.\n\n   The padding length should be such that the total size of the\n   GenericBlockCipher structure is a multiple of the cipher's block length.\n   Legal values range from zero to 255, inclusive. This length specifies the\n   length of the padding field exclusive of the padding_length field itself.\n\n   This is slightly different from PKCS#7 because the padding value is 1\n   less than the actual number of padding bytes if you include the\n   padding_length uint8 itself as a padding byte. */\n  if(!decrypt) {\n    // get the number of padding bytes required to reach the blockSize and\n    // subtract 1 for the padding value (to make room for the padding_length\n    // uint8)\n    var padding = blockSize - (input.length() % blockSize);\n    input.fillWithByte(padding - 1, padding);\n  }\n  return true;\n}\n\n/**\n * Handles padding for aes_cbc_sha1 in decrypt mode.\n *\n * @param blockSize the block size.\n * @param output the output buffer.\n * @param decrypt true in decrypt mode, false in encrypt mode.\n *\n * @return true on success, false on failure.\n */\nfunction decrypt_aes_cbc_sha1_padding(blockSize, output, decrypt) {\n  var rval = true;\n  if(decrypt) {\n    /* The last byte in the output specifies the number of padding bytes not\n      including itself. Each of the padding bytes has the same value as that\n      last byte (known as the padding_length). Here we check all padding\n      bytes to ensure they have the value of padding_length even if one of\n      them is bad in order to ward-off timing attacks. */\n    var len = output.length();\n    var paddingLength = output.last();\n    for(var i = len - 1 - paddingLength; i < len - 1; ++i) {\n      rval = rval && (output.at(i) == paddingLength);\n    }\n    if(rval) {\n      // trim off padding bytes and last padding length byte\n      output.truncate(paddingLength + 1);\n    }\n  }\n  return rval;\n}\n\n/**\n * Decrypts a TLSCipherText record into a TLSCompressed record using\n * AES in CBC mode.\n *\n * @param record the TLSCipherText record to decrypt.\n * @param s the ConnectionState to use.\n *\n * @return true on success, false on failure.\n */\nfunction decrypt_aes_cbc_sha1(record, s) {\n  var rval = false;\n\n  var iv;\n  if(record.version.minor === tls.Versions.TLS_1_0.minor) {\n    // use pre-generated IV when initializing for TLS 1.0, otherwise use the\n    // residue from the previous decryption\n    iv = s.cipherState.init ? null : s.cipherState.iv;\n  } else {\n    // TLS 1.1+ use an explicit IV every time to protect against CBC attacks\n    // that is appended to the record fragment\n    iv = record.fragment.getBytes(16);\n  }\n\n  s.cipherState.init = true;\n\n  // start cipher\n  var cipher = s.cipherState.cipher;\n  cipher.start({iv: iv});\n\n  // do decryption\n  cipher.update(record.fragment);\n  rval = cipher.finish(decrypt_aes_cbc_sha1_padding);\n\n  // even if decryption fails, keep going to minimize timing attacks\n\n  // decrypted data:\n  // first (len - 20) bytes = application data\n  // last 20 bytes          = MAC\n  var macLen = s.macLength;\n\n  // create a random MAC to check against should the mac length check fail\n  // Note: do this regardless of the failure to keep timing consistent\n  var mac = forge.random.getBytesSync(macLen);\n\n  // get fragment and mac\n  var len = cipher.output.length();\n  if(len >= macLen) {\n    record.fragment = cipher.output.getBytes(len - macLen);\n    mac = cipher.output.getBytes(macLen);\n  } else {\n    // bad data, but get bytes anyway to try to keep timing consistent\n    record.fragment = cipher.output.getBytes();\n  }\n  record.fragment = forge.util.createBuffer(record.fragment);\n  record.length = record.fragment.length();\n\n  // see if data integrity checks out, update sequence number\n  var mac2 = s.macFunction(s.macKey, s.sequenceNumber, record);\n  s.updateSequenceNumber();\n  rval = compareMacs(s.macKey, mac, mac2) && rval;\n  return rval;\n}\n\n/**\n * Safely compare two MACs. This function will compare two MACs in a way\n * that protects against timing attacks.\n *\n * TODO: Expose elsewhere as a utility API.\n *\n * See: https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/february/double-hmac-verification/\n *\n * @param key the MAC key to use.\n * @param mac1 as a binary-encoded string of bytes.\n * @param mac2 as a binary-encoded string of bytes.\n *\n * @return true if the MACs are the same, false if not.\n */\nfunction compareMacs(key, mac1, mac2) {\n  var hmac = forge.hmac.create();\n\n  hmac.start('SHA1', key);\n  hmac.update(mac1);\n  mac1 = hmac.digest().getBytes();\n\n  hmac.start(null, null);\n  hmac.update(mac2);\n  mac2 = hmac.digest().getBytes();\n\n  return mac1 === mac2;\n}\n","/**\n * Secure Hash Algorithm with a 1024-bit block size implementation.\n *\n * This includes: SHA-512, SHA-384, SHA-512/224, and SHA-512/256. For\n * SHA-256 (block size 512 bits), see sha256.js.\n *\n * See FIPS 180-4 for details.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2014-2015 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./md');\nrequire('./util');\n\nvar sha512 = module.exports = forge.sha512 = forge.sha512 || {};\n\n// SHA-512\nforge.md.sha512 = forge.md.algorithms.sha512 = sha512;\n\n// SHA-384\nvar sha384 = forge.sha384 = forge.sha512.sha384 = forge.sha512.sha384 || {};\nsha384.create = function() {\n  return sha512.create('SHA-384');\n};\nforge.md.sha384 = forge.md.algorithms.sha384 = sha384;\n\n// SHA-512/256\nforge.sha512.sha256 = forge.sha512.sha256 || {\n  create: function() {\n    return sha512.create('SHA-512/256');\n  }\n};\nforge.md['sha512/256'] = forge.md.algorithms['sha512/256'] =\n  forge.sha512.sha256;\n\n// SHA-512/224\nforge.sha512.sha224 = forge.sha512.sha224 || {\n  create: function() {\n    return sha512.create('SHA-512/224');\n  }\n};\nforge.md['sha512/224'] = forge.md.algorithms['sha512/224'] =\n  forge.sha512.sha224;\n\n/**\n * Creates a SHA-2 message digest object.\n *\n * @param algorithm the algorithm to use (SHA-512, SHA-384, SHA-512/224,\n *          SHA-512/256).\n *\n * @return a message digest object.\n */\nsha512.create = function(algorithm) {\n  // do initialization as necessary\n  if(!_initialized) {\n    _init();\n  }\n\n  if(typeof algorithm === 'undefined') {\n    algorithm = 'SHA-512';\n  }\n\n  if(!(algorithm in _states)) {\n    throw new Error('Invalid SHA-512 algorithm: ' + algorithm);\n  }\n\n  // SHA-512 state contains eight 64-bit integers (each as two 32-bit ints)\n  var _state = _states[algorithm];\n  var _h = null;\n\n  // input buffer\n  var _input = forge.util.createBuffer();\n\n  // used for 64-bit word storage\n  var _w = new Array(80);\n  for(var wi = 0; wi < 80; ++wi) {\n    _w[wi] = new Array(2);\n  }\n\n  // determine digest length by algorithm name (default)\n  var digestLength = 64;\n  switch(algorithm) {\n    case 'SHA-384':\n      digestLength = 48;\n      break;\n    case 'SHA-512/256':\n      digestLength = 32;\n      break;\n    case 'SHA-512/224':\n      digestLength = 28;\n      break;\n  }\n\n  // message digest object\n  var md = {\n    // SHA-512 => sha512\n    algorithm: algorithm.replace('-', '').toLowerCase(),\n    blockLength: 128,\n    digestLength: digestLength,\n    // 56-bit length of message so far (does not including padding)\n    messageLength: 0,\n    // true message length\n    fullMessageLength: null,\n    // size of message length in bytes\n    messageLengthSize: 16\n  };\n\n  /**\n   * Starts the digest.\n   *\n   * @return this digest object.\n   */\n  md.start = function() {\n    // up to 56-bit message length for convenience\n    md.messageLength = 0;\n\n    // full message length (set md.messageLength128 for backwards-compatibility)\n    md.fullMessageLength = md.messageLength128 = [];\n    var int32s = md.messageLengthSize / 4;\n    for(var i = 0; i < int32s; ++i) {\n      md.fullMessageLength.push(0);\n    }\n    _input = forge.util.createBuffer();\n    _h = new Array(_state.length);\n    for(var i = 0; i < _state.length; ++i) {\n      _h[i] = _state[i].slice(0);\n    }\n    return md;\n  };\n  // start digest automatically for first time\n  md.start();\n\n  /**\n   * Updates the digest with the given message input. The given input can\n   * treated as raw input (no encoding will be applied) or an encoding of\n   * 'utf8' maybe given to encode the input using UTF-8.\n   *\n   * @param msg the message input to update with.\n   * @param encoding the encoding to use (default: 'raw', other: 'utf8').\n   *\n   * @return this digest object.\n   */\n  md.update = function(msg, encoding) {\n    if(encoding === 'utf8') {\n      msg = forge.util.encodeUtf8(msg);\n    }\n\n    // update message length\n    var len = msg.length;\n    md.messageLength += len;\n    len = [(len / 0x100000000) >>> 0, len >>> 0];\n    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {\n      md.fullMessageLength[i] += len[1];\n      len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0);\n      md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0;\n      len[0] = ((len[1] / 0x100000000) >>> 0);\n    }\n\n    // add bytes to input buffer\n    _input.putBytes(msg);\n\n    // process bytes\n    _update(_h, _w, _input);\n\n    // compact input buffer every 2K or if empty\n    if(_input.read > 2048 || _input.length() === 0) {\n      _input.compact();\n    }\n\n    return md;\n  };\n\n  /**\n   * Produces the digest.\n   *\n   * @return a byte buffer containing the digest value.\n   */\n  md.digest = function() {\n    /* Note: Here we copy the remaining bytes in the input buffer and\n    add the appropriate SHA-512 padding. Then we do the final update\n    on a copy of the state so that if the user wants to get\n    intermediate digests they can do so. */\n\n    /* Determine the number of bytes that must be added to the message\n    to ensure its length is congruent to 896 mod 1024. In other words,\n    the data to be digested must be a multiple of 1024 bits (or 128 bytes).\n    This data includes the message, some padding, and the length of the\n    message. Since the length of the message will be encoded as 16 bytes (128\n    bits), that means that the last segment of the data must have 112 bytes\n    (896 bits) of message and padding. Therefore, the length of the message\n    plus the padding must be congruent to 896 mod 1024 because\n    1024 - 128 = 896.\n\n    In order to fill up the message length it must be filled with\n    padding that begins with 1 bit followed by all 0 bits. Padding\n    must *always* be present, so if the message length is already\n    congruent to 896 mod 1024, then 1024 padding bits must be added. */\n\n    var finalBlock = forge.util.createBuffer();\n    finalBlock.putBytes(_input.bytes());\n\n    // compute remaining size to be digested (include message length size)\n    var remaining = (\n      md.fullMessageLength[md.fullMessageLength.length - 1] +\n      md.messageLengthSize);\n\n    // add padding for overflow blockSize - overflow\n    // _padding starts with 1 byte with first bit is set (byte value 128), then\n    // there may be up to (blockSize - 1) other pad bytes\n    var overflow = remaining & (md.blockLength - 1);\n    finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow));\n\n    // serialize message length in bits in big-endian order; since length\n    // is stored in bytes we multiply by 8 and add carry from next int\n    var next, carry;\n    var bits = md.fullMessageLength[0] * 8;\n    for(var i = 0; i < md.fullMessageLength.length - 1; ++i) {\n      next = md.fullMessageLength[i + 1] * 8;\n      carry = (next / 0x100000000) >>> 0;\n      bits += carry;\n      finalBlock.putInt32(bits >>> 0);\n      bits = next >>> 0;\n    }\n    finalBlock.putInt32(bits);\n\n    var h = new Array(_h.length);\n    for(var i = 0; i < _h.length; ++i) {\n      h[i] = _h[i].slice(0);\n    }\n    _update(h, _w, finalBlock);\n    var rval = forge.util.createBuffer();\n    var hlen;\n    if(algorithm === 'SHA-512') {\n      hlen = h.length;\n    } else if(algorithm === 'SHA-384') {\n      hlen = h.length - 2;\n    } else {\n      hlen = h.length - 4;\n    }\n    for(var i = 0; i < hlen; ++i) {\n      rval.putInt32(h[i][0]);\n      if(i !== hlen - 1 || algorithm !== 'SHA-512/224') {\n        rval.putInt32(h[i][1]);\n      }\n    }\n    return rval;\n  };\n\n  return md;\n};\n\n// sha-512 padding bytes not initialized yet\nvar _padding = null;\nvar _initialized = false;\n\n// table of constants\nvar _k = null;\n\n// initial hash states\nvar _states = null;\n\n/**\n * Initializes the constant tables.\n */\nfunction _init() {\n  // create padding\n  _padding = String.fromCharCode(128);\n  _padding += forge.util.fillString(String.fromCharCode(0x00), 128);\n\n  // create K table for SHA-512\n  _k = [\n    [0x428a2f98, 0xd728ae22], [0x71374491, 0x23ef65cd],\n    [0xb5c0fbcf, 0xec4d3b2f], [0xe9b5dba5, 0x8189dbbc],\n    [0x3956c25b, 0xf348b538], [0x59f111f1, 0xb605d019],\n    [0x923f82a4, 0xaf194f9b], [0xab1c5ed5, 0xda6d8118],\n    [0xd807aa98, 0xa3030242], [0x12835b01, 0x45706fbe],\n    [0x243185be, 0x4ee4b28c], [0x550c7dc3, 0xd5ffb4e2],\n    [0x72be5d74, 0xf27b896f], [0x80deb1fe, 0x3b1696b1],\n    [0x9bdc06a7, 0x25c71235], [0xc19bf174, 0xcf692694],\n    [0xe49b69c1, 0x9ef14ad2], [0xefbe4786, 0x384f25e3],\n    [0x0fc19dc6, 0x8b8cd5b5], [0x240ca1cc, 0x77ac9c65],\n    [0x2de92c6f, 0x592b0275], [0x4a7484aa, 0x6ea6e483],\n    [0x5cb0a9dc, 0xbd41fbd4], [0x76f988da, 0x831153b5],\n    [0x983e5152, 0xee66dfab], [0xa831c66d, 0x2db43210],\n    [0xb00327c8, 0x98fb213f], [0xbf597fc7, 0xbeef0ee4],\n    [0xc6e00bf3, 0x3da88fc2], [0xd5a79147, 0x930aa725],\n    [0x06ca6351, 0xe003826f], [0x14292967, 0x0a0e6e70],\n    [0x27b70a85, 0x46d22ffc], [0x2e1b2138, 0x5c26c926],\n    [0x4d2c6dfc, 0x5ac42aed], [0x53380d13, 0x9d95b3df],\n    [0x650a7354, 0x8baf63de], [0x766a0abb, 0x3c77b2a8],\n    [0x81c2c92e, 0x47edaee6], [0x92722c85, 0x1482353b],\n    [0xa2bfe8a1, 0x4cf10364], [0xa81a664b, 0xbc423001],\n    [0xc24b8b70, 0xd0f89791], [0xc76c51a3, 0x0654be30],\n    [0xd192e819, 0xd6ef5218], [0xd6990624, 0x5565a910],\n    [0xf40e3585, 0x5771202a], [0x106aa070, 0x32bbd1b8],\n    [0x19a4c116, 0xb8d2d0c8], [0x1e376c08, 0x5141ab53],\n    [0x2748774c, 0xdf8eeb99], [0x34b0bcb5, 0xe19b48a8],\n    [0x391c0cb3, 0xc5c95a63], [0x4ed8aa4a, 0xe3418acb],\n    [0x5b9cca4f, 0x7763e373], [0x682e6ff3, 0xd6b2b8a3],\n    [0x748f82ee, 0x5defb2fc], [0x78a5636f, 0x43172f60],\n    [0x84c87814, 0xa1f0ab72], [0x8cc70208, 0x1a6439ec],\n    [0x90befffa, 0x23631e28], [0xa4506ceb, 0xde82bde9],\n    [0xbef9a3f7, 0xb2c67915], [0xc67178f2, 0xe372532b],\n    [0xca273ece, 0xea26619c], [0xd186b8c7, 0x21c0c207],\n    [0xeada7dd6, 0xcde0eb1e], [0xf57d4f7f, 0xee6ed178],\n    [0x06f067aa, 0x72176fba], [0x0a637dc5, 0xa2c898a6],\n    [0x113f9804, 0xbef90dae], [0x1b710b35, 0x131c471b],\n    [0x28db77f5, 0x23047d84], [0x32caab7b, 0x40c72493],\n    [0x3c9ebe0a, 0x15c9bebc], [0x431d67c4, 0x9c100d4c],\n    [0x4cc5d4be, 0xcb3e42b6], [0x597f299c, 0xfc657e2a],\n    [0x5fcb6fab, 0x3ad6faec], [0x6c44198c, 0x4a475817]\n  ];\n\n  // initial hash states\n  _states = {};\n  _states['SHA-512'] = [\n    [0x6a09e667, 0xf3bcc908],\n    [0xbb67ae85, 0x84caa73b],\n    [0x3c6ef372, 0xfe94f82b],\n    [0xa54ff53a, 0x5f1d36f1],\n    [0x510e527f, 0xade682d1],\n    [0x9b05688c, 0x2b3e6c1f],\n    [0x1f83d9ab, 0xfb41bd6b],\n    [0x5be0cd19, 0x137e2179]\n  ];\n  _states['SHA-384'] = [\n    [0xcbbb9d5d, 0xc1059ed8],\n    [0x629a292a, 0x367cd507],\n    [0x9159015a, 0x3070dd17],\n    [0x152fecd8, 0xf70e5939],\n    [0x67332667, 0xffc00b31],\n    [0x8eb44a87, 0x68581511],\n    [0xdb0c2e0d, 0x64f98fa7],\n    [0x47b5481d, 0xbefa4fa4]\n  ];\n  _states['SHA-512/256'] = [\n    [0x22312194, 0xFC2BF72C],\n    [0x9F555FA3, 0xC84C64C2],\n    [0x2393B86B, 0x6F53B151],\n    [0x96387719, 0x5940EABD],\n    [0x96283EE2, 0xA88EFFE3],\n    [0xBE5E1E25, 0x53863992],\n    [0x2B0199FC, 0x2C85B8AA],\n    [0x0EB72DDC, 0x81C52CA2]\n  ];\n  _states['SHA-512/224'] = [\n    [0x8C3D37C8, 0x19544DA2],\n    [0x73E19966, 0x89DCD4D6],\n    [0x1DFAB7AE, 0x32FF9C82],\n    [0x679DD514, 0x582F9FCF],\n    [0x0F6D2B69, 0x7BD44DA8],\n    [0x77E36F73, 0x04C48942],\n    [0x3F9D85A8, 0x6A1D36C8],\n    [0x1112E6AD, 0x91D692A1]\n  ];\n\n  // now initialized\n  _initialized = true;\n}\n\n/**\n * Updates a SHA-512 state with the given byte buffer.\n *\n * @param s the SHA-512 state to update.\n * @param w the array to use to store words.\n * @param bytes the byte buffer to update with.\n */\nfunction _update(s, w, bytes) {\n  // consume 512 bit (128 byte) chunks\n  var t1_hi, t1_lo;\n  var t2_hi, t2_lo;\n  var s0_hi, s0_lo;\n  var s1_hi, s1_lo;\n  var ch_hi, ch_lo;\n  var maj_hi, maj_lo;\n  var a_hi, a_lo;\n  var b_hi, b_lo;\n  var c_hi, c_lo;\n  var d_hi, d_lo;\n  var e_hi, e_lo;\n  var f_hi, f_lo;\n  var g_hi, g_lo;\n  var h_hi, h_lo;\n  var i, hi, lo, w2, w7, w15, w16;\n  var len = bytes.length();\n  while(len >= 128) {\n    // the w array will be populated with sixteen 64-bit big-endian words\n    // and then extended into 64 64-bit words according to SHA-512\n    for(i = 0; i < 16; ++i) {\n      w[i][0] = bytes.getInt32() >>> 0;\n      w[i][1] = bytes.getInt32() >>> 0;\n    }\n    for(; i < 80; ++i) {\n      // for word 2 words ago: ROTR 19(x) ^ ROTR 61(x) ^ SHR 6(x)\n      w2 = w[i - 2];\n      hi = w2[0];\n      lo = w2[1];\n\n      // high bits\n      t1_hi = (\n        ((hi >>> 19) | (lo << 13)) ^ // ROTR 19\n        ((lo >>> 29) | (hi << 3)) ^ // ROTR 61/(swap + ROTR 29)\n        (hi >>> 6)) >>> 0; // SHR 6\n      // low bits\n      t1_lo = (\n        ((hi << 13) | (lo >>> 19)) ^ // ROTR 19\n        ((lo << 3) | (hi >>> 29)) ^ // ROTR 61/(swap + ROTR 29)\n        ((hi << 26) | (lo >>> 6))) >>> 0; // SHR 6\n\n      // for word 15 words ago: ROTR 1(x) ^ ROTR 8(x) ^ SHR 7(x)\n      w15 = w[i - 15];\n      hi = w15[0];\n      lo = w15[1];\n\n      // high bits\n      t2_hi = (\n        ((hi >>> 1) | (lo << 31)) ^ // ROTR 1\n        ((hi >>> 8) | (lo << 24)) ^ // ROTR 8\n        (hi >>> 7)) >>> 0; // SHR 7\n      // low bits\n      t2_lo = (\n        ((hi << 31) | (lo >>> 1)) ^ // ROTR 1\n        ((hi << 24) | (lo >>> 8)) ^ // ROTR 8\n        ((hi << 25) | (lo >>> 7))) >>> 0; // SHR 7\n\n      // sum(t1, word 7 ago, t2, word 16 ago) modulo 2^64 (carry lo overflow)\n      w7 = w[i - 7];\n      w16 = w[i - 16];\n      lo = (t1_lo + w7[1] + t2_lo + w16[1]);\n      w[i][0] = (t1_hi + w7[0] + t2_hi + w16[0] +\n        ((lo / 0x100000000) >>> 0)) >>> 0;\n      w[i][1] = lo >>> 0;\n    }\n\n    // initialize hash value for this chunk\n    a_hi = s[0][0];\n    a_lo = s[0][1];\n    b_hi = s[1][0];\n    b_lo = s[1][1];\n    c_hi = s[2][0];\n    c_lo = s[2][1];\n    d_hi = s[3][0];\n    d_lo = s[3][1];\n    e_hi = s[4][0];\n    e_lo = s[4][1];\n    f_hi = s[5][0];\n    f_lo = s[5][1];\n    g_hi = s[6][0];\n    g_lo = s[6][1];\n    h_hi = s[7][0];\n    h_lo = s[7][1];\n\n    // round function\n    for(i = 0; i < 80; ++i) {\n      // Sum1(e) = ROTR 14(e) ^ ROTR 18(e) ^ ROTR 41(e)\n      s1_hi = (\n        ((e_hi >>> 14) | (e_lo << 18)) ^ // ROTR 14\n        ((e_hi >>> 18) | (e_lo << 14)) ^ // ROTR 18\n        ((e_lo >>> 9) | (e_hi << 23))) >>> 0; // ROTR 41/(swap + ROTR 9)\n      s1_lo = (\n        ((e_hi << 18) | (e_lo >>> 14)) ^ // ROTR 14\n        ((e_hi << 14) | (e_lo >>> 18)) ^ // ROTR 18\n        ((e_lo << 23) | (e_hi >>> 9))) >>> 0; // ROTR 41/(swap + ROTR 9)\n\n      // Ch(e, f, g) (optimized the same way as SHA-1)\n      ch_hi = (g_hi ^ (e_hi & (f_hi ^ g_hi))) >>> 0;\n      ch_lo = (g_lo ^ (e_lo & (f_lo ^ g_lo))) >>> 0;\n\n      // Sum0(a) = ROTR 28(a) ^ ROTR 34(a) ^ ROTR 39(a)\n      s0_hi = (\n        ((a_hi >>> 28) | (a_lo << 4)) ^ // ROTR 28\n        ((a_lo >>> 2) | (a_hi << 30)) ^ // ROTR 34/(swap + ROTR 2)\n        ((a_lo >>> 7) | (a_hi << 25))) >>> 0; // ROTR 39/(swap + ROTR 7)\n      s0_lo = (\n        ((a_hi << 4) | (a_lo >>> 28)) ^ // ROTR 28\n        ((a_lo << 30) | (a_hi >>> 2)) ^ // ROTR 34/(swap + ROTR 2)\n        ((a_lo << 25) | (a_hi >>> 7))) >>> 0; // ROTR 39/(swap + ROTR 7)\n\n      // Maj(a, b, c) (optimized the same way as SHA-1)\n      maj_hi = ((a_hi & b_hi) | (c_hi & (a_hi ^ b_hi))) >>> 0;\n      maj_lo = ((a_lo & b_lo) | (c_lo & (a_lo ^ b_lo))) >>> 0;\n\n      // main algorithm\n      // t1 = (h + s1 + ch + _k[i] + _w[i]) modulo 2^64 (carry lo overflow)\n      lo = (h_lo + s1_lo + ch_lo + _k[i][1] + w[i][1]);\n      t1_hi = (h_hi + s1_hi + ch_hi + _k[i][0] + w[i][0] +\n        ((lo / 0x100000000) >>> 0)) >>> 0;\n      t1_lo = lo >>> 0;\n\n      // t2 = s0 + maj modulo 2^64 (carry lo overflow)\n      lo = s0_lo + maj_lo;\n      t2_hi = (s0_hi + maj_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n      t2_lo = lo >>> 0;\n\n      h_hi = g_hi;\n      h_lo = g_lo;\n\n      g_hi = f_hi;\n      g_lo = f_lo;\n\n      f_hi = e_hi;\n      f_lo = e_lo;\n\n      // e = (d + t1) modulo 2^64 (carry lo overflow)\n      lo = d_lo + t1_lo;\n      e_hi = (d_hi + t1_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n      e_lo = lo >>> 0;\n\n      d_hi = c_hi;\n      d_lo = c_lo;\n\n      c_hi = b_hi;\n      c_lo = b_lo;\n\n      b_hi = a_hi;\n      b_lo = a_lo;\n\n      // a = (t1 + t2) modulo 2^64 (carry lo overflow)\n      lo = t1_lo + t2_lo;\n      a_hi = (t1_hi + t2_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n      a_lo = lo >>> 0;\n    }\n\n    // update hash state (additional modulo 2^64)\n    lo = s[0][1] + a_lo;\n    s[0][0] = (s[0][0] + a_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[0][1] = lo >>> 0;\n\n    lo = s[1][1] + b_lo;\n    s[1][0] = (s[1][0] + b_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[1][1] = lo >>> 0;\n\n    lo = s[2][1] + c_lo;\n    s[2][0] = (s[2][0] + c_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[2][1] = lo >>> 0;\n\n    lo = s[3][1] + d_lo;\n    s[3][0] = (s[3][0] + d_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[3][1] = lo >>> 0;\n\n    lo = s[4][1] + e_lo;\n    s[4][0] = (s[4][0] + e_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[4][1] = lo >>> 0;\n\n    lo = s[5][1] + f_lo;\n    s[5][0] = (s[5][0] + f_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[5][1] = lo >>> 0;\n\n    lo = s[6][1] + g_lo;\n    s[6][0] = (s[6][0] + g_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[6][1] = lo >>> 0;\n\n    lo = s[7][1] + h_lo;\n    s[7][0] = (s[7][0] + h_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[7][1] = lo >>> 0;\n\n    len -= 128;\n  }\n}\n","/**\n * Copyright (c) 2019 Digital Bazaar, Inc.\n */\n\nvar forge = require('./forge');\nrequire('./asn1');\nvar asn1 = forge.asn1;\n\nexports.privateKeyValidator = {\n  // PrivateKeyInfo\n  name: 'PrivateKeyInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    // Version (INTEGER)\n    name: 'PrivateKeyInfo.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyVersion'\n  }, {\n    // privateKeyAlgorithm\n    name: 'PrivateKeyInfo.privateKeyAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'AlgorithmIdentifier.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'privateKeyOid'\n    }]\n  }, {\n    // PrivateKey\n    name: 'PrivateKeyInfo',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'privateKey'\n  }]\n};\n\nexports.publicKeyValidator = {\n  name: 'SubjectPublicKeyInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  captureAsn1: 'subjectPublicKeyInfo',\n  value: [{\n    name: 'SubjectPublicKeyInfo.AlgorithmIdentifier',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'AlgorithmIdentifier.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'publicKeyOid'\n    }]\n  },\n  // capture group for ed25519PublicKey\n  {\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.BITSTRING,\n    constructed: false,\n    composed: true,\n    captureBitStringValue: 'ed25519PublicKey'\n  }\n  // FIXME: this is capture group for rsaPublicKey, use it in this API or\n  // discard?\n  /* {\n    // subjectPublicKey\n    name: 'SubjectPublicKeyInfo.subjectPublicKey',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.BITSTRING,\n    constructed: false,\n    value: [{\n      // RSAPublicKey\n      name: 'SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      optional: true,\n      captureAsn1: 'rsaPublicKey'\n    }]\n  } */\n  ]\n};\n","/**\n * JavaScript implementation of Ed25519.\n *\n * Copyright (c) 2017-2019 Digital Bazaar, Inc.\n *\n * This implementation is based on the most excellent TweetNaCl which is\n * in the public domain. Many thanks to its contributors:\n *\n * https://github.com/dchest/tweetnacl-js\n */\nvar forge = require('./forge');\nrequire('./jsbn');\nrequire('./random');\nrequire('./sha512');\nrequire('./util');\nvar asn1Validator = require('./asn1-validator');\nvar publicKeyValidator = asn1Validator.publicKeyValidator;\nvar privateKeyValidator = asn1Validator.privateKeyValidator;\n\nif(typeof BigInteger === 'undefined') {\n  var BigInteger = forge.jsbn.BigInteger;\n}\n\nvar ByteBuffer = forge.util.ByteBuffer;\nvar NativeBuffer = typeof Buffer === 'undefined' ? Uint8Array : Buffer;\n\n/*\n * Ed25519 algorithms, see RFC 8032:\n * https://tools.ietf.org/html/rfc8032\n */\nforge.pki = forge.pki || {};\nmodule.exports = forge.pki.ed25519 = forge.ed25519 = forge.ed25519 || {};\nvar ed25519 = forge.ed25519;\n\ned25519.constants = {};\ned25519.constants.PUBLIC_KEY_BYTE_LENGTH = 32;\ned25519.constants.PRIVATE_KEY_BYTE_LENGTH = 64;\ned25519.constants.SEED_BYTE_LENGTH = 32;\ned25519.constants.SIGN_BYTE_LENGTH = 64;\ned25519.constants.HASH_BYTE_LENGTH = 64;\n\ned25519.generateKeyPair = function(options) {\n  options = options || {};\n  var seed = options.seed;\n  if(seed === undefined) {\n    // generate seed\n    seed = forge.random.getBytesSync(ed25519.constants.SEED_BYTE_LENGTH);\n  } else if(typeof seed === 'string') {\n    if(seed.length !== ed25519.constants.SEED_BYTE_LENGTH) {\n      throw new TypeError(\n        '\"seed\" must be ' + ed25519.constants.SEED_BYTE_LENGTH +\n        ' bytes in length.');\n    }\n  } else if(!(seed instanceof Uint8Array)) {\n    throw new TypeError(\n      '\"seed\" must be a node.js Buffer, Uint8Array, or a binary string.');\n  }\n\n  seed = messageToNativeBuffer({message: seed, encoding: 'binary'});\n\n  var pk = new NativeBuffer(ed25519.constants.PUBLIC_KEY_BYTE_LENGTH);\n  var sk = new NativeBuffer(ed25519.constants.PRIVATE_KEY_BYTE_LENGTH);\n  for(var i = 0; i < 32; ++i) {\n    sk[i] = seed[i];\n  }\n  crypto_sign_keypair(pk, sk);\n  return {publicKey: pk, privateKey: sk};\n};\n\n/**\n * Converts a private key from a RFC8410 ASN.1 encoding.\n *\n * @param obj - The asn1 representation of a private key.\n *\n * @returns {Object} keyInfo - The key information.\n * @returns {Buffer|Uint8Array} keyInfo.privateKeyBytes - 32 private key bytes.\n */\ned25519.privateKeyFromAsn1 = function(obj) {\n  var capture = {};\n  var errors = [];\n  var valid = forge.asn1.validate(obj, privateKeyValidator, capture, errors);\n  if(!valid) {\n    var error = new Error('Invalid Key.');\n    error.errors = errors;\n    throw error;\n  }\n  var oid = forge.asn1.derToOid(capture.privateKeyOid);\n  var ed25519Oid = forge.oids.EdDSA25519;\n  if(oid !== ed25519Oid) {\n    throw new Error('Invalid OID \"' + oid + '\"; OID must be \"' +\n      ed25519Oid + '\".');\n  }\n  var privateKey = capture.privateKey;\n  // manually extract the private key bytes from nested octet string, see FIXME:\n  // https://github.com/digitalbazaar/forge/blob/master/lib/asn1.js#L542\n  var privateKeyBytes = messageToNativeBuffer({\n    message: forge.asn1.fromDer(privateKey).value,\n    encoding: 'binary'\n  });\n  // TODO: RFC8410 specifies a format for encoding the public key bytes along\n  // with the private key bytes. `publicKeyBytes` can be returned in the\n  // future. https://tools.ietf.org/html/rfc8410#section-10.3\n  return {privateKeyBytes: privateKeyBytes};\n};\n\n/**\n * Converts a public key from a RFC8410 ASN.1 encoding.\n *\n * @param obj - The asn1 representation of a public key.\n *\n * @return {Buffer|Uint8Array} - 32 public key bytes.\n */\ned25519.publicKeyFromAsn1 = function(obj) {\n  // get SubjectPublicKeyInfo\n  var capture = {};\n  var errors = [];\n  var valid = forge.asn1.validate(obj, publicKeyValidator, capture, errors);\n  if(!valid) {\n    var error = new Error('Invalid Key.');\n    error.errors = errors;\n    throw error;\n  }\n  var oid = forge.asn1.derToOid(capture.publicKeyOid);\n  var ed25519Oid = forge.oids.EdDSA25519;\n  if(oid !== ed25519Oid) {\n    throw new Error('Invalid OID \"' + oid + '\"; OID must be \"' +\n      ed25519Oid + '\".');\n  }\n  var publicKeyBytes = capture.ed25519PublicKey;\n  if(publicKeyBytes.length !== ed25519.constants.PUBLIC_KEY_BYTE_LENGTH) {\n    throw new Error('Key length is invalid.');\n  }\n  return messageToNativeBuffer({\n    message: publicKeyBytes,\n    encoding: 'binary'\n  });\n};\n\ned25519.publicKeyFromPrivateKey = function(options) {\n  options = options || {};\n  var privateKey = messageToNativeBuffer({\n    message: options.privateKey, encoding: 'binary'\n  });\n  if(privateKey.length !== ed25519.constants.PRIVATE_KEY_BYTE_LENGTH) {\n    throw new TypeError(\n      '\"options.privateKey\" must have a byte length of ' +\n      ed25519.constants.PRIVATE_KEY_BYTE_LENGTH);\n  }\n\n  var pk = new NativeBuffer(ed25519.constants.PUBLIC_KEY_BYTE_LENGTH);\n  for(var i = 0; i < pk.length; ++i) {\n    pk[i] = privateKey[32 + i];\n  }\n  return pk;\n};\n\ned25519.sign = function(options) {\n  options = options || {};\n  var msg = messageToNativeBuffer(options);\n  var privateKey = messageToNativeBuffer({\n    message: options.privateKey,\n    encoding: 'binary'\n  });\n  if(privateKey.length === ed25519.constants.SEED_BYTE_LENGTH) {\n    var keyPair = ed25519.generateKeyPair({seed: privateKey});\n    privateKey = keyPair.privateKey;\n  } else if(privateKey.length !== ed25519.constants.PRIVATE_KEY_BYTE_LENGTH) {\n    throw new TypeError(\n      '\"options.privateKey\" must have a byte length of ' +\n      ed25519.constants.SEED_BYTE_LENGTH + ' or ' +\n      ed25519.constants.PRIVATE_KEY_BYTE_LENGTH);\n  }\n\n  var signedMsg = new NativeBuffer(\n    ed25519.constants.SIGN_BYTE_LENGTH + msg.length);\n  crypto_sign(signedMsg, msg, msg.length, privateKey);\n\n  var sig = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH);\n  for(var i = 0; i < sig.length; ++i) {\n    sig[i] = signedMsg[i];\n  }\n  return sig;\n};\n\ned25519.verify = function(options) {\n  options = options || {};\n  var msg = messageToNativeBuffer(options);\n  if(options.signature === undefined) {\n    throw new TypeError(\n      '\"options.signature\" must be a node.js Buffer, a Uint8Array, a forge ' +\n      'ByteBuffer, or a binary string.');\n  }\n  var sig = messageToNativeBuffer({\n    message: options.signature,\n    encoding: 'binary'\n  });\n  if(sig.length !== ed25519.constants.SIGN_BYTE_LENGTH) {\n    throw new TypeError(\n      '\"options.signature\" must have a byte length of ' +\n      ed25519.constants.SIGN_BYTE_LENGTH);\n  }\n  var publicKey = messageToNativeBuffer({\n    message: options.publicKey,\n    encoding: 'binary'\n  });\n  if(publicKey.length !== ed25519.constants.PUBLIC_KEY_BYTE_LENGTH) {\n    throw new TypeError(\n      '\"options.publicKey\" must have a byte length of ' +\n      ed25519.constants.PUBLIC_KEY_BYTE_LENGTH);\n  }\n\n  var sm = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH + msg.length);\n  var m = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH + msg.length);\n  var i;\n  for(i = 0; i < ed25519.constants.SIGN_BYTE_LENGTH; ++i) {\n    sm[i] = sig[i];\n  }\n  for(i = 0; i < msg.length; ++i) {\n    sm[i + ed25519.constants.SIGN_BYTE_LENGTH] = msg[i];\n  }\n  return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);\n};\n\nfunction messageToNativeBuffer(options) {\n  var message = options.message;\n  if(message instanceof Uint8Array || message instanceof NativeBuffer) {\n    return message;\n  }\n\n  var encoding = options.encoding;\n  if(message === undefined) {\n    if(options.md) {\n      // TODO: more rigorous validation that `md` is a MessageDigest\n      message = options.md.digest().getBytes();\n      encoding = 'binary';\n    } else {\n      throw new TypeError('\"options.message\" or \"options.md\" not specified.');\n    }\n  }\n\n  if(typeof message === 'string' && !encoding) {\n    throw new TypeError('\"options.encoding\" must be \"binary\" or \"utf8\".');\n  }\n\n  if(typeof message === 'string') {\n    if(typeof Buffer !== 'undefined') {\n      return Buffer.from(message, encoding);\n    }\n    message = new ByteBuffer(message, encoding);\n  } else if(!(message instanceof ByteBuffer)) {\n    throw new TypeError(\n      '\"options.message\" must be a node.js Buffer, a Uint8Array, a forge ' +\n      'ByteBuffer, or a string with \"options.encoding\" specifying its ' +\n      'encoding.');\n  }\n\n  // convert to native buffer\n  var buffer = new NativeBuffer(message.length());\n  for(var i = 0; i < buffer.length; ++i) {\n    buffer[i] = message.at(i);\n  }\n  return buffer;\n}\n\nvar gf0 = gf();\nvar gf1 = gf([1]);\nvar D = gf([\n  0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070,\n  0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]);\nvar D2 = gf([\n  0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0,\n  0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]);\nvar X = gf([\n  0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c,\n  0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]);\nvar Y = gf([\n  0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666,\n  0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]);\nvar L = new Float64Array([\n  0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,\n  0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);\nvar I = gf([\n  0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43,\n  0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);\n\n// TODO: update forge buffer implementation to use `Buffer` or `Uint8Array`,\n// whichever is available, to improve performance\nfunction sha512(msg, msgLen) {\n  // Note: `out` and `msg` are NativeBuffer\n  var md = forge.md.sha512.create();\n  var buffer = new ByteBuffer(msg);\n  md.update(buffer.getBytes(msgLen), 'binary');\n  var hash = md.digest().getBytes();\n  if(typeof Buffer !== 'undefined') {\n    return Buffer.from(hash, 'binary');\n  }\n  var out = new NativeBuffer(ed25519.constants.HASH_BYTE_LENGTH);\n  for(var i = 0; i < 64; ++i) {\n    out[i] = hash.charCodeAt(i);\n  }\n  return out;\n}\n\nfunction crypto_sign_keypair(pk, sk) {\n  var p = [gf(), gf(), gf(), gf()];\n  var i;\n\n  var d = sha512(sk, 32);\n  d[0] &= 248;\n  d[31] &= 127;\n  d[31] |= 64;\n\n  scalarbase(p, d);\n  pack(pk, p);\n\n  for(i = 0; i < 32; ++i) {\n    sk[i + 32] = pk[i];\n  }\n  return 0;\n}\n\n// Note: difference from C - smlen returned, not passed as argument.\nfunction crypto_sign(sm, m, n, sk) {\n  var i, j, x = new Float64Array(64);\n  var p = [gf(), gf(), gf(), gf()];\n\n  var d = sha512(sk, 32);\n  d[0] &= 248;\n  d[31] &= 127;\n  d[31] |= 64;\n\n  var smlen = n + 64;\n  for(i = 0; i < n; ++i) {\n    sm[64 + i] = m[i];\n  }\n  for(i = 0; i < 32; ++i) {\n    sm[32 + i] = d[32 + i];\n  }\n\n  var r = sha512(sm.subarray(32), n + 32);\n  reduce(r);\n  scalarbase(p, r);\n  pack(sm, p);\n\n  for(i = 32; i < 64; ++i) {\n    sm[i] = sk[i];\n  }\n  var h = sha512(sm, n + 64);\n  reduce(h);\n\n  for(i = 32; i < 64; ++i) {\n    x[i] = 0;\n  }\n  for(i = 0; i < 32; ++i) {\n    x[i] = r[i];\n  }\n  for(i = 0; i < 32; ++i) {\n    for(j = 0; j < 32; j++) {\n      x[i + j] += h[i] * d[j];\n    }\n  }\n\n  modL(sm.subarray(32), x);\n  return smlen;\n}\n\nfunction crypto_sign_open(m, sm, n, pk) {\n  var i, mlen;\n  var t = new NativeBuffer(32);\n  var p = [gf(), gf(), gf(), gf()],\n      q = [gf(), gf(), gf(), gf()];\n\n  mlen = -1;\n  if(n < 64) {\n    return -1;\n  }\n\n  if(unpackneg(q, pk)) {\n    return -1;\n  }\n\n  for(i = 0; i < n; ++i) {\n    m[i] = sm[i];\n  }\n  for(i = 0; i < 32; ++i) {\n    m[i + 32] = pk[i];\n  }\n  var h = sha512(m, n);\n  reduce(h);\n  scalarmult(p, q, h);\n\n  scalarbase(q, sm.subarray(32));\n  add(p, q);\n  pack(t, p);\n\n  n -= 64;\n  if(crypto_verify_32(sm, 0, t, 0)) {\n    for(i = 0; i < n; ++i) {\n      m[i] = 0;\n    }\n    return -1;\n  }\n\n  for(i = 0; i < n; ++i) {\n    m[i] = sm[i + 64];\n  }\n  mlen = n;\n  return mlen;\n}\n\nfunction modL(r, x) {\n  var carry, i, j, k;\n  for(i = 63; i >= 32; --i) {\n    carry = 0;\n    for(j = i - 32, k = i - 12; j < k; ++j) {\n      x[j] += carry - 16 * x[i] * L[j - (i - 32)];\n      carry = (x[j] + 128) >> 8;\n      x[j] -= carry * 256;\n    }\n    x[j] += carry;\n    x[i] = 0;\n  }\n  carry = 0;\n  for(j = 0; j < 32; ++j) {\n    x[j] += carry - (x[31] >> 4) * L[j];\n    carry = x[j] >> 8;\n    x[j] &= 255;\n  }\n  for(j = 0; j < 32; ++j) {\n    x[j] -= carry * L[j];\n  }\n  for(i = 0; i < 32; ++i) {\n    x[i + 1] += x[i] >> 8;\n    r[i] = x[i] & 255;\n  }\n}\n\nfunction reduce(r) {\n  var x = new Float64Array(64);\n  for(var i = 0; i < 64; ++i) {\n    x[i] = r[i];\n    r[i] = 0;\n  }\n  modL(r, x);\n}\n\nfunction add(p, q) {\n  var a = gf(), b = gf(), c = gf(),\n      d = gf(), e = gf(), f = gf(),\n      g = gf(), h = gf(), t = gf();\n\n  Z(a, p[1], p[0]);\n  Z(t, q[1], q[0]);\n  M(a, a, t);\n  A(b, p[0], p[1]);\n  A(t, q[0], q[1]);\n  M(b, b, t);\n  M(c, p[3], q[3]);\n  M(c, c, D2);\n  M(d, p[2], q[2]);\n  A(d, d, d);\n  Z(e, b, a);\n  Z(f, d, c);\n  A(g, d, c);\n  A(h, b, a);\n\n  M(p[0], e, f);\n  M(p[1], h, g);\n  M(p[2], g, f);\n  M(p[3], e, h);\n}\n\nfunction cswap(p, q, b) {\n  for(var i = 0; i < 4; ++i) {\n    sel25519(p[i], q[i], b);\n  }\n}\n\nfunction pack(r, p) {\n  var tx = gf(), ty = gf(), zi = gf();\n  inv25519(zi, p[2]);\n  M(tx, p[0], zi);\n  M(ty, p[1], zi);\n  pack25519(r, ty);\n  r[31] ^= par25519(tx) << 7;\n}\n\nfunction pack25519(o, n) {\n  var i, j, b;\n  var m = gf(), t = gf();\n  for(i = 0; i < 16; ++i) {\n    t[i] = n[i];\n  }\n  car25519(t);\n  car25519(t);\n  car25519(t);\n  for(j = 0; j < 2; ++j) {\n    m[0] = t[0] - 0xffed;\n    for(i = 1; i < 15; ++i) {\n      m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1);\n      m[i-1] &= 0xffff;\n    }\n    m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1);\n    b = (m[15] >> 16) & 1;\n    m[14] &= 0xffff;\n    sel25519(t, m, 1 - b);\n  }\n  for (i = 0; i < 16; i++) {\n    o[2 * i] = t[i] & 0xff;\n    o[2 * i + 1] = t[i] >> 8;\n  }\n}\n\nfunction unpackneg(r, p) {\n  var t = gf(), chk = gf(), num = gf(),\n      den = gf(), den2 = gf(), den4 = gf(),\n      den6 = gf();\n\n  set25519(r[2], gf1);\n  unpack25519(r[1], p);\n  S(num, r[1]);\n  M(den, num, D);\n  Z(num, num, r[2]);\n  A(den, r[2], den);\n\n  S(den2, den);\n  S(den4, den2);\n  M(den6, den4, den2);\n  M(t, den6, num);\n  M(t, t, den);\n\n  pow2523(t, t);\n  M(t, t, num);\n  M(t, t, den);\n  M(t, t, den);\n  M(r[0], t, den);\n\n  S(chk, r[0]);\n  M(chk, chk, den);\n  if(neq25519(chk, num)) {\n    M(r[0], r[0], I);\n  }\n\n  S(chk, r[0]);\n  M(chk, chk, den);\n  if(neq25519(chk, num)) {\n    return -1;\n  }\n\n  if(par25519(r[0]) === (p[31] >> 7)) {\n    Z(r[0], gf0, r[0]);\n  }\n\n  M(r[3], r[0], r[1]);\n  return 0;\n}\n\nfunction unpack25519(o, n) {\n  var i;\n  for(i = 0; i < 16; ++i) {\n    o[i] = n[2 * i] + (n[2 * i + 1] << 8);\n  }\n  o[15] &= 0x7fff;\n}\n\nfunction pow2523(o, i) {\n  var c = gf();\n  var a;\n  for(a = 0; a < 16; ++a) {\n    c[a] = i[a];\n  }\n  for(a = 250; a >= 0; --a) {\n    S(c, c);\n    if(a !== 1) {\n      M(c, c, i);\n    }\n  }\n  for(a = 0; a < 16; ++a) {\n    o[a] = c[a];\n  }\n}\n\nfunction neq25519(a, b) {\n  var c = new NativeBuffer(32);\n  var d = new NativeBuffer(32);\n  pack25519(c, a);\n  pack25519(d, b);\n  return crypto_verify_32(c, 0, d, 0);\n}\n\nfunction crypto_verify_32(x, xi, y, yi) {\n  return vn(x, xi, y, yi, 32);\n}\n\nfunction vn(x, xi, y, yi, n) {\n  var i, d = 0;\n  for(i = 0; i < n; ++i) {\n    d |= x[xi + i] ^ y[yi + i];\n  }\n  return (1 & ((d - 1) >>> 8)) - 1;\n}\n\nfunction par25519(a) {\n  var d = new NativeBuffer(32);\n  pack25519(d, a);\n  return d[0] & 1;\n}\n\nfunction scalarmult(p, q, s) {\n  var b, i;\n  set25519(p[0], gf0);\n  set25519(p[1], gf1);\n  set25519(p[2], gf1);\n  set25519(p[3], gf0);\n  for(i = 255; i >= 0; --i) {\n    b = (s[(i / 8)|0] >> (i & 7)) & 1;\n    cswap(p, q, b);\n    add(q, p);\n    add(p, p);\n    cswap(p, q, b);\n  }\n}\n\nfunction scalarbase(p, s) {\n  var q = [gf(), gf(), gf(), gf()];\n  set25519(q[0], X);\n  set25519(q[1], Y);\n  set25519(q[2], gf1);\n  M(q[3], X, Y);\n  scalarmult(p, q, s);\n}\n\nfunction set25519(r, a) {\n  var i;\n  for(i = 0; i < 16; i++) {\n    r[i] = a[i] | 0;\n  }\n}\n\nfunction inv25519(o, i) {\n  var c = gf();\n  var a;\n  for(a = 0; a < 16; ++a) {\n    c[a] = i[a];\n  }\n  for(a = 253; a >= 0; --a) {\n    S(c, c);\n    if(a !== 2 && a !== 4) {\n      M(c, c, i);\n    }\n  }\n  for(a = 0; a < 16; ++a) {\n    o[a] = c[a];\n  }\n}\n\nfunction car25519(o) {\n  var i, v, c = 1;\n  for(i = 0; i < 16; ++i) {\n    v = o[i] + c + 65535;\n    c = Math.floor(v / 65536);\n    o[i] = v - c * 65536;\n  }\n  o[0] += c - 1 + 37 * (c - 1);\n}\n\nfunction sel25519(p, q, b) {\n  var t, c = ~(b - 1);\n  for(var i = 0; i < 16; ++i) {\n    t = c & (p[i] ^ q[i]);\n    p[i] ^= t;\n    q[i] ^= t;\n  }\n}\n\nfunction gf(init) {\n  var i, r = new Float64Array(16);\n  if(init) {\n    for(i = 0; i < init.length; ++i) {\n      r[i] = init[i];\n    }\n  }\n  return r;\n}\n\nfunction A(o, a, b) {\n  for(var i = 0; i < 16; ++i) {\n    o[i] = a[i] + b[i];\n  }\n}\n\nfunction Z(o, a, b) {\n  for(var i = 0; i < 16; ++i) {\n    o[i] = a[i] - b[i];\n  }\n}\n\nfunction S(o, a) {\n  M(o, a, a);\n}\n\nfunction M(o, a, b) {\n  var v, c,\n     t0 = 0,  t1 = 0,  t2 = 0,  t3 = 0,  t4 = 0,  t5 = 0,  t6 = 0,  t7 = 0,\n     t8 = 0,  t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,\n    t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,\n    t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,\n    b0 = b[0],\n    b1 = b[1],\n    b2 = b[2],\n    b3 = b[3],\n    b4 = b[4],\n    b5 = b[5],\n    b6 = b[6],\n    b7 = b[7],\n    b8 = b[8],\n    b9 = b[9],\n    b10 = b[10],\n    b11 = b[11],\n    b12 = b[12],\n    b13 = b[13],\n    b14 = b[14],\n    b15 = b[15];\n\n  v = a[0];\n  t0 += v * b0;\n  t1 += v * b1;\n  t2 += v * b2;\n  t3 += v * b3;\n  t4 += v * b4;\n  t5 += v * b5;\n  t6 += v * b6;\n  t7 += v * b7;\n  t8 += v * b8;\n  t9 += v * b9;\n  t10 += v * b10;\n  t11 += v * b11;\n  t12 += v * b12;\n  t13 += v * b13;\n  t14 += v * b14;\n  t15 += v * b15;\n  v = a[1];\n  t1 += v * b0;\n  t2 += v * b1;\n  t3 += v * b2;\n  t4 += v * b3;\n  t5 += v * b4;\n  t6 += v * b5;\n  t7 += v * b6;\n  t8 += v * b7;\n  t9 += v * b8;\n  t10 += v * b9;\n  t11 += v * b10;\n  t12 += v * b11;\n  t13 += v * b12;\n  t14 += v * b13;\n  t15 += v * b14;\n  t16 += v * b15;\n  v = a[2];\n  t2 += v * b0;\n  t3 += v * b1;\n  t4 += v * b2;\n  t5 += v * b3;\n  t6 += v * b4;\n  t7 += v * b5;\n  t8 += v * b6;\n  t9 += v * b7;\n  t10 += v * b8;\n  t11 += v * b9;\n  t12 += v * b10;\n  t13 += v * b11;\n  t14 += v * b12;\n  t15 += v * b13;\n  t16 += v * b14;\n  t17 += v * b15;\n  v = a[3];\n  t3 += v * b0;\n  t4 += v * b1;\n  t5 += v * b2;\n  t6 += v * b3;\n  t7 += v * b4;\n  t8 += v * b5;\n  t9 += v * b6;\n  t10 += v * b7;\n  t11 += v * b8;\n  t12 += v * b9;\n  t13 += v * b10;\n  t14 += v * b11;\n  t15 += v * b12;\n  t16 += v * b13;\n  t17 += v * b14;\n  t18 += v * b15;\n  v = a[4];\n  t4 += v * b0;\n  t5 += v * b1;\n  t6 += v * b2;\n  t7 += v * b3;\n  t8 += v * b4;\n  t9 += v * b5;\n  t10 += v * b6;\n  t11 += v * b7;\n  t12 += v * b8;\n  t13 += v * b9;\n  t14 += v * b10;\n  t15 += v * b11;\n  t16 += v * b12;\n  t17 += v * b13;\n  t18 += v * b14;\n  t19 += v * b15;\n  v = a[5];\n  t5 += v * b0;\n  t6 += v * b1;\n  t7 += v * b2;\n  t8 += v * b3;\n  t9 += v * b4;\n  t10 += v * b5;\n  t11 += v * b6;\n  t12 += v * b7;\n  t13 += v * b8;\n  t14 += v * b9;\n  t15 += v * b10;\n  t16 += v * b11;\n  t17 += v * b12;\n  t18 += v * b13;\n  t19 += v * b14;\n  t20 += v * b15;\n  v = a[6];\n  t6 += v * b0;\n  t7 += v * b1;\n  t8 += v * b2;\n  t9 += v * b3;\n  t10 += v * b4;\n  t11 += v * b5;\n  t12 += v * b6;\n  t13 += v * b7;\n  t14 += v * b8;\n  t15 += v * b9;\n  t16 += v * b10;\n  t17 += v * b11;\n  t18 += v * b12;\n  t19 += v * b13;\n  t20 += v * b14;\n  t21 += v * b15;\n  v = a[7];\n  t7 += v * b0;\n  t8 += v * b1;\n  t9 += v * b2;\n  t10 += v * b3;\n  t11 += v * b4;\n  t12 += v * b5;\n  t13 += v * b6;\n  t14 += v * b7;\n  t15 += v * b8;\n  t16 += v * b9;\n  t17 += v * b10;\n  t18 += v * b11;\n  t19 += v * b12;\n  t20 += v * b13;\n  t21 += v * b14;\n  t22 += v * b15;\n  v = a[8];\n  t8 += v * b0;\n  t9 += v * b1;\n  t10 += v * b2;\n  t11 += v * b3;\n  t12 += v * b4;\n  t13 += v * b5;\n  t14 += v * b6;\n  t15 += v * b7;\n  t16 += v * b8;\n  t17 += v * b9;\n  t18 += v * b10;\n  t19 += v * b11;\n  t20 += v * b12;\n  t21 += v * b13;\n  t22 += v * b14;\n  t23 += v * b15;\n  v = a[9];\n  t9 += v * b0;\n  t10 += v * b1;\n  t11 += v * b2;\n  t12 += v * b3;\n  t13 += v * b4;\n  t14 += v * b5;\n  t15 += v * b6;\n  t16 += v * b7;\n  t17 += v * b8;\n  t18 += v * b9;\n  t19 += v * b10;\n  t20 += v * b11;\n  t21 += v * b12;\n  t22 += v * b13;\n  t23 += v * b14;\n  t24 += v * b15;\n  v = a[10];\n  t10 += v * b0;\n  t11 += v * b1;\n  t12 += v * b2;\n  t13 += v * b3;\n  t14 += v * b4;\n  t15 += v * b5;\n  t16 += v * b6;\n  t17 += v * b7;\n  t18 += v * b8;\n  t19 += v * b9;\n  t20 += v * b10;\n  t21 += v * b11;\n  t22 += v * b12;\n  t23 += v * b13;\n  t24 += v * b14;\n  t25 += v * b15;\n  v = a[11];\n  t11 += v * b0;\n  t12 += v * b1;\n  t13 += v * b2;\n  t14 += v * b3;\n  t15 += v * b4;\n  t16 += v * b5;\n  t17 += v * b6;\n  t18 += v * b7;\n  t19 += v * b8;\n  t20 += v * b9;\n  t21 += v * b10;\n  t22 += v * b11;\n  t23 += v * b12;\n  t24 += v * b13;\n  t25 += v * b14;\n  t26 += v * b15;\n  v = a[12];\n  t12 += v * b0;\n  t13 += v * b1;\n  t14 += v * b2;\n  t15 += v * b3;\n  t16 += v * b4;\n  t17 += v * b5;\n  t18 += v * b6;\n  t19 += v * b7;\n  t20 += v * b8;\n  t21 += v * b9;\n  t22 += v * b10;\n  t23 += v * b11;\n  t24 += v * b12;\n  t25 += v * b13;\n  t26 += v * b14;\n  t27 += v * b15;\n  v = a[13];\n  t13 += v * b0;\n  t14 += v * b1;\n  t15 += v * b2;\n  t16 += v * b3;\n  t17 += v * b4;\n  t18 += v * b5;\n  t19 += v * b6;\n  t20 += v * b7;\n  t21 += v * b8;\n  t22 += v * b9;\n  t23 += v * b10;\n  t24 += v * b11;\n  t25 += v * b12;\n  t26 += v * b13;\n  t27 += v * b14;\n  t28 += v * b15;\n  v = a[14];\n  t14 += v * b0;\n  t15 += v * b1;\n  t16 += v * b2;\n  t17 += v * b3;\n  t18 += v * b4;\n  t19 += v * b5;\n  t20 += v * b6;\n  t21 += v * b7;\n  t22 += v * b8;\n  t23 += v * b9;\n  t24 += v * b10;\n  t25 += v * b11;\n  t26 += v * b12;\n  t27 += v * b13;\n  t28 += v * b14;\n  t29 += v * b15;\n  v = a[15];\n  t15 += v * b0;\n  t16 += v * b1;\n  t17 += v * b2;\n  t18 += v * b3;\n  t19 += v * b4;\n  t20 += v * b5;\n  t21 += v * b6;\n  t22 += v * b7;\n  t23 += v * b8;\n  t24 += v * b9;\n  t25 += v * b10;\n  t26 += v * b11;\n  t27 += v * b12;\n  t28 += v * b13;\n  t29 += v * b14;\n  t30 += v * b15;\n\n  t0  += 38 * t16;\n  t1  += 38 * t17;\n  t2  += 38 * t18;\n  t3  += 38 * t19;\n  t4  += 38 * t20;\n  t5  += 38 * t21;\n  t6  += 38 * t22;\n  t7  += 38 * t23;\n  t8  += 38 * t24;\n  t9  += 38 * t25;\n  t10 += 38 * t26;\n  t11 += 38 * t27;\n  t12 += 38 * t28;\n  t13 += 38 * t29;\n  t14 += 38 * t30;\n  // t15 left as is\n\n  // first car\n  c = 1;\n  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;\n  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;\n  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;\n  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;\n  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;\n  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;\n  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;\n  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;\n  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;\n  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;\n  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n  t0 += c-1 + 37 * (c-1);\n\n  // second car\n  c = 1;\n  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;\n  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;\n  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;\n  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;\n  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;\n  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;\n  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;\n  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;\n  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;\n  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;\n  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n  t0 += c-1 + 37 * (c-1);\n\n  o[ 0] = t0;\n  o[ 1] = t1;\n  o[ 2] = t2;\n  o[ 3] = t3;\n  o[ 4] = t4;\n  o[ 5] = t5;\n  o[ 6] = t6;\n  o[ 7] = t7;\n  o[ 8] = t8;\n  o[ 9] = t9;\n  o[10] = t10;\n  o[11] = t11;\n  o[12] = t12;\n  o[13] = t13;\n  o[14] = t14;\n  o[15] = t15;\n}\n","/**\n * Javascript implementation of RSA-KEM.\n *\n * @author Lautaro Cozzani Rodriguez\n * @author Dave Longley\n *\n * Copyright (c) 2014 Lautaro Cozzani <lautaro.cozzani@scytl.com>\n * Copyright (c) 2014 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./util');\nrequire('./random');\nrequire('./jsbn');\n\nmodule.exports = forge.kem = forge.kem || {};\n\nvar BigInteger = forge.jsbn.BigInteger;\n\n/**\n * The API for the RSA Key Encapsulation Mechanism (RSA-KEM) from ISO 18033-2.\n */\nforge.kem.rsa = {};\n\n/**\n * Creates an RSA KEM API object for generating a secret asymmetric key.\n *\n * The symmetric key may be generated via a call to 'encrypt', which will\n * produce a ciphertext to be transmitted to the recipient and a key to be\n * kept secret. The ciphertext is a parameter to be passed to 'decrypt' which\n * will produce the same secret key for the recipient to use to decrypt a\n * message that was encrypted with the secret key.\n *\n * @param kdf the KDF API to use (eg: new forge.kem.kdf1()).\n * @param options the options to use.\n *          [prng] a custom crypto-secure pseudo-random number generator to use,\n *            that must define \"getBytesSync\".\n */\nforge.kem.rsa.create = function(kdf, options) {\n  options = options || {};\n  var prng = options.prng || forge.random;\n\n  var kem = {};\n\n  /**\n   * Generates a secret key and its encapsulation.\n   *\n   * @param publicKey the RSA public key to encrypt with.\n   * @param keyLength the length, in bytes, of the secret key to generate.\n   *\n   * @return an object with:\n   *   encapsulation: the ciphertext for generating the secret key, as a\n   *     binary-encoded string of bytes.\n   *   key: the secret key to use for encrypting a message.\n   */\n  kem.encrypt = function(publicKey, keyLength) {\n    // generate a random r where 1 < r < n\n    var byteLength = Math.ceil(publicKey.n.bitLength() / 8);\n    var r;\n    do {\n      r = new BigInteger(\n        forge.util.bytesToHex(prng.getBytesSync(byteLength)),\n        16).mod(publicKey.n);\n    } while(r.compareTo(BigInteger.ONE) <= 0);\n\n    // prepend r with zeros\n    r = forge.util.hexToBytes(r.toString(16));\n    var zeros = byteLength - r.length;\n    if(zeros > 0) {\n      r = forge.util.fillString(String.fromCharCode(0), zeros) + r;\n    }\n\n    // encrypt the random\n    var encapsulation = publicKey.encrypt(r, 'NONE');\n\n    // generate the secret key\n    var key = kdf.generate(r, keyLength);\n\n    return {encapsulation: encapsulation, key: key};\n  };\n\n  /**\n   * Decrypts an encapsulated secret key.\n   *\n   * @param privateKey the RSA private key to decrypt with.\n   * @param encapsulation the ciphertext for generating the secret key, as\n   *          a binary-encoded string of bytes.\n   * @param keyLength the length, in bytes, of the secret key to generate.\n   *\n   * @return the secret key as a binary-encoded string of bytes.\n   */\n  kem.decrypt = function(privateKey, encapsulation, keyLength) {\n    // decrypt the encapsulation and generate the secret key\n    var r = privateKey.decrypt(encapsulation, 'NONE');\n    return kdf.generate(r, keyLength);\n  };\n\n  return kem;\n};\n\n// TODO: add forge.kem.kdf.create('KDF1', {md: ..., ...}) API?\n\n/**\n * Creates a key derivation API object that implements KDF1 per ISO 18033-2.\n *\n * @param md the hash API to use.\n * @param [digestLength] an optional digest length that must be positive and\n *          less than or equal to md.digestLength.\n *\n * @return a KDF1 API object.\n */\nforge.kem.kdf1 = function(md, digestLength) {\n  _createKDF(this, md, 0, digestLength || md.digestLength);\n};\n\n/**\n * Creates a key derivation API object that implements KDF2 per ISO 18033-2.\n *\n * @param md the hash API to use.\n * @param [digestLength] an optional digest length that must be positive and\n *          less than or equal to md.digestLength.\n *\n * @return a KDF2 API object.\n */\nforge.kem.kdf2 = function(md, digestLength) {\n  _createKDF(this, md, 1, digestLength || md.digestLength);\n};\n\n/**\n * Creates a KDF1 or KDF2 API object.\n *\n * @param md the hash API to use.\n * @param counterStart the starting index for the counter.\n * @param digestLength the digest length to use.\n *\n * @return the KDF API object.\n */\nfunction _createKDF(kdf, md, counterStart, digestLength) {\n  /**\n   * Generate a key of the specified length.\n   *\n   * @param x the binary-encoded byte string to generate a key from.\n   * @param length the number of bytes to generate (the size of the key).\n   *\n   * @return the key as a binary-encoded string.\n   */\n  kdf.generate = function(x, length) {\n    var key = new forge.util.ByteBuffer();\n\n    // run counter from counterStart to ceil(length / Hash.len)\n    var k = Math.ceil(length / digestLength) + counterStart;\n\n    var c = new forge.util.ByteBuffer();\n    for(var i = counterStart; i < k; ++i) {\n      // I2OSP(i, 4): convert counter to an octet string of 4 octets\n      c.putInt32(i);\n\n      // digest 'x' and the counter and add the result to the key\n      md.start();\n      md.update(x + c.getBytes());\n      var hash = md.digest();\n      key.putBytes(hash.getBytes(digestLength));\n    }\n\n    // truncate to the correct key length\n    key.truncate(key.length() - length);\n    return key.getBytes();\n  };\n}\n","/**\n * Cross-browser support for logging in a web application.\n *\n * @author David I. Lehn <dlehn@digitalbazaar.com>\n *\n * Copyright (c) 2008-2013 Digital Bazaar, Inc.\n */\nvar forge = require('./forge');\nrequire('./util');\n\n/* LOG API */\nmodule.exports = forge.log = forge.log || {};\n\n/**\n * Application logging system.\n *\n * Each logger level available as it's own function of the form:\n *   forge.log.level(category, args...)\n * The category is an arbitrary string, and the args are the same as\n * Firebug's console.log API. By default the call will be output as:\n *   'LEVEL [category] <args[0]>, args[1], ...'\n * This enables proper % formatting via the first argument.\n * Each category is enabled by default but can be enabled or disabled with\n * the setCategoryEnabled() function.\n */\n// list of known levels\nforge.log.levels = [\n  'none', 'error', 'warning', 'info', 'debug', 'verbose', 'max'];\n// info on the levels indexed by name:\n//   index: level index\n//   name: uppercased display name\nvar sLevelInfo = {};\n// list of loggers\nvar sLoggers = [];\n/**\n * Standard console logger. If no console support is enabled this will\n * remain null. Check before using.\n */\nvar sConsoleLogger = null;\n\n// logger flags\n/**\n * Lock the level at the current value. Used in cases where user config may\n * set the level such that only critical messages are seen but more verbose\n * messages are needed for debugging or other purposes.\n */\nforge.log.LEVEL_LOCKED = (1 << 1);\n/**\n * Always call log function. By default, the logging system will check the\n * message level against logger.level before calling the log function. This\n * flag allows the function to do its own check.\n */\nforge.log.NO_LEVEL_CHECK = (1 << 2);\n/**\n * Perform message interpolation with the passed arguments. \"%\" style\n * fields in log messages will be replaced by arguments as needed. Some\n * loggers, such as Firebug, may do this automatically. The original log\n * message will be available as 'message' and the interpolated version will\n * be available as 'fullMessage'.\n */\nforge.log.INTERPOLATE = (1 << 3);\n\n// setup each log level\nfor(var i = 0; i < forge.log.levels.length; ++i) {\n  var level = forge.log.levels[i];\n  sLevelInfo[level] = {\n    index: i,\n    name: level.toUpperCase()\n  };\n}\n\n/**\n * Message logger. Will dispatch a message to registered loggers as needed.\n *\n * @param message message object\n */\nforge.log.logMessage = function(message) {\n  var messageLevelIndex = sLevelInfo[message.level].index;\n  for(var i = 0; i < sLoggers.length; ++i) {\n    var logger = sLoggers[i];\n    if(logger.flags & forge.log.NO_LEVEL_CHECK) {\n      logger.f(message);\n    } else {\n      // get logger level\n      var loggerLevelIndex = sLevelInfo[logger.level].index;\n      // check level\n      if(messageLevelIndex <= loggerLevelIndex) {\n        // message critical enough, call logger\n        logger.f(logger, message);\n      }\n    }\n  }\n};\n\n/**\n * Sets the 'standard' key on a message object to:\n * \"LEVEL [category] \" + message\n *\n * @param message a message log object\n */\nforge.log.prepareStandard = function(message) {\n  if(!('standard' in message)) {\n    message.standard =\n      sLevelInfo[message.level].name +\n      //' ' + +message.timestamp +\n      ' [' + message.category + '] ' +\n      message.message;\n  }\n};\n\n/**\n * Sets the 'full' key on a message object to the original message\n * interpolated via % formatting with the message arguments.\n *\n * @param message a message log object.\n */\nforge.log.prepareFull = function(message) {\n  if(!('full' in message)) {\n    // copy args and insert message at the front\n    var args = [message.message];\n    args = args.concat([] || message['arguments']);\n    // format the message\n    message.full = forge.util.format.apply(this, args);\n  }\n};\n\n/**\n * Applies both preparseStandard() and prepareFull() to a message object and\n * store result in 'standardFull'.\n *\n * @param message a message log object.\n */\nforge.log.prepareStandardFull = function(message) {\n  if(!('standardFull' in message)) {\n    // FIXME implement 'standardFull' logging\n    forge.log.prepareStandard(message);\n    message.standardFull = message.standard;\n  }\n};\n\n// create log level functions\nif(true) {\n  // levels for which we want functions\n  var levels = ['error', 'warning', 'info', 'debug', 'verbose'];\n  for(var i = 0; i < levels.length; ++i) {\n    // wrap in a function to ensure proper level var is passed\n    (function(level) {\n      // create function for this level\n      forge.log[level] = function(category, message/*, args...*/) {\n        // convert arguments to real array, remove category and message\n        var args = Array.prototype.slice.call(arguments).slice(2);\n        // create message object\n        // Note: interpolation and standard formatting is done lazily\n        var msg = {\n          timestamp: new Date(),\n          level: level,\n          category: category,\n          message: message,\n          'arguments': args\n          /*standard*/\n          /*full*/\n          /*fullMessage*/\n        };\n        // process this message\n        forge.log.logMessage(msg);\n      };\n    })(levels[i]);\n  }\n}\n\n/**\n * Creates a new logger with specified custom logging function.\n *\n * The logging function has a signature of:\n *   function(logger, message)\n * logger: current logger\n * message: object:\n *   level: level id\n *   category: category\n *   message: string message\n *   arguments: Array of extra arguments\n *   fullMessage: interpolated message and arguments if INTERPOLATE flag set\n *\n * @param logFunction a logging function which takes a log message object\n *          as a parameter.\n *\n * @return a logger object.\n */\nforge.log.makeLogger = function(logFunction) {\n  var logger = {\n    flags: 0,\n    f: logFunction\n  };\n  forge.log.setLevel(logger, 'none');\n  return logger;\n};\n\n/**\n * Sets the current log level on a logger.\n *\n * @param logger the target logger.\n * @param level the new maximum log level as a string.\n *\n * @return true if set, false if not.\n */\nforge.log.setLevel = function(logger, level) {\n  var rval = false;\n  if(logger && !(logger.flags & forge.log.LEVEL_LOCKED)) {\n    for(var i = 0; i < forge.log.levels.length; ++i) {\n      var aValidLevel = forge.log.levels[i];\n      if(level == aValidLevel) {\n        // set level\n        logger.level = level;\n        rval = true;\n        break;\n      }\n    }\n  }\n\n  return rval;\n};\n\n/**\n * Locks the log level at its current value.\n *\n * @param logger the target logger.\n * @param lock boolean lock value, default to true.\n */\nforge.log.lock = function(logger, lock) {\n  if(typeof lock === 'undefined' || lock) {\n    logger.flags |= forge.log.LEVEL_LOCKED;\n  } else {\n    logger.flags &= ~forge.log.LEVEL_LOCKED;\n  }\n};\n\n/**\n * Adds a logger.\n *\n * @param logger the logger object.\n */\nforge.log.addLogger = function(logger) {\n  sLoggers.push(logger);\n};\n\n// setup the console logger if possible, else create fake console.log\nif(typeof(console) !== 'undefined' && 'log' in console) {\n  var logger;\n  if(console.error && console.warn && console.info && console.debug) {\n    // looks like Firebug-style logging is available\n    // level handlers map\n    var levelHandlers = {\n      error: console.error,\n      warning: console.warn,\n      info: console.info,\n      debug: console.debug,\n      verbose: console.debug\n    };\n    var f = function(logger, message) {\n      forge.log.prepareStandard(message);\n      var handler = levelHandlers[message.level];\n      // prepend standard message and concat args\n      var args = [message.standard];\n      args = args.concat(message['arguments'].slice());\n      // apply to low-level console function\n      handler.apply(console, args);\n    };\n    logger = forge.log.makeLogger(f);\n  } else {\n    // only appear to have basic console.log\n    var f = function(logger, message) {\n      forge.log.prepareStandardFull(message);\n      console.log(message.standardFull);\n    };\n    logger = forge.log.makeLogger(f);\n  }\n  forge.log.setLevel(logger, 'debug');\n  forge.log.addLogger(logger);\n  sConsoleLogger = logger;\n} else {\n  // define fake console.log to avoid potential script errors on\n  // browsers that do not have console logging\n  console = {\n    log: function() {}\n  };\n}\n\n/*\n * Check for logging control query vars in current URL.\n *\n * console.level=<level-name>\n * Set's the console log level by name.  Useful to override defaults and\n * allow more verbose logging before a user config is loaded.\n *\n * console.lock=<true|false>\n * Lock the console log level at whatever level it is set at.  This is run\n * after console.level is processed.  Useful to force a level of verbosity\n * that could otherwise be limited by a user config.\n */\nif(sConsoleLogger !== null &&\n  typeof window !== 'undefined' && window.location\n) {\n  var query = new URL(window.location.href).searchParams;\n  if(query.has('console.level')) {\n    // set with last value\n    forge.log.setLevel(\n      sConsoleLogger, query.get('console.level').slice(-1)[0]);\n  }\n  if(query.has('console.lock')) {\n    // set with last value\n    var lock = query.get('console.lock').slice(-1)[0];\n    if(lock == 'true') {\n      forge.log.lock(sConsoleLogger);\n    }\n  }\n}\n\n// provide public access to console logger\nforge.log.consoleLogger = sConsoleLogger;\n","/**\n * Javascript implementation of PKCS#7 v1.5.\n *\n * @author Stefan Siegl\n * @author Dave Longley\n *\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n * Copyright (c) 2012-2015 Digital Bazaar, Inc.\n *\n * Currently this implementation only supports ContentType of EnvelopedData,\n * EncryptedData, or SignedData at the root level. The top level elements may\n * contain only a ContentInfo of ContentType Data, i.e. plain data. Further\n * nesting is not (yet) supported.\n *\n * The Forge validators for PKCS #7's ASN.1 structures are available from\n * a separate file pkcs7asn1.js, since those are referenced from other\n * PKCS standards like PKCS #12.\n */\nvar forge = require('./forge');\nrequire('./aes');\nrequire('./asn1');\nrequire('./des');\nrequire('./oids');\nrequire('./pem');\nrequire('./pkcs7asn1');\nrequire('./random');\nrequire('./util');\nrequire('./x509');\n\n// shortcut for ASN.1 API\nvar asn1 = forge.asn1;\n\n// shortcut for PKCS#7 API\nvar p7 = module.exports = forge.pkcs7 = forge.pkcs7 || {};\n\n/**\n * Converts a PKCS#7 message from PEM format.\n *\n * @param pem the PEM-formatted PKCS#7 message.\n *\n * @return the PKCS#7 message.\n */\np7.messageFromPem = function(pem) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'PKCS7') {\n    var error = new Error('Could not convert PKCS#7 message from PEM; PEM ' +\n      'header type is not \"PKCS#7\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert PKCS#7 message from PEM; PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  var obj = asn1.fromDer(msg.body);\n\n  return p7.messageFromAsn1(obj);\n};\n\n/**\n * Converts a PKCS#7 message to PEM format.\n *\n * @param msg The PKCS#7 message object\n * @param maxline The maximum characters per line, defaults to 64.\n *\n * @return The PEM-formatted PKCS#7 message.\n */\np7.messageToPem = function(msg, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var pemObj = {\n    type: 'PKCS7',\n    body: asn1.toDer(msg.toAsn1()).getBytes()\n  };\n  return forge.pem.encode(pemObj, {maxline: maxline});\n};\n\n/**\n * Converts a PKCS#7 message from an ASN.1 object.\n *\n * @param obj the ASN.1 representation of a ContentInfo.\n *\n * @return the PKCS#7 message.\n */\np7.messageFromAsn1 = function(obj) {\n  // validate root level ContentInfo and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, p7.asn1.contentInfoValidator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#7 message. ' +\n      'ASN.1 object is not an PKCS#7 ContentInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  var contentType = asn1.derToOid(capture.contentType);\n  var msg;\n\n  switch(contentType) {\n    case forge.pki.oids.envelopedData:\n      msg = p7.createEnvelopedData();\n      break;\n\n    case forge.pki.oids.encryptedData:\n      msg = p7.createEncryptedData();\n      break;\n\n    case forge.pki.oids.signedData:\n      msg = p7.createSignedData();\n      break;\n\n    default:\n      throw new Error('Cannot read PKCS#7 message. ContentType with OID ' +\n        contentType + ' is not (yet) supported.');\n  }\n\n  msg.fromAsn1(capture.content.value[0]);\n  return msg;\n};\n\np7.createSignedData = function() {\n  var msg = null;\n  msg = {\n    type: forge.pki.oids.signedData,\n    version: 1,\n    certificates: [],\n    crls: [],\n    // TODO: add json-formatted signer stuff here?\n    signers: [],\n    // populated during sign()\n    digestAlgorithmIdentifiers: [],\n    contentInfo: null,\n    signerInfos: [],\n\n    fromAsn1: function(obj) {\n      // validate SignedData content block and capture data.\n      _fromAsn1(msg, obj, p7.asn1.signedDataValidator);\n      msg.certificates = [];\n      msg.crls = [];\n      msg.digestAlgorithmIdentifiers = [];\n      msg.contentInfo = null;\n      msg.signerInfos = [];\n\n      if(msg.rawCapture.certificates) {\n        var certs = msg.rawCapture.certificates.value;\n        for(var i = 0; i < certs.length; ++i) {\n          msg.certificates.push(forge.pki.certificateFromAsn1(certs[i]));\n        }\n      }\n\n      // TODO: parse crls\n    },\n\n    toAsn1: function() {\n      // degenerate case with no content\n      if(!msg.contentInfo) {\n        msg.sign();\n      }\n\n      var certs = [];\n      for(var i = 0; i < msg.certificates.length; ++i) {\n        certs.push(forge.pki.certificateToAsn1(msg.certificates[i]));\n      }\n\n      var crls = [];\n      // TODO: implement CRLs\n\n      // [0] SignedData\n      var signedData = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          // Version\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n            asn1.integerToDer(msg.version).getBytes()),\n          // DigestAlgorithmIdentifiers\n          asn1.create(\n            asn1.Class.UNIVERSAL, asn1.Type.SET, true,\n            msg.digestAlgorithmIdentifiers),\n          // ContentInfo\n          msg.contentInfo\n        ])\n      ]);\n      if(certs.length > 0) {\n        // [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL\n        signedData.value[0].value.push(\n          asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, certs));\n      }\n      if(crls.length > 0) {\n        // [1] IMPLICIT CertificateRevocationLists OPTIONAL\n        signedData.value[0].value.push(\n          asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, crls));\n      }\n      // SignerInfos\n      signedData.value[0].value.push(\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true,\n          msg.signerInfos));\n\n      // ContentInfo\n      return asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          // ContentType\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n            asn1.oidToDer(msg.type).getBytes()),\n          // [0] SignedData\n          signedData\n        ]);\n    },\n\n    /**\n     * Add (another) entity to list of signers.\n     *\n     * Note: If authenticatedAttributes are provided, then, per RFC 2315,\n     * they must include at least two attributes: content type and\n     * message digest. The message digest attribute value will be\n     * auto-calculated during signing and will be ignored if provided.\n     *\n     * Here's an example of providing these two attributes:\n     *\n     * forge.pkcs7.createSignedData();\n     * p7.addSigner({\n     *   issuer: cert.issuer.attributes,\n     *   serialNumber: cert.serialNumber,\n     *   key: privateKey,\n     *   digestAlgorithm: forge.pki.oids.sha1,\n     *   authenticatedAttributes: [{\n     *     type: forge.pki.oids.contentType,\n     *     value: forge.pki.oids.data\n     *   }, {\n     *     type: forge.pki.oids.messageDigest\n     *   }]\n     * });\n     *\n     * TODO: Support [subjectKeyIdentifier] as signer's ID.\n     *\n     * @param signer the signer information:\n     *          key the signer's private key.\n     *          [certificate] a certificate containing the public key\n     *            associated with the signer's private key; use this option as\n     *            an alternative to specifying signer.issuer and\n     *            signer.serialNumber.\n     *          [issuer] the issuer attributes (eg: cert.issuer.attributes).\n     *          [serialNumber] the signer's certificate's serial number in\n     *           hexadecimal (eg: cert.serialNumber).\n     *          [digestAlgorithm] the message digest OID, as a string, to use\n     *            (eg: forge.pki.oids.sha1).\n     *          [authenticatedAttributes] an optional array of attributes\n     *            to also sign along with the content.\n     */\n    addSigner: function(signer) {\n      var issuer = signer.issuer;\n      var serialNumber = signer.serialNumber;\n      if(signer.certificate) {\n        var cert = signer.certificate;\n        if(typeof cert === 'string') {\n          cert = forge.pki.certificateFromPem(cert);\n        }\n        issuer = cert.issuer.attributes;\n        serialNumber = cert.serialNumber;\n      }\n      var key = signer.key;\n      if(!key) {\n        throw new Error(\n          'Could not add PKCS#7 signer; no private key specified.');\n      }\n      if(typeof key === 'string') {\n        key = forge.pki.privateKeyFromPem(key);\n      }\n\n      // ensure OID known for digest algorithm\n      var digestAlgorithm = signer.digestAlgorithm || forge.pki.oids.sha1;\n      switch(digestAlgorithm) {\n      case forge.pki.oids.sha1:\n      case forge.pki.oids.sha256:\n      case forge.pki.oids.sha384:\n      case forge.pki.oids.sha512:\n      case forge.pki.oids.md5:\n        break;\n      default:\n        throw new Error(\n          'Could not add PKCS#7 signer; unknown message digest algorithm: ' +\n          digestAlgorithm);\n      }\n\n      // if authenticatedAttributes is present, then the attributes\n      // must contain at least PKCS #9 content-type and message-digest\n      var authenticatedAttributes = signer.authenticatedAttributes || [];\n      if(authenticatedAttributes.length > 0) {\n        var contentType = false;\n        var messageDigest = false;\n        for(var i = 0; i < authenticatedAttributes.length; ++i) {\n          var attr = authenticatedAttributes[i];\n          if(!contentType && attr.type === forge.pki.oids.contentType) {\n            contentType = true;\n            if(messageDigest) {\n              break;\n            }\n            continue;\n          }\n          if(!messageDigest && attr.type === forge.pki.oids.messageDigest) {\n            messageDigest = true;\n            if(contentType) {\n              break;\n            }\n            continue;\n          }\n        }\n\n        if(!contentType || !messageDigest) {\n          throw new Error('Invalid signer.authenticatedAttributes. If ' +\n            'signer.authenticatedAttributes is specified, then it must ' +\n            'contain at least two attributes, PKCS #9 content-type and ' +\n            'PKCS #9 message-digest.');\n        }\n      }\n\n      msg.signers.push({\n        key: key,\n        version: 1,\n        issuer: issuer,\n        serialNumber: serialNumber,\n        digestAlgorithm: digestAlgorithm,\n        signatureAlgorithm: forge.pki.oids.rsaEncryption,\n        signature: null,\n        authenticatedAttributes: authenticatedAttributes,\n        unauthenticatedAttributes: []\n      });\n    },\n\n    /**\n     * Signs the content.\n     * @param options Options to apply when signing:\n     *    [detached] boolean. If signing should be done in detached mode. Defaults to false.\n     */\n    sign: function(options) {\n      options = options || {};\n      // auto-generate content info\n      if(typeof msg.content !== 'object' || msg.contentInfo === null) {\n        // use Data ContentInfo\n        msg.contentInfo = asn1.create(\n          asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n            // ContentType\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n              asn1.oidToDer(forge.pki.oids.data).getBytes())\n          ]);\n\n        // add actual content, if present\n        if('content' in msg) {\n          var content;\n          if(msg.content instanceof forge.util.ByteBuffer) {\n            content = msg.content.bytes();\n          } else if(typeof msg.content === 'string') {\n            content = forge.util.encodeUtf8(msg.content);\n          }\n\n          if (options.detached) {\n            msg.detachedContent = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, content);\n          } else {\n            msg.contentInfo.value.push(\n              // [0] EXPLICIT content\n              asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n                asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n                  content)\n              ]));\n          }\n        }\n      }\n\n      // no signers, return early (degenerate case for certificate container)\n      if(msg.signers.length === 0) {\n        return;\n      }\n\n      // generate digest algorithm identifiers\n      var mds = addDigestAlgorithmIds();\n\n      // generate signerInfos\n      addSignerInfos(mds);\n    },\n\n    verify: function() {\n      throw new Error('PKCS#7 signature verification not yet implemented.');\n    },\n\n    /**\n     * Add a certificate.\n     *\n     * @param cert the certificate to add.\n     */\n    addCertificate: function(cert) {\n      // convert from PEM\n      if(typeof cert === 'string') {\n        cert = forge.pki.certificateFromPem(cert);\n      }\n      msg.certificates.push(cert);\n    },\n\n    /**\n     * Add a certificate revokation list.\n     *\n     * @param crl the certificate revokation list to add.\n     */\n    addCertificateRevokationList: function(crl) {\n      throw new Error('PKCS#7 CRL support not yet implemented.');\n    }\n  };\n  return msg;\n\n  function addDigestAlgorithmIds() {\n    var mds = {};\n\n    for(var i = 0; i < msg.signers.length; ++i) {\n      var signer = msg.signers[i];\n      var oid = signer.digestAlgorithm;\n      if(!(oid in mds)) {\n        // content digest\n        mds[oid] = forge.md[forge.pki.oids[oid]].create();\n      }\n      if(signer.authenticatedAttributes.length === 0) {\n        // no custom attributes to digest; use content message digest\n        signer.md = mds[oid];\n      } else {\n        // custom attributes to be digested; use own message digest\n        // TODO: optimize to just copy message digest state if that\n        // feature is ever supported with message digests\n        signer.md = forge.md[forge.pki.oids[oid]].create();\n      }\n    }\n\n    // add unique digest algorithm identifiers\n    msg.digestAlgorithmIdentifiers = [];\n    for(var oid in mds) {\n      msg.digestAlgorithmIdentifiers.push(\n        // AlgorithmIdentifier\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          // algorithm\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n            asn1.oidToDer(oid).getBytes()),\n          // parameters (null)\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n        ]));\n    }\n\n    return mds;\n  }\n\n  function addSignerInfos(mds) {\n    var content;\n\n    if (msg.detachedContent) {\n      // Signature has been made in detached mode.\n      content = msg.detachedContent;\n    } else {\n      // Note: ContentInfo is a SEQUENCE with 2 values, second value is\n      // the content field and is optional for a ContentInfo but required here\n      // since signers are present\n      // get ContentInfo content\n      content = msg.contentInfo.value[1];\n      // skip [0] EXPLICIT content wrapper\n      content = content.value[0];\n    }\n\n    if(!content) {\n      throw new Error(\n        'Could not sign PKCS#7 message; there is no content to sign.');\n    }\n\n    // get ContentInfo content type\n    var contentType = asn1.derToOid(msg.contentInfo.value[0].value);\n\n    // serialize content\n    var bytes = asn1.toDer(content);\n\n    // skip identifier and length per RFC 2315 9.3\n    // skip identifier (1 byte)\n    bytes.getByte();\n    // read and discard length bytes\n    asn1.getBerValueLength(bytes);\n    bytes = bytes.getBytes();\n\n    // digest content DER value bytes\n    for(var oid in mds) {\n      mds[oid].start().update(bytes);\n    }\n\n    // sign content\n    var signingTime = new Date();\n    for(var i = 0; i < msg.signers.length; ++i) {\n      var signer = msg.signers[i];\n\n      if(signer.authenticatedAttributes.length === 0) {\n        // if ContentInfo content type is not \"Data\", then\n        // authenticatedAttributes must be present per RFC 2315\n        if(contentType !== forge.pki.oids.data) {\n          throw new Error(\n            'Invalid signer; authenticatedAttributes must be present ' +\n            'when the ContentInfo content type is not PKCS#7 Data.');\n        }\n      } else {\n        // process authenticated attributes\n        // [0] IMPLICIT\n        signer.authenticatedAttributesAsn1 = asn1.create(\n          asn1.Class.CONTEXT_SPECIFIC, 0, true, []);\n\n        // per RFC 2315, attributes are to be digested using a SET container\n        // not the above [0] IMPLICIT container\n        var attrsAsn1 = asn1.create(\n          asn1.Class.UNIVERSAL, asn1.Type.SET, true, []);\n\n        for(var ai = 0; ai < signer.authenticatedAttributes.length; ++ai) {\n          var attr = signer.authenticatedAttributes[ai];\n          if(attr.type === forge.pki.oids.messageDigest) {\n            // use content message digest as value\n            attr.value = mds[signer.digestAlgorithm].digest();\n          } else if(attr.type === forge.pki.oids.signingTime) {\n            // auto-populate signing time if not already set\n            if(!attr.value) {\n              attr.value = signingTime;\n            }\n          }\n\n          // convert to ASN.1 and push onto Attributes SET (for signing) and\n          // onto authenticatedAttributesAsn1 to complete SignedData ASN.1\n          // TODO: optimize away duplication\n          attrsAsn1.value.push(_attributeToAsn1(attr));\n          signer.authenticatedAttributesAsn1.value.push(_attributeToAsn1(attr));\n        }\n\n        // DER-serialize and digest SET OF attributes only\n        bytes = asn1.toDer(attrsAsn1).getBytes();\n        signer.md.start().update(bytes);\n      }\n\n      // sign digest\n      signer.signature = signer.key.sign(signer.md, 'RSASSA-PKCS1-V1_5');\n    }\n\n    // add signer info\n    msg.signerInfos = _signersToAsn1(msg.signers);\n  }\n};\n\n/**\n * Creates an empty PKCS#7 message of type EncryptedData.\n *\n * @return the message.\n */\np7.createEncryptedData = function() {\n  var msg = null;\n  msg = {\n    type: forge.pki.oids.encryptedData,\n    version: 0,\n    encryptedContent: {\n      algorithm: forge.pki.oids['aes256-CBC']\n    },\n\n    /**\n     * Reads an EncryptedData content block (in ASN.1 format)\n     *\n     * @param obj The ASN.1 representation of the EncryptedData content block\n     */\n    fromAsn1: function(obj) {\n      // Validate EncryptedData content block and capture data.\n      _fromAsn1(msg, obj, p7.asn1.encryptedDataValidator);\n    },\n\n    /**\n     * Decrypt encrypted content\n     *\n     * @param key The (symmetric) key as a byte buffer\n     */\n    decrypt: function(key) {\n      if(key !== undefined) {\n        msg.encryptedContent.key = key;\n      }\n      _decryptContent(msg);\n    }\n  };\n  return msg;\n};\n\n/**\n * Creates an empty PKCS#7 message of type EnvelopedData.\n *\n * @return the message.\n */\np7.createEnvelopedData = function() {\n  var msg = null;\n  msg = {\n    type: forge.pki.oids.envelopedData,\n    version: 0,\n    recipients: [],\n    encryptedContent: {\n      algorithm: forge.pki.oids['aes256-CBC']\n    },\n\n    /**\n     * Reads an EnvelopedData content block (in ASN.1 format)\n     *\n     * @param obj the ASN.1 representation of the EnvelopedData content block.\n     */\n    fromAsn1: function(obj) {\n      // validate EnvelopedData content block and capture data\n      var capture = _fromAsn1(msg, obj, p7.asn1.envelopedDataValidator);\n      msg.recipients = _recipientsFromAsn1(capture.recipientInfos.value);\n    },\n\n    toAsn1: function() {\n      // ContentInfo\n      return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // ContentType\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(msg.type).getBytes()),\n        // [0] EnvelopedData\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n            // Version\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n              asn1.integerToDer(msg.version).getBytes()),\n            // RecipientInfos\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true,\n              _recipientsToAsn1(msg.recipients)),\n            // EncryptedContentInfo\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true,\n              _encryptedContentToAsn1(msg.encryptedContent))\n          ])\n        ])\n      ]);\n    },\n\n    /**\n     * Find recipient by X.509 certificate's issuer.\n     *\n     * @param cert the certificate with the issuer to look for.\n     *\n     * @return the recipient object.\n     */\n    findRecipient: function(cert) {\n      var sAttr = cert.issuer.attributes;\n\n      for(var i = 0; i < msg.recipients.length; ++i) {\n        var r = msg.recipients[i];\n        var rAttr = r.issuer;\n\n        if(r.serialNumber !== cert.serialNumber) {\n          continue;\n        }\n\n        if(rAttr.length !== sAttr.length) {\n          continue;\n        }\n\n        var match = true;\n        for(var j = 0; j < sAttr.length; ++j) {\n          if(rAttr[j].type !== sAttr[j].type ||\n            rAttr[j].value !== sAttr[j].value) {\n            match = false;\n            break;\n          }\n        }\n\n        if(match) {\n          return r;\n        }\n      }\n\n      return null;\n    },\n\n    /**\n     * Decrypt enveloped content\n     *\n     * @param recipient The recipient object related to the private key\n     * @param privKey The (RSA) private key object\n     */\n    decrypt: function(recipient, privKey) {\n      if(msg.encryptedContent.key === undefined && recipient !== undefined &&\n        privKey !== undefined) {\n        switch(recipient.encryptedContent.algorithm) {\n          case forge.pki.oids.rsaEncryption:\n          case forge.pki.oids.desCBC:\n            var key = privKey.decrypt(recipient.encryptedContent.content);\n            msg.encryptedContent.key = forge.util.createBuffer(key);\n            break;\n\n          default:\n            throw new Error('Unsupported asymmetric cipher, ' +\n              'OID ' + recipient.encryptedContent.algorithm);\n        }\n      }\n\n      _decryptContent(msg);\n    },\n\n    /**\n     * Add (another) entity to list of recipients.\n     *\n     * @param cert The certificate of the entity to add.\n     */\n    addRecipient: function(cert) {\n      msg.recipients.push({\n        version: 0,\n        issuer: cert.issuer.attributes,\n        serialNumber: cert.serialNumber,\n        encryptedContent: {\n          // We simply assume rsaEncryption here, since forge.pki only\n          // supports RSA so far.  If the PKI module supports other\n          // ciphers one day, we need to modify this one as well.\n          algorithm: forge.pki.oids.rsaEncryption,\n          key: cert.publicKey\n        }\n      });\n    },\n\n    /**\n     * Encrypt enveloped content.\n     *\n     * This function supports two optional arguments, cipher and key, which\n     * can be used to influence symmetric encryption.  Unless cipher is\n     * provided, the cipher specified in encryptedContent.algorithm is used\n     * (defaults to AES-256-CBC).  If no key is provided, encryptedContent.key\n     * is (re-)used.  If that one's not set, a random key will be generated\n     * automatically.\n     *\n     * @param [key] The key to be used for symmetric encryption.\n     * @param [cipher] The OID of the symmetric cipher to use.\n     */\n    encrypt: function(key, cipher) {\n      // Part 1: Symmetric encryption\n      if(msg.encryptedContent.content === undefined) {\n        cipher = cipher || msg.encryptedContent.algorithm;\n        key = key || msg.encryptedContent.key;\n\n        var keyLen, ivLen, ciphFn;\n        switch(cipher) {\n          case forge.pki.oids['aes128-CBC']:\n            keyLen = 16;\n            ivLen = 16;\n            ciphFn = forge.aes.createEncryptionCipher;\n            break;\n\n          case forge.pki.oids['aes192-CBC']:\n            keyLen = 24;\n            ivLen = 16;\n            ciphFn = forge.aes.createEncryptionCipher;\n            break;\n\n          case forge.pki.oids['aes256-CBC']:\n            keyLen = 32;\n            ivLen = 16;\n            ciphFn = forge.aes.createEncryptionCipher;\n            break;\n\n          case forge.pki.oids['des-EDE3-CBC']:\n            keyLen = 24;\n            ivLen = 8;\n            ciphFn = forge.des.createEncryptionCipher;\n            break;\n\n          default:\n            throw new Error('Unsupported symmetric cipher, OID ' + cipher);\n        }\n\n        if(key === undefined) {\n          key = forge.util.createBuffer(forge.random.getBytes(keyLen));\n        } else if(key.length() != keyLen) {\n          throw new Error('Symmetric key has wrong length; ' +\n            'got ' + key.length() + ' bytes, expected ' + keyLen + '.');\n        }\n\n        // Keep a copy of the key & IV in the object, so the caller can\n        // use it for whatever reason.\n        msg.encryptedContent.algorithm = cipher;\n        msg.encryptedContent.key = key;\n        msg.encryptedContent.parameter = forge.util.createBuffer(\n          forge.random.getBytes(ivLen));\n\n        var ciph = ciphFn(key);\n        ciph.start(msg.encryptedContent.parameter.copy());\n        ciph.update(msg.content);\n\n        // The finish function does PKCS#7 padding by default, therefore\n        // no action required by us.\n        if(!ciph.finish()) {\n          throw new Error('Symmetric encryption failed.');\n        }\n\n        msg.encryptedContent.content = ciph.output;\n      }\n\n      // Part 2: asymmetric encryption for each recipient\n      for(var i = 0; i < msg.recipients.length; ++i) {\n        var recipient = msg.recipients[i];\n\n        // Nothing to do, encryption already done.\n        if(recipient.encryptedContent.content !== undefined) {\n          continue;\n        }\n\n        switch(recipient.encryptedContent.algorithm) {\n          case forge.pki.oids.rsaEncryption:\n            recipient.encryptedContent.content =\n              recipient.encryptedContent.key.encrypt(\n                msg.encryptedContent.key.data);\n            break;\n\n          default:\n            throw new Error('Unsupported asymmetric cipher, OID ' +\n              recipient.encryptedContent.algorithm);\n        }\n      }\n    }\n  };\n  return msg;\n};\n\n/**\n * Converts a single recipient from an ASN.1 object.\n *\n * @param obj the ASN.1 RecipientInfo.\n *\n * @return the recipient object.\n */\nfunction _recipientFromAsn1(obj) {\n  // validate EnvelopedData content block and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, p7.asn1.recipientInfoValidator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#7 RecipientInfo. ' +\n      'ASN.1 object is not an PKCS#7 RecipientInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  return {\n    version: capture.version.charCodeAt(0),\n    issuer: forge.pki.RDNAttributesAsArray(capture.issuer),\n    serialNumber: forge.util.createBuffer(capture.serial).toHex(),\n    encryptedContent: {\n      algorithm: asn1.derToOid(capture.encAlgorithm),\n      parameter: capture.encParameter ? capture.encParameter.value : undefined,\n      content: capture.encKey\n    }\n  };\n}\n\n/**\n * Converts a single recipient object to an ASN.1 object.\n *\n * @param obj the recipient object.\n *\n * @return the ASN.1 RecipientInfo.\n */\nfunction _recipientToAsn1(obj) {\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // Version\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(obj.version).getBytes()),\n    // IssuerAndSerialNumber\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // Name\n      forge.pki.distinguishedNameToAsn1({attributes: obj.issuer}),\n      // Serial\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        forge.util.hexToBytes(obj.serialNumber))\n    ]),\n    // KeyEncryptionAlgorithmIdentifier\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // Algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(obj.encryptedContent.algorithm).getBytes()),\n      // Parameter, force NULL, only RSA supported for now.\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n    ]),\n    // EncryptedKey\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n      obj.encryptedContent.content)\n  ]);\n}\n\n/**\n * Map a set of RecipientInfo ASN.1 objects to recipient objects.\n *\n * @param infos an array of ASN.1 representations RecipientInfo (i.e. SET OF).\n *\n * @return an array of recipient objects.\n */\nfunction _recipientsFromAsn1(infos) {\n  var ret = [];\n  for(var i = 0; i < infos.length; ++i) {\n    ret.push(_recipientFromAsn1(infos[i]));\n  }\n  return ret;\n}\n\n/**\n * Map an array of recipient objects to ASN.1 RecipientInfo objects.\n *\n * @param recipients an array of recipientInfo objects.\n *\n * @return an array of ASN.1 RecipientInfos.\n */\nfunction _recipientsToAsn1(recipients) {\n  var ret = [];\n  for(var i = 0; i < recipients.length; ++i) {\n    ret.push(_recipientToAsn1(recipients[i]));\n  }\n  return ret;\n}\n\n/**\n * Converts a single signer from an ASN.1 object.\n *\n * @param obj the ASN.1 representation of a SignerInfo.\n *\n * @return the signer object.\n */\nfunction _signerFromAsn1(obj) {\n  // validate EnvelopedData content block and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, p7.asn1.signerInfoValidator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#7 SignerInfo. ' +\n      'ASN.1 object is not an PKCS#7 SignerInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  var rval = {\n    version: capture.version.charCodeAt(0),\n    issuer: forge.pki.RDNAttributesAsArray(capture.issuer),\n    serialNumber: forge.util.createBuffer(capture.serial).toHex(),\n    digestAlgorithm: asn1.derToOid(capture.digestAlgorithm),\n    signatureAlgorithm: asn1.derToOid(capture.signatureAlgorithm),\n    signature: capture.signature,\n    authenticatedAttributes: [],\n    unauthenticatedAttributes: []\n  };\n\n  // TODO: convert attributes\n  var authenticatedAttributes = capture.authenticatedAttributes || [];\n  var unauthenticatedAttributes = capture.unauthenticatedAttributes || [];\n\n  return rval;\n}\n\n/**\n * Converts a single signerInfo object to an ASN.1 object.\n *\n * @param obj the signerInfo object.\n *\n * @return the ASN.1 representation of a SignerInfo.\n */\nfunction _signerToAsn1(obj) {\n  // SignerInfo\n  var rval = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(obj.version).getBytes()),\n    // issuerAndSerialNumber\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // name\n      forge.pki.distinguishedNameToAsn1({attributes: obj.issuer}),\n      // serial\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        forge.util.hexToBytes(obj.serialNumber))\n    ]),\n    // digestAlgorithm\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(obj.digestAlgorithm).getBytes()),\n      // parameters (null)\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n    ])\n  ]);\n\n  // authenticatedAttributes (OPTIONAL)\n  if(obj.authenticatedAttributesAsn1) {\n    // add ASN.1 previously generated during signing\n    rval.value.push(obj.authenticatedAttributesAsn1);\n  }\n\n  // digestEncryptionAlgorithm\n  rval.value.push(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // algorithm\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n      asn1.oidToDer(obj.signatureAlgorithm).getBytes()),\n    // parameters (null)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n  ]));\n\n  // encryptedDigest\n  rval.value.push(asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, obj.signature));\n\n  // unauthenticatedAttributes (OPTIONAL)\n  if(obj.unauthenticatedAttributes.length > 0) {\n    // [1] IMPLICIT\n    var attrsAsn1 = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, []);\n    for(var i = 0; i < obj.unauthenticatedAttributes.length; ++i) {\n      var attr = obj.unauthenticatedAttributes[i];\n      attrsAsn1.values.push(_attributeToAsn1(attr));\n    }\n    rval.value.push(attrsAsn1);\n  }\n\n  return rval;\n}\n\n/**\n * Map a set of SignerInfo ASN.1 objects to an array of signer objects.\n *\n * @param signerInfoAsn1s an array of ASN.1 SignerInfos (i.e. SET OF).\n *\n * @return an array of signers objects.\n */\nfunction _signersFromAsn1(signerInfoAsn1s) {\n  var ret = [];\n  for(var i = 0; i < signerInfoAsn1s.length; ++i) {\n    ret.push(_signerFromAsn1(signerInfoAsn1s[i]));\n  }\n  return ret;\n}\n\n/**\n * Map an array of signer objects to ASN.1 objects.\n *\n * @param signers an array of signer objects.\n *\n * @return an array of ASN.1 SignerInfos.\n */\nfunction _signersToAsn1(signers) {\n  var ret = [];\n  for(var i = 0; i < signers.length; ++i) {\n    ret.push(_signerToAsn1(signers[i]));\n  }\n  return ret;\n}\n\n/**\n * Convert an attribute object to an ASN.1 Attribute.\n *\n * @param attr the attribute object.\n *\n * @return the ASN.1 Attribute.\n */\nfunction _attributeToAsn1(attr) {\n  var value;\n\n  // TODO: generalize to support more attributes\n  if(attr.type === forge.pki.oids.contentType) {\n    value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n      asn1.oidToDer(attr.value).getBytes());\n  } else if(attr.type === forge.pki.oids.messageDigest) {\n    value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n      attr.value.bytes());\n  } else if(attr.type === forge.pki.oids.signingTime) {\n    /* Note per RFC 2985: Dates between 1 January 1950 and 31 December 2049\n      (inclusive) MUST be encoded as UTCTime. Any dates with year values\n      before 1950 or after 2049 MUST be encoded as GeneralizedTime. [Further,]\n      UTCTime values MUST be expressed in Greenwich Mean Time (Zulu) and MUST\n      include seconds (i.e., times are YYMMDDHHMMSSZ), even where the\n      number of seconds is zero.  Midnight (GMT) must be represented as\n      \"YYMMDD000000Z\". */\n    // TODO: make these module-level constants\n    var jan_1_1950 = new Date('1950-01-01T00:00:00Z');\n    var jan_1_2050 = new Date('2050-01-01T00:00:00Z');\n    var date = attr.value;\n    if(typeof date === 'string') {\n      // try to parse date\n      var timestamp = Date.parse(date);\n      if(!isNaN(timestamp)) {\n        date = new Date(timestamp);\n      } else if(date.length === 13) {\n        // YYMMDDHHMMSSZ (13 chars for UTCTime)\n        date = asn1.utcTimeToDate(date);\n      } else {\n        // assume generalized time\n        date = asn1.generalizedTimeToDate(date);\n      }\n    }\n\n    if(date >= jan_1_1950 && date < jan_1_2050) {\n      value = asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.UTCTIME, false,\n        asn1.dateToUtcTime(date));\n    } else {\n      value = asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.GENERALIZEDTIME, false,\n        asn1.dateToGeneralizedTime(date));\n    }\n  }\n\n  // TODO: expose as common API call\n  // create a RelativeDistinguishedName set\n  // each value in the set is an AttributeTypeAndValue first\n  // containing the type (an OID) and second the value\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // AttributeType\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n      asn1.oidToDer(attr.type).getBytes()),\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [\n      // AttributeValue\n      value\n    ])\n  ]);\n}\n\n/**\n * Map messages encrypted content to ASN.1 objects.\n *\n * @param ec The encryptedContent object of the message.\n *\n * @return ASN.1 representation of the encryptedContent object (SEQUENCE).\n */\nfunction _encryptedContentToAsn1(ec) {\n  return [\n    // ContentType, always Data for the moment\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n      asn1.oidToDer(forge.pki.oids.data).getBytes()),\n    // ContentEncryptionAlgorithmIdentifier\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // Algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(ec.algorithm).getBytes()),\n      // Parameters (IV)\n      !ec.parameter ?\n        undefined :\n        asn1.create(\n          asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n          ec.parameter.getBytes())\n    ]),\n    // [0] EncryptedContent\n    asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n        ec.content.getBytes())\n    ])\n  ];\n}\n\n/**\n * Reads the \"common part\" of an PKCS#7 content block (in ASN.1 format)\n *\n * This function reads the \"common part\" of the PKCS#7 content blocks\n * EncryptedData and EnvelopedData, i.e. version number and symmetrically\n * encrypted content block.\n *\n * The result of the ASN.1 validate and capture process is returned\n * to allow the caller to extract further data, e.g. the list of recipients\n * in case of a EnvelopedData object.\n *\n * @param msg the PKCS#7 object to read the data to.\n * @param obj the ASN.1 representation of the content block.\n * @param validator the ASN.1 structure validator object to use.\n *\n * @return the value map captured by validator object.\n */\nfunction _fromAsn1(msg, obj, validator) {\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, validator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#7 message. ' +\n      'ASN.1 object is not a supported PKCS#7 message.');\n    error.errors = error;\n    throw error;\n  }\n\n  // Check contentType, so far we only support (raw) Data.\n  var contentType = asn1.derToOid(capture.contentType);\n  if(contentType !== forge.pki.oids.data) {\n    throw new Error('Unsupported PKCS#7 message. ' +\n      'Only wrapped ContentType Data supported.');\n  }\n\n  if(capture.encryptedContent) {\n    var content = '';\n    if(forge.util.isArray(capture.encryptedContent)) {\n      for(var i = 0; i < capture.encryptedContent.length; ++i) {\n        if(capture.encryptedContent[i].type !== asn1.Type.OCTETSTRING) {\n          throw new Error('Malformed PKCS#7 message, expecting encrypted ' +\n            'content constructed of only OCTET STRING objects.');\n        }\n        content += capture.encryptedContent[i].value;\n      }\n    } else {\n      content = capture.encryptedContent;\n    }\n    msg.encryptedContent = {\n      algorithm: asn1.derToOid(capture.encAlgorithm),\n      parameter: forge.util.createBuffer(capture.encParameter.value),\n      content: forge.util.createBuffer(content)\n    };\n  }\n\n  if(capture.content) {\n    var content = '';\n    if(forge.util.isArray(capture.content)) {\n      for(var i = 0; i < capture.content.length; ++i) {\n        if(capture.content[i].type !== asn1.Type.OCTETSTRING) {\n          throw new Error('Malformed PKCS#7 message, expecting ' +\n            'content constructed of only OCTET STRING objects.');\n        }\n        content += capture.content[i].value;\n      }\n    } else {\n      content = capture.content;\n    }\n    msg.content = forge.util.createBuffer(content);\n  }\n\n  msg.version = capture.version.charCodeAt(0);\n  msg.rawCapture = capture;\n\n  return capture;\n}\n\n/**\n * Decrypt the symmetrically encrypted content block of the PKCS#7 message.\n *\n * Decryption is skipped in case the PKCS#7 message object already has a\n * (decrypted) content attribute.  The algorithm, key and cipher parameters\n * (probably the iv) are taken from the encryptedContent attribute of the\n * message object.\n *\n * @param The PKCS#7 message object.\n */\nfunction _decryptContent(msg) {\n  if(msg.encryptedContent.key === undefined) {\n    throw new Error('Symmetric key not available.');\n  }\n\n  if(msg.content === undefined) {\n    var ciph;\n\n    switch(msg.encryptedContent.algorithm) {\n      case forge.pki.oids['aes128-CBC']:\n      case forge.pki.oids['aes192-CBC']:\n      case forge.pki.oids['aes256-CBC']:\n        ciph = forge.aes.createDecryptionCipher(msg.encryptedContent.key);\n        break;\n\n      case forge.pki.oids['desCBC']:\n      case forge.pki.oids['des-EDE3-CBC']:\n        ciph = forge.des.createDecryptionCipher(msg.encryptedContent.key);\n        break;\n\n      default:\n        throw new Error('Unsupported symmetric cipher, OID ' +\n          msg.encryptedContent.algorithm);\n    }\n    ciph.start(msg.encryptedContent.parameter);\n    ciph.update(msg.encryptedContent.content);\n\n    if(!ciph.finish()) {\n      throw new Error('Symmetric decryption failed.');\n    }\n\n    msg.content = ciph.output;\n  }\n}\n","/**\n * Functions to output keys in SSH-friendly formats.\n *\n * This is part of the Forge project which may be used under the terms of\n * either the BSD License or the GNU General Public License (GPL) Version 2.\n *\n * See: https://github.com/digitalbazaar/forge/blob/cbebca3780658703d925b61b2caffb1d263a6c1d/LICENSE\n *\n * @author https://github.com/shellac\n */\nvar forge = require('./forge');\nrequire('./aes');\nrequire('./hmac');\nrequire('./md5');\nrequire('./sha1');\nrequire('./util');\n\nvar ssh = module.exports = forge.ssh = forge.ssh || {};\n\n/**\n * Encodes (and optionally encrypts) a private RSA key as a Putty PPK file.\n *\n * @param privateKey the key.\n * @param passphrase a passphrase to protect the key (falsy for no encryption).\n * @param comment a comment to include in the key file.\n *\n * @return the PPK file as a string.\n */\nssh.privateKeyToPutty = function(privateKey, passphrase, comment) {\n  comment = comment || '';\n  passphrase = passphrase || '';\n  var algorithm = 'ssh-rsa';\n  var encryptionAlgorithm = (passphrase === '') ? 'none' : 'aes256-cbc';\n\n  var ppk = 'PuTTY-User-Key-File-2: ' + algorithm + '\\r\\n';\n  ppk += 'Encryption: ' + encryptionAlgorithm + '\\r\\n';\n  ppk += 'Comment: ' + comment + '\\r\\n';\n\n  // public key into buffer for ppk\n  var pubbuffer = forge.util.createBuffer();\n  _addStringToBuffer(pubbuffer, algorithm);\n  _addBigIntegerToBuffer(pubbuffer, privateKey.e);\n  _addBigIntegerToBuffer(pubbuffer, privateKey.n);\n\n  // write public key\n  var pub = forge.util.encode64(pubbuffer.bytes(), 64);\n  var length = Math.floor(pub.length / 66) + 1; // 66 = 64 + \\r\\n\n  ppk += 'Public-Lines: ' + length + '\\r\\n';\n  ppk += pub;\n\n  // private key into a buffer\n  var privbuffer = forge.util.createBuffer();\n  _addBigIntegerToBuffer(privbuffer, privateKey.d);\n  _addBigIntegerToBuffer(privbuffer, privateKey.p);\n  _addBigIntegerToBuffer(privbuffer, privateKey.q);\n  _addBigIntegerToBuffer(privbuffer, privateKey.qInv);\n\n  // optionally encrypt the private key\n  var priv;\n  if(!passphrase) {\n    // use the unencrypted buffer\n    priv = forge.util.encode64(privbuffer.bytes(), 64);\n  } else {\n    // encrypt RSA key using passphrase\n    var encLen = privbuffer.length() + 16 - 1;\n    encLen -= encLen % 16;\n\n    // pad private key with sha1-d data -- needs to be a multiple of 16\n    var padding = _sha1(privbuffer.bytes());\n\n    padding.truncate(padding.length() - encLen + privbuffer.length());\n    privbuffer.putBuffer(padding);\n\n    var aeskey = forge.util.createBuffer();\n    aeskey.putBuffer(_sha1('\\x00\\x00\\x00\\x00', passphrase));\n    aeskey.putBuffer(_sha1('\\x00\\x00\\x00\\x01', passphrase));\n\n    // encrypt some bytes using CBC mode\n    // key is 40 bytes, so truncate *by* 8 bytes\n    var cipher = forge.aes.createEncryptionCipher(aeskey.truncate(8), 'CBC');\n    cipher.start(forge.util.createBuffer().fillWithByte(0, 16));\n    cipher.update(privbuffer.copy());\n    cipher.finish();\n    var encrypted = cipher.output;\n\n    // Note: this appears to differ from Putty -- is forge wrong, or putty?\n    // due to padding we finish as an exact multiple of 16\n    encrypted.truncate(16); // all padding\n\n    priv = forge.util.encode64(encrypted.bytes(), 64);\n  }\n\n  // output private key\n  length = Math.floor(priv.length / 66) + 1; // 64 + \\r\\n\n  ppk += '\\r\\nPrivate-Lines: ' + length + '\\r\\n';\n  ppk += priv;\n\n  // MAC\n  var mackey = _sha1('putty-private-key-file-mac-key', passphrase);\n\n  var macbuffer = forge.util.createBuffer();\n  _addStringToBuffer(macbuffer, algorithm);\n  _addStringToBuffer(macbuffer, encryptionAlgorithm);\n  _addStringToBuffer(macbuffer, comment);\n  macbuffer.putInt32(pubbuffer.length());\n  macbuffer.putBuffer(pubbuffer);\n  macbuffer.putInt32(privbuffer.length());\n  macbuffer.putBuffer(privbuffer);\n\n  var hmac = forge.hmac.create();\n  hmac.start('sha1', mackey);\n  hmac.update(macbuffer.bytes());\n\n  ppk += '\\r\\nPrivate-MAC: ' + hmac.digest().toHex() + '\\r\\n';\n\n  return ppk;\n};\n\n/**\n * Encodes a public RSA key as an OpenSSH file.\n *\n * @param key the key.\n * @param comment a comment.\n *\n * @return the public key in OpenSSH format.\n */\nssh.publicKeyToOpenSSH = function(key, comment) {\n  var type = 'ssh-rsa';\n  comment = comment || '';\n\n  var buffer = forge.util.createBuffer();\n  _addStringToBuffer(buffer, type);\n  _addBigIntegerToBuffer(buffer, key.e);\n  _addBigIntegerToBuffer(buffer, key.n);\n\n  return type + ' ' + forge.util.encode64(buffer.bytes()) + ' ' + comment;\n};\n\n/**\n * Encodes a private RSA key as an OpenSSH file.\n *\n * @param key the key.\n * @param passphrase a passphrase to protect the key (falsy for no encryption).\n *\n * @return the public key in OpenSSH format.\n */\nssh.privateKeyToOpenSSH = function(privateKey, passphrase) {\n  if(!passphrase) {\n    return forge.pki.privateKeyToPem(privateKey);\n  }\n  // OpenSSH private key is just a legacy format, it seems\n  return forge.pki.encryptRsaPrivateKey(privateKey, passphrase,\n    {legacy: true, algorithm: 'aes128'});\n};\n\n/**\n * Gets the SSH fingerprint for the given public key.\n *\n * @param options the options to use.\n *          [md] the message digest object to use (defaults to forge.md.md5).\n *          [encoding] an alternative output encoding, such as 'hex'\n *            (defaults to none, outputs a byte buffer).\n *          [delimiter] the delimiter to use between bytes for 'hex' encoded\n *            output, eg: ':' (defaults to none).\n *\n * @return the fingerprint as a byte buffer or other encoding based on options.\n */\nssh.getPublicKeyFingerprint = function(key, options) {\n  options = options || {};\n  var md = options.md || forge.md.md5.create();\n\n  var type = 'ssh-rsa';\n  var buffer = forge.util.createBuffer();\n  _addStringToBuffer(buffer, type);\n  _addBigIntegerToBuffer(buffer, key.e);\n  _addBigIntegerToBuffer(buffer, key.n);\n\n  // hash public key bytes\n  md.start();\n  md.update(buffer.getBytes());\n  var digest = md.digest();\n  if(options.encoding === 'hex') {\n    var hex = digest.toHex();\n    if(options.delimiter) {\n      return hex.match(/.{2}/g).join(options.delimiter);\n    }\n    return hex;\n  } else if(options.encoding === 'binary') {\n    return digest.getBytes();\n  } else if(options.encoding) {\n    throw new Error('Unknown encoding \"' + options.encoding + '\".');\n  }\n  return digest;\n};\n\n/**\n * Adds len(val) then val to a buffer.\n *\n * @param buffer the buffer to add to.\n * @param val a big integer.\n */\nfunction _addBigIntegerToBuffer(buffer, val) {\n  var hexVal = val.toString(16);\n  // ensure 2s complement +ve\n  if(hexVal[0] >= '8') {\n    hexVal = '00' + hexVal;\n  }\n  var bytes = forge.util.hexToBytes(hexVal);\n  buffer.putInt32(bytes.length);\n  buffer.putBytes(bytes);\n}\n\n/**\n * Adds len(val) then val to a buffer.\n *\n * @param buffer the buffer to add to.\n * @param val a string.\n */\nfunction _addStringToBuffer(buffer, val) {\n  buffer.putInt32(val.length);\n  buffer.putString(val);\n}\n\n/**\n * Hashes the arguments into one value using SHA-1.\n *\n * @return the sha1 hash of the provided arguments.\n */\nfunction _sha1() {\n  var sha = forge.md.sha1.create();\n  var num = arguments.length;\n  for (var i = 0; i < num; ++i) {\n    sha.update(arguments[i]);\n  }\n  return sha.digest();\n}\n","/**\n * Node.js module for Forge.\n *\n * @author Dave Longley\n *\n * Copyright 2011-2016 Digital Bazaar, Inc.\n */\nmodule.exports = require('./forge');\nrequire('./aes');\nrequire('./aesCipherSuites');\nrequire('./asn1');\nrequire('./cipher');\nrequire('./des');\nrequire('./ed25519');\nrequire('./hmac');\nrequire('./kem');\nrequire('./log');\nrequire('./md.all');\nrequire('./mgf1');\nrequire('./pbkdf2');\nrequire('./pem');\nrequire('./pkcs1');\nrequire('./pkcs12');\nrequire('./pkcs7');\nrequire('./pki');\nrequire('./prime');\nrequire('./prng');\nrequire('./pss');\nrequire('./random');\nrequire('./rc2');\nrequire('./ssh');\nrequire('./tls');\nrequire('./util');\n","import axios from \"axios\";\r\nimport forge from \"node-forge\";\r\n\r\nclass PaytraceEncryption {\r\n  constructor() {\r\n    this.pub = null;\r\n    this.setKeyAjax(\"/api/paytrace\");\r\n  }\r\n\r\n  setKey(public_key_pem) {\r\n    this.pub = forge.pki.publicKeyFromPem(public_key_pem);\r\n  }\r\n\r\n  setKeyAjax(key_url) {\r\n    axios\r\n      .get(key_url)\r\n      .then((public_key_pem) => {\r\n        this.setKey(public_key_pem.data);\r\n      })\r\n      .catch(() => {\r\n        // throw new Error(`JAX Key request failed: ${error.message}`);\r\n      });\r\n  }\r\n\r\n  encryptValue(data) {\r\n    if (!this.pub) throw new Error(\"No public key was provided (PayTrace E2EE).\");\r\n    return forge.util.encode64(this.pub.encrypt(data));\r\n  }\r\n}\r\n\r\nexport default PaytraceEncryption;\r\n","import axiosClient from \"@/api/axiosClient\";\r\nimport { useQuery, useQueryClient, useMutation } from \"@tanstack/vue-query\";\r\nimport PaytraceEncryption from \"@/util/paytraceEncryption\";\r\n\r\nconst QUERY_KEY_BASE = \"payment_cards\";\r\nconst encryptService = new PaytraceEncryption();\r\n\r\nexport const useCreditCardQuery = (params, options) => {\r\n  return useQuery({\r\n    ...(options || {}),\r\n    queryKey: [QUERY_KEY_BASE, { includeSingleUse: !!params?.includeSingleUse }],\r\n    queryFn: () => axiosClient.get(\"/payment_cards\", { params }),\r\n    refetchOnWindowFocus: false\r\n  });\r\n};\r\n\r\nexport const useCreateCreditCardMutation = (options) => {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (creditCard) => {\r\n      //TODO: how should we handle errors\r\n      const encryptedCardNumber = encryptService.encryptValue(creditCard.cardNumber);\r\n      const lastFour = creditCard.cardNumber.slice(-4);\r\n      const expiration = creditCard.expiration.replace(/\\s+/g, \"\");\r\n      const updatedCCData = { ...creditCard, cardNumber: encryptedCardNumber, lastFour, expiration };\r\n      return axiosClient.post(\"/payment_cards\", updatedCCData);\r\n    },\r\n    onSuccess: (newCreditCard, { isSingleUse }) => {\r\n      // Add the new card to the query cache(s)\r\n      const queryKeyFilter = [QUERY_KEY_BASE];\r\n      if (isSingleUse) {\r\n        queryKeyFilter.push({ includeSingleUse: true });\r\n      }\r\n      queryClient.setQueriesData({ queryKey: queryKeyFilter }, (existingCreditCards) => {\r\n        return [...(existingCreditCards || []), newCreditCard];\r\n      });\r\n    }\r\n  });\r\n};\r\n\r\nexport function useDeleteCreditCardMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (id) => axiosClient.delete(`/payment_cards/${encodeURIComponent(id)}`),\r\n    onSuccess: (_data, deletedId) => {\r\n      // Remove the deleted card from the query cache(s)\r\n      queryClient.setQueriesData([QUERY_KEY_BASE], (existingCreditCards) => {\r\n        let deletedCreditCardIndex = existingCreditCards.findIndex((creditCard) => creditCard.id === deletedId);\r\n        if (deletedCreditCardIndex < 0) {\r\n          return existingCreditCards;\r\n        } else {\r\n          return [...existingCreditCards.slice(0, deletedCreditCardIndex), ...existingCreditCards.slice(deletedCreditCardIndex + 1)];\r\n        }\r\n      });\r\n    }\r\n  });\r\n}\r\n","<script setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport FhPaymentCard from \"@/components/Ecomm/FhPaymentCard/FhPaymentCard.vue\";\r\nimport FhPaginationNav from \"@/components/FhPaginationNav.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhCard from \"@/components/FhCard.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport { usePaginatedList } from \"@/composables\";\r\nimport { ERROR_RESPONSE_MESSAGES } from \"@/constants/payment\";\r\nimport { useDeleteCreditCardMutation } from \"@/api/creditCardApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\n\r\nconst props = defineProps({\r\n  cards: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  cardsPerPage: {\r\n    type: Number,\r\n    default: 12\r\n  },\r\n  isError: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isLoading: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst showDeleteModal = ref(false);\r\nconst cardToRemove = ref(null);\r\nconst cardsToShow = computed(() => props.cards);\r\nconst cardRef = ref(null);\r\nconst deleteCardError = ref(null);\r\n\r\nconst { isLoading, mutate: deleteCreditCardMutation } = useDeleteCreditCardMutation();\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst isEmpty = computed(() => props.cards.length === 0);\r\n\r\nconst handleRemoveCC = (val) => {\r\n  const card = props.cards.find((card) => card.id === val);\r\n  if (card) {\r\n    showDeleteModal.value = true;\r\n    cardToRemove.value = card;\r\n  }\r\n};\r\n\r\nconst removeCreditCard = () => {\r\n  deleteCreditCardMutation(cardToRemove.value.id, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Card removed.\"),\r\n    onError: handleDeleteError,\r\n    onSettled: (data, error) => {\r\n      if (!error) {\r\n        showDeleteModal.value = false;\r\n        deleteCardError.value = null;\r\n      }\r\n    }\r\n  });\r\n};\r\n\r\nconst handleDeleteError = (error) => {\r\n  const { data, status } = error.response;\r\n  if (status === 400 && Object.keys(ERROR_RESPONSE_MESSAGES).includes(data?.error_code?.toString())) {\r\n    deleteCardError.value = ERROR_RESPONSE_MESSAGES[data?.error_code]?.error_msg;\r\n  } else {\r\n    notificationStore.notifyError(\"Sorry, something went wrong and we could not remove that card.\");\r\n  }\r\n};\r\n\r\nconst reset = () => {\r\n  showDeleteModal.value = false;\r\n  deleteCardError.value = null;\r\n};\r\n\r\nlet { page, totalPages, sublist: currentPage } = usePaginatedList(cardsToShow, props.cardsPerPage);\r\n\r\nwatch(cardsToShow, (newCards, oldCards) => {\r\n  if (newCards.length > oldCards.length) {\r\n    page.value = totalPages.value;\r\n    cardRef.value[cardRef.value.length - 1]?.paymentCardRef?.scrollIntoView({ behavior: \"smooth\" });\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"grid gap-f3 md:grid-cols-2\">\r\n    <FhCard v-for=\"card in currentPage\" :key=\"card.id\">\r\n      <FhPaymentCard\r\n        :id=\"card.id\"\r\n        ref=\"cardRef\"\r\n        :card-type=\"card.cardType\"\r\n        :nick-name=\"card.nickName\"\r\n        :last-four=\"card.lastFour\"\r\n        :expiration=\"card.expiration\"\r\n        :is-expired=\"card.isExpired\"\r\n        @delete=\"handleRemoveCC\"\r\n      />\r\n    </FhCard>\r\n  </div>\r\n  <div v-if=\"totalPages > 1\" class=\"mt-f8 flex items-center justify-center\">\r\n    <FhPaginationNav v-model:page=\"page\" :total-items=\"cards.length\" :per-page=\"props.cardsPerPage\" />\r\n  </div>\r\n  <FhModal :data=\"{ heading: 'Confirm Card Removal' }\" :is-open=\"showDeleteModal\" @close=\"reset\">\r\n    <template #body>\r\n      <FhCard>\r\n        <FhPaymentCard\r\n          :id=\"cardToRemove.id\"\r\n          :card-type=\"cardToRemove.cardType\"\r\n          :nick-name=\"cardToRemove.nickName\"\r\n          :last-four=\"cardToRemove.lastFour\"\r\n          :expiration=\"cardToRemove.expiration\"\r\n          :show-remove-link=\"false\"\r\n        />\r\n      </FhCard>\r\n      <div v-if=\"deleteCardError\" class=\"mt-3 flex items-center gap-2 py-2 text-brand-red\">\r\n        <div>\r\n          <fh-icon name=\"AlertCircle\" />\r\n        </div>\r\n        <div v-html=\"deleteCardError\"></div>\r\n      </div>\r\n    </template>\r\n    <template #footer>\r\n      <FhButton color=\"primary\" :disabled=\"isLoading\" :is-loading=\"isLoading\" @click=\"removeCreditCard\">Remove</FhButton>\r\n      <FhButton variant=\"text\" @click=\"reset\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n  <div v-if=\"isEmpty && !props.isError\" class=\"text-body-lg mb-f2 text-neutral-50\">You have no saved cards.</div>\r\n  <div v-if=\"props.isError\" class=\"text-body-lg mb-f2 flex items-center gap-f1\">\r\n    <fh-icon name=\"AlertCircle\" class=\"flex-none\" />\r\n    Sorry, we are not able to load your saved cards at this time.\r\n  </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhFormField from \"./FhFormField.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: undefined,\r\n    required: true\r\n  },\r\n  /**\r\n   * The select options. One of:\r\n   *   - An array of primitive values: each entry will be used for both the `text` and `value`.\r\n   *   - An array of arrays (e.g., `[[\"Option 1\", 1], ...]`): the two sub-array entries will be used as the `text` and `value`, respectively.\r\n   *   - An array of objects (e.g., `[{text: \"Option 1\", value: 1}, ...]`). If `value` is missing, then `text` will be used for both the `text` and `value`.\r\n   */\r\n  options: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  /**\r\n   * The placeholder is added as the first option with a `value` of `null`. To ensure it is selected by default, `modelValue` should be `null`.\r\n   */\r\n  placeholder: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  label: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  note: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  disabled: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  required: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  error: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  errorMessage: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  /**\r\n   * The Vuelidate validation object for this field. Use this to automatically set the error state and errorMessage.\r\n   * The `errorMessage` prop will override any error messages from this prop if both are set.\r\n   */\r\n  vuelidate: {\r\n    type: Object,\r\n    default: () => undefined\r\n  },\r\n  /**\r\n   * Fallthrough attributes are applied to the inner form control. Use this object if you need to bind anything custom to the form field wrapper node intead.\r\n   */\r\n  wrapperAttrs: {\r\n    type: Object,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nconst _options = computed(() => {\r\n  return props.options.map((opt) => {\r\n    if (Array.isArray(opt)) {\r\n      return { text: opt[0], value: opt.length === 1 ? opt[0] : opt[1] };\r\n    } else if (typeof opt === \"object\") {\r\n      return { ...opt, value: Object.prototype.hasOwnProperty.call(opt, \"value\") ? opt.value : opt.text };\r\n    } else {\r\n      return { text: opt, value: opt };\r\n    }\r\n  });\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n</script>\r\n\r\n<template>\r\n  <FhFormField v-bind=\"{ label, note, disabled, required, error, errorMessage, vuelidate, wrapperAttrs }\">\r\n    <template #default=\"controlBindings\">\r\n      <select v-bind=\"controlBindings\" v-model=\"value\" class=\"fh-input group\" :class=\"{ 'text-neutral-50': value === null }\">\r\n        <option v-if=\"placeholder\" :value=\"null\">{{ placeholder }}</option>\r\n        <slot>\r\n          <option v-for=\"option in _options\" :key=\"option.value\" :value=\"option.value\" :disabled=\"option.disabled\">{{ option.text }}</option>\r\n        </slot>\r\n      </select>\r\n    </template>\r\n    <template v-if=\"$slots.note\" #note><slot name=\"note\"></slot></template>\r\n    <template v-if=\"$slots.errorMessage\" #errorMessage><slot name=\"errorMessage\"></slot></template>\r\n  </FhFormField>\r\n</template>\r\n\r\n<style scoped>\r\nselect {\r\n  appearance: none;\r\n  background-image: url(\"data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237a7a7a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e\");\r\n  background-repeat: no-repeat;\r\n  background-position: right 1rem center;\r\n  background-size: 1.5rem;\r\n  padding-right: 3.5rem;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed, ref } from \"vue\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * Model of the component; Either use this property (along with a listener for 'update:model-value' event) OR use v-model directive\r\n   */\r\n  modelValue: {\r\n    type: [Boolean, Array],\r\n    required: true\r\n  },\r\n  /**\r\n   * Applicable when `modelValue` is an Array; which value should be added/removed when checkbox is selected/unselected\r\n   */\r\n  value: {\r\n    type: undefined,\r\n    default: null\r\n  },\r\n  /**\r\n   * The checkbox label (or use the default slot instead of this prop)\r\n   */\r\n  label: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  /**\r\n   * The checkbox indeterminate (or use the default slot instead of this prop)\r\n   */\r\n  indeterminate: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * An optional note to include below the checkbox label\r\n   */\r\n  note: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  /**\r\n   * Puts the checkbox in a disabled, non-interactive state\r\n   */\r\n  disabled: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * Controls the checkbox and label size; corresponds to standard fluid body text sizes\r\n   * @values base, lg, xl\r\n   */\r\n  size: {\r\n    type: String,\r\n    default: \"base\",\r\n    validator: (val) => [\"base\", \"lg\", \"xl\"].includes(val)\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\nconst labelSizeClass = computed(() => {\r\n  if (props.size === \"lg\") return \"text-f-base-lg\";\r\n  if (props.size === \"xl\") return \"text-f-lg-xl\";\r\n  return \"text-f-sm-base\";\r\n});\r\n\r\nconst inputRef = ref(null);\r\n\r\ndefineExpose({\r\n  inputRef\r\n});\r\n</script>\r\n\r\n<template>\r\n  <label\r\n    class=\"c-checkbox relative inline-flex cursor-pointer select-none items-start\"\r\n    :class=\"[labelSizeClass, { 'cursor-default opacity-35': props.disabled }]\"\r\n    :style=\"{ '--label-lh': `var(--label-lh-${props.size})` }\"\r\n  >\r\n    <!-- The real checkbox; visually hidden, but still accessible to assistive technologies -->\r\n    <input\r\n      ref=\"inputRef\"\r\n      v-model=\"value\"\r\n      :value=\"props.value\"\r\n      type=\"checkbox\"\r\n      class=\"input absolute opacity-0\"\r\n      :disabled=\"props.disabled\"\r\n      :data-ga=\"`${$attrs['data-ga'] ?? 'checkbox'}`\"\r\n      :data-ga-value=\"`${$attrs['data-ga-value'] ?? props.value}`\"\r\n    />\r\n    <!-- The \"replacement\" visual checkbox with custom styling -->\r\n    <div class=\"checkbox relative mr-f2 shrink-0 border border-neutral-50\" aria-hidden=\"true\" focusable=\"false\">\r\n      <svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" class=\"fill-transparent\">\r\n        <path v-if=\"!props.indeterminate\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"m6 10.39 6.862-6.863.943.943L6 12.275 2.195 8.47l.943-.943L6 10.39Z\" />\r\n        <rect v-if=\"props.indeterminate\" x=\"1\" y=\"7\" width=\"14\" height=\"2\" fill=\"currentColor\" />\r\n      </svg>\r\n    </div>\r\n    <!-- @slot The default slot can be used for a label; overwrites the `label` and `note` props, if set -->\r\n    <slot>\r\n      <div v-if=\"props.note\">\r\n        <div class=\"mb-f1\">{{ props.label }}</div>\r\n        <div class=\"text-body-sm max-w-prose text-neutral-50\">{{ props.note }}</div>\r\n      </div>\r\n      <template v-else>\r\n        {{ props.label }}\r\n      </template>\r\n    </slot>\r\n  </label>\r\n</template>\r\n\r\n<style scoped lang=\"pcss\">\r\n.c-checkbox {\r\n  /* Variables for the line heights used in the computations below, pulled from the Tailwind config; one for each possible size param */\r\n  --label-lh-base: theme(\"fontSize.f-sm-base.1\");\r\n  --label-lh-lg: theme(\"fontSize.f-base-lg.1\");\r\n  --label-lh-xl: theme(\"fontSize.f-lg-xl.1\");\r\n\r\n  /* The checkbox size in em units so it scales with the font size */\r\n  --checkbox-size: 1em;\r\n\r\n  /**\r\n   * Vertical offset for the checkbox to vertically centered it the first line of text in the label;\r\n   * Depends on the dynamic `--label-lh` var, which is set above as an inline style based on the size prop.\r\n   */\r\n  --checkbox-offset: calc(var(--label-lh) / 2 - var(--checkbox-size) / 2);\r\n\r\n  /**\r\n   * Position both the real checkbox and the \"replacement\" checkbox in the same spot, on top of eachother. The real checkbox is made invisible with opacity:0.\r\n   * The approach, and the reasons for it, are outlined here: https://www.sarasoueidan.com/blog/inclusively-hiding-and-styling-checkboxes-and-radio-buttons\r\n   */\r\n  & .input,\r\n  & .checkbox {\r\n    width: var(--checkbox-size);\r\n    height: var(--checkbox-size);\r\n    top: var(--checkbox-offset);\r\n  }\r\n\r\n  /* Checkbox styling for the checked state */\r\n  & .input:checked + .checkbox {\r\n    @apply border-neutral-70 bg-neutral-70;\r\n\r\n    & svg {\r\n      @apply fill-white;\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * TODO: Add :focus styles to the custom checkbox\r\n */\r\n</style>\r\n","export default \"data:image/png;base64,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\"","<script setup>\r\nimport { ref, onMounted } from \"vue\";\r\nimport placeholderSeal from \"@/assets/digicert-seal-placeholder.png\";\r\n\r\nconst isProd = ref(window.location.hostname.endsWith(\"fourhands.com\"));\r\n\r\nonMounted(() => {\r\n  if (isProd.value) {\r\n    initDigiCertSeal();\r\n  }\r\n});\r\n\r\nfunction initDigiCertSeal() {\r\n  window.__dcid = window.__dcid || [];\r\n  window.__dcid.push([\"DigiCertClickID_DG37kk7S\", \"3\", \"m\", \"black\", \"DG37kk7S\"]);\r\n  (function () {\r\n    var cid = document.createElement(\"script\");\r\n    cid.async = true;\r\n    cid.src = \"//seal.digicert.com/seals/cascade/seal.min.js\";\r\n    var s = document.getElementsByTagName(\"script\");\r\n    var ls = s[s.length - 1];\r\n    ls.parentNode.insertBefore(cid, ls.nextSibling);\r\n  })();\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div id=\"DigiCertClickID_DG37kk7S\" data-language=\"en\">\r\n    <img v-if=\"!isProd\" :src=\"placeholderSeal\" alt=\"DigiCert Seal\" />\r\n  </div>\r\n</template>\r\n","// Generated by CoffeeScript 1.10.0\n\n/*\n  Credit Card Utils Javascript Library\n\n  URL: https://github.com/faaez/creditcardutils\n  Author: Faaez Ul Haq <faaez.ulhaq@gmail.com>\n  License: MIT\n  Version: 1.0.0\n */\n\n(function() {\n  var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n  (function(name, definition) {\n    if (typeof module !== \"undefined\" && module !== null) {\n      return module.exports = definition();\n    } else if (typeof define === 'function' && typeof define.amd === 'object') {\n      return define(name, definition);\n    } else {\n      return this[name] = definition();\n    }\n  })('creditcardutils', function() {\n    var cardFromNumber, cardFromType, creditcardutils, defaultFormat, formatBackCardNumber, formatBackExpiry, formatCardExpiry, formatCardNumber, formatForwardExpiry, formatForwardSlashAndSpace, hasTextSelected, luhnCheck, reFormatCVC, reFormatCardNumber, reFormatExpiry, replaceFullWidthChars, restrictCVC, restrictCardNumber, restrictExpiry, restrictNumeric;\n    creditcardutils = {};\n    defaultFormat = /(\\d{1,4})/g;\n    creditcardutils.cards = [\n      {\n        type: 'visaelectron',\n        pattern: /^4(026|17500|405|508|844|91[37])/,\n        format: defaultFormat,\n        length: [16],\n        cvcLength: [3],\n        luhn: true\n      }, {\n        type: 'maestro',\n        pattern: /^(5(018|0[23]|[68])|6(39|7))/,\n        format: defaultFormat,\n        length: [12, 13, 14, 15, 16, 17, 18, 19],\n        cvcLength: [3],\n        luhn: true\n      }, {\n        type: 'forbrugsforeningen',\n        pattern: /^600/,\n        format: defaultFormat,\n        length: [16],\n        cvcLength: [3],\n        luhn: true\n      }, {\n        type: 'dankort',\n        pattern: /^5019/,\n        format: defaultFormat,\n        length: [16],\n        cvcLength: [3],\n        luhn: true\n      }, {\n        type: 'visa',\n        pattern: /^4/,\n        format: defaultFormat,\n        length: [13, 16],\n        cvcLength: [3],\n        luhn: true\n      }, {\n        type: 'mastercard',\n        pattern: /^(5[1-5]|2[2-7])/,\n        format: defaultFormat,\n        length: [16],\n        cvcLength: [3],\n        luhn: true\n      }, {\n        type: 'amex',\n        pattern: /^3[47]/,\n        format: /(\\d{1,4})(\\d{1,6})?(\\d{1,5})?/,\n        length: [15],\n        cvcLength: [3, 4],\n        luhn: true\n      }, {\n        type: 'dinersclub',\n        pattern: /^3[0689]/,\n        format: /(\\d{1,4})(\\d{1,6})?(\\d{1,4})?/,\n        length: [14],\n        cvcLength: [3],\n        luhn: true\n      }, {\n        type: 'discover',\n        pattern: /^6([045]|22)/,\n        format: defaultFormat,\n        length: [16],\n        cvcLength: [3],\n        luhn: true\n      }, {\n        type: 'unionpay',\n        pattern: /^(62|88)/,\n        format: defaultFormat,\n        length: [16, 17, 18, 19],\n        cvcLength: [3],\n        luhn: false\n      }, {\n        type: 'jcb',\n        pattern: /^35/,\n        format: defaultFormat,\n        length: [16],\n        cvcLength: [3],\n        luhn: true\n      }\n    ];\n    cardFromNumber = function(num) {\n      var card, i, len, ref;\n      num = (num + '').replace(/\\D/g, '');\n      ref = creditcardutils.cards;\n      for (i = 0, len = ref.length; i < len; i++) {\n        card = ref[i];\n        if (card.pattern.test(num)) {\n          return card;\n        }\n      }\n    };\n    cardFromType = function(type) {\n      var card, i, len, ref;\n      ref = creditcardutils.cards;\n      for (i = 0, len = ref.length; i < len; i++) {\n        card = ref[i];\n        if (card.type === type) {\n          return card;\n        }\n      }\n    };\n    luhnCheck = function(num) {\n      var digit, digits, i, len, odd, sum;\n      odd = true;\n      sum = 0;\n      digits = (num + '').split('').reverse();\n      for (i = 0, len = digits.length; i < len; i++) {\n        digit = digits[i];\n        digit = parseInt(digit, 10);\n        if ((odd = !odd)) {\n          digit *= 2;\n        }\n        if (digit > 9) {\n          digit -= 9;\n        }\n        sum += digit;\n      }\n      return sum % 10 === 0;\n    };\n    hasTextSelected = function(target) {\n      var ref;\n      if ((typeof document !== \"undefined\" && document !== null ? (ref = document.selection) != null ? ref.createRange : void 0 : void 0) != null) {\n        if (document.selection.createRange().text) {\n          return true;\n        }\n      }\n      return (target.selectionStart != null) && target.selectionStart !== target.selectionEnd;\n    };\n    replaceFullWidthChars = function(str) {\n      var char, chars, fullWidth, halfWidth, i, idx, len, value;\n      if (str == null) {\n        str = '';\n      }\n      fullWidth = '\\uff10\\uff11\\uff12\\uff13\\uff14\\uff15\\uff16\\uff17\\uff18\\uff19';\n      halfWidth = '0123456789';\n      value = '';\n      chars = str.split('');\n      for (i = 0, len = chars.length; i < len; i++) {\n        char = chars[i];\n        idx = fullWidth.indexOf(char);\n        if (idx > -1) {\n          char = halfWidth[idx];\n        }\n        value += char;\n      }\n      return value;\n    };\n    reFormatCardNumber = function(e) {\n      var cursor;\n      cursor = _getCaretPos(e.target);\n      e.target.value = creditcardutils.formatCardNumber(e.target.value);\n      if ((cursor != null) && e.type !== 'change') {\n        return e.target.setSelectionRange(cursor, cursor);\n      }\n    };\n    formatCardNumber = function(e) {\n      var card, cursor, digit, length, re, upperLength, value;\n      digit = String.fromCharCode(e.which);\n      if (!/^\\d+$/.test(digit)) {\n        return;\n      }\n      value = e.target.value;\n      card = cardFromNumber(value + digit);\n      length = (value.replace(/\\D/g, '') + digit).length;\n      upperLength = 16;\n      if (card) {\n        upperLength = card.length[card.length.length - 1];\n      }\n      if (length >= upperLength) {\n        return;\n      }\n      cursor = _getCaretPos(e.target);\n      if (cursor && cursor !== value.length) {\n        return;\n      }\n      if (card && card.type === 'amex') {\n        re = /^(\\d{4}|\\d{4}\\s\\d{6})$/;\n      } else {\n        re = /(?:^|\\s)(\\d{4})$/;\n      }\n      if (re.test(value)) {\n        e.preventDefault();\n        return setTimeout(function() {\n          return e.target.value = value + \" \" + digit;\n        });\n      } else if (re.test(value + digit)) {\n        e.preventDefault();\n        return setTimeout(function() {\n          return e.target.value = (value + digit) + \" \";\n        });\n      }\n    };\n    formatBackCardNumber = function(e) {\n      var cursor, value;\n      value = e.target.value;\n      if (e.which !== 8) {\n        return;\n      }\n      cursor = _getCaretPos(e.target);\n      if (cursor && cursor !== value.length) {\n        return;\n      }\n      if (/\\d\\s$/.test(value)) {\n        e.preventDefault();\n        return setTimeout(function() {\n          return e.target.value = value.replace(/\\d\\s$/, '');\n        });\n      } else if (/\\s\\d?$/.test(value)) {\n        e.preventDefault();\n        return setTimeout(function() {\n          return e.target.value = value.replace(/\\d$/, '');\n        });\n      }\n    };\n    reFormatExpiry = function(e) {\n      var cursor;\n      cursor = _getCaretPos(e.target);\n      e.target.value = creditcardutils.formatCardExpiry(e.target.value);\n      if ((cursor != null) && e.type !== 'change') {\n        return e.target.setSelectionRange(cursor, cursor);\n      }\n    };\n    formatCardExpiry = function(e) {\n      var digit, val;\n      digit = String.fromCharCode(e.which);\n      if (!/^\\d+$/.test(digit)) {\n        return;\n      }\n      val = e.target.value + digit;\n      if (/^\\d$/.test(val) && (val !== '0' && val !== '1')) {\n        e.preventDefault();\n        return setTimeout(function() {\n          return e.target.value = \"0\" + val + \" / \";\n        });\n      } else if (/^\\d\\d$/.test(val)) {\n        e.preventDefault();\n        return setTimeout(function() {\n          return e.target.value = val + \" / \";\n        });\n      }\n    };\n    formatForwardExpiry = function(e) {\n      var digit, val;\n      digit = String.fromCharCode(e.which);\n      if (!/^\\d+$/.test(digit)) {\n        return;\n      }\n      val = e.target.value;\n      if (/^\\d\\d$/.test(val)) {\n        return e.target.value = val + \" / \";\n      }\n    };\n    formatForwardSlashAndSpace = function(e) {\n      var val, which;\n      which = String.fromCharCode(e.which);\n      if (!(which === '/' || which === ' ')) {\n        return;\n      }\n      val = e.target.value;\n      if (/^\\d$/.test(val) && val !== '0') {\n        return e.target.value = \"0\" + val + \" / \";\n      }\n    };\n    formatBackExpiry = function(e) {\n      var cursor, value;\n      value = e.target.value;\n      if (e.which !== 8) {\n        return;\n      }\n      cursor = _getCaretPos(e.target);\n      if (cursor && cursor !== value.length) {\n        return;\n      }\n      if (/\\d\\s\\/\\s$/.test(value)) {\n        e.preventDefault();\n        return setTimeout(function() {\n          return e.target.value = value.replace(/\\d\\s\\/\\s$/, '');\n        });\n      }\n    };\n    reFormatCVC = function(e) {\n      var cursor;\n      cursor = _getCaretPos(e.target);\n      e.target.value = replaceFullWidthChars(e.target.value).replace(/\\D/g, '').slice(0, 4);\n      if ((cursor != null) && e.type !== 'change') {\n        return e.target.setSelectionRange(cursor, cursor);\n      }\n    };\n    restrictNumeric = function(e) {\n      var input;\n      if (e.metaKey || e.ctrlKey) {\n        return;\n      }\n      if (e.which === 0) {\n        return;\n      }\n      if (e.which < 33) {\n        return;\n      }\n      input = String.fromCharCode(e.which);\n      if (!/^\\d+$/.test(input)) {\n        return e.preventDefault();\n      }\n    };\n    restrictCardNumber = function(e) {\n      var card, digit, value;\n      digit = String.fromCharCode(e.which);\n      if (!/^\\d+$/.test(digit)) {\n        return;\n      }\n      if (hasTextSelected(e.target)) {\n        return;\n      }\n      value = (e.target.value + digit).replace(/\\D/g, '');\n      card = cardFromNumber(value);\n      if (card && value.length > card.length[card.length.length - 1]) {\n        return e.preventDefault();\n      } else if (value.length > 16) {\n        return e.preventDefault();\n      }\n    };\n    restrictExpiry = function(e) {\n      var digit, value;\n      digit = String.fromCharCode(e.which);\n      if (!/^\\d+$/.test(digit)) {\n        return;\n      }\n      if (hasTextSelected(e.target)) {\n        return;\n      }\n      value = e.target.value + digit;\n      value = value.replace(/\\D/g, '');\n      if (value.length > 6) {\n        return e.preventDefault();\n      }\n    };\n    restrictCVC = function(e) {\n      var digit, val;\n      digit = String.fromCharCode(e.which);\n      if (!/^\\d+$/.test(digit)) {\n        return;\n      }\n      if (hasTextSelected(e.target)) {\n        return;\n      }\n      val = e.target.value + digit;\n      if (val.length > 4) {\n        return e.preventDefault();\n      }\n    };\n    creditcardutils.parseCardExpiry = function(value) {\n      var month, prefix, ref, year;\n      value = value.replace(/\\s/g, '');\n      ref = value.split('/', 2), month = ref[0], year = ref[1];\n      if ((year != null ? year.length : void 0) === 2 && /^\\d+$/.test(year)) {\n        prefix = (new Date).getFullYear();\n        prefix = prefix.toString().slice(0, 2);\n        year = prefix + year;\n      }\n      month = parseInt(month, 10);\n      year = parseInt(year, 10);\n      return {\n        month: month,\n        year: year\n      };\n    };\n    creditcardutils.validateCardNumber = function(num) {\n      var card, ref;\n      num = (num + '').replace(/\\s+|-/g, '');\n      if (!/^\\d+$/.test(num)) {\n        return false;\n      }\n      card = cardFromNumber(num);\n      if (!card) {\n        return false;\n      }\n      return (ref = num.length, indexOf.call(card.length, ref) >= 0) && (card.luhn === false || luhnCheck(num));\n    };\n    creditcardutils.validateCardExpiry = function(month, year) {\n      var currentTime, expiry, ref;\n      if (typeof month === 'object' && 'month' in month) {\n        ref = month, month = ref.month, year = ref.year;\n      }\n      if (!(month && year)) {\n        return false;\n      }\n      month = String(month).trim();\n      year = String(year).trim();\n      if (!/^\\d+$/.test(month)) {\n        return false;\n      }\n      if (!/^\\d+$/.test(year)) {\n        return false;\n      }\n      if (!((1 <= month && month <= 12))) {\n        return false;\n      }\n      if (year.length === 2) {\n        if (year < 70) {\n          year = \"20\" + year;\n        } else {\n          year = \"19\" + year;\n        }\n      }\n      if (year.length !== 4) {\n        return false;\n      }\n      expiry = new Date(year, month);\n      currentTime = new Date;\n      expiry.setMonth(expiry.getMonth() - 1);\n      expiry.setMonth(expiry.getMonth() + 1, 1);\n      return expiry > currentTime;\n    };\n    creditcardutils.validateCardCVC = function(cvc, type) {\n      var card, ref;\n      cvc = String(cvc).trim();\n      if (!/^\\d+$/.test(cvc)) {\n        return false;\n      }\n      card = cardFromType(type);\n      if (card != null) {\n        return ref = cvc.length, indexOf.call(card.cvcLength, ref) >= 0;\n      } else {\n        return cvc.length >= 3 && cvc.length <= 4;\n      }\n    };\n    creditcardutils.parseCardType = function(num) {\n      var ref;\n      if (!num) {\n        return null;\n      }\n      return ((ref = cardFromNumber(num)) != null ? ref.type : void 0) || null;\n    };\n    creditcardutils.formatCardNumber = function(num) {\n      var card, groups, ref, upperLength;\n      num = replaceFullWidthChars(num);\n      num = num.replace(/\\D/g, '');\n      card = cardFromNumber(num);\n      if (!card) {\n        return num;\n      }\n      upperLength = card.length[card.length.length - 1];\n      num = num.slice(0, upperLength);\n      if (card.format.global) {\n        return (ref = num.match(card.format)) != null ? ref.join(' ') : void 0;\n      } else {\n        groups = card.format.exec(num);\n        if (groups == null) {\n          return;\n        }\n        groups.shift();\n        groups = groups.filter(Boolean);\n        return groups.join(' ');\n      }\n    };\n    creditcardutils.formatCardExpiry = function(expiry) {\n      var mon, parts, sep, year;\n      expiry = replaceFullWidthChars(expiry);\n      parts = expiry.match(/^\\D*(\\d{1,2})(\\D+)?(\\d{1,4})?/);\n      if (!parts) {\n        return '';\n      }\n      mon = parts[1] || '';\n      sep = parts[2] || '';\n      year = parts[3] || '';\n      if (year.length > 0) {\n        sep = ' / ';\n      } else if (sep === ' /') {\n        mon = mon.substring(0, 1);\n        sep = '';\n      } else if (mon.length === 2 || sep.length > 0) {\n        sep = ' / ';\n      } else if (mon.length === 1 && (mon !== '0' && mon !== '1')) {\n        mon = \"0\" + mon;\n        sep = ' / ';\n      }\n      return mon + sep + year;\n    };\n    return creditcardutils;\n  });\n\n}).call(this);\n","<script setup>\r\nimport { reactive, computed, ref } from \"vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhSelect from \"@/components/FhSelect.vue\";\r\nimport FhCheckbox from \"@/components/FhCheckbox.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhDigiCertSeal from \"@/components/FhDigiCertSeal.vue\";\r\nimport COUNTRIES from \"@/constants/countries\";\r\nimport { useCreateCreditCardMutation } from \"@/api/creditCardApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, required } from \"@vuelidate/validators\";\r\nimport { CREDIT_CARDS } from \"@/constants\";\r\nimport { ERROR_RESPONSE_MESSAGES } from \"@/constants/payment\";\r\nimport { formatCardNumber, parseCardType, validateCardNumber, formatCardExpiry, validateCardExpiry, parseCardExpiry, validateCardCVC } from \"creditcardutils\";\r\nimport { omit } from \"lodash\";\r\n\r\nconst props = defineProps({\r\n  allowSingleUse: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  allowSameAsShipping: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  shippingAddress: {\r\n    type: Object,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"create\"]);\r\n\r\nconst initialState = {\r\n  nickName: null,\r\n  name: null,\r\n  cardNumber: null,\r\n  expiration: null,\r\n  cvv: null,\r\n  billingCountry: \"US\",\r\n  billingAddress1: null,\r\n  billingAddress2: null,\r\n  billingCity: null,\r\n  billingState: null,\r\n  billingZip: null,\r\n  saveForLater: false\r\n};\r\n\r\nconst modal = ref(null);\r\n\r\nconst sameAsShipping = ref(false);\r\nconst creditCardError = ref(null);\r\n\r\nconst notificationStore = useNotificationStore();\r\nconst { mutate: createCreditCardMutation, isLoading } = useCreateCreditCardMutation();\r\nconst formData = reactive({ ...initialState });\r\n\r\nconst ALLOWED_BILLING_COUNTRIES = [\"US\", \"CA\", \"BR\", \"CO\", \"EC\", \"MX\", \"PA\", \"PE\"];\r\nconst countryOptions = Object.keys(COUNTRIES)\r\n  .filter((key) => ALLOWED_BILLING_COUNTRIES.includes(key))\r\n  .map((key) => ({ value: key, text: COUNTRIES[key].name }));\r\n\r\nconst hasStateOptions = computed(() => {\r\n  return formData.billingCountry === \"US\" || formData.billingCountry === \"CA\";\r\n});\r\n\r\nconst country = computed(() => COUNTRIES[formData.billingCountry]);\r\nconst stateLabel = computed(() => country.value.stateName ?? \"State/Province/Region\");\r\nconst stateOptions = computed(() =>\r\n  country.value.states ? Object.keys(country.value.states).map((key) => ({ value: key, text: country.value.states[key] })) : []\r\n);\r\nconst postalCodeLabel = computed(() => country.value.postalCodeName ?? \"Postal Code\");\r\nconst postalCodeRegex = computed(() => country.value?.postalCodeRegex);\r\nconst cardBrand = computed(() => {\r\n  const cardType = parseCardType(formData.cardNumber);\r\n  return {\r\n    validationType: cardType,\r\n    type: CREDIT_CARDS[cardType]\r\n  };\r\n});\r\n\r\nconst ACCEPTED_CARD_BRANDS = Object.keys(CREDIT_CARDS).map((key) => key);\r\nconst accepted_card_brands_label = ACCEPTED_CARD_BRANDS.map((key) => CREDIT_CARDS[key].name).join(\", \");\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    name: { mustHave: helpers.withMessage(\"Please enter the name on card.\", required) },\r\n    cardNumber: {\r\n      mustHave: helpers.withMessage(\"Please enter the card number.\", required),\r\n      validCreditCardNumber: helpers.withMessage(\r\n        () => \"Please enter a valid credit card number\",\r\n        (value) => !helpers.req(value) || validateCardNumber(value)\r\n      ),\r\n      acceptedCreditCardType: helpers.withMessage(\r\n        () => `${cardBrand.value.validationType} is not accepted`,\r\n        (value) => !helpers.req(value) || ACCEPTED_CARD_BRANDS.includes(cardBrand.value.validationType)\r\n      )\r\n    },\r\n    expiration: {\r\n      mustHave: helpers.withMessage(\"Please enter the expiration date.\", required),\r\n      validExpirationDate: helpers.withMessage(\r\n        () => \"Please enter a valid expiration date MM/YYYY\",\r\n        (value) => {\r\n          const { month, year } = parseCardExpiry(value);\r\n          const paddedMonth = month.toString().padStart(2, 0);\r\n          return !helpers.req(value) || validateCardExpiry(paddedMonth, year);\r\n        }\r\n      )\r\n    },\r\n    cvv: {\r\n      mustHave: helpers.withMessage(\"Please enter the security code.\", required),\r\n      validCVV: helpers.withMessage(\r\n        () => \"Please enter a valid security code\",\r\n        (value) => !helpers.req(value) || validateCardCVC(value, cardBrand.value?.validationType)\r\n      )\r\n    },\r\n    billingAddress1: { required: helpers.withMessage(\"Please enter an address.\", required) },\r\n    billingCity: { required: helpers.withMessage(\"Please enter a city.\", required) },\r\n    billingState: { required: helpers.withMessage(() => `Please select a ${stateLabel.value.toLowerCase()}.`, required) },\r\n    billingZip: {\r\n      required: helpers.withMessage(() => `Please enter a ${postalCodeLabel.value.toLowerCase()}.`, required),\r\n      validPostalCode: helpers.withMessage(\r\n        () => `Please enter a valid ${postalCodeLabel.value.toLowerCase()}.`,\r\n        (value) => !helpers.req(value) || !postalCodeRegex.value || postalCodeRegex.value.test(value)\r\n      )\r\n    }\r\n  },\r\n  formData\r\n);\r\n\r\nconst setSameAsShipping = (value) => {\r\n  sameAsShipping.value = value;\r\n  formData.billingAddress1 = props.shippingAddress.line1;\r\n  formData.billingAddress2 = props.shippingAddress.line2;\r\n  formData.billingCity = props.shippingAddress.city;\r\n  formData.billingState = props.shippingAddress.state;\r\n  formData.billingZip = props.shippingAddress.postalCode;\r\n};\r\n\r\nasync function save() {\r\n  creditCardError.value = false;\r\n  if (await vuelidate.value.$validate()) {\r\n    const { month, year } = parseCardExpiry(formData.expiration);\r\n    let data = {\r\n      ...omit(formData, \"saveForLater\"),\r\n      isSingleUse: props.allowSingleUse && !formData.saveForLater,\r\n      cardType: cardBrand.value?.type?.mapName,\r\n      expiration: `${month.toString().padStart(2, 0)}/${year}`\r\n    };\r\n    createCreditCardMutation(data, { onSuccess: handleSaveSuccess, onError: handleSaveError });\r\n  }\r\n}\r\n\r\nfunction handleSaveSuccess(newCreditCard) {\r\n  modal.value.close();\r\n  notificationStore.notifySuccess(\"Card added.\");\r\n  emit(\"create\", newCreditCard);\r\n}\r\n\r\nfunction handleSaveError(error) {\r\n  const { data, status } = error.response;\r\n  if (status === 400 && Object.keys(ERROR_RESPONSE_MESSAGES).includes(data?.error_code?.toString())) {\r\n    creditCardError.value = ERROR_RESPONSE_MESSAGES[data?.error_code].error_msg;\r\n  } else {\r\n    notificationStore.notifyError(\"Sorry, something went wrong and we could not add this card. Please try again.\");\r\n  }\r\n}\r\n\r\nconst reset = () => {\r\n  Object.assign(formData, initialState);\r\n  vuelidate.value.$reset();\r\n  sameAsShipping.value = false;\r\n};\r\n\r\nconst onCardNumberKeyUp = (event, type) => {\r\n  const inputValue = event.target.value;\r\n  switch (type) {\r\n    case \"card_number\":\r\n      formData.cardNumber = formatCardNumber(inputValue);\r\n      break;\r\n    case \"card_expire\":\r\n      formData.expiration = formatCardExpiry(inputValue);\r\n      break;\r\n  }\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhModal ref=\"modal\" :data=\"{ heading: 'Add Card', subheading: `We accept ${accepted_card_brands_label}` }\" @close=\"reset\">\r\n    <template #activator=\"{ open }\">\r\n      <slot name=\"activator\" :open=\"open\"></slot>\r\n    </template>\r\n    <template #body>\r\n      <form id=\"creditCardForm\" @submit.prevent=\"save\">\r\n        <fieldset class=\"mb-f8\">\r\n          <legend class=\"mb-f4 text-f-xl-2xl\">Card Details</legend>\r\n          <div class=\"flex flex-col gap-f3\">\r\n            <FhInput v-model=\"formData.nickName\" label=\"Card Nickname\" />\r\n            <div class=\"flex flex-col gap-f3 border border-neutral-30 bg-neutral-20 p-f3\">\r\n              <div class=\"flex gap-3\">\r\n                <FhDigiCertSeal class=\"w-28 flex-none\" />\r\n                <div class=\"text-body-xs\">\r\n                  <p class=\"font-bold\">Safe Shopping Guarantee</p>\r\n                  <p>All information is encrypted and transmitted without risk using a Secure Socket Layer (SSL) protocol.</p>\r\n                </div>\r\n              </div>\r\n              <FhInput v-model=\"formData.name\" label=\"Name on Card\" required :vuelidate=\"vuelidate.name\" />\r\n              <FhInput\r\n                v-model=\"formData.cardNumber\"\r\n                class=\"card-number\"\r\n                label=\"Card Number\"\r\n                required\r\n                :vuelidate=\"vuelidate.cardNumber\"\r\n                data-lpignore=\"true\"\r\n                :style=\"{\r\n                  'background-image': `url(${cardBrand?.type?.icon})`\r\n                }\"\r\n                @keyup=\"onCardNumberKeyUp($event, 'card_number')\"\r\n              >\r\n              </FhInput>\r\n              <div class=\"flex flex-col gap-f3 md:flex-row\">\r\n                <FhInput\r\n                  v-model=\"formData.expiration\"\r\n                  label=\"Expiration\"\r\n                  required\r\n                  placeholder=\"MM / YYYY\"\r\n                  :vuelidate=\"vuelidate.expiration\"\r\n                  :wrapper-attrs=\"{ class: 'flex-1' }\"\r\n                  class=\"w-1/2 md:w-full\"\r\n                  @keyup=\"onCardNumberKeyUp($event, 'card_expire')\"\r\n                />\r\n                <FhInput\r\n                  v-model=\"formData.cvv\"\r\n                  label=\"Security Code\"\r\n                  required\r\n                  :vuelidate=\"vuelidate.cvv\"\r\n                  :wrapper-attrs=\"{ class: 'flex-1' }\"\r\n                  class=\"w-1/2 md:w-full\"\r\n                />\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </fieldset>\r\n        <fieldset>\r\n          <legend class=\"mb-f4 text-f-lg-2xl\">Billing Address</legend>\r\n          <div class=\"flex flex-col gap-f3\">\r\n            <FhCheckbox\r\n              v-if=\"props.allowSameAsShipping\"\r\n              v-model=\"sameAsShipping\"\r\n              label=\"Same as shipping address\"\r\n              size=\"lg\"\r\n              class=\"mb-f1\"\r\n              @update:model-value=\"setSameAsShipping\"\r\n            />\r\n            <FhSelect v-model=\"formData.billingCountry\" label=\"Country\" :options=\"countryOptions\" :disabled=\"sameAsShipping\" />\r\n            <FhInput v-model=\"formData.billingAddress1\" label=\"Address Line 1\" required :vuelidate=\"vuelidate.billingAddress1\" :disabled=\"sameAsShipping\" />\r\n            <FhInput v-model=\"formData.billingAddress2\" label=\"Address Line 2\" :disabled=\"sameAsShipping\" />\r\n            <FhInput v-model=\"formData.billingCity\" label=\"City\" required :vuelidate=\"vuelidate.billingCity\" :disabled=\"sameAsShipping\" />\r\n            <component\r\n              :is=\"hasStateOptions ? FhSelect : FhInput\"\r\n              v-model=\"formData.billingState\"\r\n              :options=\"stateOptions\"\r\n              :label=\"stateLabel\"\r\n              required\r\n              :vuelidate=\"vuelidate.billingState\"\r\n              :disabled=\"sameAsShipping\"\r\n            />\r\n            <FhInput v-model=\"formData.billingZip\" :label=\"postalCodeLabel\" required :vuelidate=\"vuelidate.billingZip\" :disabled=\"sameAsShipping\" />\r\n          </div>\r\n        </fieldset>\r\n        <FhCheckbox v-if=\"props.allowSingleUse\" v-model=\"formData.saveForLater\" label=\"Save this card to my account for future use\" size=\"lg\" class=\"my-f4\" />\r\n      </form>\r\n      <div v-if=\"creditCardError\" class=\"mt-3 flex items-center gap-2 py-2 text-brand-red\">\r\n        <div>\r\n          <fh-icon name=\"AlertCircle\" />\r\n        </div>\r\n        <div v-html=\"creditCardError\"></div>\r\n      </div>\r\n    </template>\r\n    <template #footer=\"{ close }\">\r\n      <FhButton type=\"submit\" form=\"creditCardForm\" color=\"primary\" :disabled=\"vuelidate.$invalid || isLoading\" :is-loading=\"isLoading\">Save</FhButton>\r\n      <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n\r\n<style scoped lang=\"pcss\">\r\n:deep(.card-number){\r\n  background-position: calc(100% - 10px) center;\r\n  background-repeat: no-repeat;\r\n  background-size: 42px 42px;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed, useSlots } from \"vue\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * Controls whether this option card behaves functionally as a checkbox or a radio button. There is no visual difference between these two.\r\n   */\r\n  type: {\r\n    type: String,\r\n    default: \"checkbox\",\r\n    validator: (val) => [\"checkbox\", \"radio\"].includes(val)\r\n  },\r\n  modelValue: {\r\n    type: undefined,\r\n    required: true\r\n  },\r\n  value: {\r\n    type: undefined,\r\n    default: null\r\n  },\r\n  label: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  disabled: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  layout: {\r\n    type: String,\r\n    default: \"row\",\r\n    validator: (val) => [\"row\", \"column\"].includes(val)\r\n  },\r\n  alignment: {\r\n    type: String,\r\n    default: \"center\",\r\n    validator: (val) => [\"center\", \"start\"].includes(val)\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst _value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\nconst isChecked = computed(() => {\r\n  if (props.type === \"radio\") return _value.value === props.value;\r\n  if (Array.isArray(_value.value)) return _value.value.includes(props.value);\r\n  return !!_value.value;\r\n});\r\n\r\nconst slots = useSlots();\r\n</script>\r\n\r\n<template>\r\n  <label\r\n    class=\"flex cursor-pointer border border-neutral-30 text-f-sm-lg transition\"\r\n    :class=\"{\r\n      'selected border-limestone bg-limestone': isChecked,\r\n      'cursor-default bg-neutral-20': props.disabled,\r\n      'flex-row gap-f5 p-f5': props.layout === 'row',\r\n      'flex-col gap-f3 px-f3 py-f6': props.layout === 'column',\r\n      'items-center': props.alignment === 'center',\r\n      'items-start': props.alignment === 'start'\r\n    }\"\r\n  >\r\n    <div class=\"optionCard__checkbox relative flex-none\">\r\n      <input\r\n        v-model=\"_value\"\r\n        :value=\"props.value\"\r\n        :type=\"props.type\"\r\n        class=\"absolute h-7 w-7 cursor-pointer opacity-0 md:h-8 md:w-8\"\r\n        :disabled=\"props.disabled\"\r\n      />\r\n      <div\r\n        class=\"flex h-7 w-7 items-center justify-center rounded-full border border-neutral-40 transition md:h-8 md:w-8\"\r\n        :class=\"{ 'border-neutral-70 bg-neutral-70': isChecked, 'opacity-50': props.disabled }\"\r\n        aria-hidden=\"true\"\r\n        focusable=\"false\"\r\n      >\r\n        <FhIcon name=\"Check\" class=\"h-2/3 w-2/3\" :class=\"{ 'text-transparent': !isChecked, 'text-white': isChecked }\" />\r\n      </div>\r\n    </div>\r\n    <div\r\n      class=\"flex-1\"\r\n      :class=\"{\r\n        'opacity-50': props.disabled,\r\n        'text-center': props.layout === 'column' && props.alignment === 'center',\r\n        'text-f-sm-lg': !slots.default,\r\n        'text-neutral-60': !slots.default && !isChecked\r\n      }\"\r\n    >\r\n      <!-- @slot The default slot can be used for a label or custom content; overwrites the `label` prop -->\r\n      <slot>{{ props.label }}</slot>\r\n    </div>\r\n  </label>\r\n</template>\r\n","export default function scrollToTopOf(elem, offset = 20) {\r\n  if (!elem) return;\r\n  window.scrollTo({\r\n    top: elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top - offset,\r\n    behavior: \"smooth\"\r\n  });\r\n}\r\n","<script setup>\r\nimport { ref, computed, watch, nextTick } from \"vue\";\r\nimport FhOptionCard from \"@/components/FhOptionCard.vue\";\r\nimport FhPaymentCard from \"@/components/Ecomm/FhPaymentCard/FhPaymentCard.vue\";\r\nimport FhPaginationNav from \"@/components/FhPaginationNav.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhCard from \"@/components/FhCard.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport { usePaginatedList } from \"@/composables\";\r\nimport { ERROR_RESPONSE_MESSAGES } from \"@/constants/payment\";\r\nimport { useDeleteCreditCardMutation } from \"@/api/creditCardApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\nimport scrollToTopOf from \"@/util/scrollToTopOf\";\r\n\r\nconst props = defineProps({\r\n  cards: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  selectedId: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  cardsPerPage: {\r\n    type: Number,\r\n    default: 12\r\n  },\r\n  isError: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:selectedId\"]);\r\n\r\nconst _selectedId = computed({\r\n  get: () => props.selectedId,\r\n  set: (val) => emit(\"update:selectedId\", val)\r\n});\r\n\r\nconst showDeleteModal = ref(false);\r\nconst cardToRemove = ref(null);\r\nconst isRemovingCreditCard = ref(false);\r\nconst cardsToShow = computed(() => props.cards);\r\nconst cardRef = ref(null);\r\nconst deleteCardError = ref(null);\r\n\r\nconst { isLoading, mutate: deleteCreditCardMutation } = useDeleteCreditCardMutation();\r\nconst notificationStore = useNotificationStore();\r\nconst isEmpty = computed(() => props.cards.length === 0);\r\n\r\nlet { page, totalPages, sublist: currentPage } = usePaginatedList(cardsToShow, props.cardsPerPage);\r\n\r\nwatch(cardsToShow, (newCards, oldCards) => {\r\n  if (newCards.length > oldCards.length) {\r\n    page.value = totalPages.value;\r\n    cardRef.value[cardRef.value.length - 1]?.paymentCardRef?.scrollIntoView({ behavior: \"smooth\" });\r\n  }\r\n});\r\n\r\nconst handleRemoveCC = (val) => {\r\n  const card = props.cards.find((card) => card.id === val);\r\n  if (card) {\r\n    showDeleteModal.value = true;\r\n    cardToRemove.value = card;\r\n  }\r\n};\r\n\r\nconst removeCreditCard = () => {\r\n  deleteCreditCardMutation(cardToRemove.value.id, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Card removed.\"),\r\n    onError: () => handleDeleteError,\r\n    onSettled: (data, error) => {\r\n      if (!error) {\r\n        showDeleteModal.value = false;\r\n        isRemovingCreditCard.value = false;\r\n      }\r\n    }\r\n  });\r\n};\r\n\r\nconst handleDeleteError = (error) => {\r\n  const { data, status } = error.response;\r\n  if (status === 400 && data?.error_code) {\r\n    deleteCardError.value = ERROR_RESPONSE_MESSAGES[data?.error_code]?.error_msg;\r\n  } else {\r\n    notificationStore.notifyError(\"Sorry, something went wrong and we could not remove that card.\");\r\n  }\r\n};\r\n\r\nconst reset = () => {\r\n  showDeleteModal.value = false;\r\n};\r\n\r\nconst listElem = ref(null);\r\n</script>\r\n\r\n<template>\r\n  <div ref=\"listElem\" class=\"grid gap-f3 md:grid-cols-2\">\r\n    <FhOptionCard v-for=\"card in currentPage\" :key=\"card.id\" v-model=\"_selectedId\" :value=\"card.id\" :disabled=\"card.isExpired\" type=\"radio\" alignment=\"start\">\r\n      <FhPaymentCard\r\n        :id=\"card.id\"\r\n        ref=\"cardRef\"\r\n        :card-type=\"card.cardType\"\r\n        :nick-name=\"card.nickName\"\r\n        :last-four=\"card.lastFour\"\r\n        :expiration=\"card.expiration\"\r\n        :is-expired=\"card.isExpired\"\r\n        :show-remove-link=\"false\"\r\n        @delete=\"handleRemoveCC\"\r\n      />\r\n    </FhOptionCard>\r\n  </div>\r\n  <div v-if=\"totalPages > 1\" class=\"mt-f8 flex items-center justify-center\">\r\n    <FhPaginationNav v-model:page=\"page\" :total-items=\"cards.length\" :per-page=\"props.cardsPerPage\" @page-change=\"nextTick(() => scrollToTopOf(listElem))\" />\r\n  </div>\r\n  <FhModal :data=\"{ heading: 'Confirm Card Removal' }\" :is-open=\"showDeleteModal\" @close=\"reset\">\r\n    <template #body>\r\n      <FhCard>\r\n        <FhPaymentCard\r\n          :id=\"cardToRemove.id\"\r\n          :card-type=\"cardToRemove.cardType\"\r\n          :nick-name=\"cardToRemove.nickName\"\r\n          :last-four=\"cardToRemove.lastFour\"\r\n          :expiration=\"cardToRemove.expiration\"\r\n          :show-remove-link=\"false\"\r\n        />\r\n      </FhCard>\r\n      <div v-if=\"deleteCardError\" class=\"mt-3 flex items-center gap-2 py-2 text-brand-red\">\r\n        <div>\r\n          <fh-icon name=\"AlertCircle\" />\r\n        </div>\r\n        <div v-html=\"deleteCardError\"></div>\r\n      </div>\r\n    </template>\r\n    <template #footer=\"{ close }\">\r\n      <FhButton color=\"primary\" :disabled=\"isLoading\" :is-loading=\"isLoading\" @click=\"removeCreditCard\">Remove</FhButton>\r\n      <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n  <div v-if=\"isEmpty && !props.isError\" class=\"text-body-lg mb-f2 text-neutral-50\">You have no saved cards.</div>\r\n  <div v-if=\"props.isError\" class=\"text-body-lg mb-f2 flex items-center gap-f1\">\r\n    <FhIcon name=\"AlertCircle\" class=\"flex-none\" />\r\n    Sorry, we are not able to load your saved cards at this time.\r\n  </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhPaymentCardList from \"@/components/Ecomm/FhPaymentCardList/FhPaymentCardList.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhCreditCardForm from \"@/components/Ecomm/FhCreditCardForm/FhCreditCardForm.vue\";\r\nimport { useCreditCardQuery } from \"../../../api/creditCardApi\";\r\nimport FhPaymentCardSelectList from \"@/components/Ecomm/FhPaymentCardSelectList/FhPaymentCardSelectList.vue\";\r\nimport FhLoader from \"@/components/FhLoader.vue\";\r\n\r\nconst props = defineProps({\r\n  mode: {\r\n    type: String,\r\n    default: \"list\",\r\n    validator: (val) => [\"list\", \"select\"].includes(val)\r\n  },\r\n  allowSameAsShipping: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  shippingAddress: {\r\n    type: Object,\r\n    default: () => {}\r\n  },\r\n  /**\r\n   * Applicable only when `mode` is `select`\r\n   */\r\n  selectedId: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  includeSingleUse: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:selectedId\", \"update:selectedCard\"]);\r\n\r\nconst isListMode = computed(() => props.mode === \"list\");\r\nconst isSelectMode = computed(() => props.mode === \"select\");\r\n\r\nconst { isLoading, isError, data: cards } = useCreditCardQuery({ includeSingleUse: props.includeSingleUse || isSelectMode.value });\r\n\r\nconst _selectedId = computed({\r\n  get: () => props.selectedId,\r\n  set: (val) => {\r\n    emit(\"update:selectedId\", val);\r\n    const selectedcard = cards.value.find((card) => card.id === val);\r\n    emit(\"update:selectedCard\", selectedcard);\r\n  }\r\n});\r\n\r\nfunction handleCardCreate(newCard) {\r\n  if (isSelectMode.value) {\r\n    _selectedId.value = newCard.id;\r\n  }\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div class=\"payment-method grid gap-y-f4\">\r\n    <div class=\"header md:content-end\">\r\n      <slot name=\"header\"></slot>\r\n    </div>\r\n    <div class=\"button md:justify-self-end\">\r\n      <FhCreditCardForm\r\n        :allow-single-use=\"isSelectMode\"\r\n        :allow-same-as-shipping=\"allowSameAsShipping\"\r\n        :shipping-address=\"shippingAddress\"\r\n        @create=\"handleCardCreate\"\r\n      >\r\n        <template #activator=\"{ open }\">\r\n          <FhButton class=\"w-full md:w-auto\" @click=\"open\">Add Card</FhButton>\r\n        </template>\r\n      </FhCreditCardForm>\r\n    </div>\r\n    <div class=\"content\">\r\n      <FhLoader v-if=\"isLoading\" class=\"h-10 w-10\" />\r\n      <FhPaymentCardList v-if=\"!isLoading && isListMode\" v-bind=\"{ cards, isError }\" />\r\n      <FhPaymentCardSelectList v-if=\"!isLoading && isSelectMode\" v-model:selected-id=\"_selectedId\" v-bind=\"{ cards, isError }\" />\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.payment-method {\r\n  grid-template-areas:\r\n    \"header header\"\r\n    \"content content\"\r\n    \"button button\";\r\n  &:deep(.header){\r\n    grid-area: header\r\n  }\r\n  &:deep(.button){\r\n    grid-area: button\r\n  }\r\n  &:deep(.content){\r\n    grid-area: content\r\n  }\r\n}\r\n@screen md{\r\n  .payment-method{\r\n    grid-template-areas:\r\n    \"header button\"\r\n    \"content content\";\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { reactive, computed, toRef, watch } from \"vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, maxLength } from \"@vuelidate/validators\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhCheckoutSelectionSummary from \"@/components/FhCheckoutSelectionSummary.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhPaymentMethods from \"@/components/Partials/FhPaymentMethods/FhPaymentMethods.vue\";\r\nimport { SHIPPING_OPTIONS } from \"@/constants/checkout\";\r\n\r\nconst props = defineProps({\r\n  hasTerms: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  paymentCard: {\r\n    type: Object,\r\n    default: null\r\n  },\r\n  poNumber: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  isSaving: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  shippingAddress: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  shippingOption: {\r\n    type: String,\r\n    default: \"\"\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"complete\"]);\r\n\r\nconst data = reactive({\r\n  paymentCardId: props.paymentCard?.id,\r\n  poNumber: props.poNumber,\r\n  isSingleUse: props.paymentCard?.isSingleUse\r\n});\r\n\r\nconst updateCardSelected = (card) => {\r\n  data.isSingleUse = card.isSingleUse;\r\n};\r\n\r\n// Update `data` values in response to corresponding props changing\r\nObject.keys(data).forEach((key) => watch(toRef(props, key), (val) => (data[key] = val)));\r\n\r\nconst isValid = computed(() => (props.hasTerms || data.paymentCardId) && !vuelidate.value.$invalid);\r\n\r\nconst specialCharsValidation = helpers.regex(/^[^\\t]*$/);\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    poNumber: {\r\n      maxLength: helpers.withMessage(\"Please enter no more than 25 characters.\", maxLength(25)),\r\n      validCharacters: helpers.withMessage(\"Custom PO numbers cannot contain tabs.\", specialCharsValidation)\r\n    }\r\n  },\r\n  data,\r\n  { $scope: false } // don't collect validation errors for child components (the payment card form, in this case) which is the Vuelidate default\r\n);\r\n\r\nfunction complete() {\r\n  if (props.hasTerms) {\r\n    emit(\"complete\", { poNumber: data.poNumber });\r\n  } else {\r\n    emit(\"complete\", { ...data });\r\n  }\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col gap-f8\">\r\n    <div v-if=\"props.hasTerms\">\r\n      <FhCheckoutSelectionSummary title=\"Payment Method\">\r\n        <template #default>Payment Terms <span class=\"italic\">(Payment Method on File)</span></template>\r\n        <template #actions>&nbsp;<!-- Intentionally left blank to remove the default action --></template>\r\n      </FhCheckoutSelectionSummary>\r\n    </div>\r\n    <FhPaymentMethods\r\n      v-else\r\n      v-model:selected-id=\"data.paymentCardId\"\r\n      :shipping-address=\"props.shippingAddress\"\r\n      :allow-same-as-shipping=\"props.shippingOption !== SHIPPING_OPTIONS.PICK_UP\"\r\n      mode=\"select\"\r\n      heading-row-alignment=\"center\"\r\n      @update:selected-card=\"updateCardSelected\"\r\n    >\r\n      <template #header>\r\n        <div class=\"mb-f0.5 text-f-base-xl\">Select your payment method</div>\r\n        <div class=\"text-neutral-50\">You won&rsquo;t be charged until your items ship.</div>\r\n      </template>\r\n    </FhPaymentMethods>\r\n    <div>\r\n      <div class=\"mb-f4 text-f-base-xl\">Custom PO <span class=\"text-neutral-50\">(Optional)</span></div>\r\n      <FhInput v-model=\"data.poNumber\" label=\"PO Number\" label-note=\"Optional\" :vuelidate=\"vuelidate.poNumber\" :wrapper-attrs=\"{ class: 'md:w-96' }\" />\r\n    </div>\r\n    <FhButton color=\"primary\" :disabled=\"!isValid || props.isSaving\" class=\"w-full\" @click=\"complete\">Review Order</FhButton>\r\n  </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { CART } from \"@/constants/routes\";\r\nimport FhAlert from \"./FhAlert.vue\";\r\nimport FhLink from \"./FhLink.vue\";\r\nimport FhCartItem from \"./FhCartItem.vue\";\r\n\r\nconst props = defineProps({\r\n  items: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  checkoutMessaging: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\nconst unavailableItems = computed(() => props.items.filter((item) => item.sku.isAvailable === false));\r\n</script>\r\n\r\n<template>\r\n  <!-- CUSTOM MESSAGE -->\r\n  <FhAlert v-if=\"props.checkoutMessaging\" icon=\"AlertCircle\" class=\"mb-8 md:mb-f6\">\r\n    <!-- eslint-disable vue/no-v-html -->\r\n    <div v-html=\"props.checkoutMessaging\"></div>\r\n  </FhAlert>\r\n  <FhAlert v-if=\"unavailableItems.length > 0\" icon=\"AlertCircle\" class=\"mb-8 md:mb-f6\">\r\n    <div class=\"mb-2\">The following items are no longer available:</div>\r\n    <ul class=\"mb-2 ml-[1em] list-outside list-disc\">\r\n      <li v-for=\"item in unavailableItems\" :key=\"item.sku.skuNumber\">\r\n        {{ item.sku.productName }} &bull; {{ item.sku.skuName }} &bull; {{ item.sku.skuNumber }}\r\n      </li>\r\n    </ul>\r\n    <div>Please remove them from your <FhLink :href=\"CART\">shopping cart</FhLink> before placing your order.</div>\r\n    <div>The information you've entered in checkout has been saved.</div>\r\n  </FhAlert>\r\n  <div class=\"mb-f2.5 text-f-base-xl\">Please note: Once you submit your order, we will begin processing in-stock product for shipment immediately.</div>\r\n  <div>\r\n    <FhCartItem v-for=\"item in props.items\" :key=\"item.sku.skuNumber\" v-bind=\"item\" view-only class=\"relative -mb-px\" />\r\n  </div>\r\n</template>\r\n","import axiosClient from \"./axiosClient\";\r\nimport { useQuery, useQueryClient, useMutation } from \"@tanstack/vue-query\";\r\n\r\nconst QUERY_KEY_BASE = \"shipping_addresses\";\r\n\r\nexport function useShippingAddressesQuery(params, options) {\r\n  return useQuery({\r\n    ...(options || {}),\r\n    queryKey: [QUERY_KEY_BASE, { includeSingleUse: !!params?.includeSingleUse }],\r\n    queryFn: () => axiosClient.get(\"/shipping_addresses\", { params }),\r\n    refetchOnWindowFocus: false\r\n  });\r\n}\r\n\r\nexport function useCreateShippingAddressMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (shippingAddress) => axiosClient.post(\"/shipping_addresses\", shippingAddress),\r\n    onSuccess: (newAddress, { isSingleUse }) => {\r\n      // Add the new address to the query cache(s)\r\n      const queryKeyFilter = [QUERY_KEY_BASE];\r\n      if (isSingleUse) {\r\n        queryKeyFilter.push({ includeSingleUse: true });\r\n      }\r\n      queryClient.setQueriesData({ queryKey: queryKeyFilter }, (existingAddresses) => {\r\n        return [...(existingAddresses || []), newAddress];\r\n      });\r\n    }\r\n  });\r\n}\r\n\r\nexport function useDeleteShippingAddressMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (id) => axiosClient.delete(`/shipping_addresses/${encodeURIComponent(id)}`),\r\n    onSuccess: (_data, deletedId) => {\r\n      // Remove the deleted address from the query cache(s)\r\n      queryClient.setQueriesData([QUERY_KEY_BASE], (existingAddresses) => {\r\n        let deletedAddressIndex = existingAddresses.findIndex((address) => address.id === deletedId);\r\n        if (deletedAddressIndex < 0) {\r\n          return existingAddresses;\r\n        } else {\r\n          return [...existingAddresses.slice(0, deletedAddressIndex), ...existingAddresses.slice(deletedAddressIndex + 1)];\r\n        }\r\n      });\r\n    }\r\n  });\r\n}\r\n\r\nexport function useVerifyShippingAddressMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (id) => axiosClient.put(`/shipping_addresses/${encodeURIComponent(id)}/verify`),\r\n    onSuccess: (updatedAddress) => {\r\n      // Update the address in the query cache(s)\r\n      queryClient.setQueriesData([QUERY_KEY_BASE], (existingAddresses) => {\r\n        return existingAddresses.map((address) => (address.id === updatedAddress.id ? updatedAddress : address));\r\n      });\r\n    }\r\n  });\r\n}\r\n","import { ref } from \"vue\";\r\nimport { defineStore } from \"pinia\";\r\n\r\n/**\r\n * The only purpose of this store is to keep track of which shipping addresses have\r\n * been manually confirmed to accept freight by the end-user, saving them from\r\n * needing to go through this process more than once per checkout sessions.\r\n */\r\nexport const useShippingAddressStore = defineStore(\"shippingAddress\", () => {\r\n  const addressIdsConfirmedForFreight = ref([]);\r\n\r\n  return {\r\n    addressIdsConfirmedForFreight\r\n  };\r\n});\r\n","/*! maska v2.1.11 | (c) Alexander Shabunevich | Released under the MIT license */\nvar S = Object.defineProperty;\nvar P = (n, t, s) => t in n ? S(n, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : n[t] = s;\nvar m = (n, t, s) => (P(n, typeof t != \"symbol\" ? t + \"\" : t, s), s);\nconst R = {\n  \"#\": { pattern: /[0-9]/ },\n  \"@\": { pattern: /[a-zA-Z]/ },\n  \"*\": { pattern: /[a-zA-Z0-9]/ }\n};\nclass O {\n  constructor(t = {}) {\n    m(this, \"opts\", {});\n    m(this, \"memo\", /* @__PURE__ */ new Map());\n    const s = { ...t };\n    if (s.tokens != null) {\n      s.tokens = s.tokensReplace ? { ...s.tokens } : { ...R, ...s.tokens };\n      for (const e of Object.values(s.tokens))\n        typeof e.pattern == \"string\" && (e.pattern = new RegExp(e.pattern));\n    } else\n      s.tokens = R;\n    Array.isArray(s.mask) && (s.mask.length > 1 ? s.mask = [...s.mask].sort((e, a) => e.length - a.length) : s.mask = s.mask[0] ?? \"\"), s.mask === \"\" && (s.mask = null), this.opts = s;\n  }\n  masked(t) {\n    return this.process(t, this.findMask(t));\n  }\n  unmasked(t) {\n    return this.process(t, this.findMask(t), !1);\n  }\n  isEager() {\n    return this.opts.eager === !0;\n  }\n  isReversed() {\n    return this.opts.reversed === !0;\n  }\n  completed(t) {\n    const s = this.findMask(t);\n    if (this.opts.mask == null || s == null)\n      return !1;\n    const e = this.process(t, s).length;\n    return typeof this.opts.mask == \"string\" ? e >= this.opts.mask.length : typeof this.opts.mask == \"function\" ? e >= s.length : this.opts.mask.filter((a) => e >= a.length).length === this.opts.mask.length;\n  }\n  findMask(t) {\n    const s = this.opts.mask;\n    if (s == null)\n      return null;\n    if (typeof s == \"string\")\n      return s;\n    if (typeof s == \"function\")\n      return s(t);\n    const e = this.process(t, s.slice(-1).pop() ?? \"\", !1);\n    return s.find((a) => this.process(t, a, !1).length >= e.length) ?? \"\";\n  }\n  escapeMask(t) {\n    const s = [], e = [];\n    return t.split(\"\").forEach((a, i) => {\n      a === \"!\" && t[i - 1] !== \"!\" ? e.push(i - e.length) : s.push(a);\n    }), { mask: s.join(\"\"), escaped: e };\n  }\n  process(t, s, e = !0) {\n    if (s == null)\n      return t;\n    const a = `value=${t},mask=${s},masked=${e ? 1 : 0}`;\n    if (this.memo.has(a))\n      return this.memo.get(a);\n    const { mask: i, escaped: c } = this.escapeMask(s), r = [], f = this.opts.tokens != null ? this.opts.tokens : {}, l = this.isReversed() ? -1 : 1, M = this.isReversed() ? \"unshift\" : \"push\", u = this.isReversed() ? 0 : i.length - 1, C = this.isReversed() ? () => o > -1 && p > -1 : () => o < i.length && p < t.length, V = (k) => !this.isReversed() && k <= u || this.isReversed() && k >= u;\n    let E, d = -1, o = this.isReversed() ? i.length - 1 : 0, p = this.isReversed() ? t.length - 1 : 0, y = !1;\n    for (; C(); ) {\n      const k = i.charAt(o), h = f[k], g = (h == null ? void 0 : h.transform) != null ? h.transform(t.charAt(p)) : t.charAt(p);\n      if (!c.includes(o) && h != null ? (g.match(h.pattern) != null ? (r[M](g), h.repeated ? (d === -1 ? d = o : o === u && o !== d && (o = d - l), u === d && (o -= l)) : h.multiple && (y = !0, o -= l), o += l) : h.multiple ? y && (o += l, p -= l, y = !1) : g === E ? E = void 0 : h.optional && (o += l, p -= l), p += l) : (e && !this.isEager() && r[M](k), g === k && !this.isEager() ? p += l : E = k, this.isEager() || (o += l)), this.isEager())\n        for (; V(o) && (f[i.charAt(o)] == null || c.includes(o)); )\n          e ? r[M](i.charAt(o)) : i.charAt(o) === t.charAt(p) && (p += l), o += l;\n    }\n    return this.memo.set(a, r.join(\"\")), this.memo.get(a);\n  }\n}\nconst T = (n) => JSON.parse(n.replaceAll(\"'\", '\"')), w = (n, t = {}) => {\n  const s = { ...t };\n  return n.dataset.maska != null && n.dataset.maska !== \"\" && (s.mask = W(n.dataset.maska)), n.dataset.maskaEager != null && (s.eager = v(n.dataset.maskaEager)), n.dataset.maskaReversed != null && (s.reversed = v(n.dataset.maskaReversed)), n.dataset.maskaTokensReplace != null && (s.tokensReplace = v(n.dataset.maskaTokensReplace)), n.dataset.maskaTokens != null && (s.tokens = b(n.dataset.maskaTokens)), s;\n}, v = (n) => n !== \"\" ? !!JSON.parse(n) : !0, W = (n) => n.startsWith(\"[\") && n.endsWith(\"]\") ? T(n) : n, b = (n) => {\n  if (n.startsWith(\"{\") && n.endsWith(\"}\"))\n    return T(n);\n  const t = {};\n  return n.split(\"|\").forEach((s) => {\n    const e = s.split(\":\");\n    t[e[0]] = {\n      pattern: new RegExp(e[1]),\n      optional: e[2] === \"optional\",\n      multiple: e[2] === \"multiple\",\n      repeated: e[2] === \"repeated\"\n    };\n  }), t;\n};\nclass L {\n  constructor(t, s = {}) {\n    m(this, \"items\", /* @__PURE__ */ new Map());\n    m(this, \"beforeinputEvent\", (t) => {\n      const s = t.target, e = this.items.get(s);\n      e.isEager() && \"inputType\" in t && t.inputType.startsWith(\"delete\") && e.unmasked(s.value).length <= 1 && this.setMaskedValue(s, \"\");\n    });\n    m(this, \"inputEvent\", (t) => {\n      if (t instanceof CustomEvent && t.type === \"input\" && t.detail != null && typeof t.detail == \"object\" && \"masked\" in t.detail)\n        return;\n      const s = t.target, e = this.items.get(s), a = s.value, i = s.selectionStart, c = s.selectionEnd;\n      let r = a;\n      if (e.isEager()) {\n        const f = e.masked(a), l = e.unmasked(a);\n        l === \"\" && \"data\" in t && t.data != null ? r = t.data : l !== e.unmasked(f) && (r = l);\n      }\n      if (this.setMaskedValue(s, r), \"inputType\" in t && (t.inputType.startsWith(\"delete\") || i != null && i < a.length))\n        try {\n          s.setSelectionRange(i, c);\n        } catch {\n        }\n    });\n    this.options = s, typeof t == \"string\" ? this.init(\n      Array.from(document.querySelectorAll(t)),\n      this.getMaskOpts(s)\n    ) : this.init(\n      \"length\" in t ? Array.from(t) : [t],\n      this.getMaskOpts(s)\n    );\n  }\n  destroy() {\n    for (const t of this.items.keys())\n      t.removeEventListener(\"input\", this.inputEvent), t.removeEventListener(\"beforeinput\", this.beforeinputEvent);\n    this.items.clear();\n  }\n  needUpdateOptions(t, s) {\n    const e = this.items.get(t), a = new O(w(t, this.getMaskOpts(s)));\n    return JSON.stringify(e.opts) !== JSON.stringify(a.opts);\n  }\n  needUpdateValue(t) {\n    const s = t.dataset.maskaValue;\n    return s == null && t.value !== \"\" || s != null && s !== t.value;\n  }\n  getMaskOpts(t) {\n    const { onMaska: s, preProcess: e, postProcess: a, ...i } = t;\n    return i;\n  }\n  init(t, s) {\n    for (const e of t) {\n      const a = new O(w(e, s));\n      this.items.set(e, a), e.value !== \"\" && this.setMaskedValue(e, e.value), e.addEventListener(\"input\", this.inputEvent), e.addEventListener(\"beforeinput\", this.beforeinputEvent);\n    }\n  }\n  setMaskedValue(t, s) {\n    const e = this.items.get(t);\n    this.options.preProcess != null && (s = this.options.preProcess(s));\n    const a = e.masked(s), i = e.unmasked(e.isEager() ? a : s), c = e.completed(s), r = { masked: a, unmasked: i, completed: c };\n    s = a, this.options.postProcess != null && (s = this.options.postProcess(s)), t.value = s, t.dataset.maskaValue = s, this.options.onMaska != null && (Array.isArray(this.options.onMaska) ? this.options.onMaska.forEach((f) => f(r)) : this.options.onMaska(r)), t.dispatchEvent(new CustomEvent(\"maska\", { detail: r })), t.dispatchEvent(new CustomEvent(\"input\", { detail: r }));\n  }\n}\nconst A = /* @__PURE__ */ new WeakMap(), J = (n) => {\n  setTimeout(() => {\n    var t;\n    ((t = A.get(n)) == null ? void 0 : t.needUpdateValue(n)) === !0 && n.dispatchEvent(new CustomEvent(\"input\"));\n  });\n}, j = (n, t) => {\n  const s = n instanceof HTMLInputElement ? n : n.querySelector(\"input\"), e = { ...t.arg };\n  if (s == null || (s == null ? void 0 : s.type) === \"file\")\n    return;\n  J(s);\n  const a = A.get(s);\n  if (a != null) {\n    if (!a.needUpdateOptions(s, e))\n      return;\n    a.destroy();\n  }\n  if (t.value != null) {\n    const i = t.value, c = (r) => {\n      i.masked = r.masked, i.unmasked = r.unmasked, i.completed = r.completed;\n    };\n    e.onMaska = e.onMaska == null ? c : Array.isArray(e.onMaska) ? [...e.onMaska, c] : [e.onMaska, c];\n  }\n  A.set(s, new L(s, e));\n};\nexport {\n  O as Mask,\n  L as MaskInput,\n  R as tokens,\n  j as vMaska\n};\n","<script setup>\r\nimport { ref, reactive, computed, inject } from \"vue\";\r\nimport { SUPPORT_PHONE_NUMBER } from \"@/constants/strings\";\r\nimport { useCreateShippingAddressMutation } from \"@/api/shippingAddressApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore.js\";\r\nimport COUNTRIES from \"@/constants/countries\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, required, maxLength } from \"@vuelidate/validators\";\r\nimport { omit } from \"lodash\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhInputPhone from \"@/components/FhInputPhone.vue\";\r\nimport FhSelect from \"@/components/FhSelect.vue\";\r\nimport FhCheckbox from \"@/components/FhCheckbox.vue\";\r\n\r\nconst props = defineProps({\r\n  allowSingleUse: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"create\"]);\r\n\r\nconst initialState = {\r\n  country: \"US\",\r\n  addressee: null,\r\n  line1: null,\r\n  line2: null,\r\n  city: null,\r\n  state: null,\r\n  postalCode: null,\r\n  phone: null,\r\n  saveForLater: false\r\n};\r\n\r\nconst formData = reactive({ ...initialState });\r\n\r\nconst subheading = inject(\"addressFormSubhead\");\r\n\r\nconst ALLOWED_SHIP_TO_COUNTRIES = [\"US\", \"CA\"];\r\nconst countryOptions = Object.keys(COUNTRIES)\r\n  .filter((key) => ALLOWED_SHIP_TO_COUNTRIES.includes(key))\r\n  .map((key) => ({ value: key, text: COUNTRIES[key].name }));\r\n\r\nconst country = computed(() => COUNTRIES[formData.country]);\r\nconst stateLabel = computed(() => country.value.stateName);\r\nconst stateOptions = computed(() => Object.keys(country.value.states).map((key) => ({ value: key, text: country.value.states[key] })));\r\nconst postalCodeLabel = computed(() => country.value.postalCodeName);\r\nconst postalCodeRegex = computed(() => country.value.postalCodeRegex);\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    addressee: {\r\n      required: helpers.withMessage(\"Please enter a business name.\", required),\r\n      maxLength: helpers.withMessage(\"Please enter no more than 30 characters.\", maxLength(30))\r\n    },\r\n    line1: {\r\n      required: helpers.withMessage(\"Please enter an address.\", required),\r\n      maxLength: helpers.withMessage(\"Please enter no more than 40 characters.\", maxLength(40))\r\n    },\r\n    line2: { maxLength: helpers.withMessage(\"Please enter no more than 40 characters.\", maxLength(40)) },\r\n\r\n    city: {\r\n      required: helpers.withMessage(\"Please enter a city.\", required),\r\n      maxLength: helpers.withMessage(\"Please enter no more than 20 characters.\", maxLength(20))\r\n    },\r\n    state: { required: helpers.withMessage(() => `Please select a ${stateLabel.value.toLowerCase()}.`, required) },\r\n    postalCode: {\r\n      required: helpers.withMessage(() => `Please enter a ${postalCodeLabel.value.toLowerCase()}.`, required),\r\n      maxLength: helpers.withMessage(\"Please enter no more than 10 characters.\", maxLength(10)),\r\n      validPostalCode: helpers.withMessage(\r\n        () => `Please enter a valid ${postalCodeLabel.value.toLowerCase()}.`,\r\n        (value) => !helpers.req(value) || postalCodeRegex.value.test(value)\r\n      )\r\n    },\r\n    phone: {\r\n      required: helpers.withMessage(\"Please enter a phone number.\", required),\r\n      validPhone: helpers.withMessage(\"Please enter a valid phone number.\", helpers.regex(/^\\([0-9]{3}\\) [0-9]{3}-[0-9]{4}$/))\r\n    }\r\n  },\r\n  formData\r\n);\r\n\r\nconst modal = ref(null);\r\n\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst createShippingAddressMutation = useCreateShippingAddressMutation();\r\n\r\nconst isAdding = computed(() => createShippingAddressMutation.isLoading.value);\r\n\r\nasync function save() {\r\n  if (await vuelidate.value.$validate()) {\r\n    let data = { ...omit(formData, \"saveForLater\"), isSingleUse: props.allowSingleUse && !formData.saveForLater };\r\n    createShippingAddressMutation.mutate(data, { onSuccess: handleSaveSuccess, onError: handleSaveError });\r\n  }\r\n}\r\n\r\nfunction handleSaveSuccess(newAddress) {\r\n  modal.value.close();\r\n  notificationStore.notifySuccess(\"Address added.\");\r\n  emit(\"create\", newAddress);\r\n}\r\n\r\nfunction handleSaveError() {\r\n  notificationStore.notifyError(\"Sorry, something went wrong and we could not add this address. Please try again.\");\r\n}\r\n\r\nfunction reset() {\r\n  Object.assign(formData, initialState);\r\n  vuelidate.value.$reset();\r\n}\r\n</script>\r\n\r\n<template>\r\n  <FhModal\r\n    ref=\"modal\"\r\n    :data=\"{\r\n      heading: 'Add Address',\r\n      subheading\r\n    }\"\r\n    @close=\"reset\"\r\n  >\r\n    <template #activator=\"{ open }\">\r\n      <slot name=\"activator\" :open=\"open\"></slot>\r\n    </template>\r\n    <template #body>\r\n      <form id=\"addressForm\" class=\"flex flex-col gap-f3\" @submit.prevent=\"save\">\r\n        <FhSelect v-model=\"formData.country\" label=\"Country\" :options=\"countryOptions\">\r\n          <template #note>\r\n            <span>\r\n              For addresses outside US and Canada, please call us at\r\n              <span class=\"whitespace-nowrap\">{{ SUPPORT_PHONE_NUMBER }}.</span>\r\n            </span>\r\n          </template>\r\n        </FhSelect>\r\n        <FhInput v-model=\"formData.addressee\" label=\"Your Company Name\" required :vuelidate=\"vuelidate.addressee\" />\r\n        <FhInput\r\n          v-model=\"formData.line1\"\r\n          label=\"Address Line 1\"\r\n          required\r\n          :vuelidate=\"vuelidate.line1\"\r\n          note=\"If using a third-party receiving warehouse, please include its name here.\"\r\n        />\r\n        <FhInput v-model=\"formData.line2\" label=\"Address Line 2\" :vuelidate=\"vuelidate.line2\" />\r\n        <FhInput v-model=\"formData.city\" label=\"City\" required :vuelidate=\"vuelidate.city\" />\r\n        <FhSelect v-model=\"formData.state\" :options=\"stateOptions\" :label=\"stateLabel\" required :vuelidate=\"vuelidate.state\" />\r\n        <FhInput v-model=\"formData.postalCode\" :label=\"postalCodeLabel\" required :vuelidate=\"vuelidate.postalCode\" />\r\n        <FhInputPhone v-model=\"formData.phone\" label=\"Phone Number\" required :vuelidate=\"vuelidate.phone\" />\r\n        <FhCheckbox\r\n          v-if=\"props.allowSingleUse\"\r\n          v-model=\"formData.saveForLater\"\r\n          label=\"Save this address to my account for future use.\"\r\n          size=\"lg\"\r\n          class=\"my-f4\"\r\n        />\r\n      </form>\r\n    </template>\r\n    <template #footer=\"{ close }\">\r\n      <FhButton type=\"submit\" form=\"addressForm\" color=\"primary\" :disabled=\"isAdding\">Save</FhButton>\r\n      <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n\r\n<style scoped></style>\r\n","<script setup>\r\nimport { ref, computed, nextTick } from \"vue\";\r\nimport { orderBy } from \"lodash\";\r\nimport { usePaginatedList } from \"../composables\";\r\nimport scrollToTopOf from \"@/util/scrollToTopOf\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhLoader from \"@/components/FhLoader.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhOptionCard from \"@/components/FhOptionCard.vue\";\r\nimport FhPaginationNav from \"@/components/FhPaginationNav.vue\";\r\nimport FhShippingAddress from \"@/components/FhShippingAddress.vue\";\r\nimport FhShippingAddressFormModal from \"@/components/FhShippingAddressFormModal.vue\";\r\nimport FhTooltip from \"@/components/FhTooltip.vue\";\r\n\r\nconst props = defineProps({\r\n  mode: {\r\n    type: String,\r\n    required: true,\r\n    validator: (val) => [\"manage\", \"select\"].includes(val)\r\n  },\r\n  shippingAddresses: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  /**\r\n   * Relevant only if `mode` is `select`. The id of the selected address.\r\n   */\r\n  selectedId: {\r\n    type: Number,\r\n    default: null\r\n  },\r\n  /**\r\n   * Relevant only if `mode` is `select`. Indicates that only addresses that have been verified for freight should be allowed to be selected.\r\n   */\r\n  requireFreight: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n\r\n  /**\r\n   * Indicates that is Residential Shipping Eligible.\r\n   */\r\n  isResidentialShippingEligible: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * Indicates the shipping addresses are being loaded.\r\n   */\r\n  isLoading: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * Indicates whether an error was encountered while loading the shipping addresses.\r\n   */\r\n  isError: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * List of address IDs that are actively being deleted. Realistaically, there will only ever be\r\n   * one at a time, but this structure allows for the possibility of multiple concurent deletes.\r\n   */\r\n  isDeletingAddressIds: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  /**\r\n   * Controls the vertical alignment of the header content and \"Add Address\" button, which appear in a single row in the tablet and desktop layouts.\r\n   */\r\n  headingRowAlignment: {\r\n    type: String,\r\n    default: \"start\",\r\n    validator: (val) => [\"start\", \"center\", \"end\"].includes(val)\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"create\", \"delete\", \"update:selectedId\"]);\r\n\r\nconst shippingAddressesOrdered = computed(() => orderBy(props.shippingAddresses, (e) => new Number(e.id), [\"desc\"]));\r\n\r\nconst PER_PAGE = 12;\r\nlet { page, totalPages, sublist: shippingAddressesPage } = usePaginatedList(shippingAddressesOrdered, PER_PAGE);\r\n\r\nconst rootElem = ref(null);\r\n\r\nconst isManageMode = computed(() => props.mode === \"manage\");\r\nconst isSelectMode = computed(() => props.mode === \"select\");\r\n\r\nconst _selectedId = computed({\r\n  get: () => {\r\n    try {\r\n      const shippingAddresses = shippingAddressesOrdered.value;\r\n\r\n      const findFirstValidAddress = (condition) => shippingAddresses?.find(condition)?.id || null;\r\n\r\n      if (!props.selectedId) {\r\n        const firstAvailableId = findFirstValidAddress((address) => address.isValidatedForFreight || props.isResidentialShippingEligible);\r\n        if (firstAvailableId) {\r\n          emit(\"update:selectedId\", firstAvailableId);\r\n          return firstAvailableId;\r\n        }\r\n      }\r\n\r\n      const selectedAddress = shippingAddresses?.find(({ id }) => id === props.selectedId);\r\n\r\n      if (selectedAddress?.isValidatedForFreight === false) {\r\n        const fallbackId = findFirstValidAddress((address) => props.requireFreight && address.isValidatedForFreight && !props.isResidentialShippingEligible);\r\n        if (fallbackId) {\r\n          emit(\"update:selectedId\", fallbackId);\r\n          return fallbackId;\r\n        }\r\n      }\r\n\r\n      return props.selectedId;\r\n    } catch (error) {\r\n      console.error(error);\r\n      return null;\r\n    }\r\n  },\r\n  set: (val) => emit(\"update:selectedId\", val)\r\n});\r\n\r\nconst isDataLoaded = computed(() => !props.isLoading && !props.isError);\r\nconst isEmpty = computed(() => isDataLoaded.value && props.shippingAddresses.length === 0);\r\n\r\nfunction handleAddressCreate(newAddress) {\r\n  if (isSelectMode.value) {\r\n    _selectedId.value = newAddress.id;\r\n  }\r\n  /*\r\n   TODO: For now we put the user on the first page since the new address is surfaced to the top\r\n   probably in the future we can query the id and find its position and go to that page \r\n  */\r\n  nextTick(() => {\r\n    if (page.value !== 1) {\r\n      page.value = 1;\r\n    }\r\n    scrollToTopOf(rootElem.value);\r\n  });\r\n\r\n  emit(\"create\", newAddress);\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div\r\n    ref=\"rootElem\"\r\n    class=\"flex flex-col gap-f4 md:flex-row md:flex-wrap md:items-start md:justify-between\"\r\n    :class=\"{\r\n      'md:items-start': props.headingRowAlignment === 'start',\r\n      'md:items-center': props.headingRowAlignment === 'center',\r\n      'md:items-end': props.headingRowAlignment === 'end'\r\n    }\"\r\n  >\r\n    <div class=\"md:-order-2\">\r\n      <slot name=\"heading\">\r\n        <FhHeading class=\"mb-0\">Saved Addresses</FhHeading>\r\n      </slot>\r\n    </div>\r\n    <div v-if=\"props.isLoading\" class=\"w-full\"><FhLoader class=\"h-10 w-10\" /></div>\r\n    <!-- SHIPPING ADDRESS LIST -->\r\n    <div v-if=\"!props.isLoading\" class=\"md:w-full\">\r\n      <div class=\"grid gap-f3 md:grid-cols-2\">\r\n        <!-- MANAGE MODE ADDRESS CARD-->\r\n        <template v-if=\"isManageMode\">\r\n          <div v-for=\"address in shippingAddressesPage\" :key=\"address.id\" class=\"flex flex-col items-start gap-f4 border border-neutral-30 py-f4 px-f5\">\r\n            <FhShippingAddress v-bind=\"address\" class=\"flex-1\" />\r\n            <FhModal :data=\"{ heading: 'Confirm Address Removal' }\">\r\n              <template #activator=\"{ open }\">\r\n                <FhButton variant=\"link\" @click=\"open\">Remove</FhButton>\r\n              </template>\r\n              <template #body>\r\n                <div class=\"border border-neutral-30 py-f4 px-f5\">\r\n                  <FhShippingAddress v-bind=\"address\"></FhShippingAddress>\r\n                </div>\r\n              </template>\r\n              <template #footer=\"{ close }\">\r\n                <FhButton color=\"primary\" :disabled=\"props.isDeletingAddressIds.includes(address.id)\" @click=\"emit('delete', address.id)\">Remove</FhButton>\r\n                <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n              </template>\r\n            </FhModal>\r\n          </div>\r\n        </template>\r\n        <!-- SELECT MODE ADDRESS CARD -->\r\n        <template v-if=\"isSelectMode\">\r\n          <div v-for=\"address in shippingAddressesPage\" :key=\"address.id\" class=\"relative\">\r\n            <FhOptionCard\r\n              ref=\"card\"\r\n              v-model=\"_selectedId\"\r\n              :value=\"address.id\"\r\n              :disabled=\"props.requireFreight && address.isValidatedForFreight === false && isResidentialShippingEligible === false\"\r\n              type=\"radio\"\r\n              alignment=\"start\"\r\n              class=\"addressOptionCard h-full w-full\"\r\n            >\r\n              <FhShippingAddress v-bind=\"address\" />\r\n            </FhOptionCard>\r\n            <FhTooltip\r\n              v-if=\"props.requireFreight && address.isValidatedForFreight === false && isResidentialShippingEligible === false\"\r\n              class=\"absolute top-3 right-3 text-neutral-60\"\r\n            >\r\n              Four Hands carriers only deliver to commercial addresses that can accommodate a 53' freight truck. This address has been flagged as ineligible.\r\n            </FhTooltip>\r\n          </div>\r\n        </template>\r\n      </div>\r\n      <!-- EMPTY MESSAGE -->\r\n      <Transition enter-active-class=\"ease-out duration-300 transition\" enter-from-class=\"opacity-0\" enter-to-class=\"opacity-100\">\r\n        <div v-if=\"isEmpty\" class=\"text-body-lg mb-f2 text-neutral-50\">You have no saved addresses.</div>\r\n      </Transition>\r\n      <!-- ERROR MESSAGE -->\r\n      <div v-if=\"props.isError\" class=\"text-body-lg mb-f2 flex items-center gap-f1\">\r\n        <FhIcon name=\"AlertCircle\" class=\"flex-none\" />\r\n        Sorry, we are not able to load your saved addresses at this time.\r\n      </div>\r\n    </div>\r\n    <!-- ADD ADDRESS BUTTON/MODAL -->\r\n    <FhShippingAddressFormModal :allow-single-use=\"isSelectMode\" @create=\"handleAddressCreate\">\r\n      <template #activator=\"{ open }\">\r\n        <FhButton class=\"md:-order-1\" @click=\"open\">Add Address</FhButton>\r\n      </template>\r\n    </FhShippingAddressFormModal>\r\n    <!-- PAGINATION -->\r\n    <div v-if=\"totalPages > 1\" class=\"mt-f4 md:w-full\">\r\n      <FhPaginationNav\r\n        v-model:page=\"page\"\r\n        :total-items=\"shippingAddressesOrdered.length\"\r\n        :per-page=\"PER_PAGE\"\r\n        @page-change=\"nextTick(() => scrollToTopOf(rootElem))\"\r\n      />\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style scoped>\r\n:deep(.addressOptionCard .optionCard__checkbox) {\r\n  @apply top-2;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref } from \"vue\";\r\nimport { useShippingAddressesQuery, useDeleteShippingAddressMutation } from \"../api/shippingAddressApi\";\r\nimport { useNotificationStore } from \"../stores/NotificationStore.js\";\r\nimport FhShippingAddressListPresenter from \"./FhShippingAddressListPresenter.vue\";\r\n\r\nconst props = defineProps({\r\n  mode: {\r\n    type: String,\r\n    required: true,\r\n    validator: (val) => [\"manage\", \"select\"].includes(val)\r\n  },\r\n  /**\r\n   * Relevant only if `mode` is `select`. The id of the selected address.\r\n   */\r\n  selectedId: {\r\n    type: Number,\r\n    default: null\r\n  },\r\n  /**\r\n   * Relevant only if `mode` is `select`. Indicates that only addresses that have been verified for freight should be allowed to be selected.\r\n   */\r\n  requireFreight: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * Controls the vertical alignment of the header content and \"Add Address\" button, which appear in a single row in the tablet and desktop layouts.\r\n   */\r\n  headingRowAlignment: {\r\n    type: String,\r\n    default: \"start\",\r\n    validator: (val) => [\"start\", \"center\", \"end\"].includes(val)\r\n  },\r\n  isResidentialShippingEligible: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"create\", \"update:selectedId\"]);\r\n\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst { isLoading, isError, data: shippingAddresses } = useShippingAddressesQuery({ includeSingleUse: props.mode === \"select\" });\r\n\r\nconst deleteShippingAddressMutation = useDeleteShippingAddressMutation();\r\n\r\nconst isDeletingAddressIds = ref([]);\r\n\r\nfunction handleCreate(newAddress) {\r\n  emit(\"create\", newAddress);\r\n}\r\n\r\nfunction handleDelete(id) {\r\n  isDeletingAddressIds.value.push(id);\r\n  deleteShippingAddressMutation.mutate(id, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Shipping address removed.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not remove that shipping address.\"),\r\n    onSettled: () => isDeletingAddressIds.value.splice(isDeletingAddressIds.value.indexOf(id), 1)\r\n  });\r\n}\r\n</script>\r\n\r\n<template>\r\n  <FhShippingAddressListPresenter\r\n    v-bind=\"{ ...props, shippingAddresses, isLoading, isError, isDeletingAddressIds }\"\r\n    @create=\"handleCreate\"\r\n    @delete=\"handleDelete\"\r\n    @update:selected-id=\"(val) => emit('update:selectedId', val)\"\r\n  >\r\n    <template v-for=\"(_, slot) of $slots\" #[slot]=\"scope\">\r\n      <slot :name=\"slot\" v-bind=\"scope\"></slot>\r\n    </template>\r\n  </FhShippingAddressListPresenter>\r\n</template>\r\n","<script setup>\r\nimport { ref, reactive, computed, toRef, watch, nextTick, provide, onBeforeMount } from \"vue\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport { useShippingAddressesQuery, useVerifyShippingAddressMutation } from \"@/api/shippingAddressApi\";\r\nimport { SHIPPING_OPTIONS, SHIPPING_OPTIONS_DEFINITION } from \"@/constants/checkout\";\r\nimport { useShippingAddressStore } from \"@/stores/ShippingAddressStore\";\r\nimport scrollToTopOf from \"@/util/scrollToTopOf\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhCard from \"@/components/FhCard.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhTooltip from \"@/components/FhTooltip.vue\";\r\nimport FhOptionCard from \"@/components/FhOptionCard.vue\";\r\nimport FhShippingAddress from \"@/components/FhShippingAddress.vue\";\r\nimport FhShippingAddressList from \"@/components/FhShippingAddressList.vue\";\r\n\r\nconst props = defineProps({\r\n  shippingOption: {\r\n    type: String,\r\n    default: null,\r\n    validator: (val) => Object.values(SHIPPING_OPTIONS).includes(val)\r\n  },\r\n  shippingAddressId: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  isSaving: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  carriersTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  thirdPartyTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pickUpTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  isResidentialShippingEligible: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"complete\"]);\r\nconst shippingAddressListRef = ref(null);\r\n\r\nconst data = reactive({\r\n  shippingOption: props.shippingOption,\r\n  shippingAddressId: props.shippingAddressId,\r\n  isResidentialShippingEligible: props.isResidentialShippingEligible\r\n});\r\n\r\n// Update `data` values in response to corresponding props changing\r\nObject.keys(data).forEach((key) => watch(toRef(props, key), (val) => (data[key] = val)));\r\n\r\n// Clear selected shipping address when:\r\n// 1. The shipping option is FH Carriers and the selected shipping address cannot accept freight\r\n// 2. The shipping option is Pick-Up (because shipping address is not relevant)\r\nwatch(\r\n  () => data.shippingOption,\r\n  (val) => {\r\n    if ((val === SHIPPING_OPTIONS.FH_CARRIERS && selectedAddress.value?.isValidatedForFreight === false) || val === SHIPPING_OPTIONS.PICK_UP) {\r\n      data.shippingAddressId = null;\r\n    }\r\n\r\n    nextTick(() => scrollToTopOf(shippingAddressListRef.value));\r\n  }\r\n);\r\n\r\n// This will provide a subheading to the FhShippingAddressFormModal\r\nconst shippingAddressFormSubHeading = computed(() =>\r\n  data.shippingOption === SHIPPING_OPTIONS.FH_CARRIERS\r\n    ? `Four Hands carriers require a commercial address that can accommodate a 53' freight truck. Residential shipping is now available for wallpaper-only orders.`\r\n    : null\r\n);\r\nprovide(\"addressFormSubhead\", shippingAddressFormSubHeading);\r\n\r\nconst isShippingAddressSelectionRequired = computed(() => [SHIPPING_OPTIONS.FH_CARRIERS, SHIPPING_OPTIONS.THIRD_PARTY].includes(data.shippingOption));\r\n\r\nconst isValid = computed(() => data.shippingOption && (!isShippingAddressSelectionRequired.value || data.shippingAddressId));\r\n\r\nconst { data: shippingAddresses } = useShippingAddressesQuery({ includeSingleUse: true });\r\nconst selectedAddress = computed(() => shippingAddresses.value?.find((address) => address.id === data.shippingAddressId));\r\n\r\nconst { isLoading: isVerifying, mutate: verifyShippingAddress } = useVerifyShippingAddressMutation();\r\n\r\nconst { addressIdsConfirmedForFreight } = useShippingAddressStore();\r\n\r\nconst isVerifyingNewAddress = ref(false);\r\nconst showAddressVerificationModal = ref(false);\r\nconst showAddressIneligibleModal = ref(false);\r\n\r\nfunction handleAddressCreate(newAddress) {\r\n  if (data.shippingOption === SHIPPING_OPTIONS.FH_CARRIERS) {\r\n    if (newAddress.isValidatedForFreight === false) {\r\n      isVerifyingNewAddress.value = true;\r\n      showAddressIneligibleModal.value = true;\r\n    } else if (newAddress.isValidatedForFreight === null) {\r\n      isVerifyingNewAddress.value = true;\r\n      showAddressVerificationModal.value = true;\r\n    }\r\n  }\r\n}\r\n\r\nconst isAddressVerificationRequired = computed(\r\n  () =>\r\n    data.shippingOption === SHIPPING_OPTIONS.FH_CARRIERS &&\r\n    selectedAddress.value?.isValidatedForFreight === null &&\r\n    !addressIdsConfirmedForFreight.includes(data.shippingAddressId)\r\n);\r\n\r\nfunction tryComplete() {\r\n  if (isAddressVerificationRequired.value && props.isResidentialShippingEligible === false) {\r\n    verifyShippingAddress(data.shippingAddressId, {\r\n      onSuccess: handleAddressVerificationSuccess,\r\n      onError: handleAddressVerificationError\r\n    });\r\n  } else {\r\n    complete();\r\n  }\r\n}\r\n\r\nfunction handleAddressVerificationSuccess(updatedAddress) {\r\n  if (updatedAddress.isValidatedForFreight) {\r\n    emit(\"complete\", { ...data });\r\n  } else if (updatedAddress.isValidatedForFreight === false) {\r\n    isVerifyingNewAddress.value = false;\r\n    showAddressIneligibleModal.value = true;\r\n  } else {\r\n    isVerifyingNewAddress.value = false;\r\n    showAddressVerificationModal.value = true;\r\n  }\r\n}\r\n\r\nfunction handleAddressVerificationError() {\r\n  isVerifyingNewAddress.value = false;\r\n  showAddressVerificationModal.value = true;\r\n}\r\n\r\nfunction complete() {\r\n  emit(\"complete\", { ...data });\r\n}\r\n\r\nconst shouldKeepSelectedAddress = ref(false);\r\n\r\nfunction clearSelectedAddressIfNeeded() {\r\n  if (shouldKeepSelectedAddress.value) {\r\n    shouldKeepSelectedAddress.value = false;\r\n  } else {\r\n    data.shippingAddressId = null;\r\n  }\r\n}\r\n\r\nconst { isSm } = useViewportSizes();\r\nonBeforeMount(() => {\r\n  if ((data.shippingOption === null && data.isResidentialShippingEligible) || data.isResidentialShippingEligible) {\r\n    data.shippingOption = SHIPPING_OPTIONS.FH_CARRIERS;\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col gap-f8\">\r\n    <fieldset>\r\n      <legend class=\"mb-f4 text-f-base-xl\">How would you like to receive your order?</legend>\r\n      <div class=\"flex flex-col gap-f3 md:flex-row\">\r\n        <div class=\"relative flex-1\">\r\n          <FhOptionCard\r\n            v-model=\"data.shippingOption\"\r\n            type=\"radio\"\r\n            :layout=\"isSm ? 'row' : 'column'\"\r\n            :value=\"SHIPPING_OPTIONS.FH_CARRIERS\"\r\n            :label=\"SHIPPING_OPTIONS_DEFINITION[SHIPPING_OPTIONS.FH_CARRIERS].displayName\"\r\n            class=\"h-full w-full\"\r\n          />\r\n          <FhTooltip class=\"absolute top-3 right-3 text-neutral-60\">\r\n            {{ carriersTooltip }}\r\n          </FhTooltip>\r\n        </div>\r\n        <div v-if=\"!isResidentialShippingEligible\" class=\"relative flex-1\">\r\n          <FhOptionCard\r\n            v-model=\"data.shippingOption\"\r\n            type=\"radio\"\r\n            :layout=\"isSm ? 'row' : 'column'\"\r\n            :value=\"SHIPPING_OPTIONS.THIRD_PARTY\"\r\n            :label=\"SHIPPING_OPTIONS_DEFINITION[SHIPPING_OPTIONS.THIRD_PARTY].displayName\"\r\n            class=\"h-full w-full\"\r\n          />\r\n          <FhTooltip class=\"absolute top-3 right-3 text-neutral-60\">\r\n            {{ thirdPartyTooltip }}\r\n          </FhTooltip>\r\n        </div>\r\n        <div v-if=\"!isResidentialShippingEligible\" class=\"relative flex-1\">\r\n          <FhOptionCard\r\n            v-model=\"data.shippingOption\"\r\n            type=\"radio\"\r\n            :layout=\"isSm ? 'row' : 'column'\"\r\n            :value=\"SHIPPING_OPTIONS.PICK_UP\"\r\n            :label=\"SHIPPING_OPTIONS_DEFINITION[SHIPPING_OPTIONS.PICK_UP].displayName\"\r\n            class=\"h-full w-full\"\r\n          />\r\n          <FhTooltip class=\"absolute top-3 right-3 text-neutral-60\">\r\n            {{ pickUpTooltip }}\r\n          </FhTooltip>\r\n        </div>\r\n      </div>\r\n    </fieldset>\r\n    <FhShippingAddressList\r\n      v-show=\"isShippingAddressSelectionRequired\"\r\n      v-model:selected-id=\"data.shippingAddressId\"\r\n      :is-residential-shipping-eligible=\"isResidentialShippingEligible\"\r\n      mode=\"select\"\r\n      :require-freight=\"data.shippingOption === SHIPPING_OPTIONS.FH_CARRIERS\"\r\n      heading-row-alignment=\"end\"\r\n      @create=\"handleAddressCreate\"\r\n    >\r\n      <template #heading>\r\n        <div ref=\"shippingAddressListRef\" class=\"flex flex-col gap-f0.5\">\r\n          <div class=\"text-f-base-xl\">Select or add the delivery address</div>\r\n          <div v-if=\"data.shippingOption === SHIPPING_OPTIONS.FH_CARRIERS && isResidentialShippingEligible === false\" class=\"text-neutral-50 md:max-w-[30rem]\">\r\n            Four Hands carriers require a commercial address that can accommodate a\r\n            <span class=\"font-bold text-neutral-70\">53' freight truck</span>, but residential shipping is now available for wallpaper-only orders. Ineligible\r\n            addresses will be greyed out below.\r\n          </div>\r\n          <div v-else-if=\"isResidentialShippingEligible === true\" class=\"text-neutral-50 md:max-w-[30rem]\">\r\n            Four Hands carriers require a commercial address that can accommodate a 53' freight truck, but\r\n            <span class=\"font-bold text-neutral-70\">residential shipping is now available for wallpaper-only orders.</span>\r\n          </div>\r\n        </div>\r\n      </template>\r\n    </FhShippingAddressList>\r\n    <FhButton v-if=\"data.shippingOption\" color=\"primary\" :disabled=\"!isValid || props.isSaving || isVerifying\" class=\"self-end\" @click=\"tryComplete\">\r\n      Continue\r\n    </FhButton>\r\n    <FhModal\r\n      v-if=\"isResidentialShippingEligible === false\"\r\n      v-model:is-open=\"showAddressVerificationModal\"\r\n      :data=\"{ heading: 'Verify Address for Freight' }\"\r\n      @after-leave=\"clearSelectedAddressIfNeeded\"\r\n    >\r\n      <template #default>\r\n        <p class=\"mb-f5\">\r\n          Four Hands carriers can only deliver to commercial addresses that can accommodate a 53' freight truck. To proceed, please confirm this address can\r\n          accept freight deliveries.\r\n        </p>\r\n        <FhCard>\r\n          <FhShippingAddress v-if=\"selectedAddress\" v-bind=\"selectedAddress\" />\r\n        </FhCard>\r\n      </template>\r\n      <template #footer>\r\n        <FhButton\r\n          color=\"primary\"\r\n          :disabled=\"props.isSaving\"\r\n          @click=\"\r\n            () => {\r\n              addressIdsConfirmedForFreight.push(data.shippingAddressId);\r\n              if (isVerifyingNewAddress) {\r\n                shouldKeepSelectedAddress = true;\r\n                showAddressVerificationModal = false;\r\n              } else {\r\n                complete();\r\n              }\r\n            }\r\n          \"\r\n        >\r\n          Yes, it accepts freight\r\n        </FhButton>\r\n        <FhButton variant=\"text\" @click=\"showAddressVerificationModal = false\">Choose another address</FhButton>\r\n      </template>\r\n    </FhModal>\r\n    <FhModal\r\n      v-if=\"isResidentialShippingEligible === false\"\r\n      v-model:is-open=\"showAddressIneligibleModal\"\r\n      :data=\"{ heading: 'Address Cannot Accept Freight' }\"\r\n      @after-leave=\"clearSelectedAddressIfNeeded\"\r\n    >\r\n      <template #default>\r\n        <p class=\"mb-f5\">\r\n          Our records indicate the delivery address you've selected cannot accept freight. Four Hands carriers do not deliver to residential addresses and\r\n          require a commercial address that can accommodate a 53' freight truck. Please choose a different delivery address or arrange your own carrier.\r\n        </p>\r\n        <FhCard>\r\n          <FhShippingAddress v-if=\"selectedAddress\" v-bind=\"selectedAddress\" />\r\n        </FhCard>\r\n      </template>\r\n      <template #footer>\r\n        <FhButton\r\n          size=\"small\"\r\n          class=\"flex-1\"\r\n          :disabled=\"props.isSaving\"\r\n          @click=\"\r\n            () => {\r\n              data.shippingOption = SHIPPING_OPTIONS.THIRD_PARTY;\r\n              if (isVerifyingNewAddress) {\r\n                shouldKeepSelectedAddress = true;\r\n                showAddressIneligibleModal = false;\r\n              } else {\r\n                complete();\r\n              }\r\n            }\r\n          \"\r\n        >\r\n          Arrange my own carrier\r\n        </FhButton>\r\n        <FhButton size=\"small\" class=\"flex-1\" @click=\"showAddressIneligibleModal = false\">Choose another address</FhButton>\r\n      </template>\r\n    </FhModal>\r\n  </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n","import axiosClient from \"./axiosClient\";\r\nimport { useQuery } from \"@tanstack/vue-query\";\r\n\r\nconst QUERY_KEY_BASE = \"freight\";\r\n\r\nexport function useFreightQuery(params, options) {\r\n  return useQuery({\r\n    ...(options || {}),\r\n    queryKey: [QUERY_KEY_BASE, params],\r\n    queryFn: () => axiosClient.get(\"/freight\", { params }),\r\n    refetchOnWindowFocus: false\r\n  });\r\n}\r\n","<script setup>\r\nimport { computed, watch } from \"vue\";\r\nimport { FREIGHT_SERVICE_LEVEL, FREIGHT_SERVICE_LEVEL_DEFINITION } from \"@/constants\";\r\nimport formatPrice from \"@/util/formatPrice\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhOptionCard from \"@/components/FhOptionCard.vue\";\r\nimport FhWysiwyg from \"@/includes/FhWysiwyg.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: undefined,\r\n    required: true\r\n  },\r\n  freightServiceLevel: {\r\n    type: String,\r\n    required: true,\r\n    validator: (val) => Object.values(FREIGHT_SERVICE_LEVEL).includes(val)\r\n  },\r\n  price: {\r\n    type: Number,\r\n    default: null\r\n  },\r\n  priceToBeQuoted: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isLoading: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isError: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isResidentialShippingEligible: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (val) => emit(\"update:modelValue\", val)\r\n});\r\n\r\nconst { isSm } = useViewportSizes();\r\n\r\nwatch(\r\n  [() => props.modelValue, () => props.isResidentialShippingEligible],\r\n  ([modelValue, isResShipEligValue]) => {\r\n    if (modelValue === null || isResShipEligValue) {\r\n      emit(\"update:modelValue\", FREIGHT_SERVICE_LEVEL.STANDARD);\r\n    }\r\n  },\r\n  { immediate: true }\r\n);\r\n</script>\r\n\r\n<template>\r\n  <FhOptionCard v-model=\"value\" type=\"radio\" :value=\"props.freightServiceLevel\">\r\n    <div class=\"flex items-center justify-between\">\r\n      <div>\r\n        <div class=\"text-body-lg flex items-center gap-3\">\r\n          <span>{{ FREIGHT_SERVICE_LEVEL_DEFINITION[props.freightServiceLevel].displayName }}</span>\r\n          <FhModal :data=\"{ heading: FREIGHT_SERVICE_LEVEL_DEFINITION[props.freightServiceLevel].displayName + ' Service' }\">\r\n            <template #activator=\"{ open }\">\r\n              <button class=\"flex items-center\" title=\"See more details about this service level\" @click=\"open\"><FhIcon name=\"InformationCircle\" /></button>\r\n            </template>\r\n            <template #default>\r\n              <FhWysiwyg\r\n                v-if=\"isResidentialShippingEligible === false\"\r\n                :content=\"FREIGHT_SERVICE_LEVEL_DEFINITION[props.freightServiceLevel].longDescription\"\r\n                spacing\r\n              />\r\n              <FhWysiwyg v-else :content=\"FREIGHT_SERVICE_LEVEL_DEFINITION[props.freightServiceLevel].longDescriptionWallpaperOnly\" spacing />\r\n            </template>\r\n          </FhModal>\r\n        </div>\r\n        <div v-if=\"isResidentialShippingEligible === false\" class=\"text-neutral-50\">\r\n          {{ FREIGHT_SERVICE_LEVEL_DEFINITION[props.freightServiceLevel].description }}\r\n        </div>\r\n        <div v-else class=\"text-neutral-50\">{{ FREIGHT_SERVICE_LEVEL_DEFINITION[props.freightServiceLevel].descriptionWallpaperOnly }}</div>\r\n      </div>\r\n      <div v-if=\"props.isLoading\" class=\"text-body-lg w-16 animate-pulse bg-neutral-20\">&nbsp;</div>\r\n      <div v-else-if=\"props.isError || props.priceToBeQuoted\" class=\"text-body text-right\">\r\n        <span v-if=\"isSm\">Quoted</span>\r\n        <span v-else>Quote provided at time of shipment</span>\r\n      </div>\r\n      <div v-else-if=\"props.price !== null\" class=\"text-body-lg text-right\">{{ formatPrice(props.price) }}</div>\r\n    </div>\r\n  </FhOptionCard>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { SHIPPING_OPTIONS, FREIGHT_SERVICE_LEVEL } from \"@/constants\";\r\nimport { useFreightQuery } from \"@/api/freightApi\";\r\nimport FhCheckoutFreightOptionPresenter from \"@/components/FhCheckoutFreightOptionPresenter.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: undefined,\r\n    required: true\r\n  },\r\n  freightServiceLevel: {\r\n    type: String,\r\n    required: true,\r\n    validator: (val) => Object.values(FREIGHT_SERVICE_LEVEL).includes(val)\r\n  },\r\n  shippingCountry: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  shippingPostalCode: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  totalItemsPrice: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  isResidentialShippingEligible: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (val) => emit(\"update:modelValue\", val)\r\n});\r\n\r\nconst { isLoading, isError, data } = useFreightQuery({\r\n  shippingOption: SHIPPING_OPTIONS.FH_CARRIERS,\r\n  serviceLevel: props.freightServiceLevel,\r\n  country: props.shippingCountry,\r\n  postalCode: props.shippingPostalCode,\r\n  totalItemsPrice: props.totalItemsPrice,\r\n  isResidentialShippingEligible: props.isResidentialShippingEligible\r\n});\r\n\r\nconst price = computed(() => data.value?.price);\r\nconst priceToBeQuoted = computed(() => data.value?.toBeQuoted);\r\n</script>\r\n\r\n<template>\r\n  <FhCheckoutFreightOptionPresenter\r\n    v-model=\"value\"\r\n    :freight-service-level=\"props.freightServiceLevel\"\r\n    :is-residential-shipping-eligible=\"isResidentialShippingEligible\"\r\n    :price=\"price\"\r\n    :price-to-be-quoted=\"priceToBeQuoted\"\r\n    :is-loading=\"isLoading\"\r\n    :is-error=\"isError\"\r\n  />\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhCheckbox from \"./FhCheckbox.vue\";\r\nimport FhInput from \"./FhInput.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  selected: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  minDate: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  maxDate: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  vuelidateField: {\r\n    type: Object,\r\n    default: () => undefined\r\n  },\r\n  vuelidate: {\r\n    type: Object,\r\n    default: () => undefined\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"update:selected\"]);\r\n\r\nconst toggleCheckbox = (isSelected) => {\r\n  // Avoid posting a hold date when checkbox is unchecked\r\n  emit(\"update:selected\", isSelected);\r\n  if (!isSelected) {\r\n    emit(\"update:modelValue\", null);\r\n    props.vuelidate.$reset();\r\n  }\r\n};\r\n\r\nconst value = computed({\r\n  get: () => {\r\n    if (!props.modelValue || isNaN(new Date(props.modelValue))) return null;\r\n    return new Date(props.modelValue).toISOString().substring(0, 10);\r\n  },\r\n  set: (val) => emit(\"update:modelValue\", val)\r\n});\r\n</script>\r\n\r\n<template>\r\n  <fieldset>\r\n    <legend class=\"mb-f3 text-f-base-xl\">Don't Want Your Order Shipped Yet? <span class=\"text-neutral-50\">(Optional)</span></legend>\r\n    <FhCheckbox\r\n      :model-value=\"props.selected\"\r\n      label=\"Select the date you&rsquo;d like us to ship your order\"\r\n      note=\"We will begin processing your order 3-5 days prior to the date you specify and ship product as it is available. Please note: selecting a shipment date does not hold inventory or guarantee product will be in stock on the specified date.\"\r\n      @update:model-value=\"toggleCheckbox\"\r\n    />\r\n    <div v-if=\"props.selected\" class=\"mt-f3 ml-[1em] w-56 pl-f2\">\r\n      <FhInput v-model=\"value\" type=\"date\" label=\"Select your date\" :min=\"props.minDate\" :max=\"props.maxDate\" :vuelidate=\"vuelidateField\" />\r\n    </div>\r\n  </fieldset>\r\n</template>\r\n\r\n<style scoped></style>\r\n","/**\r\n * Returns string representing a date X days in the future, in YYYY-MM-DD format\r\n */\r\nfunction getFutureDateString(days) {\r\n  return new Date(new Date().getTime() - new Date().getTimezoneOffset() * 60000 + days * 24 * 60 * 60000).toISOString().substring(0, 10);\r\n}\r\n\r\nexport const getHoldDateLimits = () => {\r\n  return {\r\n    minDate: getFutureDateString(1), // tomorrow\r\n    maxDate: getFutureDateString(90)\r\n  };\r\n};\r\n","<script setup>\r\nimport { ref, reactive, watch, toRef, computed } from \"vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers } from \"@vuelidate/validators\";\r\nimport { SHIPPING_DETAILS_FH_CARRIERS_SUB_STEPS as SUB_STEPS, FREIGHT_SERVICE_LEVEL, FREIGHT_SERVICE_LEVEL_DEFINITION } from \"@/constants\";\r\nimport { watchOnce } from \"@vueuse/shared\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhCheckoutSelectionSummary from \"@/components/FhCheckoutSelectionSummary.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhCheckoutFreightOption from \"@/components/FhCheckoutFreightOption.vue\";\r\nimport FhCheckoutHoldDateSelect from \"@/components/FhCheckoutHoldDateSelect.vue\";\r\nimport { getHoldDateLimits } from \"@/util/dateFunctions\";\r\n\r\nconst props = defineProps({\r\n  subStep: {\r\n    type: Number,\r\n    default: SUB_STEPS.SERVICE_LEVEL_SELECTION,\r\n    validator: (val) => Object.values(SUB_STEPS).includes(val)\r\n  },\r\n  /**\r\n   * The shippingAddress object from the cart, needed for the freight service cost lookup\r\n   */\r\n  shippingAddress: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  /**\r\n   * The cart totalItemsPrice value from the cart, needed for the freight service cost lookup\r\n   */\r\n  totalItemsPrice: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  /**\r\n   * The selected freight service level\r\n   */\r\n  freightServiceLevel: {\r\n    type: String,\r\n    default: null,\r\n    validator: (val) => Object.values(FREIGHT_SERVICE_LEVEL).includes(val)\r\n  },\r\n  carrierNotes: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  holdDate: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  isSaving: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isResidentialShippingEligible: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"save\", \"complete\"]);\r\nconst isNextStepAvailable = ref(true);\r\nconst isOrderShippingLater = ref(!!props.holdDate);\r\n\r\nconst data = reactive({\r\n  freightServiceLevel: props.freightServiceLevel,\r\n  carrierNotes: props.carrierNotes,\r\n  holdDate: props.holdDate\r\n});\r\n\r\nconst filteredFreightServiceLevels = computed(() => {\r\n  if (props.isResidentialShippingEligible) {\r\n    // If Cart is only Wallpaper swatches, return STANDARD option only\r\n    // This is to prevent Rush/Expediated shipping options from showing on order of only wallpaper swatches\r\n    return [FREIGHT_SERVICE_LEVEL.STANDARD];\r\n  } else {\r\n    // If Cart is other items than just swatches, return all options\r\n    return FREIGHT_SERVICE_LEVEL;\r\n  }\r\n});\r\n\r\nconst isDateValid = (value) => {\r\n  isNextStepAvailable.value =\r\n    !isOrderShippingLater.value || (isOrderShippingLater.value && data.holdDate && (!helpers.req(value) || (value <= maxDate && value >= minDate)));\r\n  return isNextStepAvailable.value;\r\n};\r\n\r\n// Update `data` values in response to corresponding props changing\r\nObject.keys(data).forEach((key) => watch(toRef(props, key), (val) => (data[key] = val)));\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    holdDate: {\r\n      isDateValid: helpers.withMessage(\"Please choose a date within 90 days from today.\", isDateValid)\r\n    }\r\n  },\r\n  data\r\n);\r\n\r\nconst currentSubStep = ref(props.subStep);\r\n\r\nconst { minDate, maxDate } = getHoldDateLimits();\r\n\r\nfunction goToNextStep() {\r\n  currentSubStep.value = currentSubStep.value + 1;\r\n}\r\n\r\nfunction save() {\r\n  if (currentSubStep.value === SUB_STEPS.SERVICE_LEVEL_SELECTION) {\r\n    if (props.freightServiceLevel === data.freightServiceLevel) {\r\n      goToNextStep();\r\n    } else {\r\n      watchOnce(\r\n        () => props.freightServiceLevel,\r\n        () => goToNextStep()\r\n      );\r\n      emit(\"save\", { ...data });\r\n    }\r\n  }\r\n}\r\n\r\nfunction complete() {\r\n  if (vuelidate.value.$validate()) {\r\n    emit(\"complete\", { ...data });\r\n  }\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div>\r\n    <div v-if=\"currentSubStep === SUB_STEPS.SERVICE_LEVEL_SELECTION\" class=\"mt-f5 flex flex-col gap-f8\">\r\n      <fieldset>\r\n        <legend class=\"mb-f4\">\r\n          <div class=\"mb-1 text-f-base-xl\">Select a delivery service level</div>\r\n          <div class=\"text-neutral-50\">Time estimates are based on when shipment leaves the warehouse</div>\r\n        </legend>\r\n        <FhCheckoutFreightOption\r\n          v-for=\"serviceLevel in filteredFreightServiceLevels\"\r\n          :key=\"serviceLevel\"\r\n          v-model=\"data.freightServiceLevel\"\r\n          :freight-service-level=\"serviceLevel\"\r\n          :is-residential-shipping-eligible=\"isResidentialShippingEligible\"\r\n          :shipping-country=\"props.shippingAddress.country\"\r\n          :shipping-postal-code=\"props.shippingAddress.postalCode\"\r\n          :total-items-price=\"props.totalItemsPrice\"\r\n          class=\"fsl-option-card relative -mb-px\"\r\n        />\r\n      </fieldset>\r\n      <FhButton color=\"primary\" :disabled=\"!data.freightServiceLevel || props.isSaving\" class=\"self-end\" @click=\"save\">Continue</FhButton>\r\n    </div>\r\n    <div v-if=\"currentSubStep === SUB_STEPS.OTHER_DETAILS\" class=\"flex flex-col gap-f8\">\r\n      <FhCheckoutSelectionSummary title=\"Service Level\" @change=\"currentSubStep = SUB_STEPS.SERVICE_LEVEL_SELECTION\">\r\n        {{ FREIGHT_SERVICE_LEVEL_DEFINITION[props.freightServiceLevel].displayName }},\r\n        {{ FREIGHT_SERVICE_LEVEL_DEFINITION[props.freightServiceLevel].description }}\r\n      </FhCheckoutSelectionSummary>\r\n      <FhCheckoutHoldDateSelect\r\n        v-model=\"data.holdDate\"\r\n        v-model:selected=\"isOrderShippingLater\"\r\n        :min-date=\"minDate\"\r\n        :max-date=\"maxDate\"\r\n        :vuelidate=\"vuelidate\"\r\n        :vuelidate-field=\"vuelidate.holdDate\"\r\n      />\r\n      <div>\r\n        <div class=\"mb-f4 text-f-base-xl\">Additional Details <span class=\"text-neutral-50\">(Optional)</span></div>\r\n        <FhInput\r\n          v-model=\"data.carrierNotes\"\r\n          label=\"Carrier and/or Freight Broker Instructions\"\r\n          placeholder=\"Ex. 24 hour call ahead\"\r\n          :wrapper-attrs=\"{ class: 'max-w-prose' }\"\r\n          note=\"Special requests, such as 24 hr call ahead ($50) and Liftgate ($200), require an additional charge and are typically only available for Expedited and Rush service. If you are shipping internationally, please include freight broker name, contact and phone number here.\"\r\n        />\r\n      </div>\r\n      <FhButton color=\"primary\" class=\"w-full\" :disabled=\"props.isSaving || !isNextStepAvailable\" @click=\"complete\">Continue to Payment</FhButton>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style scoped>\r\n.fsl-option-card.selected {\r\n  z-index: 1;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { reactive, ref, watch, toRef } from \"vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, required, email, maxLength } from \"@vuelidate/validators\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\n// checkbox component is no longer needed unless pay carrier checkbox is added back\r\n// import FhCheckbox from \"@/components/FhCheckbox.vue\";\r\nimport FhCheckoutHoldDateSelect from \"@/components/FhCheckoutHoldDateSelect.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhInputPhone from \"@/components/FhInputPhone.vue\";\r\nimport { getHoldDateLimits } from \"@/util/dateFunctions\";\r\n\r\nconst props = defineProps({\r\n  carrierName: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carrierAccountNumber: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carrierPhone: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carrierEmail: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carrierContactName: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carrierNotes: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  // prop is no longer needed unless pay carrier checkbox is added back\r\n  // payOnDelivery: {\r\n  //   type: Boolean,\r\n  //   default: false\r\n  // },\r\n  holdDate: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  isSaving: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"complete\"]);\r\nconst isNextStepAvailable = ref(true);\r\nconst isOrderShippingLater = ref(!!props.holdDate);\r\n\r\nconst data = reactive({\r\n  carrierName: props.carrierName,\r\n  carrierAccountNumber: props.carrierAccountNumber,\r\n  carrierPhone: props.carrierPhone,\r\n  carrierEmail: props.carrierEmail,\r\n  carrierContactName: props.carrierContactName,\r\n  carrierNotes: props.carrierNotes,\r\n  // prop is no longer needed unless pay carrier checkbox is added back\r\n  // payOnDelivery: props.payOnDelivery,\r\n  holdDate: props.holdDate\r\n});\r\n\r\n// Update `data` values in response to corresponding props changing\r\nObject.keys(data).forEach((key) => watch(toRef(props, key), (val) => (data[key] = val)));\r\n\r\nconst isDateValid = (value) => {\r\n  isNextStepAvailable.value =\r\n    !isOrderShippingLater.value || (isOrderShippingLater.value && data.holdDate && (!helpers.req(value) || (value <= maxDate && value >= minDate)));\r\n  return isNextStepAvailable.value;\r\n};\r\n\r\nconst { minDate, maxDate } = getHoldDateLimits();\r\n\r\nconst characterLimit = 100;\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    carrierName: {\r\n      required: helpers.withMessage(\"Please enter a carrier name.\", required),\r\n      maxLength: helpers.withMessage(`Please enter no more than ${characterLimit} characters.`, maxLength(characterLimit))\r\n    },\r\n    carrierAccountNumber: {\r\n      required: helpers.withMessage(\"Please enter a carrier account number.\", required),\r\n      maxLength: helpers.withMessage(`Please enter no more than ${characterLimit} characters.`, maxLength(characterLimit))\r\n    },\r\n    carrierPhone: {\r\n      required: helpers.withMessage(\"Please enter a carrier phone number.\", required),\r\n      validPhone: helpers.withMessage(\"Please enter a valid carrier phone number.\", helpers.regex(/^\\([0-9]{3}\\) [0-9]{3}-[0-9]{4}$/))\r\n    },\r\n    carrierEmail: {\r\n      required: helpers.withMessage(\"Please enter a carrier email address.\", required),\r\n      validEmail: helpers.withMessage(\"Please enter a valid carrier email address.\", email),\r\n      maxLength: helpers.withMessage(\"Please enter no more than 254 characters.\", maxLength(254))\r\n    },\r\n    carrierContactName: {\r\n      required: helpers.withMessage(\"Please enter a carrier contact name.\", required),\r\n      maxLength: helpers.withMessage(\"Please enter no more than 50 characters.\", maxLength(50))\r\n    },\r\n    holdDate: {\r\n      isDateValid: helpers.withMessage(\"Please choose a date within 90 days from today.\", isDateValid)\r\n    }\r\n  },\r\n  data\r\n);\r\n\r\nfunction complete() {\r\n  if (vuelidate.value.$validate()) {\r\n    emit(\"complete\", { ...data });\r\n  }\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div class=\"mt-f5 flex flex-col gap-f8\">\r\n    <fieldset>\r\n      <legend class=\"mb-f4 text-f-base-xl\">Enter the carrier information</legend>\r\n      <div class=\"grid gap-x-f3 gap-y-f4 md:grid-cols-2\">\r\n        <FhInput v-model=\"data.carrierName\" label=\"Carrier Name\" required :vuelidate=\"vuelidate.carrierName\" />\r\n        <FhInput\r\n          v-model=\"data.carrierAccountNumber\"\r\n          label=\"Carrier Account Number\"\r\n          required\r\n          :vuelidate=\"vuelidate.carrierAccountNumber\"\r\n          note=\"If you don't have an account number, enter N/A.\"\r\n        />\r\n        <FhInputPhone v-model=\"data.carrierPhone\" label=\"Carrier Phone Number\" :vuelidate=\"vuelidate.carrierPhone\" required />\r\n        <FhInput v-model=\"data.carrierEmail\" label=\"Carrier Email Address\" :vuelidate=\"vuelidate.carrierEmail\" required />\r\n        <FhInput v-model=\"data.carrierContactName\" label=\"Carrier Contact Name\" :vuelidate=\"vuelidate.carrierContactName\" required />\r\n        <!-- not needed unless pay carrier checkbox is added back\r\n        <div class=\"col-span-2\">\r\n          <FhCheckbox v-model=\"data.payOnDelivery\" label=\"I will pay the carrier upon delivery\" />\r\n        </div> -->\r\n      </div>\r\n    </fieldset>\r\n    <FhCheckoutHoldDateSelect\r\n      v-model=\"data.holdDate\"\r\n      v-model:selected=\"isOrderShippingLater\"\r\n      :min-date=\"minDate\"\r\n      :max-date=\"maxDate\"\r\n      :vuelidate=\"vuelidate\"\r\n      :vuelidate-field=\"vuelidate.holdDate\"\r\n    />\r\n    <div>\r\n      <div class=\"mb-f4 text-f-base-xl\">Additional Details <span class=\"text-neutral-50\">(Optional)</span></div>\r\n      <FhInput\r\n        v-model=\"data.carrierNotes\"\r\n        label=\"Carrier and/or Freight Broker Instructions\"\r\n        placeholder=\"Ex. Carrier service level\"\r\n        :wrapper-attrs=\"{ class: 'max-w-prose' }\"\r\n      />\r\n    </div>\r\n    <FhButton color=\"primary\" class=\"w-full\" :disabled=\"vuelidate.$invalid || props.isSaving || !isNextStepAvailable\" @click=\"complete\"\r\n      >Continue to Payment</FhButton\r\n    >\r\n  </div>\r\n</template>\r\n\r\n<style scoped></style>\r\n","<script setup>\r\nimport { reactive, ref, watch, toRef } from \"vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, required, maxLength } from \"@vuelidate/validators\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhCheckoutHoldDateSelect from \"@/components/FhCheckoutHoldDateSelect.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhInputPhone from \"@/components/FhInputPhone.vue\";\r\nimport { getHoldDateLimits } from \"@/util/dateFunctions\";\r\n\r\nconst props = defineProps({\r\n  pickUpContactName: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pickUpContactPhone: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  holdDate: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  isSaving: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"complete\"]);\r\nconst isNextStepAvailable = ref(true);\r\nconst isOrderShippingLater = ref(!!props.holdDate);\r\n\r\nconst data = reactive({\r\n  pickUpContactName: props.pickUpContactName,\r\n  pickUpContactPhone: props.pickUpContactPhone,\r\n  holdDate: props.holdDate\r\n});\r\n\r\n// Update `data` values in response to corresponding props changing\r\nObject.keys(data).forEach((key) => watch(toRef(props, key), (val) => (data[key] = val)));\r\n\r\nconst { minDate, maxDate } = getHoldDateLimits();\r\n\r\nconst isDateValid = (value) => {\r\n  isNextStepAvailable.value =\r\n    !isOrderShippingLater.value || (isOrderShippingLater.value && data.holdDate && (!helpers.req(value) || (value <= maxDate && value >= minDate)));\r\n  return isNextStepAvailable.value;\r\n};\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    pickUpContactName: {\r\n      required: helpers.withMessage(\"Please enter a pick-up contact name.\", required),\r\n      maxLength: helpers.withMessage(\"Please enter no more than 50 characters.\", maxLength(50))\r\n    },\r\n    pickUpContactPhone: {\r\n      required: helpers.withMessage(\"Please enter a pick-up contact phone number.\", required),\r\n      validPhone: helpers.withMessage(\"Please enter a valid pick-up contact phone number.\", helpers.regex(/^\\([0-9]{3}\\) [0-9]{3}-[0-9]{4}$/))\r\n    },\r\n    holdDate: {\r\n      isDateValid: helpers.withMessage(\"Please choose a date within 90 days from today.\", isDateValid)\r\n    }\r\n  },\r\n  data\r\n);\r\n\r\nfunction complete() {\r\n  if (vuelidate.value.$validate()) {\r\n    emit(\"complete\", { ...data });\r\n  }\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div class=\"mt-f5 flex flex-col gap-f8\">\r\n    <fieldset>\r\n      <legend class=\"mb-f4 text-f-base-xl\">Enter your pick up details</legend>\r\n      <div class=\"grid gap-f3 md:grid-cols-2\">\r\n        <FhInput v-model=\"data.pickUpContactName\" label=\"Contact Name\" required :vuelidate=\"vuelidate.pickUpContactName\" />\r\n        <FhInputPhone v-model=\"data.pickUpContactPhone\" label=\"Phone Number\" required :vuelidate=\"vuelidate.pickUpContactPhone\" />\r\n      </div>\r\n    </fieldset>\r\n    <FhCheckoutHoldDateSelect\r\n      v-model=\"data.holdDate\"\r\n      v-model:selected=\"isOrderShippingLater\"\r\n      :min-date=\"minDate\"\r\n      :max-date=\"maxDate\"\r\n      :vuelidate=\"vuelidate\"\r\n      :vuelidate-field=\"vuelidate.holdDate\"\r\n    />\r\n    <FhButton color=\"primary\" class=\"w-full\" :disabled=\"vuelidate.$invalid || props.isSaving || !isNextStepAvailable\" @click=\"complete\"\r\n      >Continue to Payment</FhButton\r\n    >\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { SHIPPING_OPTIONS } from \"../constants\";\r\nimport FhCheckoutStepShippingDetails_FhCarriers from \"./FhCheckoutStepShippingDetails_FhCarriers.vue\";\r\nimport FhCheckoutStepShippingDetails_ThirdParty from \"./FhCheckoutStepShippingDetails_ThirdParty.vue\";\r\nimport FhCheckoutStepShippingDetails_PickUp from \"./FhCheckoutStepShippingDetails_PickUp.vue\";\r\n\r\nconst props = defineProps({\r\n  shippingOption: {\r\n    type: String,\r\n    required: true,\r\n    validator: (val) => Object.values(SHIPPING_OPTIONS).includes(val)\r\n  }\r\n});\r\n\r\nconst stepComponent = computed(() => {\r\n  switch (props.shippingOption) {\r\n    case SHIPPING_OPTIONS.FH_CARRIERS:\r\n      return FhCheckoutStepShippingDetails_FhCarriers;\r\n    case SHIPPING_OPTIONS.THIRD_PARTY:\r\n      return FhCheckoutStepShippingDetails_ThirdParty;\r\n    case SHIPPING_OPTIONS.PICK_UP:\r\n      return FhCheckoutStepShippingDetails_PickUp;\r\n    default:\r\n      return null;\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <component :is=\"stepComponent\" />\r\n</template>\r\n","<script setup>\r\nimport { ref, computed, watch, nextTick } from \"vue\";\r\nimport { useCheckoutQuery, useCreateCheckoutMutation, useUpdateCheckoutMutation, UPDATE_CHECKOUT_PATHS, useSubmitOrderMutation } from \"@/api/checkoutApi\";\r\nimport { useCartQuery } from \"@/api/cartApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore.js\";\r\nimport { CART } from \"@/constants/routes\";\r\nimport { SUPPORT_PHONE_NUMBER } from \"@/constants/strings\";\r\nimport { CHECKOUT_STEPS, SHIPPING_OPTIONS_DEFINITION } from \"@/constants/checkout\";\r\nimport { event_beginCheckout, event_ShippingInfo, event_PaymentInfo } from \"@/util/googleAnalytics\";\r\nimport FhAlert from \"@/components/FhAlert.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhCartCheckoutLayout from \"@/components/FhCartCheckoutLayout.vue\";\r\nimport FhCartSummary from \"@/components/FhCartSummary.vue\";\r\nimport FhCheckoutPaymentSectionSummary from \"@/components/FhCheckoutPaymentSectionSummary.vue\";\r\nimport FhCheckoutPoNumber from \"@/components/FhCheckoutPoNumber.vue\";\r\nimport FhCheckoutSection from \"@/components/FhCheckoutSection.vue\";\r\nimport FhCheckoutSelectionSummary from \"@/components/FhCheckoutSelectionSummary.vue\";\r\nimport FhCheckoutShippingSectionSummary from \"@/components/FhCheckoutShippingSectionSummary.vue\";\r\nimport FhCheckoutStepPayment from \"@/components/FhCheckoutStepPayment.vue\";\r\nimport FhCheckoutStepReview from \"@/components/FhCheckoutStepReview.vue\";\r\nimport FhCheckoutStepShipping from \"@/components/FhCheckoutStepShipping.vue\";\r\nimport FhCheckoutStepShippingDetails from \"@/components/FhCheckoutStepShippingDetails.vue\";\r\nimport FhLink from \"@/components/FhLink.vue\";\r\nimport FhShippingAddress from \"@/components/FhShippingAddress.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\n\r\nconst props = defineProps({\r\n  hasTerms: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * Set this prop to `true` if there are any unrecoverable issues are detected at page-load time that would prevent the customer from completing checkout.\r\n   * The primary scenario this is designed for is when PaymentBroker is down, but leaving this prop generic as there may be other scenarios.\r\n   * When `true`, no queries will be executed and the body of this component will be replaced with an alert message.\r\n   */\r\n  isUnavailable: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  shippingTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  taxTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carriersTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  thirdPartyTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pickUpTooltip: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  checkoutMessaging: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\nconst isFirstLoad = ref(true);\r\nconst notificationStore = useNotificationStore();\r\n\r\n/**\r\n * Checkout Query\r\n */\r\n\r\nconst {\r\n  isLoading,\r\n  isError: isCheckoutQueryError,\r\n  data: checkout,\r\n  refetch: refetchCheckout\r\n} = useCheckoutQuery({\r\n  onError: handleCheckoutQueryError,\r\n  enabled: !props.isUnavailable // don't run the checkout query if checkout is unavailable\r\n});\r\n\r\nfunction handleCheckoutQueryError(error) {\r\n  if (error.response.status === 404) {\r\n    handleCheckoutUnprovisioned();\r\n  }\r\n}\r\n\r\n/**\r\n * Unprovisioned Checkout Handling\r\n */\r\n\r\nconst isCheckoutUnprovisioned = ref(false);\r\nconst isProvisionCheckoutError = ref(false);\r\n\r\nconst { mutate: createCheckout } = useCreateCheckoutMutation();\r\n\r\nasync function handleCheckoutUnprovisioned() {\r\n  isCheckoutUnprovisioned.value = true;\r\n\r\n  await ensureCartIsEligibleForCheckoutOrRedirect();\r\n\r\n  createCheckout(null, {\r\n    onSuccess: () => (isCheckoutUnprovisioned.value = false),\r\n    onError: () => (isProvisionCheckoutError.value = true)\r\n  });\r\n}\r\n\r\nconst { data: cart, refetch: refetchCart } = useCartQuery({ enabled: false });\r\n\r\nasync function ensureCartIsEligibleForCheckoutOrRedirect() {\r\n  await refetchCart();\r\n  if (!cart.value?.items || cart.value.items.every((item) => item.sku.isAvailable === false)) {\r\n    window.location = CART;\r\n  }\r\n}\r\n\r\n/**\r\n * Loading & Error State\r\n */\r\n\r\nconst isUnrecoverableError = computed(() => (isCheckoutUnprovisioned.value ? isProvisionCheckoutError.value : isCheckoutQueryError.value));\r\n\r\nconst isDataLoaded = computed(() => !isLoading.value && !isCheckoutUnprovisioned.value && !isUnrecoverableError.value);\r\n\r\n/**\r\n * Cart Summary Data\r\n */\r\n\r\nconst getPriceForSummary = (prop) => (isDataLoaded.value ? prop : null);\r\nconst cartSummaryProps = computed(() => ({\r\n  totalItemsPrice: getPriceForSummary(checkout.value?.totalItemsPrice),\r\n  totalShippingPrice: getPriceForSummary(checkout.value?.totalShippingPrice),\r\n  shippingPriceToBeQuoted: checkout.value?.shippingPriceToBeQuoted,\r\n  totalTaxPrice: getPriceForSummary(checkout.value?.totalTaxPrice),\r\n  totalPrice: getPriceForSummary(checkout.value?.totalPrice),\r\n  shippingTooltip: props.shippingTooltip,\r\n  taxTooltip: props.taxTooltip\r\n}));\r\n\r\nconst tooltipProps = computed(() => ({\r\n  carriersTooltip: props.carriersTooltip,\r\n  thirdPartyTooltip: props.thirdPartyTooltip,\r\n  pickUpTooltip: props.pickUpTooltip\r\n}));\r\n/**\r\n * Checkout Step Management\r\n */\r\n\r\nconst step = ref(1);\r\n\r\nconst { mutate: updateCheckout, isLoading: isSaving } = useUpdateCheckoutMutation();\r\n\r\nfunction getUpdateCheckoutPath() {\r\n  switch (step.value) {\r\n    case CHECKOUT_STEPS.SHIPPING:\r\n      return UPDATE_CHECKOUT_PATHS.SHIPPING;\r\n    case CHECKOUT_STEPS.SHIPPING_DETAILS:\r\n      return UPDATE_CHECKOUT_PATHS.SHIPPING_DETAILS;\r\n    case CHECKOUT_STEPS.PAYMENT:\r\n      return UPDATE_CHECKOUT_PATHS.PAYMENT;\r\n    default:\r\n      throw new Error(\"Checkout update path cannot be determined\");\r\n  }\r\n}\r\n\r\nfunction saveStep(data, goToNextStep = false) {\r\n  if (!data) {\r\n    if (goToNextStep) step.value++;\r\n    return;\r\n  }\r\n\r\n  updateCheckout(\r\n    { path: getUpdateCheckoutPath(), data },\r\n    {\r\n      onSuccess: () => {\r\n        if (goToNextStep) step.value++;\r\n      },\r\n      onError: () => {\r\n        notificationStore.notifyError(\r\n          `Sorry, something went wrong and we could not save your information. Please try again or contact sales support at ${SUPPORT_PHONE_NUMBER}.`\r\n        );\r\n      }\r\n    }\r\n  );\r\n}\r\n\r\nfunction completeStep(data) {\r\n  saveStep(data, true);\r\n}\r\n\r\n/**\r\n * Order Submission\r\n */\r\n\r\nconst unavailableItems = computed(() => checkout.value?.items.filter((item) => item.sku.isAvailable === false));\r\nconst allowSubmitOrder = computed(() => step.value === CHECKOUT_STEPS.REVIEW && unavailableItems.value?.length === 0);\r\nconst isSubmitting = ref(false);\r\n\r\nconst { mutate: submitOrderMutation } = useSubmitOrderMutation();\r\n\r\nfunction submitOrder() {\r\n  isSubmitting.value = true;\r\n  submitOrderMutation(null, {\r\n    onSuccess: (data) => (window.location = data.url),\r\n    onError: handleOrderSubmissionError\r\n  });\r\n}\r\n\r\nfunction handleOrderSubmissionError() {\r\n  // Manually refetch checkout data. In the case order submission failed due to EOL items,\r\n  // this will update the UI, instructing the customer how to proceed.\r\n  refetchCheckout();\r\n  isSubmitting.value = false;\r\n  notificationStore.notifyError(\r\n    `Sorry, something went wrong and we could not place your order. Please try again or contact sales support at ${SUPPORT_PHONE_NUMBER}.`\r\n  );\r\n}\r\n\r\nconst sectionRefs = {\r\n  shipping: ref(null),\r\n  shippingDetails: ref(null),\r\n  payment: ref(null),\r\n  review: ref(null)\r\n};\r\n\r\nwatch(step, async (nextStepValue) => {\r\n  await nextTick();\r\n  switch (nextStepValue) {\r\n    case CHECKOUT_STEPS.SHIPPING:\r\n      sectionRefs.shipping.value?.checkoutSectionRef?.scrollIntoView({ behavior: \"smooth\" });\r\n      break;\r\n    case CHECKOUT_STEPS.SHIPPING_DETAILS:\r\n      sectionRefs.shippingDetails?.value?.scrollIntoView({ behavior: \"smooth\" });\r\n      break;\r\n    case CHECKOUT_STEPS.PAYMENT:\r\n      event_ShippingInfo(checkout.value?.totalPrice, checkout.value?.items, checkout.value?.shippingOption);\r\n      sectionRefs.payment.value?.checkoutSectionRef?.scrollIntoView({ behavior: \"smooth\" });\r\n      break;\r\n    case CHECKOUT_STEPS.REVIEW:\r\n      event_PaymentInfo(checkout.value?.totalPrice, checkout.value?.items, props.hasTerms ? \"Terms\" : \"Credit Card\");\r\n      sectionRefs.review.value?.checkoutSectionRef?.scrollIntoView({ behavior: \"smooth\" });\r\n      break;\r\n  }\r\n});\r\n\r\nwatch(checkout, (checkoutdata) => {\r\n  if (isFirstLoad.value) {\r\n    event_beginCheckout({\r\n      totalPrice: checkoutdata.totalPrice,\r\n      products: checkoutdata.items\r\n    });\r\n    isFirstLoad.value = false;\r\n  }\r\n});\r\nconst residentialShippingModal = {\r\n  data: {\r\n    heading: \"Your order qualifies for residential shipping\",\r\n    copy: \"Residential shipping through a Four Hands carrier is now available for <strong>wallpaper-only orders</strong>.\"\r\n  }\r\n};\r\nconst isResidentialShippingEligible = computed(() => checkout.value?.isResidentialShippingEligible);\r\n</script>\r\n\r\n<template>\r\n  <FhModal v-if=\"isResidentialShippingEligible\" ref=\"modal\" :is-open=\"true\" v-bind=\"residentialShippingModal\">\r\n    <template #footer=\"{ close }\">\r\n      <FhButton color=\"primary\" @click=\"close\">Continue</FhButton>\r\n    </template>\r\n  </FhModal>\r\n  <FhCartCheckoutLayout :show-inline-summary-on-mobile=\"step === CHECKOUT_STEPS.REVIEW\">\r\n    <template #default>\r\n      <div class=\"pb-8 md:pb-f6\" :class=\"{ 'border-b border-neutral-30': isDataLoaded }\">\r\n        <h1 class=\"font-serif text-f-2xl-7xl\">Checkout</h1>\r\n      </div>\r\n      <template v-if=\"isDataLoaded\">\r\n        <FhCheckoutSection :ref=\"sectionRefs.shipping\" title=\"1. Shipping\" is-active>\r\n          <div class=\"flex flex-col gap-f3\">\r\n            <FhCheckoutStepShipping\r\n              v-if=\"step === CHECKOUT_STEPS.SHIPPING\"\r\n              v-bind=\"tooltipProps\"\r\n              :shipping-option=\"checkout?.shippingOption\"\r\n              :shipping-address-id=\"checkout?.shippingAddress?.id\"\r\n              :is-saving=\"isSaving\"\r\n              :is-residential-shipping-eligible=\"isResidentialShippingEligible\"\r\n              @complete=\"completeStep\"\r\n            />\r\n            <template v-else-if=\"step === CHECKOUT_STEPS.SHIPPING_DETAILS\">\r\n              <div class=\"flex flex-col gap-f3\">\r\n                <FhCheckoutSelectionSummary title=\"Delivery Method\" @change=\"step = CHECKOUT_STEPS.SHIPPING\">\r\n                  {{ SHIPPING_OPTIONS_DEFINITION[checkout.shippingOption].displayName }}\r\n                </FhCheckoutSelectionSummary>\r\n                <FhCheckoutSelectionSummary v-if=\"checkout.shippingAddress\" title=\"Delivery Address\" alignment=\"top\" @change=\"step = CHECKOUT_STEPS.SHIPPING\">\r\n                  <FhShippingAddress v-bind=\"checkout.shippingAddress\" simple-display />\r\n                </FhCheckoutSelectionSummary>\r\n              </div>\r\n              <div :ref=\"sectionRefs.shippingDetails\">\r\n                <FhCheckoutStepShippingDetails\r\n                  v-bind=\"checkout\"\r\n                  :is-residential-shipping-eligible=\"isResidentialShippingEligible\"\r\n                  :is-saving=\"isSaving\"\r\n                  @save=\"saveStep\"\r\n                  @complete=\"completeStep\"\r\n                />\r\n              </div>\r\n            </template>\r\n            <FhCheckoutShippingSectionSummary v-else v-bind=\"checkout\" />\r\n          </div>\r\n          <template #actions>\r\n            <FhButton v-if=\"step > CHECKOUT_STEPS.SHIPPING_DETAILS\" size=\"small\" @click=\"step = CHECKOUT_STEPS.SHIPPING\">Edit</FhButton>\r\n          </template>\r\n        </FhCheckoutSection>\r\n        <FhCheckoutSection :ref=\"sectionRefs.payment\" title=\"2. Payment\" :is-active=\"step >= CHECKOUT_STEPS.PAYMENT\">\r\n          <FhCheckoutStepPayment\r\n            v-if=\"step === CHECKOUT_STEPS.PAYMENT\"\r\n            :has-terms=\"props.hasTerms\"\r\n            :payment-card=\"checkout?.paymentCard\"\r\n            :po-number=\"checkout?.poNumber\"\r\n            :is-saving=\"isSaving\"\r\n            :shipping-address=\"checkout.shippingAddress\"\r\n            :shipping-option=\"checkout.shippingOption\"\r\n            @complete=\"completeStep\"\r\n          />\r\n          <FhCheckoutPaymentSectionSummary v-else :has-terms=\"props.hasTerms\" :payment-card=\"checkout?.paymentCard\" />\r\n          <template #actions>\r\n            <FhButton v-if=\"step > CHECKOUT_STEPS.PAYMENT && !props.hasTerms\" size=\"small\" @click=\"step = CHECKOUT_STEPS.PAYMENT\">Edit</FhButton>\r\n          </template>\r\n        </FhCheckoutSection>\r\n        <FhCheckoutSection :ref=\"sectionRefs.review\" title=\"3. Review\" :is-active=\"step >= CHECKOUT_STEPS.REVIEW\">\r\n          <FhCheckoutStepReview :items=\"checkout.items\" :checkout-messaging=\"props.checkoutMessaging\" />\r\n          <FhButton\r\n            color=\"primary\"\r\n            class=\"mt-f8 hidden w-full lg:block\"\r\n            :disabled=\"!allowSubmitOrder || isSubmitting\"\r\n            :is-loading=\"isSubmitting\"\r\n            @click=\"submitOrder\"\r\n          >\r\n            Place Order\r\n          </FhButton>\r\n        </FhCheckoutSection>\r\n      </template>\r\n      <!-- ERROR MESSAGE -->\r\n      <FhAlert v-if=\"isUnrecoverableError || props.isUnavailable\" icon=\"AlertCircle\" class=\"mb-f15\">\r\n        <div class=\"flex max-w-prose flex-col gap-f2\">\r\n          <p>\r\n            Sorry, something went wrong and checkout is unavailable at this time. If the problem persists, please contact sales support at\r\n            <span class=\"whitespace-nowrap\">{{ SUPPORT_PHONE_NUMBER }}</span\r\n            >.\r\n          </p>\r\n          <FhLink :href=\"CART\">Return to Shopping Cart</FhLink>\r\n        </div>\r\n      </FhAlert>\r\n    </template>\r\n    <template #summary>\r\n      <FhCartSummary v-bind=\"cartSummaryProps\" :show-inline-on-mobile=\"step === CHECKOUT_STEPS.REVIEW\">\r\n        <template #extras>\r\n          <FhCheckoutPoNumber :po-number=\"checkout?.poNumber\" />\r\n        </template>\r\n        <template #actions>\r\n          <FhButton color=\"primary\" :disabled=\"!allowSubmitOrder || isSubmitting\" :is-loading=\"isSubmitting\" @click=\"submitOrder\">Place Order</FhButton>\r\n          <FhButton :href=\"CART\">Edit Cart</FhButton>\r\n          <div class=\"text-body-sm text-center text-neutral-50\">You won&rsquo;t be charged until your items ship.</div>\r\n        </template>\r\n      </FhCartSummary>\r\n    </template>\r\n  </FhCartCheckoutLayout>\r\n</template>\r\n","export default \"__VITE_ASSET__a595f1f9__\"","export default \"__VITE_ASSET__d524eb97__\"","export default \"__VITE_ASSET__66497ba8__\"","<script setup>\r\nimport { useViewportSizes } from \"../composables\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport imageSm from \"../assets/storybook/company-timeline/fh-company-timeline--mobile.png\";\r\nimport imageMd from \"../assets/storybook/company-timeline/fh-company-timeline--tablet.png\";\r\nimport imageLg from \"../assets/storybook/company-timeline/fh-company-timeline--desktop.png\";\r\n\r\ndefineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  }\r\n});\r\n\r\nlet { isSm, isMd } = useViewportSizes();\r\n</script>\r\n\r\n<template>\r\n  <FhSection aria-label=\"About Us Hero\" :base=\"style.base\">\r\n    <div class=\"flex flex-col-reverse lg:flex-row\">\r\n      <div class=\"bg-limestone pt-f8 pb-f10 lg:basis-7/12 lg:py-f25\">\r\n        <div class=\"mx-4 flex flex-col md:mx-auto md:max-w-xl\">\r\n          <h2 class=\"mb-f8 font-serif text-f-2xl-7xl\">Our Most Recent Milestones</h2>\r\n          <div\r\n            class=\"before: relative flex items-start justify-start before:absolute before:top-3 before:left-px before:z-0 before:h-full before:w-px before:bg-neutral-opacity-10 before:content-['']\"\r\n          >\r\n            <div\r\n              class=\"relative pl-f4 text-f-base-xl before:absolute before:top-2/4 before:left-0 before:z-10 before:h-[3px] before:w-[3px] before:-translate-y-2/4 before:rounded-full before:bg-neutral-70 before:content-['']\"\r\n            >\r\n              2024\r\n            </div>\r\n            <div class=\"ml-f6 flex-initial pb-f6 text-f-base-xl\">Launched the Amber Lewis x Four Hands collection, a first-of-its-kind collaboration.</div>\r\n          </div>\r\n\r\n          <div\r\n            class=\"before: relative flex items-start justify-start before:absolute before:top-3 before:left-px before:z-0 before:h-full before:w-px before:bg-neutral-opacity-10 before:content-['']\"\r\n          >\r\n            <div\r\n              class=\"relative pl-f4 text-f-base-xl before:absolute before:top-2/4 before:left-0 before:z-10 before:h-[3px] before:w-[3px] before:-translate-y-2/4 before:rounded-full before:bg-neutral-70 before:content-['']\"\r\n            >\r\n              2024\r\n            </div>\r\n            <div class=\"ml-f6 flex-initial pb-f6 text-f-base-xl\">New and expanded Four Hands Las Vegas Showroom opened January 2024.</div>\r\n          </div>\r\n\r\n          <div\r\n            class=\"before: relative flex items-start justify-start before:absolute before:top-3 before:left-px before:z-0 before:h-full before:w-px before:bg-neutral-opacity-10 before:content-['']\"\r\n          >\r\n            <div\r\n              class=\"relative pl-f4 text-f-base-xl before:absolute before:top-2/4 before:left-0 before:z-10 before:h-[3px] before:w-[3px] before:-translate-y-2/4 before:rounded-full before:bg-neutral-70 before:content-['']\"\r\n            >\r\n              2023\r\n            </div>\r\n            <div class=\"ml-f6 flex-initial pb-f6 text-f-base-xl\">Launched new and evolved design partnerships including Thomas Bina and Van Thiel.</div>\r\n          </div>\r\n\r\n          <div\r\n            class=\"before: relative flex items-start justify-start before:absolute before:top-3 before:left-px before:z-0 before:h-full before:w-px before:bg-neutral-opacity-10 before:content-['']\"\r\n          >\r\n            <div\r\n              class=\"relative pl-f4 text-f-base-xl before:absolute before:top-2/4 before:left-0 before:z-10 before:h-[3px] before:w-[3px] before:-translate-y-2/4 before:rounded-full before:bg-neutral-70 before:content-['']\"\r\n            >\r\n              2023\r\n            </div>\r\n            <div class=\"ml-f6 flex-initial pb-f6 text-f-base-xl\">Won Inc. 5000 fastest-growing companies for the 14th time.</div>\r\n          </div>\r\n\r\n          <div\r\n            class=\"before: relative flex items-start justify-start before:absolute before:top-3 before:left-px before:z-0 before:h-full before:w-px before:bg-neutral-opacity-10 before:content-['']\"\r\n          >\r\n            <div\r\n              class=\"relative pl-f4 text-f-base-xl before:absolute before:top-2/4 before:left-0 before:z-10 before:h-[3px] before:w-[3px] before:-translate-y-2/4 before:rounded-full before:bg-neutral-70 before:content-['']\"\r\n            >\r\n              2023\r\n            </div>\r\n            <div class=\"ml-f6 flex-initial pb-f6 text-f-base-xl\">Expanded Four Hands Art Studio to 54,000 sq. ft. location.</div>\r\n          </div>\r\n\r\n          <div\r\n            class=\"before: relative flex items-start justify-start before:absolute before:top-3 before:left-px before:z-0 before:h-full before:w-px before:bg-neutral-opacity-10 before:content-['']\"\r\n          >\r\n            <div\r\n              class=\"relative pl-f4 text-f-base-xl before:absolute before:top-2/4 before:left-0 before:z-10 before:h-[3px] before:w-[3px] before:-translate-y-2/4 before:rounded-full before:bg-neutral-70 before:content-['']\"\r\n            >\r\n              2023\r\n            </div>\r\n            <div class=\"ml-f6 flex-initial pb-f6 text-f-base-xl\">\r\n              Expanded photo department to include a dedicated CGI team and launched a 12,000 sq. ft. photography studio &mdash; all in-house.\r\n            </div>\r\n          </div>\r\n\r\n          <div\r\n            class=\"before: relative flex items-start justify-start before:absolute before:top-3 before:left-px before:z-0 before:h-full before:w-px before:bg-neutral-opacity-10 before:content-['']\"\r\n          >\r\n            <div\r\n              class=\"relative pl-f4 text-f-base-xl before:absolute before:top-2/4 before:left-0 before:z-10 before:h-[3px] before:w-[3px] before:-translate-y-2/4 before:rounded-full before:bg-neutral-70 before:content-['']\"\r\n            >\r\n              2022\r\n            </div>\r\n            <div class=\"ml-f6 flex-initial pb-f6 text-f-base-xl\">\r\n              Introduced new product offerings including Games, Crafted in the USA upholstery, and revolutionary fabrics such as artisan-made Belgian\r\n              Linen&trade; and FIQA.\r\n            </div>\r\n          </div>\r\n\r\n          <div class=\"relative flex items-start justify-start\">\r\n            <div\r\n              class=\"relative pl-f4 text-f-base-xl before:absolute before:top-2/4 before:left-0 before:z-10 before:h-[3px] before:w-[3px] before:-translate-y-2/4 before:rounded-full before:bg-neutral-70 before:content-['']\"\r\n            >\r\n              2021\r\n            </div>\r\n            <div class=\"ml-f6 flex-initial pb-f6 text-f-base-xl\">\r\n              Global headquarters and flagship showroom in Austin undergo massive design renovation and continue ongoing expansion.\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <div\r\n        class=\"relative z-10 w-full after:absolute after:bottom-0 after:z-[-1] after:h-2/6 after:w-full after:bg-limestone after:content-[''] lg:basis-5/12 lg:after:hidden\"\r\n      >\r\n        <img v-if=\"isSm\" :src=\"imageSm\" class=\"w-full\" alt=\"Company Timeline Image\" />\r\n        <img v-else-if=\"isMd\" :src=\"imageMd\" class=\"mx-auto max-w-xl\" alt=\"Company Timeline Image\" />\r\n        <img v-else :src=\"imageLg\" class=\"h-full w-full object-cover\" alt=\"Company Timeline Image\" />\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst {\r\n  generalInquiriesHeading,\r\n  tollFreePhoneLabel,\r\n  tollFreePhone,\r\n  headquartersPhoneLabel,\r\n  headquartersPhone,\r\n  headquartersPhoneHours,\r\n  addressLabel,\r\n  mailingAddress1,\r\n  mailingAddress2,\r\n  cityStateZip,\r\n  country\r\n} = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <!-- GENERAL INQUIRIES -->\r\n    <div class=\"mb-f10 flex flex-col text-neutral-70 md:border-b md:border-solid md:border-neutral-70 md:border-opacity-10 md:pb-f10\">\r\n      <FhHeading tag=\"h2\">{{ generalInquiriesHeading }}</FhHeading>\r\n      <div class=\"mb-4 flex flex-col content-start items-start md:flex-row\">\r\n        <span class=\"mb-0.5 text-f-sm-base font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\">\r\n          {{ tollFreePhoneLabel }}\r\n        </span>\r\n        <a class=\"underline underline-offset-4\" role=\"link\" :href=\"`tel:${tollFreePhone}`\">\r\n          {{ tollFreePhone }}\r\n        </a>\r\n      </div>\r\n      <div class=\"mb-6 flex flex-col md:mb-10 md:flex-row\">\r\n        <span class=\"mb-0.5 text-f-sm-base font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\">\r\n          {{ headquartersPhoneLabel }}\r\n        </span>\r\n        <span class=\"flex flex-col content-start items-start\">\r\n          <a class=\"mb-2 underline underline-offset-4\" role=\"link\" :href=\"`tel:${headquartersPhone}`\">\r\n            {{ headquartersPhone }}\r\n          </a>\r\n          <small class=\"text-f-xs-sm text-neutral-50\">\r\n            {{ headquartersPhoneHours }}\r\n          </small>\r\n        </span>\r\n      </div>\r\n      <div class=\"flex flex-col md:flex-row\">\r\n        <span class=\"mb-0.5 text-f-sm-base font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\">\r\n          {{ addressLabel }}\r\n        </span>\r\n        <div class=\"flex flex-col text-neutral-50\">\r\n          <span class=\"md:mb-2\">\r\n            {{ mailingAddress1 }}\r\n          </span>\r\n          <span v-if=\"mailingAddress2\" class=\"md:mb-2\">\r\n            {{ mailingAddress2 }}\r\n          </span>\r\n          <span class=\"md:mb-2\">\r\n            {{ cityStateZip }}\r\n          </span>\r\n          <span>\r\n            {{ country }}\r\n          </span>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n<style lang=\"pcss\" scoped>\r\n.text-white * {\r\n  color: white !important;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhWysiwyg from \"@/includes/FhWysiwyg.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { layout, title, description, ctaLink, ctaTarget, ctaText, ctaAltText } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    aria-label=\"Content Block\"\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div\r\n      class=\"content-block__container\"\r\n      :class=\"[\r\n        ctaLink ? 'pb-28 pt-f15' : 'py-f15',\r\n        layout === 'titleRight' ? 'md:flex-row-reverse' : '',\r\n        'relative flex flex-col md:mx-auto md:flex-row md:justify-between md:gap-10 lg:px-f10'\r\n      ]\"\r\n    >\r\n      <div class=\"md:max-w-[600px] md:basis-1/2\">\r\n        <h2 class=\"mb-8 font-serif text-f-4xl-8xl md:mb-10\">{{ title }}</h2>\r\n        <FhButton\r\n          v-if=\"ctaLink\"\r\n          :href=\"ctaLink\"\r\n          :target=\"ctaTarget\"\r\n          :aria-label=\"ctaAltText\"\r\n          class=\"absolute bottom-0 left-0 right-0 mb-16 md:relative md:top-0 md:left-auto md:right-0 md:bottom-auto md:mb-0\"\r\n        >\r\n          {{ ctaText }}\r\n        </FhButton>\r\n      </div>\r\n      <FhWysiwyg>\r\n        <!-- eslint-disable-next-line vue/no-v-html -->\r\n        <div :class=\"[ctaLink ? 'mb-10' : '', 'text-f-base-2xl font-normal md:max-w-[600px] md:basis-1/2']\" v-html=\"description\"></div>\r\n      </FhWysiwyg>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.widget--width-full {\r\n  .content-block__container {\r\n    @media (max-width: 1199px) {\r\n      @apply px-f6;\r\n    }\r\n  }\r\n}\r\n</style>\r\n","import axiosClient from \"./axiosClient\";\r\nimport { useMutation } from \"@tanstack/vue-query\";\r\n\r\nexport function useSignUpMutation(options) {\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (data) => axiosClient.post(\"/sign_up\", data)\r\n  });\r\n}\r\n","import axiosClient from \"./axiosClient\";\r\nimport { useMutation } from \"@tanstack/vue-query\";\r\n\r\nexport function useLoginMutation(options) {\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (data) => axiosClient.post(\"/auth/login\", data)\r\n  });\r\n}\r\n\r\nexport function useInitiatePasswordResetMutation(options) {\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (data) => axiosClient.post(\"/auth/initiate_password_reset\", data)\r\n  });\r\n}\r\n\r\nexport function useResetPasswordMutation(options) {\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (data) => axiosClient.post(\"/auth/reset_password\", data)\r\n  });\r\n}\r\n\r\nexport function useUpdatePasswordMutation(options) {\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (data) => axiosClient.post(\"/auth/update_password\", data)\r\n  });\r\n}\r\n","export default \"__VITE_ASSET__1577e820__\"","<script setup>\r\nimport { ref, computed, defineExpose } from \"vue\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport Logo from \"@/assets/four-hands-wordmark.svg\"; // TODO: how to inline SVGs?\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\n\r\nconst props = defineProps({\r\n  backgroundImage: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  hideHeaderOnMobile: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  alignContent: {\r\n    type: String,\r\n    default: \"center\",\r\n    validator: (val) => [\"center\", \"top\"].includes(val)\r\n  },\r\n  /**\r\n   * Since this is the full-screen component, the main nav is not visible; this may cause the user to feel trapped in certain contexts.\r\n   * Setting this prop to `true` adds a small \"back\" arrow next to the Four Hands logo to help guide to user to use that link to escape the page if needed.\r\n   */\r\n  escapeHatch: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\n// Expose the active scroll container, which is different below and above the md breakpoint\r\nconst main = ref(null);\r\nconst inner = ref(null);\r\nconst { isSm } = useViewportSizes();\r\nconst scrollContainer = computed(() => (isSm.value ? main.value : inner.value));\r\ndefineExpose({ scrollContainer });\r\n</script>\r\n\r\n<template>\r\n  <main ref=\"main\" class=\"fixed inset-0 z-body-modal bg-white md:grid md:grid-cols-[2fr_3fr]\" :class=\"{ 'overflow-y-auto': isSm }\">\r\n    <header\r\n      class=\"relative z-10 h-48 bg-cover bg-center p-f4 md:h-auto\"\r\n      :class=\"{ 'hidden md:block': props.hideHeaderOnMobile }\"\r\n      :style=\"{ backgroundImage: `url(${props.backgroundImage})` }\"\r\n    >\r\n      <a href=\"/\" aria-label=\"Four Hands Home Page\" class=\"group flex w-max gap-3 p-f1\">\r\n        <FhIcon v-if=\"props.escapeHatch\" name=\"LeftChevron\" class=\"hidden text-xl text-white transition-all group-hover:-translate-x-0.5 md:inline-block\" />\r\n        <img :src=\"Logo\" alt=\"Four Hands\" class=\"w-[150px] brightness-0 invert md:w-[180px]\" />\r\n      </a>\r\n    </header>\r\n    <section ref=\"inner\" class=\"px-f4 pt-f8 pb-f10 md:px-f6\" :class=\"{ 'overflow-y-auto': !isSm }\">\r\n      <div class=\"mx-auto flex min-h-full w-full max-w-3xl flex-col\">\r\n        <div class=\"md:flex md:flex-1\" :class=\"{ 'md:items-center': props.alignContent === 'center' }\">\r\n          <div class=\"w-full\">\r\n            <slot name=\"default\"></slot>\r\n          </div>\r\n        </div>\r\n        <footer v-if=\"$slots.footer\" class=\"mt-f8\">\r\n          <slot name=\"footer\"></slot>\r\n        </footer>\r\n      </div>\r\n    </section>\r\n  </main>\r\n</template>\r\n","<script setup>\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, required, minLength } from \"@vuelidate/validators\";\r\nimport { reactive, watch } from \"vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  labelPassword: {\r\n    type: String,\r\n    default() {\r\n      return \"New Password\";\r\n    }\r\n  },\r\n  labelConfirm: {\r\n    type: String,\r\n    default() {\r\n      return \"Confirm New Password\";\r\n    }\r\n  },\r\n  placeholderPassword: {\r\n    type: String,\r\n    default() {\r\n      return \"Enter new password\";\r\n    }\r\n  },\r\n  placeholderConfirm: {\r\n    type: String,\r\n    default() {\r\n      return \"Confirm new password\";\r\n    }\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst model = reactive({\r\n  password: props.modelValue,\r\n  passwordConfirmation: props.modelValue\r\n});\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    password: {\r\n      required: helpers.withMessage(\"Please enter a new password.\", required),\r\n      minLength: helpers.withMessage(\"Please choose a password that is at least 8 characters long.\", minLength(8)),\r\n      requiredCharacters: helpers.withMessage(\r\n        \"Please choose a password with at least one uppercase letter, one lowercase letter, one number, and one special character.\",\r\n        helpers.regex(/^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[^A-Za-z\\d]).+$/)\r\n      )\r\n    },\r\n    passwordConfirmation: {\r\n      passwordsMatch: helpers.withMessage(\"Passwords do not match.\", () => model.password === model.passwordConfirmation)\r\n    }\r\n  },\r\n  model\r\n);\r\n\r\nwatch(model, (updatedModel) => {\r\n  if (!vuelidate.value.$invalid) {\r\n    emit(\"update:modelValue\", updatedModel.password);\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col gap-f4\">\r\n    <FhInput\r\n      v-model=\"model.password\"\r\n      type=\"password\"\r\n      :label=\"labelPassword\"\r\n      :placeholder=\"placeholderPassword\"\r\n      note=\"Minimum 8 characters with at least one uppercase letter, one lowercase letter, one number, and one special character.\"\r\n      :vuelidate=\"vuelidate.password\"\r\n    />\r\n    <FhInput\r\n      v-model=\"model.passwordConfirmation\"\r\n      type=\"password\"\r\n      :label=\"labelConfirm\"\r\n      :placeholder=\"placeholderConfirm\"\r\n      :vuelidate=\"vuelidate.passwordConfirmation\"\r\n    />\r\n  </div>\r\n</template>\r\n","export default \"__VITE_ASSET__a2b49f96__\"","<script setup>\r\nimport { ref, reactive, nextTick, onMounted } from \"vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhLink from \"@/components/FhLink.vue\";\r\nimport FhFullscreenFocusedLayout from \"@/components/FhFullscreenFocusedLayout.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhNewPassword from \"@/components/FhNewPassword.vue\";\r\nimport SidebarImg from \"@/assets/img/trade_program_sidebar.jpg\";\r\nimport { SUPPORT_PHONE_NUMBER } from \"@/constants/strings\";\r\nimport { LOGIN } from \"@/constants/routes\";\r\n\r\nconst props = defineProps({\r\n  companyName: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  username: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  email: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  isLoading: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isSignUpComplete: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isLoginComplete: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isInvalid: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  guestAccount: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"submit\"]);\r\n\r\nconst model = reactive({\r\n  password: \"\"\r\n});\r\nconst isGuestAccount = ref(props.guestAccount);\r\nconst vuelidate = useVuelidate({}, model);\r\n\r\nconst form = ref(null);\r\nconst focusFirstEmptyInput = () => {\r\n  nextTick(() => form.value.querySelector(\"input:placeholder-shown\")?.focus());\r\n};\r\nonMounted(focusFirstEmptyInput);\r\n\r\nfunction submit() {\r\n  emit(\"submit\", model);\r\n}\r\n</script>\r\n\r\n<template>\r\n  <FhFullscreenFocusedLayout ref=\"layout\" :background-image=\"SidebarImg\">\r\n    <template #default>\r\n      <!-- INVALID STATE -->\r\n      <FhHeading v-if=\"props.isInvalid\" heading=\"Sorry, there is a problem\">\r\n        <template #subheading>\r\n          This link is invalid. If you already have a FourHands.com account and know your login details, you may <FhLink :href=\"LOGIN\">log in here</FhLink>. If\r\n          you are a new customer trying to set up your account for the first time, please contact support at {{ SUPPORT_PHONE_NUMBER }}.\r\n        </template>\r\n      </FhHeading>\r\n      <!-- SUCCESS STATE -->\r\n      <div v-else-if=\"!props.isLoading && props.isSignUpComplete\" class=\"flex flex-col items-start gap-f6\">\r\n        <div v-if=\"!isGuestAccount\" class=\"font-serif text-f-2xl-9xl\">Your account has officially been created!</div>\r\n        <div v-else class=\"font-serif text-f-2xl-9xl\">Your Guest Account is Ready</div>\r\n        <div class=\"flex w-full flex-col gap-f3 border-y border-neutral-30 py-f3 md:flex-row md:flex-wrap\">\r\n          <div v-if=\"!isGuestAccount\" class=\"mr-f5 flex flex-col gap-f0.5\">\r\n            <div class=\"text-neutral-50\">Customer Number</div>\r\n            <div class=\"text-f-lg-3xl\">{{ props.username }}</div>\r\n          </div>\r\n          <div class=\"flex flex-col gap-f0.5\">\r\n            <div class=\"text-neutral-50\">Email Address</div>\r\n            <div class=\"text-f-lg-3xl\">{{ props.email }}</div>\r\n          </div>\r\n        </div>\r\n        <p v-if=\"!isGuestAccount\" class=\"text-body-lg max-w-xl\">\r\n          Our goal is to offer you and your space something transformative. There is no place we won&rsquo;t go to discover creative perspectives, innovative\r\n          materials and exclusive products to set you apart.\r\n        </p>\r\n        <p v-else class=\"text-body-lg max-w-xl\">\r\n          Now you&rsquo;ll be able to browse over 6,000 styles across living, dining, art and more with new pieces arriving each week.\r\n        </p>\r\n        <FhButton color=\"primary\" size=\"large\" :href=\"props.isLoginComplete ? '/' : `${LOGIN}?returnUrl=/`\">\r\n          {{\r\n            props.isLoginComplete\r\n              ? !isGuestAccount\r\n                ? \"Start Shopping\"\r\n                : \"Start Browsing\"\r\n              : !isGuestAccount\r\n                ? \"Log In to Start Shopping\"\r\n                : \"Log in to Start Browsing\"\r\n          }}\r\n        </FhButton>\r\n      </div>\r\n      <!-- INITIAL STATE -->\r\n      <div v-else ref=\"form\">\r\n        <FhHeading\r\n          :heading=\"!isGuestAccount ? `Welcome, ${props.companyName}` : 'Welcome'\"\r\n          :subheading=\"\r\n            !isGuestAccount\r\n              ? 'You have been approved for a trade account where you can easily buy Four Hands products, manage orders, and most importantly, discover style. Create your account to get started.'\r\n              : 'A guest account has been created for you by a Four Hands customer. Please set your password below so that you can start browsing our full catalog.'\r\n          \"\r\n        />\r\n        <div class=\"grid grid-cols-1 gap-x-f3 gap-y-f4 lg:grid-cols-2\">\r\n          <FhInput v-if=\"!isGuestAccount\" :model-value=\"props.username\" label=\"Customer Number\" disabled :wrapper-attrs=\"{ class: 'lg:col-span-2' }\" />\r\n          <FhInput :model-value=\"props.email\" label=\"Email\" disabled :wrapper-attrs=\"{ class: 'lg:col-span-2' }\" />\r\n        </div>\r\n        <form class=\"flex flex-col\" @submit.prevent=\"submit\">\r\n          <div class=\"mb-14 mt-f4 flex flex-col\">\r\n            <FhNewPassword\r\n              v-model=\"model.password\"\r\n              :label-password=\"'Password'\"\r\n              :label-confirm=\"'Confirm Password'\"\r\n              :placeholder-password=\"'Enter password'\"\r\n              :placeholder-confirm=\"'Confirm password'\"\r\n            >\r\n            </FhNewPassword>\r\n          </div>\r\n          <div class=\"flex flex-col gap-3 md:items-start md:self-end\">\r\n            <FhButton type=\"submit\" color=\"primary\" :disabled=\"vuelidate.$invalid || props.isLoading\" :is-loading=\"props.isLoading\">Create Account</FhButton>\r\n          </div>\r\n        </form>\r\n      </div>\r\n    </template>\r\n  </FhFullscreenFocusedLayout>\r\n</template>\r\n","<script setup>\r\nimport { ref, computed } from \"vue\";\r\nimport { useSignUpMutation } from \"@/api/signUpApi\";\r\nimport { useLoginMutation } from \"@/api/authApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\nimport FhCreateAccountPresenter from \"@/components/FhCreateAccountPresenter.vue\";\r\nimport { SUPPORT_PHONE_NUMBER } from \"@/constants/strings\";\r\n\r\nconst props = defineProps({\r\n  userId: {\r\n    type: [String, Number],\r\n    required: true\r\n  },\r\n  token: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  companyName: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  username: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  email: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  isInvalid: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  guestAccount: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst { mutate: signUpMutate, isLoading: isSignUpMutationRunning } = useSignUpMutation();\r\nconst { mutate: loginMutate, isLoading: isLoginMutationRunning } = useLoginMutation();\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst isLoading = computed(() => isSignUpMutationRunning.value || isLoginMutationRunning.value);\r\n\r\nconst isSignUpComplete = ref(false);\r\nconst isLoginComplete = ref(false);\r\n\r\nfunction handleSubmit({ password }) {\r\n  signUpMutate(\r\n    {\r\n      userId: props.userId,\r\n      token: props.token,\r\n      password\r\n    },\r\n    {\r\n      onSuccess: () => {\r\n        isSignUpComplete.value = true;\r\n        login(password);\r\n      },\r\n      onError: () => {\r\n        notificationStore.notifyError(\r\n          `Sorry, something went wrong and we could not create your account. Please try again or contact support at ${SUPPORT_PHONE_NUMBER} if the problem persists.`\r\n        );\r\n      }\r\n    }\r\n  );\r\n}\r\n\r\nfunction login(password) {\r\n  loginMutate(\r\n    {\r\n      username: props.guestAccount ? props.email : props.username,\r\n      password: password\r\n    },\r\n    {\r\n      onSuccess: () => {\r\n        isLoginComplete.value = true;\r\n      }\r\n    }\r\n  );\r\n}\r\n</script>\r\n\r\n<template>\r\n  <FhCreateAccountPresenter\r\n    :company-name=\"props.companyName\"\r\n    :username=\"props.username\"\r\n    :email=\"props.email\"\r\n    :is-loading=\"isLoading\"\r\n    :is-sign-up-complete=\"isSignUpComplete\"\r\n    :is-login-complete=\"isLoginComplete\"\r\n    :is-invalid=\"props.isInvalid\"\r\n    :guest-account=\"props.guestAccount\"\r\n    @submit=\"handleSubmit\"\r\n  />\r\n</template>\r\n","<script setup>\r\nimport { ref } from \"vue\";\r\nconst props = defineProps({\r\n  src: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  poster: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  autoplay: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  loop: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  playsinline: {\r\n    type: Boolean,\r\n    default: true\r\n  },\r\n  controls: {\r\n    type: Boolean,\r\n    defaul: false\r\n  }\r\n});\r\nconst emit = defineEmits([\"vidloaded\"]);\r\nconst videoPlayer = ref(null);\r\nconst isPlaying = ref(true);\r\nconst videoToggle = () => {\r\n  const video = videoPlayer.value;\r\n  if (isPlaying.value) {\r\n    video.pause();\r\n  } else {\r\n    video.play();\r\n  }\r\n  isPlaying.value = !isPlaying.value;\r\n};\r\nconst videoFrameLoaded = () => {\r\n  emit(\"vidloaded\", videoPlayer.value);\r\n};\r\n</script>\r\n\r\n<template>\r\n  <div class=\"relative\">\r\n    <video\r\n      ref=\"videoPlayer\"\r\n      class=\"fh_video\"\r\n      :src=\"props.src\"\r\n      :poster=\"props.poster\"\r\n      :autoplay=\"props.autoplay\"\r\n      :loop=\"props.loop\"\r\n      :controls=\"props.controls\"\r\n      :playsinline=\"props.playsinline\"\r\n      muted\r\n      @loadeddata=\"videoFrameLoaded\"\r\n    />\r\n    <slot v-if=\"$slots.overlay\" name=\"overlay\" :video-toggle=\"videoToggle\" :is-playing=\"isPlaying\"></slot>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhVideo from \"@/components/FhVideo.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    default: null\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isVideo: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst { layout, image, imageAltText, heading, eyebrowText, description, linkText, linkUrl, linkAltText, linkTarget, gaTagging } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <!-- CTA BLOCK FLEX CONTAINER -->\r\n    <div\r\n      class=\"widget__container w-full\"\r\n      :class=\"['flex flex-col-reverse md:flex-row', layout === 'imageLeft' || layout === 'imageLeft6040' ? 'md:flex-row-reverse' : '']\"\r\n    >\r\n      <!-- CTA BLOCK CONTENT -->\r\n      <div\r\n        class=\"widget__containerItem widget__containerItem--text\"\r\n        :class=\"[\r\n          'flex flex-col md:items-start',\r\n          layout === 'default' || layout === 'imageLeft' ? 'justify-center md:w-6/12 p-f6 lg:p-f15' : '',\r\n          layout === 'imageLeft6040' || layout === 'imageRight6040' ? 'justify-center md:w-5/12 lg:w-4/12 p-f6 lg:p-f10' : ''\r\n        ]\"\r\n      >\r\n        <!-- CTA BLOCK CONTENT Eyebrow Text -->\r\n        <h2 v-if=\"eyebrowText\" class=\"text-base pb-3\" aria-level=\"2\">{{ eyebrowText }}</h2>\r\n        <!-- CTA BLOCK CONTENT TITLE -->\r\n        <h5 v-if=\"heading\" class=\"mb-8 font-serif text-f-4xl-8xl md:mb-10\" role=\"heading\" aria-level=\"5\">\r\n          {{ heading }}\r\n        </h5>\r\n        <p v-if=\"description\" class=\"mb-f5 text-f-base-2xl\" v-html=\"description\"></p>\r\n        <!-- CTA BLOCK LINK -->\r\n        <FhButton\r\n          v-if=\"linkText != ''\"\r\n          class=\"text-center\"\r\n          v-bind=\"{ href: linkUrl, variant: 'default', inverse: false }\"\r\n          :target=\"linkTarget\"\r\n          :aria-label=\"linkAltText\"\r\n          :data-ga=\"gaTagging\"\r\n        >\r\n          {{ linkText }}\r\n        </FhButton>\r\n      </div>\r\n      <!-- CTA BLOCK IMAGE -->\r\n      <div\r\n        v-if=\"image\"\r\n        class=\"widget__containerItem widget__containerItem--image w-full\"\r\n        :class=\"[\r\n          layout === 'default' || layout === 'imageLeft' ? 'md:w-6/12' : '',\r\n          layout === 'imageLeft6040' ? 'md:w-7/12 lg:w-8/12' : '',\r\n          layout === 'imageRight6040' ? 'md:w-7/12 lg:w-8/12' : ''\r\n        ]\"\r\n      >\r\n        <FhVideo v-if=\"props.isVideo\" :src=\"image\" :autoplay=\"true\" :loop=\"true\" :controls=\"false\"></FhVideo>\r\n        <img v-else class=\"w-full h-full object-cover\" :src=\"image\" :alt=\"imageAltText\" />\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhCtaListingItem from \"./FhCtaListing/FhCtaListingItem.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { ctas, gaTagging } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    aria-label=\"CTA Listing\"\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div :class=\"ctas.length > 1 ? 'grid gap-y-16 md:grid-cols-2 md:grid-rows-1 md:gap-y-0 md:gap-x-4 md:pt-4 lg:gap-x-20 lg:pt-14' : 'mx-auto max-w-2xl'\">\r\n      <FhCtaListingItem\r\n        v-for=\"cta in ctas\"\r\n        :key=\"cta.id\"\r\n        :cta=\"cta\"\r\n        :ga-tagging=\"gaTagging\"\r\n        class=\"first:md:mb-f15 last:md:mt-f15 only:md:my-f10\"\r\n      ></FhCtaListingItem>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.text-white * {\r\n  color: white;\r\n}\r\n</style>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhDepartment from \"./FhDepartments/FhDepartment.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { linkUrl, linkTarget, linkAltText, linkText, departments } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    aria-label=\"Departments\"\r\n    :base=\"style.base\"\r\n    class=\"mx-auto max-w-[1530px]\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div class=\"grid grid-cols-1 gap-4 md:grid-cols-2 md:gap-x-f10 md:gap-y-f8 md:pt-f5\">\r\n      <FhDepartment v-for=\"department in departments\" :key=\"department.id\" :department=\"department\"></FhDepartment>\r\n    </div>\r\n    <div v-if=\"linkText\" class=\"mt-f8 flex flex-col justify-center md:flex-row md:items-center\">\r\n      <fh-button :wide=\"true\" :aria-label=\"linkAltText\" :target=\"linkTarget\" :href=\"linkUrl\">{{ linkText }}</fh-button>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.text-white * {\r\n  color: white;\r\n}\r\n</style>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { title, items } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div class=\"flex flex-col items-start\">\r\n      <h2 class=\"mb-4 font-serif text-f-2xl-5xl lg:mb-6\" role=\"heading\" aria-level=\"3\">{{ title }}</h2>\r\n      <ul :class=\"['block list-none columns-1 gap-8', items.length > 5 ? 'md:columns-2' : 'md-columns-1']\">\r\n        <li v-for=\"item in items\" :key=\"item.id\" class=\"break-inside-avoid\">\r\n          <a :href=\"item.ctaURL\" :aria-label=\"item.ariaLabel\" :target=\"item.ctaTarget\" class=\"mb-2 flex\" download>\r\n            <span\r\n              :class=\"`pr-3 after:-mr-3 after:inline-block after:h-[12px] after:w-[12px] after:bg-[url('/src/assets/icons/icon-download.svg')] after:bg-contain after:bg-center after:content-['']`\"\r\n              ><span class=\"underline\">{{ item.ctaText }}</span\r\n              >&nbsp;&nbsp;</span\r\n            >\r\n          </a>\r\n        </li>\r\n      </ul>\r\n      <hr class=\"my-f8 self-stretch text-neutral-30\" />\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport { ref, computed } from \"vue\";\r\nimport FhVideo from \"@/components/FhVideo.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isVideo: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst {\r\n  title = ref(null),\r\n  description = ref(null),\r\n  imageSrc = ref(null),\r\n  imageAltText = ref(null),\r\n  caption = ref(null),\r\n  linkUrl = ref(null),\r\n  linkTarget = ref(null),\r\n  linkText = ref(null),\r\n  linkAriaLabel = ref(null),\r\n  gaTagging,\r\n  horizontalPositioning = ref(null),\r\n  verticalPositioning = ref(null)\r\n} = getDataRefs(props.data);\r\n\r\nconst aspect = ref(null);\r\n\r\nconst aspectRatio = computed(() => {\r\n  if (!aspect.value) return \"0\";\r\n  else return `${aspect.value * 100}%`;\r\n});\r\n\r\nconst getImageAspect = () => {\r\n  const tempImage = document.createElement(\"img\");\r\n  tempImage.onload = function () {\r\n    aspect.value = parseInt(this.height) / parseInt(this.width);\r\n  };\r\n  tempImage.src = imageSrc.value;\r\n};\r\n\r\ngetImageAspect();\r\n</script>\r\n\r\n<template>\r\n  <!-- eslint-disable vue/no-v-html -->\r\n  <FhSection\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div class=\"fh-figure relative flex\">\r\n      <figure :class=\"[title || description || linkText ? 'inset-0 h-full w-full object-cover' : 'flex flex-col gap-f3', { absolute: !isVideo }]\">\r\n        <FhVideo\r\n          v-if=\"isVideo\"\r\n          :src=\"imageSrc\"\r\n          autoplay\r\n          muted\r\n          loop\r\n          :controls=\"false\"\r\n          :class=\"title || description || linkText ? 'h-full w-full object-fill' : 'h-auto max-w-full'\"\r\n          @load=\"getImageAspect\"\r\n        ></FhVideo>\r\n        <img\r\n          v-else\r\n          :src=\"imageSrc\"\r\n          :alt=\"imageAltText\"\r\n          :class=\"title || description || linkText ? 'h-full w-full object-cover' : 'h-auto max-w-full'\"\r\n          @load=\"getImageAspect\"\r\n        />\r\n        <figcaption v-if=\"caption && !(title || description || linkText)\" class=\"px-4 text-f-sm-base text-neutral-50\" v-html=\"caption\"></figcaption>\r\n      </figure>\r\n\r\n      <div\r\n        v-if=\"title || description || linkText\"\r\n        :class=\"['z-10 flex min-h-[min(400px,60vh)] w-full py-f10 px-f5 content', verticalPositioning ?? '', horizontalPositioning ?? '']\"\r\n      >\r\n        <div :class=\"['flex flex-col gap-1', verticalPositioning.replace('items', 'justify') ?? '', horizontalPositioning.replace('justify', 'items') ?? '']\">\r\n          <h2\r\n            v-if=\"title\"\r\n            :class=\"[\r\n              'w-full max-w-[675px] whitespace-pre-line font-serif text-f-4xl-8xl font-light leading-[1.25] text-white',\r\n              description ? 'mb-f3' : 'mb-f5'\r\n            ]\"\r\n            v-html=\"title\"\r\n          ></h2>\r\n          <p\r\n            v-if=\"description\"\r\n            class=\"mb-f5 w-full max-w-[600px] whitespace-pre-line text-f-base-2xl font-light leading-[1.25] text-white\"\r\n            v-html=\"description\"\r\n          ></p>\r\n          <FhButton v-if=\"linkText\" :inverse=\"true\" :href=\"linkUrl\" :target=\"linkTarget\" :aria-label=\"linkAriaLabel\" :data-ga=\"gaTagging\" color=\"primary\"\r\n            >{{ linkText }}\r\n          </FhButton>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style scoped lang=\"pcss\">\r\n.fh-figure {\r\n  --padding: v-bind(aspectRatio);\r\n  display: grid;\r\n  grid-template-columns: 1fr;\r\n  grid-template-rows: 1fr;\r\n\r\n  & * {\r\n    grid-area: 1 / 2 / 1 / 1;\r\n  }\r\n  &::before {\r\n    content: \"\";\r\n    pointer-events: none;\r\n    padding-top: var(--padding);\r\n    align-self: start;\r\n    grid-area: 1 / 2 / 1 / 1;\r\n  }\r\n}\r\n@media (max-width: 767px) {\r\n  .object-fill {\r\n    object-fit: inherit !important;\r\n  }\r\n}\r\n:deep(.fh_video) {\r\n  @apply h-full w-full object-fill;\r\n}\r\n</style>\r\n","import { ref } from \"vue\";\r\nimport { defineStore } from \"pinia\";\r\nimport { send_user_dimension } from \"@/util/googleAnalytics\";\r\n\r\nexport const useUserStore = defineStore(\"user\", () => {\r\n  const user = ref(null);\r\n\r\n  const init = (userObj) => {\r\n    user.value = userObj;\r\n    send_user_dimension(user.value);\r\n  };\r\n\r\n  return {\r\n    user,\r\n    init\r\n  };\r\n});\r\n","import { ref } from \"vue\";\r\nimport { defineStore } from \"pinia\";\r\n\r\nexport const useFeaturesStore = defineStore(\"features\", () => {\r\n  const features = ref({});\r\n\r\n  const init = (featuresObj) => {\r\n    features.value = featuresObj;\r\n  };\r\n\r\n  const getFeatureValue = (featureName) => {\r\n    if (!Object.hasOwn(features.value, featureName)) return false;\r\n\r\n    return features.value[featureName];\r\n  };\r\n\r\n  return {\r\n    features,\r\n    getFeatureValue,\r\n    init\r\n  };\r\n});\r\n","<script setup>\r\nimport { useUserStore } from \"@/stores/UserStore\";\r\nimport { useFeaturesStore } from \"@/stores/FeaturesStore\";\r\nimport { reactive } from \"vue\";\r\nconst props = defineProps({\r\n  globalState: {\r\n    type: Object,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nconst userStore = useUserStore();\r\nconst featuresStore = useFeaturesStore();\r\nconst stateObj = reactive({\r\n  user: props.globalState?.userState || null,\r\n  features: props.globalState.features\r\n});\r\n\r\nif (stateObj.user) {\r\n  userStore.init(stateObj.user);\r\n}\r\n\r\nfeaturesStore.init(stateObj.features);\r\n</script>\r\n<template>\r\n  <slot></slot>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhCard from \"@/components/FhCard.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport { PRICING_LEVELS_MARK_UP, CAD_PRICING } from \"@/constants/account\";\r\nconst props = defineProps({\r\n  id: {\r\n    type: String || Number,\r\n    default: null\r\n  },\r\n  name: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  email: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pricingVisibility: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  markup: {\r\n    type: Number,\r\n    default: 0\r\n  }\r\n});\r\nconst emits = defineEmits([\"update\", \"delete\"]);\r\nconst markup = computed(() => (props.markup != null ? props.markup : 0));\r\n\r\n//const pricing_visibilities = computed(() => PRICING_LEVELS_MARK_UP(markup.value));   --this code block is required after removeing feature flag\r\nconst pricing_visibilities = computed(() => {\r\n  const markupValues = PRICING_LEVELS_MARK_UP(markup.value);\r\n  return [...markupValues, ...CAD_PRICING];\r\n});\r\n\r\nconst pricing = computed(() => {\r\n  const selectedLevel = pricing_visibilities.value.find((level) => level.value === props.pricingVisibility);\r\n  return selectedLevel ? selectedLevel.text : \"\";\r\n});\r\nconst handleClickTriggers = (click_type) => {\r\n  switch (click_type) {\r\n    case \"update\": {\r\n      emits(\"update\", props.id);\r\n      break;\r\n    }\r\n    case \"delete\": {\r\n      emits(\"delete\", props.id);\r\n      break;\r\n    }\r\n  }\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhCard>\r\n    <div class=\"flex flex-col gap-f4\">\r\n      <ul class=\"flex flex-col gap-1\">\r\n        <li class=\"text-body-lg mb-f0.5\">{{ props.name }}</li>\r\n        <li class=\"text-neutral-50\">{{ props.email }}</li>\r\n        <li class=\"text-neutral-50\">Pricing Visibility: {{ pricing }}</li>\r\n      </ul>\r\n      <section class=\"flex gap-4\">\r\n        <FhButton variant=\"link\" :aria-label=\"AriaClickText\" @click=\"handleClickTriggers('update')\">Update</FhButton>\r\n        <FhButton variant=\"link\" :aria-label=\"AriaClickText\" @click=\"handleClickTriggers('delete')\">Remove</FhButton>\r\n      </section>\r\n    </div>\r\n  </FhCard>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhGuestAccountCard from \"@/components/FhGuestAccountCard.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  hasError: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isEmpty: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  markup: {\r\n    type: Number,\r\n    default: 0\r\n  }\r\n});\r\n\r\nconst emits = defineEmits([\"delete\", \"update\"]);\r\n\r\nconst guestAccounts = computed(() => props.modelValue);\r\nconst isguestAccountsDataEmpty = computed(() => guestAccounts.value.length === 0);\r\nconst hasError = computed(() => props.hasError);\r\n</script>\r\n\r\n<template>\r\n  <div v-if=\"!isEmpty && !hasError\" class=\"grid gap-f3 md:grid-cols-2\">\r\n    <FhGuestAccountCard\r\n      v-for=\"guestAccount in guestAccounts\"\r\n      :id=\"guestAccount.id\"\r\n      :key=\"guestAccount.id\"\r\n      :name=\"guestAccount.name\"\r\n      :email=\"guestAccount.email\"\r\n      :markup=\"props.markup\"\r\n      :pricing-visibility=\"guestAccount.pricingVisibility\"\r\n      @delete=\"(guestAccountId) => emits('delete', guestAccountId)\"\r\n      @update=\"(guestAccountId) => emits('update', guestAccountId)\"\r\n    ></FhGuestAccountCard>\r\n  </div>\r\n  <div v-if=\"hasError\">\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">Sorry, we are not able to load your guest accounts at this time.</p>\r\n  </div>\r\n  <div v-else-if=\"!isEmpty && isguestAccountsDataEmpty\">\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">You have no Guest Accounts with that name or email.</p>\r\n  </div>\r\n  <div v-else-if=\"isEmpty && isguestAccountsDataEmpty\">\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">You have no saved Guest Accounts.</p>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed, reactive } from \"vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhSelect from \"@/components/FhSelect.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport { PRICING_LEVELS, PRICING_LEVELS_MARK_UP, CAD_PRICING } from \"@/constants\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, required } from \"@vuelidate/validators\";\r\nimport FhTooltip from \"./FhTooltip.vue\";\r\nconst props = defineProps({\r\n  isCreating: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  editMode: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  accountDetails: {\r\n    type: Object,\r\n    default: () => {}\r\n  },\r\n  error: {\r\n    type: Object,\r\n    default: null\r\n  },\r\n  markup: {\r\n    type: Number,\r\n    default: 0\r\n  },\r\n  showPriceMarkup: {\r\n    type: Boolean, // Just using this as a feature flag\r\n    default: false\r\n  },\r\n  showCADPricing: {\r\n    type: Boolean, // Just using this as a feature flag\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emits = defineEmits([\"create\", \"update\"]);\r\n\r\nconst initialState = {\r\n  name: null,\r\n  email: null,\r\n  pricingVisibility: null\r\n};\r\n\r\nconst errorObject = computed(() => {\r\n  return props.error?.response;\r\n});\r\n\r\nconst formData = reactive({ ...initialState, ...props.accountDetails });\r\n\r\nconst editMode = computed(() => props.editMode);\r\n\r\nconst emailValidation = helpers.regex(/^[\\w-.]+@([\\w-]+\\.)+[\\w-]{2,}$/);\r\nconst markup = computed(() => (props.markup != null ? props.markup : 0));\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    name: { mustHave: helpers.withMessage(\"Please enter a name for the account.\", required) },\r\n    email: {\r\n      mustHave: helpers.withMessage(\"Please enter an email for the account.\", required),\r\n      email: helpers.withMessage(\r\n        \"The email must be valid and can contain only alphanumeric characters and some special characters (_, -, ., @).\",\r\n        emailValidation\r\n      )\r\n    },\r\n    pricingVisibility: { mustHave: helpers.withMessage(\"Please select a pricing level for the account.\", required) }\r\n  },\r\n  formData\r\n);\r\n\r\nconst isCreatingAccount = computed(() => props.isCreating);\r\n\r\nconst createAccount = () => {\r\n  if (errorObject.value) errorObject.value = null;\r\n  if (editMode.value) {\r\n    emits(\"update\", formData);\r\n  } else {\r\n    emits(\"create\", formData);\r\n  }\r\n};\r\n\r\nconst reset = () => {\r\n  vuelidate.value.$reset();\r\n  formData.name = null;\r\n  formData.email = null;\r\n  formData.pricingVisibility = null;\r\n};\r\n\r\n//TODO: Feature Price Markup - remove refactor when ready to release or feature is complete\r\n//TODO: Feature CAD MAP/MSRP - remove refactor when ready to release or feature is complete\r\n//Look into turning this into a compostable since its used in a few spots\r\nconst pricing_visibilities = computed(() => {\r\n  if (props.showPriceMarkup && props.showCADPricing) {\r\n    return [...PRICING_LEVELS_MARK_UP(markup.value), ...CAD_PRICING];\r\n  } else if (props.showPriceMarkup && !props.showCADPricing) {\r\n    return PRICING_LEVELS_MARK_UP(markup.value);\r\n  } else if (!props.showPriceMarkup && props.showCADPricing) {\r\n    return [...PRICING_LEVELS, ...CAD_PRICING];\r\n  } else {\r\n    return PRICING_LEVELS;\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <FhModal ref=\"modal\" :data=\"{ heading: editMode != true ? 'Create a Guest Account' : 'Edit a Guest Account' }\" @close=\"reset\">\r\n    <template #activator=\"{ open }\">\r\n      <slot name=\"activator\" :open=\"open\"></slot>\r\n    </template>\r\n    <template #body>\r\n      <form id=\"guestAccountForm\" @submit.prevent=\"createAccount\">\r\n        <fieldset class=\"mb-f8\">\r\n          <legend class=\"mb-f4 text-f-xl-2xl\">Account Details</legend>\r\n          <div class=\"flex flex-col gap-f3\">\r\n            <FhInput v-model=\"formData.name\" label=\"Name\" required :vuelidate=\"vuelidate.name\" />\r\n            <FhInput v-model=\"formData.email\" label=\"Email\" required :vuelidate=\"vuelidate.email\" :disabled=\"editMode\" />\r\n            <label class=\"-mb-5 flex gap-f1\">\r\n              Pricing Visibility\r\n              <FhTooltip v-if=\"showPriceMarkup\" class=\"mr-2 ml-2\"\r\n                >Select from one of the pre-configured pricing options below or go to My Account to set or update your unique price markup.</FhTooltip\r\n              >\r\n              <span class=\"text-body-xs leading-6 text-neutral-50\"> (Required)</span>\r\n            </label>\r\n            <FhSelect\r\n              v-model=\"formData.pricingVisibility\"\r\n              :options=\"pricing_visibilities\"\r\n              placeholder=\"Select a pricing visibility\"\r\n              required\r\n              :vuelidate=\"vuelidate.pricingVisibility\"\r\n            />\r\n          </div>\r\n          <div v-if=\"errorObject\" class=\"mt-3 flex items-center gap-2 py-2 text-brand-red\">\r\n            <div>\r\n              <fh-icon name=\"AlertCircle\" />\r\n            </div>\r\n            <div v-html=\"errorObject.data\"></div>\r\n          </div>\r\n        </fieldset>\r\n      </form>\r\n    </template>\r\n    <template #footer=\"{ close }\">\r\n      <FhButton type=\"submit\" form=\"guestAccountForm\" color=\"primary\" :disabled=\"vuelidate.$invalid || isCreatingAccount\" :is-loading=\"isCreatingAccount\">{{\r\n        editMode ? \"Update\" : \"Save\"\r\n      }}</FhButton>\r\n      <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n\r\n<style scoped>\r\n.leading-6 {\r\n  line-height: 1.5rem !important;\r\n}\r\n</style>\r\n","import axiosClient from \"@/api/axiosClient\";\r\nimport { useQuery, useQueryClient, useMutation } from \"@tanstack/vue-query\";\r\n\r\nconst QUERY_KEY_BASE = \"guest_accounts\";\r\n\r\nexport const useGuestAccountQuery = (params, options) => {\r\n  return useQuery({\r\n    ...(options || {}),\r\n    queryKey: [QUERY_KEY_BASE],\r\n    queryFn: () => axiosClient.get(\"/account/guest-accounts\", { params }),\r\n    refetchOnWindowFocus: false\r\n  });\r\n};\r\n\r\nexport function useDeleteGuestAccountMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (id) => axiosClient.delete(`/account/guest-accounts/${id}`),\r\n    onSuccess: (_data, deletedId) => {\r\n      // Remove the deleted card from the query cache(s)\r\n      queryClient.setQueriesData([QUERY_KEY_BASE], (existingGuestAccounts) => {\r\n        let deleteGuestAccountIndex = existingGuestAccounts.findIndex((guestAccount) => guestAccount.id === deletedId);\r\n        if (deleteGuestAccountIndex < 0) {\r\n          return existingGuestAccounts;\r\n        } else {\r\n          return [...existingGuestAccounts.slice(0, deleteGuestAccountIndex), ...existingGuestAccounts.slice(deleteGuestAccountIndex + 1)];\r\n        }\r\n      });\r\n    }\r\n  });\r\n}\r\n\r\nexport function useCreateGuestAccountMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: ({ name, email, pricingVisibility }) =>\r\n      axiosClient.post(\"/account/guest-accounts\", {\r\n        name,\r\n        email,\r\n        pricingVisibility\r\n      }),\r\n    onSuccess: (newGuestAccount) => {\r\n      const queryKeyFilter = [QUERY_KEY_BASE];\r\n      queryClient.setQueriesData({ queryKey: queryKeyFilter }, (guestAccounts) => {\r\n        return [newGuestAccount, ...(guestAccounts || [])];\r\n      });\r\n    }\r\n  });\r\n}\r\n\r\nexport function useUpdateGuestAccountMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: ({ id, name, email, pricingVisibility }) =>\r\n      axiosClient.put(`/account/guest-accounts/${id}`, {\r\n        name,\r\n        email,\r\n        pricingVisibility\r\n      }),\r\n    onSuccess: (updatedGuestAccount) => {\r\n      const queryKeyFilter = [QUERY_KEY_BASE];\r\n      queryClient.setQueriesData({ queryKey: queryKeyFilter }, (guestAccounts) => {\r\n        const updateGuestAccounts = guestAccounts.map((guestAccount) => {\r\n          if (guestAccount.id === updatedGuestAccount.id) {\r\n            return {\r\n              ...guestAccount,\r\n              name: updatedGuestAccount.name,\r\n              pricingVisibility: updatedGuestAccount.pricingVisibility\r\n            };\r\n          } else {\r\n            return guestAccount;\r\n          }\r\n        });\r\n\r\n        return updateGuestAccounts;\r\n      });\r\n    }\r\n  });\r\n}\r\n\r\nexport function useAccountPriceMarkup(options) {\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: () => axiosClient.get(`/account/markup`),\r\n    onSuccess: (accountMarkupResponse) => accountMarkupResponse\r\n  });\r\n}\r\n\r\nexport function useUpdateAccountPriceMarkup(options) {\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (markupObject) => axiosClient.patch(`/account/markup`, markupObject),\r\n    onSuccess: (accountMarkupResponse) => accountMarkupResponse\r\n  });\r\n}\r\n","<script setup>\r\nimport { computed, ref, nextTick, watch } from \"vue\";\r\nimport FhGuestAccountListPresenter from \"@/components/FhGuestAccountListPresenter.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhLoader from \"@/components/FhLoader.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhGuestAccountForm from \"@/components/FhGuestAccountForm.vue\";\r\nimport { useGuestAccountQuery, useDeleteGuestAccountMutation, useCreateGuestAccountMutation, useUpdateGuestAccountMutation } from \"@/api/accountApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\nimport FhPaginationNav from \"@/components/FhPaginationNav.vue\";\r\nimport { usePaginatedList } from \"@/composables\";\r\nimport scrollToTopOf from \"@/util/scrollToTopOf\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\n\r\nconst props = defineProps({\r\n  perPage: {\r\n    type: Number,\r\n    default: 12\r\n  },\r\n  priceMarkup: {\r\n    type: Object,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nconst showDeleteModal = ref(false);\r\nconst showAccountForm = ref(false);\r\nconst guestAccountIdToDelete = ref(null);\r\nconst isEditForm = ref(false);\r\nconst guestAccountToModify = ref(null);\r\nconst rootElem = ref(null);\r\nconst PER_PAGE = ref(props.perPage);\r\nconst showPriceMarkup = ref(props.priceMarkup?.showPriceMarkup || false);\r\nconst markup = ref(props.priceMarkup.markup);\r\nconst showCADPricing = ref(props.priceMarkup?.showCADPricing || false);\r\nconst notificationStore = useNotificationStore();\r\nlet { isLoading, isError, data: guestAccountsData } = useGuestAccountQuery();\r\nconst { isLoading: deleteMutationLoading, mutate: deleteAccountMutate } = useDeleteGuestAccountMutation();\r\nconst { isLoading: createMutationLoading, mutate: createAccountMutate, error: createAccountError } = useCreateGuestAccountMutation();\r\nconst { isLoading: updateMutationLoading, mutate: updateAccountMutate } = useUpdateGuestAccountMutation();\r\n\r\nconst guestAccounts = computed(() => (isLoading.value ? [] : guestAccountsData.value));\r\n\r\nconst searchQuery = ref(\"\");\r\nconst filteredItems = computed(() => {\r\n  const query = searchQuery.value.toLowerCase().trim();\r\n  if (!query) {\r\n    return guestAccounts.value;\r\n  }\r\n  return guestAccounts.value.filter((item) => {\r\n    return item.name.toLowerCase().includes(query) || item.email.toLowerCase().includes(query);\r\n  });\r\n});\r\n\r\nlet { page, totalPages, sublist: pageGuestAccounts } = usePaginatedList(filteredItems, PER_PAGE.value);\r\n\r\nwatch(searchQuery, () => {\r\n  ({ page, totalPages, sublist: pageGuestAccounts } = usePaginatedList(filteredItems, PER_PAGE.value));\r\n});\r\nconst isguestAccountsDataEmpty = computed(() => guestAccountsData.value.length === 0);\r\nconst handleDeleteGuestAccount = (guestAccountId) => {\r\n  guestAccountIdToDelete.value = guestAccountId;\r\n  showDeleteModal.value = true;\r\n};\r\n\r\nconst closeDeleteModal = () => {\r\n  showDeleteModal.value = false;\r\n  guestAccountIdToDelete.value = null;\r\n};\r\n\r\nconst accountModalTrigger = (val) => {\r\n  showAccountForm.value = val;\r\n  guestAccountToModify.value = null;\r\n  isEditForm.value = false;\r\n};\r\n\r\nconst removeCreditCard = () => {\r\n  deleteAccountMutate(guestAccountIdToDelete.value, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Guest account removed.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not remove that guest account.\"),\r\n    onSettled: () => {\r\n      closeDeleteModal();\r\n    }\r\n  });\r\n};\r\n\r\nconst createGuestAccount = (accountDetails) => {\r\n  createAccountMutate(accountDetails, {\r\n    onSuccess: () => {\r\n      notificationStore.notifySuccess(\"Your guest account has been created. An email has been sent to the account with further details.\");\r\n      accountModalTrigger(false);\r\n      if (page.value !== 1) {\r\n        page.value = 1;\r\n      }\r\n      rootElem.value.scrollIntoView(true);\r\n    },\r\n    onError: (error) => {\r\n      const { response } = error;\r\n      if (response.status != 409) {\r\n        notificationStore.notifyError(\"Sorry, something went wrong and we could not create that guest account.\");\r\n        accountModalTrigger(false);\r\n      }\r\n    }\r\n  });\r\n};\r\n\r\nconst updateGuestAccount = (accountDetails) => {\r\n  updateAccountMutate(accountDetails, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Guest account updated.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not update that guest account.\"),\r\n    onSettled: () => {\r\n      accountModalTrigger(false);\r\n      guestAccountToModify.value = null;\r\n      isEditForm.value = false;\r\n    }\r\n  });\r\n};\r\n\r\nconst updateClick = (accountId) => {\r\n  guestAccountToModify.value = guestAccountsData.value.find((guestAccount) => guestAccount.id == accountId);\r\n  isEditForm.value = true;\r\n  showAccountForm.value = true;\r\n};\r\n</script>\r\n\r\n<template>\r\n  <div ref=\"rootElem\" class=\"guestAccountList grid grid-cols-2 gap-y-f4\">\r\n    <FhHeading\r\n      class=\"headerText mb-0\"\r\n      subheading=\"Give your clients or colleagues access to the full Four Hands catalog. For more information, see our Help Topics below.\"\r\n      >Guest Accounts</FhHeading\r\n    >\r\n    <div v-if=\"!isLoading\" class=\"button addButton mt-f4 self-center text-right md:mt-0\">\r\n      <FhButton class=\"w-full md:w-auto\" @click=\"accountModalTrigger(true)\">Add Account</FhButton>\r\n    </div>\r\n    <div class=\"mainContent col-span-2\">\r\n      <div v-if=\"guestAccounts && guestAccounts.length > 0\" class=\"relative max-w-full\">\r\n        <FhInput\r\n          v-model=\"searchQuery\"\r\n          type=\"text\"\r\n          placeholder=\"Search by Guest Account Name or Email\"\r\n          :wrapper-attrs=\"{ class: 'gap-0 bg-white' }\"\r\n          class=\"border-gray-300 mt-5 mb-5 h-full pl-10 md:max-w-md\"\r\n        />\r\n        <FhIcon name=\"Search\" class=\"absolute top-[50%] left-3 -translate-y-1/2 transform text-2xl\" style=\"color: grey\" />\r\n      </div>\r\n\r\n      <FhGuestAccountListPresenter\r\n        v-if=\"!isLoading\"\r\n        v-model=\"pageGuestAccounts\"\r\n        :has-error=\"isError\"\r\n        :is-empty=\"isguestAccountsDataEmpty\"\r\n        :markup=\"markup\"\r\n        @delete=\"handleDeleteGuestAccount\"\r\n        @create=\"createGuestAccount\"\r\n        @update=\"updateClick\"\r\n      ></FhGuestAccountListPresenter>\r\n    </div>\r\n  </div>\r\n  <!-- PAGINATION -->\r\n  <div v-if=\"totalPages > 1\" class=\"mt-f4 md:w-full\">\r\n    <FhPaginationNav v-model:page=\"page\" :total-items=\"guestAccounts.length\" :per-page=\"PER_PAGE\" @page-change=\"nextTick(() => scrollToTopOf(rootElem))\" />\r\n  </div>\r\n  <FhLoader v-if=\"isLoading\" class=\"guestAccount_loader col-span-2 my-f10\" />\r\n  <FhModal :data=\"{ heading: 'Confirm Guest Account Deletion' }\" :is-open=\"showDeleteModal\" @close=\"closeDeleteModal\">\r\n    <template #body>\r\n      <p>This action will permanantely delete this subaccount and any of their associated account data, including shopping lists they've created.</p>\r\n    </template>\r\n    <template #footer=\"{ close }\">\r\n      <FhButton color=\"primary\" :disabled=\"deleteMutationLoading\" :is-loading=\"deleteMutationLoading\" @click=\"removeCreditCard\">Delete</FhButton>\r\n      <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n  <FhGuestAccountForm\r\n    v-if=\"showAccountForm\"\r\n    :is-open=\"showAccountForm\"\r\n    :is-creating=\"createMutationLoading || updateMutationLoading\"\r\n    :account-details=\"guestAccountToModify\"\r\n    :edit-mode=\"isEditForm\"\r\n    :error=\"createAccountError\"\r\n    :markup=\"markup\"\r\n    :show-price-markup=\"showPriceMarkup\"\r\n    :show-c-a-d-pricing=\"showCADPricing\"\r\n    @create=\"createGuestAccount\"\r\n    @update=\"updateGuestAccount\"\r\n    @update:is-open=\"accountModalTrigger\"\r\n  ></FhGuestAccountForm>\r\n</template>\r\n\r\n<style scoped type=\"pcss\">\r\n.headerText {\r\n  grid-area: header-text;\r\n}\r\n.addButton {\r\n  grid-area: add-button;\r\n}\r\n\r\n.mainContent {\r\n  grid-area: main-content;\r\n}\r\n.guestAccountList {\r\n  grid-template-areas:\r\n    \"header-text header-text\"\r\n    \"main-content main-content\"\r\n    \"add-button add-button\";\r\n}\r\n\r\n@screen md {\r\n  .guestAccountList {\r\n    grid-template-areas:\r\n      \"header-text add-button\"\r\n      \"main-content main-content\";\r\n  }\r\n}\r\n.guestAccount_loader {\r\n  @apply h-14 w-14;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport { computed, ref, watch, onMounted } from \"vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhWysiwyg from \"@/includes/FhWysiwyg.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { title, description, ctaTarget, ctaText, ctaAriaLabel, ctaURL, subContent, leftImages, leftImages_AriaLabel, rightImages, rightImages_AriaLabel } =\r\n  getDataRefs(props.data);\r\n\r\nconst trackContainer = ref(null);\r\n\r\nconst trackLeft = ref(null);\r\nconst leftImagesLoadState = ref(leftImages.value.map(() => false));\r\n\r\nconst trackRight = ref(null);\r\nconst rightImagesLoadState = ref(rightImages.value.map(() => false));\r\n\r\nconst allImagesLoaded = computed(() => leftImagesLoadState.value.every((i) => i) && rightImagesLoadState.value.every((i) => i));\r\n\r\nconst mounted = ref(false);\r\nconst _backdoor = ref(0); // reactive property incremented by resize event listener\r\n\r\nconst animationReady = computed(() => {\r\n  _backdoor.value;\r\n  return mounted.value && trackContainer.value && trackLeft.value && trackRight.value && allImagesLoaded.value;\r\n});\r\n\r\nconst animating = ref(false);\r\nwatch(animationReady, () => {\r\n  if (animationReady.value) {\r\n    setTimeout(() => (animating.value = true), 500);\r\n  }\r\n});\r\n\r\nconst animationDuration = computed(() => {\r\n  if (!animationReady.value) return \"0s\";\r\n  // Calculate an animation speed that moves the tracks\r\n  // at a constant velocity regardless of the height of\r\n  // the tracks (which change based on screen size).\r\n\r\n  // Reference reactive property so that a change in\r\n  // its value triggers a recalculation of this\r\n  // computed property\r\n  _backdoor.value;\r\n\r\n  const velocity = 20; // pixels/second\r\n  const distance = Math.max(trackLeft.value.offsetHeight, trackRight.value.offsetHeight); // pixels\r\n\r\n  return `${distance / velocity}s`; // seconds\r\n});\r\n\r\nconst trackOffset = computed(() => {\r\n  if (!animationReady.value) return \"0%\";\r\n  // Reference reactive property so that a change in\r\n  // its value triggers a recalculation of this\r\n  // computed property\r\n  _backdoor.value;\r\n\r\n  const distance = Math.max(trackLeft.value.offsetHeight, trackRight.value.offsetHeight);\r\n  const containerHeight = trackContainer.value.offsetHeight;\r\n  return {\r\n    left: `translateY(${Math.round(((distance - containerHeight) / distance) * 100)}%)`,\r\n    right: `translateY(${Math.round(((distance - containerHeight) / distance) * -100)}%)`\r\n  };\r\n});\r\n\r\nconst recalculateAnimation = () => _backdoor.value++;\r\n\r\nwatch(allImagesLoaded, recalculateAnimation);\r\nonMounted(() => {\r\n  window.addEventListener(\"resize\", recalculateAnimation);\r\n  mounted.value = true;\r\n});\r\n</script>\r\n\r\n<template>\r\n  <section class=\"fh-hero widget--bg-slate flex flex-col-reverse md:min-h-[75vh] md:flex-row\">\r\n    <div class=\"box-border flex flex-[0_0_50%] flex-col justify-center py-8 text-white md:py-24 md:pl-8 md:pr-4\">\r\n      <h1 class=\"mb-f3 font-serif text-f-5xl-9xl\">{{ title }}</h1>\r\n      <FhWysiwyg>\r\n        <!-- eslint-disable-next-line vue/no-v-html -->\r\n        <div v-if=\"description\" class=\"mb-f6 md:max-w-[350px] lg:max-w-[450px]\" v-html=\"description\"></div>\r\n      </FhWysiwyg>\r\n      <FhButton color=\"primary\" inverse :href=\"ctaURL\" :target=\"ctaTarget\" :aria-label=\"ctaAriaLabel\" class=\"text-center md:self-start\">\r\n        {{ ctaText }}\r\n      </FhButton>\r\n      <!-- eslint-disable-next-line vue/no-v-html -->\r\n      <small class=\"mt-f4\" v-html=\"subContent\"></small>\r\n    </div>\r\n    <div class=\"box-border flex h-[300px] md:h-auto md:flex-[0_0_50%]\">\r\n      <div\r\n        ref=\"trackContainer\"\r\n        class=\"relative left-[50%] min-w-[100vw] translate-x-[-50%] overflow-hidden md:left-0 md:min-w-0 md:flex-[1_1_100%] md:translate-x-[0]\"\r\n      >\r\n        <div class=\"absolute top-0 bottom-0 left-0 flex w-[calc(50%-0.75rem)] flex-col justify-end\" :aria-label=\"leftImages_AriaLabel\">\r\n          <div\r\n            ref=\"trackLeft\"\r\n            :class=\"[\r\n              'fh-hero__images fh-hero__images--left easing-ease py--6 flex flex-col gap-[1.5rem] transition-opacity duration-200',\r\n              allImagesLoaded ? 'opacity-1' : 'opacity-0',\r\n              { animating }\r\n            ]\"\r\n          >\r\n            <img\r\n              v-for=\"(image, i) in leftImages\"\r\n              :key=\"image\"\r\n              class=\"w-full flex-[0_0_auto] self-start\"\r\n              :src=\"image\"\r\n              aria-hidden=\"true\"\r\n              @load=\"leftImagesLoadState[i] = true\"\r\n            />\r\n          </div>\r\n        </div>\r\n        <div class=\"absolute top-0 bottom-0 right-0 flex w-[calc(50%-0.75rem)] flex-col justify-start\" :aria-label=\"rightImages_AriaLabel\">\r\n          <div\r\n            ref=\"trackRight\"\r\n            :class=\"[\r\n              'fh-hero__images fh-hero__images--right easing-ease py--6 flex flex-col gap-[1.5rem] transition-opacity duration-200',\r\n              allImagesLoaded ? 'opacity-1' : 'opacity-0',\r\n              { animating }\r\n            ]\"\r\n          >\r\n            <img\r\n              v-for=\"(image, i) in rightImages\"\r\n              :key=\"image\"\r\n              class=\"w-full flex-[0_0_auto] self-start\"\r\n              :src=\"image\"\r\n              aria-hidden=\"true\"\r\n              @load=\"rightImagesLoadState[i] = true\"\r\n            />\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </section>\r\n</template>\r\n\r\n<style scoped lang=\"pcss\">\r\n.fh-hero {\r\n  z-index: 0;\r\n  position: relative;\r\n\r\n  & small {\r\n    &:deep(a) {\r\n      text-decoration: underline;\r\n    }\r\n  }\r\n}\r\n\r\n.fh-hero__images.animating {\r\n  animation-iteration-count: infinite;\r\n  animation-timing-function: cubic-bezier(0.1, 0, 0.9, 1);\r\n  animation-direction: alternate;\r\n  animation-duration: v-bind(\"animationDuration\");\r\n  transform-origin: bottom;\r\n}\r\n\r\n.fh-hero__images--left.animating {\r\n  animation-name: images-slide-left;\r\n  @media (prefers-reduced-motion) {\r\n    animation-play-state: paused;\r\n  }\r\n}\r\n\r\n.fh-hero__images--right.animating {\r\n  animation-name: images-slide-right;\r\n  @media (prefers-reduced-motion) {\r\n    animation-play-state: paused;\r\n  }\r\n}\r\n\r\n@keyframes images-slide-left {\r\n  to {\r\n    transform: v-bind(\"trackOffset.left\");\r\n  }\r\n}\r\n\r\n@keyframes images-slide-right {\r\n  to {\r\n    transform: v-bind(\"trackOffset.right\");\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\n// THIS CAUSES WEB BUILD AND CHROMATIC TO BREAK, THOUGH IT WORKS LOCALLY\r\n// import resolveConfig from \"tailwindcss/resolveConfig\";\r\n// import tailwindConfig from \"../../tailwind.config.js\";\r\n// const fullConfig = resolveConfig(tailwindConfig);\r\n// const mediaLg = computed(() => `(min-width: ${fullConfig.theme.screens.lg})`);\r\n// const mediaMd = computed(() => `(min-width: ${fullConfig.theme.screens.md})`);\r\n\r\nconst mediaLg = computed(() => `(min-width: 1200px)`);\r\nconst mediaMd = computed(() => `(min-width: 768px)`);\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { imagePathMobile, imagePathTablet, imagePathDesktop, imageAltText } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection aria-label=\"About Us Hero\" :base=\"style.base\">\r\n    <picture class=\"w-full\">\r\n      <source :srcset=\"imagePathDesktop\" :media=\"mediaLg\" />\r\n      <source :srcset=\"imagePathTablet\" :media=\"mediaMd\" />\r\n      <img class=\"h-auto w-full\" :src=\"imagePathMobile\" :alt=\"imageAltText\" />\r\n    </picture>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","/**\n * SSR Window 4.0.2\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: December 13, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n  return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;\n}\nfunction extend(target, src) {\n  if (target === void 0) {\n    target = {};\n  }\n  if (src === void 0) {\n    src = {};\n  }\n  Object.keys(src).forEach(key => {\n    if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {\n      extend(target[key], src[key]);\n    }\n  });\n}\nconst ssrDocument = {\n  body: {},\n  addEventListener() {},\n  removeEventListener() {},\n  activeElement: {\n    blur() {},\n    nodeName: ''\n  },\n  querySelector() {\n    return null;\n  },\n  querySelectorAll() {\n    return [];\n  },\n  getElementById() {\n    return null;\n  },\n  createEvent() {\n    return {\n      initEvent() {}\n    };\n  },\n  createElement() {\n    return {\n      children: [],\n      childNodes: [],\n      style: {},\n      setAttribute() {},\n      getElementsByTagName() {\n        return [];\n      }\n    };\n  },\n  createElementNS() {\n    return {};\n  },\n  importNode() {\n    return null;\n  },\n  location: {\n    hash: '',\n    host: '',\n    hostname: '',\n    href: '',\n    origin: '',\n    pathname: '',\n    protocol: '',\n    search: ''\n  }\n};\nfunction getDocument() {\n  const doc = typeof document !== 'undefined' ? document : {};\n  extend(doc, ssrDocument);\n  return doc;\n}\nconst ssrWindow = {\n  document: ssrDocument,\n  navigator: {\n    userAgent: ''\n  },\n  location: {\n    hash: '',\n    host: '',\n    hostname: '',\n    href: '',\n    origin: '',\n    pathname: '',\n    protocol: '',\n    search: ''\n  },\n  history: {\n    replaceState() {},\n    pushState() {},\n    go() {},\n    back() {}\n  },\n  CustomEvent: function CustomEvent() {\n    return this;\n  },\n  addEventListener() {},\n  removeEventListener() {},\n  getComputedStyle() {\n    return {\n      getPropertyValue() {\n        return '';\n      }\n    };\n  },\n  Image() {},\n  Date() {},\n  screen: {},\n  setTimeout() {},\n  clearTimeout() {},\n  matchMedia() {\n    return {};\n  },\n  requestAnimationFrame(callback) {\n    if (typeof setTimeout === 'undefined') {\n      callback();\n      return null;\n    }\n    return setTimeout(callback, 0);\n  },\n  cancelAnimationFrame(id) {\n    if (typeof setTimeout === 'undefined') {\n      return;\n    }\n    clearTimeout(id);\n  }\n};\nfunction getWindow() {\n  const win = typeof window !== 'undefined' ? window : {};\n  extend(win, ssrWindow);\n  return win;\n}\n\nexport { getWindow as a, getDocument as g };\n","import { a as getWindow, g as getDocument } from './ssr-window.esm.mjs';\n\nfunction classesToTokens(classes) {\n  if (classes === void 0) {\n    classes = '';\n  }\n  return classes.trim().split(' ').filter(c => !!c.trim());\n}\n\nfunction deleteProps(obj) {\n  const object = obj;\n  Object.keys(object).forEach(key => {\n    try {\n      object[key] = null;\n    } catch (e) {\n      // no getter for object\n    }\n    try {\n      delete object[key];\n    } catch (e) {\n      // something got wrong\n    }\n  });\n}\nfunction nextTick(callback, delay) {\n  if (delay === void 0) {\n    delay = 0;\n  }\n  return setTimeout(callback, delay);\n}\nfunction now() {\n  return Date.now();\n}\nfunction getComputedStyle(el) {\n  const window = getWindow();\n  let style;\n  if (window.getComputedStyle) {\n    style = window.getComputedStyle(el, null);\n  }\n  if (!style && el.currentStyle) {\n    style = el.currentStyle;\n  }\n  if (!style) {\n    style = el.style;\n  }\n  return style;\n}\nfunction getTranslate(el, axis) {\n  if (axis === void 0) {\n    axis = 'x';\n  }\n  const window = getWindow();\n  let matrix;\n  let curTransform;\n  let transformMatrix;\n  const curStyle = getComputedStyle(el);\n  if (window.WebKitCSSMatrix) {\n    curTransform = curStyle.transform || curStyle.webkitTransform;\n    if (curTransform.split(',').length > 6) {\n      curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');\n    }\n    // Some old versions of Webkit choke when 'none' is passed; pass\n    // empty string instead in this case\n    transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n  } else {\n    transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n    matrix = transformMatrix.toString().split(',');\n  }\n  if (axis === 'x') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;\n    // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);\n    // Normal Browsers\n    else curTransform = parseFloat(matrix[4]);\n  }\n  if (axis === 'y') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;\n    // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);\n    // Normal Browsers\n    else curTransform = parseFloat(matrix[5]);\n  }\n  return curTransform || 0;\n}\nfunction isObject(o) {\n  return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';\n}\nfunction isNode(node) {\n  // eslint-disable-next-line\n  if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n    return node instanceof HTMLElement;\n  }\n  return node && (node.nodeType === 1 || node.nodeType === 11);\n}\nfunction extend() {\n  const to = Object(arguments.length <= 0 ? undefined : arguments[0]);\n  const noExtend = ['__proto__', 'constructor', 'prototype'];\n  for (let i = 1; i < arguments.length; i += 1) {\n    const nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];\n    if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n      const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);\n      for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n        const nextKey = keysArray[nextIndex];\n        const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n        if (desc !== undefined && desc.enumerable) {\n          if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            to[nextKey] = {};\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else {\n            to[nextKey] = nextSource[nextKey];\n          }\n        }\n      }\n    }\n  }\n  return to;\n}\nfunction setCSSProperty(el, varName, varValue) {\n  el.style.setProperty(varName, varValue);\n}\nfunction animateCSSModeScroll(_ref) {\n  let {\n    swiper,\n    targetPosition,\n    side\n  } = _ref;\n  const window = getWindow();\n  const startPosition = -swiper.translate;\n  let startTime = null;\n  let time;\n  const duration = swiper.params.speed;\n  swiper.wrapperEl.style.scrollSnapType = 'none';\n  window.cancelAnimationFrame(swiper.cssModeFrameID);\n  const dir = targetPosition > startPosition ? 'next' : 'prev';\n  const isOutOfBound = (current, target) => {\n    return dir === 'next' && current >= target || dir === 'prev' && current <= target;\n  };\n  const animate = () => {\n    time = new Date().getTime();\n    if (startTime === null) {\n      startTime = time;\n    }\n    const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n    const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n    let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      currentPosition = targetPosition;\n    }\n    swiper.wrapperEl.scrollTo({\n      [side]: currentPosition\n    });\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      swiper.wrapperEl.style.overflow = 'hidden';\n      swiper.wrapperEl.style.scrollSnapType = '';\n      setTimeout(() => {\n        swiper.wrapperEl.style.overflow = '';\n        swiper.wrapperEl.scrollTo({\n          [side]: currentPosition\n        });\n      });\n      window.cancelAnimationFrame(swiper.cssModeFrameID);\n      return;\n    }\n    swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n  };\n  animate();\n}\nfunction getSlideTransformEl(slideEl) {\n  return slideEl.querySelector('.swiper-slide-transform') || slideEl.shadowRoot && slideEl.shadowRoot.querySelector('.swiper-slide-transform') || slideEl;\n}\nfunction elementChildren(element, selector) {\n  if (selector === void 0) {\n    selector = '';\n  }\n  return [...element.children].filter(el => el.matches(selector));\n}\nfunction showWarning(text) {\n  try {\n    console.warn(text);\n    return;\n  } catch (err) {\n    // err\n  }\n}\nfunction createElement(tag, classes) {\n  if (classes === void 0) {\n    classes = [];\n  }\n  const el = document.createElement(tag);\n  el.classList.add(...(Array.isArray(classes) ? classes : classesToTokens(classes)));\n  return el;\n}\nfunction elementOffset(el) {\n  const window = getWindow();\n  const document = getDocument();\n  const box = el.getBoundingClientRect();\n  const body = document.body;\n  const clientTop = el.clientTop || body.clientTop || 0;\n  const clientLeft = el.clientLeft || body.clientLeft || 0;\n  const scrollTop = el === window ? window.scrollY : el.scrollTop;\n  const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n  return {\n    top: box.top + scrollTop - clientTop,\n    left: box.left + scrollLeft - clientLeft\n  };\n}\nfunction elementPrevAll(el, selector) {\n  const prevEls = [];\n  while (el.previousElementSibling) {\n    const prev = el.previousElementSibling; // eslint-disable-line\n    if (selector) {\n      if (prev.matches(selector)) prevEls.push(prev);\n    } else prevEls.push(prev);\n    el = prev;\n  }\n  return prevEls;\n}\nfunction elementNextAll(el, selector) {\n  const nextEls = [];\n  while (el.nextElementSibling) {\n    const next = el.nextElementSibling; // eslint-disable-line\n    if (selector) {\n      if (next.matches(selector)) nextEls.push(next);\n    } else nextEls.push(next);\n    el = next;\n  }\n  return nextEls;\n}\nfunction elementStyle(el, prop) {\n  const window = getWindow();\n  return window.getComputedStyle(el, null).getPropertyValue(prop);\n}\nfunction elementIndex(el) {\n  let child = el;\n  let i;\n  if (child) {\n    i = 0;\n    // eslint-disable-next-line\n    while ((child = child.previousSibling) !== null) {\n      if (child.nodeType === 1) i += 1;\n    }\n    return i;\n  }\n  return undefined;\n}\nfunction elementParents(el, selector) {\n  const parents = []; // eslint-disable-line\n  let parent = el.parentElement; // eslint-disable-line\n  while (parent) {\n    if (selector) {\n      if (parent.matches(selector)) parents.push(parent);\n    } else {\n      parents.push(parent);\n    }\n    parent = parent.parentElement;\n  }\n  return parents;\n}\nfunction elementTransitionEnd(el, callback) {\n  function fireCallBack(e) {\n    if (e.target !== el) return;\n    callback.call(el, e);\n    el.removeEventListener('transitionend', fireCallBack);\n  }\n  if (callback) {\n    el.addEventListener('transitionend', fireCallBack);\n  }\n}\nfunction elementOuterSize(el, size, includeMargins) {\n  const window = getWindow();\n  if (includeMargins) {\n    return el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom'));\n  }\n  return el.offsetWidth;\n}\nfunction makeElementsArray(el) {\n  return (Array.isArray(el) ? el : [el]).filter(e => !!e);\n}\n\nexport { elementParents as a, elementOffset as b, createElement as c, now as d, elementChildren as e, elementOuterSize as f, getSlideTransformEl as g, elementIndex as h, classesToTokens as i, getTranslate as j, elementTransitionEnd as k, isObject as l, makeElementsArray as m, nextTick as n, elementStyle as o, elementNextAll as p, elementPrevAll as q, animateCSSModeScroll as r, setCSSProperty as s, showWarning as t, extend as u, deleteProps as v };\n","import { g as getDocument, a as getWindow } from '../shared/ssr-window.esm.mjs';\nimport { a as elementParents, b as elementOffset } from '../shared/utils.mjs';\n\n/* eslint-disable consistent-return */\nfunction Keyboard(_ref) {\n  let {\n    swiper,\n    extendParams,\n    on,\n    emit\n  } = _ref;\n  const document = getDocument();\n  const window = getWindow();\n  swiper.keyboard = {\n    enabled: false\n  };\n  extendParams({\n    keyboard: {\n      enabled: false,\n      onlyInViewport: true,\n      pageUpDown: true\n    }\n  });\n  function handle(event) {\n    if (!swiper.enabled) return;\n    const {\n      rtlTranslate: rtl\n    } = swiper;\n    let e = event;\n    if (e.originalEvent) e = e.originalEvent; // jquery fix\n    const kc = e.keyCode || e.charCode;\n    const pageUpDown = swiper.params.keyboard.pageUpDown;\n    const isPageUp = pageUpDown && kc === 33;\n    const isPageDown = pageUpDown && kc === 34;\n    const isArrowLeft = kc === 37;\n    const isArrowRight = kc === 39;\n    const isArrowUp = kc === 38;\n    const isArrowDown = kc === 40;\n    // Directions locks\n    if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) {\n      return false;\n    }\n    if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) {\n      return false;\n    }\n    if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n      return undefined;\n    }\n    if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) {\n      return undefined;\n    }\n    if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) {\n      let inView = false;\n      // Check that swiper should be inside of visible area of window\n      if (elementParents(swiper.el, `.${swiper.params.slideClass}, swiper-slide`).length > 0 && elementParents(swiper.el, `.${swiper.params.slideActiveClass}`).length === 0) {\n        return undefined;\n      }\n      const el = swiper.el;\n      const swiperWidth = el.clientWidth;\n      const swiperHeight = el.clientHeight;\n      const windowWidth = window.innerWidth;\n      const windowHeight = window.innerHeight;\n      const swiperOffset = elementOffset(el);\n      if (rtl) swiperOffset.left -= el.scrollLeft;\n      const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]];\n      for (let i = 0; i < swiperCoord.length; i += 1) {\n        const point = swiperCoord[i];\n        if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {\n          if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n          inView = true;\n        }\n      }\n      if (!inView) return undefined;\n    }\n    if (swiper.isHorizontal()) {\n      if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {\n        if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n      }\n      if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext();\n      if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev();\n    } else {\n      if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n        if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n      }\n      if (isPageDown || isArrowDown) swiper.slideNext();\n      if (isPageUp || isArrowUp) swiper.slidePrev();\n    }\n    emit('keyPress', kc);\n    return undefined;\n  }\n  function enable() {\n    if (swiper.keyboard.enabled) return;\n    document.addEventListener('keydown', handle);\n    swiper.keyboard.enabled = true;\n  }\n  function disable() {\n    if (!swiper.keyboard.enabled) return;\n    document.removeEventListener('keydown', handle);\n    swiper.keyboard.enabled = false;\n  }\n  on('init', () => {\n    if (swiper.params.keyboard.enabled) {\n      enable();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.keyboard.enabled) {\n      disable();\n    }\n  });\n  Object.assign(swiper.keyboard, {\n    enable,\n    disable\n  });\n}\n\nexport { Keyboard as default };\n","import { e as elementChildren, c as createElement } from './utils.mjs';\n\nfunction createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n  if (swiper.params.createElements) {\n    Object.keys(checkProps).forEach(key => {\n      if (!params[key] && params.auto === true) {\n        let element = elementChildren(swiper.el, `.${checkProps[key]}`)[0];\n        if (!element) {\n          element = createElement('div', checkProps[key]);\n          element.className = checkProps[key];\n          swiper.el.append(element);\n        }\n        params[key] = element;\n        originalParams[key] = element;\n      }\n    });\n  }\n  return params;\n}\n\nexport { createElementIfNotDefined as c };\n","import { c as createElementIfNotDefined } from '../shared/create-element-if-not-defined.mjs';\nimport { m as makeElementsArray } from '../shared/utils.mjs';\n\nfunction Navigation(_ref) {\n  let {\n    swiper,\n    extendParams,\n    on,\n    emit\n  } = _ref;\n  extendParams({\n    navigation: {\n      nextEl: null,\n      prevEl: null,\n      hideOnClick: false,\n      disabledClass: 'swiper-button-disabled',\n      hiddenClass: 'swiper-button-hidden',\n      lockClass: 'swiper-button-lock',\n      navigationDisabledClass: 'swiper-navigation-disabled'\n    }\n  });\n  swiper.navigation = {\n    nextEl: null,\n    prevEl: null\n  };\n  function getEl(el) {\n    let res;\n    if (el && typeof el === 'string' && swiper.isElement) {\n      res = swiper.el.querySelector(el);\n      if (res) return res;\n    }\n    if (el) {\n      if (typeof el === 'string') res = [...document.querySelectorAll(el)];\n      if (swiper.params.uniqueNavElements && typeof el === 'string' && res && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) {\n        res = swiper.el.querySelector(el);\n      } else if (res && res.length === 1) {\n        res = res[0];\n      }\n    }\n    if (el && !res) return el;\n    // if (Array.isArray(res) && res.length === 1) res = res[0];\n    return res;\n  }\n  function toggleEl(el, disabled) {\n    const params = swiper.params.navigation;\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      if (subEl) {\n        subEl.classList[disabled ? 'add' : 'remove'](...params.disabledClass.split(' '));\n        if (subEl.tagName === 'BUTTON') subEl.disabled = disabled;\n        if (swiper.params.watchOverflow && swiper.enabled) {\n          subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);\n        }\n      }\n    });\n  }\n  function update() {\n    // Update Navigation Buttons\n    const {\n      nextEl,\n      prevEl\n    } = swiper.navigation;\n    if (swiper.params.loop) {\n      toggleEl(prevEl, false);\n      toggleEl(nextEl, false);\n      return;\n    }\n    toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind);\n    toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind);\n  }\n  function onPrevClick(e) {\n    e.preventDefault();\n    if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return;\n    swiper.slidePrev();\n    emit('navigationPrev');\n  }\n  function onNextClick(e) {\n    e.preventDefault();\n    if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return;\n    swiper.slideNext();\n    emit('navigationNext');\n  }\n  function init() {\n    const params = swiper.params.navigation;\n    swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, {\n      nextEl: 'swiper-button-next',\n      prevEl: 'swiper-button-prev'\n    });\n    if (!(params.nextEl || params.prevEl)) return;\n    let nextEl = getEl(params.nextEl);\n    let prevEl = getEl(params.prevEl);\n    Object.assign(swiper.navigation, {\n      nextEl,\n      prevEl\n    });\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    const initButton = (el, dir) => {\n      if (el) {\n        el.addEventListener('click', dir === 'next' ? onNextClick : onPrevClick);\n      }\n      if (!swiper.enabled && el) {\n        el.classList.add(...params.lockClass.split(' '));\n      }\n    };\n    nextEl.forEach(el => initButton(el, 'next'));\n    prevEl.forEach(el => initButton(el, 'prev'));\n  }\n  function destroy() {\n    let {\n      nextEl,\n      prevEl\n    } = swiper.navigation;\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    const destroyButton = (el, dir) => {\n      el.removeEventListener('click', dir === 'next' ? onNextClick : onPrevClick);\n      el.classList.remove(...swiper.params.navigation.disabledClass.split(' '));\n    };\n    nextEl.forEach(el => destroyButton(el, 'next'));\n    prevEl.forEach(el => destroyButton(el, 'prev'));\n  }\n  on('init', () => {\n    if (swiper.params.navigation.enabled === false) {\n      // eslint-disable-next-line\n      disable();\n    } else {\n      init();\n      update();\n    }\n  });\n  on('toEdge fromEdge lock unlock', () => {\n    update();\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    let {\n      nextEl,\n      prevEl\n    } = swiper.navigation;\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    if (swiper.enabled) {\n      update();\n      return;\n    }\n    [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.add(swiper.params.navigation.lockClass));\n  });\n  on('click', (_s, e) => {\n    let {\n      nextEl,\n      prevEl\n    } = swiper.navigation;\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    const targetEl = e.target;\n    if (swiper.params.navigation.hideOnClick && !prevEl.includes(targetEl) && !nextEl.includes(targetEl)) {\n      if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;\n      let isHidden;\n      if (nextEl.length) {\n        isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass);\n      } else if (prevEl.length) {\n        isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass);\n      }\n      if (isHidden === true) {\n        emit('navigationShow');\n      } else {\n        emit('navigationHide');\n      }\n      [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.toggle(swiper.params.navigation.hiddenClass));\n    }\n  });\n  const enable = () => {\n    swiper.el.classList.remove(...swiper.params.navigation.navigationDisabledClass.split(' '));\n    init();\n    update();\n  };\n  const disable = () => {\n    swiper.el.classList.add(...swiper.params.navigation.navigationDisabledClass.split(' '));\n    destroy();\n  };\n  Object.assign(swiper.navigation, {\n    enable,\n    disable,\n    update,\n    init,\n    destroy\n  });\n}\n\nexport { Navigation as default };\n","function classesToSelector(classes) {\n  if (classes === void 0) {\n    classes = '';\n  }\n  return `.${classes.trim().replace(/([\\.:!+\\/])/g, '\\\\$1') // eslint-disable-line\n  .replace(/ /g, '.')}`;\n}\n\nexport { classesToSelector as c };\n","import { g as getDocument } from '../shared/ssr-window.esm.mjs';\nimport { m as makeElementsArray, i as classesToTokens, c as createElement, n as nextTick, b as elementOffset } from '../shared/utils.mjs';\nimport { c as createElementIfNotDefined } from '../shared/create-element-if-not-defined.mjs';\nimport { c as classesToSelector } from '../shared/classes-to-selector.mjs';\n\nfunction Scrollbar(_ref) {\n  let {\n    swiper,\n    extendParams,\n    on,\n    emit\n  } = _ref;\n  const document = getDocument();\n  let isTouched = false;\n  let timeout = null;\n  let dragTimeout = null;\n  let dragStartPos;\n  let dragSize;\n  let trackSize;\n  let divider;\n  extendParams({\n    scrollbar: {\n      el: null,\n      dragSize: 'auto',\n      hide: false,\n      draggable: false,\n      snapOnRelease: true,\n      lockClass: 'swiper-scrollbar-lock',\n      dragClass: 'swiper-scrollbar-drag',\n      scrollbarDisabledClass: 'swiper-scrollbar-disabled',\n      horizontalClass: `swiper-scrollbar-horizontal`,\n      verticalClass: `swiper-scrollbar-vertical`\n    }\n  });\n  swiper.scrollbar = {\n    el: null,\n    dragEl: null\n  };\n  function setTranslate() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const {\n      scrollbar,\n      rtlTranslate: rtl\n    } = swiper;\n    const {\n      dragEl,\n      el\n    } = scrollbar;\n    const params = swiper.params.scrollbar;\n    const progress = swiper.params.loop ? swiper.progressLoop : swiper.progress;\n    let newSize = dragSize;\n    let newPos = (trackSize - dragSize) * progress;\n    if (rtl) {\n      newPos = -newPos;\n      if (newPos > 0) {\n        newSize = dragSize - newPos;\n        newPos = 0;\n      } else if (-newPos + dragSize > trackSize) {\n        newSize = trackSize + newPos;\n      }\n    } else if (newPos < 0) {\n      newSize = dragSize + newPos;\n      newPos = 0;\n    } else if (newPos + dragSize > trackSize) {\n      newSize = trackSize - newPos;\n    }\n    if (swiper.isHorizontal()) {\n      dragEl.style.transform = `translate3d(${newPos}px, 0, 0)`;\n      dragEl.style.width = `${newSize}px`;\n    } else {\n      dragEl.style.transform = `translate3d(0px, ${newPos}px, 0)`;\n      dragEl.style.height = `${newSize}px`;\n    }\n    if (params.hide) {\n      clearTimeout(timeout);\n      el.style.opacity = 1;\n      timeout = setTimeout(() => {\n        el.style.opacity = 0;\n        el.style.transitionDuration = '400ms';\n      }, 1000);\n    }\n  }\n  function setTransition(duration) {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    swiper.scrollbar.dragEl.style.transitionDuration = `${duration}ms`;\n  }\n  function updateSize() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const {\n      scrollbar\n    } = swiper;\n    const {\n      dragEl,\n      el\n    } = scrollbar;\n    dragEl.style.width = '';\n    dragEl.style.height = '';\n    trackSize = swiper.isHorizontal() ? el.offsetWidth : el.offsetHeight;\n    divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n    if (swiper.params.scrollbar.dragSize === 'auto') {\n      dragSize = trackSize * divider;\n    } else {\n      dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n    }\n    if (swiper.isHorizontal()) {\n      dragEl.style.width = `${dragSize}px`;\n    } else {\n      dragEl.style.height = `${dragSize}px`;\n    }\n    if (divider >= 1) {\n      el.style.display = 'none';\n    } else {\n      el.style.display = '';\n    }\n    if (swiper.params.scrollbar.hide) {\n      el.style.opacity = 0;\n    }\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      scrollbar.el.classList[swiper.isLocked ? 'add' : 'remove'](swiper.params.scrollbar.lockClass);\n    }\n  }\n  function getPointerPosition(e) {\n    return swiper.isHorizontal() ? e.clientX : e.clientY;\n  }\n  function setDragPosition(e) {\n    const {\n      scrollbar,\n      rtlTranslate: rtl\n    } = swiper;\n    const {\n      el\n    } = scrollbar;\n    let positionRatio;\n    positionRatio = (getPointerPosition(e) - elementOffset(el)[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);\n    positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n    if (rtl) {\n      positionRatio = 1 - positionRatio;\n    }\n    const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n    swiper.updateProgress(position);\n    swiper.setTranslate(position);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n  function onDragStart(e) {\n    const params = swiper.params.scrollbar;\n    const {\n      scrollbar,\n      wrapperEl\n    } = swiper;\n    const {\n      el,\n      dragEl\n    } = scrollbar;\n    isTouched = true;\n    dragStartPos = e.target === dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;\n    e.preventDefault();\n    e.stopPropagation();\n    wrapperEl.style.transitionDuration = '100ms';\n    dragEl.style.transitionDuration = '100ms';\n    setDragPosition(e);\n    clearTimeout(dragTimeout);\n    el.style.transitionDuration = '0ms';\n    if (params.hide) {\n      el.style.opacity = 1;\n    }\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style['scroll-snap-type'] = 'none';\n    }\n    emit('scrollbarDragStart', e);\n  }\n  function onDragMove(e) {\n    const {\n      scrollbar,\n      wrapperEl\n    } = swiper;\n    const {\n      el,\n      dragEl\n    } = scrollbar;\n    if (!isTouched) return;\n    if (e.preventDefault && e.cancelable) e.preventDefault();else e.returnValue = false;\n    setDragPosition(e);\n    wrapperEl.style.transitionDuration = '0ms';\n    el.style.transitionDuration = '0ms';\n    dragEl.style.transitionDuration = '0ms';\n    emit('scrollbarDragMove', e);\n  }\n  function onDragEnd(e) {\n    const params = swiper.params.scrollbar;\n    const {\n      scrollbar,\n      wrapperEl\n    } = swiper;\n    const {\n      el\n    } = scrollbar;\n    if (!isTouched) return;\n    isTouched = false;\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style['scroll-snap-type'] = '';\n      wrapperEl.style.transitionDuration = '';\n    }\n    if (params.hide) {\n      clearTimeout(dragTimeout);\n      dragTimeout = nextTick(() => {\n        el.style.opacity = 0;\n        el.style.transitionDuration = '400ms';\n      }, 1000);\n    }\n    emit('scrollbarDragEnd', e);\n    if (params.snapOnRelease) {\n      swiper.slideToClosest();\n    }\n  }\n  function events(method) {\n    const {\n      scrollbar,\n      params\n    } = swiper;\n    const el = scrollbar.el;\n    if (!el) return;\n    const target = el;\n    const activeListener = params.passiveListeners ? {\n      passive: false,\n      capture: false\n    } : false;\n    const passiveListener = params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n    if (!target) return;\n    const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n    target[eventMethod]('pointerdown', onDragStart, activeListener);\n    document[eventMethod]('pointermove', onDragMove, activeListener);\n    document[eventMethod]('pointerup', onDragEnd, passiveListener);\n  }\n  function enableDraggable() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    events('on');\n  }\n  function disableDraggable() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    events('off');\n  }\n  function init() {\n    const {\n      scrollbar,\n      el: swiperEl\n    } = swiper;\n    swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, {\n      el: 'swiper-scrollbar'\n    });\n    const params = swiper.params.scrollbar;\n    if (!params.el) return;\n    let el;\n    if (typeof params.el === 'string' && swiper.isElement) {\n      el = swiper.el.querySelector(params.el);\n    }\n    if (!el && typeof params.el === 'string') {\n      el = document.querySelectorAll(params.el);\n      if (!el.length) return;\n    } else if (!el) {\n      el = params.el;\n    }\n    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && el.length > 1 && swiperEl.querySelectorAll(params.el).length === 1) {\n      el = swiperEl.querySelector(params.el);\n    }\n    if (el.length > 0) el = el[0];\n    el.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n    let dragEl;\n    if (el) {\n      dragEl = el.querySelector(classesToSelector(swiper.params.scrollbar.dragClass));\n      if (!dragEl) {\n        dragEl = createElement('div', swiper.params.scrollbar.dragClass);\n        el.append(dragEl);\n      }\n    }\n    Object.assign(scrollbar, {\n      el,\n      dragEl\n    });\n    if (params.draggable) {\n      enableDraggable();\n    }\n    if (el) {\n      el.classList[swiper.enabled ? 'remove' : 'add'](...classesToTokens(swiper.params.scrollbar.lockClass));\n    }\n  }\n  function destroy() {\n    const params = swiper.params.scrollbar;\n    const el = swiper.scrollbar.el;\n    if (el) {\n      el.classList.remove(...classesToTokens(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass));\n    }\n    disableDraggable();\n  }\n  on('changeDirection', () => {\n    if (!swiper.scrollbar || !swiper.scrollbar.el) return;\n    const params = swiper.params.scrollbar;\n    let {\n      el\n    } = swiper.scrollbar;\n    el = makeElementsArray(el);\n    el.forEach(subEl => {\n      subEl.classList.remove(params.horizontalClass, params.verticalClass);\n      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n    });\n  });\n  on('init', () => {\n    if (swiper.params.scrollbar.enabled === false) {\n      // eslint-disable-next-line\n      disable();\n    } else {\n      init();\n      updateSize();\n      setTranslate();\n    }\n  });\n  on('update resize observerUpdate lock unlock changeDirection', () => {\n    updateSize();\n  });\n  on('setTranslate', () => {\n    setTranslate();\n  });\n  on('setTransition', (_s, duration) => {\n    setTransition(duration);\n  });\n  on('enable disable', () => {\n    const {\n      el\n    } = swiper.scrollbar;\n    if (el) {\n      el.classList[swiper.enabled ? 'remove' : 'add'](...classesToTokens(swiper.params.scrollbar.lockClass));\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  const enable = () => {\n    swiper.el.classList.remove(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));\n    if (swiper.scrollbar.el) {\n      swiper.scrollbar.el.classList.remove(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));\n    }\n    init();\n    updateSize();\n    setTranslate();\n  };\n  const disable = () => {\n    swiper.el.classList.add(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));\n    if (swiper.scrollbar.el) {\n      swiper.scrollbar.el.classList.add(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));\n    }\n    destroy();\n  };\n  Object.assign(swiper.scrollbar, {\n    enable,\n    disable,\n    updateSize,\n    setTranslate,\n    init,\n    destroy\n  });\n}\n\nexport { Scrollbar as default };\n","import { g as getDocument } from '../shared/ssr-window.esm.mjs';\nimport { l as isObject, e as elementChildren } from '../shared/utils.mjs';\n\nfunction Thumb(_ref) {\n  let {\n    swiper,\n    extendParams,\n    on\n  } = _ref;\n  extendParams({\n    thumbs: {\n      swiper: null,\n      multipleActiveThumbs: true,\n      autoScrollOffset: 0,\n      slideThumbActiveClass: 'swiper-slide-thumb-active',\n      thumbsContainerClass: 'swiper-thumbs'\n    }\n  });\n  let initialized = false;\n  let swiperCreated = false;\n  swiper.thumbs = {\n    swiper: null\n  };\n  function onThumbClick() {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    const clickedIndex = thumbsSwiper.clickedIndex;\n    const clickedSlide = thumbsSwiper.clickedSlide;\n    if (clickedSlide && clickedSlide.classList.contains(swiper.params.thumbs.slideThumbActiveClass)) return;\n    if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n    let slideToIndex;\n    if (thumbsSwiper.params.loop) {\n      slideToIndex = parseInt(thumbsSwiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);\n    } else {\n      slideToIndex = clickedIndex;\n    }\n    if (swiper.params.loop) {\n      swiper.slideToLoop(slideToIndex);\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  }\n  function init() {\n    const {\n      thumbs: thumbsParams\n    } = swiper.params;\n    if (initialized) return false;\n    initialized = true;\n    const SwiperClass = swiper.constructor;\n    if (thumbsParams.swiper instanceof SwiperClass) {\n      swiper.thumbs.swiper = thumbsParams.swiper;\n      Object.assign(swiper.thumbs.swiper.originalParams, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false\n      });\n      Object.assign(swiper.thumbs.swiper.params, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false\n      });\n      swiper.thumbs.swiper.update();\n    } else if (isObject(thumbsParams.swiper)) {\n      const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);\n      Object.assign(thumbsSwiperParams, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false\n      });\n      swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);\n      swiperCreated = true;\n    }\n    swiper.thumbs.swiper.el.classList.add(swiper.params.thumbs.thumbsContainerClass);\n    swiper.thumbs.swiper.on('tap', onThumbClick);\n    return true;\n  }\n  function update(initial) {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView;\n\n    // Activate thumbs\n    let thumbsToActivate = 1;\n    const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n    if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n      thumbsToActivate = swiper.params.slidesPerView;\n    }\n    if (!swiper.params.thumbs.multipleActiveThumbs) {\n      thumbsToActivate = 1;\n    }\n    thumbsToActivate = Math.floor(thumbsToActivate);\n    thumbsSwiper.slides.forEach(slideEl => slideEl.classList.remove(thumbActiveClass));\n    if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) {\n      for (let i = 0; i < thumbsToActivate; i += 1) {\n        elementChildren(thumbsSwiper.slidesEl, `[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`).forEach(slideEl => {\n          slideEl.classList.add(thumbActiveClass);\n        });\n      }\n    } else {\n      for (let i = 0; i < thumbsToActivate; i += 1) {\n        if (thumbsSwiper.slides[swiper.realIndex + i]) {\n          thumbsSwiper.slides[swiper.realIndex + i].classList.add(thumbActiveClass);\n        }\n      }\n    }\n    const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n    const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n    if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n      const currentThumbsIndex = thumbsSwiper.activeIndex;\n      let newThumbsIndex;\n      let direction;\n      if (thumbsSwiper.params.loop) {\n        const newThumbsSlide = thumbsSwiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') === `${swiper.realIndex}`)[0];\n        newThumbsIndex = thumbsSwiper.slides.indexOf(newThumbsSlide);\n        direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';\n      } else {\n        newThumbsIndex = swiper.realIndex;\n        direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';\n      }\n      if (useOffset) {\n        newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;\n      }\n      if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {\n        if (thumbsSwiper.params.centeredSlides) {\n          if (newThumbsIndex > currentThumbsIndex) {\n            newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n          } else {\n            newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n          }\n        } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) ;\n        thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n      }\n    }\n  }\n  on('beforeInit', () => {\n    const {\n      thumbs\n    } = swiper.params;\n    if (!thumbs || !thumbs.swiper) return;\n    if (typeof thumbs.swiper === 'string' || thumbs.swiper instanceof HTMLElement) {\n      const document = getDocument();\n      const getThumbsElementAndInit = () => {\n        const thumbsElement = typeof thumbs.swiper === 'string' ? document.querySelector(thumbs.swiper) : thumbs.swiper;\n        if (thumbsElement && thumbsElement.swiper) {\n          thumbs.swiper = thumbsElement.swiper;\n          init();\n          update(true);\n        } else if (thumbsElement) {\n          const onThumbsSwiper = e => {\n            thumbs.swiper = e.detail[0];\n            thumbsElement.removeEventListener('init', onThumbsSwiper);\n            init();\n            update(true);\n            thumbs.swiper.update();\n            swiper.update();\n          };\n          thumbsElement.addEventListener('init', onThumbsSwiper);\n        }\n        return thumbsElement;\n      };\n      const watchForThumbsToAppear = () => {\n        if (swiper.destroyed) return;\n        const thumbsElement = getThumbsElementAndInit();\n        if (!thumbsElement) {\n          requestAnimationFrame(watchForThumbsToAppear);\n        }\n      };\n      requestAnimationFrame(watchForThumbsToAppear);\n    } else {\n      init();\n      update(true);\n    }\n  });\n  on('slideChange update resize observerUpdate', () => {\n    update();\n  });\n  on('setTransition', (_s, duration) => {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    thumbsSwiper.setTransition(duration);\n  });\n  on('beforeDestroy', () => {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    if (swiperCreated) {\n      thumbsSwiper.destroy();\n    }\n  });\n  Object.assign(swiper.thumbs, {\n    init,\n    update\n  });\n}\n\nexport { Thumb as default };\n","import { d as now, k as elementTransitionEnd } from '../shared/utils.mjs';\n\nfunction freeMode(_ref) {\n  let {\n    swiper,\n    extendParams,\n    emit,\n    once\n  } = _ref;\n  extendParams({\n    freeMode: {\n      enabled: false,\n      momentum: true,\n      momentumRatio: 1,\n      momentumBounce: true,\n      momentumBounceRatio: 1,\n      momentumVelocityRatio: 1,\n      sticky: false,\n      minimumVelocity: 0.02\n    }\n  });\n  function onTouchStart() {\n    if (swiper.params.cssMode) return;\n    const translate = swiper.getTranslate();\n    swiper.setTranslate(translate);\n    swiper.setTransition(0);\n    swiper.touchEventsData.velocities.length = 0;\n    swiper.freeMode.onTouchEnd({\n      currentPos: swiper.rtl ? swiper.translate : -swiper.translate\n    });\n  }\n  function onTouchMove() {\n    if (swiper.params.cssMode) return;\n    const {\n      touchEventsData: data,\n      touches\n    } = swiper;\n    // Velocity\n    if (data.velocities.length === 0) {\n      data.velocities.push({\n        position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n        time: data.touchStartTime\n      });\n    }\n    data.velocities.push({\n      position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n      time: now()\n    });\n  }\n  function onTouchEnd(_ref2) {\n    let {\n      currentPos\n    } = _ref2;\n    if (swiper.params.cssMode) return;\n    const {\n      params,\n      wrapperEl,\n      rtlTranslate: rtl,\n      snapGrid,\n      touchEventsData: data\n    } = swiper;\n    // Time diff\n    const touchEndTime = now();\n    const timeDiff = touchEndTime - data.touchStartTime;\n    if (currentPos < -swiper.minTranslate()) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n    if (currentPos > -swiper.maxTranslate()) {\n      if (swiper.slides.length < snapGrid.length) {\n        swiper.slideTo(snapGrid.length - 1);\n      } else {\n        swiper.slideTo(swiper.slides.length - 1);\n      }\n      return;\n    }\n    if (params.freeMode.momentum) {\n      if (data.velocities.length > 1) {\n        const lastMoveEvent = data.velocities.pop();\n        const velocityEvent = data.velocities.pop();\n        const distance = lastMoveEvent.position - velocityEvent.position;\n        const time = lastMoveEvent.time - velocityEvent.time;\n        swiper.velocity = distance / time;\n        swiper.velocity /= 2;\n        if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {\n          swiper.velocity = 0;\n        }\n        // this implies that the user stopped moving a finger then released.\n        // There would be no events with distance zero, so the last event is stale.\n        if (time > 150 || now() - lastMoveEvent.time > 300) {\n          swiper.velocity = 0;\n        }\n      } else {\n        swiper.velocity = 0;\n      }\n      swiper.velocity *= params.freeMode.momentumVelocityRatio;\n      data.velocities.length = 0;\n      let momentumDuration = 1000 * params.freeMode.momentumRatio;\n      const momentumDistance = swiper.velocity * momentumDuration;\n      let newPosition = swiper.translate + momentumDistance;\n      if (rtl) newPosition = -newPosition;\n      let doBounce = false;\n      let afterBouncePosition;\n      const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;\n      let needsLoopFix;\n      if (newPosition < swiper.maxTranslate()) {\n        if (params.freeMode.momentumBounce) {\n          if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n            newPosition = swiper.maxTranslate() - bounceAmount;\n          }\n          afterBouncePosition = swiper.maxTranslate();\n          doBounce = true;\n          data.allowMomentumBounce = true;\n        } else {\n          newPosition = swiper.maxTranslate();\n        }\n        if (params.loop && params.centeredSlides) needsLoopFix = true;\n      } else if (newPosition > swiper.minTranslate()) {\n        if (params.freeMode.momentumBounce) {\n          if (newPosition - swiper.minTranslate() > bounceAmount) {\n            newPosition = swiper.minTranslate() + bounceAmount;\n          }\n          afterBouncePosition = swiper.minTranslate();\n          doBounce = true;\n          data.allowMomentumBounce = true;\n        } else {\n          newPosition = swiper.minTranslate();\n        }\n        if (params.loop && params.centeredSlides) needsLoopFix = true;\n      } else if (params.freeMode.sticky) {\n        let nextSlide;\n        for (let j = 0; j < snapGrid.length; j += 1) {\n          if (snapGrid[j] > -newPosition) {\n            nextSlide = j;\n            break;\n          }\n        }\n        if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {\n          newPosition = snapGrid[nextSlide];\n        } else {\n          newPosition = snapGrid[nextSlide - 1];\n        }\n        newPosition = -newPosition;\n      }\n      if (needsLoopFix) {\n        once('transitionEnd', () => {\n          swiper.loopFix();\n        });\n      }\n      // Fix duration\n      if (swiper.velocity !== 0) {\n        if (rtl) {\n          momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n        } else {\n          momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n        }\n        if (params.freeMode.sticky) {\n          // If freeMode.sticky is active and the user ends a swipe with a slow-velocity\n          // event, then durations can be 20+ seconds to slide one (or zero!) slides.\n          // It's easy to see this when simulating touch with mouse events. To fix this,\n          // limit single-slide swipes to the default slide duration. This also has the\n          // nice side effect of matching slide speed if the user stopped moving before\n          // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.\n          // For faster swipes, also apply limits (albeit higher ones).\n          const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);\n          const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];\n          if (moveDistance < currentSlideSize) {\n            momentumDuration = params.speed;\n          } else if (moveDistance < 2 * currentSlideSize) {\n            momentumDuration = params.speed * 1.5;\n          } else {\n            momentumDuration = params.speed * 2.5;\n          }\n        }\n      } else if (params.freeMode.sticky) {\n        swiper.slideToClosest();\n        return;\n      }\n      if (params.freeMode.momentumBounce && doBounce) {\n        swiper.updateProgress(afterBouncePosition);\n        swiper.setTransition(momentumDuration);\n        swiper.setTranslate(newPosition);\n        swiper.transitionStart(true, swiper.swipeDirection);\n        swiper.animating = true;\n        elementTransitionEnd(wrapperEl, () => {\n          if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n          emit('momentumBounce');\n          swiper.setTransition(params.speed);\n          setTimeout(() => {\n            swiper.setTranslate(afterBouncePosition);\n            elementTransitionEnd(wrapperEl, () => {\n              if (!swiper || swiper.destroyed) return;\n              swiper.transitionEnd();\n            });\n          }, 0);\n        });\n      } else if (swiper.velocity) {\n        emit('_freeModeNoMomentumRelease');\n        swiper.updateProgress(newPosition);\n        swiper.setTransition(momentumDuration);\n        swiper.setTranslate(newPosition);\n        swiper.transitionStart(true, swiper.swipeDirection);\n        if (!swiper.animating) {\n          swiper.animating = true;\n          elementTransitionEnd(wrapperEl, () => {\n            if (!swiper || swiper.destroyed) return;\n            swiper.transitionEnd();\n          });\n        }\n      } else {\n        swiper.updateProgress(newPosition);\n      }\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    } else if (params.freeMode.sticky) {\n      swiper.slideToClosest();\n      return;\n    } else if (params.freeMode) {\n      emit('_freeModeNoMomentumRelease');\n    }\n    if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n      emit('_freeModeStaticRelease');\n      swiper.updateProgress();\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n  }\n  Object.assign(swiper, {\n    freeMode: {\n      onTouchStart,\n      onTouchMove,\n      onTouchEnd\n    }\n  });\n}\n\nexport { freeMode as default };\n","import { a as getWindow, g as getDocument } from './ssr-window.esm.mjs';\nimport { a as elementParents, o as elementStyle, e as elementChildren, s as setCSSProperty, f as elementOuterSize, p as elementNextAll, q as elementPrevAll, j as getTranslate, r as animateCSSModeScroll, n as nextTick, t as showWarning, c as createElement, d as now, u as extend, h as elementIndex, v as deleteProps } from './utils.mjs';\n\nlet support;\nfunction calcSupport() {\n  const window = getWindow();\n  const document = getDocument();\n  return {\n    smoothScroll: document.documentElement && document.documentElement.style && 'scrollBehavior' in document.documentElement.style,\n    touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch)\n  };\n}\nfunction getSupport() {\n  if (!support) {\n    support = calcSupport();\n  }\n  return support;\n}\n\nlet deviceCached;\nfunction calcDevice(_temp) {\n  let {\n    userAgent\n  } = _temp === void 0 ? {} : _temp;\n  const support = getSupport();\n  const window = getWindow();\n  const platform = window.navigator.platform;\n  const ua = userAgent || window.navigator.userAgent;\n  const device = {\n    ios: false,\n    android: false\n  };\n  const screenWidth = window.screen.width;\n  const screenHeight = window.screen.height;\n  const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n  let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n  const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n  const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n  const windows = platform === 'Win32';\n  let macos = platform === 'MacIntel';\n\n  // iPadOs 13 fix\n  const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];\n  if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {\n    ipad = ua.match(/(Version)\\/([\\d.]+)/);\n    if (!ipad) ipad = [0, 1, '13_0_0'];\n    macos = false;\n  }\n\n  // Android\n  if (android && !windows) {\n    device.os = 'android';\n    device.android = true;\n  }\n  if (ipad || iphone || ipod) {\n    device.os = 'ios';\n    device.ios = true;\n  }\n\n  // Export object\n  return device;\n}\nfunction getDevice(overrides) {\n  if (overrides === void 0) {\n    overrides = {};\n  }\n  if (!deviceCached) {\n    deviceCached = calcDevice(overrides);\n  }\n  return deviceCached;\n}\n\nlet browser;\nfunction calcBrowser() {\n  const window = getWindow();\n  const device = getDevice();\n  let needPerspectiveFix = false;\n  function isSafari() {\n    const ua = window.navigator.userAgent.toLowerCase();\n    return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n  }\n  if (isSafari()) {\n    const ua = String(window.navigator.userAgent);\n    if (ua.includes('Version/')) {\n      const [major, minor] = ua.split('Version/')[1].split(' ')[0].split('.').map(num => Number(num));\n      needPerspectiveFix = major < 16 || major === 16 && minor < 2;\n    }\n  }\n  const isWebView = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent);\n  const isSafariBrowser = isSafari();\n  const need3dFix = isSafariBrowser || isWebView && device.ios;\n  return {\n    isSafari: needPerspectiveFix || isSafariBrowser,\n    needPerspectiveFix,\n    need3dFix,\n    isWebView\n  };\n}\nfunction getBrowser() {\n  if (!browser) {\n    browser = calcBrowser();\n  }\n  return browser;\n}\n\nfunction Resize(_ref) {\n  let {\n    swiper,\n    on,\n    emit\n  } = _ref;\n  const window = getWindow();\n  let observer = null;\n  let animationFrame = null;\n  const resizeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('beforeResize');\n    emit('resize');\n  };\n  const createObserver = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    observer = new ResizeObserver(entries => {\n      animationFrame = window.requestAnimationFrame(() => {\n        const {\n          width,\n          height\n        } = swiper;\n        let newWidth = width;\n        let newHeight = height;\n        entries.forEach(_ref2 => {\n          let {\n            contentBoxSize,\n            contentRect,\n            target\n          } = _ref2;\n          if (target && target !== swiper.el) return;\n          newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;\n          newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;\n        });\n        if (newWidth !== width || newHeight !== height) {\n          resizeHandler();\n        }\n      });\n    });\n    observer.observe(swiper.el);\n  };\n  const removeObserver = () => {\n    if (animationFrame) {\n      window.cancelAnimationFrame(animationFrame);\n    }\n    if (observer && observer.unobserve && swiper.el) {\n      observer.unobserve(swiper.el);\n      observer = null;\n    }\n  };\n  const orientationChangeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('orientationchange');\n  };\n  on('init', () => {\n    if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n      createObserver();\n      return;\n    }\n    window.addEventListener('resize', resizeHandler);\n    window.addEventListener('orientationchange', orientationChangeHandler);\n  });\n  on('destroy', () => {\n    removeObserver();\n    window.removeEventListener('resize', resizeHandler);\n    window.removeEventListener('orientationchange', orientationChangeHandler);\n  });\n}\n\nfunction Observer(_ref) {\n  let {\n    swiper,\n    extendParams,\n    on,\n    emit\n  } = _ref;\n  const observers = [];\n  const window = getWindow();\n  const attach = function (target, options) {\n    if (options === void 0) {\n      options = {};\n    }\n    const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n    const observer = new ObserverFunc(mutations => {\n      // The observerUpdate event should only be triggered\n      // once despite the number of mutations.  Additional\n      // triggers are redundant and are very costly\n      if (swiper.__preventObserver__) return;\n      if (mutations.length === 1) {\n        emit('observerUpdate', mutations[0]);\n        return;\n      }\n      const observerUpdate = function observerUpdate() {\n        emit('observerUpdate', mutations[0]);\n      };\n      if (window.requestAnimationFrame) {\n        window.requestAnimationFrame(observerUpdate);\n      } else {\n        window.setTimeout(observerUpdate, 0);\n      }\n    });\n    observer.observe(target, {\n      attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n      childList: typeof options.childList === 'undefined' ? true : options.childList,\n      characterData: typeof options.characterData === 'undefined' ? true : options.characterData\n    });\n    observers.push(observer);\n  };\n  const init = () => {\n    if (!swiper.params.observer) return;\n    if (swiper.params.observeParents) {\n      const containerParents = elementParents(swiper.hostEl);\n      for (let i = 0; i < containerParents.length; i += 1) {\n        attach(containerParents[i]);\n      }\n    }\n    // Observe container\n    attach(swiper.hostEl, {\n      childList: swiper.params.observeSlideChildren\n    });\n\n    // Observe wrapper\n    attach(swiper.wrapperEl, {\n      attributes: false\n    });\n  };\n  const destroy = () => {\n    observers.forEach(observer => {\n      observer.disconnect();\n    });\n    observers.splice(0, observers.length);\n  };\n  extendParams({\n    observer: false,\n    observeParents: false,\n    observeSlideChildren: false\n  });\n  on('init', init);\n  on('destroy', destroy);\n}\n\n/* eslint-disable no-underscore-dangle */\n\nvar eventsEmitter = {\n  on(events, handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n    events.split(' ').forEach(event => {\n      if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n      self.eventsListeners[event][method](handler);\n    });\n    return self;\n  },\n  once(events, handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n    function onceHandler() {\n      self.off(events, onceHandler);\n      if (onceHandler.__emitterProxy) {\n        delete onceHandler.__emitterProxy;\n      }\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      handler.apply(self, args);\n    }\n    onceHandler.__emitterProxy = handler;\n    return self.on(events, onceHandler, priority);\n  },\n  onAny(handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n    if (self.eventsAnyListeners.indexOf(handler) < 0) {\n      self.eventsAnyListeners[method](handler);\n    }\n    return self;\n  },\n  offAny(handler) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsAnyListeners) return self;\n    const index = self.eventsAnyListeners.indexOf(handler);\n    if (index >= 0) {\n      self.eventsAnyListeners.splice(index, 1);\n    }\n    return self;\n  },\n  off(events, handler) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsListeners) return self;\n    events.split(' ').forEach(event => {\n      if (typeof handler === 'undefined') {\n        self.eventsListeners[event] = [];\n      } else if (self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach((eventHandler, index) => {\n          if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {\n            self.eventsListeners[event].splice(index, 1);\n          }\n        });\n      }\n    });\n    return self;\n  },\n  emit() {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsListeners) return self;\n    let events;\n    let data;\n    let context;\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n    if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n      events = args[0];\n      data = args.slice(1, args.length);\n      context = self;\n    } else {\n      events = args[0].events;\n      data = args[0].data;\n      context = args[0].context || self;\n    }\n    data.unshift(context);\n    const eventsArray = Array.isArray(events) ? events : events.split(' ');\n    eventsArray.forEach(event => {\n      if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n        self.eventsAnyListeners.forEach(eventHandler => {\n          eventHandler.apply(context, [event, ...data]);\n        });\n      }\n      if (self.eventsListeners && self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach(eventHandler => {\n          eventHandler.apply(context, data);\n        });\n      }\n    });\n    return self;\n  }\n};\n\nfunction updateSize() {\n  const swiper = this;\n  let width;\n  let height;\n  const el = swiper.el;\n  if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n    width = swiper.params.width;\n  } else {\n    width = el.clientWidth;\n  }\n  if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n    height = swiper.params.height;\n  } else {\n    height = el.clientHeight;\n  }\n  if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {\n    return;\n  }\n\n  // Subtract paddings\n  width = width - parseInt(elementStyle(el, 'padding-left') || 0, 10) - parseInt(elementStyle(el, 'padding-right') || 0, 10);\n  height = height - parseInt(elementStyle(el, 'padding-top') || 0, 10) - parseInt(elementStyle(el, 'padding-bottom') || 0, 10);\n  if (Number.isNaN(width)) width = 0;\n  if (Number.isNaN(height)) height = 0;\n  Object.assign(swiper, {\n    width,\n    height,\n    size: swiper.isHorizontal() ? width : height\n  });\n}\n\nfunction updateSlides() {\n  const swiper = this;\n  function getDirectionPropertyValue(node, label) {\n    return parseFloat(node.getPropertyValue(swiper.getDirectionLabel(label)) || 0);\n  }\n  const params = swiper.params;\n  const {\n    wrapperEl,\n    slidesEl,\n    size: swiperSize,\n    rtlTranslate: rtl,\n    wrongRTL\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n  const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`);\n  const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n  let snapGrid = [];\n  const slidesGrid = [];\n  const slidesSizesGrid = [];\n  let offsetBefore = params.slidesOffsetBefore;\n  if (typeof offsetBefore === 'function') {\n    offsetBefore = params.slidesOffsetBefore.call(swiper);\n  }\n  let offsetAfter = params.slidesOffsetAfter;\n  if (typeof offsetAfter === 'function') {\n    offsetAfter = params.slidesOffsetAfter.call(swiper);\n  }\n  const previousSnapGridLength = swiper.snapGrid.length;\n  const previousSlidesGridLength = swiper.slidesGrid.length;\n  let spaceBetween = params.spaceBetween;\n  let slidePosition = -offsetBefore;\n  let prevSlideSize = 0;\n  let index = 0;\n  if (typeof swiperSize === 'undefined') {\n    return;\n  }\n  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n    spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;\n  } else if (typeof spaceBetween === 'string') {\n    spaceBetween = parseFloat(spaceBetween);\n  }\n  swiper.virtualSize = -spaceBetween;\n\n  // reset margins\n  slides.forEach(slideEl => {\n    if (rtl) {\n      slideEl.style.marginLeft = '';\n    } else {\n      slideEl.style.marginRight = '';\n    }\n    slideEl.style.marginBottom = '';\n    slideEl.style.marginTop = '';\n  });\n\n  // reset cssMode offsets\n  if (params.centeredSlides && params.cssMode) {\n    setCSSProperty(wrapperEl, '--swiper-centered-offset-before', '');\n    setCSSProperty(wrapperEl, '--swiper-centered-offset-after', '');\n  }\n  const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n  if (gridEnabled) {\n    swiper.grid.initSlides(slides);\n  } else if (swiper.grid) {\n    swiper.grid.unsetSlides();\n  }\n\n  // Calc slides\n  let slideSize;\n  const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {\n    return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n  }).length > 0;\n  for (let i = 0; i < slidesLength; i += 1) {\n    slideSize = 0;\n    let slide;\n    if (slides[i]) slide = slides[i];\n    if (gridEnabled) {\n      swiper.grid.updateSlide(i, slide, slides);\n    }\n    if (slides[i] && elementStyle(slide, 'display') === 'none') continue; // eslint-disable-line\n\n    if (params.slidesPerView === 'auto') {\n      if (shouldResetSlideSize) {\n        slides[i].style[swiper.getDirectionLabel('width')] = ``;\n      }\n      const slideStyles = getComputedStyle(slide);\n      const currentTransform = slide.style.transform;\n      const currentWebKitTransform = slide.style.webkitTransform;\n      if (currentTransform) {\n        slide.style.transform = 'none';\n      }\n      if (currentWebKitTransform) {\n        slide.style.webkitTransform = 'none';\n      }\n      if (params.roundLengths) {\n        slideSize = swiper.isHorizontal() ? elementOuterSize(slide, 'width', true) : elementOuterSize(slide, 'height', true);\n      } else {\n        // eslint-disable-next-line\n        const width = getDirectionPropertyValue(slideStyles, 'width');\n        const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n        const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n        const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n        const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n        const boxSizing = slideStyles.getPropertyValue('box-sizing');\n        if (boxSizing && boxSizing === 'border-box') {\n          slideSize = width + marginLeft + marginRight;\n        } else {\n          const {\n            clientWidth,\n            offsetWidth\n          } = slide;\n          slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);\n        }\n      }\n      if (currentTransform) {\n        slide.style.transform = currentTransform;\n      }\n      if (currentWebKitTransform) {\n        slide.style.webkitTransform = currentWebKitTransform;\n      }\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n    } else {\n      slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n      if (slides[i]) {\n        slides[i].style[swiper.getDirectionLabel('width')] = `${slideSize}px`;\n      }\n    }\n    if (slides[i]) {\n      slides[i].swiperSlideSize = slideSize;\n    }\n    slidesSizesGrid.push(slideSize);\n    if (params.centeredSlides) {\n      slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n      if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n    } else {\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n      slidePosition = slidePosition + slideSize + spaceBetween;\n    }\n    swiper.virtualSize += slideSize + spaceBetween;\n    prevSlideSize = slideSize;\n    index += 1;\n  }\n  swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n  if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n    wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`;\n  }\n  if (params.setWrapperSize) {\n    wrapperEl.style[swiper.getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;\n  }\n  if (gridEnabled) {\n    swiper.grid.updateWrapperSize(slideSize, snapGrid);\n  }\n\n  // Remove last grid elements depending on width\n  if (!params.centeredSlides) {\n    const newSlidesGrid = [];\n    for (let i = 0; i < snapGrid.length; i += 1) {\n      let slidesGridItem = snapGrid[i];\n      if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n      if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n        newSlidesGrid.push(slidesGridItem);\n      }\n    }\n    snapGrid = newSlidesGrid;\n    if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {\n      snapGrid.push(swiper.virtualSize - swiperSize);\n    }\n  }\n  if (isVirtual && params.loop) {\n    const size = slidesSizesGrid[0] + spaceBetween;\n    if (params.slidesPerGroup > 1) {\n      const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup);\n      const groupSize = size * params.slidesPerGroup;\n      for (let i = 0; i < groups; i += 1) {\n        snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);\n      }\n    }\n    for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) {\n      if (params.slidesPerGroup === 1) {\n        snapGrid.push(snapGrid[snapGrid.length - 1] + size);\n      }\n      slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);\n      swiper.virtualSize += size;\n    }\n  }\n  if (snapGrid.length === 0) snapGrid = [0];\n  if (spaceBetween !== 0) {\n    const key = swiper.isHorizontal() && rtl ? 'marginLeft' : swiper.getDirectionLabel('marginRight');\n    slides.filter((_, slideIndex) => {\n      if (!params.cssMode || params.loop) return true;\n      if (slideIndex === slides.length - 1) {\n        return false;\n      }\n      return true;\n    }).forEach(slideEl => {\n      slideEl.style[key] = `${spaceBetween}px`;\n    });\n  }\n  if (params.centeredSlides && params.centeredSlidesBounds) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (spaceBetween || 0);\n    });\n    allSlidesSize -= spaceBetween;\n    const maxSnap = allSlidesSize - swiperSize;\n    snapGrid = snapGrid.map(snap => {\n      if (snap <= 0) return -offsetBefore;\n      if (snap > maxSnap) return maxSnap + offsetAfter;\n      return snap;\n    });\n  }\n  if (params.centerInsufficientSlides) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (spaceBetween || 0);\n    });\n    allSlidesSize -= spaceBetween;\n    const offsetSize = (params.slidesOffsetBefore || 0) + (params.slidesOffsetAfter || 0);\n    if (allSlidesSize + offsetSize < swiperSize) {\n      const allSlidesOffset = (swiperSize - allSlidesSize - offsetSize) / 2;\n      snapGrid.forEach((snap, snapIndex) => {\n        snapGrid[snapIndex] = snap - allSlidesOffset;\n      });\n      slidesGrid.forEach((snap, snapIndex) => {\n        slidesGrid[snapIndex] = snap + allSlidesOffset;\n      });\n    }\n  }\n  Object.assign(swiper, {\n    slides,\n    snapGrid,\n    slidesGrid,\n    slidesSizesGrid\n  });\n  if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n    setCSSProperty(wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n    setCSSProperty(wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);\n    const addToSnapGrid = -swiper.snapGrid[0];\n    const addToSlidesGrid = -swiper.slidesGrid[0];\n    swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);\n    swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);\n  }\n  if (slidesLength !== previousSlidesLength) {\n    swiper.emit('slidesLengthChange');\n  }\n  if (snapGrid.length !== previousSnapGridLength) {\n    if (swiper.params.watchOverflow) swiper.checkOverflow();\n    swiper.emit('snapGridLengthChange');\n  }\n  if (slidesGrid.length !== previousSlidesGridLength) {\n    swiper.emit('slidesGridLengthChange');\n  }\n  if (params.watchSlidesProgress) {\n    swiper.updateSlidesOffset();\n  }\n  swiper.emit('slidesUpdated');\n  if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {\n    const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;\n    const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);\n    if (slidesLength <= params.maxBackfaceHiddenSlides) {\n      if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass);\n    } else if (hasClassBackfaceClassAdded) {\n      swiper.el.classList.remove(backFaceHiddenClass);\n    }\n  }\n}\n\nfunction updateAutoHeight(speed) {\n  const swiper = this;\n  const activeSlides = [];\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n  let newHeight = 0;\n  let i;\n  if (typeof speed === 'number') {\n    swiper.setTransition(speed);\n  } else if (speed === true) {\n    swiper.setTransition(swiper.params.speed);\n  }\n  const getSlideByIndex = index => {\n    if (isVirtual) {\n      return swiper.slides[swiper.getSlideIndexByData(index)];\n    }\n    return swiper.slides[index];\n  };\n  // Find slides currently in view\n  if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n    if (swiper.params.centeredSlides) {\n      (swiper.visibleSlides || []).forEach(slide => {\n        activeSlides.push(slide);\n      });\n    } else {\n      for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n        const index = swiper.activeIndex + i;\n        if (index > swiper.slides.length && !isVirtual) break;\n        activeSlides.push(getSlideByIndex(index));\n      }\n    }\n  } else {\n    activeSlides.push(getSlideByIndex(swiper.activeIndex));\n  }\n\n  // Find new height from highest slide in view\n  for (i = 0; i < activeSlides.length; i += 1) {\n    if (typeof activeSlides[i] !== 'undefined') {\n      const height = activeSlides[i].offsetHeight;\n      newHeight = height > newHeight ? height : newHeight;\n    }\n  }\n\n  // Update Height\n  if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = `${newHeight}px`;\n}\n\nfunction updateSlidesOffset() {\n  const swiper = this;\n  const slides = swiper.slides;\n  // eslint-disable-next-line\n  const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0;\n  for (let i = 0; i < slides.length; i += 1) {\n    slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset - swiper.cssOverflowAdjustment();\n  }\n}\n\nconst toggleSlideClasses$1 = (slideEl, condition, className) => {\n  if (condition && !slideEl.classList.contains(className)) {\n    slideEl.classList.add(className);\n  } else if (!condition && slideEl.classList.contains(className)) {\n    slideEl.classList.remove(className);\n  }\n};\nfunction updateSlidesProgress(translate) {\n  if (translate === void 0) {\n    translate = this && this.translate || 0;\n  }\n  const swiper = this;\n  const params = swiper.params;\n  const {\n    slides,\n    rtlTranslate: rtl,\n    snapGrid\n  } = swiper;\n  if (slides.length === 0) return;\n  if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n  let offsetCenter = -translate;\n  if (rtl) offsetCenter = translate;\n  swiper.visibleSlidesIndexes = [];\n  swiper.visibleSlides = [];\n  let spaceBetween = params.spaceBetween;\n  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n    spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;\n  } else if (typeof spaceBetween === 'string') {\n    spaceBetween = parseFloat(spaceBetween);\n  }\n  for (let i = 0; i < slides.length; i += 1) {\n    const slide = slides[i];\n    let slideOffset = slide.swiperSlideOffset;\n    if (params.cssMode && params.centeredSlides) {\n      slideOffset -= slides[0].swiperSlideOffset;\n    }\n    const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);\n    const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);\n    const slideBefore = -(offsetCenter - slideOffset);\n    const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n    const isFullyVisible = slideBefore >= 0 && slideBefore <= swiper.size - swiper.slidesSizesGrid[i];\n    const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;\n    if (isVisible) {\n      swiper.visibleSlides.push(slide);\n      swiper.visibleSlidesIndexes.push(i);\n    }\n    toggleSlideClasses$1(slide, isVisible, params.slideVisibleClass);\n    toggleSlideClasses$1(slide, isFullyVisible, params.slideFullyVisibleClass);\n    slide.progress = rtl ? -slideProgress : slideProgress;\n    slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n  }\n}\n\nfunction updateProgress(translate) {\n  const swiper = this;\n  if (typeof translate === 'undefined') {\n    const multiplier = swiper.rtlTranslate ? -1 : 1;\n    // eslint-disable-next-line\n    translate = swiper && swiper.translate && swiper.translate * multiplier || 0;\n  }\n  const params = swiper.params;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  let {\n    progress,\n    isBeginning,\n    isEnd,\n    progressLoop\n  } = swiper;\n  const wasBeginning = isBeginning;\n  const wasEnd = isEnd;\n  if (translatesDiff === 0) {\n    progress = 0;\n    isBeginning = true;\n    isEnd = true;\n  } else {\n    progress = (translate - swiper.minTranslate()) / translatesDiff;\n    const isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1;\n    const isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1;\n    isBeginning = isBeginningRounded || progress <= 0;\n    isEnd = isEndRounded || progress >= 1;\n    if (isBeginningRounded) progress = 0;\n    if (isEndRounded) progress = 1;\n  }\n  if (params.loop) {\n    const firstSlideIndex = swiper.getSlideIndexByData(0);\n    const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);\n    const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];\n    const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];\n    const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];\n    const translateAbs = Math.abs(translate);\n    if (translateAbs >= firstSlideTranslate) {\n      progressLoop = (translateAbs - firstSlideTranslate) / translateMax;\n    } else {\n      progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;\n    }\n    if (progressLoop > 1) progressLoop -= 1;\n  }\n  Object.assign(swiper, {\n    progress,\n    progressLoop,\n    isBeginning,\n    isEnd\n  });\n  if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);\n  if (isBeginning && !wasBeginning) {\n    swiper.emit('reachBeginning toEdge');\n  }\n  if (isEnd && !wasEnd) {\n    swiper.emit('reachEnd toEdge');\n  }\n  if (wasBeginning && !isBeginning || wasEnd && !isEnd) {\n    swiper.emit('fromEdge');\n  }\n  swiper.emit('progress', progress);\n}\n\nconst toggleSlideClasses = (slideEl, condition, className) => {\n  if (condition && !slideEl.classList.contains(className)) {\n    slideEl.classList.add(className);\n  } else if (!condition && slideEl.classList.contains(className)) {\n    slideEl.classList.remove(className);\n  }\n};\nfunction updateSlidesClasses() {\n  const swiper = this;\n  const {\n    slides,\n    params,\n    slidesEl,\n    activeIndex\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n  const getFilteredSlide = selector => {\n    return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0];\n  };\n  let activeSlide;\n  let prevSlide;\n  let nextSlide;\n  if (isVirtual) {\n    if (params.loop) {\n      let slideIndex = activeIndex - swiper.virtual.slidesBefore;\n      if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex;\n      if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length;\n      activeSlide = getFilteredSlide(`[data-swiper-slide-index=\"${slideIndex}\"]`);\n    } else {\n      activeSlide = getFilteredSlide(`[data-swiper-slide-index=\"${activeIndex}\"]`);\n    }\n  } else {\n    if (gridEnabled) {\n      activeSlide = slides.filter(slideEl => slideEl.column === activeIndex)[0];\n      nextSlide = slides.filter(slideEl => slideEl.column === activeIndex + 1)[0];\n      prevSlide = slides.filter(slideEl => slideEl.column === activeIndex - 1)[0];\n    } else {\n      activeSlide = slides[activeIndex];\n    }\n  }\n  if (activeSlide) {\n    if (!gridEnabled) {\n      // Next Slide\n      nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];\n      if (params.loop && !nextSlide) {\n        nextSlide = slides[0];\n      }\n\n      // Prev Slide\n      prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];\n      if (params.loop && !prevSlide === 0) {\n        prevSlide = slides[slides.length - 1];\n      }\n    }\n  }\n  slides.forEach(slideEl => {\n    toggleSlideClasses(slideEl, slideEl === activeSlide, params.slideActiveClass);\n    toggleSlideClasses(slideEl, slideEl === nextSlide, params.slideNextClass);\n    toggleSlideClasses(slideEl, slideEl === prevSlide, params.slidePrevClass);\n  });\n  swiper.emitSlidesClasses();\n}\n\nconst processLazyPreloader = (swiper, imageEl) => {\n  if (!swiper || swiper.destroyed || !swiper.params) return;\n  const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;\n  const slideEl = imageEl.closest(slideSelector());\n  if (slideEl) {\n    let lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n    if (!lazyEl && swiper.isElement) {\n      if (slideEl.shadowRoot) {\n        lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n      } else {\n        // init later\n        requestAnimationFrame(() => {\n          if (slideEl.shadowRoot) {\n            lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n            if (lazyEl) lazyEl.remove();\n          }\n        });\n      }\n    }\n    if (lazyEl) lazyEl.remove();\n  }\n};\nconst unlazy = (swiper, index) => {\n  if (!swiper.slides[index]) return;\n  const imageEl = swiper.slides[index].querySelector('[loading=\"lazy\"]');\n  if (imageEl) imageEl.removeAttribute('loading');\n};\nconst preload = swiper => {\n  if (!swiper || swiper.destroyed || !swiper.params) return;\n  let amount = swiper.params.lazyPreloadPrevNext;\n  const len = swiper.slides.length;\n  if (!len || !amount || amount < 0) return;\n  amount = Math.min(amount, len);\n  const slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);\n  const activeIndex = swiper.activeIndex;\n  if (swiper.params.grid && swiper.params.grid.rows > 1) {\n    const activeColumn = activeIndex;\n    const preloadColumns = [activeColumn - amount];\n    preloadColumns.push(...Array.from({\n      length: amount\n    }).map((_, i) => {\n      return activeColumn + slidesPerView + i;\n    }));\n    swiper.slides.forEach((slideEl, i) => {\n      if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);\n    });\n    return;\n  }\n  const slideIndexLastInView = activeIndex + slidesPerView - 1;\n  if (swiper.params.rewind || swiper.params.loop) {\n    for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {\n      const realIndex = (i % len + len) % len;\n      if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);\n    }\n  } else {\n    for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) {\n      if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {\n        unlazy(swiper, i);\n      }\n    }\n  }\n};\n\nfunction getActiveIndexByTranslate(swiper) {\n  const {\n    slidesGrid,\n    params\n  } = swiper;\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  let activeIndex;\n  for (let i = 0; i < slidesGrid.length; i += 1) {\n    if (typeof slidesGrid[i + 1] !== 'undefined') {\n      if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {\n        activeIndex = i;\n      } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n        activeIndex = i + 1;\n      }\n    } else if (translate >= slidesGrid[i]) {\n      activeIndex = i;\n    }\n  }\n  // Normalize slideIndex\n  if (params.normalizeSlideIndex) {\n    if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n  }\n  return activeIndex;\n}\nfunction updateActiveIndex(newActiveIndex) {\n  const swiper = this;\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  const {\n    snapGrid,\n    params,\n    activeIndex: previousIndex,\n    realIndex: previousRealIndex,\n    snapIndex: previousSnapIndex\n  } = swiper;\n  let activeIndex = newActiveIndex;\n  let snapIndex;\n  const getVirtualRealIndex = aIndex => {\n    let realIndex = aIndex - swiper.virtual.slidesBefore;\n    if (realIndex < 0) {\n      realIndex = swiper.virtual.slides.length + realIndex;\n    }\n    if (realIndex >= swiper.virtual.slides.length) {\n      realIndex -= swiper.virtual.slides.length;\n    }\n    return realIndex;\n  };\n  if (typeof activeIndex === 'undefined') {\n    activeIndex = getActiveIndexByTranslate(swiper);\n  }\n  if (snapGrid.indexOf(translate) >= 0) {\n    snapIndex = snapGrid.indexOf(translate);\n  } else {\n    const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n    snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n  }\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n  if (activeIndex === previousIndex && !swiper.params.loop) {\n    if (snapIndex !== previousSnapIndex) {\n      swiper.snapIndex = snapIndex;\n      swiper.emit('snapIndexChange');\n    }\n    return;\n  }\n  if (activeIndex === previousIndex && swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {\n    swiper.realIndex = getVirtualRealIndex(activeIndex);\n    return;\n  }\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n\n  // Get real index\n  let realIndex;\n  if (swiper.virtual && params.virtual.enabled && params.loop) {\n    realIndex = getVirtualRealIndex(activeIndex);\n  } else if (gridEnabled) {\n    const firstSlideInColumn = swiper.slides.filter(slideEl => slideEl.column === activeIndex)[0];\n    let activeSlideIndex = parseInt(firstSlideInColumn.getAttribute('data-swiper-slide-index'), 10);\n    if (Number.isNaN(activeSlideIndex)) {\n      activeSlideIndex = Math.max(swiper.slides.indexOf(firstSlideInColumn), 0);\n    }\n    realIndex = Math.floor(activeSlideIndex / params.grid.rows);\n  } else if (swiper.slides[activeIndex]) {\n    const slideIndex = swiper.slides[activeIndex].getAttribute('data-swiper-slide-index');\n    if (slideIndex) {\n      realIndex = parseInt(slideIndex, 10);\n    } else {\n      realIndex = activeIndex;\n    }\n  } else {\n    realIndex = activeIndex;\n  }\n  Object.assign(swiper, {\n    previousSnapIndex,\n    snapIndex,\n    previousRealIndex,\n    realIndex,\n    previousIndex,\n    activeIndex\n  });\n  if (swiper.initialized) {\n    preload(swiper);\n  }\n  swiper.emit('activeIndexChange');\n  swiper.emit('snapIndexChange');\n  if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n    if (previousRealIndex !== realIndex) {\n      swiper.emit('realIndexChange');\n    }\n    swiper.emit('slideChange');\n  }\n}\n\nfunction updateClickedSlide(el, path) {\n  const swiper = this;\n  const params = swiper.params;\n  let slide = el.closest(`.${params.slideClass}, swiper-slide`);\n  if (!slide && swiper.isElement && path && path.length > 1 && path.includes(el)) {\n    [...path.slice(path.indexOf(el) + 1, path.length)].forEach(pathEl => {\n      if (!slide && pathEl.matches && pathEl.matches(`.${params.slideClass}, swiper-slide`)) {\n        slide = pathEl;\n      }\n    });\n  }\n  let slideFound = false;\n  let slideIndex;\n  if (slide) {\n    for (let i = 0; i < swiper.slides.length; i += 1) {\n      if (swiper.slides[i] === slide) {\n        slideFound = true;\n        slideIndex = i;\n        break;\n      }\n    }\n  }\n  if (slide && slideFound) {\n    swiper.clickedSlide = slide;\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10);\n    } else {\n      swiper.clickedIndex = slideIndex;\n    }\n  } else {\n    swiper.clickedSlide = undefined;\n    swiper.clickedIndex = undefined;\n    return;\n  }\n  if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {\n    swiper.slideToClickedSlide();\n  }\n}\n\nvar update = {\n  updateSize,\n  updateSlides,\n  updateAutoHeight,\n  updateSlidesOffset,\n  updateSlidesProgress,\n  updateProgress,\n  updateSlidesClasses,\n  updateActiveIndex,\n  updateClickedSlide\n};\n\nfunction getSwiperTranslate(axis) {\n  if (axis === void 0) {\n    axis = this.isHorizontal() ? 'x' : 'y';\n  }\n  const swiper = this;\n  const {\n    params,\n    rtlTranslate: rtl,\n    translate,\n    wrapperEl\n  } = swiper;\n  if (params.virtualTranslate) {\n    return rtl ? -translate : translate;\n  }\n  if (params.cssMode) {\n    return translate;\n  }\n  let currentTranslate = getTranslate(wrapperEl, axis);\n  currentTranslate += swiper.cssOverflowAdjustment();\n  if (rtl) currentTranslate = -currentTranslate;\n  return currentTranslate || 0;\n}\n\nfunction setTranslate(translate, byController) {\n  const swiper = this;\n  const {\n    rtlTranslate: rtl,\n    params,\n    wrapperEl,\n    progress\n  } = swiper;\n  let x = 0;\n  let y = 0;\n  const z = 0;\n  if (swiper.isHorizontal()) {\n    x = rtl ? -translate : translate;\n  } else {\n    y = translate;\n  }\n  if (params.roundLengths) {\n    x = Math.floor(x);\n    y = Math.floor(y);\n  }\n  swiper.previousTranslate = swiper.translate;\n  swiper.translate = swiper.isHorizontal() ? x : y;\n  if (params.cssMode) {\n    wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n  } else if (!params.virtualTranslate) {\n    if (swiper.isHorizontal()) {\n      x -= swiper.cssOverflowAdjustment();\n    } else {\n      y -= swiper.cssOverflowAdjustment();\n    }\n    wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;\n  }\n\n  // Check if we need to update progress\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n  }\n  if (newProgress !== progress) {\n    swiper.updateProgress(translate);\n  }\n  swiper.emit('setTranslate', swiper.translate, byController);\n}\n\nfunction minTranslate() {\n  return -this.snapGrid[0];\n}\n\nfunction maxTranslate() {\n  return -this.snapGrid[this.snapGrid.length - 1];\n}\n\nfunction translateTo(translate, speed, runCallbacks, translateBounds, internal) {\n  if (translate === void 0) {\n    translate = 0;\n  }\n  if (speed === void 0) {\n    speed = this.params.speed;\n  }\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n  if (translateBounds === void 0) {\n    translateBounds = true;\n  }\n  const swiper = this;\n  const {\n    params,\n    wrapperEl\n  } = swiper;\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return false;\n  }\n  const minTranslate = swiper.minTranslate();\n  const maxTranslate = swiper.maxTranslate();\n  let newTranslate;\n  if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate;\n\n  // Update progress\n  swiper.updateProgress(newTranslate);\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n    if (speed === 0) {\n      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({\n          swiper,\n          targetPosition: -newTranslate,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: -newTranslate,\n        behavior: 'smooth'\n      });\n    }\n    return true;\n  }\n  if (speed === 0) {\n    swiper.setTransition(0);\n    swiper.setTranslate(newTranslate);\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionEnd');\n    }\n  } else {\n    swiper.setTransition(speed);\n    swiper.setTranslate(newTranslate);\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionStart');\n    }\n    if (!swiper.animating) {\n      swiper.animating = true;\n      if (!swiper.onTranslateToWrapperTransitionEnd) {\n        swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n          if (!swiper || swiper.destroyed) return;\n          if (e.target !== this) return;\n          swiper.wrapperEl.removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n          swiper.onTranslateToWrapperTransitionEnd = null;\n          delete swiper.onTranslateToWrapperTransitionEnd;\n          swiper.animating = false;\n          if (runCallbacks) {\n            swiper.emit('transitionEnd');\n          }\n        };\n      }\n      swiper.wrapperEl.addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n    }\n  }\n  return true;\n}\n\nvar translate = {\n  getTranslate: getSwiperTranslate,\n  setTranslate,\n  minTranslate,\n  maxTranslate,\n  translateTo\n};\n\nfunction setTransition(duration, byController) {\n  const swiper = this;\n  if (!swiper.params.cssMode) {\n    swiper.wrapperEl.style.transitionDuration = `${duration}ms`;\n    swiper.wrapperEl.style.transitionDelay = duration === 0 ? `0ms` : '';\n  }\n  swiper.emit('setTransition', duration, byController);\n}\n\nfunction transitionEmit(_ref) {\n  let {\n    swiper,\n    runCallbacks,\n    direction,\n    step\n  } = _ref;\n  const {\n    activeIndex,\n    previousIndex\n  } = swiper;\n  let dir = direction;\n  if (!dir) {\n    if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';\n  }\n  swiper.emit(`transition${step}`);\n  if (runCallbacks && activeIndex !== previousIndex) {\n    if (dir === 'reset') {\n      swiper.emit(`slideResetTransition${step}`);\n      return;\n    }\n    swiper.emit(`slideChangeTransition${step}`);\n    if (dir === 'next') {\n      swiper.emit(`slideNextTransition${step}`);\n    } else {\n      swiper.emit(`slidePrevTransition${step}`);\n    }\n  }\n}\n\nfunction transitionStart(runCallbacks, direction) {\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  if (params.cssMode) return;\n  if (params.autoHeight) {\n    swiper.updateAutoHeight();\n  }\n  transitionEmit({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'Start'\n  });\n}\n\nfunction transitionEnd(runCallbacks, direction) {\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  swiper.animating = false;\n  if (params.cssMode) return;\n  swiper.setTransition(0);\n  transitionEmit({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'End'\n  });\n}\n\nvar transition = {\n  setTransition,\n  transitionStart,\n  transitionEnd\n};\n\nfunction slideTo(index, speed, runCallbacks, internal, initial) {\n  if (index === void 0) {\n    index = 0;\n  }\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n  if (typeof index === 'string') {\n    index = parseInt(index, 10);\n  }\n  const swiper = this;\n  let slideIndex = index;\n  if (slideIndex < 0) slideIndex = 0;\n  const {\n    params,\n    snapGrid,\n    slidesGrid,\n    previousIndex,\n    activeIndex,\n    rtlTranslate: rtl,\n    wrapperEl,\n    enabled\n  } = swiper;\n  if (!enabled && !internal && !initial || swiper.destroyed || swiper.animating && params.preventInteractionOnTransition) {\n    return false;\n  }\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n  let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n  const translate = -snapGrid[snapIndex];\n  // Normalize slideIndex\n  if (params.normalizeSlideIndex) {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      const normalizedTranslate = -Math.floor(translate * 100);\n      const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n      const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {\n          slideIndex = i;\n        } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {\n          slideIndex = i + 1;\n        }\n      } else if (normalizedTranslate >= normalizedGrid) {\n        slideIndex = i;\n      }\n    }\n  }\n  // Directions locks\n  if (swiper.initialized && slideIndex !== activeIndex) {\n    if (!swiper.allowSlideNext && (rtl ? translate > swiper.translate && translate > swiper.minTranslate() : translate < swiper.translate && translate < swiper.minTranslate())) {\n      return false;\n    }\n    if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {\n      if ((activeIndex || 0) !== slideIndex) {\n        return false;\n      }\n    }\n  }\n  if (slideIndex !== (previousIndex || 0) && runCallbacks) {\n    swiper.emit('beforeSlideChangeStart');\n  }\n\n  // Update progress\n  swiper.updateProgress(translate);\n  let direction;\n  if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset';\n\n  // Update Index\n  if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {\n    swiper.updateActiveIndex(slideIndex);\n    // Update Height\n    if (params.autoHeight) {\n      swiper.updateAutoHeight();\n    }\n    swiper.updateSlidesClasses();\n    if (params.effect !== 'slide') {\n      swiper.setTranslate(translate);\n    }\n    if (direction !== 'reset') {\n      swiper.transitionStart(runCallbacks, direction);\n      swiper.transitionEnd(runCallbacks, direction);\n    }\n    return false;\n  }\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n    const t = rtl ? translate : -translate;\n    if (speed === 0) {\n      const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n      if (isVirtual) {\n        swiper.wrapperEl.style.scrollSnapType = 'none';\n        swiper._immediateVirtual = true;\n      }\n      if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {\n        swiper._cssModeVirtualInitialSet = true;\n        requestAnimationFrame(() => {\n          wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n        });\n      } else {\n        wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n      }\n      if (isVirtual) {\n        requestAnimationFrame(() => {\n          swiper.wrapperEl.style.scrollSnapType = '';\n          swiper._immediateVirtual = false;\n        });\n      }\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({\n          swiper,\n          targetPosition: t,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: t,\n        behavior: 'smooth'\n      });\n    }\n    return true;\n  }\n  swiper.setTransition(speed);\n  swiper.setTranslate(translate);\n  swiper.updateActiveIndex(slideIndex);\n  swiper.updateSlidesClasses();\n  swiper.emit('beforeTransitionStart', speed, internal);\n  swiper.transitionStart(runCallbacks, direction);\n  if (speed === 0) {\n    swiper.transitionEnd(runCallbacks, direction);\n  } else if (!swiper.animating) {\n    swiper.animating = true;\n    if (!swiper.onSlideToWrapperTransitionEnd) {\n      swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n        if (!swiper || swiper.destroyed) return;\n        if (e.target !== this) return;\n        swiper.wrapperEl.removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n        swiper.onSlideToWrapperTransitionEnd = null;\n        delete swiper.onSlideToWrapperTransitionEnd;\n        swiper.transitionEnd(runCallbacks, direction);\n      };\n    }\n    swiper.wrapperEl.addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n  }\n  return true;\n}\n\nfunction slideToLoop(index, speed, runCallbacks, internal) {\n  if (index === void 0) {\n    index = 0;\n  }\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n  if (typeof index === 'string') {\n    const indexAsNumber = parseInt(index, 10);\n    index = indexAsNumber;\n  }\n  const swiper = this;\n  if (swiper.destroyed) return;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  const gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;\n  let newIndex = index;\n  if (swiper.params.loop) {\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      // eslint-disable-next-line\n      newIndex = newIndex + swiper.virtual.slidesBefore;\n    } else {\n      let targetSlideIndex;\n      if (gridEnabled) {\n        const slideIndex = newIndex * swiper.params.grid.rows;\n        targetSlideIndex = swiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex)[0].column;\n      } else {\n        targetSlideIndex = swiper.getSlideIndexByData(newIndex);\n      }\n      const cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length;\n      const {\n        centeredSlides\n      } = swiper.params;\n      let slidesPerView = swiper.params.slidesPerView;\n      if (slidesPerView === 'auto') {\n        slidesPerView = swiper.slidesPerViewDynamic();\n      } else {\n        slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));\n        if (centeredSlides && slidesPerView % 2 === 0) {\n          slidesPerView = slidesPerView + 1;\n        }\n      }\n      let needLoopFix = cols - targetSlideIndex < slidesPerView;\n      if (centeredSlides) {\n        needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);\n      }\n      if (internal && centeredSlides && swiper.params.slidesPerView !== 'auto' && !gridEnabled) {\n        needLoopFix = false;\n      }\n      if (needLoopFix) {\n        const direction = centeredSlides ? targetSlideIndex < swiper.activeIndex ? 'prev' : 'next' : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? 'next' : 'prev';\n        swiper.loopFix({\n          direction,\n          slideTo: true,\n          activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,\n          slideRealIndex: direction === 'next' ? swiper.realIndex : undefined\n        });\n      }\n      if (gridEnabled) {\n        const slideIndex = newIndex * swiper.params.grid.rows;\n        newIndex = swiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex)[0].column;\n      } else {\n        newIndex = swiper.getSlideIndexByData(newIndex);\n      }\n    }\n  }\n  requestAnimationFrame(() => {\n    swiper.slideTo(newIndex, speed, runCallbacks, internal);\n  });\n  return swiper;\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slideNext(speed, runCallbacks, internal) {\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n  const swiper = this;\n  const {\n    enabled,\n    params,\n    animating\n  } = swiper;\n  if (!enabled || swiper.destroyed) return swiper;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  let perGroup = params.slidesPerGroup;\n  if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n    perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n  }\n  const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  if (params.loop) {\n    if (animating && !isVirtual && params.loopPreventsSliding) return false;\n    swiper.loopFix({\n      direction: 'next'\n    });\n    // eslint-disable-next-line\n    swiper._clientLeft = swiper.wrapperEl.clientLeft;\n    if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) {\n      requestAnimationFrame(() => {\n        swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n      });\n      return true;\n    }\n  }\n  if (params.rewind && swiper.isEnd) {\n    return swiper.slideTo(0, speed, runCallbacks, internal);\n  }\n  return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slidePrev(speed, runCallbacks, internal) {\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n  const swiper = this;\n  const {\n    params,\n    snapGrid,\n    slidesGrid,\n    rtlTranslate,\n    enabled,\n    animating\n  } = swiper;\n  if (!enabled || swiper.destroyed) return swiper;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  if (params.loop) {\n    if (animating && !isVirtual && params.loopPreventsSliding) return false;\n    swiper.loopFix({\n      direction: 'prev'\n    });\n    // eslint-disable-next-line\n    swiper._clientLeft = swiper.wrapperEl.clientLeft;\n  }\n  const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n  function normalize(val) {\n    if (val < 0) return -Math.floor(Math.abs(val));\n    return Math.floor(val);\n  }\n  const normalizedTranslate = normalize(translate);\n  const normalizedSnapGrid = snapGrid.map(val => normalize(val));\n  let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n  if (typeof prevSnap === 'undefined' && params.cssMode) {\n    let prevSnapIndex;\n    snapGrid.forEach((snap, snapIndex) => {\n      if (normalizedTranslate >= snap) {\n        // prevSnap = snap;\n        prevSnapIndex = snapIndex;\n      }\n    });\n    if (typeof prevSnapIndex !== 'undefined') {\n      prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n    }\n  }\n  let prevIndex = 0;\n  if (typeof prevSnap !== 'undefined') {\n    prevIndex = slidesGrid.indexOf(prevSnap);\n    if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n    if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n      prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n      prevIndex = Math.max(prevIndex, 0);\n    }\n  }\n  if (params.rewind && swiper.isBeginning) {\n    const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;\n    return swiper.slideTo(lastIndex, speed, runCallbacks, internal);\n  } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) {\n    requestAnimationFrame(() => {\n      swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n    });\n    return true;\n  }\n  return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slideReset(speed, runCallbacks, internal) {\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n  const swiper = this;\n  if (swiper.destroyed) return;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n\n/* eslint no-unused-vars: \"off\" */\nfunction slideToClosest(speed, runCallbacks, internal, threshold) {\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n  if (threshold === void 0) {\n    threshold = 0.5;\n  }\n  const swiper = this;\n  if (swiper.destroyed) return;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  let index = swiper.activeIndex;\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n  const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  if (translate >= swiper.snapGrid[snapIndex]) {\n    // The current translate is on or after the current snap index, so the choice\n    // is between the current index and the one after it.\n    const currentSnap = swiper.snapGrid[snapIndex];\n    const nextSnap = swiper.snapGrid[snapIndex + 1];\n    if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n      index += swiper.params.slidesPerGroup;\n    }\n  } else {\n    // The current translate is before the current snap index, so the choice\n    // is between the current index and the one before it.\n    const prevSnap = swiper.snapGrid[snapIndex - 1];\n    const currentSnap = swiper.snapGrid[snapIndex];\n    if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n      index -= swiper.params.slidesPerGroup;\n    }\n  }\n  index = Math.max(index, 0);\n  index = Math.min(index, swiper.slidesGrid.length - 1);\n  return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n\nfunction slideToClickedSlide() {\n  const swiper = this;\n  if (swiper.destroyed) return;\n  const {\n    params,\n    slidesEl\n  } = swiper;\n  const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n  let slideToIndex = swiper.clickedIndex;\n  let realIndex;\n  const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;\n  if (params.loop) {\n    if (swiper.animating) return;\n    realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);\n    if (params.centeredSlides) {\n      if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {\n        swiper.loopFix();\n        slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index=\"${realIndex}\"]`)[0]);\n        nextTick(() => {\n          swiper.slideTo(slideToIndex);\n        });\n      } else {\n        swiper.slideTo(slideToIndex);\n      }\n    } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n      swiper.loopFix();\n      slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index=\"${realIndex}\"]`)[0]);\n      nextTick(() => {\n        swiper.slideTo(slideToIndex);\n      });\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  } else {\n    swiper.slideTo(slideToIndex);\n  }\n}\n\nvar slide = {\n  slideTo,\n  slideToLoop,\n  slideNext,\n  slidePrev,\n  slideReset,\n  slideToClosest,\n  slideToClickedSlide\n};\n\nfunction loopCreate(slideRealIndex) {\n  const swiper = this;\n  const {\n    params,\n    slidesEl\n  } = swiper;\n  if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;\n  const initSlides = () => {\n    const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n    slides.forEach((el, index) => {\n      el.setAttribute('data-swiper-slide-index', index);\n    });\n  };\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n  const slidesPerGroup = params.slidesPerGroup * (gridEnabled ? params.grid.rows : 1);\n  const shouldFillGroup = swiper.slides.length % slidesPerGroup !== 0;\n  const shouldFillGrid = gridEnabled && swiper.slides.length % params.grid.rows !== 0;\n  const addBlankSlides = amountOfSlides => {\n    for (let i = 0; i < amountOfSlides; i += 1) {\n      const slideEl = swiper.isElement ? createElement('swiper-slide', [params.slideBlankClass]) : createElement('div', [params.slideClass, params.slideBlankClass]);\n      swiper.slidesEl.append(slideEl);\n    }\n  };\n  if (shouldFillGroup) {\n    if (params.loopAddBlankSlides) {\n      const slidesToAdd = slidesPerGroup - swiper.slides.length % slidesPerGroup;\n      addBlankSlides(slidesToAdd);\n      swiper.recalcSlides();\n      swiper.updateSlides();\n    } else {\n      showWarning('Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)');\n    }\n    initSlides();\n  } else if (shouldFillGrid) {\n    if (params.loopAddBlankSlides) {\n      const slidesToAdd = params.grid.rows - swiper.slides.length % params.grid.rows;\n      addBlankSlides(slidesToAdd);\n      swiper.recalcSlides();\n      swiper.updateSlides();\n    } else {\n      showWarning('Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)');\n    }\n    initSlides();\n  } else {\n    initSlides();\n  }\n  swiper.loopFix({\n    slideRealIndex,\n    direction: params.centeredSlides ? undefined : 'next'\n  });\n}\n\nfunction loopFix(_temp) {\n  let {\n    slideRealIndex,\n    slideTo = true,\n    direction,\n    setTranslate,\n    activeSlideIndex,\n    byController,\n    byMousewheel\n  } = _temp === void 0 ? {} : _temp;\n  const swiper = this;\n  if (!swiper.params.loop) return;\n  swiper.emit('beforeLoopFix');\n  const {\n    slides,\n    allowSlidePrev,\n    allowSlideNext,\n    slidesEl,\n    params\n  } = swiper;\n  const {\n    centeredSlides\n  } = params;\n  swiper.allowSlidePrev = true;\n  swiper.allowSlideNext = true;\n  if (swiper.virtual && params.virtual.enabled) {\n    if (slideTo) {\n      if (!params.centeredSlides && swiper.snapIndex === 0) {\n        swiper.slideTo(swiper.virtual.slides.length, 0, false, true);\n      } else if (params.centeredSlides && swiper.snapIndex < params.slidesPerView) {\n        swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);\n      } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {\n        swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);\n      }\n    }\n    swiper.allowSlidePrev = allowSlidePrev;\n    swiper.allowSlideNext = allowSlideNext;\n    swiper.emit('loopFix');\n    return;\n  }\n  let slidesPerView = params.slidesPerView;\n  if (slidesPerView === 'auto') {\n    slidesPerView = swiper.slidesPerViewDynamic();\n  } else {\n    slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10));\n    if (centeredSlides && slidesPerView % 2 === 0) {\n      slidesPerView = slidesPerView + 1;\n    }\n  }\n  const slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup;\n  let loopedSlides = slidesPerGroup;\n  if (loopedSlides % slidesPerGroup !== 0) {\n    loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup;\n  }\n  loopedSlides += params.loopAdditionalSlides;\n  swiper.loopedSlides = loopedSlides;\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n  if (slides.length < slidesPerView + loopedSlides) {\n    showWarning('Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled and not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters');\n  } else if (gridEnabled && params.grid.fill === 'row') {\n    showWarning('Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`');\n  }\n  const prependSlidesIndexes = [];\n  const appendSlidesIndexes = [];\n  let activeIndex = swiper.activeIndex;\n  if (typeof activeSlideIndex === 'undefined') {\n    activeSlideIndex = swiper.getSlideIndex(slides.filter(el => el.classList.contains(params.slideActiveClass))[0]);\n  } else {\n    activeIndex = activeSlideIndex;\n  }\n  const isNext = direction === 'next' || !direction;\n  const isPrev = direction === 'prev' || !direction;\n  let slidesPrepended = 0;\n  let slidesAppended = 0;\n  const cols = gridEnabled ? Math.ceil(slides.length / params.grid.rows) : slides.length;\n  const activeColIndex = gridEnabled ? slides[activeSlideIndex].column : activeSlideIndex;\n  const activeColIndexWithShift = activeColIndex + (centeredSlides && typeof setTranslate === 'undefined' ? -slidesPerView / 2 + 0.5 : 0);\n  // prepend last slides before start\n  if (activeColIndexWithShift < loopedSlides) {\n    slidesPrepended = Math.max(loopedSlides - activeColIndexWithShift, slidesPerGroup);\n    for (let i = 0; i < loopedSlides - activeColIndexWithShift; i += 1) {\n      const index = i - Math.floor(i / cols) * cols;\n      if (gridEnabled) {\n        const colIndexToPrepend = cols - index - 1;\n        for (let i = slides.length - 1; i >= 0; i -= 1) {\n          if (slides[i].column === colIndexToPrepend) prependSlidesIndexes.push(i);\n        }\n        // slides.forEach((slide, slideIndex) => {\n        //   if (slide.column === colIndexToPrepend) prependSlidesIndexes.push(slideIndex);\n        // });\n      } else {\n        prependSlidesIndexes.push(cols - index - 1);\n      }\n    }\n  } else if (activeColIndexWithShift + slidesPerView > cols - loopedSlides) {\n    slidesAppended = Math.max(activeColIndexWithShift - (cols - loopedSlides * 2), slidesPerGroup);\n    for (let i = 0; i < slidesAppended; i += 1) {\n      const index = i - Math.floor(i / cols) * cols;\n      if (gridEnabled) {\n        slides.forEach((slide, slideIndex) => {\n          if (slide.column === index) appendSlidesIndexes.push(slideIndex);\n        });\n      } else {\n        appendSlidesIndexes.push(index);\n      }\n    }\n  }\n  swiper.__preventObserver__ = true;\n  requestAnimationFrame(() => {\n    swiper.__preventObserver__ = false;\n  });\n  if (isPrev) {\n    prependSlidesIndexes.forEach(index => {\n      slides[index].swiperLoopMoveDOM = true;\n      slidesEl.prepend(slides[index]);\n      slides[index].swiperLoopMoveDOM = false;\n    });\n  }\n  if (isNext) {\n    appendSlidesIndexes.forEach(index => {\n      slides[index].swiperLoopMoveDOM = true;\n      slidesEl.append(slides[index]);\n      slides[index].swiperLoopMoveDOM = false;\n    });\n  }\n  swiper.recalcSlides();\n  if (params.slidesPerView === 'auto') {\n    swiper.updateSlides();\n  } else if (gridEnabled && (prependSlidesIndexes.length > 0 && isPrev || appendSlidesIndexes.length > 0 && isNext)) {\n    swiper.slides.forEach((slide, slideIndex) => {\n      swiper.grid.updateSlide(slideIndex, slide, swiper.slides);\n    });\n  }\n  if (params.watchSlidesProgress) {\n    swiper.updateSlidesOffset();\n  }\n  if (slideTo) {\n    if (prependSlidesIndexes.length > 0 && isPrev) {\n      if (typeof slideRealIndex === 'undefined') {\n        const currentSlideTranslate = swiper.slidesGrid[activeIndex];\n        const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];\n        const diff = newSlideTranslate - currentSlideTranslate;\n        if (byMousewheel) {\n          swiper.setTranslate(swiper.translate - diff);\n        } else {\n          swiper.slideTo(activeIndex + Math.ceil(slidesPrepended), 0, false, true);\n          if (setTranslate) {\n            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;\n            swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;\n          }\n        }\n      } else {\n        if (setTranslate) {\n          const shift = gridEnabled ? prependSlidesIndexes.length / params.grid.rows : prependSlidesIndexes.length;\n          swiper.slideTo(swiper.activeIndex + shift, 0, false, true);\n          swiper.touchEventsData.currentTranslate = swiper.translate;\n        }\n      }\n    } else if (appendSlidesIndexes.length > 0 && isNext) {\n      if (typeof slideRealIndex === 'undefined') {\n        const currentSlideTranslate = swiper.slidesGrid[activeIndex];\n        const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];\n        const diff = newSlideTranslate - currentSlideTranslate;\n        if (byMousewheel) {\n          swiper.setTranslate(swiper.translate - diff);\n        } else {\n          swiper.slideTo(activeIndex - slidesAppended, 0, false, true);\n          if (setTranslate) {\n            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;\n            swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;\n          }\n        }\n      } else {\n        const shift = gridEnabled ? appendSlidesIndexes.length / params.grid.rows : appendSlidesIndexes.length;\n        swiper.slideTo(swiper.activeIndex - shift, 0, false, true);\n      }\n    }\n  }\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n  if (swiper.controller && swiper.controller.control && !byController) {\n    const loopParams = {\n      slideRealIndex,\n      direction,\n      setTranslate,\n      activeSlideIndex,\n      byController: true\n    };\n    if (Array.isArray(swiper.controller.control)) {\n      swiper.controller.control.forEach(c => {\n        if (!c.destroyed && c.params.loop) c.loopFix({\n          ...loopParams,\n          slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo : false\n        });\n      });\n    } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) {\n      swiper.controller.control.loopFix({\n        ...loopParams,\n        slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo : false\n      });\n    }\n  }\n  swiper.emit('loopFix');\n}\n\nfunction loopDestroy() {\n  const swiper = this;\n  const {\n    params,\n    slidesEl\n  } = swiper;\n  if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;\n  swiper.recalcSlides();\n  const newSlidesOrder = [];\n  swiper.slides.forEach(slideEl => {\n    const index = typeof slideEl.swiperSlideIndex === 'undefined' ? slideEl.getAttribute('data-swiper-slide-index') * 1 : slideEl.swiperSlideIndex;\n    newSlidesOrder[index] = slideEl;\n  });\n  swiper.slides.forEach(slideEl => {\n    slideEl.removeAttribute('data-swiper-slide-index');\n  });\n  newSlidesOrder.forEach(slideEl => {\n    slidesEl.append(slideEl);\n  });\n  swiper.recalcSlides();\n  swiper.slideTo(swiper.realIndex, 0);\n}\n\nvar loop = {\n  loopCreate,\n  loopFix,\n  loopDestroy\n};\n\nfunction setGrabCursor(moving) {\n  const swiper = this;\n  if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;\n  const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n  if (swiper.isElement) {\n    swiper.__preventObserver__ = true;\n  }\n  el.style.cursor = 'move';\n  el.style.cursor = moving ? 'grabbing' : 'grab';\n  if (swiper.isElement) {\n    requestAnimationFrame(() => {\n      swiper.__preventObserver__ = false;\n    });\n  }\n}\n\nfunction unsetGrabCursor() {\n  const swiper = this;\n  if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {\n    return;\n  }\n  if (swiper.isElement) {\n    swiper.__preventObserver__ = true;\n  }\n  swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n  if (swiper.isElement) {\n    requestAnimationFrame(() => {\n      swiper.__preventObserver__ = false;\n    });\n  }\n}\n\nvar grabCursor = {\n  setGrabCursor,\n  unsetGrabCursor\n};\n\n// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\nfunction closestElement(selector, base) {\n  if (base === void 0) {\n    base = this;\n  }\n  function __closestFrom(el) {\n    if (!el || el === getDocument() || el === getWindow()) return null;\n    if (el.assignedSlot) el = el.assignedSlot;\n    const found = el.closest(selector);\n    if (!found && !el.getRootNode) {\n      return null;\n    }\n    return found || __closestFrom(el.getRootNode().host);\n  }\n  return __closestFrom(base);\n}\nfunction preventEdgeSwipe(swiper, event, startX) {\n  const window = getWindow();\n  const {\n    params\n  } = swiper;\n  const edgeSwipeDetection = params.edgeSwipeDetection;\n  const edgeSwipeThreshold = params.edgeSwipeThreshold;\n  if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {\n    if (edgeSwipeDetection === 'prevent') {\n      event.preventDefault();\n      return true;\n    }\n    return false;\n  }\n  return true;\n}\nfunction onTouchStart(event) {\n  const swiper = this;\n  const document = getDocument();\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  const data = swiper.touchEventsData;\n  if (e.type === 'pointerdown') {\n    if (data.pointerId !== null && data.pointerId !== e.pointerId) {\n      return;\n    }\n    data.pointerId = e.pointerId;\n  } else if (e.type === 'touchstart' && e.targetTouches.length === 1) {\n    data.touchId = e.targetTouches[0].identifier;\n  }\n  if (e.type === 'touchstart') {\n    // don't proceed touch event\n    preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX);\n    return;\n  }\n  const {\n    params,\n    touches,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  if (!params.simulateTouch && e.pointerType === 'mouse') return;\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return;\n  }\n  if (!swiper.animating && params.cssMode && params.loop) {\n    swiper.loopFix();\n  }\n  let targetEl = e.target;\n  if (params.touchEventsTarget === 'wrapper') {\n    if (!swiper.wrapperEl.contains(targetEl)) return;\n  }\n  if ('which' in e && e.which === 3) return;\n  if ('button' in e && e.button > 0) return;\n  if (data.isTouched && data.isMoved) return;\n\n  // change target el for shadow root component\n  const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n  // eslint-disable-next-line\n  const eventPath = e.composedPath ? e.composedPath() : e.path;\n  if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {\n    targetEl = eventPath[0];\n  }\n  const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;\n  const isTargetShadow = !!(e.target && e.target.shadowRoot);\n\n  // use closestElement for shadow root element to get the actual closest for nested shadow root element\n  if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) {\n    swiper.allowClick = true;\n    return;\n  }\n  if (params.swipeHandler) {\n    if (!targetEl.closest(params.swipeHandler)) return;\n  }\n  touches.currentX = e.pageX;\n  touches.currentY = e.pageY;\n  const startX = touches.currentX;\n  const startY = touches.currentY;\n\n  // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n  if (!preventEdgeSwipe(swiper, e, startX)) {\n    return;\n  }\n  Object.assign(data, {\n    isTouched: true,\n    isMoved: false,\n    allowTouchCallbacks: true,\n    isScrolling: undefined,\n    startMoving: undefined\n  });\n  touches.startX = startX;\n  touches.startY = startY;\n  data.touchStartTime = now();\n  swiper.allowClick = true;\n  swiper.updateSize();\n  swiper.swipeDirection = undefined;\n  if (params.threshold > 0) data.allowThresholdMove = false;\n  let preventDefault = true;\n  if (targetEl.matches(data.focusableElements)) {\n    preventDefault = false;\n    if (targetEl.nodeName === 'SELECT') {\n      data.isTouched = false;\n    }\n  }\n  if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== targetEl) {\n    document.activeElement.blur();\n  }\n  const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n  if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) {\n    e.preventDefault();\n  }\n  if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {\n    swiper.freeMode.onTouchStart();\n  }\n  swiper.emit('touchStart', e);\n}\n\nfunction onTouchMove(event) {\n  const document = getDocument();\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  if (!params.simulateTouch && event.pointerType === 'mouse') return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  if (e.type === 'pointermove') {\n    if (data.touchId !== null) return; // return from pointer if we use touch\n    const id = e.pointerId;\n    if (id !== data.pointerId) return;\n  }\n  let targetTouch;\n  if (e.type === 'touchmove') {\n    targetTouch = [...e.changedTouches].filter(t => t.identifier === data.touchId)[0];\n    if (!targetTouch || targetTouch.identifier !== data.touchId) return;\n  } else {\n    targetTouch = e;\n  }\n  if (!data.isTouched) {\n    if (data.startMoving && data.isScrolling) {\n      swiper.emit('touchMoveOpposite', e);\n    }\n    return;\n  }\n  const pageX = targetTouch.pageX;\n  const pageY = targetTouch.pageY;\n  if (e.preventedByNestedSwiper) {\n    touches.startX = pageX;\n    touches.startY = pageY;\n    return;\n  }\n  if (!swiper.allowTouchMove) {\n    if (!e.target.matches(data.focusableElements)) {\n      swiper.allowClick = false;\n    }\n    if (data.isTouched) {\n      Object.assign(touches, {\n        startX: pageX,\n        startY: pageY,\n        currentX: pageX,\n        currentY: pageY\n      });\n      data.touchStartTime = now();\n    }\n    return;\n  }\n  if (params.touchReleaseOnEdges && !params.loop) {\n    if (swiper.isVertical()) {\n      // Vertical\n      if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {\n        data.isTouched = false;\n        data.isMoved = false;\n        return;\n      }\n    } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {\n      return;\n    }\n  }\n  if (document.activeElement) {\n    if (e.target === document.activeElement && e.target.matches(data.focusableElements)) {\n      data.isMoved = true;\n      swiper.allowClick = false;\n      return;\n    }\n  }\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchMove', e);\n  }\n  touches.previousX = touches.currentX;\n  touches.previousY = touches.currentY;\n  touches.currentX = pageX;\n  touches.currentY = pageY;\n  const diffX = touches.currentX - touches.startX;\n  const diffY = touches.currentY - touches.startY;\n  if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;\n  if (typeof data.isScrolling === 'undefined') {\n    let touchAngle;\n    if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {\n      data.isScrolling = false;\n    } else {\n      // eslint-disable-next-line\n      if (diffX * diffX + diffY * diffY >= 25) {\n        touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;\n        data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;\n      }\n    }\n  }\n  if (data.isScrolling) {\n    swiper.emit('touchMoveOpposite', e);\n  }\n  if (typeof data.startMoving === 'undefined') {\n    if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n      data.startMoving = true;\n    }\n  }\n  if (data.isScrolling || e.type === 'touchmove' && data.preventTouchMoveFromPointerMove) {\n    data.isTouched = false;\n    return;\n  }\n  if (!data.startMoving) {\n    return;\n  }\n  swiper.allowClick = false;\n  if (!params.cssMode && e.cancelable) {\n    e.preventDefault();\n  }\n  if (params.touchMoveStopPropagation && !params.nested) {\n    e.stopPropagation();\n  }\n  let diff = swiper.isHorizontal() ? diffX : diffY;\n  let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;\n  if (params.oneWayMovement) {\n    diff = Math.abs(diff) * (rtl ? 1 : -1);\n    touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);\n  }\n  touches.diff = diff;\n  diff *= params.touchRatio;\n  if (rtl) {\n    diff = -diff;\n    touchesDiff = -touchesDiff;\n  }\n  const prevTouchesDirection = swiper.touchesDirection;\n  swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n  swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next';\n  const isLoop = swiper.params.loop && !params.cssMode;\n  const allowLoopFix = swiper.touchesDirection === 'next' && swiper.allowSlideNext || swiper.touchesDirection === 'prev' && swiper.allowSlidePrev;\n  if (!data.isMoved) {\n    if (isLoop && allowLoopFix) {\n      swiper.loopFix({\n        direction: swiper.swipeDirection\n      });\n    }\n    data.startTranslate = swiper.getTranslate();\n    swiper.setTransition(0);\n    if (swiper.animating) {\n      const evt = new window.CustomEvent('transitionend', {\n        bubbles: true,\n        cancelable: true,\n        detail: {\n          bySwiperTouchMove: true\n        }\n      });\n      swiper.wrapperEl.dispatchEvent(evt);\n    }\n    data.allowMomentumBounce = false;\n    // Grab Cursor\n    if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n      swiper.setGrabCursor(true);\n    }\n    swiper.emit('sliderFirstMove', e);\n  }\n  let loopFixed;\n  new Date().getTime();\n  if (data.isMoved && data.allowThresholdMove && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) {\n    Object.assign(touches, {\n      startX: pageX,\n      startY: pageY,\n      currentX: pageX,\n      currentY: pageY,\n      startTranslate: data.currentTranslate\n    });\n    data.loopSwapReset = true;\n    data.startTranslate = data.currentTranslate;\n    return;\n  }\n  swiper.emit('sliderMove', e);\n  data.isMoved = true;\n  data.currentTranslate = diff + data.startTranslate;\n  let disableParentSwiper = true;\n  let resistanceRatio = params.resistanceRatio;\n  if (params.touchReleaseOnEdges) {\n    resistanceRatio = 0;\n  }\n  if (diff > 0) {\n    if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.slidesSizesGrid[swiper.activeIndex + 1] : swiper.minTranslate())) {\n      swiper.loopFix({\n        direction: 'prev',\n        setTranslate: true,\n        activeSlideIndex: 0\n      });\n    }\n    if (data.currentTranslate > swiper.minTranslate()) {\n      disableParentSwiper = false;\n      if (params.resistance) {\n        data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n      }\n    }\n  } else if (diff < 0) {\n    if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] : swiper.maxTranslate())) {\n      swiper.loopFix({\n        direction: 'next',\n        setTranslate: true,\n        activeSlideIndex: swiper.slides.length - (params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))\n      });\n    }\n    if (data.currentTranslate < swiper.maxTranslate()) {\n      disableParentSwiper = false;\n      if (params.resistance) {\n        data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n      }\n    }\n  }\n  if (disableParentSwiper) {\n    e.preventedByNestedSwiper = true;\n  }\n\n  // Directions locks\n  if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n  if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n  if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n    data.currentTranslate = data.startTranslate;\n  }\n\n  // Threshold\n  if (params.threshold > 0) {\n    if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n      if (!data.allowThresholdMove) {\n        data.allowThresholdMove = true;\n        touches.startX = touches.currentX;\n        touches.startY = touches.currentY;\n        data.currentTranslate = data.startTranslate;\n        touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;\n        return;\n      }\n    } else {\n      data.currentTranslate = data.startTranslate;\n      return;\n    }\n  }\n  if (!params.followFinger || params.cssMode) return;\n\n  // Update active index in free mode\n  if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n  if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n    swiper.freeMode.onTouchMove();\n  }\n  // Update progress\n  swiper.updateProgress(data.currentTranslate);\n  // Update translate\n  swiper.setTranslate(data.currentTranslate);\n}\n\nfunction onTouchEnd(event) {\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  let targetTouch;\n  const isTouchEvent = e.type === 'touchend' || e.type === 'touchcancel';\n  if (!isTouchEvent) {\n    if (data.touchId !== null) return; // return from pointer if we use touch\n    if (e.pointerId !== data.pointerId) return;\n    targetTouch = e;\n  } else {\n    targetTouch = [...e.changedTouches].filter(t => t.identifier === data.touchId)[0];\n    if (!targetTouch || targetTouch.identifier !== data.touchId) return;\n  }\n  if (['pointercancel', 'pointerout', 'pointerleave', 'contextmenu'].includes(e.type)) {\n    const proceed = ['pointercancel', 'contextmenu'].includes(e.type) && (swiper.browser.isSafari || swiper.browser.isWebView);\n    if (!proceed) {\n      return;\n    }\n  }\n  data.pointerId = null;\n  data.touchId = null;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    slidesGrid,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  if (!params.simulateTouch && e.pointerType === 'mouse') return;\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchEnd', e);\n  }\n  data.allowTouchCallbacks = false;\n  if (!data.isTouched) {\n    if (data.isMoved && params.grabCursor) {\n      swiper.setGrabCursor(false);\n    }\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  }\n\n  // Return Grab Cursor\n  if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n    swiper.setGrabCursor(false);\n  }\n\n  // Time diff\n  const touchEndTime = now();\n  const timeDiff = touchEndTime - data.touchStartTime;\n\n  // Tap, doubleTap, Click\n  if (swiper.allowClick) {\n    const pathTree = e.path || e.composedPath && e.composedPath();\n    swiper.updateClickedSlide(pathTree && pathTree[0] || e.target, pathTree);\n    swiper.emit('tap click', e);\n    if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n      swiper.emit('doubleTap doubleClick', e);\n    }\n  }\n  data.lastClickTime = now();\n  nextTick(() => {\n    if (!swiper.destroyed) swiper.allowClick = true;\n  });\n  if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 && !data.loopSwapReset || data.currentTranslate === data.startTranslate && !data.loopSwapReset) {\n    data.isTouched = false;\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  }\n  data.isTouched = false;\n  data.isMoved = false;\n  data.startMoving = false;\n  let currentPos;\n  if (params.followFinger) {\n    currentPos = rtl ? swiper.translate : -swiper.translate;\n  } else {\n    currentPos = -data.currentTranslate;\n  }\n  if (params.cssMode) {\n    return;\n  }\n  if (params.freeMode && params.freeMode.enabled) {\n    swiper.freeMode.onTouchEnd({\n      currentPos\n    });\n    return;\n  }\n\n  // Find current slide\n  const swipeToLast = currentPos >= -swiper.maxTranslate() && !swiper.params.loop;\n  let stopIndex = 0;\n  let groupSize = swiper.slidesSizesGrid[0];\n  for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {\n    const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n    if (typeof slidesGrid[i + increment] !== 'undefined') {\n      if (swipeToLast || currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n        stopIndex = i;\n        groupSize = slidesGrid[i + increment] - slidesGrid[i];\n      }\n    } else if (swipeToLast || currentPos >= slidesGrid[i]) {\n      stopIndex = i;\n      groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n    }\n  }\n  let rewindFirstIndex = null;\n  let rewindLastIndex = null;\n  if (params.rewind) {\n    if (swiper.isBeginning) {\n      rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;\n    } else if (swiper.isEnd) {\n      rewindFirstIndex = 0;\n    }\n  }\n  // Find current slide size\n  const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n  const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n  if (timeDiff > params.longSwipesMs) {\n    // Long touches\n    if (!params.longSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n    if (swiper.swipeDirection === 'next') {\n      if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);\n    }\n    if (swiper.swipeDirection === 'prev') {\n      if (ratio > 1 - params.longSwipesRatio) {\n        swiper.slideTo(stopIndex + increment);\n      } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {\n        swiper.slideTo(rewindLastIndex);\n      } else {\n        swiper.slideTo(stopIndex);\n      }\n    }\n  } else {\n    // Short swipes\n    if (!params.shortSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n    const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n    if (!isNavButtonTarget) {\n      if (swiper.swipeDirection === 'next') {\n        swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);\n      }\n      if (swiper.swipeDirection === 'prev') {\n        swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);\n      }\n    } else if (e.target === swiper.navigation.nextEl) {\n      swiper.slideTo(stopIndex + increment);\n    } else {\n      swiper.slideTo(stopIndex);\n    }\n  }\n}\n\nfunction onResize() {\n  const swiper = this;\n  const {\n    params,\n    el\n  } = swiper;\n  if (el && el.offsetWidth === 0) return;\n\n  // Breakpoints\n  if (params.breakpoints) {\n    swiper.setBreakpoint();\n  }\n\n  // Save locks\n  const {\n    allowSlideNext,\n    allowSlidePrev,\n    snapGrid\n  } = swiper;\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n  // Disable locks on resize\n  swiper.allowSlideNext = true;\n  swiper.allowSlidePrev = true;\n  swiper.updateSize();\n  swiper.updateSlides();\n  swiper.updateSlidesClasses();\n  const isVirtualLoop = isVirtual && params.loop;\n  if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) {\n    swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n  } else {\n    if (swiper.params.loop && !isVirtual) {\n      swiper.slideToLoop(swiper.realIndex, 0, false, true);\n    } else {\n      swiper.slideTo(swiper.activeIndex, 0, false, true);\n    }\n  }\n  if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n    clearTimeout(swiper.autoplay.resizeTimeout);\n    swiper.autoplay.resizeTimeout = setTimeout(() => {\n      if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n        swiper.autoplay.resume();\n      }\n    }, 500);\n  }\n  // Return locks after resize\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n  if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n    swiper.checkOverflow();\n  }\n}\n\nfunction onClick(e) {\n  const swiper = this;\n  if (!swiper.enabled) return;\n  if (!swiper.allowClick) {\n    if (swiper.params.preventClicks) e.preventDefault();\n    if (swiper.params.preventClicksPropagation && swiper.animating) {\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    }\n  }\n}\n\nfunction onScroll() {\n  const swiper = this;\n  const {\n    wrapperEl,\n    rtlTranslate,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  swiper.previousTranslate = swiper.translate;\n  if (swiper.isHorizontal()) {\n    swiper.translate = -wrapperEl.scrollLeft;\n  } else {\n    swiper.translate = -wrapperEl.scrollTop;\n  }\n  // eslint-disable-next-line\n  if (swiper.translate === 0) swiper.translate = 0;\n  swiper.updateActiveIndex();\n  swiper.updateSlidesClasses();\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n  }\n  if (newProgress !== swiper.progress) {\n    swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n  }\n  swiper.emit('setTranslate', swiper.translate, false);\n}\n\nfunction onLoad(e) {\n  const swiper = this;\n  processLazyPreloader(swiper, e.target);\n  if (swiper.params.cssMode || swiper.params.slidesPerView !== 'auto' && !swiper.params.autoHeight) {\n    return;\n  }\n  swiper.update();\n}\n\nfunction onDocumentTouchStart() {\n  const swiper = this;\n  if (swiper.documentTouchHandlerProceeded) return;\n  swiper.documentTouchHandlerProceeded = true;\n  if (swiper.params.touchReleaseOnEdges) {\n    swiper.el.style.touchAction = 'auto';\n  }\n}\n\nconst events = (swiper, method) => {\n  const document = getDocument();\n  const {\n    params,\n    el,\n    wrapperEl,\n    device\n  } = swiper;\n  const capture = !!params.nested;\n  const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n  const swiperMethod = method;\n\n  // Touch Events\n  document[domMethod]('touchstart', swiper.onDocumentTouchStart, {\n    passive: false,\n    capture\n  });\n  el[domMethod]('touchstart', swiper.onTouchStart, {\n    passive: false\n  });\n  el[domMethod]('pointerdown', swiper.onTouchStart, {\n    passive: false\n  });\n  document[domMethod]('touchmove', swiper.onTouchMove, {\n    passive: false,\n    capture\n  });\n  document[domMethod]('pointermove', swiper.onTouchMove, {\n    passive: false,\n    capture\n  });\n  document[domMethod]('touchend', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('pointerup', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('pointercancel', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('touchcancel', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('pointerout', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('pointerleave', swiper.onTouchEnd, {\n    passive: true\n  });\n  document[domMethod]('contextmenu', swiper.onTouchEnd, {\n    passive: true\n  });\n\n  // Prevent Links Clicks\n  if (params.preventClicks || params.preventClicksPropagation) {\n    el[domMethod]('click', swiper.onClick, true);\n  }\n  if (params.cssMode) {\n    wrapperEl[domMethod]('scroll', swiper.onScroll);\n  }\n\n  // Resize handler\n  if (params.updateOnWindowResize) {\n    swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);\n  } else {\n    swiper[swiperMethod]('observerUpdate', onResize, true);\n  }\n\n  // Images loader\n  el[domMethod]('load', swiper.onLoad, {\n    capture: true\n  });\n};\nfunction attachEvents() {\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  swiper.onTouchStart = onTouchStart.bind(swiper);\n  swiper.onTouchMove = onTouchMove.bind(swiper);\n  swiper.onTouchEnd = onTouchEnd.bind(swiper);\n  swiper.onDocumentTouchStart = onDocumentTouchStart.bind(swiper);\n  if (params.cssMode) {\n    swiper.onScroll = onScroll.bind(swiper);\n  }\n  swiper.onClick = onClick.bind(swiper);\n  swiper.onLoad = onLoad.bind(swiper);\n  events(swiper, 'on');\n}\nfunction detachEvents() {\n  const swiper = this;\n  events(swiper, 'off');\n}\nvar events$1 = {\n  attachEvents,\n  detachEvents\n};\n\nconst isGridEnabled = (swiper, params) => {\n  return swiper.grid && params.grid && params.grid.rows > 1;\n};\nfunction setBreakpoint() {\n  const swiper = this;\n  const {\n    realIndex,\n    initialized,\n    params,\n    el\n  } = swiper;\n  const breakpoints = params.breakpoints;\n  if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return;\n\n  // Get breakpoint for window width and update parameters\n  const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n  if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n  const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n  const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n  const wasMultiRow = isGridEnabled(swiper, params);\n  const isMultiRow = isGridEnabled(swiper, breakpointParams);\n  const wasGrabCursor = swiper.params.grabCursor;\n  const isGrabCursor = breakpointParams.grabCursor;\n  const wasEnabled = params.enabled;\n  if (wasMultiRow && !isMultiRow) {\n    el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);\n    swiper.emitContainerClasses();\n  } else if (!wasMultiRow && isMultiRow) {\n    el.classList.add(`${params.containerModifierClass}grid`);\n    if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {\n      el.classList.add(`${params.containerModifierClass}grid-column`);\n    }\n    swiper.emitContainerClasses();\n  }\n  if (wasGrabCursor && !isGrabCursor) {\n    swiper.unsetGrabCursor();\n  } else if (!wasGrabCursor && isGrabCursor) {\n    swiper.setGrabCursor();\n  }\n\n  // Toggle navigation, pagination, scrollbar\n  ['navigation', 'pagination', 'scrollbar'].forEach(prop => {\n    if (typeof breakpointParams[prop] === 'undefined') return;\n    const wasModuleEnabled = params[prop] && params[prop].enabled;\n    const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;\n    if (wasModuleEnabled && !isModuleEnabled) {\n      swiper[prop].disable();\n    }\n    if (!wasModuleEnabled && isModuleEnabled) {\n      swiper[prop].enable();\n    }\n  });\n  const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;\n  const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n  const wasLoop = params.loop;\n  if (directionChanged && initialized) {\n    swiper.changeDirection();\n  }\n  extend(swiper.params, breakpointParams);\n  const isEnabled = swiper.params.enabled;\n  const hasLoop = swiper.params.loop;\n  Object.assign(swiper, {\n    allowTouchMove: swiper.params.allowTouchMove,\n    allowSlideNext: swiper.params.allowSlideNext,\n    allowSlidePrev: swiper.params.allowSlidePrev\n  });\n  if (wasEnabled && !isEnabled) {\n    swiper.disable();\n  } else if (!wasEnabled && isEnabled) {\n    swiper.enable();\n  }\n  swiper.currentBreakpoint = breakpoint;\n  swiper.emit('_beforeBreakpoint', breakpointParams);\n  if (initialized) {\n    if (needsReLoop) {\n      swiper.loopDestroy();\n      swiper.loopCreate(realIndex);\n      swiper.updateSlides();\n    } else if (!wasLoop && hasLoop) {\n      swiper.loopCreate(realIndex);\n      swiper.updateSlides();\n    } else if (wasLoop && !hasLoop) {\n      swiper.loopDestroy();\n    }\n  }\n  swiper.emit('breakpoint', breakpointParams);\n}\n\nfunction getBreakpoint(breakpoints, base, containerEl) {\n  if (base === void 0) {\n    base = 'window';\n  }\n  if (!breakpoints || base === 'container' && !containerEl) return undefined;\n  let breakpoint = false;\n  const window = getWindow();\n  const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n  const points = Object.keys(breakpoints).map(point => {\n    if (typeof point === 'string' && point.indexOf('@') === 0) {\n      const minRatio = parseFloat(point.substr(1));\n      const value = currentHeight * minRatio;\n      return {\n        value,\n        point\n      };\n    }\n    return {\n      value: point,\n      point\n    };\n  });\n  points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n  for (let i = 0; i < points.length; i += 1) {\n    const {\n      point,\n      value\n    } = points[i];\n    if (base === 'window') {\n      if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n        breakpoint = point;\n      }\n    } else if (value <= containerEl.clientWidth) {\n      breakpoint = point;\n    }\n  }\n  return breakpoint || 'max';\n}\n\nvar breakpoints = {\n  setBreakpoint,\n  getBreakpoint\n};\n\nfunction prepareClasses(entries, prefix) {\n  const resultClasses = [];\n  entries.forEach(item => {\n    if (typeof item === 'object') {\n      Object.keys(item).forEach(classNames => {\n        if (item[classNames]) {\n          resultClasses.push(prefix + classNames);\n        }\n      });\n    } else if (typeof item === 'string') {\n      resultClasses.push(prefix + item);\n    }\n  });\n  return resultClasses;\n}\nfunction addClasses() {\n  const swiper = this;\n  const {\n    classNames,\n    params,\n    rtl,\n    el,\n    device\n  } = swiper;\n  // prettier-ignore\n  const suffixes = prepareClasses(['initialized', params.direction, {\n    'free-mode': swiper.params.freeMode && params.freeMode.enabled\n  }, {\n    'autoheight': params.autoHeight\n  }, {\n    'rtl': rtl\n  }, {\n    'grid': params.grid && params.grid.rows > 1\n  }, {\n    'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'\n  }, {\n    'android': device.android\n  }, {\n    'ios': device.ios\n  }, {\n    'css-mode': params.cssMode\n  }, {\n    'centered': params.cssMode && params.centeredSlides\n  }, {\n    'watch-progress': params.watchSlidesProgress\n  }], params.containerModifierClass);\n  classNames.push(...suffixes);\n  el.classList.add(...classNames);\n  swiper.emitContainerClasses();\n}\n\nfunction removeClasses() {\n  const swiper = this;\n  const {\n    el,\n    classNames\n  } = swiper;\n  el.classList.remove(...classNames);\n  swiper.emitContainerClasses();\n}\n\nvar classes = {\n  addClasses,\n  removeClasses\n};\n\nfunction checkOverflow() {\n  const swiper = this;\n  const {\n    isLocked: wasLocked,\n    params\n  } = swiper;\n  const {\n    slidesOffsetBefore\n  } = params;\n  if (slidesOffsetBefore) {\n    const lastSlideIndex = swiper.slides.length - 1;\n    const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;\n    swiper.isLocked = swiper.size > lastSlideRightEdge;\n  } else {\n    swiper.isLocked = swiper.snapGrid.length === 1;\n  }\n  if (params.allowSlideNext === true) {\n    swiper.allowSlideNext = !swiper.isLocked;\n  }\n  if (params.allowSlidePrev === true) {\n    swiper.allowSlidePrev = !swiper.isLocked;\n  }\n  if (wasLocked && wasLocked !== swiper.isLocked) {\n    swiper.isEnd = false;\n  }\n  if (wasLocked !== swiper.isLocked) {\n    swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n  }\n}\nvar checkOverflow$1 = {\n  checkOverflow\n};\n\nvar defaults = {\n  init: true,\n  direction: 'horizontal',\n  oneWayMovement: false,\n  swiperElementNodeName: 'SWIPER-CONTAINER',\n  touchEventsTarget: 'wrapper',\n  initialSlide: 0,\n  speed: 300,\n  cssMode: false,\n  updateOnWindowResize: true,\n  resizeObserver: true,\n  nested: false,\n  createElements: false,\n  eventsPrefix: 'swiper',\n  enabled: true,\n  focusableElements: 'input, select, option, textarea, button, video, label',\n  // Overrides\n  width: null,\n  height: null,\n  //\n  preventInteractionOnTransition: false,\n  // ssr\n  userAgent: null,\n  url: null,\n  // To support iOS's swipe-to-go-back gesture (when being used in-app).\n  edgeSwipeDetection: false,\n  edgeSwipeThreshold: 20,\n  // Autoheight\n  autoHeight: false,\n  // Set wrapper width\n  setWrapperSize: false,\n  // Virtual Translate\n  virtualTranslate: false,\n  // Effects\n  effect: 'slide',\n  // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n  // Breakpoints\n  breakpoints: undefined,\n  breakpointsBase: 'window',\n  // Slides grid\n  spaceBetween: 0,\n  slidesPerView: 1,\n  slidesPerGroup: 1,\n  slidesPerGroupSkip: 0,\n  slidesPerGroupAuto: false,\n  centeredSlides: false,\n  centeredSlidesBounds: false,\n  slidesOffsetBefore: 0,\n  // in px\n  slidesOffsetAfter: 0,\n  // in px\n  normalizeSlideIndex: true,\n  centerInsufficientSlides: false,\n  // Disable swiper and hide navigation when container not overflow\n  watchOverflow: true,\n  // Round length\n  roundLengths: false,\n  // Touches\n  touchRatio: 1,\n  touchAngle: 45,\n  simulateTouch: true,\n  shortSwipes: true,\n  longSwipes: true,\n  longSwipesRatio: 0.5,\n  longSwipesMs: 300,\n  followFinger: true,\n  allowTouchMove: true,\n  threshold: 5,\n  touchMoveStopPropagation: false,\n  touchStartPreventDefault: true,\n  touchStartForcePreventDefault: false,\n  touchReleaseOnEdges: false,\n  // Unique Navigation Elements\n  uniqueNavElements: true,\n  // Resistance\n  resistance: true,\n  resistanceRatio: 0.85,\n  // Progress\n  watchSlidesProgress: false,\n  // Cursor\n  grabCursor: false,\n  // Clicks\n  preventClicks: true,\n  preventClicksPropagation: true,\n  slideToClickedSlide: false,\n  // loop\n  loop: false,\n  loopAddBlankSlides: true,\n  loopAdditionalSlides: 0,\n  loopPreventsSliding: true,\n  // rewind\n  rewind: false,\n  // Swiping/no swiping\n  allowSlidePrev: true,\n  allowSlideNext: true,\n  swipeHandler: null,\n  // '.swipe-handler',\n  noSwiping: true,\n  noSwipingClass: 'swiper-no-swiping',\n  noSwipingSelector: null,\n  // Passive Listeners\n  passiveListeners: true,\n  maxBackfaceHiddenSlides: 10,\n  // NS\n  containerModifierClass: 'swiper-',\n  // NEW\n  slideClass: 'swiper-slide',\n  slideBlankClass: 'swiper-slide-blank',\n  slideActiveClass: 'swiper-slide-active',\n  slideVisibleClass: 'swiper-slide-visible',\n  slideFullyVisibleClass: 'swiper-slide-fully-visible',\n  slideNextClass: 'swiper-slide-next',\n  slidePrevClass: 'swiper-slide-prev',\n  wrapperClass: 'swiper-wrapper',\n  lazyPreloaderClass: 'swiper-lazy-preloader',\n  lazyPreloadPrevNext: 0,\n  // Callbacks\n  runCallbacksOnInit: true,\n  // Internals\n  _emitClasses: false\n};\n\nfunction moduleExtendParams(params, allModulesParams) {\n  return function extendParams(obj) {\n    if (obj === void 0) {\n      obj = {};\n    }\n    const moduleParamName = Object.keys(obj)[0];\n    const moduleParams = obj[moduleParamName];\n    if (typeof moduleParams !== 'object' || moduleParams === null) {\n      extend(allModulesParams, obj);\n      return;\n    }\n    if (params[moduleParamName] === true) {\n      params[moduleParamName] = {\n        enabled: true\n      };\n    }\n    if (moduleParamName === 'navigation' && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) {\n      params[moduleParamName].auto = true;\n    }\n    if (['pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) {\n      params[moduleParamName].auto = true;\n    }\n    if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n      extend(allModulesParams, obj);\n      return;\n    }\n    if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n      params[moduleParamName].enabled = true;\n    }\n    if (!params[moduleParamName]) params[moduleParamName] = {\n      enabled: false\n    };\n    extend(allModulesParams, obj);\n  };\n}\n\n/* eslint no-param-reassign: \"off\" */\nconst prototypes = {\n  eventsEmitter,\n  update,\n  translate,\n  transition,\n  slide,\n  loop,\n  grabCursor,\n  events: events$1,\n  breakpoints,\n  checkOverflow: checkOverflow$1,\n  classes\n};\nconst extendedDefaults = {};\nclass Swiper {\n  constructor() {\n    let el;\n    let params;\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {\n      params = args[0];\n    } else {\n      [el, params] = args;\n    }\n    if (!params) params = {};\n    params = extend({}, params);\n    if (el && !params.el) params.el = el;\n    const document = getDocument();\n    if (params.el && typeof params.el === 'string' && document.querySelectorAll(params.el).length > 1) {\n      const swipers = [];\n      document.querySelectorAll(params.el).forEach(containerEl => {\n        const newParams = extend({}, params, {\n          el: containerEl\n        });\n        swipers.push(new Swiper(newParams));\n      });\n      // eslint-disable-next-line no-constructor-return\n      return swipers;\n    }\n\n    // Swiper Instance\n    const swiper = this;\n    swiper.__swiper__ = true;\n    swiper.support = getSupport();\n    swiper.device = getDevice({\n      userAgent: params.userAgent\n    });\n    swiper.browser = getBrowser();\n    swiper.eventsListeners = {};\n    swiper.eventsAnyListeners = [];\n    swiper.modules = [...swiper.__modules__];\n    if (params.modules && Array.isArray(params.modules)) {\n      swiper.modules.push(...params.modules);\n    }\n    const allModulesParams = {};\n    swiper.modules.forEach(mod => {\n      mod({\n        params,\n        swiper,\n        extendParams: moduleExtendParams(params, allModulesParams),\n        on: swiper.on.bind(swiper),\n        once: swiper.once.bind(swiper),\n        off: swiper.off.bind(swiper),\n        emit: swiper.emit.bind(swiper)\n      });\n    });\n\n    // Extend defaults with modules params\n    const swiperParams = extend({}, defaults, allModulesParams);\n\n    // Extend defaults with passed params\n    swiper.params = extend({}, swiperParams, extendedDefaults, params);\n    swiper.originalParams = extend({}, swiper.params);\n    swiper.passedParams = extend({}, params);\n\n    // add event listeners\n    if (swiper.params && swiper.params.on) {\n      Object.keys(swiper.params.on).forEach(eventName => {\n        swiper.on(eventName, swiper.params.on[eventName]);\n      });\n    }\n    if (swiper.params && swiper.params.onAny) {\n      swiper.onAny(swiper.params.onAny);\n    }\n\n    // Extend Swiper\n    Object.assign(swiper, {\n      enabled: swiper.params.enabled,\n      el,\n      // Classes\n      classNames: [],\n      // Slides\n      slides: [],\n      slidesGrid: [],\n      snapGrid: [],\n      slidesSizesGrid: [],\n      // isDirection\n      isHorizontal() {\n        return swiper.params.direction === 'horizontal';\n      },\n      isVertical() {\n        return swiper.params.direction === 'vertical';\n      },\n      // Indexes\n      activeIndex: 0,\n      realIndex: 0,\n      //\n      isBeginning: true,\n      isEnd: false,\n      // Props\n      translate: 0,\n      previousTranslate: 0,\n      progress: 0,\n      velocity: 0,\n      animating: false,\n      cssOverflowAdjustment() {\n        // Returns 0 unless `translate` is > 2**23\n        // Should be subtracted from css values to prevent overflow\n        return Math.trunc(this.translate / 2 ** 23) * 2 ** 23;\n      },\n      // Locks\n      allowSlideNext: swiper.params.allowSlideNext,\n      allowSlidePrev: swiper.params.allowSlidePrev,\n      // Touch Events\n      touchEventsData: {\n        isTouched: undefined,\n        isMoved: undefined,\n        allowTouchCallbacks: undefined,\n        touchStartTime: undefined,\n        isScrolling: undefined,\n        currentTranslate: undefined,\n        startTranslate: undefined,\n        allowThresholdMove: undefined,\n        // Form elements to match\n        focusableElements: swiper.params.focusableElements,\n        // Last click time\n        lastClickTime: 0,\n        clickTimeout: undefined,\n        // Velocities\n        velocities: [],\n        allowMomentumBounce: undefined,\n        startMoving: undefined,\n        pointerId: null,\n        touchId: null\n      },\n      // Clicks\n      allowClick: true,\n      // Touches\n      allowTouchMove: swiper.params.allowTouchMove,\n      touches: {\n        startX: 0,\n        startY: 0,\n        currentX: 0,\n        currentY: 0,\n        diff: 0\n      },\n      // Images\n      imagesToLoad: [],\n      imagesLoaded: 0\n    });\n    swiper.emit('_swiper');\n\n    // Init\n    if (swiper.params.init) {\n      swiper.init();\n    }\n\n    // Return app instance\n    // eslint-disable-next-line no-constructor-return\n    return swiper;\n  }\n  getDirectionLabel(property) {\n    if (this.isHorizontal()) {\n      return property;\n    }\n    // prettier-ignore\n    return {\n      'width': 'height',\n      'margin-top': 'margin-left',\n      'margin-bottom ': 'margin-right',\n      'margin-left': 'margin-top',\n      'margin-right': 'margin-bottom',\n      'padding-left': 'padding-top',\n      'padding-right': 'padding-bottom',\n      'marginRight': 'marginBottom'\n    }[property];\n  }\n  getSlideIndex(slideEl) {\n    const {\n      slidesEl,\n      params\n    } = this;\n    const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n    const firstSlideIndex = elementIndex(slides[0]);\n    return elementIndex(slideEl) - firstSlideIndex;\n  }\n  getSlideIndexByData(index) {\n    return this.getSlideIndex(this.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === index)[0]);\n  }\n  recalcSlides() {\n    const swiper = this;\n    const {\n      slidesEl,\n      params\n    } = swiper;\n    swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n  }\n  enable() {\n    const swiper = this;\n    if (swiper.enabled) return;\n    swiper.enabled = true;\n    if (swiper.params.grabCursor) {\n      swiper.setGrabCursor();\n    }\n    swiper.emit('enable');\n  }\n  disable() {\n    const swiper = this;\n    if (!swiper.enabled) return;\n    swiper.enabled = false;\n    if (swiper.params.grabCursor) {\n      swiper.unsetGrabCursor();\n    }\n    swiper.emit('disable');\n  }\n  setProgress(progress, speed) {\n    const swiper = this;\n    progress = Math.min(Math.max(progress, 0), 1);\n    const min = swiper.minTranslate();\n    const max = swiper.maxTranslate();\n    const current = (max - min) * progress + min;\n    swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n  emitContainerClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const cls = swiper.el.className.split(' ').filter(className => {\n      return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;\n    });\n    swiper.emit('_containerClasses', cls.join(' '));\n  }\n  getSlideClasses(slideEl) {\n    const swiper = this;\n    if (swiper.destroyed) return '';\n    return slideEl.className.split(' ').filter(className => {\n      return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;\n    }).join(' ');\n  }\n  emitSlidesClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const updates = [];\n    swiper.slides.forEach(slideEl => {\n      const classNames = swiper.getSlideClasses(slideEl);\n      updates.push({\n        slideEl,\n        classNames\n      });\n      swiper.emit('_slideClass', slideEl, classNames);\n    });\n    swiper.emit('_slideClasses', updates);\n  }\n  slidesPerViewDynamic(view, exact) {\n    if (view === void 0) {\n      view = 'current';\n    }\n    if (exact === void 0) {\n      exact = false;\n    }\n    const swiper = this;\n    const {\n      params,\n      slides,\n      slidesGrid,\n      slidesSizesGrid,\n      size: swiperSize,\n      activeIndex\n    } = swiper;\n    let spv = 1;\n    if (typeof params.slidesPerView === 'number') return params.slidesPerView;\n    if (params.centeredSlides) {\n      let slideSize = slides[activeIndex] ? Math.ceil(slides[activeIndex].swiperSlideSize) : 0;\n      let breakLoop;\n      for (let i = activeIndex + 1; i < slides.length; i += 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += Math.ceil(slides[i].swiperSlideSize);\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n      for (let i = activeIndex - 1; i >= 0; i -= 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += slides[i].swiperSlideSize;\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n    } else {\n      // eslint-disable-next-line\n      if (view === 'current') {\n        for (let i = activeIndex + 1; i < slides.length; i += 1) {\n          const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      } else {\n        // previous\n        for (let i = activeIndex - 1; i >= 0; i -= 1) {\n          const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      }\n    }\n    return spv;\n  }\n  update() {\n    const swiper = this;\n    if (!swiper || swiper.destroyed) return;\n    const {\n      snapGrid,\n      params\n    } = swiper;\n    // Breakpoints\n    if (params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n    [...swiper.el.querySelectorAll('[loading=\"lazy\"]')].forEach(imageEl => {\n      if (imageEl.complete) {\n        processLazyPreloader(swiper, imageEl);\n      }\n    });\n    swiper.updateSize();\n    swiper.updateSlides();\n    swiper.updateProgress();\n    swiper.updateSlidesClasses();\n    function setTranslate() {\n      const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n      const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());\n      swiper.setTranslate(newTranslate);\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n    let translated;\n    if (params.freeMode && params.freeMode.enabled && !params.cssMode) {\n      setTranslate();\n      if (params.autoHeight) {\n        swiper.updateAutoHeight();\n      }\n    } else {\n      if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) {\n        const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;\n        translated = swiper.slideTo(slides.length - 1, 0, false, true);\n      } else {\n        translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n      }\n      if (!translated) {\n        setTranslate();\n      }\n    }\n    if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n      swiper.checkOverflow();\n    }\n    swiper.emit('update');\n  }\n  changeDirection(newDirection, needUpdate) {\n    if (needUpdate === void 0) {\n      needUpdate = true;\n    }\n    const swiper = this;\n    const currentDirection = swiper.params.direction;\n    if (!newDirection) {\n      // eslint-disable-next-line\n      newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n    }\n    if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {\n      return swiper;\n    }\n    swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`);\n    swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`);\n    swiper.emitContainerClasses();\n    swiper.params.direction = newDirection;\n    swiper.slides.forEach(slideEl => {\n      if (newDirection === 'vertical') {\n        slideEl.style.width = '';\n      } else {\n        slideEl.style.height = '';\n      }\n    });\n    swiper.emit('changeDirection');\n    if (needUpdate) swiper.update();\n    return swiper;\n  }\n  changeLanguageDirection(direction) {\n    const swiper = this;\n    if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return;\n    swiper.rtl = direction === 'rtl';\n    swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl;\n    if (swiper.rtl) {\n      swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`);\n      swiper.el.dir = 'rtl';\n    } else {\n      swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`);\n      swiper.el.dir = 'ltr';\n    }\n    swiper.update();\n  }\n  mount(element) {\n    const swiper = this;\n    if (swiper.mounted) return true;\n\n    // Find el\n    let el = element || swiper.params.el;\n    if (typeof el === 'string') {\n      el = document.querySelector(el);\n    }\n    if (!el) {\n      return false;\n    }\n    el.swiper = swiper;\n    if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === swiper.params.swiperElementNodeName.toUpperCase()) {\n      swiper.isElement = true;\n    }\n    const getWrapperSelector = () => {\n      return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n    };\n    const getWrapper = () => {\n      if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n        const res = el.shadowRoot.querySelector(getWrapperSelector());\n        // Children needs to return slot items\n        return res;\n      }\n      return elementChildren(el, getWrapperSelector())[0];\n    };\n    // Find Wrapper\n    let wrapperEl = getWrapper();\n    if (!wrapperEl && swiper.params.createElements) {\n      wrapperEl = createElement('div', swiper.params.wrapperClass);\n      el.append(wrapperEl);\n      elementChildren(el, `.${swiper.params.slideClass}`).forEach(slideEl => {\n        wrapperEl.append(slideEl);\n      });\n    }\n    Object.assign(swiper, {\n      el,\n      wrapperEl,\n      slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl,\n      hostEl: swiper.isElement ? el.parentNode.host : el,\n      mounted: true,\n      // RTL\n      rtl: el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl',\n      rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl'),\n      wrongRTL: elementStyle(wrapperEl, 'display') === '-webkit-box'\n    });\n    return true;\n  }\n  init(el) {\n    const swiper = this;\n    if (swiper.initialized) return swiper;\n    const mounted = swiper.mount(el);\n    if (mounted === false) return swiper;\n    swiper.emit('beforeInit');\n\n    // Set breakpoint\n    if (swiper.params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n\n    // Add Classes\n    swiper.addClasses();\n\n    // Update size\n    swiper.updateSize();\n\n    // Update slides\n    swiper.updateSlides();\n    if (swiper.params.watchOverflow) {\n      swiper.checkOverflow();\n    }\n\n    // Set Grab Cursor\n    if (swiper.params.grabCursor && swiper.enabled) {\n      swiper.setGrabCursor();\n    }\n\n    // Slide To Initial Slide\n    if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {\n      swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true);\n    } else {\n      swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n    }\n\n    // Create loop\n    if (swiper.params.loop) {\n      swiper.loopCreate();\n    }\n\n    // Attach events\n    swiper.attachEvents();\n    const lazyElements = [...swiper.el.querySelectorAll('[loading=\"lazy\"]')];\n    if (swiper.isElement) {\n      lazyElements.push(...swiper.hostEl.querySelectorAll('[loading=\"lazy\"]'));\n    }\n    lazyElements.forEach(imageEl => {\n      if (imageEl.complete) {\n        processLazyPreloader(swiper, imageEl);\n      } else {\n        imageEl.addEventListener('load', e => {\n          processLazyPreloader(swiper, e.target);\n        });\n      }\n    });\n    preload(swiper);\n\n    // Init Flag\n    swiper.initialized = true;\n    preload(swiper);\n\n    // Emit\n    swiper.emit('init');\n    swiper.emit('afterInit');\n    return swiper;\n  }\n  destroy(deleteInstance, cleanStyles) {\n    if (deleteInstance === void 0) {\n      deleteInstance = true;\n    }\n    if (cleanStyles === void 0) {\n      cleanStyles = true;\n    }\n    const swiper = this;\n    const {\n      params,\n      el,\n      wrapperEl,\n      slides\n    } = swiper;\n    if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n      return null;\n    }\n    swiper.emit('beforeDestroy');\n\n    // Init Flag\n    swiper.initialized = false;\n\n    // Detach events\n    swiper.detachEvents();\n\n    // Destroy loop\n    if (params.loop) {\n      swiper.loopDestroy();\n    }\n\n    // Cleanup styles\n    if (cleanStyles) {\n      swiper.removeClasses();\n      el.removeAttribute('style');\n      wrapperEl.removeAttribute('style');\n      if (slides && slides.length) {\n        slides.forEach(slideEl => {\n          slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass);\n          slideEl.removeAttribute('style');\n          slideEl.removeAttribute('data-swiper-slide-index');\n        });\n      }\n    }\n    swiper.emit('destroy');\n\n    // Detach emitter events\n    Object.keys(swiper.eventsListeners).forEach(eventName => {\n      swiper.off(eventName);\n    });\n    if (deleteInstance !== false) {\n      swiper.el.swiper = null;\n      deleteProps(swiper);\n    }\n    swiper.destroyed = true;\n    return null;\n  }\n  static extendDefaults(newDefaults) {\n    extend(extendedDefaults, newDefaults);\n  }\n  static get extendedDefaults() {\n    return extendedDefaults;\n  }\n  static get defaults() {\n    return defaults;\n  }\n  static installModule(mod) {\n    if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n    const modules = Swiper.prototype.__modules__;\n    if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n      modules.push(mod);\n    }\n  }\n  static use(module) {\n    if (Array.isArray(module)) {\n      module.forEach(m => Swiper.installModule(m));\n      return Swiper;\n    }\n    Swiper.installModule(module);\n    return Swiper;\n  }\n}\nObject.keys(prototypes).forEach(prototypeGroup => {\n  Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {\n    Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n  });\n});\nSwiper.use([Resize, Observer]);\n\nexport { Swiper as S, defaults as d };\n","/* underscore in name -> watch for changes */\nconst paramsList = ['eventsPrefix', 'injectStyles', 'injectStylesUrls', 'modules', 'init', '_direction', 'oneWayMovement', 'swiperElementNodeName', 'touchEventsTarget', 'initialSlide', '_speed', 'cssMode', 'updateOnWindowResize', 'resizeObserver', 'nested', 'focusableElements', '_enabled', '_width', '_height', 'preventInteractionOnTransition', 'userAgent', 'url', '_edgeSwipeDetection', '_edgeSwipeThreshold', '_freeMode', '_autoHeight', 'setWrapperSize', 'virtualTranslate', '_effect', 'breakpoints', 'breakpointsBase', '_spaceBetween', '_slidesPerView', 'maxBackfaceHiddenSlides', '_grid', '_slidesPerGroup', '_slidesPerGroupSkip', '_slidesPerGroupAuto', '_centeredSlides', '_centeredSlidesBounds', '_slidesOffsetBefore', '_slidesOffsetAfter', 'normalizeSlideIndex', '_centerInsufficientSlides', '_watchOverflow', 'roundLengths', 'touchRatio', 'touchAngle', 'simulateTouch', '_shortSwipes', '_longSwipes', 'longSwipesRatio', 'longSwipesMs', '_followFinger', 'allowTouchMove', '_threshold', 'touchMoveStopPropagation', 'touchStartPreventDefault', 'touchStartForcePreventDefault', 'touchReleaseOnEdges', 'uniqueNavElements', '_resistance', '_resistanceRatio', '_watchSlidesProgress', '_grabCursor', 'preventClicks', 'preventClicksPropagation', '_slideToClickedSlide', '_loop', 'loopAdditionalSlides', 'loopAddBlankSlides', 'loopPreventsSliding', '_rewind', '_allowSlidePrev', '_allowSlideNext', '_swipeHandler', '_noSwiping', 'noSwipingClass', 'noSwipingSelector', 'passiveListeners', 'containerModifierClass', 'slideClass', 'slideActiveClass', 'slideVisibleClass', 'slideFullyVisibleClass', 'slideNextClass', 'slidePrevClass', 'slideBlankClass', 'wrapperClass', 'lazyPreloaderClass', 'lazyPreloadPrevNext', 'runCallbacksOnInit', 'observer', 'observeParents', 'observeSlideChildren',\n// modules\n'a11y', '_autoplay', '_controller', 'coverflowEffect', 'cubeEffect', 'fadeEffect', 'flipEffect', 'creativeEffect', 'cardsEffect', 'hashNavigation', 'history', 'keyboard', 'mousewheel', '_navigation', '_pagination', 'parallax', '_scrollbar', '_thumbs', 'virtual', 'zoom', 'control'];\n\nfunction isObject(o) {\n  return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object' && !o.__swiper__;\n}\nfunction extend(target, src) {\n  const noExtend = ['__proto__', 'constructor', 'prototype'];\n  Object.keys(src).filter(key => noExtend.indexOf(key) < 0).forEach(key => {\n    if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {\n      if (src[key].__swiper__) target[key] = src[key];else extend(target[key], src[key]);\n    } else {\n      target[key] = src[key];\n    }\n  });\n}\nfunction needsNavigation(params) {\n  if (params === void 0) {\n    params = {};\n  }\n  return params.navigation && typeof params.navigation.nextEl === 'undefined' && typeof params.navigation.prevEl === 'undefined';\n}\nfunction needsPagination(params) {\n  if (params === void 0) {\n    params = {};\n  }\n  return params.pagination && typeof params.pagination.el === 'undefined';\n}\nfunction needsScrollbar(params) {\n  if (params === void 0) {\n    params = {};\n  }\n  return params.scrollbar && typeof params.scrollbar.el === 'undefined';\n}\nfunction uniqueClasses(classNames) {\n  if (classNames === void 0) {\n    classNames = '';\n  }\n  const classes = classNames.split(' ').map(c => c.trim()).filter(c => !!c);\n  const unique = [];\n  classes.forEach(c => {\n    if (unique.indexOf(c) < 0) unique.push(c);\n  });\n  return unique.join(' ');\n}\nfunction attrToProp(attrName) {\n  if (attrName === void 0) {\n    attrName = '';\n  }\n  return attrName.replace(/-[a-z]/g, l => l.toUpperCase().replace('-', ''));\n}\nfunction wrapperClass(className) {\n  if (className === void 0) {\n    className = '';\n  }\n  if (!className) return 'swiper-wrapper';\n  if (!className.includes('swiper-wrapper')) return `swiper-wrapper ${className}`;\n  return className;\n}\n\nfunction updateSwiper(_ref) {\n  let {\n    swiper,\n    slides,\n    passedParams,\n    changedParams,\n    nextEl,\n    prevEl,\n    scrollbarEl,\n    paginationEl\n  } = _ref;\n  const updateParams = changedParams.filter(key => key !== 'children' && key !== 'direction' && key !== 'wrapperClass');\n  const {\n    params: currentParams,\n    pagination,\n    navigation,\n    scrollbar,\n    virtual,\n    thumbs\n  } = swiper;\n  let needThumbsInit;\n  let needControllerInit;\n  let needPaginationInit;\n  let needScrollbarInit;\n  let needNavigationInit;\n  let loopNeedDestroy;\n  let loopNeedEnable;\n  let loopNeedReloop;\n  if (changedParams.includes('thumbs') && passedParams.thumbs && passedParams.thumbs.swiper && currentParams.thumbs && !currentParams.thumbs.swiper) {\n    needThumbsInit = true;\n  }\n  if (changedParams.includes('controller') && passedParams.controller && passedParams.controller.control && currentParams.controller && !currentParams.controller.control) {\n    needControllerInit = true;\n  }\n  if (changedParams.includes('pagination') && passedParams.pagination && (passedParams.pagination.el || paginationEl) && (currentParams.pagination || currentParams.pagination === false) && pagination && !pagination.el) {\n    needPaginationInit = true;\n  }\n  if (changedParams.includes('scrollbar') && passedParams.scrollbar && (passedParams.scrollbar.el || scrollbarEl) && (currentParams.scrollbar || currentParams.scrollbar === false) && scrollbar && !scrollbar.el) {\n    needScrollbarInit = true;\n  }\n  if (changedParams.includes('navigation') && passedParams.navigation && (passedParams.navigation.prevEl || prevEl) && (passedParams.navigation.nextEl || nextEl) && (currentParams.navigation || currentParams.navigation === false) && navigation && !navigation.prevEl && !navigation.nextEl) {\n    needNavigationInit = true;\n  }\n  const destroyModule = mod => {\n    if (!swiper[mod]) return;\n    swiper[mod].destroy();\n    if (mod === 'navigation') {\n      if (swiper.isElement) {\n        swiper[mod].prevEl.remove();\n        swiper[mod].nextEl.remove();\n      }\n      currentParams[mod].prevEl = undefined;\n      currentParams[mod].nextEl = undefined;\n      swiper[mod].prevEl = undefined;\n      swiper[mod].nextEl = undefined;\n    } else {\n      if (swiper.isElement) {\n        swiper[mod].el.remove();\n      }\n      currentParams[mod].el = undefined;\n      swiper[mod].el = undefined;\n    }\n  };\n  if (changedParams.includes('loop') && swiper.isElement) {\n    if (currentParams.loop && !passedParams.loop) {\n      loopNeedDestroy = true;\n    } else if (!currentParams.loop && passedParams.loop) {\n      loopNeedEnable = true;\n    } else {\n      loopNeedReloop = true;\n    }\n  }\n  updateParams.forEach(key => {\n    if (isObject(currentParams[key]) && isObject(passedParams[key])) {\n      Object.assign(currentParams[key], passedParams[key]);\n      if ((key === 'navigation' || key === 'pagination' || key === 'scrollbar') && 'enabled' in passedParams[key] && !passedParams[key].enabled) {\n        destroyModule(key);\n      }\n    } else {\n      const newValue = passedParams[key];\n      if ((newValue === true || newValue === false) && (key === 'navigation' || key === 'pagination' || key === 'scrollbar')) {\n        if (newValue === false) {\n          destroyModule(key);\n        }\n      } else {\n        currentParams[key] = passedParams[key];\n      }\n    }\n  });\n  if (updateParams.includes('controller') && !needControllerInit && swiper.controller && swiper.controller.control && currentParams.controller && currentParams.controller.control) {\n    swiper.controller.control = currentParams.controller.control;\n  }\n  if (changedParams.includes('children') && slides && virtual && currentParams.virtual.enabled) {\n    virtual.slides = slides;\n    virtual.update(true);\n  } else if (changedParams.includes('virtual') && virtual && currentParams.virtual.enabled) {\n    if (slides) virtual.slides = slides;\n    virtual.update(true);\n  }\n  if (changedParams.includes('children') && slides && currentParams.loop) {\n    loopNeedReloop = true;\n  }\n  if (needThumbsInit) {\n    const initialized = thumbs.init();\n    if (initialized) thumbs.update(true);\n  }\n  if (needControllerInit) {\n    swiper.controller.control = currentParams.controller.control;\n  }\n  if (needPaginationInit) {\n    if (swiper.isElement && (!paginationEl || typeof paginationEl === 'string')) {\n      paginationEl = document.createElement('div');\n      paginationEl.classList.add('swiper-pagination');\n      paginationEl.part.add('pagination');\n      swiper.el.appendChild(paginationEl);\n    }\n    if (paginationEl) currentParams.pagination.el = paginationEl;\n    pagination.init();\n    pagination.render();\n    pagination.update();\n  }\n  if (needScrollbarInit) {\n    if (swiper.isElement && (!scrollbarEl || typeof scrollbarEl === 'string')) {\n      scrollbarEl = document.createElement('div');\n      scrollbarEl.classList.add('swiper-scrollbar');\n      scrollbarEl.part.add('scrollbar');\n      swiper.el.appendChild(scrollbarEl);\n    }\n    if (scrollbarEl) currentParams.scrollbar.el = scrollbarEl;\n    scrollbar.init();\n    scrollbar.updateSize();\n    scrollbar.setTranslate();\n  }\n  if (needNavigationInit) {\n    if (swiper.isElement) {\n      if (!nextEl || typeof nextEl === 'string') {\n        nextEl = document.createElement('div');\n        nextEl.classList.add('swiper-button-next');\n        nextEl.innerHTML = swiper.hostEl.constructor.nextButtonSvg;\n        nextEl.part.add('button-next');\n        swiper.el.appendChild(nextEl);\n      }\n      if (!prevEl || typeof prevEl === 'string') {\n        prevEl = document.createElement('div');\n        prevEl.classList.add('swiper-button-prev');\n        prevEl.innerHTML = swiper.hostEl.constructor.prevButtonSvg;\n        prevEl.part.add('button-prev');\n        swiper.el.appendChild(prevEl);\n      }\n    }\n    if (nextEl) currentParams.navigation.nextEl = nextEl;\n    if (prevEl) currentParams.navigation.prevEl = prevEl;\n    navigation.init();\n    navigation.update();\n  }\n  if (changedParams.includes('allowSlideNext')) {\n    swiper.allowSlideNext = passedParams.allowSlideNext;\n  }\n  if (changedParams.includes('allowSlidePrev')) {\n    swiper.allowSlidePrev = passedParams.allowSlidePrev;\n  }\n  if (changedParams.includes('direction')) {\n    swiper.changeDirection(passedParams.direction, false);\n  }\n  if (loopNeedDestroy || loopNeedReloop) {\n    swiper.loopDestroy();\n  }\n  if (loopNeedEnable || loopNeedReloop) {\n    swiper.loopCreate();\n  }\n  swiper.update();\n}\n\nexport { needsPagination as a, needsScrollbar as b, attrToProp as c, uniqueClasses as d, extend as e, isObject as i, needsNavigation as n, paramsList as p, updateSwiper as u, wrapperClass as w };\n","import { e as extend, p as paramsList, i as isObject, n as needsNavigation, a as needsPagination, b as needsScrollbar } from './update-swiper.mjs';\nimport { d as defaults } from './swiper-core.mjs';\n\nfunction getParams(obj, splitEvents) {\n  if (obj === void 0) {\n    obj = {};\n  }\n  if (splitEvents === void 0) {\n    splitEvents = true;\n  }\n  const params = {\n    on: {}\n  };\n  const events = {};\n  const passedParams = {};\n  extend(params, defaults);\n  params._emitClasses = true;\n  params.init = false;\n  const rest = {};\n  const allowedParams = paramsList.map(key => key.replace(/_/, ''));\n  const plainObj = Object.assign({}, obj);\n  Object.keys(plainObj).forEach(key => {\n    if (typeof obj[key] === 'undefined') return;\n    if (allowedParams.indexOf(key) >= 0) {\n      if (isObject(obj[key])) {\n        params[key] = {};\n        passedParams[key] = {};\n        extend(params[key], obj[key]);\n        extend(passedParams[key], obj[key]);\n      } else {\n        params[key] = obj[key];\n        passedParams[key] = obj[key];\n      }\n    } else if (key.search(/on[A-Z]/) === 0 && typeof obj[key] === 'function') {\n      if (splitEvents) {\n        events[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];\n      } else {\n        params.on[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];\n      }\n    } else {\n      rest[key] = obj[key];\n    }\n  });\n  ['navigation', 'pagination', 'scrollbar'].forEach(key => {\n    if (params[key] === true) params[key] = {};\n    if (params[key] === false) delete params[key];\n  });\n  return {\n    params,\n    passedParams,\n    rest,\n    events\n  };\n}\n\nfunction mountSwiper(_ref, swiperParams) {\n  let {\n    el,\n    nextEl,\n    prevEl,\n    paginationEl,\n    scrollbarEl,\n    swiper\n  } = _ref;\n  if (needsNavigation(swiperParams) && nextEl && prevEl) {\n    swiper.params.navigation.nextEl = nextEl;\n    swiper.originalParams.navigation.nextEl = nextEl;\n    swiper.params.navigation.prevEl = prevEl;\n    swiper.originalParams.navigation.prevEl = prevEl;\n  }\n  if (needsPagination(swiperParams) && paginationEl) {\n    swiper.params.pagination.el = paginationEl;\n    swiper.originalParams.pagination.el = paginationEl;\n  }\n  if (needsScrollbar(swiperParams) && scrollbarEl) {\n    swiper.params.scrollbar.el = scrollbarEl;\n    swiper.originalParams.scrollbar.el = scrollbarEl;\n  }\n  swiper.init(el);\n}\n\nfunction getChangedParams(swiperParams, oldParams, children, oldChildren, getKey) {\n  const keys = [];\n  if (!oldParams) return keys;\n  const addKey = key => {\n    if (keys.indexOf(key) < 0) keys.push(key);\n  };\n  if (children && oldChildren) {\n    const oldChildrenKeys = oldChildren.map(getKey);\n    const childrenKeys = children.map(getKey);\n    if (oldChildrenKeys.join('') !== childrenKeys.join('')) addKey('children');\n    if (oldChildren.length !== children.length) addKey('children');\n  }\n  const watchParams = paramsList.filter(key => key[0] === '_').map(key => key.replace(/_/, ''));\n  watchParams.forEach(key => {\n    if (key in swiperParams && key in oldParams) {\n      if (isObject(swiperParams[key]) && isObject(oldParams[key])) {\n        const newKeys = Object.keys(swiperParams[key]);\n        const oldKeys = Object.keys(oldParams[key]);\n        if (newKeys.length !== oldKeys.length) {\n          addKey(key);\n        } else {\n          newKeys.forEach(newKey => {\n            if (swiperParams[key][newKey] !== oldParams[key][newKey]) {\n              addKey(key);\n            }\n          });\n          oldKeys.forEach(oldKey => {\n            if (swiperParams[key][oldKey] !== oldParams[key][oldKey]) addKey(key);\n          });\n        }\n      } else if (swiperParams[key] !== oldParams[key]) {\n        addKey(key);\n      }\n    }\n  });\n  return keys;\n}\n\nconst updateOnVirtualData = swiper => {\n  if (!swiper || swiper.destroyed || !swiper.params.virtual || swiper.params.virtual && !swiper.params.virtual.enabled) return;\n  swiper.updateSlides();\n  swiper.updateProgress();\n  swiper.updateSlidesClasses();\n  if (swiper.parallax && swiper.params.parallax && swiper.params.parallax.enabled) {\n    swiper.parallax.setTranslate();\n  }\n};\n\nexport { getChangedParams as a, getParams as g, mountSwiper as m, updateOnVirtualData as u };\n","/**\n * Swiper Vue 11.1.3\n * Most modern mobile touch slider and framework with hardware accelerated transitions\n * https://swiperjs.com\n *\n * Copyright 2014-2024 Vladimir Kharlampidi\n *\n * Released under the MIT License\n *\n * Released on: May 13, 2024\n */\n\nimport { h, ref, onUpdated, provide, watch, nextTick, onMounted, onBeforeUnmount, onBeforeUpdate, computed, inject } from 'vue';\nimport { S as Swiper$1 } from './shared/swiper-core.mjs';\nimport { g as getParams, a as getChangedParams, u as updateOnVirtualData, m as mountSwiper } from './shared/update-on-virtual-data.mjs';\nimport { e as extend, u as updateSwiper, d as uniqueClasses, w as wrapperClass, n as needsNavigation, b as needsScrollbar, a as needsPagination } from './shared/update-swiper.mjs';\n\nfunction getChildren(originalSlots, slidesRef, oldSlidesRef) {\n  if (originalSlots === void 0) {\n    originalSlots = {};\n  }\n  const slides = [];\n  const slots = {\n    'container-start': [],\n    'container-end': [],\n    'wrapper-start': [],\n    'wrapper-end': []\n  };\n  const getSlidesFromElements = (els, slotName) => {\n    if (!Array.isArray(els)) {\n      return;\n    }\n    els.forEach(vnode => {\n      const isFragment = typeof vnode.type === 'symbol';\n      if (slotName === 'default') slotName = 'container-end';\n      if (isFragment && vnode.children) {\n        getSlidesFromElements(vnode.children, slotName);\n      } else if (vnode.type && (vnode.type.name === 'SwiperSlide' || vnode.type.name === 'AsyncComponentWrapper') || vnode.componentOptions && vnode.componentOptions.tag === 'SwiperSlide') {\n        slides.push(vnode);\n      } else if (slots[slotName]) {\n        slots[slotName].push(vnode);\n      }\n    });\n  };\n  Object.keys(originalSlots).forEach(slotName => {\n    if (typeof originalSlots[slotName] !== 'function') return;\n    const els = originalSlots[slotName]();\n    getSlidesFromElements(els, slotName);\n  });\n  oldSlidesRef.value = slidesRef.value;\n  slidesRef.value = slides;\n  return {\n    slides,\n    slots\n  };\n}\n\nfunction renderVirtual(swiperRef, slides, virtualData) {\n  if (!virtualData) return null;\n  const getSlideIndex = index => {\n    let slideIndex = index;\n    if (index < 0) {\n      slideIndex = slides.length + index;\n    } else if (slideIndex >= slides.length) {\n      // eslint-disable-next-line\n      slideIndex = slideIndex - slides.length;\n    }\n    return slideIndex;\n  };\n  const style = swiperRef.value.isHorizontal() ? {\n    [swiperRef.value.rtlTranslate ? 'right' : 'left']: `${virtualData.offset}px`\n  } : {\n    top: `${virtualData.offset}px`\n  };\n  const {\n    from,\n    to\n  } = virtualData;\n  const loopFrom = swiperRef.value.params.loop ? -slides.length : 0;\n  const loopTo = swiperRef.value.params.loop ? slides.length * 2 : slides.length;\n  const slidesToRender = [];\n  for (let i = loopFrom; i < loopTo; i += 1) {\n    if (i >= from && i <= to) {\n      slidesToRender.push(slides[getSlideIndex(i)]);\n    }\n  }\n  return slidesToRender.map(slide => {\n    if (!slide.props) slide.props = {};\n    if (!slide.props.style) slide.props.style = {};\n    slide.props.swiperRef = swiperRef;\n    slide.props.style = style;\n    if (slide.type) {\n      return h(slide.type, {\n        ...slide.props\n      }, slide.children);\n    } else if (slide.componentOptions) {\n      return h(slide.componentOptions.Ctor, {\n        ...slide.props\n      }, slide.componentOptions.children);\n    }\n  });\n}\n\nconst Swiper = {\n  name: 'Swiper',\n  props: {\n    tag: {\n      type: String,\n      default: 'div'\n    },\n    wrapperTag: {\n      type: String,\n      default: 'div'\n    },\n    modules: {\n      type: Array,\n      default: undefined\n    },\n    init: {\n      type: Boolean,\n      default: undefined\n    },\n    direction: {\n      type: String,\n      default: undefined\n    },\n    oneWayMovement: {\n      type: Boolean,\n      default: undefined\n    },\n    swiperElementNodeName: {\n      type: String,\n      default: 'SWIPER-CONTAINER'\n    },\n    touchEventsTarget: {\n      type: String,\n      default: undefined\n    },\n    initialSlide: {\n      type: Number,\n      default: undefined\n    },\n    speed: {\n      type: Number,\n      default: undefined\n    },\n    cssMode: {\n      type: Boolean,\n      default: undefined\n    },\n    updateOnWindowResize: {\n      type: Boolean,\n      default: undefined\n    },\n    resizeObserver: {\n      type: Boolean,\n      default: undefined\n    },\n    nested: {\n      type: Boolean,\n      default: undefined\n    },\n    focusableElements: {\n      type: String,\n      default: undefined\n    },\n    width: {\n      type: Number,\n      default: undefined\n    },\n    height: {\n      type: Number,\n      default: undefined\n    },\n    preventInteractionOnTransition: {\n      type: Boolean,\n      default: undefined\n    },\n    userAgent: {\n      type: String,\n      default: undefined\n    },\n    url: {\n      type: String,\n      default: undefined\n    },\n    edgeSwipeDetection: {\n      type: [Boolean, String],\n      default: undefined\n    },\n    edgeSwipeThreshold: {\n      type: Number,\n      default: undefined\n    },\n    autoHeight: {\n      type: Boolean,\n      default: undefined\n    },\n    setWrapperSize: {\n      type: Boolean,\n      default: undefined\n    },\n    virtualTranslate: {\n      type: Boolean,\n      default: undefined\n    },\n    effect: {\n      type: String,\n      default: undefined\n    },\n    breakpoints: {\n      type: Object,\n      default: undefined\n    },\n    spaceBetween: {\n      type: [Number, String],\n      default: undefined\n    },\n    slidesPerView: {\n      type: [Number, String],\n      default: undefined\n    },\n    maxBackfaceHiddenSlides: {\n      type: Number,\n      default: undefined\n    },\n    slidesPerGroup: {\n      type: Number,\n      default: undefined\n    },\n    slidesPerGroupSkip: {\n      type: Number,\n      default: undefined\n    },\n    slidesPerGroupAuto: {\n      type: Boolean,\n      default: undefined\n    },\n    centeredSlides: {\n      type: Boolean,\n      default: undefined\n    },\n    centeredSlidesBounds: {\n      type: Boolean,\n      default: undefined\n    },\n    slidesOffsetBefore: {\n      type: Number,\n      default: undefined\n    },\n    slidesOffsetAfter: {\n      type: Number,\n      default: undefined\n    },\n    normalizeSlideIndex: {\n      type: Boolean,\n      default: undefined\n    },\n    centerInsufficientSlides: {\n      type: Boolean,\n      default: undefined\n    },\n    watchOverflow: {\n      type: Boolean,\n      default: undefined\n    },\n    roundLengths: {\n      type: Boolean,\n      default: undefined\n    },\n    touchRatio: {\n      type: Number,\n      default: undefined\n    },\n    touchAngle: {\n      type: Number,\n      default: undefined\n    },\n    simulateTouch: {\n      type: Boolean,\n      default: undefined\n    },\n    shortSwipes: {\n      type: Boolean,\n      default: undefined\n    },\n    longSwipes: {\n      type: Boolean,\n      default: undefined\n    },\n    longSwipesRatio: {\n      type: Number,\n      default: undefined\n    },\n    longSwipesMs: {\n      type: Number,\n      default: undefined\n    },\n    followFinger: {\n      type: Boolean,\n      default: undefined\n    },\n    allowTouchMove: {\n      type: Boolean,\n      default: undefined\n    },\n    threshold: {\n      type: Number,\n      default: undefined\n    },\n    touchMoveStopPropagation: {\n      type: Boolean,\n      default: undefined\n    },\n    touchStartPreventDefault: {\n      type: Boolean,\n      default: undefined\n    },\n    touchStartForcePreventDefault: {\n      type: Boolean,\n      default: undefined\n    },\n    touchReleaseOnEdges: {\n      type: Boolean,\n      default: undefined\n    },\n    uniqueNavElements: {\n      type: Boolean,\n      default: undefined\n    },\n    resistance: {\n      type: Boolean,\n      default: undefined\n    },\n    resistanceRatio: {\n      type: Number,\n      default: undefined\n    },\n    watchSlidesProgress: {\n      type: Boolean,\n      default: undefined\n    },\n    grabCursor: {\n      type: Boolean,\n      default: undefined\n    },\n    preventClicks: {\n      type: Boolean,\n      default: undefined\n    },\n    preventClicksPropagation: {\n      type: Boolean,\n      default: undefined\n    },\n    slideToClickedSlide: {\n      type: Boolean,\n      default: undefined\n    },\n    loop: {\n      type: Boolean,\n      default: undefined\n    },\n    loopedSlides: {\n      type: Number,\n      default: undefined\n    },\n    loopPreventsSliding: {\n      type: Boolean,\n      default: undefined\n    },\n    rewind: {\n      type: Boolean,\n      default: undefined\n    },\n    allowSlidePrev: {\n      type: Boolean,\n      default: undefined\n    },\n    allowSlideNext: {\n      type: Boolean,\n      default: undefined\n    },\n    swipeHandler: {\n      type: Boolean,\n      default: undefined\n    },\n    noSwiping: {\n      type: Boolean,\n      default: undefined\n    },\n    noSwipingClass: {\n      type: String,\n      default: undefined\n    },\n    noSwipingSelector: {\n      type: String,\n      default: undefined\n    },\n    passiveListeners: {\n      type: Boolean,\n      default: undefined\n    },\n    containerModifierClass: {\n      type: String,\n      default: undefined\n    },\n    slideClass: {\n      type: String,\n      default: undefined\n    },\n    slideActiveClass: {\n      type: String,\n      default: undefined\n    },\n    slideVisibleClass: {\n      type: String,\n      default: undefined\n    },\n    slideFullyVisibleClass: {\n      type: String,\n      default: undefined\n    },\n    slideBlankClass: {\n      type: String,\n      default: undefined\n    },\n    slideNextClass: {\n      type: String,\n      default: undefined\n    },\n    slidePrevClass: {\n      type: String,\n      default: undefined\n    },\n    wrapperClass: {\n      type: String,\n      default: undefined\n    },\n    lazyPreloaderClass: {\n      type: String,\n      default: undefined\n    },\n    lazyPreloadPrevNext: {\n      type: Number,\n      default: undefined\n    },\n    runCallbacksOnInit: {\n      type: Boolean,\n      default: undefined\n    },\n    observer: {\n      type: Boolean,\n      default: undefined\n    },\n    observeParents: {\n      type: Boolean,\n      default: undefined\n    },\n    observeSlideChildren: {\n      type: Boolean,\n      default: undefined\n    },\n    a11y: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    autoplay: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    controller: {\n      type: Object,\n      default: undefined\n    },\n    coverflowEffect: {\n      type: Object,\n      default: undefined\n    },\n    cubeEffect: {\n      type: Object,\n      default: undefined\n    },\n    fadeEffect: {\n      type: Object,\n      default: undefined\n    },\n    flipEffect: {\n      type: Object,\n      default: undefined\n    },\n    creativeEffect: {\n      type: Object,\n      default: undefined\n    },\n    cardsEffect: {\n      type: Object,\n      default: undefined\n    },\n    hashNavigation: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    history: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    keyboard: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    mousewheel: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    navigation: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    pagination: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    parallax: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    scrollbar: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    thumbs: {\n      type: Object,\n      default: undefined\n    },\n    virtual: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    zoom: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    grid: {\n      type: [Object],\n      default: undefined\n    },\n    freeMode: {\n      type: [Boolean, Object],\n      default: undefined\n    },\n    enabled: {\n      type: Boolean,\n      default: undefined\n    }\n  },\n  emits: ['_beforeBreakpoint', '_containerClasses', '_slideClass', '_slideClasses', '_swiper', '_freeModeNoMomentumRelease', 'activeIndexChange', 'afterInit', 'autoplay', 'autoplayStart', 'autoplayStop', 'autoplayPause', 'autoplayResume', 'autoplayTimeLeft', 'beforeDestroy', 'beforeInit', 'beforeLoopFix', 'beforeResize', 'beforeSlideChangeStart', 'beforeTransitionStart', 'breakpoint', 'breakpointsBase', 'changeDirection', 'click', 'disable', 'doubleTap', 'doubleClick', 'destroy', 'enable', 'fromEdge', 'hashChange', 'hashSet', 'init', 'keyPress', 'lock', 'loopFix', 'momentumBounce', 'navigationHide', 'navigationShow', 'navigationPrev', 'navigationNext', 'observerUpdate', 'orientationchange', 'paginationHide', 'paginationRender', 'paginationShow', 'paginationUpdate', 'progress', 'reachBeginning', 'reachEnd', 'realIndexChange', 'resize', 'scroll', 'scrollbarDragEnd', 'scrollbarDragMove', 'scrollbarDragStart', 'setTransition', 'setTranslate', 'slidesUpdated', 'slideChange', 'slideChangeTransitionEnd', 'slideChangeTransitionStart', 'slideNextTransitionEnd', 'slideNextTransitionStart', 'slidePrevTransitionEnd', 'slidePrevTransitionStart', 'slideResetTransitionStart', 'slideResetTransitionEnd', 'sliderMove', 'sliderFirstMove', 'slidesLengthChange', 'slidesGridLengthChange', 'snapGridLengthChange', 'snapIndexChange', 'swiper', 'tap', 'toEdge', 'touchEnd', 'touchMove', 'touchMoveOpposite', 'touchStart', 'transitionEnd', 'transitionStart', 'unlock', 'update', 'virtualUpdate', 'zoomChange'],\n  setup(props, _ref) {\n    let {\n      slots: originalSlots,\n      emit\n    } = _ref;\n    const {\n      tag: Tag,\n      wrapperTag: WrapperTag\n    } = props;\n    const containerClasses = ref('swiper');\n    const virtualData = ref(null);\n    const breakpointChanged = ref(false);\n    const initializedRef = ref(false);\n    const swiperElRef = ref(null);\n    const swiperRef = ref(null);\n    const oldPassedParamsRef = ref(null);\n    const slidesRef = {\n      value: []\n    };\n    const oldSlidesRef = {\n      value: []\n    };\n    const nextElRef = ref(null);\n    const prevElRef = ref(null);\n    const paginationElRef = ref(null);\n    const scrollbarElRef = ref(null);\n    const {\n      params: swiperParams,\n      passedParams\n    } = getParams(props, false);\n    getChildren(originalSlots, slidesRef, oldSlidesRef);\n    oldPassedParamsRef.value = passedParams;\n    oldSlidesRef.value = slidesRef.value;\n    const onBeforeBreakpoint = () => {\n      getChildren(originalSlots, slidesRef, oldSlidesRef);\n      breakpointChanged.value = true;\n    };\n    swiperParams.onAny = function (event) {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n      emit(event, ...args);\n    };\n    Object.assign(swiperParams.on, {\n      _beforeBreakpoint: onBeforeBreakpoint,\n      _containerClasses(swiper, classes) {\n        containerClasses.value = classes;\n      }\n    });\n\n    // init Swiper\n    const passParams = {\n      ...swiperParams\n    };\n    delete passParams.wrapperClass;\n    swiperRef.value = new Swiper$1(passParams);\n    if (swiperRef.value.virtual && swiperRef.value.params.virtual.enabled) {\n      swiperRef.value.virtual.slides = slidesRef.value;\n      const extendWith = {\n        cache: false,\n        slides: slidesRef.value,\n        renderExternal: data => {\n          virtualData.value = data;\n        },\n        renderExternalUpdate: false\n      };\n      extend(swiperRef.value.params.virtual, extendWith);\n      extend(swiperRef.value.originalParams.virtual, extendWith);\n    }\n    onUpdated(() => {\n      // set initialized flag\n      if (!initializedRef.value && swiperRef.value) {\n        swiperRef.value.emitSlidesClasses();\n        initializedRef.value = true;\n      }\n      // watch for params change\n      const {\n        passedParams: newPassedParams\n      } = getParams(props, false);\n      const changedParams = getChangedParams(newPassedParams, oldPassedParamsRef.value, slidesRef.value, oldSlidesRef.value, c => c.props && c.props.key);\n      oldPassedParamsRef.value = newPassedParams;\n      if ((changedParams.length || breakpointChanged.value) && swiperRef.value && !swiperRef.value.destroyed) {\n        updateSwiper({\n          swiper: swiperRef.value,\n          slides: slidesRef.value,\n          passedParams: newPassedParams,\n          changedParams,\n          nextEl: nextElRef.value,\n          prevEl: prevElRef.value,\n          scrollbarEl: scrollbarElRef.value,\n          paginationEl: paginationElRef.value\n        });\n      }\n      breakpointChanged.value = false;\n    });\n    provide('swiper', swiperRef);\n\n    // update on virtual update\n    watch(virtualData, () => {\n      nextTick(() => {\n        updateOnVirtualData(swiperRef.value);\n      });\n    });\n\n    // mount swiper\n    onMounted(() => {\n      if (!swiperElRef.value) return;\n      mountSwiper({\n        el: swiperElRef.value,\n        nextEl: nextElRef.value,\n        prevEl: prevElRef.value,\n        paginationEl: paginationElRef.value,\n        scrollbarEl: scrollbarElRef.value,\n        swiper: swiperRef.value\n      }, swiperParams);\n      emit('swiper', swiperRef.value);\n    });\n    onBeforeUnmount(() => {\n      if (swiperRef.value && !swiperRef.value.destroyed) {\n        swiperRef.value.destroy(true, false);\n      }\n    });\n\n    // bypass swiper instance to slides\n    function renderSlides(slides) {\n      if (swiperParams.virtual) {\n        return renderVirtual(swiperRef, slides, virtualData.value);\n      }\n      slides.forEach((slide, index) => {\n        if (!slide.props) slide.props = {};\n        slide.props.swiperRef = swiperRef;\n        slide.props.swiperSlideIndex = index;\n      });\n      return slides;\n    }\n    return () => {\n      const {\n        slides,\n        slots\n      } = getChildren(originalSlots, slidesRef, oldSlidesRef);\n      return h(Tag, {\n        ref: swiperElRef,\n        class: uniqueClasses(containerClasses.value)\n      }, [slots['container-start'], h(WrapperTag, {\n        class: wrapperClass(swiperParams.wrapperClass)\n      }, [slots['wrapper-start'], renderSlides(slides), slots['wrapper-end']]), needsNavigation(props) && [h('div', {\n        ref: prevElRef,\n        class: 'swiper-button-prev'\n      }), h('div', {\n        ref: nextElRef,\n        class: 'swiper-button-next'\n      })], needsScrollbar(props) && h('div', {\n        ref: scrollbarElRef,\n        class: 'swiper-scrollbar'\n      }), needsPagination(props) && h('div', {\n        ref: paginationElRef,\n        class: 'swiper-pagination'\n      }), slots['container-end']]);\n    };\n  }\n};\n\nconst SwiperSlide = {\n  name: 'SwiperSlide',\n  props: {\n    tag: {\n      type: String,\n      default: 'div'\n    },\n    swiperRef: {\n      type: Object,\n      required: false\n    },\n    swiperSlideIndex: {\n      type: Number,\n      default: undefined,\n      required: false\n    },\n    zoom: {\n      type: Boolean,\n      default: undefined,\n      required: false\n    },\n    lazy: {\n      type: Boolean,\n      default: false,\n      required: false\n    },\n    virtualIndex: {\n      type: [String, Number],\n      default: undefined\n    }\n  },\n  setup(props, _ref) {\n    let {\n      slots\n    } = _ref;\n    let eventAttached = false;\n    const {\n      swiperRef\n    } = props;\n    const slideElRef = ref(null);\n    const slideClasses = ref('swiper-slide');\n    const lazyLoaded = ref(false);\n    function updateClasses(swiper, el, classNames) {\n      if (el === slideElRef.value) {\n        slideClasses.value = classNames;\n      }\n    }\n    onMounted(() => {\n      if (!swiperRef || !swiperRef.value) return;\n      swiperRef.value.on('_slideClass', updateClasses);\n      eventAttached = true;\n    });\n    onBeforeUpdate(() => {\n      if (eventAttached || !swiperRef || !swiperRef.value) return;\n      swiperRef.value.on('_slideClass', updateClasses);\n      eventAttached = true;\n    });\n    onUpdated(() => {\n      if (!slideElRef.value || !swiperRef || !swiperRef.value) return;\n      if (typeof props.swiperSlideIndex !== 'undefined') {\n        slideElRef.value.swiperSlideIndex = props.swiperSlideIndex;\n      }\n      if (swiperRef.value.destroyed) {\n        if (slideClasses.value !== 'swiper-slide') {\n          slideClasses.value = 'swiper-slide';\n        }\n      }\n    });\n    onBeforeUnmount(() => {\n      if (!swiperRef || !swiperRef.value) return;\n      swiperRef.value.off('_slideClass', updateClasses);\n    });\n    const slideData = computed(() => ({\n      isActive: slideClasses.value.indexOf('swiper-slide-active') >= 0,\n      isVisible: slideClasses.value.indexOf('swiper-slide-visible') >= 0,\n      isPrev: slideClasses.value.indexOf('swiper-slide-prev') >= 0,\n      isNext: slideClasses.value.indexOf('swiper-slide-next') >= 0\n    }));\n    provide('swiperSlide', slideData);\n    const onLoad = () => {\n      lazyLoaded.value = true;\n    };\n    return () => {\n      return h(props.tag, {\n        class: uniqueClasses(`${slideClasses.value}`),\n        ref: slideElRef,\n        'data-swiper-slide-index': typeof props.virtualIndex === 'undefined' && swiperRef && swiperRef.value && swiperRef.value.params.loop ? props.swiperSlideIndex : props.virtualIndex,\n        onLoadCapture: onLoad\n      }, props.zoom ? h('div', {\n        class: 'swiper-zoom-container',\n        'data-swiper-zoom': typeof props.zoom === 'number' ? props.zoom : undefined\n      }, [slots.default && slots.default(slideData.value), props.lazy && !lazyLoaded.value && h('div', {\n        class: 'swiper-lazy-preloader'\n      })]) : [slots.default && slots.default(slideData.value), props.lazy && !lazyLoaded.value && h('div', {\n        class: 'swiper-lazy-preloader'\n      })]);\n    };\n  }\n};\n\nconst useSwiperSlide = () => {\n  return inject('swiperSlide');\n};\nconst useSwiper = () => {\n  return inject('swiper');\n};\n\nexport { Swiper, SwiperSlide, useSwiper, useSwiperSlide };\n","<script setup>\r\nimport FhSection from \"@/includes/FhSection.vue\";\r\nimport { getDataRefs } from \"@/util/vue\";\r\n// import vue swiper\r\nimport { Navigation, Scrollbar } from \"swiper/modules\";\r\nimport { Swiper, SwiperSlide } from \"swiper/vue\";\r\n// import swiper css\r\nimport \"swiper/css\";\r\nimport \"swiper/css/navigation\";\r\nimport \"swiper/css/scrollbar\";\r\nimport FhVideo from \"@/components/FhVideo.vue\";\r\nimport { onMounted, onUnmounted, ref } from \"vue\";\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  breakpoints: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({\r\n      0: {\r\n        slidesPerView: 1.25,\r\n        spaceBetween: 8\r\n      },\r\n      375: {\r\n        slidesPerView: 2.25,\r\n        spaceBetween: 8\r\n      },\r\n      768: {\r\n        slidesPerView: 2.5,\r\n        spaceBetween: 8\r\n      },\r\n      1024: {\r\n        slidesPerView: 3.5,\r\n        spaceBetween: 16\r\n      },\r\n      1200: {\r\n        slidesPerView: 4.5,\r\n        spaceBetween: 20\r\n      }\r\n    })\r\n  },\r\n  imagesRatio: {\r\n    type: String,\r\n    default: \"1/1\"\r\n  },\r\n  isVideo: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst { slides, gaTagging } = getDataRefs(props.data);\r\n\r\nconst windowSize = ref();\r\nconst randId = Date.now() + Math.floor(Math.random() * (100 - 1) + 1); // The randId is meant to prevent querySelectorAll from selecting the wrong swiper.\r\nconst numberOfSlides = slides.value.length;\r\nconst numberOfMargins = numberOfSlides - 1;\r\nconst wrapperSize = ref();\r\nconst slidesWidth = ref();\r\nconst calcSlide = ref();\r\nconst displayArrows = ref(true);\r\nconst arrows = ref([]);\r\n\r\nconst calculateSlideDimensions = () => {\r\n  const singleSlideItemSize = slidesWidth.value[0].swiperSlideSize;\r\n  let marginSize = 8;\r\n\r\n  if (windowSize.value > 0 && windowSize.value <= 1023) {\r\n    marginSize = props.breakpoints[768].spaceBetween;\r\n  }\r\n  if (windowSize.value > 1023 && windowSize.value <= 1199) {\r\n    marginSize = props.breakpoints[1024].spaceBetween;\r\n  }\r\n  if (windowSize.value >= 1200) {\r\n    marginSize = props.breakpoints[1200].spaceBetween;\r\n  }\r\n  calcSlide.value = singleSlideItemSize * numberOfSlides + marginSize * numberOfMargins;\r\n  toggleArrows();\r\n};\r\n\r\nconst toggleArrows = () => {\r\n  const [previous, next] = arrows.value;\r\n  displayArrows.value = calcSlide.value > wrapperSize.value[0].offsetWidth;\r\n\r\n  const action = displayArrows.value ? \"remove\" : \"add\";\r\n  previous.classList?.[action](\"swiper-button-hidden\");\r\n  next.classList?.[action](\"swiper-button-hidden\");\r\n};\r\n\r\nconst initDOM = () => {\r\n  wrapperSize.value = document.querySelectorAll(`#swipper-${randId} .swiper-wrapper`);\r\n  slidesWidth.value = document.querySelectorAll(`#swipper-${randId} .swiper-slide`);\r\n  arrows.value = [document.querySelector(`#swipper-${randId} .swiper-button-prev`), document.querySelector(`#swipper-${randId} .swiper-button-next`)];\r\n  windowSize.value = window.innerWidth;\r\n  setTimeout(calculateSlideDimensions, 1);\r\n};\r\n\r\nonMounted(() => {\r\n  initDOM();\r\n  window.addEventListener(\"resize\", () => {\r\n    windowSize.value = window.innerWidth;\r\n    let timeout = setTimeout(() => {\r\n      calculateSlideDimensions();\r\n      clearTimeout(timeout);\r\n    }, 100);\r\n  });\r\n});\r\n\r\nonUnmounted(() => {\r\n  window.removeEventListener(\"resize\", calculateSlideDimensions);\r\n});\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    v-if=\"slides.length > 0\"\r\n    aria-label=\"Image Carousel\"\r\n    :base=\"style.base\"\r\n    class=\"section-carousel\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div class=\"fhImageCarousel\">\r\n      <swiper\r\n        :id=\"'swipper-' + randId\"\r\n        :modules=\"[Navigation, Scrollbar]\"\r\n        :breakpoints=\"breakpoints\"\r\n        :threshold=\"20\"\r\n        :scrollbar=\"{ draggable: true }\"\r\n        navigation\r\n      >\r\n        <swiper-slide v-for=\"slide in slides\" :key=\"slide.id\" class=\"flex slide\">\r\n          <a class=\"h-full w-full\" :href=\"slide.ctaLink\" :aria-label=\"slide.ctaAltText\" :target=\"slide.ctaTarget\" :data-ga=\"gaTagging || 'image_carousel'\">\r\n            <figure>\r\n              <div class=\"fhImageCarousel__image relative block\">\r\n                <FhVideo v-if=\"slide.isVideo\" :src=\"slide.imageSrc\" :autoplay=\"true\" :loop=\"true\" :controls=\"false\" class=\"video_block\"></FhVideo>\r\n                <img\r\n                  v-else\r\n                  class=\"absolute left-0 right-0 top-0 bottom-0 h-full w-full object-cover object-center\"\r\n                  :data-src=\"slide.imageSrc\"\r\n                  :src=\"slide.imageSrc\"\r\n                  :alt=\"slide.imageAltText\"\r\n                />\r\n              </div>\r\n              <figcaption v-if=\"slide.imageCaption\" class=\"mt-f3\">\r\n                {{ slide.imageCaption }}\r\n              </figcaption>\r\n            </figure>\r\n          </a>\r\n        </swiper-slide>\r\n      </swiper>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.section-carousel {\r\n  &:deep(h2) {\r\n    @apply pb-f5 mb-0;\r\n  }\r\n}\r\n.fhImageCarousel {\r\n  &:deep(.swiper) {\r\n    @apply pb-0;\r\n  }\r\n  &:deep(.swiper-slide) {\r\n    @apply h-auto;\r\n  }\r\n  &:deep(.swiper-button-prev),\r\n  &:deep(.swiper-button-next) {\r\n    @apply hidden bottom-[42px] top-auto h-[24px] w-[24px] md:flex;\r\n  }\r\n  &:deep(.swiper-button-prev) {\r\n    @apply left-auto right-[40px] bg-center bg-no-repeat;\r\n    background-image: url(\"../assets/icons/icon-left-arrow.svg\");\r\n  }\r\n  &:deep(.swiper-button-next) {\r\n    @apply right-0 bg-center bg-no-repeat;\r\n    background-image: url(\"../assets/icons/icon-right-arrow.svg\");\r\n  }\r\n  &:deep(.swiper-button-prev::after),\r\n  &:deep(.swiper-button-next::after) {\r\n    @apply hidden;\r\n  }\r\n  &:deep(.swiper-scrollbar) {\r\n    /* @apply !left-4 lg:!left-8 !bottom-0 !w-[calc(100%-2rem)] lg:!w-[calc(100%-4rem)]; */\r\n    @apply left-0 py-[40px] w-full md:w-[calc(100%-104px)];\r\n    height: auto;\r\n    border-radius: 0;\r\n    background: transparent;\r\n    &::before {\r\n      @apply bg-neutral-opacity-35;\r\n      content: \"\";\r\n      position: absolute;\r\n      top: 0;\r\n      left: 0;\r\n      right: 0;\r\n      bottom: 0;\r\n      height: 2px;\r\n      margin: auto;\r\n    }\r\n  }\r\n  &:deep(.swiper-scrollbar.swiper-scrollbar-horizontal) {\r\n    @apply relative;\r\n  }\r\n  &:deep(.swiper-scrollbar-drag) {\r\n    @apply bg-neutral-70;\r\n    cursor: pointer;\r\n    height: 4px;\r\n    border-top: 0.5rem solid transparent;\r\n    border-bottom: 0.5rem solid transparent;\r\n    border-radius: 0;\r\n    background-clip: content-box;\r\n    box-sizing: content-box;\r\n  }\r\n}\r\n\r\n.fhImageCarousel__image {\r\n  aspect-ratio: v-bind(props.imagesRatio);\r\n}\r\n\r\n:deep(.fh_video) {\r\n  @apply absolute left-0 right-0 top-0 bottom-0 h-full w-full object-cover object-center;\r\n}\r\n\r\n.video_block {\r\n  @apply static;\r\n}\r\n\r\n/* Apply filter invert(100%) conditionally */\r\n.text-white :deep(.swiper-button-prev),\r\n.text-white :deep(.swiper-button-next) {\r\n  filter: invert(100%) brightness(10000%) contrast(1000%);\r\n}\r\n.text-white :deep(.swiper-scrollbar-drag) {\r\n  @apply bg-white-opacity-70;\r\n}\r\n.text-white :deep(.swiper-scrollbar::before) {\r\n  @apply bg-neutral-opacity-80;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, computed, onMounted, onUnmounted } from \"vue\";\r\nimport TransitionExpand from \"../transitions/TransitionExpand.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport { useViewportSizes } from \"../composables\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { isAuthenticated, heading, customerNumber, customerStatus, customerDiscount, isFromSubPage } = getDataRefs(props.data);\r\nconst scrollPosition = ref(window.scrollY);\r\n\r\nconst { isSm, isMd } = useViewportSizes();\r\nconst isMobile = computed(() => isSm.value || isMd.value);\r\n\r\nconst hideBanner = computed(() => {\r\n  let hideBanner = false;\r\n\r\n  if (isMobile.value) {\r\n    if (isFromSubPage.value) hideBanner = true;\r\n    if (scrollPosition.value > 0) {\r\n      hideBanner = true;\r\n    }\r\n  }\r\n\r\n  return hideBanner;\r\n});\r\n\r\nonMounted(() => {\r\n  window.addEventListener(\"scroll\", () => (scrollPosition.value = window.scrollY));\r\n});\r\n\r\nonUnmounted(() => {\r\n  window.removeEventListener(\"scroll\", () => (scrollPosition.value = window.scrollY));\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"widget--bg-slate\">\r\n    <TransitionExpand>\r\n      <div v-if=\"!hideBanner\">\r\n        <div class=\"relative flex flex-col gap-f2 overflow-hidden bg-slate pb-f4 pt-f12.5 text-white\">\r\n          <h1 class=\"h3\">{{ heading }}</h1>\r\n          <div v-if=\"isAuthenticated\" class=\"text-body-lg flex gap-3\">\r\n            <div>Customer # {{ customerNumber }}</div>\r\n            <div v-if=\"customerStatus\">&bull;</div>\r\n            <div>\r\n              {{ customerStatus }}\r\n              <span v-if=\"customerDiscount\" class=\"opacity-50\">({{ customerDiscount }})</span>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </TransitionExpand>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { ref, computed } from \"vue\";\r\nimport FhModal from \"../FhModal.vue\";\r\nimport FhButton from \"../FhButton.vue\";\r\nimport FhImageCarousel from \"../FhImageCarousel.vue\";\r\nimport FhWysiwyg from \"@/includes/FhWysiwyg.vue\";\r\n\r\ndefineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  modalData: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst modal = ref(null);\r\nconst isOpen = ref(false);\r\nconst toggleModal = () => {\r\n  isOpen.value = !isOpen.value;\r\n};\r\n\r\nconst carouselBreakpoints = computed(() => {\r\n  return {\r\n    0: {\r\n      slidesPerView: 1.5,\r\n      spaceBetween: 10\r\n    },\r\n    576: {\r\n      slidesPerView: 2.5,\r\n      spaceBetween: 20\r\n    }\r\n  };\r\n});\r\n</script>\r\n\r\n<template>\r\n  <slot :toggle-modal=\"toggleModal\">\r\n    <!-- Button To Open/Close Injected Here -->\r\n  </slot>\r\n  <FhModal ref=\"modal\" v-model:is-open=\"isOpen\" wide>\r\n    <template #body>\r\n      <div class=\"flex flex-col items-start justify-start\">\r\n        <div class=\"mb-f3 font-serif text-f-2xl-4xl\">{{ modalData.title }}</div>\r\n        <div class=\"mb-f5 text-neutral-50\">{{ modalData.date }}</div>\r\n        <FhWysiwyg>\r\n          <!-- eslint-disable-next-line vue/no-v-html -->\r\n          <p class=\"mb-f8\" v-html=\"modalData.copy\"></p>\r\n        </FhWysiwyg>\r\n        <FhButton\r\n          variant=\"text\"\r\n          size=\"small\"\r\n          class=\"underline underline-offset-4\"\r\n          :href=\"modalData.followUsLink.url\"\r\n          :target=\"modalData.followUsLink.target\"\r\n          :aria-label=\"modalData.followUsLink.ariaLabel\"\r\n          >{{ modalData.followUsLink.label }}</FhButton\r\n        >\r\n      </div>\r\n      <FhImageCarousel class=\"-mr-f5\" :data=\"{ slides: modalData.slides }\" :breakpoints=\"carouselBreakpoints\"></FhImageCarousel>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { computed, ref } from \"vue\";\r\nimport { useViewportSizes } from \"../../composables\";\r\nimport TransitionExpand from \"../../transitions/TransitionExpand.vue\";\r\nimport FhIcon from \"../FhIcon.vue\";\r\nimport FhButton from \"../FhButton.vue\";\r\nimport FhLocationsModal from \"./FhLocationsModal.vue\";\r\nimport FhWysiwyg from \"@/includes/FhWysiwyg.vue\";\r\n\r\nconst props = defineProps({\r\n  item: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\nlet { isSm, isMd, isLg } = useViewportSizes();\r\n\r\nconst expanderOpen = ref(false);\r\nconst idBase = ref(Math.floor(Math.random() * parseInt(Date.now())));\r\nconst triggerId = ref(`trigger-${idBase.value}`);\r\nconst regionId = ref(`region-${idBase.value}`);\r\nconst triggerAriaAttributes = computed(() => {\r\n  if (isSm) {\r\n    return {\r\n      id: triggerId.value,\r\n      role: \"button\",\r\n      \"aria-controls\": regionId.value,\r\n      \"aria-expanded\": expanderOpen.value ? \"true\" : \"false\"\r\n    };\r\n  }\r\n  return {};\r\n});\r\nconst regionAriaAttributes = computed(() => {\r\n  if (isSm) {\r\n    return {\r\n      id: regionId.value,\r\n      role: \"region\",\r\n      \"aria-labelledby\": triggerId.value\r\n    };\r\n  }\r\n  return {};\r\n});\r\n\r\nlet modalData;\r\nif (props.item.promo) {\r\n  modalData = {\r\n    title: props.item.promo.title,\r\n    date: props.item.promo.date,\r\n    copy: props.item.promo.copy,\r\n    followUsLink: {\r\n      label: props.item.promo.followUsLink.label,\r\n      url: props.item.promo.followUsLink.url,\r\n      ariaLabel: props.item.promo.followUsLink.ariaLabel,\r\n      target: props.item.promo.followUsLink.target\r\n    },\r\n    slides: [...props.item.promo.slides]\r\n  };\r\n}\r\n</script>\r\n\r\n<template>\r\n  <!-- Start: LOCATION WRAPPER -->\r\n  <div\r\n    class=\"mb-f10 flex grid-cols-[2fr_4fr] flex-col gap-[clamp(1rem,5vw,12rem)] border-b border-solid border-neutral-30 md:grid md:items-start md:pb-f10 lg:grid-cols-[5fr_7fr]\"\r\n  >\r\n    <!-- Start: Location image -->\r\n    <div class=\"grid-row-[span_1] relative\">\r\n      <!-- Start: Locations image banner -->\r\n      <div v-if=\"item.promo || item.promoCopy\" class=\"absolute top-0 left-0 right-0 z-10 bg-limestone py-f2.5 px-2 text-center text-f-sm-base md:px-4\">\r\n        <FhWysiwyg>\r\n          <!-- eslint-disable-next-line vue/no-v-html -->\r\n          <span v-html=\"item.promoCopy\"></span>\r\n        </FhWysiwyg>\r\n        <span>&nbsp;</span>\r\n        <FhLocationsModal :modal-data=\"modalData\">\r\n          <template #default=\"{ toggleModal }\">\r\n            <FhButton\r\n              v-if=\"item.promo\"\r\n              variant=\"text\"\r\n              :size=\"isSm ? 'small' : 'medium'\"\r\n              :class=\"['underline', isSm ? 'underline-offset-4' : 'underline-offset-[6px]']\"\r\n              aria-label=\"Location Promo Announcement\"\r\n              @click=\"toggleModal\"\r\n            >\r\n              {{ item.promoLinkText ? item.promoLinkText : \"Read More\" }}\r\n            </FhButton>\r\n          </template>\r\n        </FhLocationsModal>\r\n      </div>\r\n      <span class=\"fhLocation__image relative block\">\r\n        <img :src=\"item.image\" :alt=\"item.imageAltText\" class=\"h-full w-full object-cover\" />\r\n      </span>\r\n      <!-- End: Locations image banner -->\r\n    </div>\r\n    <!-- End: Location image -->\r\n\r\n    <!-- Start: Location Information -->\r\n    <div class=\"grid-row-[span_1] flex flex-col md:flex-row md:flex-wrap md:self-center customColor\" :class=\"{ 'pb-f10': expanderOpen }\">\r\n      <h2\r\n        v-bind=\"triggerAriaAttributes\"\r\n        class=\"mb-f5 flex w-full items-center justify-between font-serif md:flex-[1_0_100%] md:cursor-default\"\r\n        @click.stop.prevent=\"isSm ? (expanderOpen = !expanderOpen) : false\"\r\n      >\r\n        <span class=\"text-left text-f-2xl-5xl leading-[0.825]\">{{ item.name }}</span>\r\n        <FhIcon\r\n          v-if=\"isSm\"\r\n          name=\"DownChevron\"\r\n          style=\"width: 1.5rem; height: 1.5rem\"\r\n          :class=\"['text-neutral-50', { 'rotate-180 transition-transform duration-200': expanderOpen }]\"\r\n        ></FhIcon>\r\n      </h2>\r\n      <TransitionExpand v-bind=\"regionAriaAttributes\">\r\n        <div v-if=\"expanderOpen || !isSm\" class=\"md:flex md:w-full md:flex-wrap md:gap-[1.5rem] customColor\">\r\n          <!-- ADDRESS -->\r\n          <div v-if=\"item.address\" class=\"flex-[0_0_calc((100%/3)-1rem)]\">\r\n            <div class=\"mb-1 text-f-sm-base text-neutral-70\">Address</div>\r\n            <div class=\"mb-1 flex flex-col text-f-xs-sm text-neutral-50 md:mb-5\">\r\n              <span>{{ item.address.address1 }}</span>\r\n              <span>{{ item.address.address2 }}</span>\r\n              <span>{{ item.address.address3 }}</span>\r\n              <div>\r\n                <span>{{ item.address.city }}, {{ item.address.state }} {{ item.address.zipCode }}</span>\r\n              </div>\r\n            </div>\r\n            <div v-if=\"item.directionsLink\" class=\"mb-5 md:mb-0\">\r\n              <FhButton\r\n                :variant=\"isSm || isMd ? 'text' : 'standard'\"\r\n                :size=\"isLg ? 'small' : null\"\r\n                :href=\"item.directionsLink\"\r\n                arial-label=\"Directions to Showroom\"\r\n                target=\"_blank\"\r\n                :class=\"isSm || isMd ? 'underline underline-offset-4' : ''\"\r\n                class=\"text-f-xs-sm\"\r\n              >\r\n                Directions\r\n              </FhButton>\r\n            </div>\r\n          </div>\r\n\r\n          <!-- HOURS -->\r\n          <div v-if=\"item.days1 && item.hours1\" class=\"mb-5 flex flex-[0_0_calc((100%/3)-1rem)] flex-wrap justify-start md:mb-0 md:flex-col md:flex-nowrap\">\r\n            <div class=\"mb-1 flex-[1_1_100%] text-f-sm-base text-neutral-70 md:flex-[unset]\">Hours (CST)</div>\r\n            <div class=\"flex flex-col text-f-xs-sm text-neutral-50 md:mb-5\">\r\n              <span>{{ item.days1 }}</span>\r\n              <span>{{ item.hours1 }}</span>\r\n            </div>\r\n            <div v-if=\"item.days2 && item.hours2\" class=\"ml-4 flex flex-col text-f-xs-sm text-neutral-50 md:ml-0\">\r\n              <span>{{ item.days2 }}</span>\r\n              <span>{{ item.hours2 }}</span>\r\n            </div>\r\n          </div>\r\n\r\n          <div class=\"md:flex-[0_0_calc((100%/3)-1rem)]\">\r\n            <!-- PHONE -->\r\n            <div v-if=\"item.phone\" class=\"md:mb-f5\" :class=\"!item.pickup ? 'mb-7' : 'mb-5'\">\r\n              <div class=\"mb-1 text-f-sm-base text-neutral-70\">Phone</div>\r\n              <FhButton\r\n                variant=\"text\"\r\n                size=\"small\"\r\n                :href=\"`tel:${item.phone}`\"\r\n                arial-label=\"Phone Number\"\r\n                class=\"decoration-current text-f-xs-sm text-neutral-50 underline underline-offset-4\"\r\n                >{{ item.phone }}</FhButton\r\n              >\r\n            </div>\r\n\r\n            <!-- PICKUP -->\r\n            <div v-if=\"item.pickup\" class=\"mb-7 md:mb-0\">\r\n              <div class=\"text-f-sm-base\">Furniture Pick Up</div>\r\n              <div class=\"flex flex-col text-f-xs-sm text-neutral-50\">\r\n                <span>{{ item.pickup.days }}</span>\r\n                <span>{{ item.pickup.hours }}</span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n\r\n          <!-- FOOTER  -->\r\n          <footer v-if=\"item.announcementCopy\" class=\"mt-f3 text-f-xs-sm md:flex-[1_1_100%]\">\r\n            <!-- OPTIONAL RICH TEXT LINKS -->\r\n            <FhWysiwyg>\r\n              <!-- eslint-disable-next-line vue/no-v-html -->\r\n              <div v-html=\"item.announcementCopy\"></div>\r\n            </FhWysiwyg>\r\n          </footer>\r\n        </div>\r\n      </TransitionExpand>\r\n    </div>\r\n  </div>\r\n  <!-- End: LOCATION WRAPPER -->\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.fhLocation__image::after {\r\n  content: \"\";\r\n  display: block;\r\n  padding-top: calc((2 / 3) * 100%);\r\n}\r\n\r\n@supports (aspect-ratio: 3/2) {\r\n  .fhLocation__image {\r\n    aspect-ratio: 3/2;\r\n  }\r\n  .fhLocation__image::after {\r\n    display: none;\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhLocation from \"./FhLocations/FhLocation.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { locations } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    aria-label=\"Four Hands Locations\"\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div>\r\n      <FhLocation v-for=\"item in locations\" :key=\"item.id\" :item=\"item\"></FhLocation>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.text-white * {\r\n  color: white;\r\n}\r\n\r\n.text-white :deep(.bg-limestone *) {\r\n  color: black !important;\r\n}\r\n</style>\r\n","<script setup>\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhLink from \"@/components/FhLink.vue\";\r\nimport { CONTACT_US } from \"@/constants/routes\";\r\n\r\nconst emit = defineEmits([\"navigate\"]);\r\n</script>\r\n\r\n<template>\r\n  <FhHeading heading=\"Recovery Email Sent\">\r\n    <template #subheading>\r\n      Follow the instructions in this email to reset your password. If you don&rsquo;t receive the email, please check your junk mail folder or\r\n      <FhLink :href=\"CONTACT_US\">contact us</FhLink> for assistance.\r\n    </template>\r\n  </FhHeading>\r\n  <div class=\"flex flex-col gap-f3 md:flex-row md:items-center\">\r\n    <FhButton color=\"primary\" @click=\"emit('navigate', 'login')\">Back to Log In</FhButton>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { reactive, computed } from \"vue\";\r\nimport { useInitiatePasswordResetMutation } from \"@/api/authApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhLink from \"@/components/FhLink.vue\";\r\nimport { CONTACT_US } from \"@/constants/routes\";\r\n\r\nconst emit = defineEmits([\"navigate\"]);\r\nconst props = defineProps({\r\n  username: {\r\n    type: String,\r\n    default: \"\"\r\n  }\r\n});\r\n\r\nconst model = reactive({\r\n  username: props.username\r\n});\r\n\r\nconst modelTrimmed = computed(() => ({\r\n  username: model.username.trim()\r\n}));\r\n\r\nconst isValid = computed(() => model.username?.length > 0);\r\n\r\nconst { mutate: loginMutate, isLoading } = useInitiatePasswordResetMutation();\r\nconst notificationStore = useNotificationStore();\r\n\r\nfunction submit() {\r\n  if (!isValid.value) return;\r\n  loginMutate(modelTrimmed.value, {\r\n    onSuccess: () => {\r\n      emit(\"navigate\", \"sent\");\r\n    },\r\n    onError: () => {\r\n      notificationStore.notifyError(\"Sorry, something went wrong and we could not send the password reset instructions. Please try again.\");\r\n    }\r\n  });\r\n}\r\n</script>\r\n\r\n<template>\r\n  <form class=\"flex flex-col\" @submit.prevent=\"submit\">\r\n    <FhHeading\r\n      heading=\"Having Trouble Signing In?\"\r\n      subheading=\"Enter your customer number or email address and we'll send you instructions for resetting your password.\"\r\n    />\r\n    <div class=\"mb-f8\">\r\n      <FhInput v-model=\"model.username\" label=\"Email or Customer Number\" placeholder=\"Enter email or customer number\">\r\n        <template #note> If you don't know the email address associated with your account, please <FhLink :href=\"CONTACT_US\">contact us</FhLink>. </template>\r\n      </FhInput>\r\n    </div>\r\n    <div class=\"flex flex-col gap-3 md:items-start md:self-end\">\r\n      <FhButton type=\"submit\" color=\"primary\" :disabled=\"!isValid || isLoading\" :is-loading=\"isLoading\">Continue</FhButton>\r\n      <FhButton variant=\"link\" size=\"small\" @click=\"emit('navigate', 'login')\">Back to Log In</FhButton>\r\n    </div>\r\n  </form>\r\n</template>\r\n","<script setup>\r\nimport { ref, reactive, computed } from \"vue\";\r\nimport { useLoginMutation } from \"@/api/authApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhLink from \"@/components/FhLink.vue\";\r\nimport { CONTACT_US } from \"@/constants/routes\";\r\n\r\nconst props = defineProps({\r\n  successRedirect: {\r\n    type: String,\r\n    default: \"/\"\r\n  },\r\n  userName: {\r\n    type: String,\r\n    default: \"\"\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"navigate\"]);\r\n\r\nconst model = reactive({\r\n  username: props.userName,\r\n  password: \"\"\r\n});\r\n\r\nconst isValid = computed(() => model.username?.length > 0 && model.password?.length > 0);\r\n\r\nconst { mutate: loginMutate, isLoading } = useLoginMutation();\r\nconst isRedirecting = ref(false);\r\nconst isAuthError = ref(false);\r\nconst notificationStore = useNotificationStore();\r\n\r\nfunction submit() {\r\n  if (!isValid.value) return;\r\n  loginMutate(\r\n    {\r\n      username: model.username.trim(),\r\n      password: model.password,\r\n      destinationPath: props.successRedirect\r\n    },\r\n    {\r\n      onSuccess: () => {\r\n        isRedirecting.value = true;\r\n        window.location = props.successRedirect;\r\n      },\r\n      onError: (error) => {\r\n        const defaultErrorMsg = \"Sorry, something went wrong and we could not log you in. Please try again.\";\r\n        if (error.response.status === 401) {\r\n          isAuthError.value = true;\r\n        } else if (error.response.status === 503) {\r\n          const retryAfter = error.response.headers[\"retry-after\"] || 1;\r\n          if (retryAfter) {\r\n            const retryAfterMs = parseInt(retryAfter) * 1000;\r\n            setTimeout(() => {\r\n              submit();\r\n            }, retryAfterMs);\r\n          } else {\r\n            notificationStore.notifyError(defaultErrorMsg);\r\n          }\r\n        } else {\r\n          notificationStore.notifyError(defaultErrorMsg);\r\n        }\r\n      }\r\n    }\r\n  );\r\n}\r\n</script>\r\n\r\n<template>\r\n  <form class=\"flex flex-col\" @submit.prevent=\"submit\">\r\n    <FhHeading heading=\"Access Your Account\">\r\n      <template #subheading>\r\n        <p v-if=\"isAuthError\" class=\"text-brand-red\">\r\n          That account could not be found or you have entered an invalid password.<br />\r\n          Please try again or <FhLink :href=\"CONTACT_US\">contact us</FhLink> for assistance.\r\n        </p>\r\n      </template>\r\n    </FhHeading>\r\n    <div class=\"mb-f8 flex flex-col gap-f4\">\r\n      <FhInput v-model=\"model.username\" label=\"Email or Customer Number\" placeholder=\"Enter email or customer number\" />\r\n      <FhInput v-model=\"model.password\" type=\"password\" label=\"Password\" placeholder=\"Enter password\" />\r\n    </div>\r\n    <div class=\"flex flex-col gap-3 md:items-start md:self-end\">\r\n      <FhButton type=\"submit\" color=\"primary\" :disabled=\"!isValid || isLoading || isRedirecting\" :is-loading=\"isLoading || isRedirecting\">Continue</FhButton>\r\n      <FhButton variant=\"link\" size=\"small\" @click=\"emit('navigate', 'forgot')\">Forgot Password?</FhButton>\r\n    </div>\r\n  </form>\r\n</template>\r\n","<script setup>\r\nimport { computed, ref } from \"vue\";\r\nimport { useResetPasswordMutation } from \"@/api/authApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhNewPassword from \"@/components/FhNewPassword.vue\";\r\n\r\nconst props = defineProps({\r\n  userId: {\r\n    type: [Number, String],\r\n    default: null\r\n  },\r\n  token: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  isInvalid: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"navigate\"]);\r\n\r\nconst password = ref(\"\");\r\n\r\nconst allowSubmit = computed(() => !!password.value);\r\n\r\nconst { mutate: passwordResetMutate, isLoading } = useResetPasswordMutation();\r\nconst isResetError = ref(false);\r\nconst notificationStore = useNotificationStore();\r\n\r\nfunction submit() {\r\n  if (!allowSubmit.value) return;\r\n\r\n  passwordResetMutate(\r\n    {\r\n      userId: props.userId,\r\n      token: props.token,\r\n      password: password.value\r\n    },\r\n    {\r\n      onSuccess: (data) => {\r\n        notificationStore.notifySuccess(\"Your password has been updated. You can log in using your new password.\");\r\n        emit(\"navigate\", \"login\", data.userName);\r\n      },\r\n      onError: (error) => {\r\n        if (error.response.status === 400) {\r\n          isResetError.value = true;\r\n        } else {\r\n          notificationStore.notifyError(\"Sorry, something went wrong and we could not update your password. Please try again.\");\r\n        }\r\n      }\r\n    }\r\n  );\r\n}\r\n</script>\r\n\r\n<template>\r\n  <FhHeading heading=\"Update Your Password\">\r\n    <template #subheading>\r\n      <p v-if=\"isResetError\" class=\"text-brand-red\">\r\n        Sorry, we could not update your password.<br />\r\n        Please <FhButton variant=\"link\" @click=\"emit('navigate', 'forgot')\">request another</FhButton> password reset link and try again.\r\n      </p>\r\n    </template>\r\n  </FhHeading>\r\n  <div v-if=\"props.isInvalid\">\r\n    <div class=\"gap-f mb-f6 flex flex-row items-center gap-f1\">\r\n      <FhIcon name=\"AlertCircle\" class=\"text-[125%]\" />\r\n      <span>Sorry, this link is no longer valid.</span>\r\n    </div>\r\n    <FhButton color=\"primary\" @click=\"emit('navigate', 'forgot')\">Request Another Link</FhButton>\r\n  </div>\r\n  <form v-if=\"!props.isInvalid\" class=\"flex flex-col\" @submit.prevent=\"submit\">\r\n    <FhNewPassword v-model=\"password\" class=\"mb-f8\" />\r\n    <div class=\"flex flex-col gap-3 md:items-start md:self-end\">\r\n      <FhButton type=\"submit\" color=\"primary\" :disabled=\"!allowSubmit || isLoading\" :is-loading=\"isLoading\">Update Password</FhButton>\r\n    </div>\r\n  </form>\r\n</template>\r\n","<script setup>\r\nimport { ref, nextTick, watch, onMounted } from \"vue\";\r\nimport EmailSent from \"@/components/FHLogin/FhLogin-Page-EmailSent.vue\";\r\nimport FhFullscreenFocusedLayout from \"@/components/FhFullscreenFocusedLayout.vue\";\r\nimport FhLink from \"@/components/FhLink.vue\";\r\nimport ForgotPassword from \"@/components/FHLogin/FhLogin-Page-ForgotPassword.vue\";\r\nimport LogInPage from \"@/components/FHLogin/FhLogin-Page-LogIn.vue\";\r\nimport UpdatePassword from \"@/components/FHLogin/FhLogin-Page-UpdatePassword.vue\";\r\nimport { LOGIN, TRADEPROGRAM, CONTACT_US } from \"@/constants/routes\";\r\n\r\nconst PAGE_LOGIN = \"login\";\r\nconst PAGE_FORGOT = \"forgot\";\r\nconst PAGE_SENT = \"sent\";\r\nconst PAGE_RESET = \"reset\";\r\n\r\nconst props = defineProps({\r\n  image: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  page: {\r\n    type: String,\r\n    default: \"login\",\r\n    validator: (val) => [\"login\", \"forgot\", \"reset\"].includes(val)\r\n  },\r\n  successRedirect: {\r\n    type: String,\r\n    default: \"/\"\r\n  },\r\n  userId: {\r\n    type: [Number, String],\r\n    default: null\r\n  },\r\n  token: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  isInvalid: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst layout = ref(null);\r\nconst form = ref(null);\r\nconst currentPage = ref(props.page);\r\n\r\nconst focusFirstEmptyInput = () => {\r\n  nextTick(() => form.value.querySelector(\"input:placeholder-shown\")?.focus());\r\n};\r\nonMounted(focusFirstEmptyInput);\r\nwatch(currentPage, focusFirstEmptyInput);\r\n\r\nconst userName = ref(null);\r\n\r\nconst navigateTo = (destination, _userName) => {\r\n  currentPage.value = destination;\r\n  userName.value = _userName ?? null;\r\n\r\n  if (destination === PAGE_LOGIN) history.replaceState(null, null, LOGIN);\r\n  if (destination === PAGE_FORGOT) history.replaceState(null, null, `${LOGIN}?page=${PAGE_FORGOT}`);\r\n\r\n  nextTick(() => layout.value.scrollContainer.scrollTo({ top: 0, behavior: \"smooth\" }));\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhFullscreenFocusedLayout ref=\"layout\" :background-image=\"props.image\">\r\n    <template #default>\r\n      <div ref=\"form\">\r\n        <LogInPage v-if=\"currentPage === PAGE_LOGIN\" :success-redirect=\"props.successRedirect\" :user-name=\"userName\" @navigate=\"navigateTo\" />\r\n        <ForgotPassword v-else-if=\"currentPage === PAGE_FORGOT\" @navigate=\"navigateTo\" />\r\n        <EmailSent v-else-if=\"currentPage === PAGE_SENT\" @navigate=\"navigateTo\" />\r\n        <UpdatePassword\r\n          v-else-if=\"currentPage === PAGE_RESET\"\r\n          :user-id=\"props.userId\"\r\n          :token=\"props.token\"\r\n          :is-invalid=\"props.isInvalid\"\r\n          @navigate=\"navigateTo\"\r\n        />\r\n      </div>\r\n    </template>\r\n    <template #footer>\r\n      <div class=\"flex flex-col gap-f6 md:flex-row\">\r\n        <div class=\"flex flex-col gap-f0.5\">\r\n          <span class=\"text-neutral-50\">Not a Member?</span>\r\n          <FhLink :href=\"TRADEPROGRAM\">Apply Now</FhLink>\r\n        </div>\r\n        <div class=\"flex flex-col gap-f0.5\">\r\n          <span class=\"text-neutral-50\">Need Help?</span>\r\n          <FhLink :href=\"CONTACT_US\">Contact Us</FhLink>\r\n        </div>\r\n      </div>\r\n    </template>\r\n  </FhFullscreenFocusedLayout>\r\n</template>\r\n","<script setup>\r\nimport { computed, ref } from \"vue\";\r\nimport FhModal from \"../FhModal.vue\";\r\nimport FhCheckbox from \"../FhCheckbox.vue\";\r\nimport FhButton from \"../FhButton.vue\";\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"submit\", \"cancel\"]);\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isOpen: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isLoading: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst values = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => {\r\n    emit(\"update:modelValue\", value);\r\n  }\r\n});\r\n\r\nconst modal = ref(null);\r\nconst isOpen = computed(() => props.isOpen);\r\nconst toggleModal = () => {\r\n  emit(\"cancel\");\r\n};\r\n\r\nconst allowSubmit = computed(() => {\r\n  return Object.entries(values.value).every(([key, value]) => {\r\n    if (key === \"homeNewsletter\") return true;\r\n    if (key === \"outletNewsletter\") return true;\r\n    return String(value).trim().length;\r\n  });\r\n});\r\n\r\nconst submit = () => {\r\n  emit(\"submit\", values.value);\r\n};\r\n</script>\r\n\r\n<template>\r\n  <slot :toggle-modal=\"toggleModal\">\r\n    <!-- Button To Open/Close Injected Here -->\r\n  </slot>\r\n  <FhModal ref=\"modal\" v-model:is-open=\"isOpen\">\r\n    <template #body>\r\n      <h2 class=\"mb-f3 font-serif text-f-2xl-4xl\">Email Preferences</h2>\r\n      <p class=\"mb-f8 font-bold\">Manage your preferences for {{ values.emailAddress }}</p>\r\n      <div class=\"mb-f5 flex flex-col\">\r\n        <FhCheckbox v-model=\"values.homeNewsletter\" label=\"Four Hands Home Newsletter\" class=\"\" />\r\n        <p class=\"ml-8 text-f-sm-base text-neutral-50\">Stay informed of Four Hands Home exclusive events, sales and new product offerings.</p>\r\n      </div>\r\n      <div class=\"flex flex-col\">\r\n        <FhCheckbox v-model=\"values.outletNewsletter\" label=\"Four Hands Home Outlet Newsletter\" class=\"\" />\r\n        <p class=\"mb-f8 ml-8 text-f-sm-base text-neutral-50\">Stay informed of Four Hands Home Outlet exclusive events, sales and new product offerings.</p>\r\n      </div>\r\n    </template>\r\n\r\n    <template #footer>\r\n      <FhButton\r\n        color=\"primary\"\r\n        aria-label=\"Submit Newsletter Signup`\"\r\n        :disabled=\"!allowSubmit || props.isLoading !== false || (!values.homeNewsletter && !values.outletNewsletter)\"\r\n        :is-loading=\"props.isLoading\"\r\n        @click.stop.prevent=\"submit\"\r\n      >\r\n        Sign Up\r\n      </FhButton>\r\n      <FhButton variant=\"text\" aria-label=\"Cancel Newsletter Signup\" @click=\"toggleModal\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n","import axiosClient from \"./axiosClient\";\r\nimport { useMutation } from \"@tanstack/vue-query\";\r\n\r\nexport function useSubmitMailingListMutation(options) {\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (data) => axiosClient.post(\"/mailing-list\", data)\r\n  });\r\n}\r\n","<script setup>\r\nimport { reactive, ref } from \"vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhInput from \"./FhInput.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhMailingListModal from \"./FhMailingList/FhMailingListModal.vue\";\r\nimport { useSubmitMailingListMutation } from \"@/api/mailingListApi.js\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore.js\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, email, required } from \"@vuelidate/validators\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  }\r\n});\r\n\r\nconst modalData = reactive({\r\n  emailAddress: \"\",\r\n  homeNewsletter: true,\r\n  outletNewsletter: true\r\n});\r\n\r\nconst openModal = ref(false);\r\nconst isLoading = ref(false);\r\n\r\nconst toggleModal = () => {\r\n  openModal.value = !openModal.value;\r\n};\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    emailAddress: {\r\n      required: helpers.withMessage(\"Please enter an email address.\", required),\r\n      email: helpers.withMessage(\"Please enter a valid email address.\", email)\r\n    }\r\n  },\r\n  modalData\r\n);\r\n\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst submitMailingListMutation = useSubmitMailingListMutation();\r\n\r\nasync function submit() {\r\n  isLoading.value = true;\r\n  if (await vuelidate.value.$validate()) {\r\n    let data = { ...modalData };\r\n    submitMailingListMutation.mutate(data, {\r\n      onSuccess: handleSaveSuccess,\r\n      onError: handleSaveError,\r\n      onSettled: () => {\r\n        toggleModal();\r\n        isLoading.value = false;\r\n      }\r\n    });\r\n  }\r\n}\r\n\r\nfunction handleSaveSuccess() {\r\n  modalData.emailAddress = \"\";\r\n  vuelidate.value.$reset();\r\n  notificationStore.notifySuccess(\"You have been subscribed to our mailing list!\");\r\n}\r\n\r\nfunction handleSaveError() {\r\n  notificationStore.notifyError(\"Sorry, something went wrong. Please try again.\");\r\n}\r\n</script>\r\n\r\n<template>\r\n  <FhSection aria-label=\"Mailing List Signup\" :base=\"props.style.base\" class=\"border-b border-solid border-neutral-30\">\r\n    <div class=\"flex flex-col items-center justify-center\">\r\n      <div class=\"mb-f8 text-center\">\r\n        <h2 class=\"mb-f4 font-serif text-f-4xl-8xl\">Join Our Austin Mailing List</h2>\r\n        <p class=\"max-w-[700px] text-f-sm-xl\">Be the first to hear about our latest arrivals, special events and deals at our Austin showroom and outlet.</p>\r\n      </div>\r\n      <form id=\"mailingList\" @submit.prevent>\r\n        <div class=\"grid w-full grid-rows-2 items-start md:w-auto md:max-w-[615px] md:grid-cols-5 md:grid-rows-1\">\r\n          <FhMailingListModal v-model=\"modalData\" :is-open=\"openModal\" :is-loading=\"isLoading\" @submit=\"submit\" @cancel=\"toggleModal\">\r\n            <template #default=\"{}\">\r\n              <FhInput\r\n                v-model=\"modalData.emailAddress\"\r\n                :wrapper-attrs=\"{ class: 'col-span-5 mb-3 w-full md:col-span-4 md:mb-0 md:pr-4' }\"\r\n                placeholder=\"Enter your email\"\r\n                required\r\n                :vuelidate=\"vuelidate.emailAddress\"\r\n                @keyup.self.enter=\"!vuelidate.$invalid ? toggleModal() : false\"\r\n              />\r\n              <FhButton\r\n                v-bind=\"{ color: 'primary', size: 'large' }\"\r\n                :disabled=\"vuelidate.$invalid\"\r\n                class=\"col-span-5 mt-3 flex max-h-[61px] w-full items-center text-center md:col-span-1\"\r\n                @click=\"toggleModal\"\r\n              >\r\n                Sign&nbsp;Up\r\n              </FhButton>\r\n            </template>\r\n          </FhMailingListModal>\r\n        </div>\r\n      </form>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { ref, reactive } from \"vue\";\r\nimport FhModal from \"../FhModal.vue\";\r\n\r\nconst props = defineProps({\r\n  material: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst isOpen = ref(false);\r\nconst toggleModal = () => {\r\n  isOpen.value = !isOpen.value;\r\n};\r\nconst modalData = reactive({\r\n  version: \"product\",\r\n  heading: props.material.careTitle,\r\n  copy: props.material.careCopy,\r\n  ctaText: props.material.ctaText,\r\n  ctaURL: props.material.ctaURL,\r\n  ctaTarget: props.material.ctaTarget,\r\n  ctaAriaLabel: \"Download \" + props.material.materialName + \" Care Guide\",\r\n  ctaDownload: true\r\n});\r\n</script>\r\n\r\n<template>\r\n  <button\r\n    type=\"button\"\r\n    class=\"flex cursor-pointer items-start gap-[1.5rem] border-[1px] border-solid border-neutral-30 p-f5 text-left transition-all hover:bg-neutral-10\"\r\n    @click=\"toggleModal\"\r\n  >\r\n    <img :src=\"material.imageSrc\" class=\"max-w-[70px]\" />\r\n    <div class=\"flex flex-col gap-[0.25rem]\">\r\n      <p class=\"text-f-base-lg\">{{ material.title }}</p>\r\n      <fh-wyswiyg>\r\n        <!-- eslint-disable-next-line vue/no-v-html -->\r\n        <p class=\"text-f-xs-sm text-neutral-50\" v-html=\"material.copy\"></p>\r\n      </fh-wyswiyg>\r\n    </div>\r\n  </button>\r\n  <FhModal v-model:is-open=\"isOpen\" :data=\"modalData\"></FhModal>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport FhMaterial from \"./FhMaterials/FhMaterial.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { materials } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <div class=\"grid grid-cols-[1fr] gap-[2rem] md:grid-cols-[repeat(2,1fr)]\">\r\n    <FhMaterial v-for=\"(material, i) in materials\" :key=\"`material-${i}`\" :material=\"material\"></FhMaterial>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { ref, nextTick } from \"vue\";\r\nimport { usePaginatedList } from \"../composables\";\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport scrollToTopOf from \"../util/scrollToTopOf\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhPaginationNav from \"./FhPaginationNav.vue\";\r\nimport FhMediaItem from \"./FhMediaListing/FhMediaItem.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { type, title, items, linkText, linkAltText, linkTarget, linkUrl } = getDataRefs(props.data);\r\n\r\nconst PER_PAGE = 8;\r\nconst { page, totalPages, sublist: currentPage } = usePaginatedList(items, PER_PAGE);\r\n\r\nconst rootElem = ref(null);\r\n</script>\r\n\r\n<template>\r\n  <div ref=\"rootElem\">\r\n    <FhSection\r\n      aria-label=\"Media Listing\"\r\n      :base=\"style.base\"\r\n      :class=\"[\r\n        props.style.base?.background !== 'limestone' && props.style.base?.background !== null && props.style.base?.background !== '' ? 'text-white' : ''\r\n      ]\"\r\n    >\r\n      <div v-if=\"type === 'more'\" class=\"mb-f3\">\r\n        <span>{{ title }}</span>\r\n      </div>\r\n      <div\r\n        :class=\"[\r\n          'flex',\r\n          type === 'listing'\r\n            ? ' mb-f6 flex-wrap gap-[3rem] border-b border-solid border-neutral-30 pb-f15 lg:gap-[4rem]'\r\n            : 'flex-col gap-10 md:flex-row md:gap-4'\r\n        ]\"\r\n      >\r\n        <FhMediaItem v-for=\"item in currentPage\" :key=\"item.id\" :item=\"item\" :type=\"type\"></FhMediaItem>\r\n      </div>\r\n      <div v-if=\"type === 'listing' && totalPages > 1\" class=\"mb-f12.5 flex items-center justify-center\">\r\n        <FhPaginationNav v-model:page=\"page\" :total-items=\"items.length\" :per-page=\"PER_PAGE\" @page-change=\"nextTick(() => scrollToTopOf(rootElem))\" />\r\n      </div>\r\n      <div v-else-if=\"linkText\" class=\"mt-f10 flex flex-col md:flex-row md:justify-center\">\r\n        <FhButton :aria-label=\"linkAltText\" :href=\"linkUrl\" :target=\"linkTarget\" size=\"small\">{{ linkText }}</FhButton>\r\n      </div>\r\n    </FhSection>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n::v-deep .text-white * {\r\n  color: white !important;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport { onMounted, ref } from \"vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { heading, orderHistoryUrl } = getDataRefs(props.data);\r\n\r\nconst iframe = ref(null);\r\n\r\nonMounted(() => {\r\n  window.addEventListener(\r\n    \"message\",\r\n    function (e) {\r\n      let message = e.data;\r\n      iframe.value.style.height = message + \"px\";\r\n      //console.log(\"set iframe to \" + message);\r\n    },\r\n    false\r\n  );\r\n});\r\n</script>\r\n\r\n<template>\r\n  <FhSection :base=\"style.base\">\r\n    <!-- ORDER STATUS TERMS -->\r\n    <div class=\"mb-f10 flex flex-col text-neutral-70 md:border-b md:border-solid md:border-neutral-70 md:border-opacity-10 md:pb-f10\">\r\n      <FhHeading tag=\"h2\">{{ heading }}</FhHeading>\r\n      <div class=\"mb-5 hidden md:flex md:flex-col\">\r\n        <h2 class=\"mb-4 text-xl lg:mb-10\">Order Status Terms</h2>\r\n        <div class=\"mb-2 flex flex-col md:flex-row\">\r\n          <span class=\"mb-0.5 text-f-sm-base font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\"> Open </span>\r\n          <span class=\"text-neutral-50 md:basis-8/12 lg:basis-9/12\"> Order in progress </span>\r\n        </div>\r\n        <div class=\"mb-2 flex flex-col md:flex-row\">\r\n          <span class=\"mb-0.5 text-f-sm-base font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\"> Payment Processing </span>\r\n          <span class=\"text-neutral-50 md:basis-8/12 lg:basis-9/12\"> Payment pending approval </span>\r\n        </div>\r\n        <div class=\"mb-2 flex flex-col md:flex-row\">\r\n          <span class=\"mb-0.5 text-f-sm-base font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\"> Processing </span>\r\n          <span class=\"text-neutral-50 md:basis-8/12 lg:basis-9/12\"> Packaging for shipment </span>\r\n        </div>\r\n        <div class=\"mb-2 flex flex-col md:flex-row\">\r\n          <span class=\"mb-0.5 text-f-sm-base font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\"> Boarded </span>\r\n          <span class=\"text-neutral-50 md:basis-8/12 lg:basis-9/12\"> Ready for transit </span>\r\n        </div>\r\n        <div class=\"mb-2 flex flex-col md:flex-row\">\r\n          <span class=\"mb-0.5 text-f-sm-base font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\"> Shipped </span>\r\n          <span class=\"text-neutral-50 md:basis-8/12 lg:basis-9/12\"> Order en route </span>\r\n        </div>\r\n      </div>\r\n      <div class=\"block\">\r\n        <iframe ref=\"iframe\" :src=\"orderHistoryUrl\" frameborder=\"0\" style=\"width: 100%; border: none\" scrolling=\"no\"></iframe>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { SHIPPING_OPTIONS, FREIGHT_SERVICE_LEVEL } from \"@/constants/checkout\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport formatPrice from \"@/util/formatPrice\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhCartItem from \"@/components/FhCartItem.vue\";\r\nimport FhCheckoutShippingDetailsSummary from \"@/components/FhCheckoutShippingDetailsSummary.vue\";\r\nimport FhShippingAddress from \"@/components/FhShippingAddress.vue\";\r\nimport FhPaymentCard from \"@/components/Ecomm/FhPaymentCard/FhPaymentCard.vue\";\r\nimport { event_Purchase } from \"@/util/googleAnalytics\";\r\n\r\nconst props = defineProps({\r\n  orderNumber: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  orderDate: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  email: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  totalItemsPrice: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  totalShippingPrice: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  /**\r\n   * If `true`, the `totalShippingPrice` prop will be ignored and the shipping price will be displayed as \"to be quoted\"\r\n   */\r\n  shippingPriceToBeQuoted: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  totalTaxPrice: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  totalPrice: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  items: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  shippingOption: {\r\n    type: String,\r\n    default: null,\r\n    validator: (val) => Object.values(SHIPPING_OPTIONS).includes(val)\r\n  },\r\n  shippingAddress: {\r\n    type: Object,\r\n    default: null\r\n  },\r\n  freightServiceLevel: {\r\n    type: String,\r\n    default: null,\r\n    validator: (val) => Object.values(FREIGHT_SERVICE_LEVEL).includes(val)\r\n  },\r\n  carrierNotes: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carrierName: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  carrierAccountNumber: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pickUpContactName: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pickUpContactPhone: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  holdDate: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  hasTerms: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  paymentCard: {\r\n    type: Object,\r\n    default: null\r\n  },\r\n  poNumber: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst { isSm } = useViewportSizes();\r\n\r\nconst orderDateFormatted = computed(() => {\r\n  return new Date(props.orderDate)?.toLocaleDateString(navigator.language || \"en-US\", { dateStyle: \"long\" });\r\n});\r\n\r\nconst showShippingAddress = computed(() => props.shippingAddress && props.shippingOption !== SHIPPING_OPTIONS.PICK_UP);\r\n\r\nfunction print() {\r\n  window.print();\r\n}\r\n\r\nevent_Purchase({\r\n  orderNumber: props.orderNumber,\r\n  totalPrice: props.totalPrice,\r\n  tax: props.totalTaxPrice,\r\n  shippingPrice: props.totalShippingPrice,\r\n  products: props.items\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div>\r\n    <div class=\"mb-f6 flex flex-col gap-f4 md:flex-row md:items-center md:gap-f6\">\r\n      <div>\r\n        <div class=\"text-f-xs-base text-neutral-50\">Order Date</div>\r\n        <div class=\"text-f-base-xl\">{{ orderDateFormatted }}</div>\r\n      </div>\r\n      <div>\r\n        <div class=\"text-f-xs-base text-neutral-50\">Email Address</div>\r\n        <div class=\"text-f-base-xl\">{{ props.email }}</div>\r\n      </div>\r\n      <FhButton v-if=\"!isSm\" class=\"md:ml-auto\" @click=\"print\">Print Order</FhButton>\r\n    </div>\r\n    <div class=\"mb-f6 grid gap-px bg-neutral-30 p-px\" :class=\"[showShippingAddress ? 'md:grid-cols-3' : 'md:grid-cols-2']\">\r\n      <div v-if=\"showShippingAddress\" class=\"bg-white p-5 md:p-6\">\r\n        <div class=\"mb-2\">Delivery Address</div>\r\n        <FhShippingAddress v-bind=\"props.shippingAddress\" simple-display class=\"text-f-xs-base text-neutral-50\" />\r\n      </div>\r\n      <div class=\"bg-white p-5 md:p-6\">\r\n        <div class=\"mb-2\">Delivery Information</div>\r\n        <FhCheckoutShippingDetailsSummary v-bind=\"$props\" class=\"text-f-xs-base text-neutral-50\" />\r\n      </div>\r\n      <div class=\"bg-white p-5 md:p-6\">\r\n        <div class=\"mb-2\">Payment Method</div>\r\n        <div v-if=\"props.hasTerms\" class=\"text-f-xs-base text-neutral-50\">Payment Terms</div>\r\n        <FhPaymentCard v-else v-bind=\"props.paymentCard\" :show-remove-link=\"false\" />\r\n      </div>\r\n    </div>\r\n    <div class=\"mb-f6\">\r\n      <FhCartItem v-for=\"item in props.items\" :key=\"item.sku.skuNumber\" v-bind=\"item\" view-only class=\"border-t-0\" />\r\n    </div>\r\n    <div class=\"flex flex-col gap-f4 border-b border-neutral-30 pb-f4\">\r\n      <div class=\"flex justify-between\">\r\n        <div class=\"text-f-base-2xl\">Subtotal</div>\r\n        <div class=\"text-f-base-xl\">{{ formatPrice(props.totalItemsPrice) }}</div>\r\n      </div>\r\n      <div class=\"flex justify-between\">\r\n        <div class=\"text-f-base-2xl\">Shipping</div>\r\n        <div v-if=\"props.shippingPriceToBeQuoted\" class=\"text-f-base-xl\">{{ isSm ? \"To be quoted\" : \"Quote provided at time of shipment\" }}</div>\r\n        <div v-else class=\"text-f-base-xl\">{{ formatPrice(props.totalShippingPrice) }}</div>\r\n      </div>\r\n      <div class=\"flex justify-between\">\r\n        <div class=\"text-f-base-2xl\">Taxes</div>\r\n        <div class=\"text-f-base-xl\">{{ formatPrice(props.totalTaxPrice) }}</div>\r\n      </div>\r\n      <div v-if=\"props.poNumber\" class=\"flex justify-between\">\r\n        <div class=\"text-f-base-2xl\">PO Number</div>\r\n        <div class=\"text-f-base-xl\">{{ props.poNumber }}</div>\r\n      </div>\r\n      <div class=\"flex justify-between\">\r\n        <div class=\"text-f-base-2xl\">Total</div>\r\n        <div class=\"text-f-xl-4xl\">{{ formatPrice(props.totalPrice) }}</div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style scoped>\r\n:deep(.paymentCard) {\r\n  @apply flex-row items-start;\r\n}\r\n:deep(.paymentCard__icon) {\r\n  @apply w-16;\r\n}\r\n:deep(.paymentCard__name) {\r\n  @apply mb-0 text-f-xs-base text-neutral-50;\r\n}\r\n:deep(.paymentCard__details) {\r\n  @apply flex-col gap-0 text-f-xs-base text-neutral-50;\r\n}\r\n:deep(.paymentCard__detailsDivider) {\r\n  @apply hidden;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref } from \"vue\";\r\nimport FhModal from \"../FhModal.vue\";\r\nimport FhButton from \"../FhButton.vue\";\r\n\r\nconst props = defineProps({\r\n  modalData: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  }\r\n});\r\n\r\nconst isOpen = ref(false);\r\nconst toggleModal = () => {\r\n  isOpen.value = !isOpen.value;\r\n};\r\n</script>\r\n\r\n<template>\r\n  <slot :toggle-modal=\"toggleModal\">\r\n    <!-- Button To Open/Close Injected Here -->\r\n  </slot>\r\n  <!-- PERSON ITEM MODAL -->\r\n  <FhModal v-model:is-open=\"isOpen\" :data=\"{ heading: `${props.modalData.firstName} ${props.modalData.lastName}`, subheading: props.modalData.role }\">\r\n    <template #body>\r\n      <fh-wysiwyg v-if=\"modalData.bioCopy\" :content=\"props.modalData.bioCopy\" />\r\n    </template>\r\n    <template v-if=\"modalData.linkedInUrl\" #footer>\r\n      <FhButton\r\n        variant=\"link\"\r\n        :href=\"modalData.linkedInUrl\"\r\n        :aria-label=\"`Link to ${modalData.firstName} ${modalData.lastName}'s' LinkedIn Profile`\"\r\n        target=\"_blank\"\r\n      >\r\n        LinkedIn\r\n      </FhButton>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n","<script setup>\r\nimport FhButton from \"../FhButton.vue\";\r\nimport FhPersonModal from \"./FhPersonModal.vue\";\r\n\r\nconst props = defineProps({\r\n  person: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nlet modalData = {\r\n  firstName: props.person.firstName,\r\n  lastName: props.person.lastName,\r\n  role: props.person.role,\r\n  bioCopy: props.person.bioCopy,\r\n  linkedInUrl: props.person.linkedInUrl\r\n};\r\n</script>\r\n\r\n<template>\r\n  <!-- PERSON ITEM -->\r\n  <div>\r\n    <FhPersonModal :modal-data=\"modalData\">\r\n      <template #default=\"{ toggleModal }\">\r\n        <component\r\n          :is=\"person.bioCopy ? FhButton : 'div'\"\r\n          v-bind=\"{ ...(!!person.bioCopy && { variant: 'text', 'aria-label': `Open bio for ${person.firstName} ${person.lastName}` }) }\"\r\n          class=\"flex w-full flex-col justify-start after:hidden\"\r\n          @click=\"person.bioCopy ? toggleModal() : false\"\r\n        >\r\n          <div class=\"fh-person__image relative w-full\">\r\n            <img :src=\"person.image\" :alt=\"person.imageAltText\" class=\"absolute inset-0 h-full w-full object-cover\" />\r\n          </div>\r\n          <div class=\"w-full p-f3 text-left\">\r\n            <h3 class=\"mb-f2 font-serif text-f-2xl-5xl\">{{ person.firstName }} {{ person.lastName }}</h3>\r\n            <div class=\"text-f-base-xl text-neutral-50\">\r\n              {{ person.role }}\r\n            </div>\r\n          </div>\r\n        </component>\r\n      </template>\r\n    </FhPersonModal>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n\r\n.fh-person__image {\r\n  &::before {\r\n    display: block;\r\n    width: 100%;\r\n    content: '';\r\n    pointer-events: none;\r\n    z-index: -1;\r\n    padding-top: 100%;\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhPerson from \"./FhPeople/FhPerson.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { people } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    aria-label=\"People & Leadership\"\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div class=\"grid grid-cols-1 gap-5 pt-f8 md:grid-cols-2 lg:grid-cols-3\">\r\n      <fh-person v-for=\"person in people\" :key=\"person.id\" :person=\"person\"></fh-person>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.text-white * {\r\n  color: white;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, nextTick } from \"vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport { usePaginatedList } from \"../composables\";\r\nimport scrollToTopOf from \"../util/scrollToTopOf\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhPaginationNav from \"./FhPaginationNav.vue\";\r\nimport FhPressItem from \"./FhPressListing/FhPressItem.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { items } = getDataRefs(props.data);\r\n\r\nconst PER_PAGE = 8;\r\nconst { page, totalPages, sublist: currentPage } = usePaginatedList(items, PER_PAGE);\r\n\r\nconst rootElem = ref(null);\r\n</script>\r\n\r\n<template>\r\n  <div ref=\"rootElem\">\r\n    <FhSection aria-label=\"Press Listing\" :base=\"style.base\">\r\n      <div class=\"mx-auto mb-f6 max-w-[1530px] border-b border-solid border-neutral-30\">\r\n        <FhPressItem v-for=\"item in currentPage\" :key=\"item.id\" :item=\"item\"></FhPressItem>\r\n      </div>\r\n      <div v-if=\"totalPages > 1\" class=\"mb-f12.5 flex items-center justify-center\">\r\n        <FhPaginationNav v-model:page=\"page\" :total-items=\"items.length\" :per-page=\"8\" @page-change=\"nextTick(() => scrollToTopOf(rootElem))\" />\r\n      </div>\r\n    </FhSection>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\n\r\nconst props = defineProps({\r\n  shippedTotal: {\r\n    type: Number,\r\n    default: 0\r\n  },\r\n  nextLevel: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  amountToNextLevel: {\r\n    type: Number,\r\n    default: 0\r\n  },\r\n  nextDiscount: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pricingLevel: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  pricingLevelDiscount: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst levelTotal = computed(() => {\r\n  return props.nextLevel == \"Enterprise\" ? 20000 : 10000;\r\n});\r\n\r\nconst pricingProgressWidth = computed(() => {\r\n  const totalFromLevel = levelTotal.value - props.amountToNextLevel;\r\n  return `${Math.floor((totalFromLevel / levelTotal.value) * 100)}%`;\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"-z-[1] flex flex-col\">\r\n    <template v-if=\"props.pricingLevel == 'Enterprise'\">\r\n      <span class=\"mb-f4 text-f-sm-2xl font-bold\">Congratulations, welcome to the top tier.</span>\r\n    </template>\r\n    <template v-else>\r\n      <span class=\"mb-f2 text-f-sm-2xl font-bold\">Spend ${{ props.amountToNextLevel.toLocaleString() }} to reach {{ props.nextLevel }} </span>\r\n      <div class=\"relative mb-f1.5 h-3.5 w-full bg-neutral-40\">\r\n        <span class=\"progress-bar absolute left-0 top-0 bottom-0 h-3.5 bg-black\"></span>\r\n      </div>\r\n      <div class=\"flex\">\r\n        <span class=\"mr-auto text-f-xs-sm text-neutral-50\"> {{ props.pricingLevel }} Status: {{ props.pricingLevelDiscount }} </span>\r\n        <span class=\"ml-auto text-f-xs-sm text-neutral-50\"> {{ props.nextLevel }} Status: {{ props.nextDiscount }} </span>\r\n      </div>\r\n    </template>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\">\r\n.progress-bar {\r\n  width: 0%;\r\n  animation: grow 1s 0.5s ease 1 forwards;\r\n}\r\n\r\n@keyframes grow {\r\n  to {\r\n    width: v-bind(\"pricingProgressWidth\");\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\n\r\nconst props = defineProps({\r\n  shippedTotal: {\r\n    type: Number,\r\n    default: 0\r\n  }\r\n});\r\n\r\nconst tableData = computed(() => [\r\n  {\r\n    id: 1,\r\n    indicatorColor: \"insider\",\r\n    pricingLevel: \"Insider\",\r\n    ttm: \"$0-9,999\",\r\n    discount: \"Wholesale\",\r\n    checkIcon: props.shippedTotal >= 0\r\n  },\r\n  {\r\n    id: 2,\r\n    indicatorColor: \"silver\",\r\n    pricingLevel: \"Silver\",\r\n    ttm: \"$10-19,999\",\r\n    discount: \"10% off\",\r\n    checkIcon: props.shippedTotal >= 10000\r\n  },\r\n  {\r\n    id: 3,\r\n    indicatorColor: \"gold\",\r\n    pricingLevel: \"Gold\",\r\n    ttm: \"$20-29,999\",\r\n    discount: \"15% off\",\r\n    checkIcon: props.shippedTotal >= 20000\r\n  },\r\n  {\r\n    id: 4,\r\n    indicatorColor: \"platinum\",\r\n    pricingLevel: \"Platinum\",\r\n    ttm: \"$30-39,999\",\r\n    discount: \"20% off\",\r\n    checkIcon: props.shippedTotal >= 30000\r\n  },\r\n  {\r\n    id: 5,\r\n    indicatorColor: \"diamond\",\r\n    pricingLevel: \"Diamond\",\r\n    ttm: \"$40-59,999\",\r\n    discount: \"25% off\",\r\n    checkIcon: props.shippedTotal >= 40000\r\n  },\r\n  {\r\n    id: 6,\r\n    indicatorColor: \"enterprise\",\r\n    pricingLevel: \"Enterprise\",\r\n    ttm: \"$60,000 +\",\r\n    discount: \"31% off\",\r\n    checkIcon: props.shippedTotal >= 60000\r\n  }\r\n]);\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex max-w-full flex-col md:border md:border-solid md:border-neutral-30 bg-white\">\r\n    <div class=\"grid grid-cols-[7fr_4fr_4fr] border-b border-solid border-neutral-30 py-5 font-bold md:grid-cols-3\">\r\n      <div class=\"pl-5\">Pricing Level</div>\r\n      <div class=\"md:pl-8\">Discount</div>\r\n      <div class=\"md:pl-8\">TTM</div>\r\n    </div>\r\n\r\n    <div v-for=\"item in tableData\" :key=\"item.id\" class=\"grid grid-cols-[7fr_4fr_4fr] border-b border-solid border-neutral-30 last:border-0 md:grid-cols-3\">\r\n      <div class=\"mr-2 flex flex-row items-center\">\r\n        <!-- <div class=\"contents-center ml-0.5 mr-2 flex h-5 w-5 items-center text-f-xs-base\">\r\n          <IconCheck v-show=\"item.checkIcon\" />\r\n        </div> -->\r\n        <div class=\"relative flex flex-row items-center\" :class=\"!item.checkIcon ? 'text-neutral-50' : 'text-neutral-70'\">\r\n          <span class=\"mr-2 block h-10 w-3\" :class=\"`bg-${item.indicatorColor}`\"></span>\r\n          {{ item.pricingLevel }}\r\n        </div>\r\n      </div>\r\n      <div class=\"md:pl-8 flex flex-row items-center\" :class=\"!item.checkIcon ? 'text-neutral-50' : 'text-neutral-70'\">\r\n        {{ item.discount }}\r\n      </div>\r\n      <div class=\"md:pl-8 flex flex-row items-center\" :class=\"!item.checkIcon ? 'text-neutral-50' : 'text-neutral-70'\">\r\n        {{ item.ttm }}\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n<style scoped>\r\n.bg-insider {\r\n  background-color: #e0d1b8;\r\n}\r\n.bg-silver {\r\n  background-color: #b2b2b2;\r\n}\r\n.bg-gold {\r\n  background-color: #d7b683;\r\n}\r\n.bg-platinum {\r\n  background-color: #e5e4e2;\r\n}\r\n.bg-diamond {\r\n  background-color: #c7d2e9;\r\n}\r\n.bg-enterprise {\r\n  background-color: #ba623f;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, watch, computed } from \"vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport { useViewportSizes } from \"../composables\";\r\nimport FhPricingProgress from \"./FhPricingProgram/FhPricingProgress.vue\";\r\nimport FhPricingTable from \"./FhPricingProgram/FhPricingTable.vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhTooltip from \"./FhTooltip.vue\";\r\nimport FhIcon from \"../components/FhIcon.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\nconst tableData = computed(() => [\r\n  {\r\n    id: 1,\r\n    indicatorColor: \"insider\",\r\n    pricingLevel: \"Insider\"\r\n  },\r\n  {\r\n    id: 2,\r\n    indicatorColor: \"silver\",\r\n    pricingLevel: \"Silver\"\r\n  },\r\n  {\r\n    id: 3,\r\n    indicatorColor: \"gold\",\r\n    pricingLevel: \"Gold\"\r\n  },\r\n  {\r\n    id: 4,\r\n    indicatorColor: \"platinum\",\r\n    pricingLevel: \"Platinum\"\r\n  },\r\n  {\r\n    id: 5,\r\n    indicatorColor: \"diamond\",\r\n    pricingLevel: \"Diamond\"\r\n  },\r\n  {\r\n    id: 6,\r\n    indicatorColor: \"enterprise\",\r\n    pricingLevel: \"Enterprise\"\r\n  }\r\n]);\r\n\r\nconst { shippedTotal, shippedUpdated, reviewDate, pricingLevel, pricingLevelDiscount, nextPricingLevel, nextPricingLevelSpend, nextPricingLevelDiscount } =\r\n  getDataRefs(props.data);\r\n\r\nconst isOpen = ref(false);\r\nconst { isSm } = useViewportSizes();\r\n\r\nwatch(isSm, () => (isOpen.value = false));\r\n</script>\r\n\r\n<template>\r\n  <FhSection :base=\"style.base\" class=\"mb-f10\">\r\n    <!-- New Pricing Program -->\r\n    <div class=\"grid md:grid-cols-2 gap-2 bg-limestone mb-6\">\r\n      <div class=\"p-6 md:p-12 flex flex-col justify-between\">\r\n        <p class=\"mb-4\">Pricing Program</p>\r\n        <h1 class=\"font-serif text-7xl mt-6 mb-6 leading-[3.25rem]\">Take Your Business To The Next Level</h1>\r\n        <p class=\"mb-0\">Earn better pricing the more you spend, with tiered discounts based on your Trailing Twelve Months (TTM) shipped total</p>\r\n      </div>\r\n      <!-- Pricing table -->\r\n      <div class=\"p-6 md:p-12\">\r\n        <FhPricingTable :shipped-total=\"shippedTotal\"></FhPricingTable>\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"grid md:grid-cols-3 gap-1\">\r\n      <div class=\"md:col-span-2 p-6 md:p-12 bg-limestone flex flex-col justify-between\">\r\n        <!-- START: PRICING LEVEL -->\r\n        <div class=\"grid grid-cols-2 md:grid-cols-3 gap-8 md:gap-4\">\r\n          <div>\r\n            <span class=\"mb-f0.5 text-sm text-neutral-50\">Your level</span>\r\n            <span class=\"text-f-xl-6xl flex\">\r\n              <span v-for=\"item in tableData\" :key=\"item.id\">\r\n                <template v-if=\"item.pricingLevel === pricingLevel\">\r\n                  <span class=\"mr-2 inline-block h-6 w-6 rounded-[50%]\" :class=\"`bg-${item.indicatorColor}`\"></span>\r\n                </template>\r\n              </span>\r\n              {{ pricingLevel }}</span\r\n            >\r\n          </div>\r\n          <div v-if=\"pricingLevel !== 'Insider'\" class=\"flex flex-col md:m-auto\">\r\n            <span class=\"mb-f0.5 text-sm text-neutral-50\">Your discount</span>\r\n            <span class=\"text-f-xl-4xl capitalize\">{{ pricingLevelDiscount }}</span>\r\n          </div>\r\n        </div>\r\n        <div>\r\n          <!-- END: PRICING LEVEL -->\r\n          <FhPricingProgress\r\n            class=\"\"\r\n            :shipped-total=\"shippedTotal\"\r\n            :pricing-level=\"pricingLevel\"\r\n            :pricing-level-discount=\"pricingLevelDiscount\"\r\n            :next-level=\"nextPricingLevel\"\r\n            :amount-to-next-level=\"nextPricingLevelSpend\"\r\n            :next-discount=\"nextPricingLevelDiscount\"\r\n          ></FhPricingProgress>\r\n        </div>\r\n      </div>\r\n      <div class=\"p-6 md:ps-10 md:py-12 bg-limestone\">\r\n        <div class=\"grid grid-cols-6 gap-1 bottom-inherit\">\r\n          <div class=\"col-start-1 text-center\"><FhIcon name=\"Package\" class=\"text-2xl text-neutral-80\" /></div>\r\n          <div class=\"col-start-2 col-end-7\"><span class=\"mb-f0.5 text-sm gap-3 flex text-neutral-50\">TTM shipped total</span></div>\r\n          <div class=\"col-start-2 col-end-7\">\r\n            <span class=\"mb-f0.5 text-f-sm-2xl font-bold\">${{ shippedTotal.toLocaleString() }}</span>\r\n          </div>\r\n          <div class=\"col-start-2 col-end-7\">\r\n            <span class=\"text-f-xs-sm text-neutral-50\">Updated as of {{ shippedUpdated }}</span>\r\n          </div>\r\n        </div>\r\n        <div class=\"grid grid-cols-6 gap-1\">\r\n          <div class=\"col-start-1 text-center\"><FhIcon name=\"Calender\" class=\"text-2xl text-neutral-80\" /></div>\r\n          <div class=\"col-start-2 col-end-7\"><span class=\"mb-f0.5 text-sm gap-3 flex text-neutral-50\">Price level review date</span></div>\r\n          <div class=\"col-start-2 col-end-7\">\r\n            <span class=\"mb-f0.5 text-f-sm-2xl font-bold\">{{ reviewDate }}</span>\r\n          </div>\r\n          <div class=\"col-start-2 col-end-7\">\r\n            <a class=\"text-sm underline flex\"\r\n              >What is a price level review date?\r\n              <FhTooltip>\r\n                WHAT IS A PRICE LEVEL REVIEW DATE?<br />Your price level is assigned for 12 months. At the end of that 12-month period, we will evaluate your\r\n                TTM shipped total to determine *which* price level you will be assigned for the next 12 months. During that 12-month window, your price level\r\n                will remain the same unless your TTM shipped total reaches a higher level and thus qualifies you for a better price, at which point we will\r\n                automatically upgrade you to the next price level.\r\n              </FhTooltip>\r\n            </a>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- old pricing program -->\r\n    <!-- PRICING PROGRAM -->\r\n    <!-- <div class=\"mb-8 flex flex-col border-b border-solid border-neutral-70 border-opacity-10 pb-8 text-neutral-70 md:mb-10 md:pb-12\"> -->\r\n    <!-- <FhHeading\r\n        tag=\"h2\"\r\n        heading=\"Pricing Program\"\r\n        subheading=\"Earn better pricing the more you spend, with tiered discounts based on your Trailing Twelve Months shipped total.\"\r\n      /> -->\r\n    <!-- START: PRICING LEVEL -->\r\n    <!-- <div class=\"flex flex-col md:flex-row\">\r\n        <div class=\"mb-6 flex flex-col pr-2 md:basis-4/12 lg:basis-3/12\">\r\n          <span class=\"mb-f0.5 text-sm text-neutral-50\">Your level</span>\r\n          <span class=\"text-f-xl-6xl\">{{ pricingLevel }}</span>\r\n        </div>\r\n        <div v-if=\"pricingLevel !== 'Insider'\" class=\"flex flex-col\">\r\n          <span class=\"mb-f0.5 text-sm text-neutral-50\">Your discount</span>\r\n          <span class=\"text-f-xl-6xl\">{{ pricingLevelDiscount }}</span>\r\n        </div>\r\n      </div> -->\r\n    <!-- END: PRICING LEVEL -->\r\n    <!-- </div> -->\r\n    <!-- <div class=\"mb-f8 flex flex-col border-0 pb-f8 text-neutral-70 md:border-b md:border-solid md:border-neutral-70 md:border-opacity-10\">\r\n      <div class=\"mb-8 flex flex-col border-b border-solid border-neutral-70 border-opacity-10 pb-f8 md:mb-0 md:flex-row md:border-0\">\r\n        <div v-if=\"shippedTotal >= 0\" class=\"mb-6 flex flex-col pr-2 md:basis-4/12 lg:basis-3/12\">\r\n          <span class=\"mb-f0.5 text-sm text-neutral-50\">Trailing Twelve Months shipped total</span>\r\n          <span class=\"mb-f0.5 text-f-sm-2xl font-bold\">${{ shippedTotal.toLocaleString() }}</span>\r\n          <span class=\"text-f-xs-sm text-neutral-50\">* Updated as of {{ shippedUpdated }}</span>\r\n        </div>\r\n        <div class=\"flex flex-col\">\r\n          <span class=\"mb-f0.5 flex items-center gap-3 text-sm text-neutral-50\">\r\n            Price level review date\r\n            <FhTooltip>\r\n              WHAT IS A PRICE LEVEL REVIEW DATE?<br />Your price level is assigned for 12 months. At the end of that 12-month period, we will evaluate your TTM\r\n              shipped total to determine *which* price level you will be assigned for the next 12 months. During that 12-month window, your price level will\r\n              remain the same unless your TTM shipped total reaches a higher level and thus qualifies you for a better price, at which point we will\r\n              automatically upgrade you to the next price level.\r\n            </FhTooltip>\r\n          </span>\r\n          <span class=\"mb-f0.5 text-f-sm-2xl font-bold\">{{ reviewDate }}</span>\r\n        </div>\r\n      </div>\r\n\r\n      <FhPricingProgress\r\n        v-if=\"shippedTotal >= 0\"\r\n        class=\"mb-f6\"\r\n        :shipped-total=\"shippedTotal\"\r\n        :pricing-level=\"pricingLevel\"\r\n        :pricing-level-discount=\"pricingLevelDiscount\"\r\n        :next-level=\"nextPricingLevel\"\r\n        :amount-to-next-level=\"nextPricingLevelSpend\"\r\n        :next-discount=\"nextPricingLevelDiscount\"\r\n      ></FhPricingProgress>\r\n\r\n      <FhButton v-if=\"isSm\" class=\"w-full\" @click=\"isOpen = true\">View levels</FhButton>\r\n      <component :is=\"isSm ? FhModal : 'div'\" v-model:is-open=\"isOpen\">\r\n        <FhPricingTable :shipped-total=\"shippedTotal\"></FhPricingTable>\r\n      </component>\r\n    </div> -->\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.bg-insider {\r\n  background-color: #e0d1b8;\r\n}\r\n.bg-silver {\r\n  background-color: #b2b2b2;\r\n}\r\n.bg-gold {\r\n  background-color: #d7b683;\r\n}\r\n.bg-platinum {\r\n  background-color: #e5e4e2;\r\n}\r\n.bg-diamond {\r\n  background-color: #c7d2e9;\r\n}\r\n.bg-enterprise {\r\n  background-color: #ba623f;\r\n}\r\n.bottom-inherit {\r\n  padding-bottom: inherit !important;\r\n}\r\n</style>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport { ref } from \"vue\";\r\nimport FhWysiwyg from \"@/includes/FhWysiwyg.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst {\r\n  imageSrc,\r\n  imageAltText,\r\n  productName,\r\n  productDescription = ref(false),\r\n  dimensions = ref(false),\r\n  material = ref(false),\r\n  retailPrice = ref(false)\r\n} = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div class=\"flex flex-col gap-f4 md:grid md:grid-cols-[minmax(200px,300px)_minmax(450px,1fr)] md:items-center md:gap-f10\">\r\n      <div class=\"col-span-1 row-span-1 flex\">\r\n        <img :src=\"imageSrc\" :alt=\"imageAltText\" class=\"max-w-[300px] md:max-w-full\" />\r\n      </div>\r\n      <div class=\"col-span-1 row-span-1 flex flex-col gap-f2 text-f-xs-sm\">\r\n        <h5 class=\"text-f-base-xl\">{{ productName }}</h5>\r\n        <FhWysiwyg>\r\n          <!-- eslint-disable-next-line vue/no-v-html -->\r\n          <div v-if=\"productDescription\" class=\"text-neutral-50\" v-html=\"productDescription\"></div>\r\n        </FhWysiwyg>\r\n        <ul v-if=\"dimensions || material || retailPrice\" class=\"font-medium text-neutral-80\">\r\n          <li v-if=\"dimensions\" class=\"\">Dimensions: {{ dimensions }}</li>\r\n          <li v-if=\"material\" class=\"\">Material: {{ material }}</li>\r\n          <li v-if=\"retailPrice\" class=\"\">Retail: {{ retailPrice }}</li>\r\n        </ul>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style scoped lang=\"pcss\">\r\n.text-white * {\r\n  color: white;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { useAddCartItemsMutation } from \"../api/cartApi.js\";\r\nimport { useNotificationStore } from \"../stores/NotificationStore.js\";\r\nimport { CART } from \"../constants/routes\";\r\nimport formatPrice from \"../util/formatPrice.js\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhQuantityInput from \"./FhQuantityInput.vue\";\r\n\r\nconst props = defineProps({\r\n  skuNumber: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  price: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  category: {\r\n    type: Array,\r\n    default: () => {\r\n      [];\r\n    }\r\n  },\r\n  secondary: {\r\n    type: Boolean,\r\n    default: () => false\r\n  },\r\n  quantity: {\r\n    type: Number,\r\n    default: 1\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:addToCart\", \"update:quantity\"]);\r\n\r\nconst quantity = computed({\r\n  get() {\r\n    return props.quantity ?? 1;\r\n  },\r\n  set(newQuantity) {\r\n    emit(\"update:quantity\", newQuantity);\r\n  }\r\n});\r\nconst addCartItemsMutation = useAddCartItemsMutation();\r\n\r\nconst isAdding = computed(() => addCartItemsMutation.isLoading.value);\r\nconst productCategory = computed(() => props.category.map((cat) => cat.name).join(\"/\"));\r\n\r\nconst notificationStore = useNotificationStore();\r\n\r\nfunction notifySuccess(cart) {\r\n  let productName = cart.items.find((item) => item.sku.skuNumber === props.skuNumber).sku.productName;\r\n  notificationStore.notifySuccess(`${productName} added.`, { linkText: \"View Cart\", linkUrl: CART });\r\n  emit(\"update:addToCart\", { sku: props.skuNumber, qty: quantity.value });\r\n}\r\n\r\nfunction notifyError() {\r\n  notificationStore.notifyError(\"Sorry, something went wrong and we could not add this item to your cart. Please try again.\");\r\n}\r\n\r\nfunction addToCart() {\r\n  const items = [{ skuNumber: props.skuNumber, quantity: quantity.value, category: productCategory.value }];\r\n  addCartItemsMutation.mutate(items, { onSuccess: notifySuccess, onError: notifyError });\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex gap-f2\">\r\n    <FhButton\r\n      :color=\"props.secondary ? 'secondary' : 'primary'\"\r\n      class=\"flex-1 whitespace-nowrap\"\r\n      :class=\"{ 'font-bold': !props.secondary }\"\r\n      :disabled=\"isAdding\"\r\n      @click=\"addToCart\"\r\n    >\r\n      <span v-if=\"!props.secondary\">{{ formatPrice(props.price * (quantity || 1)) }}&nbsp;&nbsp;<span class=\"opacity-30\">|</span>&nbsp;&nbsp;</span>\r\n      <span>Add to Cart</span>\r\n    </FhButton>\r\n    <FhQuantityInput v-model=\"quantity\" />\r\n  </div>\r\n</template>\r\n","export const MEDIA_TYPES = {\r\n  IMAGE: \"image\",\r\n  VIDEO: \"video\"\r\n};\r\n","<script setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhImage from \"@/components/FhImage.vue\";\r\nimport FhVideo from \"@/components/FhVideo.vue\";\r\nimport { TransitionRoot, TransitionChild, Dialog, DialogPanel } from \"@headlessui/vue\";\r\nimport { Swiper, SwiperSlide } from \"swiper/vue\";\r\nimport { FreeMode, Thumbs, Keyboard } from \"swiper/modules\";\r\nimport { MEDIA_TYPES } from \"@/constants/media\";\r\nimport \"swiper/css\";\r\nimport \"swiper/css/free-mode\";\r\nimport \"swiper/css/thumbs\";\r\n\r\nconst props = defineProps({\r\n  isActive: {\r\n    type: Boolean,\r\n    required: true\r\n  },\r\n  media: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  productName: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  skuName: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  initialMediaIndex: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  isAuthenticated: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"close\"]);\r\n\r\nconst realIndex = ref(0);\r\n\r\nfunction setIndex(swiper) {\r\n  realIndex.value = swiper.realIndex;\r\n}\r\n\r\nconst activeHiResImageUrl = computed(() => {\r\n  if (props.media[realIndex.value].type === MEDIA_TYPES.VIDEO) {\r\n    return props.media[realIndex.value].videoUrl;\r\n  }\r\n\r\n  return props.media[realIndex.value].highResImageUrl;\r\n});\r\n\r\nconst mainSwiper = ref(null);\r\nconst thumbsSwiper = ref(null);\r\n\r\nconst setMainSwiper = (swiper) => (mainSwiper.value = swiper);\r\nconst setThumbsSwiper = (swiper) => (thumbsSwiper.value = swiper);\r\n\r\nconst nextButton = ref(null);\r\n\r\nconst slidePrev = () => mainSwiper.value?.slidePrev();\r\nconst slideNext = () => mainSwiper.value?.slideNext();\r\n\r\nconst destroySwiper = (swiperRef) => {\r\n  if (swiperRef.value === null) return;\r\n  swiperRef.value.destroy(true, false);\r\n  swiperRef.value = null;\r\n};\r\n\r\nconst vidLoaded = (video) => {\r\n  // This is a hack please fix me correctly\r\n  const vidContainer = document.querySelector(\".vid-container\");\r\n  if (video?.offsetWidth > 0) vidContainer.style.maxWidth = `${video.offsetWidth}px`;\r\n  else video.style.width = \"100%\";\r\n};\r\n\r\nwatch(\r\n  () => props.isActive,\r\n  (val) => {\r\n    if (val) return;\r\n    destroySwiper(mainSwiper);\r\n    destroySwiper(thumbsSwiper);\r\n  }\r\n);\r\n</script>\r\n\r\n<template>\r\n  <TransitionRoot :show=\"props.isActive\" as=\"template\">\r\n    <Dialog as=\"div\" :initial-focus=\"nextButton\" class=\"relative z-20\" @close=\"emit('close')\">\r\n      <div class=\"fixed inset-0 overflow-y-auto\">\r\n        <TransitionChild\r\n          as=\"template\"\r\n          enter=\"duration-300 ease-out\"\r\n          enter-from=\"opacity-0 scale-95\"\r\n          enter-to=\"opacity-100 scale-100\"\r\n          leave=\"duration-200 ease-in\"\r\n          leave-from=\"opacity-100 scale-100\"\r\n          leave-to=\"opacity-0 scale-95\"\r\n        >\r\n          <DialogPanel class=\"relative flex h-full w-full scale-95 flex-col bg-white opacity-0 transition-all\">\r\n            <FhButton variant=\"round\" class=\"absolute top-f5 right-f5 z-10 !bg-white-opacity-70\" title=\"Close gallery\" @click=\"emit('close')\">\r\n              <FhIcon name=\"XIcon\" />\r\n            </FhButton>\r\n            <div class=\"flex-1\">\r\n              <Swiper\r\n                :modules=\"[Thumbs, Keyboard]\"\r\n                :thumbs=\"{ swiper: thumbsSwiper }\"\r\n                :keyboard=\"{ enabled: true }\"\r\n                :initial-slide=\"props.initialMediaIndex\"\r\n                loop\r\n                class=\"group h-full\"\r\n                @swiper=\"setMainSwiper\"\r\n                @active-index-change=\"setIndex\"\r\n              >\r\n                <SwiperSlide v-for=\"mediaItem in props.media\" :key=\"mediaItem.largeUrl\">\r\n                  <div\r\n                    class=\"h-full\"\r\n                    :class=\"{\r\n                      'flex justify-center': mediaItem.type === MEDIA_TYPES.VIDEO\r\n                    }\"\r\n                  >\r\n                    <img\r\n                      v-if=\"mediaItem.type === MEDIA_TYPES.IMAGE\"\r\n                      :src=\"mediaItem.largeUrl\"\r\n                      class=\"mx-auto h-0 min-h-full object-contain\"\r\n                      :alt=\"mediaItem.altText\"\r\n                    />\r\n                    <FhVideo\r\n                      v-if=\"mediaItem.type === MEDIA_TYPES.VIDEO\"\r\n                      :src=\"mediaItem.videoUrl\"\r\n                      :autoplay=\"true\"\r\n                      :loop=\"true\"\r\n                      class=\"vid-container flex-1\"\r\n                      @vidloaded=\"vidLoaded\"\r\n                    >\r\n                      <template #overlay=\"{ videoToggle, isPlaying }\">\r\n                        <div class=\"absolute top-0 left-0 h-full w-full\"></div>\r\n                        <button class=\"absolute bottom-2 right-2 flex h-16 w-16\" @click.stop=\"videoToggle\">\r\n                          <FhIcon v-if=\"!isPlaying\" name=\"VideoPlay\" class=\"h-full w-full\" />\r\n                          <FhIcon v-else name=\"VideoPause\" class=\"h-full w-full\" />\r\n                        </button>\r\n                      </template>\r\n                    </FhVideo>\r\n                  </div>\r\n                </SwiperSlide>\r\n                <template #container-start>\r\n                  <FhButton\r\n                    variant=\"round\"\r\n                    class=\"absolute top-1/2 left-f5 z-10 -translate-y-1/2 !bg-white-opacity-70 opacity-0 transition-opacity focus-visible:opacity-100 group-hover:opacity-100\"\r\n                    title=\"Previous\"\r\n                    @click=\"slidePrev\"\r\n                  >\r\n                    <FhIcon name=\"LeftChevron\" />\r\n                  </FhButton>\r\n                </template>\r\n                <template #container-end>\r\n                  <FhButton\r\n                    ref=\"nextButton\"\r\n                    variant=\"round\"\r\n                    class=\"absolute top-1/2 right-f5 z-10 -translate-y-1/2 !bg-white-opacity-70 opacity-0 transition-opacity focus-visible:opacity-100 group-hover:opacity-100\"\r\n                    title=\"Next\"\r\n                    @click=\"slideNext\"\r\n                  >\r\n                    <FhIcon name=\"RightChevron\" />\r\n                  </FhButton>\r\n                </template>\r\n              </Swiper>\r\n            </div>\r\n            <div class=\"flex-0 flex h-min w-full items-center gap-f5 border-t border-neutral-30 px-f5 py-4\">\r\n              <div class=\"flex-0 whitespace-nowrap\">\r\n                <div class=\"text-f-lg-2xl\">{{ props.productName }}</div>\r\n                <div class=\"text-neutral-50\">{{ props.skuName }}</div>\r\n              </div>\r\n              <div class=\"h-[5.5rem] min-w-0 flex-1\">\r\n                <Swiper\r\n                  :modules=\"[FreeMode, Thumbs]\"\r\n                  slides-per-view=\"auto\"\r\n                  :space-between=\"8\"\r\n                  watch-slides-progress\r\n                  free-mode\r\n                  center-insufficient-slides\r\n                  class=\"thumbs-swiper w-full\"\r\n                  @swiper=\"setThumbsSwiper\"\r\n                >\r\n                  <SwiperSlide v-for=\"mediaItem in props.media\" :key=\"mediaItem.thumbUrl\">\r\n                    <FhImage :src=\"mediaItem.thumbUrl\" :alt=\"mediaItem.altText\" square border class=\"thumb-img\" />\r\n                    <div v-if=\"mediaItem.type === MEDIA_TYPES.VIDEO\" class=\"absolute top-0 left-0 flex h-full w-full items-center justify-center bg-black/20\">\r\n                      <FhIcon name=\"VideoPlay\" class=\"h-[46px] w-[46px]\" />\r\n                    </div>\r\n                  </SwiperSlide>\r\n                </Swiper>\r\n              </div>\r\n              <div v-if=\"props.isAuthenticated\" class=\"flex-0\">\r\n                <FhButton\r\n                  :href=\"activeHiResImageUrl\"\r\n                  download\r\n                  variant=\"text\"\r\n                  aria-label=\"Download a high-resolution version of this image\"\r\n                  title=\"Download a high-resolution version of this image\"\r\n                  class=\"whitespace-nowrap\"\r\n                >\r\n                  <FhIcon name=\"Download\" /> Hi-Res\r\n                </FhButton>\r\n              </div>\r\n            </div>\r\n          </DialogPanel>\r\n        </TransitionChild>\r\n      </div>\r\n    </Dialog>\r\n  </TransitionRoot>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.thumbs-swiper .swiper-slide {\r\n  width: 5.5rem;\r\n  height: 5.5rem;\r\n}\r\n.thumbs-swiper .swiper-slide-thumb-active .thumb-img {\r\n  @apply border-neutral-70;\r\n}\r\n:deep(.fh_video) {\r\n  @apply h-0 min-h-full object-contain;\r\n  aspect-ratio: 1/1;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, watch } from \"vue\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport FhImage from \"@/components/FhImage.vue\";\r\nimport FhVideo from \"@/components/FhVideo.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport { Swiper, SwiperSlide } from \"swiper/vue\";\r\nimport { FreeMode, Thumbs } from \"swiper/modules\";\r\nimport { MEDIA_TYPES } from \"@/constants/media\";\r\nimport \"swiper/css\";\r\nimport \"swiper/css/free-mode\";\r\nimport \"swiper/css/thumbs\";\r\n\r\nconst props = defineProps({\r\n  media: {\r\n    type: Array,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { isSm } = useViewportSizes();\r\n\r\nconst imagesSwiper = ref(null);\r\nconst thumbsSwiper = ref(null);\r\n\r\nconst setImagesSwiper = (swiper) => (imagesSwiper.value = swiper);\r\nconst setThumbsSwiper = (swiper) => (thumbsSwiper.value = swiper);\r\n\r\nconst destroySwiper = (swiperRef) => {\r\n  if (swiperRef.value === null) return;\r\n  swiperRef.value.destroy(true, false);\r\n  swiperRef.value = null;\r\n};\r\n\r\nwatch(isSm, (val) => {\r\n  if (val) return;\r\n  destroySwiper(imagesSwiper);\r\n  destroySwiper(thumbsSwiper);\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div v-if=\"isSm\">\r\n    <Swiper\r\n      :modules=\"[Thumbs]\"\r\n      :thumbs=\"{ swiper: thumbsSwiper }\"\r\n      class=\"relative left-1/2 right-1/2 mb-f3 !ml-[-50vw] !mr-[-50vw] w-screen w-screen border-y border-solid border-neutral-30\"\r\n      @swiper=\"setImagesSwiper\"\r\n    >\r\n      <SwiperSlide v-for=\"mediaItem in props.media\" :key=\"mediaItem.largeUrl\">\r\n        <FhImage v-if=\"mediaItem.type === MEDIA_TYPES.IMAGE\" :src=\"mediaItem.largeUrl\" :alt=\"mediaItem.altText\" square contain />\r\n        <FhVideo v-if=\"mediaItem.type === MEDIA_TYPES.VIDEO\" :src=\"mediaItem.videoUrl\" :autoplay=\"true\" :loop=\"true\">\r\n          <template #overlay=\"{ videoToggle, isPlaying }\">\r\n            <div class=\"absolute top-0 left-0 h-full w-full\"></div>\r\n            <button class=\"absolute bottom-2 right-2 flex h-16 w-16\" @click.stop=\"videoToggle\">\r\n              <FhIcon v-if=\"!isPlaying\" name=\"VideoPlay\" class=\"h-full w-full\" />\r\n              <FhIcon v-else name=\"VideoPause\" class=\"h-full w-full\" />\r\n            </button>\r\n          </template>\r\n        </FhVideo>\r\n      </SwiperSlide>\r\n    </Swiper>\r\n    <Swiper\r\n      :modules=\"[FreeMode, Thumbs]\"\r\n      :slides-per-view=\"4\"\r\n      :space-between=\"8\"\r\n      watch-slides-progress\r\n      free-mode\r\n      class=\"thumbs-swiper\"\r\n      @swiper=\"setThumbsSwiper\"\r\n    >\r\n      <SwiperSlide v-for=\"mediaItem in props.media\" :key=\"mediaItem.thumbUrl\">\r\n        <FhImage :src=\"mediaItem.thumbUrl\" :alt=\"mediaItem.altText\" square border class=\"thumb-img\" />\r\n        <div v-if=\"mediaItem.type === MEDIA_TYPES.VIDEO\" class=\"absolute top-0 left-0 flex h-full w-full items-center justify-center bg-black/20\">\r\n          <FhIcon name=\"VideoPlay\" class=\"h-[46px] w-[46px]\" />\r\n        </div>\r\n      </SwiperSlide>\r\n    </Swiper>\r\n  </div>\r\n</template>\r\n\r\n<style scoped>\r\n.thumbs-swiper .swiper-slide-thumb-active .thumb-img {\r\n  @apply border-neutral-70;\r\n}\r\n:deep(.fh_video) {\r\n  aspect-ratio: 1/1;\r\n  object-fit: cover;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { MEASUREMENT_SYSTEM, MEASUREMENT_UNITS, MEASUREMENT_UNITS_DEFINITION } from \"../constants/measurements\";\r\nimport FhTooltip from \"./FhTooltip.vue\";\r\n\r\nconst props = defineProps({\r\n  value: {\r\n    type: [String, Number],\r\n    required: true\r\n  },\r\n  label: {\r\n    type: String,\r\n    default: () => null\r\n  },\r\n  /**\r\n   * An optional unit of measure for numeric values.\r\n   * Options are limited to the standard units in Four Hands' specs for length, weight, and volume measures.\r\n   * @values INCH, CENTIMETER, POUND, KILOGRAM, CUBIC_FOOT, CUBIC_METER\r\n   */\r\n  unit: {\r\n    type: String,\r\n    default: () => null,\r\n    validator: (val) => Object.keys(MEASUREMENT_UNITS).includes(val)\r\n  },\r\n  /**\r\n   * The unit formatting style to use in unit formatting. The default is \"short\".\r\n   * Corresponds to the unitDisplay property of the Intl.NumberFormat() options object:\r\n   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\r\n   * @values long, short, narrow\r\n   */\r\n  unitDisplay: {\r\n    type: String,\r\n    default: \"short\",\r\n    validator: (val) => [\"long\", \"short\", \"narrow\"].includes(val)\r\n  },\r\n  /**\r\n   * The measurment system in which the value should be displayed, converting the input value if necessary.\r\n   * @values IMPERIAL, METRIC\r\n   */\r\n  displaySystem: {\r\n    type: String,\r\n    default: () => MEASUREMENT_SYSTEM.IMPERIAL,\r\n    validator: (val) => Object.keys(MEASUREMENT_SYSTEM).includes(val)\r\n  }\r\n});\r\n\r\nconst showLabel = computed(() => props.label !== null && typeof props.label !== \"undefined\");\r\n\r\nconst isValueNumeric = computed(() => typeof props.value === \"number\" || !isNaN(Number.parseFloat(props.value)));\r\nconst valueAsNumber = computed(() => (isValueNumeric.value ? Number.parseFloat(props.value) : NaN));\r\nconst shouldFormat = computed(() => props.unit && isValueNumeric.value);\r\nconst unitSystem = computed(() => (props.unit ? MEASUREMENT_UNITS_DEFINITION[props.unit].system : null));\r\nconst shouldConvert = computed(() => unitSystem.value && unitSystem.value !== props.displaySystem);\r\nconst displayUnit = computed(() => (shouldConvert.value ? MEASUREMENT_UNITS_DEFINITION[props.unit].convertsTo : props.unit));\r\nconst valueAsNumberConverted = computed(() =>\r\n  shouldConvert.value ? valueAsNumber.value * MEASUREMENT_UNITS_DEFINITION[props.unit].conversionRatio : valueAsNumber.value\r\n);\r\n\r\nconst displayValue = computed(() => {\r\n  if (!shouldFormat.value) return props.value.toString();\r\n\r\n  // Custom formatting for cubic feet and cubic meters since the built-in Intl.NumberFormat doesn't support these units\r\n  if (\r\n    displayUnit.value === MEASUREMENT_UNITS.CUBIC_FOOT ||\r\n    displayUnit.value === MEASUREMENT_UNITS.CUBIC_METER ||\r\n    displayUnit.value === MEASUREMENT_UNITS.INCH\r\n  ) {\r\n    let nf = new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 2, minimumFractionDigits: 2 }).format(valueAsNumberConverted.value);\r\n    if (displayUnit.value === MEASUREMENT_UNITS.CUBIC_FOOT) {\r\n      return props.unitDisplay === \"long\" ? `${nf} cubic feet` : props.unitDisplay === \"narrow\" ? `${nf}ft³` : `${nf} cu ft`;\r\n    } else if (displayUnit.value === MEASUREMENT_UNITS.CUBIC_METER) {\r\n      return props.unitDisplay === \"long\" ? `${nf} cubic meters` : props.unitDisplay === \"narrow\" ? `${nf}m³` : `${nf} cu m`;\r\n    } else if (displayUnit.value === MEASUREMENT_UNITS.INCH) {\r\n      return `${nf}\"`;\r\n    }\r\n  }\r\n\r\n  return new Intl.NumberFormat(\"en-US\", {\r\n    style: \"unit\",\r\n    unit: MEASUREMENT_UNITS_DEFINITION[displayUnit.value].formatAs,\r\n    unitDisplay: props.unitDisplay,\r\n    maximumFractionDigits: 2,\r\n    minimumFractionDigits: 2\r\n  }).format(valueAsNumberConverted.value);\r\n});\r\n\r\nconst cleaningCodes = {\r\n  s: \"S - Solvent: Spot clean only with a water-free dry-cleaning solvent. Do not use water.\",\r\n  sw: \"SW - Solvent / Water Based: Use any cleaning product, whether water or solvent based.\",\r\n  ws: \"WS - Water Based / Solvent: Use any cleaning product, whether water or solvent based.\",\r\n  w: \"W - Water Based: Spot clean only with water-based shampoo or foam upholstery cleaner. Do not use solvents.\",\r\n  x: \"X - No Cleaning Product: Clean only by vacuuming or light brushing. Do not use any water-or-solvent-based cleaner.\",\r\n  dc: \"DC - Dry clean only\"\r\n};\r\n\r\nconst isCleaningCode = computed(() => {\r\n  return props.label.split(\" \").join(\"\").toLowerCase() === \"cleaningcode\";\r\n});\r\nconst cleaningCodeValue = computed(() => {\r\n  if (typeof props.value === \"string\") {\r\n    const codeValue = props.value.split(\" \")[0].toLowerCase();\r\n    const allowed = [\"s\", \"sw\", \"ws\", \"w\", \"x\", \"dc\"];\r\n    if (allowed.includes(codeValue)) {\r\n      return codeValue;\r\n    }\r\n  }\r\n  return null;\r\n});\r\n</script>\r\n\r\n<template>\r\n  <span v-if=\"showLabel\" class=\"mr-f1 inline-flex\">\r\n    {{ label }}\r\n    <template v-if=\"cleaningCodeValue !== null\">\r\n      <FhTooltip v-if=\"isCleaningCode & (cleaningCodes[cleaningCodeValue] !== null)\" class=\"pl-f1 product-detail-tooltip\" placement=\"top\">\r\n        <div class=\"inline-block\">\r\n          {{ cleaningCodes[cleaningCodeValue] }}\r\n        </div>\r\n      </FhTooltip>\r\n    </template>\r\n  </span>\r\n  <span class=\"inline-block text-neutral-50\">{{ displayValue }}</span>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n:deep(.popperWrapper.product-detail-tooltip) {\r\n  @apply inline pt-[2px];\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhProductDetailSpec from \"./FhProductDetailSpec.vue\";\r\nimport { MEASUREMENT_SYSTEM } from \"../constants/measurements\";\r\nimport { useViewportSizes } from \"../composables\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * An array of spec objects or, for grouped display mode, an array or arrays of spec objects\r\n   */\r\n  specs: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  /**\r\n   * The measurment system in which numeric specs with a defined unit should be displayed, converting the input value if necessary.\r\n   * @values IMPERIAL, METRIC\r\n   */\r\n  displaySystem: {\r\n    type: String,\r\n    default: () => MEASUREMENT_SYSTEM.IMPERIAL,\r\n    validator: (val) => Object.keys(MEASUREMENT_SYSTEM).includes(val)\r\n  }\r\n});\r\n\r\nconst _specs = computed(() => {\r\n  let grouped = Array.isArray(props.specs[0]);\r\n\r\n  if (!grouped) {\r\n    return props.specs.map((spec) => ({ ...spec, label: spec.label ?? \"\" }));\r\n  }\r\n\r\n  let specsFlat = [];\r\n  for (let i = 0; i < props.specs.length; i++) {\r\n    let specGroup = props.specs[i];\r\n    if (!Array.isArray(specGroup)) {\r\n      throw new Error(\"specs expected to be an array of arrays in grouped mode\");\r\n    }\r\n    for (let j = 0; j < specGroup.length; j++) {\r\n      specsFlat.push({\r\n        ...specGroup[j],\r\n        label: specGroup[j].label ?? \"\",\r\n        groupBoundary: i < props.specs.length - 1 && j === specGroup.length - 1\r\n      });\r\n    }\r\n  }\r\n  return specsFlat;\r\n});\r\n\r\nconst { isSm } = useViewportSizes();\r\n</script>\r\n\r\n<template>\r\n  <div class=\"c-specList flex flex-col md:grid md:grid-cols-[minmax(33%,_auto)_1fr] overflow-hidden\">\r\n    <template v-for=\"(spec, i) in _specs\" :key=\"i\">\r\n      <FhProductDetailSpec v-bind=\"spec\" :display-system=\"props.displaySystem\" />\r\n      <template v-if=\"!isSm && spec.groupBoundary\">\r\n        <!-- two placeholder elements needed here so that the nth-child selectors still correctly target the labels and values -->\r\n        <div class=\"group-divider md:h-f4\"></div>\r\n        <div class=\"group-divider md:h-f4\"></div>\r\n      </template>\r\n    </template>\r\n  </div>\r\n</template>\r\n\r\n<style scoped>\r\n.c-specList {\r\n  /* Label */\r\n  &:deep(> *:nth-child(odd)) {\r\n    @apply md:pr-f3;\r\n  }\r\n\r\n  /* Value */\r\n  &:deep(> *:nth-child(even)) {\r\n    @apply mb-f3 md:mb-0;\r\n  }\r\n\r\n  &:deep(> *:not(.group-divider)) {\r\n    @apply relative py-f0.5;\r\n\r\n    /* Row hover highlight */\r\n    &:before {\r\n      @apply absolute top-0 bottom-0 hidden md:block;\r\n      content: \"\";\r\n      right: -1000%;\r\n      left: -1000%;\r\n      z-index: -1;\r\n    }\r\n    &:hover:before {\r\n      @apply bg-neutral-10;\r\n    }\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\nimport TransitionExpand from \"../transitions/TransitionExpand.vue\";\r\n\r\nconst props = defineProps({\r\n  selectedValueId: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  type: {\r\n    type: String,\r\n    required: true,\r\n    validator: (val) => [\"default\", \"swatch\"].includes(val)\r\n  },\r\n  name: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  values: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  isExpanded: {\r\n    type: Boolean,\r\n    default: true\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:selectedValueId\", \"change\", \"update:isExpanded\"]);\r\n\r\nconst _selectedValueId = computed({\r\n  get: () => props.selectedValueId,\r\n  set: (val) => {\r\n    emit(\"update:selectedValueId\", val);\r\n    emit(\"change\");\r\n  }\r\n});\r\n\r\nconst selectedValue = computed(() => props.values.find((val) => val.id === props.selectedValueId));\r\n\r\nconst id = \"id\" + Math.random().toString(16).slice(2);\r\n\r\nconst isText = computed(() => props.type === \"default\");\r\nconst isSwatch = computed(() => props.type === \"swatch\");\r\n\r\nconst isExpanded = ref(props.isExpanded);\r\nwatch(isExpanded, (val) => emit(\"update:isExpanded\", val));\r\nwatch(\r\n  () => props.isExpanded,\r\n  (val) => (isExpanded.value = val)\r\n);\r\n</script>\r\n<template>\r\n  <div class=\"border border-solid border-neutral-30\" role=\"group\" :aria-labelledby=\"id\">\r\n    <button class=\"flex w-full items-center py-f3 px-4\" @click=\"isExpanded = !isExpanded\">\r\n      <div :id=\"id\" class=\"text-body-lg flex-none pr-3\">{{ props.name }}</div>\r\n      <div class=\"flex min-w-0 flex-1 items-center justify-end gap-2 pr-2\">\r\n        <img v-if=\"isSwatch\" :src=\"selectedValue.swatchImage\" class=\"h-[1.125em] w-[1.125em] flex-none rounded-full\" />\r\n        <span class=\"truncate\">{{ selectedValue.name }}</span>\r\n      </div>\r\n      <FhIcon\r\n        name=\"DownChevron\"\r\n        class=\"flex-none text-2xl transition-transform duration-200 ease-linear\"\r\n        :class=\"{ 'rotate-180': isExpanded }\"\r\n        aria-hidden=\"true\"\r\n      />\r\n    </button>\r\n    <TransitionExpand>\r\n      <div v-show=\"isExpanded\">\r\n        <div class=\"mb-f1 flex overflow-x-auto px-4 pb-f2 md:flex-wrap\" :class=\"{ '-ml-2': isText, '-ml-1.5': isSwatch }\">\r\n          <label\r\n            v-for=\"(value, i) in props.values\"\r\n            :key=\"i\"\r\n            :title=\"value.name\"\r\n            class=\"group relative block cursor-pointer\"\r\n            :class=\"{ 'ml-2 mb-2': isText, 'ml-1.5 mb-1.5': isSwatch }\"\r\n          >\r\n            <input\r\n              v-model=\"_selectedValueId\"\r\n              type=\"radio\"\r\n              :value=\"value.id\"\r\n              class=\"input pointer-events-none absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 opacity-0\"\r\n            />\r\n            <span\r\n              v-if=\"isText\"\r\n              class=\"label text-body-base block border border-solid border-neutral-40 bg-white px-4 py-3.5\"\r\n              :class=\"{ 'group-hover:border-neutral-50': !value.disabled, 'text-neutral-40': value.disabled }\"\r\n            >\r\n              {{ value.name }}\r\n            </span>\r\n            <span\r\n              v-if=\"isSwatch\"\r\n              class=\"label relative block h-16 w-16 rounded-full border border-solid border-transparent bg-white p-1\"\r\n              :class=\"{ 'group-hover:border-neutral-40': !value.disabled }\"\r\n            >\r\n              <img :src=\"value.swatchImage\" :alt=\"value.name\" class=\"w-full rounded-full object-cover\" :class=\"{ 'opacity-40': value.disabled }\" />\r\n              <div v-if=\"value.disabled\" class=\"absolute top-0 left-0 flex h-full w-full p-1\">\r\n                <div class=\"flex-1 rounded-full border border-solid border-neutral-70\">\r\n                  <div class=\"relative top-1/2 h-px w-full rotate-[120deg] bg-neutral-70\"></div>\r\n                </div>\r\n              </div>\r\n            </span>\r\n          </label>\r\n        </div>\r\n      </div>\r\n    </TransitionExpand>\r\n  </div>\r\n</template>\r\n\r\n<style scoped>\r\n.input:checked + .label {\r\n  @apply border-neutral-70;\r\n}\r\n\r\n.input:focus-visible + .label {\r\n  @apply outline outline-2 outline-offset-2 outline-neutral-70;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, reactive, computed } from \"vue\";\r\nimport FhProductOptionSelector from \"./FhProductOptionSelector.vue\";\r\nimport { intersection } from \"lodash\";\r\n\r\nconst props = defineProps({\r\n  options: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  activeSku: {\r\n    type: String,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:activeSku\"]);\r\n\r\nconst _options = props.options.map((option) => {\r\n  let selectedValueId = ref(option.values.find((value) => value.skus.includes(props.activeSku))?.id);\r\n  if (selectedValueId.value === undefined) {\r\n    throw new Error(`No option value exists for SKU ${props.activeSku}`);\r\n  }\r\n  let selectedValue = computed(() => option.values.find((val) => val.id === selectedValueId.value));\r\n  let selectedValueSkus = computed(() => selectedValue.value.skus);\r\n\r\n  return {\r\n    name: option.name,\r\n    type: option.type,\r\n    values: option.values.map((value) => {\r\n      return reactive({\r\n        ...value,\r\n        disabled: false\r\n      });\r\n    }),\r\n    selectedValueId: selectedValueId,\r\n    selectedValueSkus: selectedValueSkus\r\n  };\r\n});\r\n\r\nconst selectedSkusIntersection = computed(() => intersection(..._options.map((option) => option.selectedValueSkus.value)));\r\n\r\nfunction handleChange(optionIndex) {\r\n  // Selected combo is invalid\r\n  if (selectedSkusIntersection.value.length === 0) {\r\n    adjustSelectedValuesForAvailability(optionIndex);\r\n  }\r\n  setOptionValuesEnabledState();\r\n  let selectedValueIndex = _options[optionIndex].values.findIndex((val) => val.id === _options[optionIndex].selectedValueId.value);\r\n  document.title = _options[optionIndex].values[selectedValueIndex].metaTitle;\r\n  emit(\"update:activeSku\", selectedSkusIntersection.value[0]);\r\n}\r\n\r\nfunction LazyProduct(sets) {\r\n  for (var dm = [], f = 1, l, i = sets.length; i--; f *= l) {\r\n    dm[i] = [f, (l = sets[i].length)];\r\n  }\r\n  this.length = f;\r\n  this.item = function (n) {\r\n    for (var c = [], i = sets.length; i--; ) c[i] = sets[i][((n / dm[i][0]) << 0) % dm[i][1]];\r\n    return c;\r\n  };\r\n}\r\n\r\nfunction adjustSelectedValuesForAvailability(fixedOptionIndex) {\r\n  let fixedOption = _options[fixedOptionIndex];\r\n\r\n  let sets = _options.map((option, i) => {\r\n    let values = option.values;\r\n    let selectedValueIndex = values.findIndex((val) => val.id === option.selectedValueId.value);\r\n    let valuesSorted = [values[selectedValueIndex], ...values.slice(0, selectedValueIndex), ...values.slice(selectedValueIndex + 1)];\r\n\r\n    return valuesSorted.map((value) => {\r\n      return {\r\n        optionIndex: i,\r\n        valueId: value.id,\r\n        valueSkus: value.skus\r\n      };\r\n    });\r\n  });\r\n\r\n  sets = sets.slice(0, fixedOptionIndex).concat(sets.slice(fixedOptionIndex + 1));\r\n\r\n  let combos = new LazyProduct(sets);\r\n  for (var i = 0; i < combos.length; i++) {\r\n    let validCombo = intersection(...combos.item(i).map((x) => x.valueSkus), fixedOption.selectedValueSkus.value).length > 0;\r\n    if (validCombo) {\r\n      combos.item(i).forEach((item) => (_options[item.optionIndex].selectedValueId.value = item.valueId));\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\nfunction setOptionValuesEnabledState() {\r\n  _options.forEach((option, i) => {\r\n    let otherOptions = _options.slice(0, i).concat(_options.slice(i + 1));\r\n    let otherOptionsSelectedValueSkus = otherOptions.map((option) => option.selectedValueSkus.value);\r\n    option.values.forEach((value) => {\r\n      let disabled = intersection(...otherOptionsSelectedValueSkus, value.skus).length === 0;\r\n      value.disabled = disabled;\r\n    });\r\n  });\r\n}\r\n\r\nsetOptionValuesEnabledState();\r\n</script>\r\n\r\n<template>\r\n  <div>\r\n    <FhProductOptionSelector\r\n      v-for=\"({ name, type, values }, i) in _options\"\r\n      :key=\"i\"\r\n      v-model:selected-value-id=\"_options[i].selectedValueId.value\"\r\n      v-bind=\"{ name, type, values }\"\r\n      class=\"relative -mb-px\"\r\n      @change=\"handleChange(i)\"\r\n    />\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { ref, computed, useSlots } from \"vue\";\r\nimport { useViewportSizes } from \"../composables\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport { TabGroup, TabList, Tab, TabPanels, TabPanel } from \"@headlessui/vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  /**\r\n   * Controls the alignment of the tabs and the content; default is center\r\n   * @values left, center\r\n   */\r\n  align: {\r\n    type: [String, Array],\r\n    required: false,\r\n    default: \"center\",\r\n    validator: (val) => [\"center\", \"left\"].includes(val) || (val.length === 2 && val.every((v) => [\"center\", \"left\"].includes(v)))\r\n  },\r\n  /**\r\n   * By default, the tabs will have a full-width underline on mobile only; set this to `true` to show the same full-width underline on larger screens as well\r\n   */\r\n  underline: {\r\n    type: Boolean,\r\n    required: false,\r\n    default: false\r\n  },\r\n  /**\r\n   * Setting this to `true` will reduce the vertical spacing with and around the tabs\r\n   */\r\n  compact: {\r\n    type: Boolean,\r\n    required: false,\r\n    default: false\r\n  },\r\n  /**\r\n   * Allows for programatic control of the selected tab\r\n   */\r\n  selectedIndex: {\r\n    type: Number,\r\n    required: false,\r\n    default: 0\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"change\"]);\r\n\r\nconst slots = useSlots();\r\nconst triggerSlots = computed(() => Object.keys(slots).filter((key) => key.startsWith(\"trigger-\")));\r\nconst contentSlots = computed(() => Object.keys(slots).filter((key) => key.startsWith(\"content-\")));\r\n\r\nconst tabList = ref(null);\r\n\r\nfunction handleTabChange(index) {\r\n  let tab = tabList.value.$el.children[index];\r\n  let left = tab.offsetLeft - (index === 0 ? 0 : 50);\r\n  tabList.value.$el.scrollTo({\r\n    left,\r\n    behavior: \"smooth\"\r\n  });\r\n\r\n  emit(\"change\", index);\r\n}\r\n\r\n// Headless UI programatically focuses the tab button when clicked which causes all major browsers (as of October 2022)\r\n// to show :focus-visible styles as if the button was focused via keyboard input. This prevents us from having\r\n// separate focus styles for mouse and keyboard users. The code below is a workaround found in this thread:\r\n// https://github.com/tailwindlabs/headlessui/issues/1694, which progamatiaclly blurs the focused element immediately\r\n// after being clicked. Since this only runs on click, it won't affect keyboard users.\r\nfunction handleTabClick() {\r\n  requestAnimationFrame(() => {\r\n    if (document.activeElement instanceof HTMLElement) {\r\n      document.activeElement.blur();\r\n    }\r\n  });\r\n}\r\n\r\nconst { isSm } = useViewportSizes();\r\n\r\nconst isUnderlineVisible = computed(() => isSm.value || props.underline);\r\n\r\nconst alignment = computed(() => {\r\n  if (Array.isArray(props.align)) return { tabs: props.align[0], content: props.align[1] };\r\n  return { tabs: props.align, content: props.align };\r\n});\r\n</script>\r\n\r\n<template>\r\n  <FhSection aria-label=\"Tabs\" :base=\"style.base\">\r\n    <TabGroup as=\"div\" class=\"flex flex-col\" :selected-index=\"props.selectedIndex\" @change=\"handleTabChange\">\r\n      <div class=\"relative\" :class=\"[props.compact ? 'mb-6' : 'mb-f6']\">\r\n        <TabList ref=\"tabList\" class=\"hide-scrollbars flex gap-f6 overflow-x-auto\">\r\n          <Tab v-for=\"(name, index) in triggerSlots\" :key=\"index\" v-slot=\"{ selected }\" as=\"template\">\r\n            <button\r\n              class=\"tab group relative min-w-max focus:outline-none focus-visible:outline-none\"\r\n              :class=\"[\r\n                selected ? 'is-active text-neutral-70' : 'text-neutral-50',\r\n                props.compact ? 'py-5' : 'py-f5',\r\n                { 'first:ml-auto last:mr-auto': alignment.tabs === 'center' }\r\n              ]\"\r\n              @click=\"handleTabClick\"\r\n            >\r\n              <span\r\n                class=\"group-focus-visible:outline-nuetral-70 block group-focus-visible:outline group-focus-visible:outline-2 group-focus-visible:outline-offset-2\"\r\n              >\r\n                <slot :name=\"name\">Tab {{ i + 1 }}</slot>\r\n              </span>\r\n            </button>\r\n          </Tab>\r\n        </TabList>\r\n        <div v-if=\"isUnderlineVisible\" class=\"absolute bottom-0 h-px w-full bg-neutral-30\"></div>\r\n      </div>\r\n      <TabPanels :class=\"{ 'self-center': alignment.content === 'center' }\">\r\n        <TabPanel v-for=\"(name, index) in contentSlots\" :key=\"index\">\r\n          <slot :name=\"name\">\r\n            <div>content {{ index }}</div>\r\n          </slot>\r\n        </TabPanel>\r\n      </TabPanels>\r\n    </TabGroup>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.tab:after {\r\n  @apply absolute bottom-0 left-0 block h-px w-0 bg-neutral-70 duration-200 content-[''] transition-[width] z-10;\r\n}\r\n.tab.is-active:after {\r\n  @apply w-full;\r\n}\r\n\r\n.hide-scrollbars::-webkit-scrollbar {\r\n  display: none;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, reactive } from \"vue\";\r\nimport FhModal from \"./FhModal.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * An array of product care card objects\r\n   */\r\n  data: {\r\n    type: Array,\r\n    required: true\r\n  }\r\n});\r\n\r\n// Build up data for the product care modal\r\nconst productCareModalData = reactive({\r\n  version: \"product\",\r\n  heading: \"\",\r\n  copy: \"\",\r\n  ctaText: \"Download Care Guide\",\r\n  ctaURL: \"\",\r\n  ctaAriaLabel: \"Download Care Guide\",\r\n  ctaDownload: true\r\n});\r\n\r\nconst productCareModalIsOpen = ref(false);\r\nconst toggleProductCareModal = (item) => {\r\n  productCareModalData.heading = item.careTitle;\r\n  productCareModalData.copy = item.careDescription;\r\n  productCareModalData.ctaURL = item.careGuide;\r\n  productCareModalData.ctaAriaLabel = \"Download \" + item.materialName + \" Care Guide\";\r\n\r\n  productCareModalIsOpen.value = !productCareModalIsOpen.value;\r\n};\r\n</script>\r\n\r\n<template>\r\n  <template v-for=\"(item, i) in props.data\" :key=\"`${i}`\">\r\n    <div>\r\n      <FhButton variant=\"text\" @click=\"toggleProductCareModal(item)\"><FhIcon name=\"OverlappingSquare\" /> Product Care: {{ item.materialName }}</FhButton>\r\n    </div>\r\n  </template>\r\n  <FhModal v-model:is-open=\"productCareModalIsOpen\" :data=\"productCareModalData\" />\r\n</template>\r\n","<script setup>\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\n\r\n// TODO revisit combining with the FhDownloads component or renaming this component if we want to use outside of the PDP\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * An array of download objects\r\n   */\r\n  downloads: {\r\n    type: Array,\r\n    default: () => []\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <template v-for=\"(download, i) in props.downloads\" :key=\"i\">\r\n    <div>\r\n      <FhButton :href=\"download.url\" variant=\"text\" size=\"medium\" target=\"_blank\"><FhIcon name=\"Download\" />{{ download.label }}</FhButton>\r\n    </div>\r\n  </template>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * Model of the component; Either use this property (along with a listener for 'update:model-value' event) OR use v-model directive\r\n   */\r\n  modelValue: {\r\n    type: undefined,\r\n    required: true\r\n  },\r\n  /**\r\n   * The value of the option with which model value is changed\r\n   */\r\n  value: {\r\n    type: undefined,\r\n    required: true\r\n  },\r\n  /**\r\n   * The checkbox label (or use the default slot instead of this prop)\r\n   */\r\n  label: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  /**\r\n   * Puts the radio button in a disabled, non-interactive state\r\n   */\r\n  disabled: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * Controls the checkbox and label size; corresponds to standard fluid body text sizes\r\n   * @values base, lg, xl\r\n   */\r\n  size: {\r\n    type: String,\r\n    default: \"base\",\r\n    validator: (val) => [\"base\", \"lg\", \"xl\"].includes(val)\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\nconst labelSizeClass = computed(() => {\r\n  if (props.size === \"lg\") return \"text-f-base-lg\";\r\n  if (props.size === \"xl\") return \"text-f-lg-xl\";\r\n  return \"text-f-sm-base\";\r\n});\r\n</script>\r\n\r\n<template>\r\n  <label\r\n    class=\"c-radio relative inline-flex cursor-pointer select-none items-start\"\r\n    :class=\"[labelSizeClass, { 'cursor-default opacity-35': props.disabled }]\"\r\n    :style=\"{ '--label-lh': `var(--label-lh-${props.size})` }\"\r\n  >\r\n    <input v-model=\"value\" :value=\"props.value\" type=\"radio\" class=\"relative mr-f2 shrink-0\" :disabled=\"props.disabled\" />\r\n    <!-- @slot The default slot can be used for a label; overwrites the `label` prop -->\r\n    <slot>{{ props.label }}</slot>\r\n  </label>\r\n</template>\r\n\r\n<style scoped>\r\n.c-radio {\r\n  /* Variables for the line heights used in the computations below, pulled from the Tailwind config; one for each possible size param */\r\n  --label-lh-base: theme(\"fontSize.f-sm-base.1\");\r\n  --label-lh-lg: theme(\"fontSize.f-base-lg.1\");\r\n  --label-lh-xl: theme(\"fontSize.f-lg-xl.1\");\r\n\r\n  /* The radio button size in em units so it scales with the font size */\r\n  --radio-size: 1.1em;\r\n  --radio-fill-size: calc(var(--radio-size) * 3 / 5);\r\n\r\n  /**\r\n   * Vertical offset for the radio button to vertically centered it the first line of text in the label;\r\n   * Depends on the dynamic `--label-lh` var, which is set above as an inline style based on the size prop.\r\n   */\r\n  --radio-offset: calc(var(--label-lh) / 2 - var(--radio-size) / 2);\r\n\r\n  & input[type=\"radio\"] {\r\n    width: var(--radio-size);\r\n    height: var(--radio-size);\r\n    top: var(--radio-offset);\r\n    @apply grid appearance-none place-content-center rounded-full border border-solid border-neutral-50 bg-white;\r\n\r\n    &:checked {\r\n      @apply border-neutral-70;\r\n      &::before {\r\n        @apply absolute top-1/2 left-1/2 rounded-full bg-neutral-70;\r\n        content: \"\";\r\n        width: var(--radio-fill-size);\r\n        height: var(--radio-fill-size);\r\n        transform: translateX(calc(var(--radio-fill-size) / -2)) translateY(calc(var(--radio-fill-size) / -2));\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * TODO: Add :focus styles to the custom radio button\r\n */\r\n</style>\r\n","<script setup>\r\nimport { computed, ref, watch } from \"vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhRadio from \"@/components/FhRadio.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport { useViewportSizes } from \"../composables\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: undefined,\r\n    required: true\r\n  },\r\n  options: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  placeholder: {\r\n    type: String,\r\n    default: \"All Guest Accounts\"\r\n  },\r\n  closeContainer: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\nconst showContainer = ref(false);\r\nconst all = \"All Guest Accounts\";\r\nconst searchQuery = ref(\"\");\r\n\r\nconst { isSm, isMd } = useViewportSizes();\r\nconst isMobile = computed(() => isSm.value || isMd.value);\r\n\r\nconst value = computed({\r\n  get: () => {\r\n    if (!props.modelValue) {\r\n      return all;\r\n    }\r\n    return props.modelValue;\r\n  },\r\n  set: (value) => {\r\n    emit(\"update:modelValue\", value);\r\n    showContainer.value = false;\r\n  }\r\n});\r\nconst openFilterContainer = () => {\r\n  searchQuery.value = \"\";\r\n  showContainer.value = !showContainer.value;\r\n};\r\nconst closeGuestAccountFilterModal = () => {\r\n  showContainer.value = false;\r\n};\r\n\r\nconst filteredItems = computed(() => {\r\n  const filtered = props.options.filter((option) => {\r\n    return option.name.toLowerCase().includes(searchQuery.value.toLowerCase());\r\n  });\r\n  // Find the index of the currently selected option\r\n  const selectedIndex = filtered.findIndex((option) => option.name === value.value);\r\n\r\n  if (selectedIndex !== -1) {\r\n    // If the selected option exists in the filtered list, move it to the top\r\n    const selectedOption = filtered.splice(selectedIndex, 1)[0];\r\n    filtered.unshift(selectedOption);\r\n  }\r\n  return filtered;\r\n});\r\n\r\nconst toggleRadio = computed(() => {\r\n  return () => {\r\n    value.value = null;\r\n  };\r\n});\r\n\r\nwatch(\r\n  () => props.closeContainer,\r\n  () => {\r\n    showContainer.value = false;\r\n  }\r\n);\r\n</script>\r\n\r\n<template>\r\n  <div class=\"relative cursor-pointer flex justify-center items-center fh-input\" @click=\"openFilterContainer\">\r\n    <input class=\"cursor-pointer w-full focus-visible:outline-0\" :placeholder=\"props.placeholder\" :value=\"value\" readonly />\r\n    <FhIcon name=\"DownChevron\" class=\"text-xl\" />\r\n  </div>\r\n  <div v-if=\"showContainer && !isMobile\" class=\"absolute w-full z-50 bg-white shadow-md p-4\">\r\n    <FhInput v-model=\"searchQuery\" placeholder=\"Search Guest Account\" />\r\n    <div class=\"filtered-items-container mt-6 overflow-x-auto\">\r\n      <div v-if=\"filteredItems.length > 0\">\r\n        <a class=\"flex-none mb-6 flex gap-3 md:min-w-0 md:gap-\">\r\n          <FhRadio v-model=\"value\" :value=\"all\" size=\"lg\" @click=\"toggleRadio()\">All Guest Accounts</FhRadio>\r\n        </a>\r\n        <div v-for=\"option in filteredItems\" :key=\"option.name\" class=\"mb-6 flex gap-3 md:min-w-0 md:gap-5\">\r\n          <a class=\"flex-none\">\r\n            <FhRadio v-model=\"value\" :value=\"option.name\" size=\"lg\">{{ option.name }}</FhRadio>\r\n          </a>\r\n        </div>\r\n      </div>\r\n      <p v-else class=\"text-body-lg mb-f2 text-neutral-50\">No Guest Accounts match your search</p>\r\n    </div>\r\n  </div>\r\n  <FhModal v-else :is-open=\"showContainer\" @close=\"closeGuestAccountFilterModal\">\r\n    <FhInput v-model=\"searchQuery\" placeholder=\"Search Guest Account\" />\r\n    <div class=\"filtered-items-container mt-6 overflow-x-auto\">\r\n      <div v-if=\"filteredItems.length > 0\">\r\n        <a class=\"flex-none mb-6 flex gap-3 md:min-w-0 md:gap-\">\r\n          <FhRadio v-model=\"value\" :value=\"all\" size=\"lg\" @click=\"toggleRadio()\">All Guest Accounts</FhRadio>\r\n        </a>\r\n        <div v-for=\"option in filteredItems\" :key=\"option.name\" class=\"mb-6 flex gap-3 md:min-w-0 md:gap-5\">\r\n          <a class=\"flex-none\">\r\n            <FhRadio v-model=\"value\" :value=\"option.name\" size=\"lg\">{{ option.name }}</FhRadio>\r\n          </a>\r\n        </div>\r\n      </div>\r\n      <p v-else class=\"text-body-lg mb-f2 text-neutral-50\">No Guest Accounts match your search</p>\r\n    </div>\r\n  </FhModal>\r\n</template>\r\n\r\n<style scoped>\r\n.filtered-items-container {\r\n  max-height: 20rem; /* Set a maximum height */\r\n  overflow-y: auto; /* Enable vertical scrollbar when content overflows */\r\n}\r\n</style>\r\n","import axiosClient from \"@/api/axiosClient\";\r\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/vue-query\";\r\n\r\nconst QUERY_KEY = [\"shopping_list\"];\r\nconst QUERY_KEY_DETAILS = [\"shopping_list_details\"];\r\nconst QUERY_KEY_CART = [\"cart\"];\r\n\r\n//Get to shopping List Management page\r\nexport const useShoppingListQuery = (options = null) => {\r\n  return useQuery({\r\n    ...(options || {}),\r\n    queryKey: QUERY_KEY,\r\n    queryFn: () => axiosClient.get(\"/shoppinglist\"),\r\n    select: (shoppingListResponse) => {\r\n      return shoppingListResponse.shoppingList;\r\n    },\r\n    refetchOnWindowFocus: false\r\n  });\r\n};\r\n\r\n//Get to shopping List Detail page\r\nexport const useShoppingListDetailQuery = (guid, isPreview, options) => {\r\n  return useQuery({\r\n    ...(options || {}),\r\n    queryKey: QUERY_KEY_DETAILS,\r\n    queryFn: () => axiosClient.get(`/shoppinglist/${guid}/${isPreview}`),\r\n    select: (shoppingListDetailResponse) => shoppingListDetailResponse.shoppingList[0],\r\n    refetchOnWindowFocus: false\r\n  });\r\n};\r\n\r\n// Create shopping List\r\nexport function useCreateShoppingListMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: ({ id, title, description, pricingVisibility, ShoppingListItems }) =>\r\n      axiosClient.post(\"/shoppinglist\", { id, title, description, pricingVisibility, ShoppingListItems }),\r\n    onSuccess: (updatedShoppingList) => {\r\n      const queryKeyFilter = QUERY_KEY;\r\n      queryClient.setQueryData({ queryKey: queryKeyFilter }, updatedShoppingList);\r\n    }\r\n  });\r\n}\r\n\r\n//Update Shopping List\r\nexport function useUpdateShoppingListMutation(options, isDetailsPage = false) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: ({ id, title, description, pricingVisibility }) =>\r\n      axiosClient.post(\"/shoppinglist\", {\r\n        id,\r\n        title,\r\n        description,\r\n        pricingVisibility\r\n      }),\r\n    onSuccess: (updatedShoppingList, payLoadData) => {\r\n      if (isDetailsPage) {\r\n        const { id: listIdToUpdate } = payLoadData;\r\n        const shoppingLists = updatedShoppingList.shoppingList;\r\n        const updatedDetails = shoppingLists.find((shopping_list) => shopping_list.id == listIdToUpdate);\r\n        queryClient.setQueryData({ queryKey: QUERY_KEY_DETAILS }, { shoppingList: [updatedDetails] });\r\n      } else {\r\n        const queryKeyFilter = QUERY_KEY;\r\n        queryClient.setQueryData({ queryKey: queryKeyFilter }, updatedShoppingList);\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n//Delete shopping List Mutation\r\nexport function useDeleteShoppingListMutation(options, isDetailPage = false) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (id) => axiosClient.delete(`/shoppinglist/${id}`),\r\n    onSuccess: (_data, deletedId) => {\r\n      if (isDetailPage) return;\r\n      const queryKeyFilter = QUERY_KEY;\r\n      queryClient.setQueryData(queryKeyFilter, ({ shoppingList }) => {\r\n        const updatedShoppingList = shoppingList.filter((item) => item.id !== deletedId);\r\n        return { shoppingList: updatedShoppingList };\r\n      });\r\n    }\r\n  });\r\n}\r\n\r\n// Update the Shopping List Item Quantity\r\nexport function useUpdateItemMutation(options, isDetailPage = false) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (item) => axiosClient.post(\"/shoppinglist/item\", item),\r\n    onSuccess: (updatedShoppingListResponse) => {\r\n      const { shoppingList: updatedShoppingList } = updatedShoppingListResponse;\r\n      if (isDetailPage) {\r\n        // Quick and dirty, will need to update to target specific item as to not cause a full item refresh\r\n        queryClient.setQueryData(QUERY_KEY_DETAILS, updatedShoppingListResponse);\r\n      } else {\r\n        queryClient.setQueryData(QUERY_KEY, (shoppingListCache) => {\r\n          const updatedList = shoppingListCache.shoppingList.map((list) => (list.id == updatedShoppingList[0].id ? updatedShoppingList[0] : list));\r\n          return { shoppingList: updatedList };\r\n        });\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n// Delete Item From the shopping List\r\nexport function useDeleteShoppingItemMutation(options, isDetailPage = false) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (item) => axiosClient.delete(`/shoppinglist/${item.ShoppingListID}/item/${item.id}`),\r\n    onSuccess: (_data, itemToRemoveObject) => {\r\n      if (isDetailPage) {\r\n        queryClient.setQueryData(QUERY_KEY_DETAILS, (shoppingDetailCache) => {\r\n          const shoppingDetail = shoppingDetailCache.shoppingList[0];\r\n          const updatedProducts = shoppingDetail.products.filter((item) => item.id !== itemToRemoveObject.id);\r\n          let totalQuantity = 0;\r\n          let totalPrice = 0;\r\n          updatedProducts.forEach((item) => {\r\n            totalQuantity += item.quantity;\r\n            totalPrice += item.totalPrice;\r\n          });\r\n          return {\r\n            shoppingList: [\r\n              {\r\n                ...shoppingDetail,\r\n                products: updatedProducts,\r\n                totalItems: totalQuantity,\r\n                totalPrice: totalPrice\r\n              }\r\n            ]\r\n          };\r\n        });\r\n      } else {\r\n        queryClient.setQueryData(QUERY_KEY, (shoppingListsCache) => {\r\n          const updatedList = shoppingListsCache.shoppingList.reduce((accum, currentList) => {\r\n            if (currentList.id == itemToRemoveObject.ShoppingListID) {\r\n              const listRemovedProductArray = currentList.products.filter((product) => product.id != itemToRemoveObject.id);\r\n              const totalItems = Math.max(0, currentList.totalItems - itemToRemoveObject.quantity);\r\n              accum.push({ ...currentList, products: listRemovedProductArray, totalItems });\r\n            } else {\r\n              accum.push(currentList);\r\n            }\r\n            return accum;\r\n          }, []);\r\n\r\n          return { shoppingList: updatedList };\r\n        });\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n//Add All to cart\r\nexport function useAddAllToCartMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (guid) => axiosClient.post(`/shoppinglist/addalltocart/${guid}`),\r\n    onSuccess: (response) => {\r\n      queryClient.setQueryData(QUERY_KEY_CART, response);\r\n    }\r\n  });\r\n}\r\n\r\n// Add to cart mutation\r\nexport function useAddToCartMutation(options) {\r\n  const queryClient = useQueryClient();\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (item) => axiosClient.post(\"/shoppinglist/addtocart\", item),\r\n    onSuccess: (data) => {\r\n      queryClient.setQueryData(QUERY_KEY_CART, data);\r\n    }\r\n  });\r\n}\r\n","<script setup>\r\nimport { ref, computed, reactive, watch } from \"vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhLoader from \"@/components/FhLoader.vue\";\r\nimport formatPrice from \"../util/formatPrice.js\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhImage from \"@/components/FhImage.vue\";\r\nimport FhTabs from \"@/components/FhTabs.vue\";\r\nimport FhFilterSelect from \"@/components/FhFilterSelect.vue\";\r\nimport { useShoppingListQuery } from \"@/api/shoppingListApi\";\r\nimport { useGuestAccountQuery } from \"@/api/accountApi\";\r\n\r\nconst emits = defineEmits([\"addtolist\", \"heart-icon-clicked\", \"heart-icon-filled\"]);\r\n\r\nconst props = defineProps({\r\n  shoppinglist: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  shoppingDetails: {\r\n    type: Object,\r\n    default: () => {}\r\n  },\r\n  isCADPrice: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isCustomerGuest: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst formData = reactive({ ...props.shoppingDetails });\r\nlet { isLoading, data: shoppingListData } = useShoppingListQuery();\r\n\r\nlet { data: guestAccountsData } = useGuestAccountQuery();\r\n\r\nconst shoppingLists = computed(() => (isLoading.value ? [] : shoppingListData.value));\r\nconst myList = computed(() => shoppingLists.value.filter((item) => item.isAdminShoppingList === true));\r\nconst guestAccountList = computed(() => shoppingLists.value.filter((item) => item.isAdminShoppingList === false));\r\nconst searchQuery = ref(\"\");\r\nconst searchQueryGuest = ref(\"\");\r\nconst detailTabsSelectedIndex = ref(0);\r\nconst closeContainer = ref(false);\r\nconst selectedGuestAccount = ref(null);\r\n\r\nconst guestAccountOptions = computed(() => {\r\n  return guestAccountsData.value.map((account) => ({\r\n    name: account.name,\r\n    value: account.name\r\n  }));\r\n});\r\nconst isGuestAccount = computed(() => guestAccountOptions.value.length > 0);\r\nconst filteredItems = computed(() => {\r\n  return shoppingLists.value.filter((item) => {\r\n    return item.title.toLowerCase().includes(searchQuery.value.toLowerCase());\r\n  });\r\n});\r\n\r\nconst filteredItemsMylist = computed(() => {\r\n  return myList.value.filter((item) => {\r\n    return item.title.toLowerCase().includes(searchQuery.value.toLowerCase());\r\n  });\r\n});\r\n\r\nconst filteredItemsGuest = computed(() => {\r\n  const searchQueryGuestValue = searchQueryGuest.value.toLowerCase();\r\n  const selectedUserName = selectedGuestAccount.value ? selectedGuestAccount.value.toLowerCase() : null;\r\n  return guestAccountList.value.filter((item) => {\r\n    const titleMatch = item.title.toLowerCase().includes(searchQueryGuestValue);\r\n    const userNameMatch = selectedUserName ? item.userName.toLowerCase().includes(selectedUserName) : true;\r\n\r\n    if (selectedUserName === null) {\r\n      return titleMatch;\r\n    } else {\r\n      return titleMatch && userNameMatch;\r\n    }\r\n  });\r\n});\r\n\r\nconst heartIconStates = reactive(new Map());\r\n\r\nwatch(\r\n  shoppingLists,\r\n  (newShoppingLists) => {\r\n    Object.values(newShoppingLists).forEach((item) => {\r\n      item.products.forEach((product) => {\r\n        if (product.skuNumber === formData.skuNumber) {\r\n          heartIconStates.set(item, true);\r\n        }\r\n      });\r\n    });\r\n  },\r\n  { immediate: true }\r\n);\r\n\r\nconst toggleHeartIcon = (item) => {\r\n  const currentState = heartIconStates.get(item);\r\n  const shopping = shoppingLists.value;\r\n  if (currentState) {\r\n    emits(\"heart-icon-filled\", { item, formData, shopping });\r\n  } else {\r\n    emits(\"heart-icon-clicked\", { item, formData, shopping });\r\n  }\r\n  heartIconStates.set(item, !currentState);\r\n};\r\n\r\nconst updateCloseContainer = () => {\r\n  closeContainer.value = !closeContainer.value;\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhModal\r\n    ref=\"modal\"\r\n    :data=\"{\r\n      heading: 'Add to Shopping Lists',\r\n      subheading\r\n    }\"\r\n    @close=\"reset\"\r\n  >\r\n    <template #activator=\"{ open }\">\r\n      <slot name=\"activator\" :open=\"open\"></slot>\r\n    </template>\r\n    <template #body>\r\n      <form id=\"addshoppinglistForm\" class=\"flex flex-col gap-f3\" @submit.prevent=\"save\"></form>\r\n      <div class=\"mb-6 flex items-center gap-3 md:min-w-0 md:gap-f5\">\r\n        <!-- Added 'items-center' class -->\r\n        <a class=\"block w-32 flex-none border border-neutral-30 md:w-f25\">\r\n          <FhImage :src=\"formData.thumbUrl\" :alt=\"formData.name\" square :border=\"true\" />\r\n        </a>\r\n        <div class=\"flex min-w-0 flex-col gap-1\">\r\n          <a class=\"whitespace-pre-line text-f-base-2xl md:mb-f0.5 md:whitespace-normal\">{{ formData.name }}</a>\r\n          <div class=\"flex gap-f1.5 text-f-xs-base\">\r\n            <span v-if=\"formData.price\"\r\n              ><span v-if=\"(props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin)\">CAD</span\r\n              >{{ formatPrice(formData.price) }}</span\r\n            >\r\n          </div>\r\n          <div class=\"text-f-xs-base text-neutral-50\">\r\n            <span v-if=\"formData.skuName\" class=\"w-15\">{{ formData.skuName }}&nbsp;&bull;&nbsp;</span>\r\n            <span v-if=\"formData.skuNumber\">{{ formData.skuNumber }}</span>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <FhTabs\r\n        v-if=\"props.isAdmin\"\r\n        :selected-index=\"detailTabsSelectedIndex\"\r\n        align=\"left\"\r\n        compact\r\n        class=\"w-full\"\r\n        @change=\"(index) => (detailTabsSelectedIndex = index)\"\r\n      >\r\n        <template #trigger-MyLists>My Lists</template>\r\n        <template #content-MyLists>\r\n          <div v-if=\"myList && myList.length > 0\" class=\"mb-6 w-full\">\r\n            <FhInput v-model=\"searchQuery\" placeholder=\"Search\" />\r\n          </div>\r\n          <div class=\"filtered-items-container\">\r\n            <template v-if=\"myList && myList.length > 0\">\r\n              <div v-if=\"filteredItemsMylist.length > 0\">\r\n                <div v-for=\"item in filteredItemsMylist\" :key=\"item.shoppinglist\" class=\"mb-6 flex gap-3 border-b border-neutral-30 pb-4 md:min-w-0 md:gap-5\">\r\n                  <a class=\"block flex-none\">\r\n                    <button aria-label=\"Add to List\" class=\"rounded-full bg-white text-3xl\" @click=\"toggleHeartIcon(item)\">\r\n                      <FhIcon :name=\"heartIconStates.get(item) ? 'SolidHeart' : 'OutlineHeart'\" class=\"text-gray-500\" />\r\n                    </button>\r\n                  </a>\r\n                  <div class=\"flex min-w-0 flex-col gap-1\">\r\n                    <a class=\"whitespace-pre-line text-base md:mb-0.5 md:whitespace-normal\">{{ item.title }}</a>\r\n                    <div class=\"flex gap-1.5 text-xs\">\r\n                      <span>{{ item.totalItems }} items</span>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <p v-else class=\"text-body-lg mb-f2 text-neutral-50\">There are no Shopping Lists with that name.</p>\r\n            </template>\r\n            <template v-else>\r\n              <p class=\"text-body-lg mb-f2 text-neutral-50\">You have no Shopping Lists.</p>\r\n            </template>\r\n            <FhLoader v-if=\"isLoading\" class=\"col-span-2 my-f10\" />\r\n          </div>\r\n        </template>\r\n        <template #trigger-GuestLists>Guest Account Lists</template>\r\n        <template #content-GuestLists>\r\n          <div v-if=\"guestAccountList && guestAccountList.length > 0\" class=\"mb-6 w-full\">\r\n            <FhInput v-model=\"searchQueryGuest\" placeholder=\"Search by Shopping List name\" @click=\"updateCloseContainer()\" />\r\n          </div>\r\n          <div v-if=\"guestAccountList && guestAccountList.length > 0\" class=\"relative mb-6 w-full\">\r\n            <FhFilterSelect v-model=\"selectedGuestAccount\" :options=\"guestAccountOptions\" :close-container=\"closeContainer\"></FhFilterSelect>\r\n          </div>\r\n          <template v-if=\"guestAccountList && guestAccountList.length > 0\">\r\n            <div class=\"filtered-items-container\">\r\n              <div v-if=\"filteredItemsGuest.length > 0\">\r\n                <div v-for=\"item in filteredItemsGuest\" :key=\"item.shoppinglist\" class=\"mb-6 flex gap-3 border-b border-neutral-30 pb-4 md:min-w-0 md:gap-5\">\r\n                  <a class=\"block flex-none\">\r\n                    <button aria-label=\"Add to List\" class=\"rounded-full bg-white text-3xl\" @click=\"toggleHeartIcon(item)\">\r\n                      <FhIcon :name=\"heartIconStates.get(item) ? 'SolidHeart' : 'OutlineHeart'\" class=\"text-gray-500\" />\r\n                    </button>\r\n                  </a>\r\n                  <div class=\"flex min-w-0 flex-col gap-1\">\r\n                    <a class=\"whitespace-pre-line text-base md:mb-0.5 md:whitespace-normal\">{{ item.title }}</a>\r\n                    <div class=\"flex gap-1.5 text-xs\">\r\n                      <span>{{ item.totalItems }} items by {{ item.userName }}</span>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <p v-else-if=\"searchQueryGuest.length == 0\" class=\"text-body-lg mb-f2 text-neutral-50\">\r\n                The selected Guest Account does not have any Shopping Lists.\r\n              </p>\r\n              <p v-else class=\"text-body-lg mb-f2 text-neutral-50\">There are no Shopping Lists with that name.</p>\r\n            </div>\r\n          </template>\r\n          <template v-else>\r\n            <p v-if=\"isGuestAccount\" class=\"text-body-lg mb-f2 text-neutral-50\">Your Guest Accounts do not have any Shopping Lists.</p>\r\n            <p v-else class=\"text-body-lg mb-f2 text-neutral-50\">You have no Guest Accounts or your Guest Accounts do not have any Shopping Lists.</p>\r\n          </template>\r\n          <FhLoader v-if=\"isLoading\" class=\"col-span-2 my-f10\" />\r\n        </template>\r\n      </FhTabs>\r\n      <template v-if=\"!props.isAdmin\">\r\n        <div v-if=\"shoppingLists && shoppingLists.length > 0\" class=\"mb-6 w-full\">\r\n          <FhInput v-model=\"searchQuery\" placeholder=\"Search\" class=\"z-10\" />\r\n        </div>\r\n        <FhLoader v-if=\"isLoading\" class=\"col-span-2 my-f10\" />\r\n        <div class=\"filtered-items-container\">\r\n          <template v-if=\"shoppingLists && shoppingLists.length > 0\">\r\n            <div v-if=\"filteredItems.length > 0\">\r\n              <div v-for=\"item in filteredItems\" :key=\"item.shoppinglist\" class=\"mb-6 flex gap-3 border-b border-neutral-30 pb-4 md:min-w-0 md:gap-5\">\r\n                <a class=\"block flex-none\">\r\n                  <button aria-label=\"Add to List\" class=\"rounded-full bg-white text-3xl\" @click=\"toggleHeartIcon(item)\">\r\n                    <FhIcon :name=\"heartIconStates.get(item) ? 'SolidHeart' : 'OutlineHeart'\" class=\"text-gray-500\" />\r\n                  </button>\r\n                </a>\r\n                <div class=\"flex min-w-0 flex-col gap-1\">\r\n                  <a class=\"whitespace-pre-line text-base md:mb-0.5 md:whitespace-normal\">{{ item.title }}</a>\r\n                  <div class=\"flex gap-1.5 text-xs\">\r\n                    <span>{{ item.totalItems }} items</span>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n            <p v-else class=\"text-body-lg mb-f2 text-neutral-50\">There are no Shopping Lists with that name.</p>\r\n          </template>\r\n          <template v-else>\r\n            <p class=\"text-body-lg mb-f2 text-neutral-50\">You have no Shopping Lists.</p>\r\n          </template>\r\n          <FhLoader v-if=\"isLoading\" class=\"col-span-2 my-f10\" />\r\n        </div>\r\n      </template>\r\n    </template>\r\n    <template #footer=\"{ close }\">\r\n      <div class=\"mt-20 grid gap-4\" :class=\"detailTabsSelectedIndex === 1 || myList.length === 0 ? 'grid-cols-1' : 'grid-cols-2'\">\r\n        <FhButton\r\n          v-if=\"detailTabsSelectedIndex !== 1\"\r\n          type=\"submit\"\r\n          size=\"medium\"\r\n          class=\"w-full md:w-auto\"\r\n          :color=\"myList.length === 0 && detailTabsSelectedIndex === 0 ? 'primary' : 'secondary'\"\r\n          form=\"addshoppinglistForm\"\r\n          @click=\"emits('addtolist', true)\"\r\n        >\r\n          <FhIcon v-if=\"!(myList.length === 0 && detailTabsSelectedIndex === 0)\" name=\"PlusSign\" />{{\r\n            myList.length == 0 && detailTabsSelectedIndex === 0 ? \"Create New List\" : \"Create List\"\r\n          }}\r\n        </FhButton>\r\n        <FhButton v-if=\"!(myList.length === 0 && detailTabsSelectedIndex === 0)\" color=\"primary\" class=\"w-full\" @click=\"close\">Continue</FhButton>\r\n      </div>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n\r\n<style scoped>\r\n@media (min-width: 768px) {\r\n  .flex-row-reverse {\r\n    flex-direction: column !important; /* Override with flex-direction: column */\r\n  }\r\n}\r\n.filtered-items-container {\r\n  max-height: 20rem; /* Set a maximum height */\r\n  overflow-y: auto; /* Enable vertical scrollbar when content overflows */\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhFormField from \"./FhFormField.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: undefined,\r\n    required: true\r\n  },\r\n  placeholder: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  label: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  note: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  disabled: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  required: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  error: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  errorMessage: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  /**\r\n   * The Vuelidate validation object for this field. Use this to automatically set the error state and errorMessage.\r\n   * The `errorMessage` prop will override any error messages from this prop if both are set.\r\n   */\r\n  vuelidate: {\r\n    type: Object,\r\n    default: () => undefined\r\n  },\r\n  /**\r\n   * Fallthrough attributes are applied to the inner form control. Use this object if you need to bind anything custom to the form field wrapper node intead.\r\n   */\r\n  wrapperAttrs: {\r\n    type: Object,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n</script>\r\n\r\n<template>\r\n  <FhFormField v-bind=\"{ label, note, disabled, required, error, errorMessage, vuelidate, wrapperAttrs }\">\r\n    <template #default=\"controlBindings\">\r\n      <textarea v-bind=\"controlBindings\" v-model=\"value\" :placeholder=\"props.placeholder\" class=\"fh-input h-40\"></textarea>\r\n    </template>\r\n    <template v-if=\"$slots.note\" #note><slot name=\"note\"></slot></template>\r\n    <template v-if=\"$slots.errorMessage\" #errorMessage><slot name=\"errorMessage\"></slot></template>\r\n  </FhFormField>\r\n</template>\r\n","<script setup>\r\nimport { computed, reactive } from \"vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhTextarea from \"@/components/FhTextarea.vue\";\r\nimport FhSelect from \"@/components/FhSelect.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhImage from \"@/components/FhImage.vue\";\r\nimport { PRICING_LEVELS, PRICING_LEVELS_MARK_UP, CAD_PRICING } from \"@/constants\";\r\nimport formatPrice from \"../util/formatPrice.js\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, required, requiredIf } from \"@vuelidate/validators\";\r\nimport FhTooltip from \"./FhTooltip.vue\";\r\nconst props = defineProps({\r\n  isCreating: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  editMode: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: true\r\n  },\r\n  shoppingDetails: {\r\n    type: Object,\r\n    default: () => {}\r\n  },\r\n  shoppingListDetails: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isPlpPdp: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  markup: {\r\n    type: Number,\r\n    default: 25\r\n  },\r\n  showPriceMarkup: {\r\n    type: Boolean, // Just using this as a feature flag\r\n    default: true\r\n  },\r\n  showCADPricing: {\r\n    type: Boolean, // Just using this as a feature flag\r\n    default: false\r\n  },\r\n  isCADPrice: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isCustomerGuest: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdminShoppingList: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emits = defineEmits([\"create\", \"update\"]);\r\n\r\nconst initialState = {\r\n  title: null,\r\n  description: null,\r\n  pricingVisibility: null,\r\n  productName: props.shoppingDetails?.name || null,\r\n  skuNumber: props.shoppingDetails?.skuNumber || null,\r\n  thumbUrl: props.shoppingDetails?.thumbUrl || null,\r\n  price: props.shoppingDetails?.price || null,\r\n  name: props.shoppingDetails?.skuName || null\r\n};\r\n\r\nconst formData = reactive({ ...initialState, ...props.shoppingDetails });\r\nconst editMode = computed(() => props.editMode);\r\nconst markup = computed(() => (props.markup != null ? props.markup : 0));\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    title: { mustHave: helpers.withMessage(\"Please enter a name for Shopping List.\", required) },\r\n    pricingVisibility: {\r\n      mustHave: helpers.withMessage(\"Please select a pricing level for the Shopping List.\", requiredIf(props.isAdmin))\r\n    }\r\n  },\r\n  formData\r\n);\r\n\r\nconst shouldSeePricingVisibility = computed(() => {\r\n  if (props.isPlpPdp) {\r\n    return props.isAdmin;\r\n  } else {\r\n    return props.isAdmin && props.isAdminShoppingList;\r\n  }\r\n});\r\n\r\n//TODO: Feature Price Markup - remove refactor when ready to release or feature is complete\r\n//TODO: Feature CAD MAP/MSRP - remove refactor when ready to release or feature is complete\r\n//Look into turning this into a compostable since its used in a few spots\r\nconst pricing_visibilities = computed(() => {\r\n  if (props.showPriceMarkup && props.showCADPricing) {\r\n    return [...PRICING_LEVELS_MARK_UP(markup.value), ...CAD_PRICING];\r\n  } else if (props.showPriceMarkup && !props.showCADPricing) {\r\n    return PRICING_LEVELS_MARK_UP(markup.value);\r\n  } else if (!props.showPriceMarkup && props.showCADPricing) {\r\n    return [...PRICING_LEVELS, ...CAD_PRICING];\r\n  } else {\r\n    return PRICING_LEVELS;\r\n  }\r\n});\r\n\r\nconst isShoppingList = computed(() => props.isCreating);\r\n\r\nconst createShoppingList = () => {\r\n  if (editMode.value) {\r\n    emits(\"update\", formData);\r\n  } else {\r\n    emits(\"create\", formData);\r\n  }\r\n};\r\n\r\nconst reset = () => {\r\n  vuelidate.value.$reset();\r\n  formData.title = null;\r\n  formData.description = null;\r\n  formData.pricingVisibility = null;\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhModal ref=\"modal\" :data=\"{ heading: editMode != true ? 'Create List' : 'Edit List' }\" @close=\"reset\">\r\n    <template #activator=\"{ open }\">\r\n      <slot name=\"activator\" :open=\"open\"></slot>\r\n    </template>\r\n    <template #body>\r\n      <form id=\"shoppingListForm\" @submit.prevent=\"createShoppingList\">\r\n        <div\r\n          v-if=\"(isPlpPdp && formData.price != null) || (formData.price != undefined && formData.thumbUrl != null) || formData.thumbUrl != undefined\"\r\n          class=\"mb-6 flex items-center gap-3 md:min-w-0 md:gap-f5\"\r\n        >\r\n          <a class=\"block w-32 flex-none border border-neutral-30 md:w-f25\">\r\n            <FhImage :src=\"formData.thumbUrl\" :alt=\"formData.productName\" square :border=\"true\" />\r\n          </a>\r\n          <div class=\"flex min-w-0 flex-col gap-1\">\r\n            <a class=\"whitespace-pre-line text-f-base-2xl md:mb-f0.5 md:whitespace-normal\">{{ formData.productName }}</a>\r\n            <div class=\"flex gap-f1.5 text-f-xs-base\">\r\n              <span v-if=\"formData.price\"\r\n                ><span v-if=\"(props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin)\">CAD</span\r\n                >{{ formatPrice(formData.price) }}</span\r\n              >\r\n            </div>\r\n            <div class=\"text-f-xs-base text-neutral-50\">\r\n              <span v-if=\"formData.name\">{{ formData.name }}&nbsp;&bull;&nbsp;</span>\r\n              <span v-if=\"formData.skuNumber\">{{ formData.skuNumber }}</span>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <fieldset class=\"mb-f8\">\r\n          <div class=\"flex flex-col gap-f3\">\r\n            <FhInput v-model=\"formData.title\" label=\"Name\" required :vuelidate=\"vuelidate.title\" />\r\n            <FhTextarea v-model=\"formData.description\" label=\"Description (optional)\" />\r\n            <label v-if=\"shouldSeePricingVisibility\" class=\"-mb-5 flex gap-f1\">\r\n              Pricing Visibility\r\n              <FhTooltip v-if=\"showPriceMarkup\" class=\"mr-2 ml-2\"\r\n                >Select from one of the pre-configured pricing options below or go to My Account to set or update your unique price markup.</FhTooltip\r\n              >\r\n              <span class=\"text-body-xs leading-6 text-neutral-50\"> (Required)</span>\r\n            </label>\r\n            <FhSelect\r\n              v-if=\"shouldSeePricingVisibility\"\r\n              v-model=\"formData.pricingVisibility\"\r\n              :options=\"pricing_visibilities\"\r\n              placeholder=\"Select a pricing visibility\"\r\n              required\r\n              :vuelidate=\"vuelidate.pricingVisibility\"\r\n            />\r\n          </div>\r\n        </fieldset>\r\n      </form>\r\n    </template>\r\n    <template #footer=\"{ close }\">\r\n      <FhButton type=\"submit\" form=\"shoppingListForm\" color=\"primary\" :disabled=\"vuelidate.$invalid || isShoppingList\" :is-loading=\"isShoppingList\">{{\r\n        editMode ? \"Update\" : \"Create List\"\r\n      }}</FhButton>\r\n      <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n\r\n<style scoped>\r\n.leading-6 {\r\n  line-height: 1.5rem !important;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed, ref, useSlots, watch } from \"vue\";\r\nimport { Dialog, DialogPanel, DialogTitle, TransitionChild, TransitionRoot } from \"@headlessui/vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhWysiwyg from \"@/includes/FhWysiwyg.vue\";\r\n\r\nconst props = defineProps({\r\n  isOpen: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  data: {\r\n    type: Object,\r\n    default: () => ({})\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:isOpen\", \"open\", \"close\"]);\r\n\r\nconst _isOpen = ref(props.isOpen);\r\n\r\nwatch(props.isOpen, (val) => {\r\n  _isOpen.value = val;\r\n  emit(\"update:isOpen\", val);\r\n});\r\n\r\nwatch(_isOpen, (val) => {\r\n  emit(\"update:isOpen\", val);\r\n  emit(val ? \"open\" : \"close\");\r\n});\r\n\r\nconst slots = useSlots();\r\nconst bodySlotName = computed(() => (slots.body ? \"body\" : \"default\"));\r\nconst hasFooter = computed(() => props.data.ctaText || slots.footer);\r\n\r\nfunction open() {\r\n  _isOpen.value = true;\r\n}\r\n\r\nfunction close() {\r\n  _isOpen.value = false;\r\n}\r\n\r\ndefineExpose({ open, close });\r\n</script>\r\n\r\n<template>\r\n  <slot name=\"activator\" :open=\"open\"></slot>\r\n  <TransitionRoot :show=\"_isOpen\" as=\"template\">\r\n    <Dialog class=\"relative z-10\" @close=\"close\">\r\n      <div class=\"fixed inset-0\" />\r\n\r\n      <div class=\"fixed inset-0 overflow-hidden\">\r\n        <div class=\"absolute inset-0 overflow-hidden\">\r\n          <div class=\"pointer-events-none fixed inset-y-0 right-0 flex max-w-full pl-10\">\r\n            <TransitionChild\r\n              as=\"template\"\r\n              enter=\"transform transition ease-in-out duration-500 sm:duration-700\"\r\n              enter-from=\"translate-x-full\"\r\n              enter-to=\"translate-x-0\"\r\n              leave=\"transform transition ease-in-out duration-500 sm:duration-700\"\r\n              leave-from=\"translate-x-0\"\r\n              leave-to=\"translate-x-full\"\r\n            >\r\n              <DialogPanel class=\"pointer-events-auto w-screen max-w-lg\">\r\n                <div class=\"shadow-panel flex h-full flex-col overflow-y-scroll bg-white\">\r\n                  <div class=\"px-4 sm:px-6 py-3 header-panel\">\r\n                    <div class=\"flex items-center justify-between\">\r\n                      <DialogTitle class=\"text-base leading-6 text-gray-900 w-[90%] text-center font-bold\">\r\n                        <slot name=\"title\">\r\n                          <h1>{{ data.title }}</h1>\r\n                        </slot>\r\n                      </DialogTitle>\r\n                      <div class=\"ml-3 flex items-center\">\r\n                        <button\r\n                          type=\"button\"\r\n                          class=\"border border-neutral-40 relative rounded-full p-4 leading-none bg-white text-gray-400 hover:border-neutral-50 focus:outline-none\"\r\n                          @click=\"close\"\r\n                        >\r\n                          <FhIcon name=\"XIcon\" class=\"text-xl\" />\r\n                        </button>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"panel-content-container overflow-auto\">\r\n                    <div class=\"body-panel relative px-4 sm:px-6\">\r\n                      <slot :name=\"bodySlotName\">\r\n                        <FhWysiwyg v-if=\"data.body\" :content=\"data.body\" spacing />\r\n                      </slot>\r\n                    </div>\r\n                    <div v-if=\"hasFooter\" class=\"footer-panel relative mt-4 px-4 sm:px-6\">\r\n                      <slot name=\"footer\" :close=\"close\"> </slot>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </DialogPanel>\r\n            </TransitionChild>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </Dialog>\r\n  </TransitionRoot>\r\n</template>\r\n\r\n<style lang=\"pcss\">\r\n.shadow-panel {\r\n  box-shadow: 0px 0px 20px 10px rgba(0, 0, 0, 0.2);\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed, onMounted, ref, watch } from \"vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhSlideOverPanel from \"@/components/FhSlideOverPanel.vue\";\r\nimport FhCheckbox from \"@/components/FhCheckbox.vue\";\r\nimport FhLink from \"@/components/FhLink.vue\";\r\nimport { MEASUREMENT_SYSTEM } from \"@/constants/measurements\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * We will receive the Method from the parent slot to open or close the panel\r\n   */\r\n  openPanel: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  /**\r\n   * This will contain the width and height of the wallpaper Imperial System\r\n   */\r\n  dimensionsImperial: {\r\n    type: Object,\r\n    default: () => ({})\r\n  },\r\n  /**\r\n   * This will contain the width and height of the wallpaper Metric System\r\n   */\r\n  dimensionsMetric: {\r\n    type: Object,\r\n    default: () => ({})\r\n  },\r\n  /**\r\n   * Amount of rolls\r\n   */\r\n  quantity: { type: Number, default: 1 },\r\n  /**\r\n   * The reserve is the amount of waste percentage, so the user has an extra amount of roll to use.\r\n   */\r\n  reserve: { type: Number, default: 15 },\r\n  /**\r\n   * Reserve Checkbox ON/OFF\r\n   */\r\n  reserveCheckboxOnOff: { type: Boolean, default: true },\r\n  /**\r\n   * Toggle between the Imperial and Metric systems\r\n   */\r\n  displaySystem: {\r\n    type: String,\r\n    default: () => MEASUREMENT_SYSTEM.IMPERIAL,\r\n    validator: (val) => Object.keys(MEASUREMENT_SYSTEM).includes(val)\r\n  }\r\n});\r\nonMounted(() => calculate());\r\nconst emit = defineEmits([\"updateWallpaperPdp\"]);\r\n\r\nconst label = computed(() => (props.displaySystem === \"IMPERIAL\" ? \"ft\" : \"m\"));\r\nconst label2 = computed(() => (props.displaySystem === \"IMPERIAL\" ? \"in\" : \"cm\"));\r\nconst panelMeasurementSysemSign = computed(() => (props.displaySystem === \"IMPERIAL\" ? '\"' : \"cm\"));\r\nconst dimensions = computed(() => (props.displaySystem === MEASUREMENT_SYSTEM.IMPERIAL ? props.dimensionsImperial : props.dimensionsMetric));\r\nconst wp_width = computed(() => dimensions.value.width ?? 0);\r\nconst wp_length = computed(() => dimensions.value.height ?? 0);\r\n\r\nwatch(\r\n  () => [wp_width.value, wp_length.value],\r\n  () => calculate()\r\n);\r\nconst decimals = ref(2);\r\nconst reserveCheckbox = ref(props.reserveCheckboxOnOff);\r\n\r\nconst rollDimensions = computed(() => {\r\n  const dimensions = props.displaySystem === MEASUREMENT_SYSTEM.IMPERIAL ? props.dimensionsImperial : props.dimensionsMetric;\r\n  const x = convert(dimensions.width);\r\n  const y = convert(dimensions.height);\r\n  const baseValue = calculateArea(x, y);\r\n  return roundToNearest(baseValue, decimals.value);\r\n});\r\n\r\nconst bannerNumberRolls = ref(props.quantity ?? 1);\r\nconst panelNumberRolls = ref(0);\r\nconst exededMaxAmount = ref(false);\r\n\r\nconst singularPluralRoll = (quantity = 1) => {\r\n  return quantity > 1 ? \"rolls\" : \"roll\";\r\n};\r\n\r\nwatch(\r\n  () => props.quantity,\r\n  () => {\r\n    bannerNumberRolls.value = props.quantity;\r\n    calculateTotalRollDimensions();\r\n  }\r\n);\r\nconst totalDimensionsNeededBanner = computed(() => calculateTotalRollDimensions(bannerNumberRolls.value));\r\nconst totalDimensionsNeededPanel = ref(1);\r\nconst updatePdpRoll = () => {\r\n  bannerNumberRolls.value = panelNumberRolls.value;\r\n  emit(\"updateWallpaperPdp\", panelNumberRolls.value);\r\n};\r\n\r\nconst rows = ref([\r\n  {\r\n    width: {\r\n      first_x_value: 0,\r\n      second_x_value: 0,\r\n      total_length: 0\r\n    },\r\n    height: {\r\n      first_y_value: 0,\r\n      second_y_value: 0,\r\n      total_length: 0\r\n    }\r\n  }\r\n]);\r\n\r\nwatch(\r\n  () => rows.value.length,\r\n  () => calculate()\r\n);\r\nconst focusInput = (event) => {\r\n  event.target.select();\r\n};\r\n\r\nwatch(\r\n  () => reserveCheckbox.value,\r\n  () => calculate()\r\n);\r\n\r\nconst addRow = () => {\r\n  rows.value.push({\r\n    width: { first_x_value: 0, second_x_value: 0, total_length: 0 },\r\n    height: { first_y_value: 0, second_y_value: 0, total_length: 0 }\r\n  });\r\n};\r\n\r\nconst removeRow = (index) => {\r\n  if (index > 0) {\r\n    rows.value.splice(index, 1);\r\n  }\r\n};\r\nconst checkIfExededAmount = (amountOfRolls) => {\r\n  exededMaxAmount.value = false;\r\n  if (amountOfRolls > 999) {\r\n    exededMaxAmount.value = true;\r\n  }\r\n  return amountOfRolls;\r\n};\r\n\r\nconst calculate = () => {\r\n  totalDimensionsNeededPanel.value = 0;\r\n\r\n  rows.value.forEach((rowElement) => {\r\n    try {\r\n      rowElement.width.total_length = rowElement.width.first_x_value + convert(rowElement.width.second_x_value);\r\n      rowElement.height.total_length = rowElement.height.first_y_value + convert(rowElement.height.second_y_value);\r\n    } catch (error) {\r\n      console.error(\"Error calculating rows:\", error);\r\n    }\r\n  });\r\n\r\n  rows.value.forEach((rowElement) => {\r\n    try {\r\n      if (rowElement.width.total_length >= 0 && rowElement.height.total_length >= 0) {\r\n        totalDimensionsNeededPanel.value = totalDimensionsNeededPanel.value + calculateArea(rowElement.width.total_length, rowElement.height.total_length);\r\n      }\r\n    } catch (error) {\r\n      console.error(\"Error calculating area for each row:\", error);\r\n    }\r\n  });\r\n\r\n  if (reserveCheckbox.value === true) {\r\n    totalDimensionsNeededPanel.value *= 1 + props.reserve / 100;\r\n  }\r\n  const amountOfRolls = Math.ceil(totalDimensionsNeededPanel.value / rollDimensions.value);\r\n\r\n  panelNumberRolls.value = checkIfExededAmount(amountOfRolls);\r\n};\r\n\r\nconst measurementSysemSign = computed(() => (props.displaySystem === MEASUREMENT_SYSTEM.IMPERIAL ? \"sq. ft.\" : \"m²\"));\r\n\r\nconst toggleCheckboxValue = (checkboxValue = reserveCheckbox.value) => {\r\n  reserveCheckbox.value = checkboxValue;\r\n};\r\n\r\nconst calculateTotalRollDimensions = (rollQty = 1) => {\r\n  let baseValue = rollQty * rollDimensions.value;\r\n  return roundToNearest(baseValue, decimals.value);\r\n};\r\n\r\nconst dimensionsWithUSFormatSystem = (value) => {\r\n  const formattedValue = new Intl.NumberFormat(\"en-US\", {\r\n    minimumFractionDigits: 0,\r\n    maximumFractionDigits: decimals.value\r\n  }).format(value);\r\n  return `${formattedValue}`;\r\n};\r\n\r\nconst convert = (value = 0) => {\r\n  if (isNaN(value)) return 0;\r\n\r\n  if (props.displaySystem == MEASUREMENT_SYSTEM.IMPERIAL) {\r\n    const totalFeet = value / 12;\r\n    return totalFeet;\r\n  }\r\n\r\n  if (props.displaySystem == MEASUREMENT_SYSTEM.METRIC) {\r\n    const totalMeter = value / 100;\r\n    return totalMeter;\r\n  }\r\n};\r\n\r\nconst calculateArea = (width, length) => {\r\n  return roundToNearest(width * length, decimals.value);\r\n};\r\n\r\nconst roundToNearest = (num, decimalPlaces) => {\r\n  const factor = Math.pow(10, decimalPlaces);\r\n  return Math.round(num * factor) / factor;\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhSlideOverPanel :is-open=\"openPanel\" @update:is-open=\"openPanel\">\r\n    <template #activator=\"{ open }\">\r\n      <div class=\"py-f2 border-y border-neutral-30\">\r\n        <div>\r\n          {{ bannerNumberRolls }} {{ singularPluralRoll(bannerNumberRolls) }} of ({{ dimensionsWithUSFormatSystem(rollDimensions) }} {{ measurementSysemSign }})\r\n          = {{ dimensionsWithUSFormatSystem(totalDimensionsNeededBanner) }} {{ measurementSysemSign }}\r\n        </div>\r\n        <FhLink @click=\"open\">Wallpaper Calculator</FhLink>\r\n      </div>\r\n    </template>\r\n    <template #body>\r\n      <h1 class=\"text-2xl mb-f2 font-semibold\">How to Calculate</h1>\r\n      <ol class=\"w-full px-11 list-decimal pb-3\">\r\n        <li>Measure the length and width of your wall.</li>\r\n        <li>Enter your measurements in the calculator, adding sections as needed.</li>\r\n      </ol>\r\n\r\n      <h1 class=\"text-2xl my-f3 font-semibold\">Enter Width and Length</h1>\r\n      <TransitionGroup name=\"row\">\r\n        <div class=\"grid-calculator-container\">\r\n          <div v-for=\"(item, index) in rows\" :key=\"index\" class=\"grid-calculator\">\r\n            <FhInput\r\n              v-model=\"item.width.first_x_value\"\r\n              :label=\"label\"\r\n              class=\"input-L\"\r\n              type=\"number\"\r\n              :min=\"0\"\r\n              @:focus=\"focusInput\"\r\n              @:change=\"calculate\"\r\n              @:keyup=\"calculate\"\r\n            />\r\n            <FhInput\r\n              v-model=\"item.width.second_x_value\"\r\n              :label=\"label2\"\r\n              class=\"input-L\"\r\n              type=\"number\"\r\n              :min=\"0\"\r\n              @:focus=\"focusInput\"\r\n              @:change=\"calculate\"\r\n              @:keyup=\"calculate\"\r\n            />\r\n            <div class=\"icon-multiply\">\r\n              <FhIcon name=\"XIcon\" />\r\n            </div>\r\n            <FhInput\r\n              v-model=\"item.height.first_y_value\"\r\n              :label=\"label\"\r\n              class=\"input-R\"\r\n              type=\"number\"\r\n              :min=\"0\"\r\n              @:focus=\"focusInput\"\r\n              @:change=\"calculate\"\r\n              @:keyup=\"calculate\"\r\n            />\r\n            <FhInput\r\n              v-model=\"item.height.second_y_value\"\r\n              :label=\"label2\"\r\n              class=\"input-R\"\r\n              type=\"number\"\r\n              :min=\"0\"\r\n              @:focus=\"focusInput\"\r\n              @:change=\"calculate\"\r\n              @:keyup=\"calculate\"\r\n            />\r\n\r\n            <div class=\"remove-btn w-f8\">\r\n              <FhButton\r\n                v-if=\"index !== 0\"\r\n                class=\"border border-neutral-50 relative rounded-full p-4 leading-none bg-white text-gray-400 hover:text-gray-500 focus:outline-none\"\r\n              >\r\n                <FhIcon name=\"XIcon\" @click=\"removeRow(index)\" />\r\n              </FhButton>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </TransitionGroup>\r\n      <FhButton class=\"w-full my-f3\" color=\"secondary\" @click=\"addRow\"> <FhIcon name=\"PlusSign\" /> Add Section </FhButton>\r\n    </template>\r\n\r\n    <template #footer=\"{ close }\">\r\n      <div class=\"w-full\">\r\n        <div class=\"custom-grid\">\r\n          <div class=\"pr-f4 capitalize\">Total needed:</div>\r\n          <div class=\"text-neutral-50\">{{ dimensionsWithUSFormatSystem(totalDimensionsNeededPanel) }} {{ measurementSysemSign }}</div>\r\n        </div>\r\n\r\n        <div class=\"custom-grid\">\r\n          <div class=\"pr-f4 capitalize\">Rolls required:</div>\r\n          <div class=\"text-neutral-50\">\r\n            {{ panelNumberRolls }} {{ singularPluralRoll(panelNumberRolls) }} @ {{ wp_width }}{{ panelMeasurementSysemSign }} x {{ wp_length\r\n            }}{{ panelMeasurementSysemSign }}\r\n          </div>\r\n        </div>\r\n        <div class=\"flex\">\r\n          <fh-checkbox :model-value=\"reserveCheckbox\" class=\"pr-f1 my-f1\" @update:model-value=\"toggleCheckboxValue\">\r\n            Add a recommended {{ reserve }}% for waste and reserve\r\n          </fh-checkbox>\r\n        </div>\r\n      </div>\r\n      <small v-if=\"exededMaxAmount\" class=\"text-body-sm max-w-prose text-brand-red\">\r\n        You have exceeded the maximum amount of 999 rolls. Please modify your inputs.\r\n      </small>\r\n      <FhButton\r\n        class=\"w-full mt-f4\"\r\n        color=\"primary\"\r\n        :disabled=\"exededMaxAmount\"\r\n        @click=\"\r\n          close();\r\n          updatePdpRoll();\r\n        \"\r\n      >\r\n        Update Quantity on Product Page\r\n      </FhButton>\r\n    </template>\r\n  </FhSlideOverPanel>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.grid-calculator {\r\n  transition: all 1s;\r\n}\r\n\r\n.grid-calculator > div {\r\n  @apply gap-0;\r\n}\r\n.remove-btn,\r\n.icon-multiply {\r\n  align-items: center;\r\n  display: flex;\r\n  align-self: end;\r\n  height: 63px;\r\n}\r\n\r\n:deep(.remove-btn button.btn) {\r\n  @apply rounded-full p-4;\r\n}\r\n.grid-calculator {\r\n  @apply mb-f2;\r\n  display: grid;\r\n  column-gap: 10px;\r\n  row-gap: 10px;\r\n  grid-template-columns: auto auto 20px auto auto auto;\r\n  grid-template-areas: \"input-L input-L icon-multiply input-R input-R remove-btn\";\r\n}\r\n.icon-multiply svg {\r\n  width: 100%;\r\n}\r\n\r\n/* ROW ANIMATION */\r\n.row-enter-active,\r\n.row-leave-active {\r\n  transition: all 0.3s ease;\r\n}\r\n.row-enter-from,\r\n.row-leave-to {\r\n  opacity: 0;\r\n  transform: scale(0.9);\r\n}\r\n/* ROW ANIMATION END */\r\n\r\n.custom-grid {\r\n  display: grid;\r\n  grid-template-columns: 165px auto;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, computed, watch } from \"vue\";\r\nimport { useTimeAgo, useElementSize } from \"@vueuse/core\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport { MEASUREMENT_UNITS } from \"@/constants/measurements\";\r\nimport { TRADEPROGRAM, HOWTOBUY, LOGIN } from \"@/constants/routes\";\r\nimport { useFeaturesStore } from \"@/stores/FeaturesStore\";\r\nimport formatPrice from \"@/util/formatPrice.js\";\r\nimport FhAddToCart from \"@/components/FhAddToCart.vue\";\r\n//import FhBreadcrumb from \"@/components/FhBreadcrumb.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhImage from \"@/components/FhImage.vue\";\r\nimport FhVideo from \"@/components/FhVideo.vue\";\r\nimport FhProductDetailImageGallery from \"@/components/FhProductDetailImageGallery.vue\";\r\nimport FhProductDetailMobileImageGallery from \"@/components/FhProductDetailMobileImageGallery.vue\";\r\nimport FhProductDetailSpecList from \"@/components/FhProductDetailSpecList.vue\";\r\nimport FhProductOptions from \"@/components/FhProductOptions.vue\";\r\nimport FhProductTags from \"@/components/FhProductTags.vue\";\r\nimport FhTabs from \"@/components/FhTabs.vue\";\r\nimport FhAlert from \"@/components/FhAlert.vue\";\r\nimport FhProductCareCard from \"@/components/FhProductCareCard.vue\";\r\nimport FhProductDetailDownloadList from \"@/components/FhProductDetailDownloadList.vue\";\r\nimport { event_viewItem, event_addItemToCart } from \"@/util/googleAnalytics\";\r\nimport FhAddToShoppingListFormModal from \"./FhAddToShoppingListFormModal.vue\";\r\nimport FhShoppingListForm from \"@/components/FhShoppingListForm.vue\";\r\nimport FhWallpaperCalculator from \"@/components/FhWallpaperCalculator.vue\";\r\nimport { useUpdateItemMutation, useDeleteShoppingItemMutation, useCreateShoppingListMutation } from \"@/api/shoppingListApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\nimport { MEDIA_TYPES } from \"@/constants/media\";\r\nconst { isLoading: addToMutationLoading, mutate: addToShoppingListMutation } = useUpdateItemMutation();\r\nconst { isLoading: removeItemToMutationLoading, mutate: removeItemToShoppingListMutation } = useDeleteShoppingItemMutation();\r\nconst { isLoading: createShoppingListMutationLoading, mutate: createSHoppingListMutation } = useCreateShoppingListMutation();\r\n\r\nconst notificationStore = useNotificationStore();\r\nconst props = defineProps({\r\n  product: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isAuthenticated: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  hideCtas: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isUnavailable: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  canAddToCart: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  activeSku: {\r\n    type: String,\r\n    default: () => undefined\r\n  },\r\n  priceMarkup: {\r\n    type: Object,\r\n    default: () => {}\r\n  },\r\n  isCADPrice: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isCustomerGuest: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  breadcrumb: {\r\n    type: Object,\r\n    default: () => {}\r\n  },\r\n  upholsteryLabelUrl: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst { isSm } = useViewportSizes();\r\nconst showAddToShoppingListForm = ref(false);\r\nconst showForm = ref(false);\r\nconst shoppingListToModify = ref(null);\r\n\r\n// Updated to use the breadcrumb.crumbs prop to accomodate for Art Studio items + other products\r\nconst categoryItems = computed(() => {\r\n  return props.breadcrumb?.crumbs.map((crumb) => ({\r\n    name: crumb.name,\r\n    url: crumb.url\r\n  }));\r\n});\r\n\r\nconst featuresStore = useFeaturesStore();\r\nconst pdfTearSheetsEnabled = computed(() => featuresStore.getFeatureValue(\"pdfTearSheetsEnabled\"));\r\n\r\nconst activeSkuNumber = ref(props.activeSku ?? props.product.skus[0].skuNumber);\r\nconst activeSku = computed(() => (!props.isUnavailable ? props.product.skus.find((sku) => sku.skuNumber === activeSkuNumber.value) : null));\r\n\r\nconst markup = ref(props.priceMarkup?.markup);\r\nconst showPriceMarkup = ref(props.priceMarkup?.showPriceMarkup || false);\r\nconst showCADPricing = ref(props.priceMarkup?.showCADPricing || false);\r\nconst noSkuTags = computed(() => {\r\n  return (activeSku.value.tags && !activeSku.value.tags.length) || !activeSku.value.tags;\r\n});\r\n\r\n// encode product url before appending to Login string\r\nconst returnURL = computed(() => \"/product/\" + activeSkuNumber.value);\r\nconst encodedReturnURL = computed(() => encodeURIComponent(returnURL.value));\r\n\r\nconst loginReturnURL = computed(() => LOGIN + \"?returnurl=\" + encodedReturnURL.value);\r\n\r\n// function to replace URL in location bar when the SKU changes\r\nfunction updateURL() {\r\n  window.history.replaceState(null, null, returnURL.value);\r\n}\r\n\r\nconst MEDIA_PREVIEW_COUNT = 6;\r\nconst mediaPreview = computed(() => activeSku.value.media.slice(0, MEDIA_PREVIEW_COUNT));\r\nconst mediaAll = computed(() => activeSku.value.media);\r\nconst mediaGalleryActive = ref(false);\r\nconst mediaGalleryInitialIndex = ref(0);\r\nconst mediaHasVideo = computed(() => activeSku?.value?.media.some((media) => media.type === MEDIA_TYPES.VIDEO));\r\nfunction openMediaGalleryToIndex(index) {\r\n  mediaGalleryInitialIndex.value = index || 0;\r\n  mediaGalleryActive.value = true;\r\n}\r\n\r\nconst mainMediaContainer = ref([]);\r\nfunction scrollToMainMediaElem(index) {\r\n  let elem = mainMediaContainer.value.children[index];\r\n  if (elem && elem instanceof HTMLElement) {\r\n    elem.scrollIntoView({ block: \"start\", behavior: \"smooth\" });\r\n  }\r\n}\r\n\r\nconst canAddToCart = computed(() => props.isAuthenticated && props.canAddToCart);\r\n\r\nconst hideCtas = computed(() => props.isAuthenticated || props.hideCtas);\r\n\r\nconst isUnavailable = computed(() => props.isUnavailable);\r\n\r\nconst showPrice = computed(() => activeSku.value.price && props.isAuthenticated);\r\n\r\nconst availabilityUpdatedTimeAgo = useTimeAgo(() => activeSku.value.availabilityLastUpdatedDate);\r\n\r\nconst showCutover = computed(() => !!activeSku.value.hasBeenCutoverFrom);\r\n\r\nconst tearsheet = computed(() => activeSku.value?.tearSheetUrl || null);\r\n\r\n// TODO: handle imperial/metric toggle?\r\nconst activeOverallDimensionsString = computed(() => activeSku.value.dimensionsImperial);\r\n\r\nconst activeCoreSpecs = computed(() => {\r\n  let sku = activeSku.value;\r\n  let specs = [];\r\n  if (sku.dimensionsImperial) specs.push({ label: \"Overall Dimensions\", value: sku.dimensionsImperial });\r\n  if (sku.skuNumber) specs.push({ label: \"Item Number\", value: sku.skuNumber });\r\n  if (sku.collection) specs.push({ label: \"Collection\", value: sku.collection });\r\n  if (sku.colors) specs.push({ label: \"Colors\", value: sku.colors });\r\n  if (sku.materials) specs.push({ label: \"Materials\", value: sku.materials });\r\n  if (sku.hasPerformanceFabric) specs.push({ label: \"Fabric\", value: \"Performance\" });\r\n  if (sku.weightPounds) specs.push({ label: \"Weight\", value: sku.weightPounds, unit: MEASUREMENT_UNITS.POUND });\r\n  if (sku.volumeCubicFeet) specs.push({ label: \"Volume\", value: sku.volumeCubicFeet, unit: MEASUREMENT_UNITS.CUBIC_FOOT });\r\n  return specs;\r\n});\r\n\r\nconst activeFullSpecs = computed(() => {\r\n  let specs = [];\r\n  if (activeCoreSpecs.value.length) specs.push(activeCoreSpecs.value);\r\n  if (activeSku.value.specs && activeSku.value.specs.length) specs.push(...activeSku.value.specs);\r\n  return specs;\r\n});\r\n\r\nconst fullDetailsSection = ref(null);\r\nconst detailTabsSelectedIndex = ref(0);\r\n\r\n// Compute the Box Count and Single Box Specs\r\nconst boxCount = computed(() => {\r\n  if (activeSku.value.boxes) {\r\n    return activeSku.value.boxes.length;\r\n  } else {\r\n    return null;\r\n  }\r\n});\r\n\r\nconst activeSingleBoxWeight = computed(() => {\r\n  let specs = [];\r\n  if (activeSku.value.boxes && activeSku.value.boxes.length === 1)\r\n    specs.push([\r\n      {\r\n        label: \"Box Dimensions\",\r\n        value: activeSku.value.boxes[0].widthInches + '\" w x ' + activeSku.value.boxes[0].depthInches + '\" d x ' + activeSku.value.boxes[0].heightInches + '\" h'\r\n      },\r\n      { label: \"Box Weight\", value: activeSku.value.boxes[0].weightPounds, unit: MEASUREMENT_UNITS.POUND }\r\n    ]);\r\n  return specs;\r\n});\r\n\r\n// Scroll to the \"Full Details\" section at the bottom of the PDP if it exists (tablet/desktop only),\r\n// otherwise, select the \"Details\" tab (mobile)\r\nfunction showFullDetails() {\r\n  if (fullDetailsSection.value && fullDetailsSection.value instanceof HTMLElement) {\r\n    fullDetailsSection.value.scrollIntoView({ block: \"start\", behavior: \"smooth\" });\r\n  } else {\r\n    detailTabsSelectedIndex.value = 1;\r\n  }\r\n}\r\n\r\n// Manage the showing/hiding of a long list of full specs (tablet/desktop only), if longer than the max container height\r\nconst fullSpecsContainer = ref(null);\r\nconst fullSpecs = ref(null);\r\nconst { height: fullSpecsContainerHeight } = useElementSize(fullSpecsContainer);\r\nconst { height: fullSpecsHeight } = useElementSize(fullSpecs);\r\nconst doFullSpecsOverflow = computed(() => fullSpecsContainerHeight.value < fullSpecsHeight.value);\r\nconst areFullSpecsExpanded = ref(false);\r\nwatch(activeSku, () => {\r\n  areFullSpecsExpanded.value = false;\r\n  updateURL();\r\n});\r\n\r\nconst showProductCare = computed(() => activeSku.value.primaryMaterialCareInfo !== null);\r\nconst showDownloads = computed(() => activeSku.value.downloads.length > 0);\r\n\r\n/* wallpaper calc */\r\nconst qty = ref(1);\r\nconst handle_Rolls = (valor) => {\r\n  if (valor === 0) return (qty.value = 1);\r\n  qty.value = valor;\r\n};\r\n\r\nconst hasWallpaperItems = computed(() => {\r\n  return props.product?.category?.name.toLowerCase().includes(\"wallpaper\") || false;\r\n});\r\n\r\nconst hasSwatch = computed(() => {\r\n  if (\r\n    hasWallpaperItems.value === true &&\r\n    activeSku.value?.wallpaperDimensions?.[0]?.dimensionsImperial?.width === 12 &&\r\n    activeSku.value?.wallpaperDimensions?.[0]?.dimensionsImperial?.height === 8\r\n  ) {\r\n    return true;\r\n  }\r\n  return false;\r\n});\r\nconst wallpaperDimensions = computed(() => activeSku.value?.wallpaperDimensions?.[0] || {});\r\n/* END wallpaper calc */\r\n\r\nconst handle_AddToCart = (skuInfo) => {\r\n  const skuAdded = props.product.skus.find((sku) => sku.skuNumber === skuInfo.sku);\r\n  event_addItemToCart({ ...skuAdded, quantity: skuInfo.qty, name: props.product.name, has_video: mediaHasVideo.value }, categoryItems.value);\r\n};\r\n\r\nevent_viewItem({ ...activeSku.value, name: props.product.name, has_video: mediaHasVideo.value }, categoryItems.value);\r\n\r\nfunction handalClick(val) {\r\n  shoppingListToModify.value = {\r\n    name: props.product.name,\r\n    skuNumber: activeSku.value.skuNumber,\r\n    thumbUrl: activeSku.value.media[0].thumbUrl,\r\n    price: activeSku.value.price,\r\n    skuName: activeSku.value.name\r\n  };\r\n  showAddToShoppingListForm.value = val;\r\n}\r\n\r\nfunction addtolistModal(val) {\r\n  shoppingListToModify.value = {\r\n    name: props.product.name,\r\n    skuNumber: activeSku.value.skuNumber,\r\n    thumbUrl: activeSku.value.media[0].thumbUrl,\r\n    price: activeSku.value.price,\r\n    skuName: activeSku.value.name\r\n  };\r\n  if (val == true) {\r\n    showAddToShoppingListForm.value = false;\r\n    showForm.value = val;\r\n  } else {\r\n    showAddToShoppingListForm.value = true;\r\n    showForm.value = false;\r\n  }\r\n  showForm.value = val;\r\n}\r\nconst addToShoppingList = (shoppingListDetails) => {\r\n  const shoppinglist = {\r\n    title: shoppingListDetails.title,\r\n    description: shoppingListDetails.description,\r\n    pricingVisibility: shoppingListDetails.pricingVisibility,\r\n    ShoppingListItems: [{ SkuNumber: shoppingListDetails.skuNumber, Quantity: 1 }]\r\n  };\r\n  createSHoppingListMutation(shoppinglist, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Your shopping list has been created.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not create that shopping List.\"),\r\n    onSettled: () => {\r\n      showForm.value = false;\r\n    }\r\n  });\r\n};\r\n\r\nconst handaleheartclickevent = (item) => {\r\n  const data = {\r\n    skuNumber: item.formData.skuNumber,\r\n    Quantity: 1,\r\n    ShoppingListId: item.item.id\r\n  };\r\n  addToShoppingListMutation(data, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Item added to shopping list.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not create that shopping List.\")\r\n  });\r\n};\r\nconst handleheartfilledevent = (item) => {\r\n  const data = {\r\n    skuNumber: item.formData.skuNumber,\r\n    ShoppingListId: item.item.id\r\n  };\r\n  const shoppingListId = data.ShoppingListId;\r\n  const targetSkuNumber = data.skuNumber;\r\n  const targetShoppingList = item.shopping.find((item) => item.id === shoppingListId);\r\n  const matchingProduct = targetShoppingList.products.find((product) => product.skuNumber === targetSkuNumber);\r\n  const product = { ShoppingListID: item.item.id, id: matchingProduct.id, quantity: matchingProduct.quantity };\r\n  removeItemToShoppingListMutation(product, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Item removed from shopping list.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not remove that shopping List Item.\")\r\n  });\r\n};\r\n</script>\r\n\r\n<template>\r\n  <div v-if=\"isUnavailable\" class=\"my-f5 flex flex-col items-center justify-center\">\r\n    <FhAlert icon=\"AlertCircle\" class=\"w-full max-w-lg\">\r\n      <div>This item is no longer available.</div>\r\n    </FhAlert>\r\n  </div>\r\n  <template v-else>\r\n    <div v-if=\"showCutover\">\r\n      <FhAlert icon=\"InformationCircle\" class=\"my-f5\">\r\n        <div>\r\n          This product has replaced item number {{ activeSku.hasBeenCutoverFrom }}. Rest assured. You're shopping the same product with a new item number.\r\n        </div>\r\n      </FhAlert>\r\n    </div>\r\n    <div class=\"mb-f15 md:grid md:grid-cols-[auto_minmax(0,445px)] md:items-start md:gap-x-f5\" :class=\"{ 'mt-f5': !props.isAuthenticated }\">\r\n      <div class=\"flex flex-col md:top-f4 md:col-start-2 md:flex-row md:flex-wrap\">\r\n        <FhProductTags :tags=\"activeSku.tags\" class=\"mb-f2 md:-order-1\" />\r\n        <div v-if=\"!props.isAuthenticated && noSkuTags\" class=\"w-full md:min-h-[2rem]\"></div>\r\n        <!-- eyebrowText NAME -->\r\n        <div v-if=\"activeSku?.eyebrowText\" class=\"text-body-sm font-medium md:w-full mb-f1 text-neutral-50\">{{ activeSku.eyebrowText }}</div>\r\n        <!-- PRODUCT NAME -->\r\n        <h1 class=\"mb-f1 text-f-3xl-5xl md:w-full\">{{ props.product.name }}</h1>\r\n        <!-- SKU NAME AND NUMBER -->\r\n        <div class=\"text-body mb-f1 text-neutral-50 md:w-full\">\r\n          <span v-if=\"activeSku.name\">{{ activeSku.name }}&nbsp;&bull;&nbsp;</span>\r\n          <span>{{ activeSku.skuNumber }}</span>\r\n        </div>\r\n        <!-- IN STOCK -->\r\n        <div v-if=\"activeSku.inStock\" class=\"mb-f1 md:w-full\">In Stock <FhIcon name=\"LightningBolt\" class=\"relative -top-px\" /></div>\r\n        <!-- SHARE AND FAVORITE BUTTONS -->\r\n        <div class=\"mb-f3 flex gap-f3 md:relative md:-top-2 md:-order-1 md:ml-auto\" :class=\"{ 'md:min-h-[2rem]': !props.isAuthenticated }\">\r\n          <button v-if=\"props.isAuthenticated\" aria-label=\"Add to List\" class=\"text-2xl\" @click=\"handalClick(true)\"><FhIcon name=\"OutlineHeart\" /></button>\r\n        </div>\r\n        <!-- SPACER -->\r\n        <div class=\"mb-f3 h-0 w-full\"></div>\r\n        <!-- PRICE -->\r\n        <div v-if=\"showPrice\" class=\"mb-f5 flex items-center gap-f3 md:w-full\">\r\n          <div class=\"text-f-3xl-5xl\" :class=\"{ 'text-brand-red': activeSku.isDiscounted }\">\r\n            <span v-if=\"(props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin)\">CAD</span>{{ formatPrice(activeSku.price) }}\r\n          </div>\r\n          <div\r\n            v-if=\"activeSku.isDiscounted && activeSku.originalPrice\"\r\n            class=\"text-f-3xl-5xl text-neutral-50 line-through\"\r\n            :class=\"{ 'hidden md:block': activeSku.secondaryPrice }\"\r\n          >\r\n            <span v-if=\"(props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin)\">CAD</span\r\n            >{{ formatPrice(activeSku.originalPrice) }}\r\n          </div>\r\n          <div v-if=\"activeSku.priceLabel\" class=\"w-px self-stretch bg-neutral-30\">&nbsp;</div>\r\n          <div v-if=\"activeSku.priceLabel\" class=\"text-neutral-50 before:w-px\">\r\n            {{ activeSku.priceLabel }}\r\n          </div>\r\n          <div v-if=\"activeSku.secondaryPrice\" class=\"w-px self-stretch bg-neutral-30\">&nbsp;</div>\r\n          <div v-if=\"activeSku.secondaryPrice\" class=\"text-neutral-50 before:w-px\">\r\n            <span v-if=\"(props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin)\">CAD</span\r\n            >{{ formatPrice(activeSku.secondaryPrice) }}\r\n            <span v-if=\"activeSku.secondaryPriceName\">{{ activeSku.secondaryPriceName }}</span>\r\n          </div>\r\n        </div>\r\n        <!-- MOBILE IMAGES -->\r\n        <FhProductDetailMobileImageGallery :media=\"mediaAll\" class=\"mb-f5\" />\r\n        <!-- PRODUCT OPTIONS -->\r\n        <FhProductOptions v-if=\"props.product.options?.length\" v-model:active-sku=\"activeSkuNumber\" :options=\"props.product.options\" class=\"mb-f5 w-full\" />\r\n        <!-- NON-AUTHENTICATED CTA BUTTONS -->\r\n        <div v-if=\"!hideCtas\" class=\"flex w-full flex-col\">\r\n          <div class=\"mb-f2 flex w-full flex-col gap-f2 md:flex-row\">\r\n            <FhButton :href=\"HOWTOBUY\" color=\"primary\" class=\"w-full whitespace-nowrap\">How to Buy</FhButton>\r\n          </div>\r\n          <div class=\"mb-f5 flex w-full flex-col gap-f2 md:flex-row\">\r\n            <FhButton :href=\"TRADEPROGRAM\" class=\"w-full whitespace-nowrap\">Join Trade Program</FhButton>\r\n            <FhButton :href=\"loginReturnURL\" class=\"w-full whitespace-nowrap\">Log In</FhButton>\r\n          </div>\r\n        </div>\r\n        <!-- ADD TO CART + AVAILABILITY INFO -->\r\n        <div\r\n          v-if=\"props.isAuthenticated\"\r\n          class=\"relative left-1/2 mb-f5 flex w-screen -translate-x-1/2 flex-col gap-f2 border border-solid border-neutral-30 bg-neutral-10 p-f4 md:w-full md:p-f2\"\r\n        >\r\n          <FhAddToCart\r\n            v-if=\"canAddToCart\"\r\n            :sku-number=\"activeSku.skuNumber\"\r\n            :price=\"activeSku.price\"\r\n            :category=\"categoryItems\"\r\n            :quantity=\"qty\"\r\n            @update:add-to-cart=\"handle_AddToCart\"\r\n            @update:quantity=\"handle_Rolls\"\r\n          />\r\n          <div v-if=\"hasWallpaperItems && !hasSwatch\">\r\n            <FhWallpaperCalculator\r\n              display-system=\"IMPERIAL\"\r\n              :dimensions-imperial=\"wallpaperDimensions.dimensionsImperial\"\r\n              :dimensions-metric=\"wallpaperDimensions.dimensionsMetric\"\r\n              :quantity=\"qty\"\r\n              :open-panel=\"false\"\r\n              @update-wallpaper-pdp=\"handle_Rolls\"\r\n            />\r\n          </div>\r\n          <div v-if=\"activeSku.availabilityDescription\">\r\n            <!-- eslint-disable-next-line -->\r\n            <div v-if=\"activeSku.availabilityDescription\" v-html=\"activeSku.availabilityDescription\"></div>\r\n            <div v-if=\"availabilityUpdatedTimeAgo\" class=\"text-neutral-50\">As of {{ availabilityUpdatedTimeAgo }}</div>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- NON-AUTHENTICATED DETAILS -->\r\n        <div v-if=\"!props.isAuthenticated\" class=\"w-full\">\r\n          <div v-if=\"activeSku.description\" class=\"mb-f5 text-f-sm-lg\">{{ activeSku.description }}</div>\r\n          <div v-if=\"activeOverallDimensionsString\" class=\"mb-f3 flex w-full flex-col md:flex-row md:justify-between\">\r\n            <span class=\"mb-f0.5 md:mb-0\">Overall Dimensions</span>\r\n            <span class=\"text-neutral-50\">{{ activeOverallDimensionsString }}</span>\r\n          </div>\r\n          <div class=\"flex flex-col items-start gap-f2\">\r\n            <FhButton\r\n              v-if=\"tearsheet\"\r\n              variant=\"text\"\r\n              :href=\"tearsheet\"\r\n              :class=\"{ 'hidden lg:inline-block': !pdfTearSheetsEnabled, 'inline-block': pdfTearSheetsEnabled }\"\r\n              target=\"_blank\"\r\n              ><FhIcon name=\"TextDocument\" />Download Tear Sheet</FhButton\r\n            >\r\n            <FhProductCareCard v-if=\"showProductCare\" :data=\"activeSku.primaryMaterialCareInfo\"></FhProductCareCard>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- AUTHENTICATED DETAILS (TABS) -->\r\n        <FhTabs\r\n          v-if=\"props.isAuthenticated\"\r\n          :selected-index=\"detailTabsSelectedIndex\"\r\n          align=\"left\"\r\n          underline\r\n          compact\r\n          class=\"w-full\"\r\n          @change=\"(index) => (detailTabsSelectedIndex = index)\"\r\n        >\r\n          <template #trigger-overview>Overview</template>\r\n          <template #content-overview>\r\n            <div class=\"flex flex-col gap-f5\">\r\n              <div v-if=\"activeSku.description\" class=\"text-f-sm-lg\">{{ activeSku.description }}</div>\r\n              <div>\r\n                <div v-if=\"activeOverallDimensionsString\" class=\"mb-f0.5 flex w-full flex-col md:flex-row md:justify-between\">\r\n                  <span class=\"mb-f0.5 md:mb-0\">Overall Dimensions</span>\r\n                  <span class=\"text-neutral-50\">{{ activeOverallDimensionsString }}</span>\r\n                </div>\r\n                <FhButton variant=\"link\" @click=\"showFullDetails\">Full Details &amp; Specifications</FhButton>\r\n              </div>\r\n              <div class=\"flex flex-col items-start gap-f2\">\r\n                <FhButton\r\n                  v-if=\"tearsheet\"\r\n                  variant=\"text\"\r\n                  :href=\"tearsheet\"\r\n                  :class=\"{ 'hidden lg:inline-block': !pdfTearSheetsEnabled, 'inline-block': pdfTearSheetsEnabled }\"\r\n                  target=\"_blank\"\r\n                  ><FhIcon name=\"TextDocument\" />Download Tear Sheet</FhButton\r\n                >\r\n                <FhButton v-if=\"activeSku.assemblyInstructionsUrl\" variant=\"text\" :href=\"activeSku.assemblyInstructionsUrl\" class=\"inline-block\"\r\n                  ><FhIcon name=\"TextDocument\" />Download Assembly Instructions</FhButton\r\n                >\r\n                <FhButton v-if=\"upholsteryLabelUrl\" variant=\"text\" :href=\"upholsteryLabelUrl\" class=\"inline-block\" target=\"_blank\"\r\n                  ><FhIcon name=\"TextDocument\" />Upholstery Law Label</FhButton\r\n                >\r\n                <FhProductCareCard v-if=\"showProductCare\" :data=\"activeSku.primaryMaterialCareInfo\"></FhProductCareCard>\r\n              </div>\r\n            </div>\r\n          </template>\r\n          <template #trigger-details>Details</template>\r\n          <template #content-details>\r\n            <FhProductDetailSpecList :specs=\"isSm && areFullSpecsExpanded ? activeFullSpecs : activeCoreSpecs\" />\r\n            <FhButton v-if=\"isSm && activeFullSpecs.length > 1\" variant=\"text\" class=\"mt-f5\" @click=\"areFullSpecsExpanded = !areFullSpecsExpanded\">\r\n              Show {{ areFullSpecsExpanded ? \"Fewer\" : \"All\" }} Details\r\n              <FhIcon name=\"DownChevron\" :class=\"{ 'rotate-180': areFullSpecsExpanded }\" />\r\n            </FhButton>\r\n            <FhButton v-if=\"!isSm\" variant=\"link\" class=\"mt-f5\" @click=\"showFullDetails\">Full Details &amp; Specifications</FhButton>\r\n            <!-- PROP 65 WARNING -->\r\n            <div v-if=\"activeSku.prop65WarningHtml\" class=\"flex gap-f2 bg-neutral-10 p-f2 mt-8\">\r\n              <div class=\"text-body-xl\"><FhIcon name=\"AlertTriangle\" aria-hidden=\"true\" /></div>\r\n              <!-- eslint-disable-next-line -->\r\n              <div v-html=\"activeSku.prop65WarningHtml\" class=\"text-sm mt-f0.5\"></div>\r\n            </div>\r\n            <section v-if=\"isSm && showDownloads\" class=\"mt-f5\">\r\n              <h3 class=\"mr-f1 inline-block\">Downloads</h3>\r\n              <div class=\"items-start gap-f2\">\r\n                <FhProductDetailDownloadList :downloads=\"activeSku.downloads\" />\r\n              </div>\r\n            </section>\r\n          </template>\r\n          <template #trigger-shipping>Shipping</template>\r\n          <template #content-shipping>\r\n            <div class=\"flex flex-col gap-f5\">\r\n              <div v-if=\"boxCount === null || boxCount === 0\">\r\n                <span class=\"text-neutral-50\">Please contact your sales support specialist for shipping dimensions and weights.</span>\r\n              </div>\r\n              <div v-else-if=\"boxCount === 1\">\r\n                <FhProductDetailSpecList :specs=\"activeSingleBoxWeight\" />\r\n              </div>\r\n              <div v-else>\r\n                <table>\r\n                  <thead>\r\n                    <tr>\r\n                      <th class=\"px-f3 py-1\"></th>\r\n                      <th class=\"tableHeader\">Width</th>\r\n                      <th class=\"tableHeader\">Depth</th>\r\n                      <th class=\"tableHeader\">Height</th>\r\n                      <th class=\"tableHeader\">Weight</th>\r\n                    </tr>\r\n                  </thead>\r\n                  <tbody>\r\n                    <tr v-for=\"(item, index) in activeSku.boxes\" :key=\"index\">\r\n                      <td class=\"py-f1 pr-f3\">Box {{ index + 1 }}</td>\r\n                      <td class=\"tableData\">{{ item.widthInches }}\"</td>\r\n                      <td class=\"tableData\">{{ item.depthInches }}\"</td>\r\n                      <td class=\"tableData\">{{ item.heightInches }}\"</td>\r\n                      <td class=\"tableData\">{{ item.weightPounds }} lb</td>\r\n                    </tr>\r\n                  </tbody>\r\n                </table>\r\n              </div>\r\n            </div>\r\n          </template>\r\n        </FhTabs>\r\n      </div>\r\n\r\n      <!-- TABLET/DESKTOP IMAGES -->\r\n      <div v-if=\"!isSm\" class=\"hidden md:col-start-1 md:row-start-1 md:block lg:grid lg:grid-cols-[6rem_1fr] lg:gap-x-f5\">\r\n        <!-- THUMBS -->\r\n        <div class=\"hidden lg:block\">\r\n          <div class=\"sticky top-f4 flex flex-col gap-f1\">\r\n            <button\r\n              v-for=\"(media, i) in mediaPreview\"\r\n              :key=\"media.thumbUrl\"\r\n              class=\"group relative block\"\r\n              title=\"Scroll to image\"\r\n              @click=\"scrollToMainMediaElem(i)\"\r\n            >\r\n              <FhImage :src=\"media.thumbUrl\" :alt=\"`${props.product.name} thumbnail`\" square border class=\"group-hover:border-neutral-70\" />\r\n              <div v-if=\"media.type === MEDIA_TYPES.VIDEO\" class=\"absolute top-0 left-0 h-full w-full flex justify-center items-center\">\r\n                <FhIcon name=\"VideoPlay\" class=\"h-[46px] w-[46px]\" />\r\n              </div>\r\n            </button>\r\n            <FhButton\r\n              v-if=\"mediaAll.length - mediaPreview.length > 0\"\r\n              variant=\"link\"\r\n              size=\"small\"\r\n              class=\"mt-f2\"\r\n              title=\"Open gallery\"\r\n              @click=\"openMediaGalleryToIndex(0)\"\r\n            >\r\n              View All ({{ mediaAll.length }})\r\n            </FhButton>\r\n          </div>\r\n        </div>\r\n        <!-- MAIN IMAGE GRID -->\r\n        <div ref=\"mainMediaContainer\" class=\"grid grid-cols-2 gap-f2\">\r\n          <button\r\n            v-for=\"(media, i) in mediaPreview\"\r\n            :key=\"media.largeUrl\"\r\n            class=\"cursor-zoom-in scroll-mt-f4\"\r\n            :class=\"{ 'col-span-2': i % 3 === 0 }\"\r\n            title=\"Open gallery\"\r\n            @click=\"openMediaGalleryToIndex(i)\"\r\n          >\r\n            <FhImage v-if=\"media.type === MEDIA_TYPES.IMAGE\" :src=\"media.largeUrl\" :alt=\"media.altText\" :square=\"i === 0 || i % 3 !== 0\" border />\r\n            <FhVideo v-if=\"media.type === MEDIA_TYPES.VIDEO\" :src=\"media.videoUrl\" :autoplay=\"true\" :loop=\"true\">\r\n              <template #overlay=\"{ videoToggle, isPlaying }\">\r\n                <div class=\"absolute top-0 left-0 h-full w-full\"></div>\r\n                <button class=\"absolute bottom-2 right-2 flex h-16 w-16\" @click.stop=\"videoToggle\">\r\n                  <FhIcon v-if=\"!isPlaying\" name=\"VideoPlay\" class=\"h-full w-full\" />\r\n                  <FhIcon v-else name=\"VideoPause\" class=\"h-full w-full\" />\r\n                </button>\r\n              </template>\r\n            </FhVideo>\r\n          </button>\r\n        </div>\r\n      </div>\r\n      <FhProductDetailImageGallery\r\n        :is-active=\"mediaGalleryActive\"\r\n        :media=\"mediaAll\"\r\n        :product-name=\"props.product.name\"\r\n        :sku-name=\"activeSku.name\"\r\n        :initial-media-index=\"mediaGalleryInitialIndex\"\r\n        :is-authenticated=\"props.isAuthenticated\"\r\n        @close=\"mediaGalleryActive = false\"\r\n      />\r\n    </div>\r\n\r\n    <div v-if=\"$slots.banner\" class=\"my-f15\">\r\n      <slot name=\"banner\" :active-sku=\"activeSku\"></slot>\r\n    </div>\r\n\r\n    <!-- FULL DETAILS SECTION (AUTHENTICATED, TABLET/DESKTOP ONLY) -->\r\n    <section v-if=\"!isSm && props.isAuthenticated\" ref=\"fullDetailsSection\" class=\"mb-f15\">\r\n      <h2 class=\"mb-f2 text-f-xl-3xl\">Full Details &amp; Specifications</h2>\r\n      <section class=\"grid grid-cols-2 py-f5\">\r\n        <h3 class=\"text-body-lg\">Overall Dimensions</h3>\r\n        <div>{{ activeOverallDimensionsString }}</div>\r\n      </section>\r\n      <section class=\"grid grid-cols-2 border-t border-solid border-neutral-20 py-f5\">\r\n        <h3 class=\"text-body-lg\">Product Details</h3>\r\n        <div>\r\n          <div\r\n            ref=\"fullSpecsContainer\"\r\n            :class=\"{\r\n              'max-h-96 overflow-hidden': !areFullSpecsExpanded,\r\n              'relative after:absolute after:bottom-0 after:left-0 after:right-0 after:h-20 after:bg-gradient-to-b after:from-transparent after:to-white':\r\n                doFullSpecsOverflow && !areFullSpecsExpanded\r\n            }\"\r\n          >\r\n            <div ref=\"fullSpecs\">\r\n              <FhProductDetailSpecList :specs=\"activeFullSpecs\" />\r\n            </div>\r\n          </div>\r\n          <FhButton\r\n            v-if=\"doFullSpecsOverflow || areFullSpecsExpanded\"\r\n            variant=\"text\"\r\n            class=\"float-right\"\r\n            :class=\"areFullSpecsExpanded ? 'mt-f5' : 'mt-f2'\"\r\n            @click=\"areFullSpecsExpanded = !areFullSpecsExpanded\"\r\n          >\r\n            View {{ areFullSpecsExpanded ? \"Fewer\" : \"All\" }} Details\r\n            <FhIcon name=\"DownChevron\" :class=\"{ 'rotate-180': areFullSpecsExpanded }\" />\r\n          </FhButton>\r\n        </div>\r\n      </section>\r\n      <section class=\"grid grid-cols-2 border-t border-solid border-neutral-20 py-f5\">\r\n        <h3 class=\"text-body-lg\">Shipping Details</h3>\r\n        <div v-if=\"boxCount === null || boxCount === 0\">\r\n          <span class=\"text-neutral-50\">Please contact your sales support specialist for shipping dimensions and weights.</span>\r\n        </div>\r\n        <div v-else-if=\"boxCount === 1\">\r\n          <FhProductDetailSpecList :specs=\"activeSingleBoxWeight\" />\r\n        </div>\r\n        <div v-else>\r\n          <table>\r\n            <thead>\r\n              <tr>\r\n                <th class=\"px-f3 py-1\"></th>\r\n                <th class=\"tableHeader\">Width</th>\r\n                <th class=\"tableHeader\">Depth</th>\r\n                <th class=\"tableHeader\">Height</th>\r\n                <th class=\"tableHeader\">Weight</th>\r\n              </tr>\r\n            </thead>\r\n            <tbody>\r\n              <tr v-for=\"(item, index) in activeSku.boxes\" :key=\"index\">\r\n                <td class=\"py-f1 pr-f3\">Box {{ index + 1 }}</td>\r\n                <td class=\"tableData\">{{ item.widthInches }}\"</td>\r\n                <td class=\"tableData\">{{ item.depthInches }}\"</td>\r\n                <td class=\"tableData\">{{ item.heightInches }}\"</td>\r\n                <td class=\"tableData\">{{ item.weightPounds }} lb</td>\r\n              </tr>\r\n            </tbody>\r\n          </table>\r\n        </div>\r\n      </section>\r\n      <section v-if=\"showProductCare || showDownloads\" class=\"grid grid-cols-2 border-t border-solid border-neutral-20 py-f5\">\r\n        <h3 class=\"text-body-lg\">Downloads</h3>\r\n        <div class=\"flex flex-col items-start gap-f2\">\r\n          <FhButton\r\n            v-if=\"tearsheet\"\r\n            variant=\"text\"\r\n            :href=\"tearsheet\"\r\n            :class=\"{ 'hidden lg:inline-block': !pdfTearSheetsEnabled, 'inline-block': pdfTearSheetsEnabled }\"\r\n            target=\"_blank\"\r\n            ><FhIcon name=\"TextDocument\" />Download Tear Sheet</FhButton\r\n          >\r\n          <FhButton v-if=\"activeSku.assemblyInstructionsUrl\" variant=\"text\" :href=\"activeSku.assemblyInstructionsUrl\" class=\"inline-block\"\r\n            ><FhIcon name=\"TextDocument\" />Download Assembly Instructions</FhButton\r\n          >\r\n          <FhButton v-if=\"upholsteryLabelUrl\" variant=\"text\" :href=\"upholsteryLabelUrl\" class=\"inline-block\" target=\"_blank\"\r\n            ><FhIcon name=\"TextDocument\" />Upholstery Law Label</FhButton\r\n          >\r\n          <FhProductCareCard v-if=\"showProductCare\" :data=\"activeSku.primaryMaterialCareInfo\"></FhProductCareCard>\r\n          <FhProductDetailDownloadList :downloads=\"activeSku.downloads\" />\r\n        </div>\r\n      </section>\r\n    </section>\r\n    <!-- <FhModal v-model:is-open=\"productCareModalIsOpen\" :data=\"productCareModalData\" /> -->\r\n  </template>\r\n  <FhAddToShoppingListFormModal\r\n    v-if=\"showAddToShoppingListForm\"\r\n    :is-open=\"showAddToShoppingListForm\"\r\n    :shopping-details=\"shoppingListToModify\"\r\n    :is-loading=\"addToMutationLoading || removeItemToMutationLoading\"\r\n    :is-admin=\"props.isAdmin\"\r\n    :is-c-a-d-price=\"props.isCADPrice\"\r\n    :is-customer-guest=\"props.isCustomerGuest\"\r\n    @addtolist=\"addtolistModal\"\r\n    @heart-icon-clicked=\"handaleheartclickevent\"\r\n    @heart-icon-filled=\"handleheartfilledevent\"\r\n    @update:is-open=\"handalClick\"\r\n  ></FhAddToShoppingListFormModal>\r\n  <FhShoppingListForm\r\n    v-if=\"showForm\"\r\n    :is-admin=\"props.isAdmin\"\r\n    :is-open=\"showForm\"\r\n    :is-creating=\"createShoppingListMutationLoading\"\r\n    :shopping-details=\"shoppingListToModify\"\r\n    :edit-mode=\"false\"\r\n    :is-plp-pdp=\"true\"\r\n    :markup=\"markup\"\r\n    :show-price-markup=\"showPriceMarkup\"\r\n    :show-c-a-d-pricing=\"showCADPricing\"\r\n    :is-c-a-d-price=\"props.isCADPrice\"\r\n    :is-customer-guest=\"props.isCustomerGuest\"\r\n    @create=\"addToShoppingList\"\r\n    @update:is-open=\"addtolistModal\"\r\n  ></FhShoppingListForm>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.tableHeader {\r\n  @apply px-f2 py-f1 text-left;\r\n}\r\n\r\n.tableData {\r\n  @apply px-f2 py-f1 text-left text-neutral-50;\r\n}\r\n:deep(.fh_video) {\r\n  aspect-ratio: 1/1;\r\n  object-fit: cover;\r\n  width: 100%;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed, ref } from \"vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhRadio from \"@/components/FhRadio.vue\";\r\nimport FhCheckbox from \"@/components/FhCheckbox.vue\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * Model of the component; Either use this property (along with a listener for 'update:model-value' event) OR use v-model directive\r\n   */\r\n  modelValue: {\r\n    type: undefined,\r\n    required: true\r\n  },\r\n  type: {\r\n    type: String,\r\n    default: \"radio\",\r\n    validator: (val) => [\"radio\", \"checkbox\"].includes(val)\r\n  },\r\n  option: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  /**\r\n   * Controls the size of the label and options; corresponds to standard fluid body text sizes\r\n   * @values base, lg, xl\r\n   */\r\n  size: {\r\n    type: String,\r\n    default: \"base\",\r\n    validator: (val) => [\"base\", \"lg\", \"xl\"].includes(val)\r\n  },\r\n  /**\r\n   * The Vuelidate validation object for this field. Use this to automatically set the error state and errorMessage.\r\n   * The `errorMessage` prop will override any error messages from this prop if both are set.\r\n   */\r\n  vuelidate: {\r\n    type: Object,\r\n    default: () => undefined\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst parentOptionRef = ref(null);\r\n\r\nconst parentValue = computed(() => props.option.value);\r\nconst nestedOptions = computed(() => props.option?.options || []);\r\nconst nestedOptionsValue = computed(() => {\r\n  return nestedOptions.value.map((nestedOption) => nestedOption.value);\r\n});\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (selectedValue) => {\r\n    // If select has children let change triggers run\r\n    // else proceed normally with update\r\n    if (nestedOptions.value.length === 0) {\r\n      emit(\"update:modelValue\", selectedValue);\r\n    }\r\n  }\r\n});\r\n\r\nconst itemComponent = computed(() => {\r\n  switch (props.type) {\r\n    case \"radio\":\r\n      return FhRadio;\r\n    case \"checkbox\":\r\n      return FhCheckbox;\r\n    default:\r\n      throw new Error(`Unsupported type: ${props.type}`);\r\n  }\r\n});\r\n\r\nconst isInditerm = computed(() => {\r\n  const hasParent = value.value.includes(parentValue.value);\r\n  const hasChildValue = value.value.find((val) => nestedOptionsValue.value.includes(val));\r\n  if (hasChildValue && !hasParent) return true;\r\n  return false;\r\n});\r\n\r\nconst showNestedOptions = ref(value.value.find((val) => nestedOptionsValue.value.includes(val)) || value.value.includes(parentValue.value));\r\n\r\nconst optionChangeEvent = (event) => {\r\n  if (props.vuelidate) props.vuelidate.$touch();\r\n\r\n  if (nestedOptionsValue.value.length === 0) return; // bail if there are no children\r\n\r\n  if (isInditerm.value) {\r\n    const childrenRemoved = Object.values(value.value).filter((val) => !nestedOptionsValue.value.includes(val));\r\n    emit(\"update:modelValue\", childrenRemoved);\r\n    return;\r\n  }\r\n\r\n  if (event.target.checked) {\r\n    emit(\"update:modelValue\", [...value.value, ...nestedOptionsValue.value, event.target.value]);\r\n    showNestedOptions.value = true;\r\n  } else {\r\n    const childrenRemoved = Object.values(value.value).filter((val) => !nestedOptionsValue.value.includes(val) && val != parentValue.value);\r\n    emit(\"update:modelValue\", childrenRemoved);\r\n  }\r\n};\r\n\r\nconst triggerNestedOptions = () => {\r\n  showNestedOptions.value = !showNestedOptions.value;\r\n};\r\n\r\nconst triggerInditerm = (event) => {\r\n  const selectedValue = event.target.value;\r\n  if (event.target.checked) {\r\n    // Add child value\r\n    emit(\"update:modelValue\", [...value.value, selectedValue]);\r\n  } else {\r\n    // remove child value\r\n    const updatedModel = value.value.filter((val) => val != selectedValue && val != parentValue.value);\r\n    emit(\"update:modelValue\", updatedModel);\r\n  }\r\n};\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex items-center justify-between\">\r\n    <component\r\n      :is=\"itemComponent\"\r\n      ref=\"parentOptionRef\"\r\n      v-model=\"value\"\r\n      :value=\"props.option.value\"\r\n      :disabled=\"props.option.disabled\"\r\n      :indeterminate=\"isInditerm\"\r\n      :size=\"props.size\"\r\n      class=\"grow\"\r\n      data-ga=\"filter_checkbox\"\r\n      :data-ga-value=\"props.option.label\"\r\n      @change=\"optionChangeEvent\"\r\n    >\r\n      <!-- @slot Can be used to customize the option label content. Receives the `option` object as a parameter. -->\r\n      <slot name=\"label\" v-bind=\"props.option\">\r\n        {{ props.option.label }}\r\n      </slot>\r\n    </component>\r\n    <div class=\"flex w-full items-center justify-end self-center\">\r\n      <span v-if=\"nestedOptions?.length > 0\" class=\"cursor-pointer pl-2 text-2xl leading-none\" @click=\"triggerNestedOptions\">\r\n        <FhIcon name=\"DownChevron\" :class=\"{ 'rotate-180': showNestedOptions }\" aria-hidden=\"true\" />\r\n      </span>\r\n      <slot name=\"count\" v-bind=\"props.option\">\r\n        {{ props.option.count }}\r\n      </slot>\r\n    </div>\r\n  </div>\r\n  <div v-if=\"nestedOptions?.length > 0 && showNestedOptions\" class=\"flex flex-col gap-f2 pl-6\">\r\n    <component\r\n      :is=\"itemComponent\"\r\n      v-for=\"nestedOption in nestedOptions\"\r\n      :key=\"nestedOption.value\"\r\n      v-model=\"value\"\r\n      :value=\"nestedOption.value\"\r\n      :disabled=\"nestedOption.disabled\"\r\n      :size=\"props.size\"\r\n      class=\"grow\"\r\n      :data-ga-value=\"nestedOption.label\"\r\n      @change=\"triggerInditerm\"\r\n    >\r\n      <div class=\"flex w-full items-baseline justify-between\">\r\n        <div class=\"mr-f3 whitespace-nowrap\">{{ nestedOption.label }}</div>\r\n        <div class=\"text-xs\" :class=\"{ 'text-neutral-50': !nestedOption.selected }\">{{ nestedOption.count }}</div>\r\n      </div>\r\n    </component>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed, useSlots } from \"vue\";\r\nimport getId from \"@/util/getId\";\r\nimport FhOptionGroupItems from \"@/components/FhOptionGroupItems.vue\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * Model of the component; Either use this property (along with a listener for 'update:model-value' event) OR use v-model directive\r\n   */\r\n  modelValue: {\r\n    type: undefined,\r\n    required: true\r\n  },\r\n  type: {\r\n    type: String,\r\n    default: \"radio\",\r\n    validator: (val) => [\"radio\", \"checkbox\"].includes(val)\r\n  },\r\n  label: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  options: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  /**\r\n   * Controls the size of the label and options; corresponds to standard fluid body text sizes\r\n   * @values base, lg, xl\r\n   */\r\n  size: {\r\n    type: String,\r\n    default: \"base\",\r\n    validator: (val) => [\"base\", \"lg\", \"xl\"].includes(val)\r\n  },\r\n  required: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  error: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  errorMessage: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  /**\r\n   * The Vuelidate validation object for this field. Use this to automatically set the error state and errorMessage.\r\n   * The `errorMessage` prop will override any error messages from this prop if both are set.\r\n   */\r\n  vuelidate: {\r\n    type: Object,\r\n    default: () => undefined\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => {\r\n    emit(\"update:modelValue\", value);\r\n  }\r\n});\r\n\r\nconst slots = useSlots();\r\n\r\nconst errorMessageId = getId();\r\nconst hasVuelidateError = computed(() => !!props.vuelidate?.$error);\r\nconst hasError = computed(() => props.error || hasVuelidateError.value);\r\nconst hasErrorMessage = computed(() => (props.error && (props.errorMessage || slots.errorMessage)) || hasVuelidateError.value);\r\n</script>\r\n\r\n<template>\r\n  <fieldset\r\n    class=\"md:max-h-72 md:overflow-y-auto\"\r\n    :aria-required=\"props.required\"\r\n    :aria-invalid=\"hasError\"\r\n    :aria-errormessage=\"hasErrorMessage ? errorMessageId : false\"\r\n  >\r\n    <legend v-if=\"props.label\" class=\"mb-f2 flex flex-row flex-wrap items-baseline gap-f1\">\r\n      <span>{{ label }}</span>\r\n      <span v-if=\"props.required\" class=\"text-body-xs text-neutral-50\">(Required)</span>\r\n    </legend>\r\n    <div class=\"flex flex-col gap-f2 pr-2\">\r\n      <FhOptionGroupItems\r\n        v-for=\"option in props.options\"\r\n        :key=\"option.value\"\r\n        v-model=\"value\"\r\n        :option=\"option\"\r\n        :type=\"props.type\"\r\n        :size=\"props.size\"\r\n        :vuelidate=\"props.vuelidate\"\r\n      >\r\n        <template #label>\r\n          <div class=\"mr-f3 whitespace-nowrap\">{{ option.label }}</div>\r\n        </template>\r\n        <template #count>\r\n          <div class=\"w-6 text-right text-xs\" :class=\"{ 'text-neutral-50': !option.selected }\">{{ option.count }}</div>\r\n        </template>\r\n      </FhOptionGroupItems>\r\n    </div>\r\n    <div v-if=\"hasErrorMessage\" :id=\"errorMessageId\" class=\"text-body-sm mt-f2 max-w-prose text-brand-red\">\r\n      <slot name=\"errorMessage\">\r\n        <template v-if=\"props.errorMessage\">{{ props.errorMessage }}</template>\r\n        <template v-else-if=\"hasVuelidateError\">\r\n          <div v-for=\"errObj of props.vuelidate.$errors\" :key=\"errObj.$uid\">{{ errObj.$message }}</div>\r\n        </template>\r\n      </slot>\r\n    </div>\r\n  </fieldset>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhOptionGroup from \"./FhOptionGroup.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  options: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  facetCounts: {\r\n    type: Object,\r\n    default: () => ({})\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst selectedOptions = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\nconst facetCountValues = computed(() => props.facetCounts.values);\r\n\r\nconst filterOptions = computed(() => {\r\n  return props.options\r\n    .filter((opt) => {\r\n      // Remove filter options with a facet count of 0 and hideNoResults=true\r\n      const hasFacetCount = facetCountValues.value.find((facetCount) => facetCount.key === opt.value);\r\n      return hasFacetCount || !opt.hideNoResults;\r\n    })\r\n    .map(buildFilterOptions);\r\n});\r\n\r\nconst getFacetCounts = (facet) => {\r\n  const counts = facetCountValues.value.find((facetValues) => facetValues.key === facet);\r\n  return counts?.value;\r\n};\r\n\r\nconst buildFilterOptions = (filterOption) => {\r\n  return {\r\n    value: filterOption.value,\r\n    label: filterOption.label,\r\n    selected: selectedOptions.value.includes(filterOption.value),\r\n    count: getFacetCounts(filterOption.value) || 0,\r\n    disabled: !getFacetCounts(filterOption.value),\r\n    options: filterOption?.options ? filterOption?.options.map(buildFilterOptions) : []\r\n  };\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhOptionGroup v-model=\"selectedOptions\" type=\"checkbox\" :options=\"filterOptions\" size=\"lg\"></FhOptionGroup>\r\n</template>\r\n","// Types\n// eslint-disable-line vue/prefer-import-from-vue\n\n/**\n * Creates a factory function for props definitions.\n * This is used to define props in a composable then override\n * default values in an implementing component.\n *\n * @example Simplified signature\n * (props: Props) => (defaults?: Record<keyof props, any>) => Props\n *\n * @example Usage\n * const makeProps = propsFactory({\n *   foo: String,\n * })\n *\n * defineComponent({\n *   props: {\n *     ...makeProps({\n *       foo: 'a',\n *     }),\n *   },\n *   setup (props) {\n *     // would be \"string | undefined\", now \"string\" because a default has been provided\n *     props.foo\n *   },\n * }\n */\n\nexport function propsFactory(props, source) {\n  return defaults => {\n    return Object.keys(props).reduce((obj, prop) => {\n      const isObjectDefinition = typeof props[prop] === 'object' && props[prop] != null && !Array.isArray(props[prop]);\n      const definition = isObjectDefinition ? props[prop] : {\n        type: props[prop]\n      };\n      if (defaults && prop in defaults) {\n        obj[prop] = {\n          ...definition,\n          default: defaults[prop]\n        };\n      } else {\n        obj[prop] = definition;\n      }\n      if (source && !obj[prop].source) {\n        obj[prop].source = source;\n      }\n      return obj;\n    }, {});\n  };\n}\n\n/**\n * Like `Partial<T>` but doesn't care what the value is\n */\n\n// Copied from Vue\n//# sourceMappingURL=propsFactory.mjs.map","// Utilities\nimport { propsFactory } from \"../util/propsFactory.mjs\"; // Types\n// Composables\nexport const makeComponentProps = propsFactory({\n  class: [String, Array, Object],\n  style: {\n    type: [String, Array, Object],\n    default: null\n  }\n}, 'component');\n//# sourceMappingURL=component.mjs.map","export const IN_BROWSER = typeof window !== 'undefined';\nexport const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;\nexport const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);\nexport const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;\n//# sourceMappingURL=globals.mjs.map","function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }\nfunction _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); } }\nfunction _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }\nfunction _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }\nfunction _assertClassBrand(e, t, n) { if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError(\"Private element is not present on this object\"); }\n// Utilities\nimport { capitalize, Comment, computed, Fragment, isVNode, reactive, readonly, shallowRef, toRefs, unref, watchEffect } from 'vue';\nimport { IN_BROWSER } from \"./globals.mjs\"; // Types\nexport function getNestedValue(obj, path, fallback) {\n  const last = path.length - 1;\n  if (last < 0) return obj === undefined ? fallback : obj;\n  for (let i = 0; i < last; i++) {\n    if (obj == null) {\n      return fallback;\n    }\n    obj = obj[path[i]];\n  }\n  if (obj == null) return fallback;\n  return obj[path[last]] === undefined ? fallback : obj[path[last]];\n}\nexport function deepEqual(a, b) {\n  if (a === b) return true;\n  if (a instanceof Date && b instanceof Date && a.getTime() !== b.getTime()) {\n    // If the values are Date, compare them as timestamps\n    return false;\n  }\n  if (a !== Object(a) || b !== Object(b)) {\n    // If the values aren't objects, they were already checked for equality\n    return false;\n  }\n  const props = Object.keys(a);\n  if (props.length !== Object.keys(b).length) {\n    // Different number of props, don't bother to check\n    return false;\n  }\n  return props.every(p => deepEqual(a[p], b[p]));\n}\nexport function getObjectValueByPath(obj, path, fallback) {\n  // credit: http://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-string-key#comment55278413_6491621\n  if (obj == null || !path || typeof path !== 'string') return fallback;\n  if (obj[path] !== undefined) return obj[path];\n  path = path.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties\n  path = path.replace(/^\\./, ''); // strip a leading dot\n  return getNestedValue(obj, path.split('.'), fallback);\n}\nexport function getPropertyFromItem(item, property, fallback) {\n  if (property === true) return item === undefined ? fallback : item;\n  if (property == null || typeof property === 'boolean') return fallback;\n  if (item !== Object(item)) {\n    if (typeof property !== 'function') return fallback;\n    const value = property(item, fallback);\n    return typeof value === 'undefined' ? fallback : value;\n  }\n  if (typeof property === 'string') return getObjectValueByPath(item, property, fallback);\n  if (Array.isArray(property)) return getNestedValue(item, property, fallback);\n  if (typeof property !== 'function') return fallback;\n  const value = property(item, fallback);\n  return typeof value === 'undefined' ? fallback : value;\n}\nexport function createRange(length) {\n  let start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  return Array.from({\n    length\n  }, (v, k) => start + k);\n}\nexport function getZIndex(el) {\n  if (!el || el.nodeType !== Node.ELEMENT_NODE) return 0;\n  const index = +window.getComputedStyle(el).getPropertyValue('z-index');\n  if (!index) return getZIndex(el.parentNode);\n  return index;\n}\nexport function convertToUnit(str) {\n  let unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'px';\n  if (str == null || str === '') {\n    return undefined;\n  } else if (isNaN(+str)) {\n    return String(str);\n  } else if (!isFinite(+str)) {\n    return undefined;\n  } else {\n    return `${Number(str)}${unit}`;\n  }\n}\nexport function isObject(obj) {\n  return obj !== null && typeof obj === 'object' && !Array.isArray(obj);\n}\nexport function refElement(obj) {\n  if (obj && '$el' in obj) {\n    const el = obj.$el;\n    if (el?.nodeType === Node.TEXT_NODE) {\n      // Multi-root component, use the first element\n      return el.nextElementSibling;\n    }\n    return el;\n  }\n  return obj;\n}\n\n// KeyboardEvent.keyCode aliases\nexport const keyCodes = Object.freeze({\n  enter: 13,\n  tab: 9,\n  delete: 46,\n  esc: 27,\n  space: 32,\n  up: 38,\n  down: 40,\n  left: 37,\n  right: 39,\n  end: 35,\n  home: 36,\n  del: 46,\n  backspace: 8,\n  insert: 45,\n  pageup: 33,\n  pagedown: 34,\n  shift: 16\n});\nexport const keyValues = Object.freeze({\n  enter: 'Enter',\n  tab: 'Tab',\n  delete: 'Delete',\n  esc: 'Escape',\n  space: 'Space',\n  up: 'ArrowUp',\n  down: 'ArrowDown',\n  left: 'ArrowLeft',\n  right: 'ArrowRight',\n  end: 'End',\n  home: 'Home',\n  del: 'Delete',\n  backspace: 'Backspace',\n  insert: 'Insert',\n  pageup: 'PageUp',\n  pagedown: 'PageDown',\n  shift: 'Shift'\n});\nexport function keys(o) {\n  return Object.keys(o);\n}\nexport function has(obj, key) {\n  return key.every(k => obj.hasOwnProperty(k));\n}\n// Array of keys\nexport function pick(obj, paths) {\n  const found = {};\n  const keys = new Set(Object.keys(obj));\n  for (const path of paths) {\n    if (keys.has(path)) {\n      found[path] = obj[path];\n    }\n  }\n  return found;\n}\n\n// Array of keys\n\n// Array of keys or RegExp to test keys against\n\nexport function pickWithRest(obj, paths, exclude) {\n  const found = Object.create(null);\n  const rest = Object.create(null);\n  for (const key in obj) {\n    if (paths.some(path => path instanceof RegExp ? path.test(key) : path === key) && !exclude?.some(path => path === key)) {\n      found[key] = obj[key];\n    } else {\n      rest[key] = obj[key];\n    }\n  }\n  return [found, rest];\n}\nexport function omit(obj, exclude) {\n  const clone = {\n    ...obj\n  };\n  exclude.forEach(prop => delete clone[prop]);\n  return clone;\n}\nexport function only(obj, include) {\n  const clone = {};\n  include.forEach(prop => clone[prop] = obj[prop]);\n  return clone;\n}\nconst onRE = /^on[^a-z]/;\nexport const isOn = key => onRE.test(key);\nconst bubblingEvents = ['onAfterscriptexecute', 'onAnimationcancel', 'onAnimationend', 'onAnimationiteration', 'onAnimationstart', 'onAuxclick', 'onBeforeinput', 'onBeforescriptexecute', 'onChange', 'onClick', 'onCompositionend', 'onCompositionstart', 'onCompositionupdate', 'onContextmenu', 'onCopy', 'onCut', 'onDblclick', 'onFocusin', 'onFocusout', 'onFullscreenchange', 'onFullscreenerror', 'onGesturechange', 'onGestureend', 'onGesturestart', 'onGotpointercapture', 'onInput', 'onKeydown', 'onKeypress', 'onKeyup', 'onLostpointercapture', 'onMousedown', 'onMousemove', 'onMouseout', 'onMouseover', 'onMouseup', 'onMousewheel', 'onPaste', 'onPointercancel', 'onPointerdown', 'onPointerenter', 'onPointerleave', 'onPointermove', 'onPointerout', 'onPointerover', 'onPointerup', 'onReset', 'onSelect', 'onSubmit', 'onTouchcancel', 'onTouchend', 'onTouchmove', 'onTouchstart', 'onTransitioncancel', 'onTransitionend', 'onTransitionrun', 'onTransitionstart', 'onWheel'];\nconst compositionIgnoreKeys = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft', 'Enter', 'Escape', 'Tab', ' '];\nexport function isComposingIgnoreKey(e) {\n  return e.isComposing && compositionIgnoreKeys.includes(e.key);\n}\n\n/**\n * Filter attributes that should be applied to\n * the root element of an input component. Remaining\n * attributes should be passed to the <input> element inside.\n */\nexport function filterInputAttrs(attrs) {\n  const [events, props] = pickWithRest(attrs, [onRE]);\n  const inputEvents = omit(events, bubblingEvents);\n  const [rootAttrs, inputAttrs] = pickWithRest(props, ['class', 'style', 'id', /^data-/]);\n  Object.assign(rootAttrs, events);\n  Object.assign(inputAttrs, inputEvents);\n  return [rootAttrs, inputAttrs];\n}\n\n/**\n * Returns the set difference of B and A, i.e. the set of elements in B but not in A\n */\nexport function arrayDiff(a, b) {\n  const diff = [];\n  for (let i = 0; i < b.length; i++) {\n    if (!a.includes(b[i])) diff.push(b[i]);\n  }\n  return diff;\n}\nexport function wrapInArray(v) {\n  return v == null ? [] : Array.isArray(v) ? v : [v];\n}\nexport function defaultFilter(value, search, item) {\n  return value != null && search != null && typeof value !== 'boolean' && value.toString().toLocaleLowerCase().indexOf(search.toLocaleLowerCase()) !== -1;\n}\nexport function debounce(fn, delay) {\n  let timeoutId = 0;\n  const wrap = function () {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(() => fn(...args), unref(delay));\n  };\n  wrap.clear = () => {\n    clearTimeout(timeoutId);\n  };\n  wrap.immediate = fn;\n  return wrap;\n}\nexport function throttle(fn, limit) {\n  let throttling = false;\n  return function () {\n    if (!throttling) {\n      throttling = true;\n      setTimeout(() => throttling = false, limit);\n      return fn(...arguments);\n    }\n  };\n}\nexport function clamp(value) {\n  let min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  let max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n  return Math.max(min, Math.min(max, value));\n}\nexport function getDecimals(value) {\n  const trimmedStr = value.toString().trim();\n  return trimmedStr.includes('.') ? trimmedStr.length - trimmedStr.indexOf('.') - 1 : 0;\n}\nexport function padEnd(str, length) {\n  let char = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '0';\n  return str + char.repeat(Math.max(0, length - str.length));\n}\nexport function padStart(str, length) {\n  let char = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '0';\n  return char.repeat(Math.max(0, length - str.length)) + str;\n}\nexport function chunk(str) {\n  let size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  const chunked = [];\n  let index = 0;\n  while (index < str.length) {\n    chunked.push(str.substr(index, size));\n    index += size;\n  }\n  return chunked;\n}\nexport function chunkArray(array) {\n  let size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  return Array.from({\n    length: Math.ceil(array.length / size)\n  }, (v, i) => array.slice(i * size, i * size + size));\n}\nexport function humanReadableFileSize(bytes) {\n  let base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n  if (bytes < base) {\n    return `${bytes} B`;\n  }\n  const prefix = base === 1024 ? ['Ki', 'Mi', 'Gi'] : ['k', 'M', 'G'];\n  let unit = -1;\n  while (Math.abs(bytes) >= base && unit < prefix.length - 1) {\n    bytes /= base;\n    ++unit;\n  }\n  return `${bytes.toFixed(1)} ${prefix[unit]}B`;\n}\nexport function mergeDeep() {\n  let source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  let target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  let arrayFn = arguments.length > 2 ? arguments[2] : undefined;\n  const out = {};\n  for (const key in source) {\n    out[key] = source[key];\n  }\n  for (const key in target) {\n    const sourceProperty = source[key];\n    const targetProperty = target[key];\n\n    // Only continue deep merging if\n    // both properties are objects\n    if (isObject(sourceProperty) && isObject(targetProperty)) {\n      out[key] = mergeDeep(sourceProperty, targetProperty, arrayFn);\n      continue;\n    }\n    if (Array.isArray(sourceProperty) && Array.isArray(targetProperty) && arrayFn) {\n      out[key] = arrayFn(sourceProperty, targetProperty);\n      continue;\n    }\n    out[key] = targetProperty;\n  }\n  return out;\n}\nexport function flattenFragments(nodes) {\n  return nodes.map(node => {\n    if (node.type === Fragment) {\n      return flattenFragments(node.children);\n    } else {\n      return node;\n    }\n  }).flat();\n}\nexport function toKebabCase() {\n  let str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n  if (toKebabCase.cache.has(str)) return toKebabCase.cache.get(str);\n  const kebab = str.replace(/[^a-z]/gi, '-').replace(/\\B([A-Z])/g, '-$1').toLowerCase();\n  toKebabCase.cache.set(str, kebab);\n  return kebab;\n}\ntoKebabCase.cache = new Map();\nexport function findChildrenWithProvide(key, vnode) {\n  if (!vnode || typeof vnode !== 'object') return [];\n  if (Array.isArray(vnode)) {\n    return vnode.map(child => findChildrenWithProvide(key, child)).flat(1);\n  } else if (Array.isArray(vnode.children)) {\n    return vnode.children.map(child => findChildrenWithProvide(key, child)).flat(1);\n  } else if (vnode.component) {\n    if (Object.getOwnPropertySymbols(vnode.component.provides).includes(key)) {\n      return [vnode.component];\n    } else if (vnode.component.subTree) {\n      return findChildrenWithProvide(key, vnode.component.subTree).flat(1);\n    }\n  }\n  return [];\n}\nvar _arr = /*#__PURE__*/new WeakMap();\nvar _pointer = /*#__PURE__*/new WeakMap();\nexport class CircularBuffer {\n  constructor(size) {\n    _classPrivateFieldInitSpec(this, _arr, []);\n    _classPrivateFieldInitSpec(this, _pointer, 0);\n    this.size = size;\n  }\n  push(val) {\n    _classPrivateFieldGet(_arr, this)[_classPrivateFieldGet(_pointer, this)] = val;\n    _classPrivateFieldSet(_pointer, this, (_classPrivateFieldGet(_pointer, this) + 1) % this.size);\n  }\n  values() {\n    return _classPrivateFieldGet(_arr, this).slice(_classPrivateFieldGet(_pointer, this)).concat(_classPrivateFieldGet(_arr, this).slice(0, _classPrivateFieldGet(_pointer, this)));\n  }\n}\nexport function getEventCoordinates(e) {\n  if ('touches' in e) {\n    return {\n      clientX: e.touches[0].clientX,\n      clientY: e.touches[0].clientY\n    };\n  }\n  return {\n    clientX: e.clientX,\n    clientY: e.clientY\n  };\n}\n\n// Only allow a single return type\n\n/**\n * Convert a computed ref to a record of refs.\n * The getter function must always return an object with the same keys.\n */\n\nexport function destructComputed(getter) {\n  const refs = reactive({});\n  const base = computed(getter);\n  watchEffect(() => {\n    for (const key in base.value) {\n      refs[key] = base.value[key];\n    }\n  }, {\n    flush: 'sync'\n  });\n  return toRefs(refs);\n}\n\n/** Array.includes but value can be any type */\nexport function includes(arr, val) {\n  return arr.includes(val);\n}\nexport function eventName(propName) {\n  return propName[2].toLowerCase() + propName.slice(3);\n}\nexport const EventProp = () => [Function, Array];\nexport function hasEvent(props, name) {\n  name = 'on' + capitalize(name);\n  return !!(props[name] || props[`${name}Once`] || props[`${name}Capture`] || props[`${name}OnceCapture`] || props[`${name}CaptureOnce`]);\n}\nexport function callEvent(handler) {\n  for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n    args[_key2 - 1] = arguments[_key2];\n  }\n  if (Array.isArray(handler)) {\n    for (const h of handler) {\n      h(...args);\n    }\n  } else if (typeof handler === 'function') {\n    handler(...args);\n  }\n}\nexport function focusableChildren(el) {\n  let filterByTabIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n  const targets = ['button', '[href]', 'input:not([type=\"hidden\"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}${filterByTabIndex ? ':not([tabindex=\"-1\"])' : ''}:not([disabled])`).join(', ');\n  return [...el.querySelectorAll(targets)];\n}\nexport function getNextElement(elements, location, condition) {\n  let _el;\n  let idx = elements.indexOf(document.activeElement);\n  const inc = location === 'next' ? 1 : -1;\n  do {\n    idx += inc;\n    _el = elements[idx];\n  } while ((!_el || _el.offsetParent == null || !(condition?.(_el) ?? true)) && idx < elements.length && idx >= 0);\n  return _el;\n}\nexport function focusChild(el, location) {\n  const focusable = focusableChildren(el);\n  if (!location) {\n    if (el === document.activeElement || !el.contains(document.activeElement)) {\n      focusable[0]?.focus();\n    }\n  } else if (location === 'first') {\n    focusable[0]?.focus();\n  } else if (location === 'last') {\n    focusable.at(-1)?.focus();\n  } else if (typeof location === 'number') {\n    focusable[location]?.focus();\n  } else {\n    const _el = getNextElement(focusable, location);\n    if (_el) _el.focus();else focusChild(el, location === 'next' ? 'first' : 'last');\n  }\n}\nexport function isEmpty(val) {\n  return val === null || val === undefined || typeof val === 'string' && val.trim() === '';\n}\nexport function noop() {}\n\n/** Returns null if the selector is not supported or we can't check */\nexport function matchesSelector(el, selector) {\n  const supportsSelector = IN_BROWSER && typeof CSS !== 'undefined' && typeof CSS.supports !== 'undefined' && CSS.supports(`selector(${selector})`);\n  if (!supportsSelector) return null;\n  try {\n    return !!el && el.matches(selector);\n  } catch (err) {\n    return null;\n  }\n}\nexport function ensureValidVNode(vnodes) {\n  return vnodes.some(child => {\n    if (!isVNode(child)) return true;\n    if (child.type === Comment) return false;\n    return child.type !== Fragment || ensureValidVNode(child.children);\n  }) ? vnodes : null;\n}\nexport function defer(timeout, cb) {\n  if (!IN_BROWSER || timeout === 0) {\n    cb();\n    return () => {};\n  }\n  const timeoutId = window.setTimeout(cb, timeout);\n  return () => window.clearTimeout(timeoutId);\n}\nexport function eagerComputed(fn, options) {\n  const result = shallowRef();\n  watchEffect(() => {\n    result.value = fn();\n  }, {\n    flush: 'sync',\n    ...options\n  });\n  return readonly(result);\n}\nexport function isClickInsideElement(event, targetDiv) {\n  const mouseX = event.clientX;\n  const mouseY = event.clientY;\n  const divRect = targetDiv.getBoundingClientRect();\n  const divLeft = divRect.left;\n  const divTop = divRect.top;\n  const divRight = divRect.right;\n  const divBottom = divRect.bottom;\n  return mouseX >= divLeft && mouseX <= divRight && mouseY >= divTop && mouseY <= divBottom;\n}\nexport function templateRef() {\n  const el = shallowRef();\n  const fn = target => {\n    el.value = target;\n  };\n  Object.defineProperty(fn, 'value', {\n    enumerable: true,\n    get: () => el.value,\n    set: val => el.value = val\n  });\n  Object.defineProperty(fn, 'el', {\n    enumerable: true,\n    get: () => refElement(el.value)\n  });\n  return fn;\n}\n//# sourceMappingURL=helpers.mjs.map","/**\n * WCAG 3.0 APCA perceptual contrast algorithm from https://github.com/Myndex/SAPC-APCA\n * @licence https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n * @see https://www.w3.org/WAI/GL/task-forces/silver/wiki/Visual_Contrast_of_Text_Subgroup\n */\n// Types\n\n// MAGICAL NUMBERS\n\n// sRGB Conversion to Relative Luminance (Y)\n\n// Transfer Curve (aka \"Gamma\") for sRGB linearization\n// Simple power curve vs piecewise described in docs\n// Essentially, 2.4 best models actual display\n// characteristics in combination with the total method\nconst mainTRC = 2.4;\nconst Rco = 0.2126729; // sRGB Red Coefficient (from matrix)\nconst Gco = 0.7151522; // sRGB Green Coefficient (from matrix)\nconst Bco = 0.0721750; // sRGB Blue Coefficient (from matrix)\n\n// For Finding Raw SAPC Contrast from Relative Luminance (Y)\n\n// Constants for SAPC Power Curve Exponents\n// One pair for normal text, and one for reverse\n// These are the \"beating heart\" of SAPC\nconst normBG = 0.55;\nconst normTXT = 0.58;\nconst revTXT = 0.57;\nconst revBG = 0.62;\n\n// For Clamping and Scaling Values\n\nconst blkThrs = 0.03; // Level that triggers the soft black clamp\nconst blkClmp = 1.45; // Exponent for the soft black clamp curve\nconst deltaYmin = 0.0005; // Lint trap\nconst scaleBoW = 1.25; // Scaling for dark text on light\nconst scaleWoB = 1.25; // Scaling for light text on dark\nconst loConThresh = 0.078; // Threshold for new simple offset scale\nconst loConFactor = 12.82051282051282; // = 1/0.078,\nconst loConOffset = 0.06; // The simple offset\nconst loClip = 0.001; // Output clip (lint trap #2)\n\nexport function APCAcontrast(text, background) {\n  // Linearize sRGB\n  const Rtxt = (text.r / 255) ** mainTRC;\n  const Gtxt = (text.g / 255) ** mainTRC;\n  const Btxt = (text.b / 255) ** mainTRC;\n  const Rbg = (background.r / 255) ** mainTRC;\n  const Gbg = (background.g / 255) ** mainTRC;\n  const Bbg = (background.b / 255) ** mainTRC;\n\n  // Apply the standard coefficients and sum to Y\n  let Ytxt = Rtxt * Rco + Gtxt * Gco + Btxt * Bco;\n  let Ybg = Rbg * Rco + Gbg * Gco + Bbg * Bco;\n\n  // Soft clamp Y when near black.\n  // Now clamping all colors to prevent crossover errors\n  if (Ytxt <= blkThrs) Ytxt += (blkThrs - Ytxt) ** blkClmp;\n  if (Ybg <= blkThrs) Ybg += (blkThrs - Ybg) ** blkClmp;\n\n  // Return 0 Early for extremely low ∆Y (lint trap #1)\n  if (Math.abs(Ybg - Ytxt) < deltaYmin) return 0.0;\n\n  // SAPC CONTRAST\n\n  let outputContrast; // For weighted final values\n  if (Ybg > Ytxt) {\n    // For normal polarity, black text on white\n    // Calculate the SAPC contrast value and scale\n\n    const SAPC = (Ybg ** normBG - Ytxt ** normTXT) * scaleBoW;\n\n    // NEW! SAPC SmoothScale™\n    // Low Contrast Smooth Scale Rollout to prevent polarity reversal\n    // and also a low clip for very low contrasts (lint trap #2)\n    // much of this is for very low contrasts, less than 10\n    // therefore for most reversing needs, only loConOffset is important\n    outputContrast = SAPC < loClip ? 0.0 : SAPC < loConThresh ? SAPC - SAPC * loConFactor * loConOffset : SAPC - loConOffset;\n  } else {\n    // For reverse polarity, light text on dark\n    // WoB should always return negative value.\n\n    const SAPC = (Ybg ** revBG - Ytxt ** revTXT) * scaleWoB;\n    outputContrast = SAPC > -loClip ? 0.0 : SAPC > -loConThresh ? SAPC - SAPC * loConFactor * loConOffset : SAPC + loConOffset;\n  }\n  return outputContrast * 100;\n}\n//# sourceMappingURL=APCA.mjs.map","// Types\n\nconst delta = 0.20689655172413793; // 6÷29\n\nconst cielabForwardTransform = t => t > delta ** 3 ? Math.cbrt(t) : t / (3 * delta ** 2) + 4 / 29;\nconst cielabReverseTransform = t => t > delta ? t ** 3 : 3 * delta ** 2 * (t - 4 / 29);\nexport function fromXYZ(xyz) {\n  const transform = cielabForwardTransform;\n  const transformedY = transform(xyz[1]);\n  return [116 * transformedY - 16, 500 * (transform(xyz[0] / 0.95047) - transformedY), 200 * (transformedY - transform(xyz[2] / 1.08883))];\n}\nexport function toXYZ(lab) {\n  const transform = cielabReverseTransform;\n  const Ln = (lab[0] + 16) / 116;\n  return [transform(Ln + lab[1] / 500) * 0.95047, transform(Ln), transform(Ln - lab[2] / 200) * 1.08883];\n}\n//# sourceMappingURL=transformCIELAB.mjs.map","// Utilities\nimport { clamp } from \"../helpers.mjs\"; // Types\n// For converting XYZ to sRGB\nconst srgbForwardMatrix = [[3.2406, -1.5372, -0.4986], [-0.9689, 1.8758, 0.0415], [0.0557, -0.2040, 1.0570]];\n\n// Forward gamma adjust\nconst srgbForwardTransform = C => C <= 0.0031308 ? C * 12.92 : 1.055 * C ** (1 / 2.4) - 0.055;\n\n// For converting sRGB to XYZ\nconst srgbReverseMatrix = [[0.4124, 0.3576, 0.1805], [0.2126, 0.7152, 0.0722], [0.0193, 0.1192, 0.9505]];\n\n// Reverse gamma adjust\nconst srgbReverseTransform = C => C <= 0.04045 ? C / 12.92 : ((C + 0.055) / 1.055) ** 2.4;\nexport function fromXYZ(xyz) {\n  const rgb = Array(3);\n  const transform = srgbForwardTransform;\n  const matrix = srgbForwardMatrix;\n\n  // Matrix transform, then gamma adjustment\n  for (let i = 0; i < 3; ++i) {\n    // Rescale back to [0, 255]\n    rgb[i] = Math.round(clamp(transform(matrix[i][0] * xyz[0] + matrix[i][1] * xyz[1] + matrix[i][2] * xyz[2])) * 255);\n  }\n  return {\n    r: rgb[0],\n    g: rgb[1],\n    b: rgb[2]\n  };\n}\nexport function toXYZ(_ref) {\n  let {\n    r,\n    g,\n    b\n  } = _ref;\n  const xyz = [0, 0, 0];\n  const transform = srgbReverseTransform;\n  const matrix = srgbReverseMatrix;\n\n  // Rescale from [0, 255] to [0, 1] then adjust sRGB gamma to linear RGB\n  r = transform(r / 255);\n  g = transform(g / 255);\n  b = transform(b / 255);\n\n  // Matrix color space transform\n  for (let i = 0; i < 3; ++i) {\n    xyz[i] = matrix[i][0] * r + matrix[i][1] * g + matrix[i][2] * b;\n  }\n  return xyz;\n}\n//# sourceMappingURL=transformSRGB.mjs.map","// Utilities\nimport { APCAcontrast } from \"./color/APCA.mjs\";\nimport { consoleWarn } from \"./console.mjs\";\nimport { chunk, has, padEnd } from \"./helpers.mjs\";\nimport * as CIELAB from \"./color/transformCIELAB.mjs\";\nimport * as sRGB from \"./color/transformSRGB.mjs\"; // Types\nexport function isCssColor(color) {\n  return !!color && /^(#|var\\(--|(rgb|hsl)a?\\()/.test(color);\n}\nexport function isParsableColor(color) {\n  return isCssColor(color) && !/^((rgb|hsl)a?\\()?var\\(--/.test(color);\n}\nconst cssColorRe = /^(?<fn>(?:rgb|hsl)a?)\\((?<values>.+)\\)/;\nconst mappers = {\n  rgb: (r, g, b, a) => ({\n    r,\n    g,\n    b,\n    a\n  }),\n  rgba: (r, g, b, a) => ({\n    r,\n    g,\n    b,\n    a\n  }),\n  hsl: (h, s, l, a) => HSLtoRGB({\n    h,\n    s,\n    l,\n    a\n  }),\n  hsla: (h, s, l, a) => HSLtoRGB({\n    h,\n    s,\n    l,\n    a\n  }),\n  hsv: (h, s, v, a) => HSVtoRGB({\n    h,\n    s,\n    v,\n    a\n  }),\n  hsva: (h, s, v, a) => HSVtoRGB({\n    h,\n    s,\n    v,\n    a\n  })\n};\nexport function parseColor(color) {\n  if (typeof color === 'number') {\n    if (isNaN(color) || color < 0 || color > 0xFFFFFF) {\n      // int can't have opacity\n      consoleWarn(`'${color}' is not a valid hex color`);\n    }\n    return {\n      r: (color & 0xFF0000) >> 16,\n      g: (color & 0xFF00) >> 8,\n      b: color & 0xFF\n    };\n  } else if (typeof color === 'string' && cssColorRe.test(color)) {\n    const {\n      groups\n    } = color.match(cssColorRe);\n    const {\n      fn,\n      values\n    } = groups;\n    const realValues = values.split(/,\\s*/).map(v => {\n      if (v.endsWith('%') && ['hsl', 'hsla', 'hsv', 'hsva'].includes(fn)) {\n        return parseFloat(v) / 100;\n      } else {\n        return parseFloat(v);\n      }\n    });\n    return mappers[fn](...realValues);\n  } else if (typeof color === 'string') {\n    let hex = color.startsWith('#') ? color.slice(1) : color;\n    if ([3, 4].includes(hex.length)) {\n      hex = hex.split('').map(char => char + char).join('');\n    } else if (![6, 8].includes(hex.length)) {\n      consoleWarn(`'${color}' is not a valid hex(a) color`);\n    }\n    const int = parseInt(hex, 16);\n    if (isNaN(int) || int < 0 || int > 0xFFFFFFFF) {\n      consoleWarn(`'${color}' is not a valid hex(a) color`);\n    }\n    return HexToRGB(hex);\n  } else if (typeof color === 'object') {\n    if (has(color, ['r', 'g', 'b'])) {\n      return color;\n    } else if (has(color, ['h', 's', 'l'])) {\n      return HSVtoRGB(HSLtoHSV(color));\n    } else if (has(color, ['h', 's', 'v'])) {\n      return HSVtoRGB(color);\n    }\n  }\n  throw new TypeError(`Invalid color: ${color == null ? color : String(color) || color.constructor.name}\\nExpected #hex, #hexa, rgb(), rgba(), hsl(), hsla(), object or number`);\n}\nexport function RGBToInt(color) {\n  return (color.r << 16) + (color.g << 8) + color.b;\n}\nexport function classToHex(color, colors, currentTheme) {\n  const [colorName, colorModifier] = color.toString().trim().replace('-', '').split(' ', 2);\n  let hexColor = '';\n  if (colorName && colorName in colors) {\n    if (colorModifier && colorModifier in colors[colorName]) {\n      hexColor = colors[colorName][colorModifier];\n    } else if ('base' in colors[colorName]) {\n      hexColor = colors[colorName].base;\n    }\n  } else if (colorName && colorName in currentTheme) {\n    hexColor = currentTheme[colorName];\n  }\n  return hexColor;\n}\n\n/** Converts HSVA to RGBA. Based on formula from https://en.wikipedia.org/wiki/HSL_and_HSV */\nexport function HSVtoRGB(hsva) {\n  const {\n    h,\n    s,\n    v,\n    a\n  } = hsva;\n  const f = n => {\n    const k = (n + h / 60) % 6;\n    return v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n  };\n  const rgb = [f(5), f(3), f(1)].map(v => Math.round(v * 255));\n  return {\n    r: rgb[0],\n    g: rgb[1],\n    b: rgb[2],\n    a\n  };\n}\nexport function HSLtoRGB(hsla) {\n  return HSVtoRGB(HSLtoHSV(hsla));\n}\n\n/** Converts RGBA to HSVA. Based on formula from https://en.wikipedia.org/wiki/HSL_and_HSV */\nexport function RGBtoHSV(rgba) {\n  if (!rgba) return {\n    h: 0,\n    s: 1,\n    v: 1,\n    a: 1\n  };\n  const r = rgba.r / 255;\n  const g = rgba.g / 255;\n  const b = rgba.b / 255;\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  let h = 0;\n  if (max !== min) {\n    if (max === r) {\n      h = 60 * (0 + (g - b) / (max - min));\n    } else if (max === g) {\n      h = 60 * (2 + (b - r) / (max - min));\n    } else if (max === b) {\n      h = 60 * (4 + (r - g) / (max - min));\n    }\n  }\n  if (h < 0) h = h + 360;\n  const s = max === 0 ? 0 : (max - min) / max;\n  const hsv = [h, s, max];\n  return {\n    h: hsv[0],\n    s: hsv[1],\n    v: hsv[2],\n    a: rgba.a\n  };\n}\nexport function HSVtoHSL(hsva) {\n  const {\n    h,\n    s,\n    v,\n    a\n  } = hsva;\n  const l = v - v * s / 2;\n  const sprime = l === 1 || l === 0 ? 0 : (v - l) / Math.min(l, 1 - l);\n  return {\n    h,\n    s: sprime,\n    l,\n    a\n  };\n}\nexport function HSLtoHSV(hsl) {\n  const {\n    h,\n    s,\n    l,\n    a\n  } = hsl;\n  const v = l + s * Math.min(l, 1 - l);\n  const sprime = v === 0 ? 0 : 2 - 2 * l / v;\n  return {\n    h,\n    s: sprime,\n    v,\n    a\n  };\n}\nexport function RGBtoCSS(_ref) {\n  let {\n    r,\n    g,\n    b,\n    a\n  } = _ref;\n  return a === undefined ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${a})`;\n}\nexport function HSVtoCSS(hsva) {\n  return RGBtoCSS(HSVtoRGB(hsva));\n}\nfunction toHex(v) {\n  const h = Math.round(v).toString(16);\n  return ('00'.substr(0, 2 - h.length) + h).toUpperCase();\n}\nexport function RGBtoHex(_ref2) {\n  let {\n    r,\n    g,\n    b,\n    a\n  } = _ref2;\n  return `#${[toHex(r), toHex(g), toHex(b), a !== undefined ? toHex(Math.round(a * 255)) : ''].join('')}`;\n}\nexport function HexToRGB(hex) {\n  hex = parseHex(hex);\n  let [r, g, b, a] = chunk(hex, 2).map(c => parseInt(c, 16));\n  a = a === undefined ? a : a / 255;\n  return {\n    r,\n    g,\n    b,\n    a\n  };\n}\nexport function HexToHSV(hex) {\n  const rgb = HexToRGB(hex);\n  return RGBtoHSV(rgb);\n}\nexport function HSVtoHex(hsva) {\n  return RGBtoHex(HSVtoRGB(hsva));\n}\nexport function parseHex(hex) {\n  if (hex.startsWith('#')) {\n    hex = hex.slice(1);\n  }\n  hex = hex.replace(/([^0-9a-f])/gi, 'F');\n  if (hex.length === 3 || hex.length === 4) {\n    hex = hex.split('').map(x => x + x).join('');\n  }\n  if (hex.length !== 6) {\n    hex = padEnd(padEnd(hex, 6), 8, 'F');\n  }\n  return hex;\n}\nexport function parseGradient(gradient, colors, currentTheme) {\n  return gradient.replace(/([a-z]+(\\s[a-z]+-[1-5])?)(?=$|,)/gi, x => {\n    return classToHex(x, colors, currentTheme) || x;\n  }).replace(/(rgba\\()#[0-9a-f]+(?=,)/gi, x => {\n    return 'rgba(' + Object.values(HexToRGB(parseHex(x.replace(/rgba\\(/, '')))).slice(0, 3).join(',');\n  });\n}\nexport function lighten(value, amount) {\n  const lab = CIELAB.fromXYZ(sRGB.toXYZ(value));\n  lab[0] = lab[0] + amount * 10;\n  return sRGB.fromXYZ(CIELAB.toXYZ(lab));\n}\nexport function darken(value, amount) {\n  const lab = CIELAB.fromXYZ(sRGB.toXYZ(value));\n  lab[0] = lab[0] - amount * 10;\n  return sRGB.fromXYZ(CIELAB.toXYZ(lab));\n}\n\n/**\n * Calculate the relative luminance of a given color\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\nexport function getLuma(color) {\n  const rgb = parseColor(color);\n  return sRGB.toXYZ(rgb)[1];\n}\n\n/**\n * Returns the contrast ratio (1-21) between two colors.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function getContrast(first, second) {\n  const l1 = getLuma(first);\n  const l2 = getLuma(second);\n  const light = Math.max(l1, l2);\n  const dark = Math.min(l1, l2);\n  return (light + 0.05) / (dark + 0.05);\n}\nexport function getForeground(color) {\n  const blackContrast = Math.abs(APCAcontrast(parseColor(0), parseColor(color)));\n  const whiteContrast = Math.abs(APCAcontrast(parseColor(0xffffff), parseColor(color)));\n\n  // TODO: warn about poor color selections\n  // const contrastAsText = Math.abs(APCAcontrast(colorVal, colorToInt(theme.colors.background)))\n  // const minContrast = Math.max(blackContrast, whiteContrast)\n  // if (minContrast < 60) {\n  //   consoleInfo(`${key} theme color ${color} has poor contrast (${minContrast.toFixed()}%)`)\n  // } else if (contrastAsText < 60 && !['background', 'surface'].includes(color)) {\n  //   consoleInfo(`${key} theme color ${color} has poor contrast as text (${contrastAsText.toFixed()}%)`)\n  // }\n\n  // Prefer white text if both have an acceptable contrast ratio\n  return whiteContrast > Math.min(blackContrast, 50) ? '#fff' : '#000';\n}\n//# sourceMappingURL=colorUtils.mjs.map","// Utilities\nimport { computed, inject, provide, ref, shallowRef, unref, watchEffect } from 'vue';\nimport { getCurrentInstance, injectSelf, mergeDeep, toKebabCase } from \"../util/index.mjs\"; // Types\nexport const DefaultsSymbol = Symbol.for('vuetify:defaults');\nexport function createDefaults(options) {\n  return ref(options);\n}\nexport function injectDefaults() {\n  const defaults = inject(DefaultsSymbol);\n  if (!defaults) throw new Error('[Vuetify] Could not find defaults instance');\n  return defaults;\n}\nexport function provideDefaults(defaults, options) {\n  const injectedDefaults = injectDefaults();\n  const providedDefaults = ref(defaults);\n  const newDefaults = computed(() => {\n    const disabled = unref(options?.disabled);\n    if (disabled) return injectedDefaults.value;\n    const scoped = unref(options?.scoped);\n    const reset = unref(options?.reset);\n    const root = unref(options?.root);\n    if (providedDefaults.value == null && !(scoped || reset || root)) return injectedDefaults.value;\n    let properties = mergeDeep(providedDefaults.value, {\n      prev: injectedDefaults.value\n    });\n    if (scoped) return properties;\n    if (reset || root) {\n      const len = Number(reset || Infinity);\n      for (let i = 0; i <= len; i++) {\n        if (!properties || !('prev' in properties)) {\n          break;\n        }\n        properties = properties.prev;\n      }\n      if (properties && typeof root === 'string' && root in properties) {\n        properties = mergeDeep(mergeDeep(properties, {\n          prev: properties\n        }), properties[root]);\n      }\n      return properties;\n    }\n    return properties.prev ? mergeDeep(properties.prev, properties) : properties;\n  });\n  provide(DefaultsSymbol, newDefaults);\n  return newDefaults;\n}\nfunction propIsDefined(vnode, prop) {\n  return typeof vnode.props?.[prop] !== 'undefined' || typeof vnode.props?.[toKebabCase(prop)] !== 'undefined';\n}\nexport function internalUseDefaults() {\n  let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  let name = arguments.length > 1 ? arguments[1] : undefined;\n  let defaults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : injectDefaults();\n  const vm = getCurrentInstance('useDefaults');\n  name = name ?? vm.type.name ?? vm.type.__name;\n  if (!name) {\n    throw new Error('[Vuetify] Could not determine component name');\n  }\n  const componentDefaults = computed(() => defaults.value?.[props._as ?? name]);\n  const _props = new Proxy(props, {\n    get(target, prop) {\n      const propValue = Reflect.get(target, prop);\n      if (prop === 'class' || prop === 'style') {\n        return [componentDefaults.value?.[prop], propValue].filter(v => v != null);\n      } else if (typeof prop === 'string' && !propIsDefined(vm.vnode, prop)) {\n        return componentDefaults.value?.[prop] ?? defaults.value?.global?.[prop] ?? propValue;\n      }\n      return propValue;\n    }\n  });\n  const _subcomponentDefaults = shallowRef();\n  watchEffect(() => {\n    if (componentDefaults.value) {\n      const subComponents = Object.entries(componentDefaults.value).filter(_ref => {\n        let [key] = _ref;\n        return key.startsWith(key[0].toUpperCase());\n      });\n      _subcomponentDefaults.value = subComponents.length ? Object.fromEntries(subComponents) : undefined;\n    } else {\n      _subcomponentDefaults.value = undefined;\n    }\n  });\n  function provideSubDefaults() {\n    const injected = injectSelf(DefaultsSymbol, vm);\n    provide(DefaultsSymbol, computed(() => {\n      return _subcomponentDefaults.value ? mergeDeep(injected?.value ?? {}, _subcomponentDefaults.value) : injected?.value;\n    }));\n  }\n  return {\n    props: _props,\n    provideSubDefaults\n  };\n}\nexport function useDefaults() {\n  let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  let name = arguments.length > 1 ? arguments[1] : undefined;\n  const {\n    props: _props,\n    provideSubDefaults\n  } = internalUseDefaults(props, name);\n  provideSubDefaults();\n  return _props;\n}\n//# sourceMappingURL=defaults.mjs.map","// Composables\nimport { injectDefaults, internalUseDefaults } from \"../composables/defaults.mjs\"; // Utilities\nimport { defineComponent as _defineComponent // eslint-disable-line no-restricted-imports\n} from 'vue';\nimport { consoleWarn } from \"./console.mjs\";\nimport { pick } from \"./helpers.mjs\";\nimport { propsFactory } from \"./propsFactory.mjs\"; // Types\n// No props\n// Object Props\n// Implementation\nexport function defineComponent(options) {\n  options._setup = options._setup ?? options.setup;\n  if (!options.name) {\n    consoleWarn('The component is missing an explicit name, unable to generate default prop value');\n    return options;\n  }\n  if (options._setup) {\n    options.props = propsFactory(options.props ?? {}, options.name)();\n    const propKeys = Object.keys(options.props).filter(key => key !== 'class' && key !== 'style');\n    options.filterProps = function filterProps(props) {\n      return pick(props, propKeys);\n    };\n    options.props._as = String;\n    options.setup = function setup(props, ctx) {\n      const defaults = injectDefaults();\n\n      // Skip props proxy if defaults are not provided\n      if (!defaults.value) return options._setup(props, ctx);\n      const {\n        props: _props,\n        provideSubDefaults\n      } = internalUseDefaults(props, props._as ?? options.name, defaults);\n      const setupBindings = options._setup(_props, ctx);\n      provideSubDefaults();\n      return setupBindings;\n    };\n  }\n  return options;\n}\n\n// No argument - simple default slot\n\n// Generic constructor argument - generic props and slots\n\n// Slots argument - simple slots\n\n// Implementation\nexport function genericComponent() {\n  let exposeDefaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n  return options => (exposeDefaults ? defineComponent : _defineComponent)(options);\n}\nexport function defineFunctionalComponent(props, render) {\n  render.props = props;\n  return render;\n}\n\n// Adds a filterProps method to the component options\n\n// https://github.com/vuejs/core/pull/10557\n\n// not a vue Component\n//# sourceMappingURL=defineComponent.mjs.map","// Utilities\nimport { getCurrentInstance as _getCurrentInstance } from 'vue';\nimport { toKebabCase } from \"./helpers.mjs\"; // Types\nexport function getCurrentInstance(name, message) {\n  const vm = _getCurrentInstance();\n  if (!vm) {\n    throw new Error(`[Vuetify] ${name} ${message || 'must be called from inside a setup function'}`);\n  }\n  return vm;\n}\nexport function getCurrentInstanceName() {\n  let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'composables';\n  const vm = getCurrentInstance(name).type;\n  return toKebabCase(vm?.aliasName || vm?.name);\n}\nlet _uid = 0;\nlet _map = new WeakMap();\nexport function getUid() {\n  const vm = getCurrentInstance('getUid');\n  if (_map.has(vm)) return _map.get(vm);else {\n    const uid = _uid++;\n    _map.set(vm, uid);\n    return uid;\n  }\n}\ngetUid.reset = () => {\n  _uid = 0;\n  _map = new WeakMap();\n};\n//# sourceMappingURL=getCurrentInstance.mjs.map","// Utilities\nimport { getCurrentInstance } from \"./getCurrentInstance.mjs\"; // Types\nexport function injectSelf(key) {\n  let vm = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstance('injectSelf');\n  const {\n    provides\n  } = vm;\n  if (provides && key in provides) {\n    // TS doesn't allow symbol as index type\n    return provides[key];\n  }\n  return undefined;\n}\n//# sourceMappingURL=injectSelf.mjs.map","// Utilities\nimport { getCurrentInstance } from \"./getCurrentInstance.mjs\"; // Types\nexport function useRender(render) {\n  const vm = getCurrentInstance('useRender');\n  vm.render = render;\n}\n//# sourceMappingURL=useRender.mjs.map","// Utilities\nimport { effectScope, onScopeDispose, watch } from 'vue';\n\n// Types\n\nexport function useToggleScope(source, fn) {\n  let scope;\n  function start() {\n    scope = effectScope();\n    scope.run(() => fn.length ? fn(() => {\n      scope?.stop();\n      start();\n    }) : fn());\n  }\n  watch(source, active => {\n    if (active && !scope) {\n      start();\n    } else if (!active) {\n      scope?.stop();\n      scope = undefined;\n    }\n  }, {\n    immediate: true\n  });\n  onScopeDispose(() => {\n    scope?.stop();\n  });\n}\n//# sourceMappingURL=toggleScope.mjs.map","// Composables\nimport { useToggleScope } from \"./toggleScope.mjs\"; // Utilities\nimport { computed, ref, toRaw, watch } from 'vue';\nimport { getCurrentInstance, toKebabCase } from \"../util/index.mjs\"; // Types\n// Composables\nexport function useProxiedModel(props, prop, defaultValue) {\n  let transformIn = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : v => v;\n  let transformOut = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : v => v;\n  const vm = getCurrentInstance('useProxiedModel');\n  const internal = ref(props[prop] !== undefined ? props[prop] : defaultValue);\n  const kebabProp = toKebabCase(prop);\n  const checkKebab = kebabProp !== prop;\n  const isControlled = checkKebab ? computed(() => {\n    void props[prop];\n    return !!((vm.vnode.props?.hasOwnProperty(prop) || vm.vnode.props?.hasOwnProperty(kebabProp)) && (vm.vnode.props?.hasOwnProperty(`onUpdate:${prop}`) || vm.vnode.props?.hasOwnProperty(`onUpdate:${kebabProp}`)));\n  }) : computed(() => {\n    void props[prop];\n    return !!(vm.vnode.props?.hasOwnProperty(prop) && vm.vnode.props?.hasOwnProperty(`onUpdate:${prop}`));\n  });\n  useToggleScope(() => !isControlled.value, () => {\n    watch(() => props[prop], val => {\n      internal.value = val;\n    });\n  });\n  const model = computed({\n    get() {\n      const externalValue = props[prop];\n      return transformIn(isControlled.value ? externalValue : internal.value);\n    },\n    set(internalValue) {\n      const newValue = transformOut(internalValue);\n      const value = toRaw(isControlled.value ? props[prop] : internal.value);\n      if (value === newValue || transformIn(value) === internalValue) {\n        return;\n      }\n      internal.value = newValue;\n      vm?.emit(`update:${prop}`, newValue);\n    }\n  });\n  Object.defineProperty(model, 'externalValue', {\n    get: () => isControlled.value ? props[prop] : internal.value\n  });\n  return model;\n}\n//# sourceMappingURL=proxiedModel.mjs.map","export default {\n  badge: 'Badge',\n  open: 'Open',\n  close: 'Close',\n  dismiss: 'Dismiss',\n  confirmEdit: {\n    ok: 'OK',\n    cancel: 'Cancel'\n  },\n  dataIterator: {\n    noResultsText: 'No matching records found',\n    loadingText: 'Loading items...'\n  },\n  dataTable: {\n    itemsPerPageText: 'Rows per page:',\n    ariaLabel: {\n      sortDescending: 'Sorted descending.',\n      sortAscending: 'Sorted ascending.',\n      sortNone: 'Not sorted.',\n      activateNone: 'Activate to remove sorting.',\n      activateDescending: 'Activate to sort descending.',\n      activateAscending: 'Activate to sort ascending.'\n    },\n    sortBy: 'Sort by'\n  },\n  dataFooter: {\n    itemsPerPageText: 'Items per page:',\n    itemsPerPageAll: 'All',\n    nextPage: 'Next page',\n    prevPage: 'Previous page',\n    firstPage: 'First page',\n    lastPage: 'Last page',\n    pageText: '{0}-{1} of {2}'\n  },\n  dateRangeInput: {\n    divider: 'to'\n  },\n  datePicker: {\n    itemsSelected: '{0} selected',\n    range: {\n      title: 'Select dates',\n      header: 'Enter dates'\n    },\n    title: 'Select date',\n    header: 'Enter date',\n    input: {\n      placeholder: 'Enter date'\n    }\n  },\n  noDataText: 'No data available',\n  carousel: {\n    prev: 'Previous visual',\n    next: 'Next visual',\n    ariaLabel: {\n      delimiter: 'Carousel slide {0} of {1}'\n    }\n  },\n  calendar: {\n    moreEvents: '{0} more',\n    today: 'Today'\n  },\n  input: {\n    clear: 'Clear {0}',\n    prependAction: '{0} prepended action',\n    appendAction: '{0} appended action',\n    otp: 'Please enter OTP character {0}'\n  },\n  fileInput: {\n    counter: '{0} files',\n    counterSize: '{0} files ({1} in total)'\n  },\n  timePicker: {\n    am: 'AM',\n    pm: 'PM',\n    title: 'Select Time'\n  },\n  pagination: {\n    ariaLabel: {\n      root: 'Pagination Navigation',\n      next: 'Next page',\n      previous: 'Previous page',\n      page: 'Go to page {0}',\n      currentPage: 'Page {0}, Current page',\n      first: 'First page',\n      last: 'Last page'\n    }\n  },\n  stepper: {\n    next: 'Next',\n    prev: 'Previous'\n  },\n  rating: {\n    ariaLabel: {\n      item: 'Rating {0} of {1}'\n    }\n  },\n  loading: 'Loading...',\n  infiniteScroll: {\n    loadMore: 'Load more',\n    empty: 'No more'\n  }\n};\n//# sourceMappingURL=en.mjs.map","// Composables\nimport { useProxiedModel } from \"../../composables/proxiedModel.mjs\"; // Utilities\nimport { ref, shallowRef, watch } from 'vue';\nimport { consoleError, consoleWarn, getObjectValueByPath } from \"../../util/index.mjs\"; // Locales\nimport en from \"../en.mjs\"; // Types\nconst LANG_PREFIX = '$vuetify.';\nconst replace = (str, params) => {\n  return str.replace(/\\{(\\d+)\\}/g, (match, index) => {\n    return String(params[+index]);\n  });\n};\nconst createTranslateFunction = (current, fallback, messages) => {\n  return function (key) {\n    for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      params[_key - 1] = arguments[_key];\n    }\n    if (!key.startsWith(LANG_PREFIX)) {\n      return replace(key, params);\n    }\n    const shortKey = key.replace(LANG_PREFIX, '');\n    const currentLocale = current.value && messages.value[current.value];\n    const fallbackLocale = fallback.value && messages.value[fallback.value];\n    let str = getObjectValueByPath(currentLocale, shortKey, null);\n    if (!str) {\n      consoleWarn(`Translation key \"${key}\" not found in \"${current.value}\", trying fallback locale`);\n      str = getObjectValueByPath(fallbackLocale, shortKey, null);\n    }\n    if (!str) {\n      consoleError(`Translation key \"${key}\" not found in fallback`);\n      str = key;\n    }\n    if (typeof str !== 'string') {\n      consoleError(`Translation key \"${key}\" has a non-string value`);\n      str = key;\n    }\n    return replace(str, params);\n  };\n};\nfunction createNumberFunction(current, fallback) {\n  return (value, options) => {\n    const numberFormat = new Intl.NumberFormat([current.value, fallback.value], options);\n    return numberFormat.format(value);\n  };\n}\nfunction useProvided(props, prop, provided) {\n  const internal = useProxiedModel(props, prop, props[prop] ?? provided.value);\n\n  // TODO: Remove when defaultValue works\n  internal.value = props[prop] ?? provided.value;\n  watch(provided, v => {\n    if (props[prop] == null) {\n      internal.value = provided.value;\n    }\n  });\n  return internal;\n}\nfunction createProvideFunction(state) {\n  return props => {\n    const current = useProvided(props, 'locale', state.current);\n    const fallback = useProvided(props, 'fallback', state.fallback);\n    const messages = useProvided(props, 'messages', state.messages);\n    return {\n      name: 'vuetify',\n      current,\n      fallback,\n      messages,\n      t: createTranslateFunction(current, fallback, messages),\n      n: createNumberFunction(current, fallback),\n      provide: createProvideFunction({\n        current,\n        fallback,\n        messages\n      })\n    };\n  };\n}\nexport function createVuetifyAdapter(options) {\n  const current = shallowRef(options?.locale ?? 'en');\n  const fallback = shallowRef(options?.fallback ?? 'en');\n  const messages = ref({\n    en,\n    ...options?.messages\n  });\n  return {\n    name: 'vuetify',\n    current,\n    fallback,\n    messages,\n    t: createTranslateFunction(current, fallback, messages),\n    n: createNumberFunction(current, fallback),\n    provide: createProvideFunction({\n      current,\n      fallback,\n      messages\n    })\n  };\n}\n//# sourceMappingURL=vuetify.mjs.map","// Utilities\nimport { computed, inject, provide, ref } from 'vue';\nimport { createVuetifyAdapter } from \"../locale/adapters/vuetify.mjs\"; // Types\nexport const LocaleSymbol = Symbol.for('vuetify:locale');\nfunction isLocaleInstance(obj) {\n  return obj.name != null;\n}\nexport function createLocale(options) {\n  const i18n = options?.adapter && isLocaleInstance(options?.adapter) ? options?.adapter : createVuetifyAdapter(options);\n  const rtl = createRtl(i18n, options);\n  return {\n    ...i18n,\n    ...rtl\n  };\n}\nexport function useLocale() {\n  const locale = inject(LocaleSymbol);\n  if (!locale) throw new Error('[Vuetify] Could not find injected locale instance');\n  return locale;\n}\nexport function provideLocale(props) {\n  const locale = inject(LocaleSymbol);\n  if (!locale) throw new Error('[Vuetify] Could not find injected locale instance');\n  const i18n = locale.provide(props);\n  const rtl = provideRtl(i18n, locale.rtl, props);\n  const data = {\n    ...i18n,\n    ...rtl\n  };\n  provide(LocaleSymbol, data);\n  return data;\n}\n\n// RTL\n\nexport const RtlSymbol = Symbol.for('vuetify:rtl');\nfunction genDefaults() {\n  return {\n    af: false,\n    ar: true,\n    bg: false,\n    ca: false,\n    ckb: false,\n    cs: false,\n    de: false,\n    el: false,\n    en: false,\n    es: false,\n    et: false,\n    fa: true,\n    fi: false,\n    fr: false,\n    hr: false,\n    hu: false,\n    he: true,\n    id: false,\n    it: false,\n    ja: false,\n    km: false,\n    ko: false,\n    lv: false,\n    lt: false,\n    nl: false,\n    no: false,\n    pl: false,\n    pt: false,\n    ro: false,\n    ru: false,\n    sk: false,\n    sl: false,\n    srCyrl: false,\n    srLatn: false,\n    sv: false,\n    th: false,\n    tr: false,\n    az: false,\n    uk: false,\n    vi: false,\n    zhHans: false,\n    zhHant: false\n  };\n}\nexport function createRtl(i18n, options) {\n  const rtl = ref(options?.rtl ?? genDefaults());\n  const isRtl = computed(() => rtl.value[i18n.current.value] ?? false);\n  return {\n    isRtl,\n    rtl,\n    rtlClasses: computed(() => `v-locale--is-${isRtl.value ? 'rtl' : 'ltr'}`)\n  };\n}\nexport function provideRtl(locale, rtl, props) {\n  const isRtl = computed(() => props.rtl ?? rtl.value[locale.current.value] ?? false);\n  return {\n    isRtl,\n    rtl,\n    rtlClasses: computed(() => `v-locale--is-${isRtl.value ? 'rtl' : 'ltr'}`)\n  };\n}\nexport function useRtl() {\n  const locale = inject(LocaleSymbol);\n  if (!locale) throw new Error('[Vuetify] Could not find injected rtl instance');\n  return {\n    isRtl: locale.isRtl,\n    rtlClasses: locale.rtlClasses\n  };\n}\n//# sourceMappingURL=locale.mjs.map","// Utilities\nimport { computed, inject, provide, ref, watch, watchEffect } from 'vue';\nimport { createRange, darken, getCurrentInstance, getForeground, getLuma, IN_BROWSER, lighten, mergeDeep, parseColor, propsFactory, RGBtoHex } from \"../util/index.mjs\"; // Types\nexport const ThemeSymbol = Symbol.for('vuetify:theme');\nexport const makeThemeProps = propsFactory({\n  theme: String\n}, 'theme');\nfunction genDefaults() {\n  return {\n    defaultTheme: 'light',\n    variations: {\n      colors: [],\n      lighten: 0,\n      darken: 0\n    },\n    themes: {\n      light: {\n        dark: false,\n        colors: {\n          background: '#FFFFFF',\n          surface: '#FFFFFF',\n          'surface-bright': '#FFFFFF',\n          'surface-light': '#EEEEEE',\n          'surface-variant': '#424242',\n          'on-surface-variant': '#EEEEEE',\n          primary: '#1867C0',\n          'primary-darken-1': '#1F5592',\n          secondary: '#48A9A6',\n          'secondary-darken-1': '#018786',\n          error: '#B00020',\n          info: '#2196F3',\n          success: '#4CAF50',\n          warning: '#FB8C00'\n        },\n        variables: {\n          'border-color': '#000000',\n          'border-opacity': 0.12,\n          'high-emphasis-opacity': 0.87,\n          'medium-emphasis-opacity': 0.60,\n          'disabled-opacity': 0.38,\n          'idle-opacity': 0.04,\n          'hover-opacity': 0.04,\n          'focus-opacity': 0.12,\n          'selected-opacity': 0.08,\n          'activated-opacity': 0.12,\n          'pressed-opacity': 0.12,\n          'dragged-opacity': 0.08,\n          'theme-kbd': '#212529',\n          'theme-on-kbd': '#FFFFFF',\n          'theme-code': '#F5F5F5',\n          'theme-on-code': '#000000'\n        }\n      },\n      dark: {\n        dark: true,\n        colors: {\n          background: '#121212',\n          surface: '#212121',\n          'surface-bright': '#ccbfd6',\n          'surface-light': '#424242',\n          'surface-variant': '#a3a3a3',\n          'on-surface-variant': '#424242',\n          primary: '#2196F3',\n          'primary-darken-1': '#277CC1',\n          secondary: '#54B6B2',\n          'secondary-darken-1': '#48A9A6',\n          error: '#CF6679',\n          info: '#2196F3',\n          success: '#4CAF50',\n          warning: '#FB8C00'\n        },\n        variables: {\n          'border-color': '#FFFFFF',\n          'border-opacity': 0.12,\n          'high-emphasis-opacity': 1,\n          'medium-emphasis-opacity': 0.70,\n          'disabled-opacity': 0.50,\n          'idle-opacity': 0.10,\n          'hover-opacity': 0.04,\n          'focus-opacity': 0.12,\n          'selected-opacity': 0.08,\n          'activated-opacity': 0.12,\n          'pressed-opacity': 0.16,\n          'dragged-opacity': 0.08,\n          'theme-kbd': '#212529',\n          'theme-on-kbd': '#FFFFFF',\n          'theme-code': '#343434',\n          'theme-on-code': '#CCCCCC'\n        }\n      }\n    }\n  };\n}\nfunction parseThemeOptions() {\n  let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : genDefaults();\n  const defaults = genDefaults();\n  if (!options) return {\n    ...defaults,\n    isDisabled: true\n  };\n  const themes = {};\n  for (const [key, theme] of Object.entries(options.themes ?? {})) {\n    const defaultTheme = theme.dark || key === 'dark' ? defaults.themes?.dark : defaults.themes?.light;\n    themes[key] = mergeDeep(defaultTheme, theme);\n  }\n  return mergeDeep(defaults, {\n    ...options,\n    themes\n  });\n}\n\n// Composables\nexport function createTheme(options) {\n  const parsedOptions = parseThemeOptions(options);\n  const name = ref(parsedOptions.defaultTheme);\n  const themes = ref(parsedOptions.themes);\n  const computedThemes = computed(() => {\n    const acc = {};\n    for (const [name, original] of Object.entries(themes.value)) {\n      const theme = acc[name] = {\n        ...original,\n        colors: {\n          ...original.colors\n        }\n      };\n      if (parsedOptions.variations) {\n        for (const name of parsedOptions.variations.colors) {\n          const color = theme.colors[name];\n          if (!color) continue;\n          for (const variation of ['lighten', 'darken']) {\n            const fn = variation === 'lighten' ? lighten : darken;\n            for (const amount of createRange(parsedOptions.variations[variation], 1)) {\n              theme.colors[`${name}-${variation}-${amount}`] = RGBtoHex(fn(parseColor(color), amount));\n            }\n          }\n        }\n      }\n      for (const color of Object.keys(theme.colors)) {\n        if (/^on-[a-z]/.test(color) || theme.colors[`on-${color}`]) continue;\n        const onColor = `on-${color}`;\n        const colorVal = parseColor(theme.colors[color]);\n        theme.colors[onColor] = getForeground(colorVal);\n      }\n    }\n    return acc;\n  });\n  const current = computed(() => computedThemes.value[name.value]);\n  const styles = computed(() => {\n    const lines = [];\n    if (current.value?.dark) {\n      createCssClass(lines, ':root', ['color-scheme: dark']);\n    }\n    createCssClass(lines, ':root', genCssVariables(current.value));\n    for (const [themeName, theme] of Object.entries(computedThemes.value)) {\n      createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)]);\n    }\n    const bgLines = [];\n    const fgLines = [];\n    const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));\n    for (const key of colors) {\n      if (/^on-[a-z]/.test(key)) {\n        createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`]);\n      } else {\n        createCssClass(bgLines, `.bg-${key}`, [`--v-theme-overlay-multiplier: var(--v-theme-${key}-overlay-multiplier)`, `background-color: rgb(var(--v-theme-${key})) !important`, `color: rgb(var(--v-theme-on-${key})) !important`]);\n        createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`]);\n        createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`]);\n      }\n    }\n    lines.push(...bgLines, ...fgLines);\n    return lines.map((str, i) => i === 0 ? str : `    ${str}`).join('');\n  });\n  function getHead() {\n    return {\n      style: [{\n        children: styles.value,\n        id: 'vuetify-theme-stylesheet',\n        nonce: parsedOptions.cspNonce || false\n      }]\n    };\n  }\n  function install(app) {\n    if (parsedOptions.isDisabled) return;\n    const head = app._context.provides.usehead;\n    if (head) {\n      if (head.push) {\n        const entry = head.push(getHead);\n        if (IN_BROWSER) {\n          watch(styles, () => {\n            entry.patch(getHead);\n          });\n        }\n      } else {\n        if (IN_BROWSER) {\n          head.addHeadObjs(computed(getHead));\n          watchEffect(() => head.updateDOM());\n        } else {\n          head.addHeadObjs(getHead());\n        }\n      }\n    } else {\n      let styleEl = IN_BROWSER ? document.getElementById('vuetify-theme-stylesheet') : null;\n      if (IN_BROWSER) {\n        watch(styles, updateStyles, {\n          immediate: true\n        });\n      } else {\n        updateStyles();\n      }\n      function updateStyles() {\n        if (typeof document !== 'undefined' && !styleEl) {\n          const el = document.createElement('style');\n          el.type = 'text/css';\n          el.id = 'vuetify-theme-stylesheet';\n          if (parsedOptions.cspNonce) el.setAttribute('nonce', parsedOptions.cspNonce);\n          styleEl = el;\n          document.head.appendChild(styleEl);\n        }\n        if (styleEl) styleEl.innerHTML = styles.value;\n      }\n    }\n  }\n  const themeClasses = computed(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);\n  return {\n    install,\n    isDisabled: parsedOptions.isDisabled,\n    name,\n    themes,\n    current,\n    computedThemes,\n    themeClasses,\n    styles,\n    global: {\n      name,\n      current\n    }\n  };\n}\nexport function provideTheme(props) {\n  getCurrentInstance('provideTheme');\n  const theme = inject(ThemeSymbol, null);\n  if (!theme) throw new Error('Could not find Vuetify theme injection');\n  const name = computed(() => {\n    return props.theme ?? theme.name.value;\n  });\n  const current = computed(() => theme.themes.value[name.value]);\n  const themeClasses = computed(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);\n  const newTheme = {\n    ...theme,\n    name,\n    current,\n    themeClasses\n  };\n  provide(ThemeSymbol, newTheme);\n  return newTheme;\n}\nexport function useTheme() {\n  getCurrentInstance('useTheme');\n  const theme = inject(ThemeSymbol, null);\n  if (!theme) throw new Error('Could not find Vuetify theme injection');\n  return theme;\n}\nfunction createCssClass(lines, selector, content) {\n  lines.push(`${selector} {\\n`, ...content.map(line => `  ${line};\\n`), '}\\n');\n}\nfunction genCssVariables(theme) {\n  const lightOverlay = theme.dark ? 2 : 1;\n  const darkOverlay = theme.dark ? 1 : 2;\n  const variables = [];\n  for (const [key, value] of Object.entries(theme.colors)) {\n    const rgb = parseColor(value);\n    variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);\n    if (!key.startsWith('on-')) {\n      variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);\n    }\n  }\n  for (const [key, value] of Object.entries(theme.variables)) {\n    const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;\n    const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;\n    variables.push(`--v-${key}: ${rgb ?? value}`);\n  }\n  return variables;\n}\n//# sourceMappingURL=theme.mjs.map","// Utilities\nimport { propsFactory } from \"../util/index.mjs\"; // Types\n// Composables\nexport const makeTagProps = propsFactory({\n  tag: {\n    type: String,\n    default: 'div'\n  }\n}, 'tag');\n//# sourceMappingURL=tag.mjs.map","// Utilities\nimport { h, Transition, TransitionGroup } from 'vue';\nimport { genericComponent, propsFactory } from \"../../util/index.mjs\"; // Types\nexport const makeTransitionProps = propsFactory({\n  disabled: Boolean,\n  group: Boolean,\n  hideOnLeave: Boolean,\n  leaveAbsolute: Boolean,\n  mode: String,\n  origin: String\n}, 'transition');\nexport function createCssTransition(name, origin, mode) {\n  return genericComponent()({\n    name,\n    props: makeTransitionProps({\n      mode,\n      origin\n    }),\n    setup(props, _ref) {\n      let {\n        slots\n      } = _ref;\n      const functions = {\n        onBeforeEnter(el) {\n          if (props.origin) {\n            el.style.transformOrigin = props.origin;\n          }\n        },\n        onLeave(el) {\n          if (props.leaveAbsolute) {\n            const {\n              offsetTop,\n              offsetLeft,\n              offsetWidth,\n              offsetHeight\n            } = el;\n            el._transitionInitialStyles = {\n              position: el.style.position,\n              top: el.style.top,\n              left: el.style.left,\n              width: el.style.width,\n              height: el.style.height\n            };\n            el.style.position = 'absolute';\n            el.style.top = `${offsetTop}px`;\n            el.style.left = `${offsetLeft}px`;\n            el.style.width = `${offsetWidth}px`;\n            el.style.height = `${offsetHeight}px`;\n          }\n          if (props.hideOnLeave) {\n            el.style.setProperty('display', 'none', 'important');\n          }\n        },\n        onAfterLeave(el) {\n          if (props.leaveAbsolute && el?._transitionInitialStyles) {\n            const {\n              position,\n              top,\n              left,\n              width,\n              height\n            } = el._transitionInitialStyles;\n            delete el._transitionInitialStyles;\n            el.style.position = position || '';\n            el.style.top = top || '';\n            el.style.left = left || '';\n            el.style.width = width || '';\n            el.style.height = height || '';\n          }\n        }\n      };\n      return () => {\n        const tag = props.group ? TransitionGroup : Transition;\n        return h(tag, {\n          name: props.disabled ? '' : name,\n          css: !props.disabled,\n          ...(props.group ? undefined : {\n            mode: props.mode\n          }),\n          ...(props.disabled ? {} : functions)\n        }, slots.default);\n      };\n    }\n  });\n}\nexport function createJavascriptTransition(name, functions) {\n  let mode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'in-out';\n  return genericComponent()({\n    name,\n    props: {\n      mode: {\n        type: String,\n        default: mode\n      },\n      disabled: Boolean,\n      group: Boolean\n    },\n    setup(props, _ref2) {\n      let {\n        slots\n      } = _ref2;\n      const tag = props.group ? TransitionGroup : Transition;\n      return () => {\n        return h(tag, {\n          name: props.disabled ? '' : name,\n          css: !props.disabled,\n          // mode: props.mode, // TODO: vuejs/vue-next#3104\n          ...(props.disabled ? {} : functions)\n        }, slots.default);\n      };\n    }\n  });\n}\n//# sourceMappingURL=createTransition.mjs.map","// Utilities\nimport { camelize } from 'vue';\nexport default function () {\n  let expandedParentClass = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n  let x = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n  const sizeProperty = x ? 'width' : 'height';\n  const offsetProperty = camelize(`offset-${sizeProperty}`);\n  return {\n    onBeforeEnter(el) {\n      el._parent = el.parentNode;\n      el._initialStyle = {\n        transition: el.style.transition,\n        overflow: el.style.overflow,\n        [sizeProperty]: el.style[sizeProperty]\n      };\n    },\n    onEnter(el) {\n      const initialStyle = el._initialStyle;\n      el.style.setProperty('transition', 'none', 'important');\n      // Hide overflow to account for collapsed margins in the calculated height\n      el.style.overflow = 'hidden';\n      const offset = `${el[offsetProperty]}px`;\n      el.style[sizeProperty] = '0';\n      void el.offsetHeight; // force reflow\n\n      el.style.transition = initialStyle.transition;\n      if (expandedParentClass && el._parent) {\n        el._parent.classList.add(expandedParentClass);\n      }\n      requestAnimationFrame(() => {\n        el.style[sizeProperty] = offset;\n      });\n    },\n    onAfterEnter: resetStyles,\n    onEnterCancelled: resetStyles,\n    onLeave(el) {\n      el._initialStyle = {\n        transition: '',\n        overflow: el.style.overflow,\n        [sizeProperty]: el.style[sizeProperty]\n      };\n      el.style.overflow = 'hidden';\n      el.style[sizeProperty] = `${el[offsetProperty]}px`;\n      void el.offsetHeight; // force reflow\n\n      requestAnimationFrame(() => el.style[sizeProperty] = '0');\n    },\n    onAfterLeave,\n    onLeaveCancelled: onAfterLeave\n  };\n  function onAfterLeave(el) {\n    if (expandedParentClass && el._parent) {\n      el._parent.classList.remove(expandedParentClass);\n    }\n    resetStyles(el);\n  }\n  function resetStyles(el) {\n    const size = el._initialStyle[sizeProperty];\n    el.style.overflow = el._initialStyle.overflow;\n    if (size != null) el.style[sizeProperty] = size;\n    delete el._initialStyle;\n  }\n}\n//# sourceMappingURL=expand-transition.mjs.map","import { createCssTransition, createJavascriptTransition } from \"./createTransition.mjs\";\nimport ExpandTransitionGenerator from \"./expand-transition.mjs\"; // Component specific transitions\nexport const VFabTransition = createCssTransition('fab-transition', 'center center', 'out-in');\n\n// Generic transitions\nexport const VDialogBottomTransition = createCssTransition('dialog-bottom-transition');\nexport const VDialogTopTransition = createCssTransition('dialog-top-transition');\nexport const VFadeTransition = createCssTransition('fade-transition');\nexport const VScaleTransition = createCssTransition('scale-transition');\nexport const VScrollXTransition = createCssTransition('scroll-x-transition');\nexport const VScrollXReverseTransition = createCssTransition('scroll-x-reverse-transition');\nexport const VScrollYTransition = createCssTransition('scroll-y-transition');\nexport const VScrollYReverseTransition = createCssTransition('scroll-y-reverse-transition');\nexport const VSlideXTransition = createCssTransition('slide-x-transition');\nexport const VSlideXReverseTransition = createCssTransition('slide-x-reverse-transition');\nexport const VSlideYTransition = createCssTransition('slide-y-transition');\nexport const VSlideYReverseTransition = createCssTransition('slide-y-reverse-transition');\n\n// Javascript transitions\nexport const VExpandTransition = createJavascriptTransition('expand-transition', ExpandTransitionGenerator());\nexport const VExpandXTransition = createJavascriptTransition('expand-x-transition', ExpandTransitionGenerator('', true));\nexport { VDialogTransition } from \"./dialog-transition.mjs\";\n//# sourceMappingURL=index.mjs.map","// Utilities\nimport { computed } from 'vue';\nimport { convertToUnit, propsFactory } from \"../util/index.mjs\"; // Types\n// Composables\nexport const makeDimensionProps = propsFactory({\n  height: [Number, String],\n  maxHeight: [Number, String],\n  maxWidth: [Number, String],\n  minHeight: [Number, String],\n  minWidth: [Number, String],\n  width: [Number, String]\n}, 'dimension');\nexport function useDimension(props) {\n  const dimensionStyles = computed(() => ({\n    height: convertToUnit(props.height),\n    maxHeight: convertToUnit(props.maxHeight),\n    maxWidth: convertToUnit(props.maxWidth),\n    minHeight: convertToUnit(props.minHeight),\n    minWidth: convertToUnit(props.minWidth),\n    width: convertToUnit(props.width)\n  }));\n  return {\n    dimensionStyles\n  };\n}\n//# sourceMappingURL=dimensions.mjs.map","// Utilities\nimport { computed, isRef } from 'vue';\nimport { destructComputed, getForeground, isCssColor, isParsableColor, parseColor } from \"../util/index.mjs\"; // Types\n// Composables\nexport function useColor(colors) {\n  return destructComputed(() => {\n    const classes = [];\n    const styles = {};\n    if (colors.value.background) {\n      if (isCssColor(colors.value.background)) {\n        styles.backgroundColor = colors.value.background;\n        if (!colors.value.text && isParsableColor(colors.value.background)) {\n          const backgroundColor = parseColor(colors.value.background);\n          if (backgroundColor.a == null || backgroundColor.a === 1) {\n            const textColor = getForeground(backgroundColor);\n            styles.color = textColor;\n            styles.caretColor = textColor;\n          }\n        }\n      } else {\n        classes.push(`bg-${colors.value.background}`);\n      }\n    }\n    if (colors.value.text) {\n      if (isCssColor(colors.value.text)) {\n        styles.color = colors.value.text;\n        styles.caretColor = colors.value.text;\n      } else {\n        classes.push(`text-${colors.value.text}`);\n      }\n    }\n    return {\n      colorClasses: classes,\n      colorStyles: styles\n    };\n  });\n}\nexport function useTextColor(props, name) {\n  const colors = computed(() => ({\n    text: isRef(props) ? props.value : name ? props[name] : null\n  }));\n  const {\n    colorClasses: textColorClasses,\n    colorStyles: textColorStyles\n  } = useColor(colors);\n  return {\n    textColorClasses,\n    textColorStyles\n  };\n}\nexport function useBackgroundColor(props, name) {\n  const colors = computed(() => ({\n    background: isRef(props) ? props.value : name ? props[name] : null\n  }));\n  const {\n    colorClasses: backgroundColorClasses,\n    colorStyles: backgroundColorStyles\n  } = useColor(colors);\n  return {\n    backgroundColorClasses,\n    backgroundColorStyles\n  };\n}\n//# sourceMappingURL=color.mjs.map","// Utilities\nimport { computed, isRef } from 'vue';\nimport { getCurrentInstanceName, propsFactory } from \"../util/index.mjs\"; // Types\n// Composables\nexport const makeRoundedProps = propsFactory({\n  rounded: {\n    type: [Boolean, Number, String],\n    default: undefined\n  },\n  tile: Boolean\n}, 'rounded');\nexport function useRounded(props) {\n  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();\n  const roundedClasses = computed(() => {\n    const rounded = isRef(props) ? props.value : props.rounded;\n    const tile = isRef(props) ? props.value : props.tile;\n    const classes = [];\n    if (rounded === true || rounded === '') {\n      classes.push(`${name}--rounded`);\n    } else if (typeof rounded === 'string' || rounded === 0) {\n      for (const value of String(rounded).split(' ')) {\n        classes.push(`rounded-${value}`);\n      }\n    } else if (tile || rounded === false) {\n      classes.push('rounded-0');\n    }\n    return classes;\n  });\n  return {\n    roundedClasses\n  };\n}\n//# sourceMappingURL=rounded.mjs.map","// Utilities\nimport { h, mergeProps, Transition, TransitionGroup } from 'vue';\nimport { propsFactory } from \"../util/index.mjs\"; // Types\nexport const makeTransitionProps = propsFactory({\n  transition: {\n    type: [Boolean, String, Object],\n    default: 'fade-transition',\n    validator: val => val !== true\n  }\n}, 'transition');\nexport const MaybeTransition = (props, _ref) => {\n  let {\n    slots\n  } = _ref;\n  const {\n    transition,\n    disabled,\n    group,\n    ...rest\n  } = props;\n  const {\n    component = group ? TransitionGroup : Transition,\n    ...customProps\n  } = typeof transition === 'object' ? transition : {};\n  return h(component, mergeProps(typeof transition === 'string' ? {\n    name: disabled ? '' : transition\n  } : customProps, typeof transition === 'string' ? {} : Object.fromEntries(Object.entries({\n    disabled,\n    group\n  }).filter(_ref2 => {\n    let [_, v] = _ref2;\n    return v !== undefined;\n  })), rest), slots);\n};\n//# sourceMappingURL=transition.mjs.map","// Utilities\nimport { computed, isRef } from 'vue';\nimport { propsFactory } from \"../util/index.mjs\"; // Types\n// Composables\nexport const makeElevationProps = propsFactory({\n  elevation: {\n    type: [Number, String],\n    validator(v) {\n      const value = parseInt(v);\n      return !isNaN(value) && value >= 0 &&\n      // Material Design has a maximum elevation of 24\n      // https://material.io/design/environment/elevation.html#default-elevations\n      value <= 24;\n    }\n  }\n}, 'elevation');\nexport function useElevation(props) {\n  const elevationClasses = computed(() => {\n    const elevation = isRef(props) ? props.value : props.elevation;\n    const classes = [];\n    if (elevation == null) return classes;\n    classes.push(`elevation-${elevation}`);\n    return classes;\n  });\n  return {\n    elevationClasses\n  };\n}\n//# sourceMappingURL=elevation.mjs.map","// Utilities\nimport { computed } from 'vue';\nimport { getCurrentInstanceName, propsFactory } from \"../util/index.mjs\"; // Types\nconst allowedDensities = [null, 'default', 'comfortable', 'compact'];\n\n// typeof allowedDensities[number] evalutes to any\n// when generating api types for whatever reason.\n\n// Composables\nexport const makeDensityProps = propsFactory({\n  density: {\n    type: String,\n    default: 'default',\n    validator: v => allowedDensities.includes(v)\n  }\n}, 'density');\nexport function useDensity(props) {\n  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();\n  const densityClasses = computed(() => {\n    return `${name}--density-${props.density}`;\n  });\n  return {\n    densityClasses\n  };\n}\n//# sourceMappingURL=density.mjs.map","// Composables\nimport { VClassIcon } from \"../composables/icons.mjs\"; // Utilities\nimport { h } from 'vue';\n\n// Types\n\nconst aliases = {\n  collapse: 'mdi-chevron-up',\n  complete: 'mdi-check',\n  cancel: 'mdi-close-circle',\n  close: 'mdi-close',\n  delete: 'mdi-close-circle',\n  // delete (e.g. v-chip close)\n  clear: 'mdi-close-circle',\n  success: 'mdi-check-circle',\n  info: 'mdi-information',\n  warning: 'mdi-alert-circle',\n  error: 'mdi-close-circle',\n  prev: 'mdi-chevron-left',\n  next: 'mdi-chevron-right',\n  checkboxOn: 'mdi-checkbox-marked',\n  checkboxOff: 'mdi-checkbox-blank-outline',\n  checkboxIndeterminate: 'mdi-minus-box',\n  delimiter: 'mdi-circle',\n  // for carousel\n  sortAsc: 'mdi-arrow-up',\n  sortDesc: 'mdi-arrow-down',\n  expand: 'mdi-chevron-down',\n  menu: 'mdi-menu',\n  subgroup: 'mdi-menu-down',\n  dropdown: 'mdi-menu-down',\n  radioOn: 'mdi-radiobox-marked',\n  radioOff: 'mdi-radiobox-blank',\n  edit: 'mdi-pencil',\n  ratingEmpty: 'mdi-star-outline',\n  ratingFull: 'mdi-star',\n  ratingHalf: 'mdi-star-half-full',\n  loading: 'mdi-cached',\n  first: 'mdi-page-first',\n  last: 'mdi-page-last',\n  unfold: 'mdi-unfold-more-horizontal',\n  file: 'mdi-paperclip',\n  plus: 'mdi-plus',\n  minus: 'mdi-minus',\n  calendar: 'mdi-calendar',\n  treeviewCollapse: 'mdi-menu-down',\n  treeviewExpand: 'mdi-menu-right',\n  eyeDropper: 'mdi-eyedropper'\n};\nconst mdi = {\n  // Not using mergeProps here, functional components merge props by default (?)\n  component: props => h(VClassIcon, {\n    ...props,\n    class: 'mdi'\n  })\n};\nexport { aliases, mdi };\n//# sourceMappingURL=mdi.mjs.map","import { mergeProps as _mergeProps, createVNode as _createVNode } from \"vue\";\n// Icons\nimport { aliases, mdi } from \"../iconsets/mdi.mjs\"; // Utilities\nimport { computed, inject, unref } from 'vue';\nimport { consoleWarn, defineComponent, genericComponent, mergeDeep, propsFactory } from \"../util/index.mjs\"; // Types\nexport const IconValue = [String, Function, Object, Array];\nexport const IconSymbol = Symbol.for('vuetify:icons');\nexport const makeIconProps = propsFactory({\n  icon: {\n    type: IconValue\n  },\n  // Could not remove this and use makeTagProps, types complained because it is not required\n  tag: {\n    type: String,\n    required: true\n  }\n}, 'icon');\nexport const VComponentIcon = genericComponent()({\n  name: 'VComponentIcon',\n  props: makeIconProps(),\n  setup(props, _ref) {\n    let {\n      slots\n    } = _ref;\n    return () => {\n      const Icon = props.icon;\n      return _createVNode(props.tag, null, {\n        default: () => [props.icon ? _createVNode(Icon, null, null) : slots.default?.()]\n      });\n    };\n  }\n});\nexport const VSvgIcon = defineComponent({\n  name: 'VSvgIcon',\n  inheritAttrs: false,\n  props: makeIconProps(),\n  setup(props, _ref2) {\n    let {\n      attrs\n    } = _ref2;\n    return () => {\n      return _createVNode(props.tag, _mergeProps(attrs, {\n        \"style\": null\n      }), {\n        default: () => [_createVNode(\"svg\", {\n          \"class\": \"v-icon__svg\",\n          \"xmlns\": \"http://www.w3.org/2000/svg\",\n          \"viewBox\": \"0 0 24 24\",\n          \"role\": \"img\",\n          \"aria-hidden\": \"true\"\n        }, [Array.isArray(props.icon) ? props.icon.map(path => Array.isArray(path) ? _createVNode(\"path\", {\n          \"d\": path[0],\n          \"fill-opacity\": path[1]\n        }, null) : _createVNode(\"path\", {\n          \"d\": path\n        }, null)) : _createVNode(\"path\", {\n          \"d\": props.icon\n        }, null)])]\n      });\n    };\n  }\n});\nexport const VLigatureIcon = defineComponent({\n  name: 'VLigatureIcon',\n  props: makeIconProps(),\n  setup(props) {\n    return () => {\n      return _createVNode(props.tag, null, {\n        default: () => [props.icon]\n      });\n    };\n  }\n});\nexport const VClassIcon = defineComponent({\n  name: 'VClassIcon',\n  props: makeIconProps(),\n  setup(props) {\n    return () => {\n      return _createVNode(props.tag, {\n        \"class\": props.icon\n      }, null);\n    };\n  }\n});\nfunction genDefaults() {\n  return {\n    svg: {\n      component: VSvgIcon\n    },\n    class: {\n      component: VClassIcon\n    }\n  };\n}\n\n// Composables\nexport function createIcons(options) {\n  const sets = genDefaults();\n  const defaultSet = options?.defaultSet ?? 'mdi';\n  if (defaultSet === 'mdi' && !sets.mdi) {\n    sets.mdi = mdi;\n  }\n  return mergeDeep({\n    defaultSet,\n    sets,\n    aliases: {\n      ...aliases,\n      /* eslint-disable max-len */\n      vuetify: ['M8.2241 14.2009L12 21L22 3H14.4459L8.2241 14.2009Z', ['M7.26303 12.4733L7.00113 12L2 3H12.5261C12.5261 3 12.5261 3 12.5261 3L7.26303 12.4733Z', 0.6]],\n      'vuetify-outline': 'svg:M7.26 12.47 12.53 3H2L7.26 12.47ZM14.45 3 8.22 14.2 12 21 22 3H14.45ZM18.6 5 12 16.88 10.51 14.2 15.62 5ZM7.26 8.35 5.4 5H9.13L7.26 8.35Z',\n      'vuetify-play': ['m6.376 13.184-4.11-7.192C1.505 4.66 2.467 3 4.003 3h8.532l-.953 1.576-.006.01-.396.677c-.429.732-.214 1.507.194 2.015.404.503 1.092.878 1.869.806a3.72 3.72 0 0 1 1.005.022c.276.053.434.143.523.237.138.146.38.635-.25 2.09-.893 1.63-1.553 1.722-1.847 1.677-.213-.033-.468-.158-.756-.406a4.95 4.95 0 0 1-.8-.927c-.39-.564-1.04-.84-1.66-.846-.625-.006-1.316.27-1.693.921l-.478.826-.911 1.506Z', ['M9.093 11.552c.046-.079.144-.15.32-.148a.53.53 0 0 1 .43.207c.285.414.636.847 1.046 1.2.405.35.914.662 1.516.754 1.334.205 2.502-.698 3.48-2.495l.014-.028.013-.03c.687-1.574.774-2.852-.005-3.675-.37-.391-.861-.586-1.333-.676a5.243 5.243 0 0 0-1.447-.044c-.173.016-.393-.073-.54-.257-.145-.18-.127-.316-.082-.392l.393-.672L14.287 3h5.71c1.536 0 2.499 1.659 1.737 2.992l-7.997 13.996c-.768 1.344-2.706 1.344-3.473 0l-3.037-5.314 1.377-2.278.004-.006.004-.007.481-.831Z', 0.6]]\n      /* eslint-enable max-len */\n    }\n  }, options);\n}\nexport const useIcon = props => {\n  const icons = inject(IconSymbol);\n  if (!icons) throw new Error('Missing Vuetify Icons provide!');\n  const iconData = computed(() => {\n    const iconAlias = unref(props);\n    if (!iconAlias) return {\n      component: VComponentIcon\n    };\n    let icon = iconAlias;\n    if (typeof icon === 'string') {\n      icon = icon.trim();\n      if (icon.startsWith('$')) {\n        icon = icons.aliases?.[icon.slice(1)];\n      }\n    }\n    if (!icon) consoleWarn(`Could not find aliased icon \"${iconAlias}\"`);\n    if (Array.isArray(icon)) {\n      return {\n        component: VSvgIcon,\n        icon\n      };\n    } else if (typeof icon !== 'string') {\n      return {\n        component: VComponentIcon,\n        icon\n      };\n    }\n    const iconSetName = Object.keys(icons.sets).find(setName => typeof icon === 'string' && icon.startsWith(`${setName}:`));\n    const iconName = iconSetName ? icon.slice(iconSetName.length + 1) : icon;\n    const iconSet = icons.sets[iconSetName ?? icons.defaultSet];\n    return {\n      component: iconSet.component,\n      icon: iconName\n    };\n  });\n  return {\n    iconData\n  };\n};\n//# sourceMappingURL=icons.mjs.map","// Utilities\nimport { convertToUnit, destructComputed, getCurrentInstanceName, includes, propsFactory } from \"../util/index.mjs\"; // Types\nconst predefinedSizes = ['x-small', 'small', 'default', 'large', 'x-large'];\n// Composables\nexport const makeSizeProps = propsFactory({\n  size: {\n    type: [String, Number],\n    default: 'default'\n  }\n}, 'size');\nexport function useSize(props) {\n  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();\n  return destructComputed(() => {\n    let sizeClasses;\n    let sizeStyles;\n    if (includes(predefinedSizes, props.size)) {\n      sizeClasses = `${name}--size-${props.size}`;\n    } else if (props.size) {\n      sizeStyles = {\n        width: convertToUnit(props.size),\n        height: convertToUnit(props.size)\n      };\n    }\n    return {\n      sizeClasses,\n      sizeStyles\n    };\n  });\n}\n//# sourceMappingURL=size.mjs.map","import { createVNode as _createVNode } from \"vue\";\n// Styles\nimport \"./VIcon.css\";\n\n// Composables\nimport { useTextColor } from \"../../composables/color.mjs\";\nimport { makeComponentProps } from \"../../composables/component.mjs\";\nimport { IconValue, useIcon } from \"../../composables/icons.mjs\";\nimport { makeSizeProps, useSize } from \"../../composables/size.mjs\";\nimport { makeTagProps } from \"../../composables/tag.mjs\";\nimport { makeThemeProps, provideTheme } from \"../../composables/theme.mjs\"; // Utilities\nimport { computed, ref, Text, toRef } from 'vue';\nimport { convertToUnit, flattenFragments, genericComponent, propsFactory, useRender } from \"../../util/index.mjs\";\nexport const makeVIconProps = propsFactory({\n  color: String,\n  disabled: Boolean,\n  start: Boolean,\n  end: Boolean,\n  icon: IconValue,\n  ...makeComponentProps(),\n  ...makeSizeProps(),\n  ...makeTagProps({\n    tag: 'i'\n  }),\n  ...makeThemeProps()\n}, 'VIcon');\nexport const VIcon = genericComponent()({\n  name: 'VIcon',\n  props: makeVIconProps(),\n  setup(props, _ref) {\n    let {\n      attrs,\n      slots\n    } = _ref;\n    const slotIcon = ref();\n    const {\n      themeClasses\n    } = provideTheme(props);\n    const {\n      iconData\n    } = useIcon(computed(() => slotIcon.value || props.icon));\n    const {\n      sizeClasses\n    } = useSize(props);\n    const {\n      textColorClasses,\n      textColorStyles\n    } = useTextColor(toRef(props, 'color'));\n    useRender(() => {\n      const slotValue = slots.default?.();\n      if (slotValue) {\n        slotIcon.value = flattenFragments(slotValue).filter(node => node.type === Text && node.children && typeof node.children === 'string')[0]?.children;\n      }\n      const hasClick = !!(attrs.onClick || attrs.onClickOnce);\n      return _createVNode(iconData.value.component, {\n        \"tag\": props.tag,\n        \"icon\": iconData.value.icon,\n        \"class\": ['v-icon', 'notranslate', themeClasses.value, sizeClasses.value, textColorClasses.value, {\n          'v-icon--clickable': hasClick,\n          'v-icon--disabled': props.disabled,\n          'v-icon--start': props.start,\n          'v-icon--end': props.end\n        }, props.class],\n        \"style\": [!sizeClasses.value ? {\n          fontSize: convertToUnit(props.size),\n          height: convertToUnit(props.size),\n          width: convertToUnit(props.size)\n        } : undefined, textColorStyles.value, props.style],\n        \"role\": hasClick ? 'button' : undefined,\n        \"aria-hidden\": !hasClick,\n        \"tabindex\": hasClick ? props.disabled ? -1 : 0 : undefined\n      }, {\n        default: () => [slotValue]\n      });\n    });\n    return {};\n  }\n});\n//# sourceMappingURL=VIcon.mjs.map","// Styles\nimport \"./VRipple.css\";\n\n// Utilities\nimport { isObject, keyCodes } from \"../../util/index.mjs\"; // Types\nconst stopSymbol = Symbol('rippleStop');\nconst DELAY_RIPPLE = 80;\nfunction transform(el, value) {\n  el.style.transform = value;\n  el.style.webkitTransform = value;\n}\nfunction isTouchEvent(e) {\n  return e.constructor.name === 'TouchEvent';\n}\nfunction isKeyboardEvent(e) {\n  return e.constructor.name === 'KeyboardEvent';\n}\nconst calculate = function (e, el) {\n  let value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  let localX = 0;\n  let localY = 0;\n  if (!isKeyboardEvent(e)) {\n    const offset = el.getBoundingClientRect();\n    const target = isTouchEvent(e) ? e.touches[e.touches.length - 1] : e;\n    localX = target.clientX - offset.left;\n    localY = target.clientY - offset.top;\n  }\n  let radius = 0;\n  let scale = 0.3;\n  if (el._ripple?.circle) {\n    scale = 0.15;\n    radius = el.clientWidth / 2;\n    radius = value.center ? radius : radius + Math.sqrt((localX - radius) ** 2 + (localY - radius) ** 2) / 4;\n  } else {\n    radius = Math.sqrt(el.clientWidth ** 2 + el.clientHeight ** 2) / 2;\n  }\n  const centerX = `${(el.clientWidth - radius * 2) / 2}px`;\n  const centerY = `${(el.clientHeight - radius * 2) / 2}px`;\n  const x = value.center ? centerX : `${localX - radius}px`;\n  const y = value.center ? centerY : `${localY - radius}px`;\n  return {\n    radius,\n    scale,\n    x,\n    y,\n    centerX,\n    centerY\n  };\n};\nconst ripples = {\n  /* eslint-disable max-statements */\n  show(e, el) {\n    let value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    if (!el?._ripple?.enabled) {\n      return;\n    }\n    const container = document.createElement('span');\n    const animation = document.createElement('span');\n    container.appendChild(animation);\n    container.className = 'v-ripple__container';\n    if (value.class) {\n      container.className += ` ${value.class}`;\n    }\n    const {\n      radius,\n      scale,\n      x,\n      y,\n      centerX,\n      centerY\n    } = calculate(e, el, value);\n    const size = `${radius * 2}px`;\n    animation.className = 'v-ripple__animation';\n    animation.style.width = size;\n    animation.style.height = size;\n    el.appendChild(container);\n    const computed = window.getComputedStyle(el);\n    if (computed && computed.position === 'static') {\n      el.style.position = 'relative';\n      el.dataset.previousPosition = 'static';\n    }\n    animation.classList.add('v-ripple__animation--enter');\n    animation.classList.add('v-ripple__animation--visible');\n    transform(animation, `translate(${x}, ${y}) scale3d(${scale},${scale},${scale})`);\n    animation.dataset.activated = String(performance.now());\n    setTimeout(() => {\n      animation.classList.remove('v-ripple__animation--enter');\n      animation.classList.add('v-ripple__animation--in');\n      transform(animation, `translate(${centerX}, ${centerY}) scale3d(1,1,1)`);\n    }, 0);\n  },\n  hide(el) {\n    if (!el?._ripple?.enabled) return;\n    const ripples = el.getElementsByClassName('v-ripple__animation');\n    if (ripples.length === 0) return;\n    const animation = ripples[ripples.length - 1];\n    if (animation.dataset.isHiding) return;else animation.dataset.isHiding = 'true';\n    const diff = performance.now() - Number(animation.dataset.activated);\n    const delay = Math.max(250 - diff, 0);\n    setTimeout(() => {\n      animation.classList.remove('v-ripple__animation--in');\n      animation.classList.add('v-ripple__animation--out');\n      setTimeout(() => {\n        const ripples = el.getElementsByClassName('v-ripple__animation');\n        if (ripples.length === 1 && el.dataset.previousPosition) {\n          el.style.position = el.dataset.previousPosition;\n          delete el.dataset.previousPosition;\n        }\n        if (animation.parentNode?.parentNode === el) el.removeChild(animation.parentNode);\n      }, 300);\n    }, delay);\n  }\n};\nfunction isRippleEnabled(value) {\n  return typeof value === 'undefined' || !!value;\n}\nfunction rippleShow(e) {\n  const value = {};\n  const element = e.currentTarget;\n  if (!element?._ripple || element._ripple.touched || e[stopSymbol]) return;\n\n  // Don't allow the event to trigger ripples on any other elements\n  e[stopSymbol] = true;\n  if (isTouchEvent(e)) {\n    element._ripple.touched = true;\n    element._ripple.isTouch = true;\n  } else {\n    // It's possible for touch events to fire\n    // as mouse events on Android/iOS, this\n    // will skip the event call if it has\n    // already been registered as touch\n    if (element._ripple.isTouch) return;\n  }\n  value.center = element._ripple.centered || isKeyboardEvent(e);\n  if (element._ripple.class) {\n    value.class = element._ripple.class;\n  }\n  if (isTouchEvent(e)) {\n    // already queued that shows or hides the ripple\n    if (element._ripple.showTimerCommit) return;\n    element._ripple.showTimerCommit = () => {\n      ripples.show(e, element, value);\n    };\n    element._ripple.showTimer = window.setTimeout(() => {\n      if (element?._ripple?.showTimerCommit) {\n        element._ripple.showTimerCommit();\n        element._ripple.showTimerCommit = null;\n      }\n    }, DELAY_RIPPLE);\n  } else {\n    ripples.show(e, element, value);\n  }\n}\nfunction rippleStop(e) {\n  e[stopSymbol] = true;\n}\nfunction rippleHide(e) {\n  const element = e.currentTarget;\n  if (!element?._ripple) return;\n  window.clearTimeout(element._ripple.showTimer);\n\n  // The touch interaction occurs before the show timer is triggered.\n  // We still want to show ripple effect.\n  if (e.type === 'touchend' && element._ripple.showTimerCommit) {\n    element._ripple.showTimerCommit();\n    element._ripple.showTimerCommit = null;\n\n    // re-queue ripple hiding\n    element._ripple.showTimer = window.setTimeout(() => {\n      rippleHide(e);\n    });\n    return;\n  }\n  window.setTimeout(() => {\n    if (element._ripple) {\n      element._ripple.touched = false;\n    }\n  });\n  ripples.hide(element);\n}\nfunction rippleCancelShow(e) {\n  const element = e.currentTarget;\n  if (!element?._ripple) return;\n  if (element._ripple.showTimerCommit) {\n    element._ripple.showTimerCommit = null;\n  }\n  window.clearTimeout(element._ripple.showTimer);\n}\nlet keyboardRipple = false;\nfunction keyboardRippleShow(e) {\n  if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {\n    keyboardRipple = true;\n    rippleShow(e);\n  }\n}\nfunction keyboardRippleHide(e) {\n  keyboardRipple = false;\n  rippleHide(e);\n}\nfunction focusRippleHide(e) {\n  if (keyboardRipple) {\n    keyboardRipple = false;\n    rippleHide(e);\n  }\n}\nfunction updateRipple(el, binding, wasEnabled) {\n  const {\n    value,\n    modifiers\n  } = binding;\n  const enabled = isRippleEnabled(value);\n  if (!enabled) {\n    ripples.hide(el);\n  }\n  el._ripple = el._ripple ?? {};\n  el._ripple.enabled = enabled;\n  el._ripple.centered = modifiers.center;\n  el._ripple.circle = modifiers.circle;\n  if (isObject(value) && value.class) {\n    el._ripple.class = value.class;\n  }\n  if (enabled && !wasEnabled) {\n    if (modifiers.stop) {\n      el.addEventListener('touchstart', rippleStop, {\n        passive: true\n      });\n      el.addEventListener('mousedown', rippleStop);\n      return;\n    }\n    el.addEventListener('touchstart', rippleShow, {\n      passive: true\n    });\n    el.addEventListener('touchend', rippleHide, {\n      passive: true\n    });\n    el.addEventListener('touchmove', rippleCancelShow, {\n      passive: true\n    });\n    el.addEventListener('touchcancel', rippleHide);\n    el.addEventListener('mousedown', rippleShow);\n    el.addEventListener('mouseup', rippleHide);\n    el.addEventListener('mouseleave', rippleHide);\n    el.addEventListener('keydown', keyboardRippleShow);\n    el.addEventListener('keyup', keyboardRippleHide);\n    el.addEventListener('blur', focusRippleHide);\n\n    // Anchor tags can be dragged, causes other hides to fail - #1537\n    el.addEventListener('dragstart', rippleHide, {\n      passive: true\n    });\n  } else if (!enabled && wasEnabled) {\n    removeListeners(el);\n  }\n}\nfunction removeListeners(el) {\n  el.removeEventListener('mousedown', rippleShow);\n  el.removeEventListener('touchstart', rippleShow);\n  el.removeEventListener('touchend', rippleHide);\n  el.removeEventListener('touchmove', rippleCancelShow);\n  el.removeEventListener('touchcancel', rippleHide);\n  el.removeEventListener('mouseup', rippleHide);\n  el.removeEventListener('mouseleave', rippleHide);\n  el.removeEventListener('keydown', keyboardRippleShow);\n  el.removeEventListener('keyup', keyboardRippleHide);\n  el.removeEventListener('dragstart', rippleHide);\n  el.removeEventListener('blur', focusRippleHide);\n}\nfunction mounted(el, binding) {\n  updateRipple(el, binding, false);\n}\nfunction unmounted(el) {\n  delete el._ripple;\n  removeListeners(el);\n}\nfunction updated(el, binding) {\n  if (binding.value === binding.oldValue) {\n    return;\n  }\n  const wasEnabled = isRippleEnabled(binding.oldValue);\n  updateRipple(el, binding, wasEnabled);\n}\nexport const Ripple = {\n  mounted,\n  unmounted,\n  updated\n};\nexport default Ripple;\n//# sourceMappingURL=index.mjs.map","import { createVNode as _createVNode } from \"vue\";\n// Styles\nimport \"./VLabel.css\";\n\n// Composables\nimport { makeComponentProps } from \"../../composables/component.mjs\";\nimport { makeThemeProps } from \"../../composables/theme.mjs\"; // Utilities\nimport { EventProp, genericComponent, propsFactory, useRender } from \"../../util/index.mjs\";\nexport const makeVLabelProps = propsFactory({\n  text: String,\n  onClick: EventProp(),\n  ...makeComponentProps(),\n  ...makeThemeProps()\n}, 'VLabel');\nexport const VLabel = genericComponent()({\n  name: 'VLabel',\n  props: makeVLabelProps(),\n  setup(props, _ref) {\n    let {\n      slots\n    } = _ref;\n    useRender(() => _createVNode(\"label\", {\n      \"class\": ['v-label', {\n        'v-label--clickable': !!props.onClick\n      }, props.class],\n      \"style\": props.style,\n      \"onClick\": props.onClick\n    }, [props.text, slots.default?.()]));\n    return {};\n  }\n});\n//# sourceMappingURL=VLabel.mjs.map","import { createVNode as _createVNode } from \"vue\";\n// Components\nimport { VIcon } from \"../VIcon/index.mjs\"; // Composables\nimport { useLocale } from \"../../composables/locale.mjs\"; // Types\nexport function useInputIcon(props) {\n  const {\n    t\n  } = useLocale();\n  function InputIcon(_ref) {\n    let {\n      name\n    } = _ref;\n    const localeKey = {\n      prepend: 'prependAction',\n      prependInner: 'prependAction',\n      append: 'appendAction',\n      appendInner: 'appendAction',\n      clear: 'clear'\n    }[name];\n    const listener = props[`onClick:${name}`];\n    const label = listener && localeKey ? t(`$vuetify.input.${localeKey}`, props.label ?? '') : undefined;\n    return _createVNode(VIcon, {\n      \"icon\": props[`${name}Icon`],\n      \"aria-label\": label,\n      \"onClick\": listener\n    }, null);\n  }\n  return {\n    InputIcon\n  };\n}\n//# sourceMappingURL=InputIcon.mjs.map","import { createVNode as _createVNode } from \"vue\";\n// Styles\nimport \"./VMessages.css\";\n\n// Components\nimport { VSlideYTransition } from \"../transitions/index.mjs\"; // Composables\nimport { useTextColor } from \"../../composables/color.mjs\";\nimport { makeComponentProps } from \"../../composables/component.mjs\";\nimport { makeTransitionProps, MaybeTransition } from \"../../composables/transition.mjs\"; // Utilities\nimport { computed } from 'vue';\nimport { genericComponent, propsFactory, useRender, wrapInArray } from \"../../util/index.mjs\"; // Types\nexport const makeVMessagesProps = propsFactory({\n  active: Boolean,\n  color: String,\n  messages: {\n    type: [Array, String],\n    default: () => []\n  },\n  ...makeComponentProps(),\n  ...makeTransitionProps({\n    transition: {\n      component: VSlideYTransition,\n      leaveAbsolute: true,\n      group: true\n    }\n  })\n}, 'VMessages');\nexport const VMessages = genericComponent()({\n  name: 'VMessages',\n  props: makeVMessagesProps(),\n  setup(props, _ref) {\n    let {\n      slots\n    } = _ref;\n    const messages = computed(() => wrapInArray(props.messages));\n    const {\n      textColorClasses,\n      textColorStyles\n    } = useTextColor(computed(() => props.color));\n    useRender(() => _createVNode(MaybeTransition, {\n      \"transition\": props.transition,\n      \"tag\": \"div\",\n      \"class\": ['v-messages', textColorClasses.value, props.class],\n      \"style\": [textColorStyles.value, props.style],\n      \"role\": \"alert\",\n      \"aria-live\": \"polite\"\n    }, {\n      default: () => [props.active && messages.value.map((message, i) => _createVNode(\"div\", {\n        \"class\": \"v-messages__message\",\n        \"key\": `${i}-${messages.value}`\n      }, [slots.message ? slots.message({\n        message\n      }) : message]))]\n    }));\n    return {};\n  }\n});\n//# sourceMappingURL=VMessages.mjs.map","// Composables\nimport { useProxiedModel } from \"./proxiedModel.mjs\"; // Utilities\nimport { computed } from 'vue';\nimport { EventProp, getCurrentInstanceName, propsFactory } from \"../util/index.mjs\"; // Types\n// Composables\nexport const makeFocusProps = propsFactory({\n  focused: Boolean,\n  'onUpdate:focused': EventProp()\n}, 'focus');\nexport function useFocus(props) {\n  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();\n  const isFocused = useProxiedModel(props, 'focused');\n  const focusClasses = computed(() => {\n    return {\n      [`${name}--focused`]: isFocused.value\n    };\n  });\n  function focus() {\n    isFocused.value = true;\n  }\n  function blur() {\n    isFocused.value = false;\n  }\n  return {\n    focusClasses,\n    isFocused,\n    focus,\n    blur\n  };\n}\n//# sourceMappingURL=focus.mjs.map","// Composables\nimport { useProxiedModel } from \"./proxiedModel.mjs\"; // Utilities\nimport { computed, inject, markRaw, provide, ref, shallowRef, toRef, watch } from 'vue';\nimport { consoleWarn, propsFactory } from \"../util/index.mjs\"; // Types\nexport const FormKey = Symbol.for('vuetify:form');\nexport const makeFormProps = propsFactory({\n  disabled: Boolean,\n  fastFail: Boolean,\n  readonly: Boolean,\n  modelValue: {\n    type: Boolean,\n    default: null\n  },\n  validateOn: {\n    type: String,\n    default: 'input'\n  }\n}, 'form');\nexport function createForm(props) {\n  const model = useProxiedModel(props, 'modelValue');\n  const isDisabled = computed(() => props.disabled);\n  const isReadonly = computed(() => props.readonly);\n  const isValidating = shallowRef(false);\n  const items = ref([]);\n  const errors = ref([]);\n  async function validate() {\n    const results = [];\n    let valid = true;\n    errors.value = [];\n    isValidating.value = true;\n    for (const item of items.value) {\n      const itemErrorMessages = await item.validate();\n      if (itemErrorMessages.length > 0) {\n        valid = false;\n        results.push({\n          id: item.id,\n          errorMessages: itemErrorMessages\n        });\n      }\n      if (!valid && props.fastFail) break;\n    }\n    errors.value = results;\n    isValidating.value = false;\n    return {\n      valid,\n      errors: errors.value\n    };\n  }\n  function reset() {\n    items.value.forEach(item => item.reset());\n  }\n  function resetValidation() {\n    items.value.forEach(item => item.resetValidation());\n  }\n  watch(items, () => {\n    let valid = 0;\n    let invalid = 0;\n    const results = [];\n    for (const item of items.value) {\n      if (item.isValid === false) {\n        invalid++;\n        results.push({\n          id: item.id,\n          errorMessages: item.errorMessages\n        });\n      } else if (item.isValid === true) valid++;\n    }\n    errors.value = results;\n    model.value = invalid > 0 ? false : valid === items.value.length ? true : null;\n  }, {\n    deep: true,\n    flush: 'post'\n  });\n  provide(FormKey, {\n    register: _ref => {\n      let {\n        id,\n        vm,\n        validate,\n        reset,\n        resetValidation\n      } = _ref;\n      if (items.value.some(item => item.id === id)) {\n        consoleWarn(`Duplicate input name \"${id}\"`);\n      }\n      items.value.push({\n        id,\n        validate,\n        reset,\n        resetValidation,\n        vm: markRaw(vm),\n        isValid: null,\n        errorMessages: []\n      });\n    },\n    unregister: id => {\n      items.value = items.value.filter(item => {\n        return item.id !== id;\n      });\n    },\n    update: (id, isValid, errorMessages) => {\n      const found = items.value.find(item => item.id === id);\n      if (!found) return;\n      found.isValid = isValid;\n      found.errorMessages = errorMessages;\n    },\n    isDisabled,\n    isReadonly,\n    isValidating,\n    isValid: model,\n    items,\n    validateOn: toRef(props, 'validateOn')\n  });\n  return {\n    errors,\n    isDisabled,\n    isReadonly,\n    isValidating,\n    isValid: model,\n    items,\n    validate,\n    reset,\n    resetValidation\n  };\n}\nexport function useForm() {\n  return inject(FormKey, null);\n}\n//# sourceMappingURL=form.mjs.map","// Composables\nimport { makeFocusProps } from \"./focus.mjs\";\nimport { useForm } from \"./form.mjs\";\nimport { useProxiedModel } from \"./proxiedModel.mjs\";\nimport { useToggleScope } from \"./toggleScope.mjs\"; // Utilities\nimport { computed, nextTick, onBeforeMount, onBeforeUnmount, onMounted, ref, shallowRef, unref, watch } from 'vue';\nimport { getCurrentInstance, getCurrentInstanceName, getUid, propsFactory, wrapInArray } from \"../util/index.mjs\"; // Types\nexport const makeValidationProps = propsFactory({\n  disabled: {\n    type: Boolean,\n    default: null\n  },\n  error: Boolean,\n  errorMessages: {\n    type: [Array, String],\n    default: () => []\n  },\n  maxErrors: {\n    type: [Number, String],\n    default: 1\n  },\n  name: String,\n  label: String,\n  readonly: {\n    type: Boolean,\n    default: null\n  },\n  rules: {\n    type: Array,\n    default: () => []\n  },\n  modelValue: null,\n  validateOn: String,\n  validationValue: null,\n  ...makeFocusProps()\n}, 'validation');\nexport function useValidation(props) {\n  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();\n  let id = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : getUid();\n  const model = useProxiedModel(props, 'modelValue');\n  const validationModel = computed(() => props.validationValue === undefined ? model.value : props.validationValue);\n  const form = useForm();\n  const internalErrorMessages = ref([]);\n  const isPristine = shallowRef(true);\n  const isDirty = computed(() => !!(wrapInArray(model.value === '' ? null : model.value).length || wrapInArray(validationModel.value === '' ? null : validationModel.value).length));\n  const isDisabled = computed(() => !!(props.disabled ?? form?.isDisabled.value));\n  const isReadonly = computed(() => !!(props.readonly ?? form?.isReadonly.value));\n  const errorMessages = computed(() => {\n    return props.errorMessages?.length ? wrapInArray(props.errorMessages).concat(internalErrorMessages.value).slice(0, Math.max(0, +props.maxErrors)) : internalErrorMessages.value;\n  });\n  const validateOn = computed(() => {\n    let value = (props.validateOn ?? form?.validateOn.value) || 'input';\n    if (value === 'lazy') value = 'input lazy';\n    const set = new Set(value?.split(' ') ?? []);\n    return {\n      blur: set.has('blur') || set.has('input'),\n      input: set.has('input'),\n      submit: set.has('submit'),\n      lazy: set.has('lazy')\n    };\n  });\n  const isValid = computed(() => {\n    if (props.error || props.errorMessages?.length) return false;\n    if (!props.rules.length) return true;\n    if (isPristine.value) {\n      return internalErrorMessages.value.length || validateOn.value.lazy ? null : true;\n    } else {\n      return !internalErrorMessages.value.length;\n    }\n  });\n  const isValidating = shallowRef(false);\n  const validationClasses = computed(() => {\n    return {\n      [`${name}--error`]: isValid.value === false,\n      [`${name}--dirty`]: isDirty.value,\n      [`${name}--disabled`]: isDisabled.value,\n      [`${name}--readonly`]: isReadonly.value\n    };\n  });\n  const vm = getCurrentInstance('validation');\n  const uid = computed(() => props.name ?? unref(id));\n  onBeforeMount(() => {\n    form?.register({\n      id: uid.value,\n      vm,\n      validate,\n      reset,\n      resetValidation\n    });\n  });\n  onBeforeUnmount(() => {\n    form?.unregister(uid.value);\n  });\n  onMounted(async () => {\n    if (!validateOn.value.lazy) {\n      await validate(true);\n    }\n    form?.update(uid.value, isValid.value, errorMessages.value);\n  });\n  useToggleScope(() => validateOn.value.input, () => {\n    watch(validationModel, () => {\n      if (validationModel.value != null) {\n        validate();\n      } else if (props.focused) {\n        const unwatch = watch(() => props.focused, val => {\n          if (!val) validate();\n          unwatch();\n        });\n      }\n    });\n  });\n  useToggleScope(() => validateOn.value.blur, () => {\n    watch(() => props.focused, val => {\n      if (!val) validate();\n    });\n  });\n  watch([isValid, errorMessages], () => {\n    form?.update(uid.value, isValid.value, errorMessages.value);\n  });\n  async function reset() {\n    model.value = null;\n    await nextTick();\n    await resetValidation();\n  }\n  async function resetValidation() {\n    isPristine.value = true;\n    if (!validateOn.value.lazy) {\n      await validate(true);\n    } else {\n      internalErrorMessages.value = [];\n    }\n  }\n  async function validate() {\n    let silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n    const results = [];\n    isValidating.value = true;\n    for (const rule of props.rules) {\n      if (results.length >= +(props.maxErrors ?? 1)) {\n        break;\n      }\n      const handler = typeof rule === 'function' ? rule : () => rule;\n      const result = await handler(validationModel.value);\n      if (result === true) continue;\n      if (result !== false && typeof result !== 'string') {\n        // eslint-disable-next-line no-console\n        console.warn(`${result} is not a valid value. Rule functions must return boolean true or a string.`);\n        continue;\n      }\n      results.push(result || '');\n    }\n    internalErrorMessages.value = results;\n    isValidating.value = false;\n    isPristine.value = silent;\n    return internalErrorMessages.value;\n  }\n  return {\n    errorMessages,\n    isDirty,\n    isDisabled,\n    isReadonly,\n    isPristine,\n    isValid,\n    isValidating,\n    reset,\n    resetValidation,\n    validate,\n    validationClasses\n  };\n}\n//# sourceMappingURL=validation.mjs.map","import { resolveDirective as _resolveDirective, createVNode as _createVNode } from \"vue\";\n// Styles\nimport \"./VInput.css\";\n\n// Components\nimport { useInputIcon } from \"./InputIcon.mjs\";\nimport { VMessages } from \"../VMessages/VMessages.mjs\"; // Composables\nimport { makeComponentProps } from \"../../composables/component.mjs\";\nimport { makeDensityProps, useDensity } from \"../../composables/density.mjs\";\nimport { makeDimensionProps, useDimension } from \"../../composables/dimensions.mjs\";\nimport { IconValue } from \"../../composables/icons.mjs\";\nimport { useRtl } from \"../../composables/locale.mjs\";\nimport { makeThemeProps, provideTheme } from \"../../composables/theme.mjs\";\nimport { makeValidationProps, useValidation } from \"../../composables/validation.mjs\"; // Utilities\nimport { computed } from 'vue';\nimport { EventProp, genericComponent, getUid, only, propsFactory, useRender } from \"../../util/index.mjs\"; // Types\nexport const makeVInputProps = propsFactory({\n  id: String,\n  appendIcon: IconValue,\n  centerAffix: {\n    type: Boolean,\n    default: true\n  },\n  prependIcon: IconValue,\n  hideDetails: [Boolean, String],\n  hideSpinButtons: Boolean,\n  hint: String,\n  persistentHint: Boolean,\n  messages: {\n    type: [Array, String],\n    default: () => []\n  },\n  direction: {\n    type: String,\n    default: 'horizontal',\n    validator: v => ['horizontal', 'vertical'].includes(v)\n  },\n  'onClick:prepend': EventProp(),\n  'onClick:append': EventProp(),\n  ...makeComponentProps(),\n  ...makeDensityProps(),\n  ...only(makeDimensionProps(), ['maxWidth', 'minWidth', 'width']),\n  ...makeThemeProps(),\n  ...makeValidationProps()\n}, 'VInput');\nexport const VInput = genericComponent()({\n  name: 'VInput',\n  props: {\n    ...makeVInputProps()\n  },\n  emits: {\n    'update:modelValue': value => true\n  },\n  setup(props, _ref) {\n    let {\n      attrs,\n      slots,\n      emit\n    } = _ref;\n    const {\n      densityClasses\n    } = useDensity(props);\n    const {\n      dimensionStyles\n    } = useDimension(props);\n    const {\n      themeClasses\n    } = provideTheme(props);\n    const {\n      rtlClasses\n    } = useRtl();\n    const {\n      InputIcon\n    } = useInputIcon(props);\n    const uid = getUid();\n    const id = computed(() => props.id || `input-${uid}`);\n    const messagesId = computed(() => `${id.value}-messages`);\n    const {\n      errorMessages,\n      isDirty,\n      isDisabled,\n      isReadonly,\n      isPristine,\n      isValid,\n      isValidating,\n      reset,\n      resetValidation,\n      validate,\n      validationClasses\n    } = useValidation(props, 'v-input', id);\n    const slotProps = computed(() => ({\n      id,\n      messagesId,\n      isDirty,\n      isDisabled,\n      isReadonly,\n      isPristine,\n      isValid,\n      isValidating,\n      reset,\n      resetValidation,\n      validate\n    }));\n    const messages = computed(() => {\n      if (props.errorMessages?.length || !isPristine.value && errorMessages.value.length) {\n        return errorMessages.value;\n      } else if (props.hint && (props.persistentHint || props.focused)) {\n        return props.hint;\n      } else {\n        return props.messages;\n      }\n    });\n    useRender(() => {\n      const hasPrepend = !!(slots.prepend || props.prependIcon);\n      const hasAppend = !!(slots.append || props.appendIcon);\n      const hasMessages = messages.value.length > 0;\n      const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details);\n      return _createVNode(\"div\", {\n        \"class\": ['v-input', `v-input--${props.direction}`, {\n          'v-input--center-affix': props.centerAffix,\n          'v-input--hide-spin-buttons': props.hideSpinButtons\n        }, densityClasses.value, themeClasses.value, rtlClasses.value, validationClasses.value, props.class],\n        \"style\": [dimensionStyles.value, props.style]\n      }, [hasPrepend && _createVNode(\"div\", {\n        \"key\": \"prepend\",\n        \"class\": \"v-input__prepend\"\n      }, [slots.prepend?.(slotProps.value), props.prependIcon && _createVNode(InputIcon, {\n        \"key\": \"prepend-icon\",\n        \"name\": \"prepend\"\n      }, null)]), slots.default && _createVNode(\"div\", {\n        \"class\": \"v-input__control\"\n      }, [slots.default?.(slotProps.value)]), hasAppend && _createVNode(\"div\", {\n        \"key\": \"append\",\n        \"class\": \"v-input__append\"\n      }, [props.appendIcon && _createVNode(InputIcon, {\n        \"key\": \"append-icon\",\n        \"name\": \"append\"\n      }, null), slots.append?.(slotProps.value)]), hasDetails && _createVNode(\"div\", {\n        \"class\": \"v-input__details\"\n      }, [_createVNode(VMessages, {\n        \"id\": messagesId.value,\n        \"active\": hasMessages,\n        \"messages\": messages.value\n      }, {\n        message: slots.message\n      }), slots.details?.(slotProps.value)])]);\n    });\n    return {\n      reset,\n      resetValidation,\n      validate,\n      isValid,\n      errorMessages\n    };\n  }\n});\n//# sourceMappingURL=VInput.mjs.map","// Utilities\nimport { computed, inject, reactive, shallowRef, toRefs, watchEffect } from 'vue';\nimport { getCurrentInstanceName, mergeDeep, propsFactory } from \"../util/index.mjs\";\nimport { IN_BROWSER, SUPPORTS_TOUCH } from \"../util/globals.mjs\"; // Types\nexport const breakpoints = ['sm', 'md', 'lg', 'xl', 'xxl']; // no xs\n\nexport const DisplaySymbol = Symbol.for('vuetify:display');\nconst defaultDisplayOptions = {\n  mobileBreakpoint: 'lg',\n  thresholds: {\n    xs: 0,\n    sm: 600,\n    md: 960,\n    lg: 1280,\n    xl: 1920,\n    xxl: 2560\n  }\n};\nconst parseDisplayOptions = function () {\n  let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultDisplayOptions;\n  return mergeDeep(defaultDisplayOptions, options);\n};\nfunction getClientWidth(ssr) {\n  return IN_BROWSER && !ssr ? window.innerWidth : typeof ssr === 'object' && ssr.clientWidth || 0;\n}\nfunction getClientHeight(ssr) {\n  return IN_BROWSER && !ssr ? window.innerHeight : typeof ssr === 'object' && ssr.clientHeight || 0;\n}\nfunction getPlatform(ssr) {\n  const userAgent = IN_BROWSER && !ssr ? window.navigator.userAgent : 'ssr';\n  function match(regexp) {\n    return Boolean(userAgent.match(regexp));\n  }\n  const android = match(/android/i);\n  const ios = match(/iphone|ipad|ipod/i);\n  const cordova = match(/cordova/i);\n  const electron = match(/electron/i);\n  const chrome = match(/chrome/i);\n  const edge = match(/edge/i);\n  const firefox = match(/firefox/i);\n  const opera = match(/opera/i);\n  const win = match(/win/i);\n  const mac = match(/mac/i);\n  const linux = match(/linux/i);\n  return {\n    android,\n    ios,\n    cordova,\n    electron,\n    chrome,\n    edge,\n    firefox,\n    opera,\n    win,\n    mac,\n    linux,\n    touch: SUPPORTS_TOUCH,\n    ssr: userAgent === 'ssr'\n  };\n}\nexport function createDisplay(options, ssr) {\n  const {\n    thresholds,\n    mobileBreakpoint\n  } = parseDisplayOptions(options);\n  const height = shallowRef(getClientHeight(ssr));\n  const platform = shallowRef(getPlatform(ssr));\n  const state = reactive({});\n  const width = shallowRef(getClientWidth(ssr));\n  function updateSize() {\n    height.value = getClientHeight();\n    width.value = getClientWidth();\n  }\n  function update() {\n    updateSize();\n    platform.value = getPlatform();\n  }\n\n  // eslint-disable-next-line max-statements\n  watchEffect(() => {\n    const xs = width.value < thresholds.sm;\n    const sm = width.value < thresholds.md && !xs;\n    const md = width.value < thresholds.lg && !(sm || xs);\n    const lg = width.value < thresholds.xl && !(md || sm || xs);\n    const xl = width.value < thresholds.xxl && !(lg || md || sm || xs);\n    const xxl = width.value >= thresholds.xxl;\n    const name = xs ? 'xs' : sm ? 'sm' : md ? 'md' : lg ? 'lg' : xl ? 'xl' : 'xxl';\n    const breakpointValue = typeof mobileBreakpoint === 'number' ? mobileBreakpoint : thresholds[mobileBreakpoint];\n    const mobile = width.value < breakpointValue;\n    state.xs = xs;\n    state.sm = sm;\n    state.md = md;\n    state.lg = lg;\n    state.xl = xl;\n    state.xxl = xxl;\n    state.smAndUp = !xs;\n    state.mdAndUp = !(xs || sm);\n    state.lgAndUp = !(xs || sm || md);\n    state.xlAndUp = !(xs || sm || md || lg);\n    state.smAndDown = !(md || lg || xl || xxl);\n    state.mdAndDown = !(lg || xl || xxl);\n    state.lgAndDown = !(xl || xxl);\n    state.xlAndDown = !xxl;\n    state.name = name;\n    state.height = height.value;\n    state.width = width.value;\n    state.mobile = mobile;\n    state.mobileBreakpoint = mobileBreakpoint;\n    state.platform = platform.value;\n    state.thresholds = thresholds;\n  });\n  if (IN_BROWSER) {\n    window.addEventListener('resize', updateSize, {\n      passive: true\n    });\n  }\n  return {\n    ...toRefs(state),\n    update,\n    ssr: !!ssr\n  };\n}\nexport const makeDisplayProps = propsFactory({\n  mobile: {\n    type: Boolean,\n    default: false\n  },\n  mobileBreakpoint: [Number, String]\n}, 'display');\nexport function useDisplay() {\n  let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();\n  const display = inject(DisplaySymbol);\n  if (!display) throw new Error('Could not find Vuetify display injection');\n  const mobile = computed(() => {\n    if (props.mobile != null) return props.mobile;\n    if (!props.mobileBreakpoint) return display.mobile.value;\n    const breakpointValue = typeof props.mobileBreakpoint === 'number' ? props.mobileBreakpoint : display.thresholds.value[props.mobileBreakpoint];\n    return display.width.value < breakpointValue;\n  });\n  const displayClasses = computed(() => {\n    if (!name) return {};\n    return {\n      [`${name}--mobile`]: mobile.value\n    };\n  });\n  return {\n    ...display,\n    displayClasses,\n    mobile\n  };\n}\n//# sourceMappingURL=display.mjs.map","// Utilities\nimport { computed, inject } from 'vue';\nimport { useRtl } from \"./locale.mjs\";\nimport { clamp, consoleWarn, mergeDeep, refElement } from \"../util/index.mjs\"; // Types\nexport const GoToSymbol = Symbol.for('vuetify:goto');\nfunction genDefaults() {\n  return {\n    container: undefined,\n    duration: 300,\n    layout: false,\n    offset: 0,\n    easing: 'easeInOutCubic',\n    patterns: {\n      linear: t => t,\n      easeInQuad: t => t ** 2,\n      easeOutQuad: t => t * (2 - t),\n      easeInOutQuad: t => t < 0.5 ? 2 * t ** 2 : -1 + (4 - 2 * t) * t,\n      easeInCubic: t => t ** 3,\n      easeOutCubic: t => --t ** 3 + 1,\n      easeInOutCubic: t => t < 0.5 ? 4 * t ** 3 : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\n      easeInQuart: t => t ** 4,\n      easeOutQuart: t => 1 - --t ** 4,\n      easeInOutQuart: t => t < 0.5 ? 8 * t ** 4 : 1 - 8 * --t ** 4,\n      easeInQuint: t => t ** 5,\n      easeOutQuint: t => 1 + --t ** 5,\n      easeInOutQuint: t => t < 0.5 ? 16 * t ** 5 : 1 + 16 * --t ** 5\n    }\n  };\n}\nfunction getContainer(el) {\n  return getTarget(el) ?? (document.scrollingElement || document.body);\n}\nfunction getTarget(el) {\n  return typeof el === 'string' ? document.querySelector(el) : refElement(el);\n}\nfunction getOffset(target, horizontal, rtl) {\n  if (typeof target === 'number') return horizontal && rtl ? -target : target;\n  let el = getTarget(target);\n  let totalOffset = 0;\n  while (el) {\n    totalOffset += horizontal ? el.offsetLeft : el.offsetTop;\n    el = el.offsetParent;\n  }\n  return totalOffset;\n}\nexport function createGoTo(options, locale) {\n  return {\n    rtl: locale.isRtl,\n    options: mergeDeep(genDefaults(), options)\n  };\n}\nexport async function scrollTo(_target, _options, horizontal, goTo) {\n  const property = horizontal ? 'scrollLeft' : 'scrollTop';\n  const options = mergeDeep(goTo?.options ?? genDefaults(), _options);\n  const rtl = goTo?.rtl.value;\n  const target = (typeof _target === 'number' ? _target : getTarget(_target)) ?? 0;\n  const container = options.container === 'parent' && target instanceof HTMLElement ? target.parentElement : getContainer(options.container);\n  const ease = typeof options.easing === 'function' ? options.easing : options.patterns[options.easing];\n  if (!ease) throw new TypeError(`Easing function \"${options.easing}\" not found.`);\n  let targetLocation;\n  if (typeof target === 'number') {\n    targetLocation = getOffset(target, horizontal, rtl);\n  } else {\n    targetLocation = getOffset(target, horizontal, rtl) - getOffset(container, horizontal, rtl);\n    if (options.layout) {\n      const styles = window.getComputedStyle(target);\n      const layoutOffset = styles.getPropertyValue('--v-layout-top');\n      if (layoutOffset) targetLocation -= parseInt(layoutOffset, 10);\n    }\n  }\n  targetLocation += options.offset;\n  targetLocation = clampTarget(container, targetLocation, !!rtl, !!horizontal);\n  const startLocation = container[property] ?? 0;\n  if (targetLocation === startLocation) return Promise.resolve(targetLocation);\n  const startTime = performance.now();\n  return new Promise(resolve => requestAnimationFrame(function step(currentTime) {\n    const timeElapsed = currentTime - startTime;\n    const progress = timeElapsed / options.duration;\n    const location = Math.floor(startLocation + (targetLocation - startLocation) * ease(clamp(progress, 0, 1)));\n    container[property] = location;\n\n    // Allow for some jitter if target time has elapsed\n    if (progress >= 1 && Math.abs(location - container[property]) < 10) {\n      return resolve(targetLocation);\n    } else if (progress > 2) {\n      // The target might not be reachable\n      consoleWarn('Scroll target is not reachable');\n      return resolve(container[property]);\n    }\n    requestAnimationFrame(step);\n  }));\n}\nexport function useGoTo() {\n  let _options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  const goToInstance = inject(GoToSymbol);\n  const {\n    isRtl\n  } = useRtl();\n  if (!goToInstance) throw new Error('[Vuetify] Could not find injected goto instance');\n  const goTo = {\n    ...goToInstance,\n    // can be set via VLocaleProvider\n    rtl: computed(() => goToInstance.rtl.value || isRtl.value)\n  };\n  async function go(target, options) {\n    return scrollTo(target, mergeDeep(_options, options), false, goTo);\n  }\n  go.horizontal = async (target, options) => {\n    return scrollTo(target, mergeDeep(_options, options), true, goTo);\n  };\n  return go;\n}\n\n/**\n * Clamp target value to achieve a smooth scroll animation\n * when the value goes outside the scroll container size\n */\nfunction clampTarget(container, value, rtl, horizontal) {\n  const {\n    scrollWidth,\n    scrollHeight\n  } = container;\n  const [containerWidth, containerHeight] = container === document.scrollingElement ? [window.innerWidth, window.innerHeight] : [container.offsetWidth, container.offsetHeight];\n  let min;\n  let max;\n  if (horizontal) {\n    if (rtl) {\n      min = -(scrollWidth - containerWidth);\n      max = 0;\n    } else {\n      min = 0;\n      max = scrollWidth - containerWidth;\n    }\n  } else {\n    min = 0;\n    max = scrollHeight + -containerHeight;\n  }\n  return Math.max(Math.min(value, max), min);\n}\n//# sourceMappingURL=goto.mjs.map","/* eslint-disable max-statements */\n// Composables\nimport { makeElevationProps } from \"../../composables/elevation.mjs\";\nimport { useRtl } from \"../../composables/locale.mjs\";\nimport { makeRoundedProps } from \"../../composables/rounded.mjs\"; // Utilities\nimport { computed, provide, ref, shallowRef, toRef } from 'vue';\nimport { clamp, createRange, getDecimals, propsFactory } from \"../../util/index.mjs\"; // Types\nexport const VSliderSymbol = Symbol.for('vuetify:v-slider');\nexport function getOffset(e, el, direction) {\n  const vertical = direction === 'vertical';\n  const rect = el.getBoundingClientRect();\n  const touch = 'touches' in e ? e.touches[0] : e;\n  return vertical ? touch.clientY - (rect.top + rect.height / 2) : touch.clientX - (rect.left + rect.width / 2);\n}\nfunction getPosition(e, position) {\n  if ('touches' in e && e.touches.length) return e.touches[0][position];else if ('changedTouches' in e && e.changedTouches.length) return e.changedTouches[0][position];else return e[position];\n}\nexport const makeSliderProps = propsFactory({\n  disabled: {\n    type: Boolean,\n    default: null\n  },\n  error: Boolean,\n  readonly: {\n    type: Boolean,\n    default: null\n  },\n  max: {\n    type: [Number, String],\n    default: 100\n  },\n  min: {\n    type: [Number, String],\n    default: 0\n  },\n  step: {\n    type: [Number, String],\n    default: 0\n  },\n  thumbColor: String,\n  thumbLabel: {\n    type: [Boolean, String],\n    default: undefined,\n    validator: v => typeof v === 'boolean' || v === 'always'\n  },\n  thumbSize: {\n    type: [Number, String],\n    default: 20\n  },\n  showTicks: {\n    type: [Boolean, String],\n    default: false,\n    validator: v => typeof v === 'boolean' || v === 'always'\n  },\n  ticks: {\n    type: [Array, Object]\n  },\n  tickSize: {\n    type: [Number, String],\n    default: 2\n  },\n  color: String,\n  trackColor: String,\n  trackFillColor: String,\n  trackSize: {\n    type: [Number, String],\n    default: 4\n  },\n  direction: {\n    type: String,\n    default: 'horizontal',\n    validator: v => ['vertical', 'horizontal'].includes(v)\n  },\n  reverse: Boolean,\n  ...makeRoundedProps(),\n  ...makeElevationProps({\n    elevation: 2\n  }),\n  ripple: {\n    type: Boolean,\n    default: true\n  }\n}, 'Slider');\nexport const useSteps = props => {\n  const min = computed(() => parseFloat(props.min));\n  const max = computed(() => parseFloat(props.max));\n  const step = computed(() => +props.step > 0 ? parseFloat(props.step) : 0);\n  const decimals = computed(() => Math.max(getDecimals(step.value), getDecimals(min.value)));\n  function roundValue(value) {\n    value = parseFloat(value);\n    if (step.value <= 0) return value;\n    const clamped = clamp(value, min.value, max.value);\n    const offset = min.value % step.value;\n    const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;\n    return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));\n  }\n  return {\n    min,\n    max,\n    step,\n    decimals,\n    roundValue\n  };\n};\nexport const useSlider = _ref => {\n  let {\n    props,\n    steps,\n    onSliderStart,\n    onSliderMove,\n    onSliderEnd,\n    getActiveThumb\n  } = _ref;\n  const {\n    isRtl\n  } = useRtl();\n  const isReversed = toRef(props, 'reverse');\n  const vertical = computed(() => props.direction === 'vertical');\n  const indexFromEnd = computed(() => vertical.value !== isReversed.value);\n  const {\n    min,\n    max,\n    step,\n    decimals,\n    roundValue\n  } = steps;\n  const thumbSize = computed(() => parseInt(props.thumbSize, 10));\n  const tickSize = computed(() => parseInt(props.tickSize, 10));\n  const trackSize = computed(() => parseInt(props.trackSize, 10));\n  const numTicks = computed(() => (max.value - min.value) / step.value);\n  const disabled = toRef(props, 'disabled');\n  const thumbColor = computed(() => props.error || props.disabled ? undefined : props.thumbColor ?? props.color);\n  const trackColor = computed(() => props.error || props.disabled ? undefined : props.trackColor ?? props.color);\n  const trackFillColor = computed(() => props.error || props.disabled ? undefined : props.trackFillColor ?? props.color);\n  const mousePressed = shallowRef(false);\n  const startOffset = shallowRef(0);\n  const trackContainerRef = ref();\n  const activeThumbRef = ref();\n  function parseMouseMove(e) {\n    const vertical = props.direction === 'vertical';\n    const start = vertical ? 'top' : 'left';\n    const length = vertical ? 'height' : 'width';\n    const position = vertical ? 'clientY' : 'clientX';\n    const {\n      [start]: trackStart,\n      [length]: trackLength\n    } = trackContainerRef.value?.$el.getBoundingClientRect();\n    const clickOffset = getPosition(e, position);\n\n    // It is possible for left to be NaN, force to number\n    let clickPos = Math.min(Math.max((clickOffset - trackStart - startOffset.value) / trackLength, 0), 1) || 0;\n    if (vertical ? indexFromEnd.value : indexFromEnd.value !== isRtl.value) clickPos = 1 - clickPos;\n    return roundValue(min.value + clickPos * (max.value - min.value));\n  }\n  const handleStop = e => {\n    onSliderEnd({\n      value: parseMouseMove(e)\n    });\n    mousePressed.value = false;\n    startOffset.value = 0;\n  };\n  const handleStart = e => {\n    activeThumbRef.value = getActiveThumb(e);\n    if (!activeThumbRef.value) return;\n    activeThumbRef.value.focus();\n    mousePressed.value = true;\n    if (activeThumbRef.value.contains(e.target)) {\n      startOffset.value = getOffset(e, activeThumbRef.value, props.direction);\n    } else {\n      startOffset.value = 0;\n      onSliderMove({\n        value: parseMouseMove(e)\n      });\n    }\n    onSliderStart({\n      value: parseMouseMove(e)\n    });\n  };\n  const moveListenerOptions = {\n    passive: true,\n    capture: true\n  };\n  function onMouseMove(e) {\n    onSliderMove({\n      value: parseMouseMove(e)\n    });\n  }\n  function onSliderMouseUp(e) {\n    e.stopPropagation();\n    e.preventDefault();\n    handleStop(e);\n    window.removeEventListener('mousemove', onMouseMove, moveListenerOptions);\n    window.removeEventListener('mouseup', onSliderMouseUp);\n  }\n  function onSliderTouchend(e) {\n    handleStop(e);\n    window.removeEventListener('touchmove', onMouseMove, moveListenerOptions);\n    e.target?.removeEventListener('touchend', onSliderTouchend);\n  }\n  function onSliderTouchstart(e) {\n    handleStart(e);\n    window.addEventListener('touchmove', onMouseMove, moveListenerOptions);\n    e.target?.addEventListener('touchend', onSliderTouchend, {\n      passive: false\n    });\n  }\n  function onSliderMousedown(e) {\n    e.preventDefault();\n    handleStart(e);\n    window.addEventListener('mousemove', onMouseMove, moveListenerOptions);\n    window.addEventListener('mouseup', onSliderMouseUp, {\n      passive: false\n    });\n  }\n  const position = val => {\n    const percentage = (val - min.value) / (max.value - min.value) * 100;\n    return clamp(isNaN(percentage) ? 0 : percentage, 0, 100);\n  };\n  const showTicks = toRef(props, 'showTicks');\n  const parsedTicks = computed(() => {\n    if (!showTicks.value) return [];\n    if (!props.ticks) {\n      return numTicks.value !== Infinity ? createRange(numTicks.value + 1).map(t => {\n        const value = min.value + t * step.value;\n        return {\n          value,\n          position: position(value)\n        };\n      }) : [];\n    }\n    if (Array.isArray(props.ticks)) return props.ticks.map(t => ({\n      value: t,\n      position: position(t),\n      label: t.toString()\n    }));\n    return Object.keys(props.ticks).map(key => ({\n      value: parseFloat(key),\n      position: position(parseFloat(key)),\n      label: props.ticks[key]\n    }));\n  });\n  const hasLabels = computed(() => parsedTicks.value.some(_ref2 => {\n    let {\n      label\n    } = _ref2;\n    return !!label;\n  }));\n  const data = {\n    activeThumbRef,\n    color: toRef(props, 'color'),\n    decimals,\n    disabled,\n    direction: toRef(props, 'direction'),\n    elevation: toRef(props, 'elevation'),\n    hasLabels,\n    isReversed,\n    indexFromEnd,\n    min,\n    max,\n    mousePressed,\n    numTicks,\n    onSliderMousedown,\n    onSliderTouchstart,\n    parsedTicks,\n    parseMouseMove,\n    position,\n    readonly: toRef(props, 'readonly'),\n    rounded: toRef(props, 'rounded'),\n    roundValue,\n    showTicks,\n    startOffset,\n    step,\n    thumbSize,\n    thumbColor,\n    thumbLabel: toRef(props, 'thumbLabel'),\n    ticks: toRef(props, 'ticks'),\n    tickSize,\n    trackColor,\n    trackContainerRef,\n    trackFillColor,\n    trackSize,\n    vertical\n  };\n  provide(VSliderSymbol, data);\n  return data;\n};\n//# sourceMappingURL=slider.mjs.map","import { vShow as _vShow, withDirectives as _withDirectives, resolveDirective as _resolveDirective, createVNode as _createVNode } from \"vue\";\n// Styles\nimport \"./VSliderThumb.css\";\n\n// Components\nimport { VSliderSymbol } from \"./slider.mjs\";\nimport { VScaleTransition } from \"../transitions/index.mjs\"; // Composables\nimport { useTextColor } from \"../../composables/color.mjs\";\nimport { makeComponentProps } from \"../../composables/component.mjs\";\nimport { useElevation } from \"../../composables/elevation.mjs\";\nimport { useRtl } from \"../../composables/locale.mjs\"; // Directives\nimport Ripple from \"../../directives/ripple/index.mjs\"; // Utilities\nimport { computed, inject } from 'vue';\nimport { convertToUnit, genericComponent, keyValues, propsFactory, useRender } from \"../../util/index.mjs\"; // Types\nexport const makeVSliderThumbProps = propsFactory({\n  focused: Boolean,\n  max: {\n    type: Number,\n    required: true\n  },\n  min: {\n    type: Number,\n    required: true\n  },\n  modelValue: {\n    type: Number,\n    required: true\n  },\n  position: {\n    type: Number,\n    required: true\n  },\n  ripple: {\n    type: [Boolean, Object],\n    default: true\n  },\n  ...makeComponentProps()\n}, 'VSliderThumb');\nexport const VSliderThumb = genericComponent()({\n  name: 'VSliderThumb',\n  directives: {\n    Ripple\n  },\n  props: makeVSliderThumbProps(),\n  emits: {\n    'update:modelValue': v => true\n  },\n  setup(props, _ref) {\n    let {\n      slots,\n      emit\n    } = _ref;\n    const slider = inject(VSliderSymbol);\n    const {\n      isRtl,\n      rtlClasses\n    } = useRtl();\n    if (!slider) throw new Error('[Vuetify] v-slider-thumb must be used inside v-slider or v-range-slider');\n    const {\n      thumbColor,\n      step,\n      disabled,\n      thumbSize,\n      thumbLabel,\n      direction,\n      isReversed,\n      vertical,\n      readonly,\n      elevation,\n      mousePressed,\n      decimals,\n      indexFromEnd\n    } = slider;\n    const elevationProps = computed(() => !disabled.value ? elevation.value : undefined);\n    const {\n      elevationClasses\n    } = useElevation(elevationProps);\n    const {\n      textColorClasses,\n      textColorStyles\n    } = useTextColor(thumbColor);\n    const {\n      pageup,\n      pagedown,\n      end,\n      home,\n      left,\n      right,\n      down,\n      up\n    } = keyValues;\n    const relevantKeys = [pageup, pagedown, end, home, left, right, down, up];\n    const multipliers = computed(() => {\n      if (step.value) return [1, 2, 3];else return [1, 5, 10];\n    });\n    function parseKeydown(e, value) {\n      if (!relevantKeys.includes(e.key)) return;\n      e.preventDefault();\n      const _step = step.value || 0.1;\n      const steps = (props.max - props.min) / _step;\n      if ([left, right, down, up].includes(e.key)) {\n        const increase = vertical.value ? [isRtl.value ? left : right, isReversed.value ? down : up] : indexFromEnd.value !== isRtl.value ? [left, up] : [right, up];\n        const direction = increase.includes(e.key) ? 1 : -1;\n        const multiplier = e.shiftKey ? 2 : e.ctrlKey ? 1 : 0;\n        value = value + direction * _step * multipliers.value[multiplier];\n      } else if (e.key === home) {\n        value = props.min;\n      } else if (e.key === end) {\n        value = props.max;\n      } else {\n        const direction = e.key === pagedown ? 1 : -1;\n        value = value - direction * _step * (steps > 100 ? steps / 10 : 10);\n      }\n      return Math.max(props.min, Math.min(props.max, value));\n    }\n    function onKeydown(e) {\n      const newValue = parseKeydown(e, props.modelValue);\n      newValue != null && emit('update:modelValue', newValue);\n    }\n    useRender(() => {\n      const positionPercentage = convertToUnit(indexFromEnd.value ? 100 - props.position : props.position, '%');\n      return _createVNode(\"div\", {\n        \"class\": ['v-slider-thumb', {\n          'v-slider-thumb--focused': props.focused,\n          'v-slider-thumb--pressed': props.focused && mousePressed.value\n        }, props.class, rtlClasses.value],\n        \"style\": [{\n          '--v-slider-thumb-position': positionPercentage,\n          '--v-slider-thumb-size': convertToUnit(thumbSize.value)\n        }, props.style],\n        \"role\": \"slider\",\n        \"tabindex\": disabled.value ? -1 : 0,\n        \"aria-valuemin\": props.min,\n        \"aria-valuemax\": props.max,\n        \"aria-valuenow\": props.modelValue,\n        \"aria-readonly\": !!readonly.value,\n        \"aria-orientation\": direction.value,\n        \"onKeydown\": !readonly.value ? onKeydown : undefined\n      }, [_createVNode(\"div\", {\n        \"class\": ['v-slider-thumb__surface', textColorClasses.value, elevationClasses.value],\n        \"style\": {\n          ...textColorStyles.value\n        }\n      }, null), _withDirectives(_createVNode(\"div\", {\n        \"class\": ['v-slider-thumb__ripple', textColorClasses.value],\n        \"style\": textColorStyles.value\n      }, null), [[_resolveDirective(\"ripple\"), props.ripple, null, {\n        circle: true,\n        center: true\n      }]]), _createVNode(VScaleTransition, {\n        \"origin\": \"bottom center\"\n      }, {\n        default: () => [_withDirectives(_createVNode(\"div\", {\n          \"class\": \"v-slider-thumb__label-container\"\n        }, [_createVNode(\"div\", {\n          \"class\": ['v-slider-thumb__label']\n        }, [_createVNode(\"div\", null, [slots['thumb-label']?.({\n          modelValue: props.modelValue\n        }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)])])]), [[_vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]\n      })]);\n    });\n    return {};\n  }\n});\n//# sourceMappingURL=VSliderThumb.mjs.map","import { createVNode as _createVNode } from \"vue\";\n// Styles\nimport \"./VSliderTrack.css\";\n\n// Components\nimport { VSliderSymbol } from \"./slider.mjs\"; // Composables\nimport { useBackgroundColor } from \"../../composables/color.mjs\";\nimport { makeComponentProps } from \"../../composables/component.mjs\";\nimport { useRounded } from \"../../composables/rounded.mjs\"; // Utilities\nimport { computed, inject } from 'vue';\nimport { convertToUnit, genericComponent, propsFactory, useRender } from \"../../util/index.mjs\"; // Types\nexport const makeVSliderTrackProps = propsFactory({\n  start: {\n    type: Number,\n    required: true\n  },\n  stop: {\n    type: Number,\n    required: true\n  },\n  ...makeComponentProps()\n}, 'VSliderTrack');\nexport const VSliderTrack = genericComponent()({\n  name: 'VSliderTrack',\n  props: makeVSliderTrackProps(),\n  emits: {},\n  setup(props, _ref) {\n    let {\n      slots\n    } = _ref;\n    const slider = inject(VSliderSymbol);\n    if (!slider) throw new Error('[Vuetify] v-slider-track must be inside v-slider or v-range-slider');\n    const {\n      color,\n      parsedTicks,\n      rounded,\n      showTicks,\n      tickSize,\n      trackColor,\n      trackFillColor,\n      trackSize,\n      vertical,\n      min,\n      max,\n      indexFromEnd\n    } = slider;\n    const {\n      roundedClasses\n    } = useRounded(rounded);\n    const {\n      backgroundColorClasses: trackFillColorClasses,\n      backgroundColorStyles: trackFillColorStyles\n    } = useBackgroundColor(trackFillColor);\n    const {\n      backgroundColorClasses: trackColorClasses,\n      backgroundColorStyles: trackColorStyles\n    } = useBackgroundColor(trackColor);\n    const startDir = computed(() => `inset-${vertical.value ? 'block' : 'inline'}-${indexFromEnd.value ? 'end' : 'start'}`);\n    const endDir = computed(() => vertical.value ? 'height' : 'width');\n    const backgroundStyles = computed(() => {\n      return {\n        [startDir.value]: '0%',\n        [endDir.value]: '100%'\n      };\n    });\n    const trackFillWidth = computed(() => props.stop - props.start);\n    const trackFillStyles = computed(() => {\n      return {\n        [startDir.value]: convertToUnit(props.start, '%'),\n        [endDir.value]: convertToUnit(trackFillWidth.value, '%')\n      };\n    });\n    const computedTicks = computed(() => {\n      if (!showTicks.value) return [];\n      const ticks = vertical.value ? parsedTicks.value.slice().reverse() : parsedTicks.value;\n      return ticks.map((tick, index) => {\n        const directionValue = tick.value !== min.value && tick.value !== max.value ? convertToUnit(tick.position, '%') : undefined;\n        return _createVNode(\"div\", {\n          \"key\": tick.value,\n          \"class\": ['v-slider-track__tick', {\n            'v-slider-track__tick--filled': tick.position >= props.start && tick.position <= props.stop,\n            'v-slider-track__tick--first': tick.value === min.value,\n            'v-slider-track__tick--last': tick.value === max.value\n          }],\n          \"style\": {\n            [startDir.value]: directionValue\n          }\n        }, [(tick.label || slots['tick-label']) && _createVNode(\"div\", {\n          \"class\": \"v-slider-track__tick-label\"\n        }, [slots['tick-label']?.({\n          tick,\n          index\n        }) ?? tick.label])]);\n      });\n    });\n    useRender(() => {\n      return _createVNode(\"div\", {\n        \"class\": ['v-slider-track', roundedClasses.value, props.class],\n        \"style\": [{\n          '--v-slider-track-size': convertToUnit(trackSize.value),\n          '--v-slider-tick-size': convertToUnit(tickSize.value)\n        }, props.style]\n      }, [_createVNode(\"div\", {\n        \"class\": ['v-slider-track__background', trackColorClasses.value, {\n          'v-slider-track__background--opacity': !!color.value || !trackFillColor.value\n        }],\n        \"style\": {\n          ...backgroundStyles.value,\n          ...trackColorStyles.value\n        }\n      }, null), _createVNode(\"div\", {\n        \"class\": ['v-slider-track__fill', trackFillColorClasses.value],\n        \"style\": {\n          ...trackFillStyles.value,\n          ...trackFillColorStyles.value\n        }\n      }, null), showTicks.value && _createVNode(\"div\", {\n        \"class\": ['v-slider-track__ticks', {\n          'v-slider-track__ticks--always-show': showTicks.value === 'always'\n        }]\n      }, [computedTicks.value])]);\n    });\n    return {};\n  }\n});\n//# sourceMappingURL=VSliderTrack.mjs.map","// Utilities\nimport { createRange, padStart } from \"../../../util/index.mjs\"; // Types\nconst firstDay = {\n  '001': 1,\n  AD: 1,\n  AE: 6,\n  AF: 6,\n  AG: 0,\n  AI: 1,\n  AL: 1,\n  AM: 1,\n  AN: 1,\n  AR: 1,\n  AS: 0,\n  AT: 1,\n  AU: 1,\n  AX: 1,\n  AZ: 1,\n  BA: 1,\n  BD: 0,\n  BE: 1,\n  BG: 1,\n  BH: 6,\n  BM: 1,\n  BN: 1,\n  BR: 0,\n  BS: 0,\n  BT: 0,\n  BW: 0,\n  BY: 1,\n  BZ: 0,\n  CA: 0,\n  CH: 1,\n  CL: 1,\n  CM: 1,\n  CN: 1,\n  CO: 0,\n  CR: 1,\n  CY: 1,\n  CZ: 1,\n  DE: 1,\n  DJ: 6,\n  DK: 1,\n  DM: 0,\n  DO: 0,\n  DZ: 6,\n  EC: 1,\n  EE: 1,\n  EG: 6,\n  ES: 1,\n  ET: 0,\n  FI: 1,\n  FJ: 1,\n  FO: 1,\n  FR: 1,\n  GB: 1,\n  'GB-alt-variant': 0,\n  GE: 1,\n  GF: 1,\n  GP: 1,\n  GR: 1,\n  GT: 0,\n  GU: 0,\n  HK: 0,\n  HN: 0,\n  HR: 1,\n  HU: 1,\n  ID: 0,\n  IE: 1,\n  IL: 0,\n  IN: 0,\n  IQ: 6,\n  IR: 6,\n  IS: 1,\n  IT: 1,\n  JM: 0,\n  JO: 6,\n  JP: 0,\n  KE: 0,\n  KG: 1,\n  KH: 0,\n  KR: 0,\n  KW: 6,\n  KZ: 1,\n  LA: 0,\n  LB: 1,\n  LI: 1,\n  LK: 1,\n  LT: 1,\n  LU: 1,\n  LV: 1,\n  LY: 6,\n  MC: 1,\n  MD: 1,\n  ME: 1,\n  MH: 0,\n  MK: 1,\n  MM: 0,\n  MN: 1,\n  MO: 0,\n  MQ: 1,\n  MT: 0,\n  MV: 5,\n  MX: 0,\n  MY: 1,\n  MZ: 0,\n  NI: 0,\n  NL: 1,\n  NO: 1,\n  NP: 0,\n  NZ: 1,\n  OM: 6,\n  PA: 0,\n  PE: 0,\n  PH: 0,\n  PK: 0,\n  PL: 1,\n  PR: 0,\n  PT: 0,\n  PY: 0,\n  QA: 6,\n  RE: 1,\n  RO: 1,\n  RS: 1,\n  RU: 1,\n  SA: 0,\n  SD: 6,\n  SE: 1,\n  SG: 0,\n  SI: 1,\n  SK: 1,\n  SM: 1,\n  SV: 0,\n  SY: 6,\n  TH: 0,\n  TJ: 1,\n  TM: 1,\n  TR: 1,\n  TT: 0,\n  TW: 0,\n  UA: 1,\n  UM: 0,\n  US: 0,\n  UY: 1,\n  UZ: 1,\n  VA: 1,\n  VE: 0,\n  VI: 0,\n  VN: 1,\n  WS: 0,\n  XK: 1,\n  YE: 0,\n  ZA: 0,\n  ZW: 0\n};\nfunction getWeekArray(date, locale) {\n  const weeks = [];\n  let currentWeek = [];\n  const firstDayOfMonth = startOfMonth(date);\n  const lastDayOfMonth = endOfMonth(date);\n  const firstDayWeekIndex = (firstDayOfMonth.getDay() - firstDay[locale.slice(-2).toUpperCase()] + 7) % 7;\n  const lastDayWeekIndex = (lastDayOfMonth.getDay() - firstDay[locale.slice(-2).toUpperCase()] + 7) % 7;\n  for (let i = 0; i < firstDayWeekIndex; i++) {\n    const adjacentDay = new Date(firstDayOfMonth);\n    adjacentDay.setDate(adjacentDay.getDate() - (firstDayWeekIndex - i));\n    currentWeek.push(adjacentDay);\n  }\n  for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {\n    const day = new Date(date.getFullYear(), date.getMonth(), i);\n\n    // Add the day to the current week\n    currentWeek.push(day);\n\n    // If the current week has 7 days, add it to the weeks array and start a new week\n    if (currentWeek.length === 7) {\n      weeks.push(currentWeek);\n      currentWeek = [];\n    }\n  }\n  for (let i = 1; i < 7 - lastDayWeekIndex; i++) {\n    const adjacentDay = new Date(lastDayOfMonth);\n    adjacentDay.setDate(adjacentDay.getDate() + i);\n    currentWeek.push(adjacentDay);\n  }\n  if (currentWeek.length > 0) {\n    weeks.push(currentWeek);\n  }\n  return weeks;\n}\nfunction startOfWeek(date, locale) {\n  const d = new Date(date);\n  while (d.getDay() !== (firstDay[locale.slice(-2).toUpperCase()] ?? 0)) {\n    d.setDate(d.getDate() - 1);\n  }\n  return d;\n}\nfunction endOfWeek(date, locale) {\n  const d = new Date(date);\n  const lastDay = ((firstDay[locale.slice(-2).toUpperCase()] ?? 0) + 6) % 7;\n  while (d.getDay() !== lastDay) {\n    d.setDate(d.getDate() + 1);\n  }\n  return d;\n}\nfunction startOfMonth(date) {\n  return new Date(date.getFullYear(), date.getMonth(), 1);\n}\nfunction endOfMonth(date) {\n  return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n}\nfunction parseLocalDate(value) {\n  const parts = value.split('-').map(Number);\n\n  // new Date() uses local time zone when passing individual date component values\n  return new Date(parts[0], parts[1] - 1, parts[2]);\n}\nconst _YYYMMDD = /^([12]\\d{3}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[12]\\d|3[01]))$/;\nfunction date(value) {\n  if (value == null) return new Date();\n  if (value instanceof Date) return value;\n  if (typeof value === 'string') {\n    let parsed;\n    if (_YYYMMDD.test(value)) {\n      return parseLocalDate(value);\n    } else {\n      parsed = Date.parse(value);\n    }\n    if (!isNaN(parsed)) return new Date(parsed);\n  }\n  return null;\n}\nconst sundayJanuarySecond2000 = new Date(2000, 0, 2);\nfunction getWeekdays(locale) {\n  const daysFromSunday = firstDay[locale.slice(-2).toUpperCase()];\n  return createRange(7).map(i => {\n    const weekday = new Date(sundayJanuarySecond2000);\n    weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);\n    return new Intl.DateTimeFormat(locale, {\n      weekday: 'narrow'\n    }).format(weekday);\n  });\n}\nfunction format(value, formatString, locale, formats) {\n  const newDate = date(value) ?? new Date();\n  const customFormat = formats?.[formatString];\n  if (typeof customFormat === 'function') {\n    return customFormat(newDate, formatString, locale);\n  }\n  let options = {};\n  switch (formatString) {\n    case 'fullDate':\n      options = {\n        year: 'numeric',\n        month: 'long',\n        day: 'numeric'\n      };\n      break;\n    case 'fullDateWithWeekday':\n      options = {\n        weekday: 'long',\n        year: 'numeric',\n        month: 'long',\n        day: 'numeric'\n      };\n      break;\n    case 'normalDate':\n      const day = newDate.getDate();\n      const month = new Intl.DateTimeFormat(locale, {\n        month: 'long'\n      }).format(newDate);\n      return `${day} ${month}`;\n    case 'normalDateWithWeekday':\n      options = {\n        weekday: 'short',\n        day: 'numeric',\n        month: 'short'\n      };\n      break;\n    case 'shortDate':\n      options = {\n        month: 'short',\n        day: 'numeric'\n      };\n      break;\n    case 'year':\n      options = {\n        year: 'numeric'\n      };\n      break;\n    case 'month':\n      options = {\n        month: 'long'\n      };\n      break;\n    case 'monthShort':\n      options = {\n        month: 'short'\n      };\n      break;\n    case 'monthAndYear':\n      options = {\n        month: 'long',\n        year: 'numeric'\n      };\n      break;\n    case 'monthAndDate':\n      options = {\n        month: 'long',\n        day: 'numeric'\n      };\n      break;\n    case 'weekday':\n      options = {\n        weekday: 'long'\n      };\n      break;\n    case 'weekdayShort':\n      options = {\n        weekday: 'short'\n      };\n      break;\n    case 'dayOfMonth':\n      return new Intl.NumberFormat(locale).format(newDate.getDate());\n    case 'hours12h':\n      options = {\n        hour: 'numeric',\n        hour12: true\n      };\n      break;\n    case 'hours24h':\n      options = {\n        hour: 'numeric',\n        hour12: false\n      };\n      break;\n    case 'minutes':\n      options = {\n        minute: 'numeric'\n      };\n      break;\n    case 'seconds':\n      options = {\n        second: 'numeric'\n      };\n      break;\n    case 'fullTime':\n      options = {\n        hour: 'numeric',\n        minute: 'numeric',\n        second: 'numeric',\n        hour12: true\n      };\n      break;\n    case 'fullTime12h':\n      options = {\n        hour: 'numeric',\n        minute: 'numeric',\n        second: 'numeric',\n        hour12: true\n      };\n      break;\n    case 'fullTime24h':\n      options = {\n        hour: 'numeric',\n        minute: 'numeric',\n        second: 'numeric',\n        hour12: false\n      };\n      break;\n    case 'fullDateTime':\n      options = {\n        year: 'numeric',\n        month: 'long',\n        day: 'numeric',\n        hour: 'numeric',\n        minute: 'numeric',\n        second: 'numeric',\n        hour12: true\n      };\n      break;\n    case 'fullDateTime12h':\n      options = {\n        year: 'numeric',\n        month: 'long',\n        day: 'numeric',\n        hour: 'numeric',\n        minute: 'numeric',\n        second: 'numeric',\n        hour12: true\n      };\n      break;\n    case 'fullDateTime24h':\n      options = {\n        year: 'numeric',\n        month: 'long',\n        day: 'numeric',\n        hour: 'numeric',\n        minute: 'numeric',\n        second: 'numeric',\n        hour12: false\n      };\n      break;\n    case 'keyboardDate':\n      options = {\n        year: 'numeric',\n        month: '2-digit',\n        day: '2-digit'\n      };\n      break;\n    case 'keyboardDateTime':\n      options = {\n        year: 'numeric',\n        month: '2-digit',\n        day: '2-digit',\n        hour: 'numeric',\n        minute: 'numeric',\n        second: 'numeric',\n        hour12: false\n      };\n      break;\n    case 'keyboardDateTime12h':\n      options = {\n        year: 'numeric',\n        month: '2-digit',\n        day: '2-digit',\n        hour: 'numeric',\n        minute: 'numeric',\n        second: 'numeric',\n        hour12: true\n      };\n      break;\n    case 'keyboardDateTime24h':\n      options = {\n        year: 'numeric',\n        month: '2-digit',\n        day: '2-digit',\n        hour: 'numeric',\n        minute: 'numeric',\n        second: 'numeric',\n        hour12: false\n      };\n      break;\n    default:\n      options = customFormat ?? {\n        timeZone: 'UTC',\n        timeZoneName: 'short'\n      };\n  }\n  return new Intl.DateTimeFormat(locale, options).format(newDate);\n}\nfunction toISO(adapter, value) {\n  const date = adapter.toJsDate(value);\n  const year = date.getFullYear();\n  const month = padStart(String(date.getMonth() + 1), 2, '0');\n  const day = padStart(String(date.getDate()), 2, '0');\n  return `${year}-${month}-${day}`;\n}\nfunction parseISO(value) {\n  const [year, month, day] = value.split('-').map(Number);\n  return new Date(year, month - 1, day);\n}\nfunction addMinutes(date, amount) {\n  const d = new Date(date);\n  d.setMinutes(d.getMinutes() + amount);\n  return d;\n}\nfunction addHours(date, amount) {\n  const d = new Date(date);\n  d.setHours(d.getHours() + amount);\n  return d;\n}\nfunction addDays(date, amount) {\n  const d = new Date(date);\n  d.setDate(d.getDate() + amount);\n  return d;\n}\nfunction addWeeks(date, amount) {\n  const d = new Date(date);\n  d.setDate(d.getDate() + amount * 7);\n  return d;\n}\nfunction addMonths(date, amount) {\n  const d = new Date(date);\n  d.setDate(1);\n  d.setMonth(d.getMonth() + amount);\n  return d;\n}\nfunction getYear(date) {\n  return date.getFullYear();\n}\nfunction getMonth(date) {\n  return date.getMonth();\n}\nfunction getDate(date) {\n  return date.getDate();\n}\nfunction getNextMonth(date) {\n  return new Date(date.getFullYear(), date.getMonth() + 1, 1);\n}\nfunction getPreviousMonth(date) {\n  return new Date(date.getFullYear(), date.getMonth() - 1, 1);\n}\nfunction getHours(date) {\n  return date.getHours();\n}\nfunction getMinutes(date) {\n  return date.getMinutes();\n}\nfunction startOfYear(date) {\n  return new Date(date.getFullYear(), 0, 1);\n}\nfunction endOfYear(date) {\n  return new Date(date.getFullYear(), 11, 31);\n}\nfunction isWithinRange(date, range) {\n  return isAfter(date, range[0]) && isBefore(date, range[1]);\n}\nfunction isValid(date) {\n  const d = new Date(date);\n  return d instanceof Date && !isNaN(d.getTime());\n}\nfunction isAfter(date, comparing) {\n  return date.getTime() > comparing.getTime();\n}\nfunction isAfterDay(date, comparing) {\n  return isAfter(startOfDay(date), startOfDay(comparing));\n}\nfunction isBefore(date, comparing) {\n  return date.getTime() < comparing.getTime();\n}\nfunction isEqual(date, comparing) {\n  return date.getTime() === comparing.getTime();\n}\nfunction isSameDay(date, comparing) {\n  return date.getDate() === comparing.getDate() && date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();\n}\nfunction isSameMonth(date, comparing) {\n  return date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();\n}\nfunction isSameYear(date, comparing) {\n  return date.getFullYear() === comparing.getFullYear();\n}\nfunction getDiff(date, comparing, unit) {\n  const d = new Date(date);\n  const c = new Date(comparing);\n  switch (unit) {\n    case 'years':\n      return d.getFullYear() - c.getFullYear();\n    case 'quarters':\n      return Math.floor((d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12) / 4);\n    case 'months':\n      return d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12;\n    case 'weeks':\n      return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24 * 7));\n    case 'days':\n      return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24));\n    case 'hours':\n      return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60));\n    case 'minutes':\n      return Math.floor((d.getTime() - c.getTime()) / (1000 * 60));\n    case 'seconds':\n      return Math.floor((d.getTime() - c.getTime()) / 1000);\n    default:\n      {\n        return d.getTime() - c.getTime();\n      }\n  }\n}\nfunction setHours(date, count) {\n  const d = new Date(date);\n  d.setHours(count);\n  return d;\n}\nfunction setMinutes(date, count) {\n  const d = new Date(date);\n  d.setMinutes(count);\n  return d;\n}\nfunction setMonth(date, count) {\n  const d = new Date(date);\n  d.setMonth(count);\n  return d;\n}\nfunction setDate(date, day) {\n  const d = new Date(date);\n  d.setDate(day);\n  return d;\n}\nfunction setYear(date, year) {\n  const d = new Date(date);\n  d.setFullYear(year);\n  return d;\n}\nfunction startOfDay(date) {\n  return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0, 0);\n}\nfunction endOfDay(date) {\n  return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n}\nexport class VuetifyDateAdapter {\n  constructor(options) {\n    this.locale = options.locale;\n    this.formats = options.formats;\n  }\n  date(value) {\n    return date(value);\n  }\n  toJsDate(date) {\n    return date;\n  }\n  toISO(date) {\n    return toISO(this, date);\n  }\n  parseISO(date) {\n    return parseISO(date);\n  }\n  addMinutes(date, amount) {\n    return addMinutes(date, amount);\n  }\n  addHours(date, amount) {\n    return addHours(date, amount);\n  }\n  addDays(date, amount) {\n    return addDays(date, amount);\n  }\n  addWeeks(date, amount) {\n    return addWeeks(date, amount);\n  }\n  addMonths(date, amount) {\n    return addMonths(date, amount);\n  }\n  getWeekArray(date) {\n    return getWeekArray(date, this.locale);\n  }\n  startOfWeek(date) {\n    return startOfWeek(date, this.locale);\n  }\n  endOfWeek(date) {\n    return endOfWeek(date, this.locale);\n  }\n  startOfMonth(date) {\n    return startOfMonth(date);\n  }\n  endOfMonth(date) {\n    return endOfMonth(date);\n  }\n  format(date, formatString) {\n    return format(date, formatString, this.locale, this.formats);\n  }\n  isEqual(date, comparing) {\n    return isEqual(date, comparing);\n  }\n  isValid(date) {\n    return isValid(date);\n  }\n  isWithinRange(date, range) {\n    return isWithinRange(date, range);\n  }\n  isAfter(date, comparing) {\n    return isAfter(date, comparing);\n  }\n  isAfterDay(date, comparing) {\n    return isAfterDay(date, comparing);\n  }\n  isBefore(date, comparing) {\n    return !isAfter(date, comparing) && !isEqual(date, comparing);\n  }\n  isSameDay(date, comparing) {\n    return isSameDay(date, comparing);\n  }\n  isSameMonth(date, comparing) {\n    return isSameMonth(date, comparing);\n  }\n  isSameYear(date, comparing) {\n    return isSameYear(date, comparing);\n  }\n  setMinutes(date, count) {\n    return setMinutes(date, count);\n  }\n  setHours(date, count) {\n    return setHours(date, count);\n  }\n  setMonth(date, count) {\n    return setMonth(date, count);\n  }\n  setDate(date, day) {\n    return setDate(date, day);\n  }\n  setYear(date, year) {\n    return setYear(date, year);\n  }\n  getDiff(date, comparing, unit) {\n    return getDiff(date, comparing, unit);\n  }\n  getWeekdays() {\n    return getWeekdays(this.locale);\n  }\n  getYear(date) {\n    return getYear(date);\n  }\n  getMonth(date) {\n    return getMonth(date);\n  }\n  getDate(date) {\n    return getDate(date);\n  }\n  getNextMonth(date) {\n    return getNextMonth(date);\n  }\n  getPreviousMonth(date) {\n    return getPreviousMonth(date);\n  }\n  getHours(date) {\n    return getHours(date);\n  }\n  getMinutes(date) {\n    return getMinutes(date);\n  }\n  startOfDay(date) {\n    return startOfDay(date);\n  }\n  endOfDay(date) {\n    return endOfDay(date);\n  }\n  startOfYear(date) {\n    return startOfYear(date);\n  }\n  endOfYear(date) {\n    return endOfYear(date);\n  }\n}\n//# sourceMappingURL=vuetify.mjs.map","// Composables\nimport { useLocale } from \"../locale.mjs\"; // Utilities\nimport { inject, reactive, watch } from 'vue';\nimport { mergeDeep } from \"../../util/index.mjs\"; // Types\n// Adapters\nimport { VuetifyDateAdapter } from \"./adapters/vuetify.mjs\";\n/** Supports module augmentation to specify date adapter types */\nexport let DateModule;\nexport const DateOptionsSymbol = Symbol.for('vuetify:date-options');\nexport const DateAdapterSymbol = Symbol.for('vuetify:date-adapter');\nexport function createDate(options, locale) {\n  const _options = mergeDeep({\n    adapter: VuetifyDateAdapter,\n    locale: {\n      af: 'af-ZA',\n      // ar: '', # not the same value for all variants\n      bg: 'bg-BG',\n      ca: 'ca-ES',\n      ckb: '',\n      cs: 'cs-CZ',\n      de: 'de-DE',\n      el: 'el-GR',\n      en: 'en-US',\n      // es: '', # not the same value for all variants\n      et: 'et-EE',\n      fa: 'fa-IR',\n      fi: 'fi-FI',\n      // fr: '', #not the same value for all variants\n      hr: 'hr-HR',\n      hu: 'hu-HU',\n      he: 'he-IL',\n      id: 'id-ID',\n      it: 'it-IT',\n      ja: 'ja-JP',\n      ko: 'ko-KR',\n      lv: 'lv-LV',\n      lt: 'lt-LT',\n      nl: 'nl-NL',\n      no: 'no-NO',\n      pl: 'pl-PL',\n      pt: 'pt-PT',\n      ro: 'ro-RO',\n      ru: 'ru-RU',\n      sk: 'sk-SK',\n      sl: 'sl-SI',\n      srCyrl: 'sr-SP',\n      srLatn: 'sr-SP',\n      sv: 'sv-SE',\n      th: 'th-TH',\n      tr: 'tr-TR',\n      az: 'az-AZ',\n      uk: 'uk-UA',\n      vi: 'vi-VN',\n      zhHans: 'zh-CN',\n      zhHant: 'zh-TW'\n    }\n  }, options);\n  return {\n    options: _options,\n    instance: createInstance(_options, locale)\n  };\n}\nfunction createInstance(options, locale) {\n  const instance = reactive(typeof options.adapter === 'function'\n  // eslint-disable-next-line new-cap\n  ? new options.adapter({\n    locale: options.locale[locale.current.value] ?? locale.current.value,\n    formats: options.formats\n  }) : options.adapter);\n  watch(locale.current, value => {\n    instance.locale = options.locale[value] ?? value ?? instance.locale;\n  });\n  return instance;\n}\nexport function useDate() {\n  const options = inject(DateOptionsSymbol);\n  if (!options) throw new Error('[Vuetify] Could not find injected date options');\n  const locale = useLocale();\n  return createInstance(options, locale);\n}\n\n// https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024\nexport function getWeek(adapter, value) {\n  const date = adapter.toJsDate(value);\n  let year = date.getFullYear();\n  let d1w1 = new Date(year, 0, 1);\n  if (date < d1w1) {\n    year = year - 1;\n    d1w1 = new Date(year, 0, 1);\n  } else {\n    const tv = new Date(year + 1, 0, 1);\n    if (date >= tv) {\n      year = year + 1;\n      d1w1 = tv;\n    }\n  }\n  const diffTime = Math.abs(date.getTime() - d1w1.getTime());\n  const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n  return Math.floor(diffDays / 7) + 1;\n}\n//# sourceMappingURL=date.mjs.map","import { mergeProps as _mergeProps, createVNode as _createVNode, Fragment as _Fragment } from \"vue\";\n// Styles\nimport \"../VSlider/VSlider.css\";\n\n// Components\nimport { makeVInputProps, VInput } from \"../VInput/VInput.mjs\";\nimport { VLabel } from \"../VLabel/index.mjs\";\nimport { getOffset, makeSliderProps, useSlider, useSteps } from \"../VSlider/slider.mjs\";\nimport { VSliderThumb } from \"../VSlider/VSliderThumb.mjs\";\nimport { VSliderTrack } from \"../VSlider/VSliderTrack.mjs\"; // Composables\nimport { makeFocusProps, useFocus } from \"../../composables/focus.mjs\";\nimport { useRtl } from \"../../composables/locale.mjs\";\nimport { useProxiedModel } from \"../../composables/proxiedModel.mjs\"; // Utilities\nimport { computed, ref } from 'vue';\nimport { genericComponent, propsFactory, useRender } from \"../../util/index.mjs\"; // Types\nexport const makeVRangeSliderProps = propsFactory({\n  ...makeFocusProps(),\n  ...makeVInputProps(),\n  ...makeSliderProps(),\n  strict: Boolean,\n  modelValue: {\n    type: Array,\n    default: () => [0, 0]\n  }\n}, 'VRangeSlider');\nexport const VRangeSlider = genericComponent()({\n  name: 'VRangeSlider',\n  props: makeVRangeSliderProps(),\n  emits: {\n    'update:focused': value => true,\n    'update:modelValue': value => true,\n    end: value => true,\n    start: value => true\n  },\n  setup(props, _ref) {\n    let {\n      slots,\n      emit\n    } = _ref;\n    const startThumbRef = ref();\n    const stopThumbRef = ref();\n    const inputRef = ref();\n    const {\n      rtlClasses\n    } = useRtl();\n    function getActiveThumb(e) {\n      if (!startThumbRef.value || !stopThumbRef.value) return;\n      const startOffset = getOffset(e, startThumbRef.value.$el, props.direction);\n      const stopOffset = getOffset(e, stopThumbRef.value.$el, props.direction);\n      const a = Math.abs(startOffset);\n      const b = Math.abs(stopOffset);\n      return a < b || a === b && startOffset < 0 ? startThumbRef.value.$el : stopThumbRef.value.$el;\n    }\n    const steps = useSteps(props);\n    const model = useProxiedModel(props, 'modelValue', undefined, arr => {\n      if (!arr?.length) return [0, 0];\n      return arr.map(value => steps.roundValue(value));\n    });\n    const {\n      activeThumbRef,\n      hasLabels,\n      max,\n      min,\n      mousePressed,\n      onSliderMousedown,\n      onSliderTouchstart,\n      position,\n      trackContainerRef,\n      readonly\n    } = useSlider({\n      props,\n      steps,\n      onSliderStart: () => {\n        emit('start', model.value);\n      },\n      onSliderEnd: _ref2 => {\n        let {\n          value\n        } = _ref2;\n        const newValue = activeThumbRef.value === startThumbRef.value?.$el ? [value, model.value[1]] : [model.value[0], value];\n        if (!props.strict && newValue[0] < newValue[1]) {\n          model.value = newValue;\n        }\n        emit('end', model.value);\n      },\n      onSliderMove: _ref3 => {\n        let {\n          value\n        } = _ref3;\n        const [start, stop] = model.value;\n        if (!props.strict && start === stop && start !== min.value) {\n          activeThumbRef.value = value > start ? stopThumbRef.value?.$el : startThumbRef.value?.$el;\n          activeThumbRef.value?.focus();\n        }\n        if (activeThumbRef.value === startThumbRef.value?.$el) {\n          model.value = [Math.min(value, stop), stop];\n        } else {\n          model.value = [start, Math.max(start, value)];\n        }\n      },\n      getActiveThumb\n    });\n    const {\n      isFocused,\n      focus,\n      blur\n    } = useFocus(props);\n    const trackStart = computed(() => position(model.value[0]));\n    const trackStop = computed(() => position(model.value[1]));\n    useRender(() => {\n      const inputProps = VInput.filterProps(props);\n      const hasPrepend = !!(props.label || slots.label || slots.prepend);\n      return _createVNode(VInput, _mergeProps({\n        \"class\": ['v-slider', 'v-range-slider', {\n          'v-slider--has-labels': !!slots['tick-label'] || hasLabels.value,\n          'v-slider--focused': isFocused.value,\n          'v-slider--pressed': mousePressed.value,\n          'v-slider--disabled': props.disabled\n        }, rtlClasses.value, props.class],\n        \"style\": props.style,\n        \"ref\": inputRef\n      }, inputProps, {\n        \"focused\": isFocused.value\n      }), {\n        ...slots,\n        prepend: hasPrepend ? slotProps => _createVNode(_Fragment, null, [slots.label?.(slotProps) ?? (props.label ? _createVNode(VLabel, {\n          \"class\": \"v-slider__label\",\n          \"text\": props.label\n        }, null) : undefined), slots.prepend?.(slotProps)]) : undefined,\n        default: _ref4 => {\n          let {\n            id,\n            messagesId\n          } = _ref4;\n          return _createVNode(\"div\", {\n            \"class\": \"v-slider__container\",\n            \"onMousedown\": !readonly.value ? onSliderMousedown : undefined,\n            \"onTouchstartPassive\": !readonly.value ? onSliderTouchstart : undefined\n          }, [_createVNode(\"input\", {\n            \"id\": `${id.value}_start`,\n            \"name\": props.name || id.value,\n            \"disabled\": !!props.disabled,\n            \"readonly\": !!props.readonly,\n            \"tabindex\": \"-1\",\n            \"value\": model.value[0]\n          }, null), _createVNode(\"input\", {\n            \"id\": `${id.value}_stop`,\n            \"name\": props.name || id.value,\n            \"disabled\": !!props.disabled,\n            \"readonly\": !!props.readonly,\n            \"tabindex\": \"-1\",\n            \"value\": model.value[1]\n          }, null), _createVNode(VSliderTrack, {\n            \"ref\": trackContainerRef,\n            \"start\": trackStart.value,\n            \"stop\": trackStop.value\n          }, {\n            'tick-label': slots['tick-label']\n          }), _createVNode(VSliderThumb, {\n            \"ref\": startThumbRef,\n            \"aria-describedby\": messagesId.value,\n            \"focused\": isFocused && activeThumbRef.value === startThumbRef.value?.$el,\n            \"modelValue\": model.value[0],\n            \"onUpdate:modelValue\": v => model.value = [v, model.value[1]],\n            \"onFocus\": e => {\n              focus();\n              activeThumbRef.value = startThumbRef.value?.$el;\n\n              // Make sure second thumb is focused if\n              // the thumbs are on top of each other\n              // and they are both at minimum value\n              // but only if focused from outside.\n              if (model.value[0] === model.value[1] && model.value[1] === min.value && e.relatedTarget !== stopThumbRef.value?.$el) {\n                startThumbRef.value?.$el.blur();\n                stopThumbRef.value?.$el.focus();\n              }\n            },\n            \"onBlur\": () => {\n              blur();\n              activeThumbRef.value = undefined;\n            },\n            \"min\": min.value,\n            \"max\": model.value[1],\n            \"position\": trackStart.value,\n            \"ripple\": props.ripple\n          }, {\n            'thumb-label': slots['thumb-label']\n          }), _createVNode(VSliderThumb, {\n            \"ref\": stopThumbRef,\n            \"aria-describedby\": messagesId.value,\n            \"focused\": isFocused && activeThumbRef.value === stopThumbRef.value?.$el,\n            \"modelValue\": model.value[1],\n            \"onUpdate:modelValue\": v => model.value = [model.value[0], v],\n            \"onFocus\": e => {\n              focus();\n              activeThumbRef.value = stopThumbRef.value?.$el;\n\n              // Make sure first thumb is focused if\n              // the thumbs are on top of each other\n              // and they are both at maximum value\n              // but only if focused from outside.\n              if (model.value[0] === model.value[1] && model.value[0] === max.value && e.relatedTarget !== startThumbRef.value?.$el) {\n                stopThumbRef.value?.$el.blur();\n                startThumbRef.value?.$el.focus();\n              }\n            },\n            \"onBlur\": () => {\n              blur();\n              activeThumbRef.value = undefined;\n            },\n            \"min\": model.value[0],\n            \"max\": max.value,\n            \"position\": trackStop.value,\n            \"ripple\": props.ripple\n          }, {\n            'thumb-label': slots['thumb-label']\n          })]);\n        }\n      });\n    });\n    return {};\n  }\n});\n//# sourceMappingURL=VRangeSlider.mjs.map","/* Based off vuetify range slider https://next.vuetifyjs.com/en/components/range-sliders/ */\r\n<script setup>\r\nimport { watch, ref, computed } from \"vue\";\r\nimport { VRangeSlider } from \"vuetify/components\";\r\n\r\nconst props = defineProps({\r\n  min: {\r\n    type: [String, Number],\r\n    required: true,\r\n    default: \"0\"\r\n  },\r\n  max: {\r\n    type: [String, Number],\r\n    required: true,\r\n    default: \"10\"\r\n  },\r\n  step: {\r\n    type: [String, Number],\r\n    required: true,\r\n    default: \"1\"\r\n  },\r\n  modelValue: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  selectedOptions: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  rangeType: {\r\n    type: String,\r\n    default: \"\"\r\n  },\r\n  disabled: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"update:sliderMoveEnd\"]);\r\nconst range = ref(props.modelValue);\r\n\r\nconst selectedRangeValues = computed(() => props.selectedOptions);\r\nconst defaultRange = computed(() => props.modelValue);\r\n\r\nconst rangeSliderTextClass = computed(() => {\r\n  return {\r\n    \"range-slider__text\": true,\r\n    \"range-slider__quotes\": props.rangeType == \"Inches\" ? true : false\r\n  };\r\n});\r\n\r\nconst updateValue = (val) => {\r\n  emit(\"update:modelValue\", val);\r\n};\r\nconst onSliderMoveEnd = (value) => {\r\n  emit(\"update:sliderMoveEnd\", value);\r\n};\r\nwatch(selectedRangeValues, (newVal) => {\r\n  if (newVal.length === 0) {\r\n    range.value = props.modelValue;\r\n  }\r\n});\r\n// This is not ideal but working with in the constraints of the component\r\nwatch(defaultRange, (newVal) => {\r\n  range.value = newVal;\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"fh-multi-range-slider\">\r\n    <v-range-slider\r\n      v-model=\"range\"\r\n      color=\"#000000\"\r\n      :min=\"props.min\"\r\n      :max=\"props.max\"\r\n      :step=\"props.step\"\r\n      :disabled=\"props.disabled\"\r\n      strict\r\n      thumb-color=\"#fff\"\r\n      track-color=\"#000\"\r\n      track-fill-color=\"#000\"\r\n      elevation=\"0\"\r\n      @update:model-value=\"updateValue\"\r\n      @end=\"onSliderMoveEnd\"\r\n    />\r\n\r\n    <div class=\"flex w-full justify-between\">\r\n      <span :class=\"rangeSliderTextClass\" class=\"border-b border-neutral-40 p-2\">{{ range[0] }}</span>\r\n      <span :class=\"rangeSliderTextClass\" class=\"border-b border-neutral-40 p-2\">{{ range[1] }}</span>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.fh-multi-range-slider {\r\n  &:deep(.v-slider-thumb__surface) {\r\n    border: 1px solid #000;\r\n  }\r\n  &:deep(.v-slider-thumb__surface::before),\r\n  &:deep(.v-slider-thumb__surface::after),\r\n  &:deep(.v-slider-thumb__ripple) {\r\n    display: none;\r\n  }\r\n}\r\n.range-slider__text {\r\n  display: flex;\r\n}\r\n.range-slider__quotes {\r\n  &:after {\r\n    content: '\"';\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, computed, inject } from \"vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhProductFilterOptions from \"@/components/FhProductFilterOptions.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhMultiRangeSlider from \"@/components/Form/FhMultiRangeSlider/FhMultiRangeSlider.vue\";\r\n\r\nconst props = defineProps({\r\n  name: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  modelValue: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  options: {\r\n    type: Array,\r\n    default: () => [] // Range filters have their options passed in through facetCounts\r\n  },\r\n  facetCounts: {\r\n    type: Object,\r\n    default: () => ({})\r\n  },\r\n  isMenuItem: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\n\r\nconst isPanelOpenViaHover = ref(false);\r\nconst isPanelOpenViaClick = ref(props.isMenuItem);\r\nconst isPanelOpen = computed(() => isPanelOpenViaHover.value || isPanelOpenViaClick.value);\r\nconst is_fetching_products = inject(\"fetching_products\");\r\n\r\nconst filterFacetCounts = computed(() => {\r\n  return props.facetCounts;\r\n});\r\n\r\nconst filterOptions = computed(() => {\r\n  switch (filterFacetCounts.value.type) {\r\n    case \"option\":\r\n      if (props.options.length === 0 && filterFacetCounts.value.values.length !== 0) {\r\n        return filterFacetCounts.value.values.map((facetValue) => ({ label: facetValue.key, value: facetValue.key }));\r\n      }\r\n      return props.options;\r\n    case \"range\": {\r\n      const rangeValues = filterFacetCounts.value.values;\r\n      const min = rangeValues.find((rangeValue) => rangeValue.key === \"min\")?.value || 0;\r\n      const max = rangeValues.find((rangeValue) => rangeValue.key === \"max\")?.value || 0;\r\n      return [min, max];\r\n    }\r\n    default:\r\n      return props.options || [];\r\n  }\r\n});\r\n\r\nconst rangeValues = computed(() => {\r\n  if (filterFacetCounts.value.type === \"range\" && props.modelValue.length > 0) {\r\n    return props.modelValue;\r\n  }\r\n\r\n  return filterOptions.value;\r\n});\r\n\r\nconst rangeType = computed(() => {\r\n  return props.name == \"Width\" || props.name == \"Height\" ? \"Inches\" : \"\";\r\n});\r\n\r\nconst HOVER_SHOW_DELAY = 0;\r\nconst HOVER_HIDE_DELAY = 0;\r\nlet mouseEnterTimer, mouseLeaveTimer;\r\n\r\nfunction handleButtonMouseEnter() {\r\n  if (props.isMenuItem) return;\r\n  clearTimeout(mouseLeaveTimer);\r\n  mouseEnterTimer = setTimeout(() => (isPanelOpenViaHover.value = true), HOVER_SHOW_DELAY);\r\n}\r\n\r\nfunction handleContainerMouseEnter() {\r\n  if (props.isMenuItem) return;\r\n  clearTimeout(mouseLeaveTimer);\r\n}\r\n\r\nfunction handleContainerMouseLeave() {\r\n  if (props.isMenuItem) return;\r\n  clearTimeout(mouseEnterTimer);\r\n  mouseLeaveTimer = setTimeout(() => (isPanelOpenViaHover.value = false), HOVER_HIDE_DELAY);\r\n}\r\n\r\nfunction handleButtonClick() {\r\n  if (!props.isMenuItem) return;\r\n  if (!isPanelOpenViaHover.value) {\r\n    isPanelOpenViaClick.value = !isPanelOpenViaClick.value;\r\n  }\r\n}\r\n\r\nconst buttonElement = ref(null);\r\nconst panelElement = ref(null);\r\n\r\nconst selectedOptions = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\nconst hasSelectedOptions = computed(() => !!selectedOptions.value.length);\r\n\r\nfunction clearSelectedOptions() {\r\n  selectedOptions.value = [];\r\n  isPanelOpenViaHover.value = false;\r\n}\r\n\r\nconst handleSliderMoveEnd = (values) => {\r\n  selectedOptions.value = values;\r\n};\r\n</script>\r\n\r\n<template>\r\n  <div\r\n    :class=\"{ 'border-b border-b-neutral-30 py-f2': props.isMenuItem }\"\r\n    class=\"relative inline-block\"\r\n    @mouseenter=\"handleContainerMouseEnter\"\r\n    @mouseleave=\"handleContainerMouseLeave\"\r\n  >\r\n    <component\r\n      :is=\"props.isMenuItem ? 'button' : FhButton\"\r\n      ref=\"buttonElement\"\r\n      variant=\"pill\"\r\n      size=\"medium\"\r\n      :color=\"hasSelectedOptions ? 'selected' : 'secondary'\"\r\n      :class=\"{ accordion__btn: props.isMenuItem }\"\r\n      :disabled=\"filterOptions.length === 0\"\r\n      @click=\"handleButtonClick\"\r\n      @mouseenter=\"handleButtonMouseEnter\"\r\n      @hover=\"handleButtonMouseEnter\"\r\n    >\r\n      <span>{{ name }}</span>\r\n      <FhIcon name=\"DownChevron\" :class=\"{ 'rotate-180': isPanelOpen }\" aria-hidden=\"true\" />\r\n    </component>\r\n\r\n    <!-- placeholder element to fill the gap between the button and the panel so that mouseleave is not inadvertently triggered in this space -->\r\n    <div v-if=\"isPanelOpen && !props.isMenuItem\" class=\"absolute top-full left-0 h-f3 w-full bg-transparent\"></div>\r\n\r\n    <!-- the filter options dropdown panel-->\r\n    <div v-if=\"isPanelOpen\" ref=\"panelElement\" :class=\"{ hoverMenuPanel: !props.isMenuItem }\">\r\n      <FhProductFilterOptions\r\n        v-if=\"filterFacetCounts.type === 'option'\"\r\n        v-model=\"selectedOptions\"\r\n        :options=\"filterOptions\"\r\n        :facet-counts=\"filterFacetCounts\"\r\n        class=\"mb-f1\"\r\n      />\r\n      <FhMultiRangeSlider\r\n        v-if=\"filterFacetCounts.type === 'range'\"\r\n        v-model=\"rangeValues\"\r\n        :selected-options=\"selectedOptions\"\r\n        :min=\"filterOptions[0]\"\r\n        :max=\"filterOptions[1]\"\r\n        :range-type=\"rangeType\"\r\n        :disabled=\"is_fetching_products\"\r\n        step=\"1\"\r\n        @update:slider-move-end=\"handleSliderMoveEnd\"\r\n      />\r\n      <FhButton v-if=\"hasSelectedOptions && !props.isMenuItem\" variant=\"text\" class=\"mt-f1\" @click=\"clearSelectedOptions\">Clear</FhButton>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style scoped lang=\"pcss\">\r\n.hoverMenuPanel {\r\n  @apply absolute top-full -left-f2 z-10 min-w-[328px] translate-y-f3 bg-white px-f2.5 pt-f1 pb-f2 drop-shadow;\r\n}\r\n.accordion__btn {\r\n  @apply flex w-full items-center justify-between py-f2 text-f-base-lg font-bold;\r\n  &:deep(.icon) {\r\n    font-size: 150%;\r\n  }\r\n}\r\n</style>\r\n","import { ref, computed } from \"vue\";\r\n\r\nexport const useUrlState = () => {\r\n  const filterSearchURL = computed(() => new URL(window.location));\r\n  const urlSearchParams = ref(new URLSearchParams(filterSearchURL.value.searchParams));\r\n\r\n  const searchParams = computed(() => {\r\n    const searchParamsObj = [];\r\n    const queryParams = urlSearchParams.value.entries();\r\n    for (const [key, value] of queryParams) {\r\n      if (![\"page\", \"sort\"].includes(key)) {\r\n        searchParamsObj.push({\r\n          key: key,\r\n          values: value.split(\",\")\r\n        });\r\n      }\r\n    }\r\n    return searchParamsObj;\r\n  });\r\n\r\n  const currentSortOrder = computed(() => {\r\n    return urlSearchParams.value.has(\"sort\") ? urlSearchParams.value.get(\"sort\") : null;\r\n  });\r\n\r\n  const currentPage = computed(() => {\r\n    return urlSearchParams.value.has(\"page\") ? parseInt(urlSearchParams.value.get(\"page\")) - 1 : 0;\r\n  });\r\n\r\n  const setURLParam = (key, value) => {\r\n    filterSearchURL.value.searchParams.set(key, value);\r\n  };\r\n\r\n  const updateURL = () => {\r\n    window.history.replaceState({}, \"\", filterSearchURL.value);\r\n  };\r\n\r\n  const clearAllParams = () => {\r\n    const searchParams = filterSearchURL.value.searchParams;\r\n    const keysToDelete = [];\r\n    searchParams.forEach((value, key) => {\r\n      if (key != \"query\") keysToDelete.push(key);\r\n    });\r\n    keysToDelete.forEach((searchParam) => {\r\n      searchParams.delete(searchParam);\r\n    });\r\n    updateURL();\r\n  };\r\n\r\n  const deleteSearchParam = (searchKey) => {\r\n    filterSearchURL.value.searchParams.delete(searchKey);\r\n  };\r\n\r\n  return {\r\n    setURLParam,\r\n    updateURL,\r\n    clearAllParams,\r\n    deleteSearchParam,\r\n    searchParams,\r\n    currentPage,\r\n    currentSortOrder\r\n  };\r\n};\r\n","import { ref } from \"vue\";\r\nimport { useUrlState } from \"@/composables/useURLState\";\r\nimport { defineStore } from \"pinia\";\r\n\r\n// TODO: Eventually move how filters are set to here for now\r\n// this will only track url state and filter name/value maps\r\nexport const useProductFiltersStore = defineStore(\"productFilters\", () => {\r\n  const urlState = useUrlState();\r\n  const filterNameMap = ref(new Map());\r\n  const dyanmicFilters = ref([]);\r\n\r\n  const createFilterValueMap = (filterOptions, stopRecurr) => {\r\n    filterOptions &&\r\n      filterOptions.forEach((filterOption) => {\r\n        if (filterOption?.options && !stopRecurr) createFilterValueMap(filterOption?.options, true);\r\n        else filterNameMap.value.set(filterOption.value, filterOption.label);\r\n      });\r\n  };\r\n\r\n  const init = (filters) => {\r\n    // Set Filter Name Map\r\n    filters.forEach((filter) => {\r\n      if (!filter?.options || filter?.options?.length == 0) dyanmicFilters.value.push(filter.key);\r\n      createFilterValueMap(filter?.options, false);\r\n    });\r\n  };\r\n\r\n  const updateFilterNameMap = (updatedFilters) => {\r\n    Object.values(updatedFilters)\r\n      .filter((filterFacet) => {\r\n        return dyanmicFilters.value.includes(filterFacet.key);\r\n      })\r\n      .forEach((filterdFacet) => {\r\n        const filterMap = filterdFacet.values.map((facetValue) => ({ value: facetValue.key, label: facetValue.key }));\r\n        createFilterValueMap(filterMap);\r\n      });\r\n  };\r\n\r\n  return {\r\n    urlState,\r\n    init,\r\n    updateFilterNameMap,\r\n    filterNameMap\r\n  };\r\n});\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport { useProductFiltersStore } from \"@/stores/ProductFiltersStore\";\r\n\r\nconst props = defineProps({\r\n  filters: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  filterModel: {\r\n    type: Object,\r\n    required: true,\r\n    default: () => ({})\r\n  },\r\n  facetCounts: {\r\n    type: Object,\r\n    default: () => ({})\r\n  }\r\n});\r\n\r\nconst emits = defineEmits([\"update:modelValue\"]);\r\n\r\nconst model = computed({\r\n  get: () => props.filterModel,\r\n  set: (val) => emits(\"update:modelValue\", val)\r\n});\r\n\r\nconst { filterNameMap } = useProductFiltersStore();\r\n\r\nconst selectedOptionsList = computed(() => {\r\n  const rangeFiltersKey = props.filters.filter((filter) => filter.type == \"range\").map((filter) => filter.key);\r\n\r\n  return Object.entries(props.filterModel)\r\n    .map(([key, value]) => {\r\n      if (value.length === 0) return value;\r\n      // Lets discuss this one, I'm treating range as one value becuase it got kind of funky if we treaded them as two seperate values\r\n      // Checking if range key = Width or Height in order to show the inches indicator\r\n      if (rangeFiltersKey.includes(key) && (key == \"width\" || key == \"height\")) {\r\n        return [`${key}: ${value[0]}\" - ${value[1]}\"`];\r\n      } else if (rangeFiltersKey.includes(key)) {\r\n        return [`${key}: ${value[0]} - ${value[1]}`];\r\n      } else return value;\r\n    })\r\n    .flat();\r\n});\r\n\r\nconst removeFilter = (event, filterValue) => {\r\n  event?.preventDefault();\r\n\r\n  // Check if range value\r\n  // Please refactor me this is not really scalable\r\n  // TODO this will be better as a map with type assoicated with it\r\n  if (/[\\w]+:\\s/g.test(filterValue)) {\r\n    const possibleRangeKey = filterValue.split(\":\")[0];\r\n    const rangeKey = props.filters.find((filter) => filter.key == possibleRangeKey.toLowerCase().trim());\r\n    if (rangeKey && rangeKey.type == \"range\") {\r\n      model.value = { ...model.value, [rangeKey.key]: [] };\r\n      return;\r\n    }\r\n  }\r\n  const newModel = {};\r\n  Object.keys(props.filterModel).forEach((filter) => {\r\n    newModel[filter] = props.filterModel[filter].filter((modelValue) => modelValue != filterValue);\r\n  });\r\n  model.value = { ...model.value, ...newModel };\r\n};\r\n</script>\r\n\r\n<template>\r\n  <section v-if=\"selectedOptionsList.length > 0\" data-product-chips class=\"filter-list overflow-x-auto border-b border-b-neutral-30\">\r\n    <ul class=\"flex flex-nowrap justify-start gap-4 md:flex-wrap\">\r\n      <template v-for=\"selectedOption in selectedOptionsList\" :key=\"selectedOption\">\r\n        <li v-if=\"filterNameMap.get(selectedOption) || selectedOption.includes(':')\">\r\n          <button\r\n            class=\"flex cursor-pointer items-center gap-1 text-f-xs-sm font-bold text-neutral-50 md:font-bold\"\r\n            @click=\"removeFilter($event, selectedOption)\"\r\n          >\r\n            <span class=\"whitespace-nowrap capitalize\">{{ filterNameMap.get(selectedOption) || selectedOption }}</span>\r\n            <span><FhIcon name=\"XIcon\" class=\"!text-lg\" /></span>\r\n          </button>\r\n        </li>\r\n      </template>\r\n      <slot></slot>\r\n    </ul>\r\n  </section>\r\n</template>\r\n\r\n<style scoped></style>\r\n","<script setup>\r\nimport { computed, ref } from \"vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhRadio from \"@/components/FhRadio.vue\";\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: String,\r\n    required: true,\r\n    default: \"\"\r\n  },\r\n  sortOptions: {\r\n    type: Array,\r\n    required: true,\r\n    default: () => []\r\n  },\r\n  isMenuOpen: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  keepMenuOpen: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\"]);\r\nconst sortRef = ref(null);\r\n\r\nconst sortOptions = computed(() => props.sortOptions);\r\nconst showSortOptions = ref(props.isMenuOpen);\r\n\r\nconst sortModel = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => {\r\n    emit(\"update:modelValue\", value);\r\n  }\r\n});\r\n\r\nconst sortName = computed(() => sortOptions.value.find((option) => option.key == sortModel.value));\r\n\r\nconst sortBlur = (event) => {\r\n  const eventTarget = event.relatedTarget;\r\n  if (eventTarget && showSortOptions.value) {\r\n    sortModel.value = eventTarget.value;\r\n  }\r\n  if (!props.keepMenuOpen) showSortOptions.value = false;\r\n};\r\n</script>\r\n<template>\r\n  <section ref=\"sortRef\" class=\"sortFilter\" tabindex=\"0\" @blur=\"sortBlur\">\r\n    <div class=\"sortFilter__header cursor-pointer\" @click.stop=\"showSortOptions = !showSortOptions\">\r\n      <div class=\"sortFilter__header-title\">\r\n        Sort By: <span class=\"sortFilter__header-title--descriptor\">{{ sortName?.name }}</span>\r\n      </div>\r\n      <FhIcon name=\"DownChevron\" :class=\"{ 'rotate-180': showSortOptions }\" class=\"text-xl ml-1 sortFilter__header-icon\" />\r\n    </div>\r\n    <div v-if=\"showSortOptions\" class=\"sortFilter__filters\">\r\n      <ul>\r\n        <li v-for=\"sortOption in sortOptions\" :key=\"sortOption.key\">\r\n          <FhRadio v-model=\"sortModel\" class=\"sortFilter__filter\" :value=\"sortOption.key\" :label=\"sortOption.name\" />\r\n        </li>\r\n      </ul>\r\n    </div>\r\n  </section>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { Dialog, DialogPanel, DialogTitle, TransitionChild, TransitionRoot } from \"@headlessui/vue\";\r\nimport FhProductFilterBarItem from \"@/components/FhProductFilterBarItem.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhProductFilterChips from \"@/components/Products/FhProductFilterChips.vue\";\r\nimport FhSortFilter from \"@/components/Partials/FhSortFilter/FhSortFilter.vue\";\r\n\r\nconst props = defineProps({\r\n  showFilterNav: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  filters: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  filterModel: {\r\n    type: Object,\r\n    required: true,\r\n    default: () => ({})\r\n  },\r\n  facetCounts: {\r\n    type: Object,\r\n    default: () => ({})\r\n  },\r\n  sortOptions: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  sortModel: {\r\n    type: String,\r\n    default: \"\"\r\n  },\r\n  totalActiveFilterOptionCount: {\r\n    type: Number,\r\n    default: 0\r\n  },\r\n  totalProductsCount: {\r\n    type: Number,\r\n    default: 0\r\n  }\r\n});\r\n\r\nconst emits = defineEmits([\"update:showFilter\", \"update:modelValue\", \"update:sortModel\", \"clearAll\"]);\r\n\r\nconst showFilterNav = computed({\r\n  get: () => props.showFilterNav,\r\n  set: (val) => emits(\"update:showFilter\", val)\r\n});\r\n\r\nconst model = computed({\r\n  get: () => props.filterModel,\r\n  set: (val) => emits(\"update:modelValue\", val)\r\n});\r\n\r\nconst sortModel = computed({\r\n  get: () => props.sortModel,\r\n  set: (val) => emits(\"update:sortModel\", val)\r\n});\r\n\r\nconst handleOpenAllFilters = (event) => {\r\n  if (event) event.preventDefault();\r\n  showFilterNav.value = !showFilterNav.value;\r\n};\r\n\r\nconst getFacetCountByKey = (filterKey) => {\r\n  const facet = Object.values(props.facetCounts).find((facet) => facet.key === filterKey);\r\n\r\n  return facet;\r\n};\r\n\r\nconst clearAll = () => {\r\n  emits(\"clearAll\");\r\n};\r\n</script>\r\n\r\n<template>\r\n  <TransitionRoot as=\"template\" :show=\"showFilterNav\">\r\n    <Dialog as=\"div\" class=\"relative z-10\" @close=\"handleOpenAllFilters\">\r\n      <TransitionChild\r\n        as=\"template\"\r\n        enter=\"ease-in-out duration-500\"\r\n        enter-from=\"opacity-0\"\r\n        enter-to=\"opacity-100\"\r\n        leave=\"ease-in-out duration-500\"\r\n        leave-from=\"opacity-100\"\r\n        leave-to=\"opacity-0\"\r\n      >\r\n        <div class=\"fixed inset-0 bg-neutral-opacity-35 bg-opacity-75 transition-opacity\" />\r\n      </TransitionChild>\r\n\r\n      <div class=\"fixed inset-0 overflow-hidden\">\r\n        <div class=\"absolute inset-0 overflow-hidden\">\r\n          <div class=\"pointer-events-none fixed inset-y-0 right-0 flex max-w-full\">\r\n            <TransitionChild\r\n              as=\"template\"\r\n              enter=\"transform transition ease-in-out duration-500 sm:duration-700\"\r\n              enter-from=\"translate-x-full\"\r\n              enter-to=\"translate-x-0\"\r\n              leave=\"transform transition ease-in-out duration-500 sm:duration-700\"\r\n              leave-from=\"translate-x-0\"\r\n              leave-to=\"translate-x-full\"\r\n            >\r\n              <DialogPanel class=\"pointer-events-auto w-screen max-w-md\">\r\n                <div class=\"flex h-full flex-col bg-white shadow-xl\">\r\n                  <div class=\"sm:px-6 border-b border-b-neutral-30 px-4 py-5 pl-3.5 md:px-10\">\r\n                    <div class=\"flex items-center justify-between\">\r\n                      <DialogTitle class=\"text-base font-semibold leading-6\">Filters</DialogTitle>\r\n                      <div class=\"ml-3 flex h-7 items-center\">\r\n                        <button type=\"button\" class=\"text-gray-400 rounded-md bg-white\" @click=\"handleOpenAllFilters\">\r\n                          <span class=\"sr-only\">Close panel</span>\r\n                          <FhButton size=\"small\" variant=\"round\" class=\"relative\" aria-label=\"Close Filters Sidebar\" @click=\"handleOpenAllFilters\">\r\n                            <FhIcon name=\"XIcon\" class=\"!text-2xl\" />\r\n                          </FhButton>\r\n                        </button>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"sm:px-6 relative grid h-full flex-1 grid-flow-row grid-rows-[auto_1fr_auto]\">\r\n                    <FhProductFilterChips\r\n                      class=\"py-5 pl-3.5 md:px-10\"\r\n                      :filters=\"props.filters\"\r\n                      :filter-model=\"model\"\r\n                      :facet-counts=\"props.facetCounts\"\r\n                      @update:model-value=\"(val) => (model = val)\"\r\n                    ></FhProductFilterChips>\r\n                    <section class=\"filters overflow-y-auto overflow-x-hidden px-3.5 pt-6 md:px-10\">\r\n                      <FhSortFilter\r\n                        v-if=\"props.sortOptions.length > 0\"\r\n                        v-model=\"sortModel\"\r\n                        :sort-options=\"props.sortOptions\"\r\n                        :is-menu-open=\"true\"\r\n                        :keep-menu-open=\"true\"\r\n                        class=\"mr-f2 w-full border-b border-b-neutral-30 py-f2\"\r\n                      />\r\n                      <FhProductFilterBarItem\r\n                        v-for=\"filter in props.filters\"\r\n                        :key=\"filter.key\"\r\n                        v-bind=\"filter\"\r\n                        :model-value=\"model[filter.key]\"\r\n                        :facet-counts=\"getFacetCountByKey(filter.key)\"\r\n                        :is-menu-item=\"true\"\r\n                        class=\"mr-f2 w-full\"\r\n                        @update:model-value=\"(val) => (model = { ...model, [filter.key]: val })\"\r\n                      />\r\n                    </section>\r\n                    <section class=\"flex h-[180px] items-start justify-center gap-3 border-t border-t-neutral-30 py-8 px-3.5 md:px-10\">\r\n                      <FhButton class=\"grow\" variant=\"standard\" color=\"secondary\" @click=\"clearAll\">Clear All</FhButton>\r\n                      <FhButton class=\"grow\" variant=\"standard\" color=\"primary\" @click=\"handleOpenAllFilters\"\r\n                        >View <template v-if=\"props.totalActiveFilterOptionCount > 0\">({{ props.totalProductsCount }})</template></FhButton\r\n                      >\r\n                    </section>\r\n                  </div>\r\n                </div>\r\n              </DialogPanel>\r\n            </TransitionChild>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </Dialog>\r\n  </TransitionRoot>\r\n</template>\r\n\r\n<style scoped lang=\"pcss\">\r\n:deep(.sortFilter__header) {\r\n  @apply flex items-center justify-between text-f-base-lg font-bold py-f2;\r\n}\r\n:deep(.sortFilter__header-title--descriptor) {\r\n  @apply hidden;\r\n}\r\n:deep(.sortFilter__header-icon) {\r\n  font-size: 150%;\r\n}\r\n:deep(.sortFilter__filters li) {\r\n  @apply my-2;\r\n}\r\n:deep(.sortFilter__filter) {\r\n  @apply text-f-base-lg;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed, ref, watch } from \"vue\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport FhProductFilterBarItem from \"@/components/FhProductFilterBarItem.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhProductFilterNav from \"@/components/Products/FhProductFilterNav/FhProductFilterNav.vue\";\r\nimport FhProductFilterChips from \"@/components/Products/FhProductFilterChips.vue\";\r\nimport FhSortFilter from \"@/components/Partials/FhSortFilter/FhSortFilter.vue\";\r\nimport { useProductFiltersStore } from \"@/stores/ProductFiltersStore\";\r\nimport { useFeaturesStore } from \"@/stores/FeaturesStore\";\r\n\r\nconst props = defineProps({\r\n  filters: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  modelValue: {\r\n    type: Array,\r\n    required: true,\r\n    default: () => []\r\n  },\r\n  sortOptions: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  sortOrder: {\r\n    type: String,\r\n    default: \"\"\r\n  },\r\n  totalProductsCount: {\r\n    type: Number,\r\n    default: 0\r\n  },\r\n  facetCounts: {\r\n    type: Array,\r\n    default: () => []\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"update:sortValue\"]);\r\n\r\nconst { isSm, isMd } = useViewportSizes();\r\nconst openAllFilters = ref(false);\r\nconst productFilterStore = useProductFiltersStore();\r\nconst { setURLParam, updateURL, clearAllParams, deleteSearchParam } = productFilterStore.urlState;\r\nconst { init: initFilterStore, updateFilterNameMap } = productFilterStore;\r\nconst facetCounts = computed(() => props.facetCounts);\r\n\r\nconst sortModel = ref(props.sortOrder);\r\n\r\nconst featuresStore = useFeaturesStore();\r\nconst projectEmberEnabled = computed(() => featuresStore.getFeatureValue(\"projectEmberEnabled\"));\r\n\r\ninitFilterStore(props.filters);\r\n\r\nconst updateSearchURL = (model) => {\r\n  Object.entries(model).forEach(([key, value]) => {\r\n    if (value.length > 0) {\r\n      setURLParam(key, value.join(\",\"));\r\n    } else {\r\n      deleteSearchParam(key);\r\n    }\r\n  });\r\n  deleteSearchParam(\"page\");\r\n  updateURL();\r\n};\r\n\r\n/**\r\n * This writable computed is the primary data model, representing the full set of filters and selected options for each.\r\n * Each filter has a key in this object, pointing to an array of the selected options for that filter. For example:\r\n *\r\n *   {\r\n *     filterKey1: [\"option1\"],\r\n *     filterKey2: []\r\n *   }\r\n *\r\n * Selected options are automatically populated from the inbound `modelValue` prop.\r\n *\r\n * The public model published via the `update:modelValue` event only contains keys for active filters (i.e., those with selected options).\r\n * TODO: we will probalby want to change this to match up what we are receving and sending, keeping object schema as is for now and doing transformations downstream\r\n */\r\nconst model = computed({\r\n  get: () => {\r\n    return props.filters.reduce((obj, filter) => {\r\n      const activeFilters = props.modelValue?.find((activeFilter) => activeFilter.key === filter.key);\r\n      obj[filter.key] = activeFilters ? activeFilters.values : [];\r\n      return obj;\r\n    }, {});\r\n  },\r\n  set: (newModel) => {\r\n    let modelToPublish = Object.keys(newModel)\r\n      .filter((key) => newModel[key].length > 0)\r\n      .reduce((obj, key) => ({ ...obj, [key]: newModel[key] }), {});\r\n    updateSearchURL(newModel);\r\n    emit(\"update:modelValue\", modelToPublish);\r\n  }\r\n});\r\n\r\nconst totalActiveFilterOptionCount = computed(() => {\r\n  return Object.keys(model.value).reduce((count, key) => {\r\n    const filter = Object.values(props.filters).find((filter) => filter.key === key);\r\n    if (filter.type === \"range\" && model.value[key].length > 0) {\r\n      return count + 1;\r\n    }\r\n    return count + model.value[key].length;\r\n  }, 0);\r\n});\r\n\r\nconst clearAll = () => {\r\n  model.value = Object.keys(model.value).reduce((obj, key) => ({ ...obj, [key]: [] }), {});\r\n  clearAllParams();\r\n};\r\n\r\nconst handleOpenAllFilters = (event) => {\r\n  if (event) event.preventDefault();\r\n  openAllFilters.value = !openAllFilters.value;\r\n};\r\n\r\nconst getFacetCountByKey = (filterKey) => {\r\n  const facet = Object.values(props.facetCounts).find((facet) => facet.key === filterKey);\r\n\r\n  return facet;\r\n};\r\n\r\nwatch(facetCounts, () => {\r\n  updateFilterNameMap(facetCounts.value);\r\n});\r\nwatch(sortModel, (newValue) => {\r\n  emit(\"update:sortValue\", newValue);\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"c-productFilterBar sticky top-0 z-10 flex-wrap justify-between items-center border-b border-neutral-30 bg-white py-f5\">\r\n    <div class=\"w-full flex justify-between items-center\">\r\n      <div class=\"flex items-center\">\r\n        <template v-for=\"(filter, index) in props.filters\">\r\n          <FhProductFilterBarItem\r\n            v-if=\"index < (projectEmberEnabled ? 5 : 4)\"\r\n            :key=\"filter.key\"\r\n            v-bind=\"filter\"\r\n            :model-value=\"model[filter.key]\"\r\n            :facet-counts=\"getFacetCountByKey(filter.key)\"\r\n            class=\"mr-f2 hidden lg:block\"\r\n            @update:model-value=\"(val) => (model = { ...model, [filter.key]: val })\"\r\n          />\r\n        </template>\r\n\r\n        <FhButton v-if=\"props.filters.length > 0\" class=\"allFilter__cta\" variant=\"pill\" color=\"primary\" :inverse=\"isSm || isMd\" @click=\"handleOpenAllFilters\">\r\n          <FhIcon name=\"List\" />\r\n          <span class=\"hidden sort-bp:block\">All Filters</span>\r\n          <span class=\"sort-bp:hidden\">Sort & Filter</span>\r\n          <span v-if=\"totalActiveFilterOptionCount > 0\">({{ totalActiveFilterOptionCount }})</span>\r\n        </FhButton>\r\n      </div>\r\n      <div class=\"flex flex-row gap-7\">\r\n        <FhSortFilter\r\n          v-if=\"props.sortOptions.length > 0\"\r\n          v-model=\"sortModel\"\r\n          :sort-options=\"props.sortOptions\"\r\n          class=\"w-58 hidden sort-bp:block\"\r\n          @update:model-value=\"(val) => (sortModel = val)\"\r\n        />\r\n        <div v-if=\"props.totalProductsCount > 0\" class=\"ml-auto\">{{ props.totalProductsCount }} items</div>\r\n      </div>\r\n    </div>\r\n    <div v-if=\"totalActiveFilterOptionCount > 0\" class=\"items-center hidden lg:flex pt-5 lg:pt-f3\">\r\n      <FhProductFilterChips\r\n        class=\"border-b-0\"\r\n        :filters=\"props.filters\"\r\n        :filter-model=\"model\"\r\n        :facet-counts=\"props.facetCounts\"\r\n        :total-active-filter-option-count=\"totalActiveFilterOptionCount\"\r\n        @update:model-value=\"(val) => (model = val)\"\r\n        @clear-all=\"clearAll\"\r\n      >\r\n        <li v-if=\"totalActiveFilterOptionCount > 0\">\r\n          <FhButton variant=\"text\" size=\"small\" class=\"hidden lg:block clearAll-btn\" @click=\"clearAll\">Clear All</FhButton>\r\n        </li>\r\n      </FhProductFilterChips>\r\n    </div>\r\n  </div>\r\n  <FhProductFilterNav\r\n    :show-filter-nav=\"openAllFilters\"\r\n    :filters=\"props.filters\"\r\n    :filter-model=\"model\"\r\n    :total-active-filter-option-count=\"totalActiveFilterOptionCount\"\r\n    :facet-counts=\"props.facetCounts\"\r\n    :total-products-count=\"props.totalProductsCount\"\r\n    :sort-options=\"props.sortOptions\"\r\n    :sort-model=\"sortModel\"\r\n    @update:show-filter=\"handleOpenAllFilters\"\r\n    @update:model-value=\"(val) => (model = val)\"\r\n    @update:sort-model=\"(val) => (sortModel = val)\"\r\n    @clear-all=\"clearAll\"\r\n  />\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.clearAll-btn.btn--text {\r\n  padding-top: 0px;\r\n  padding-bottom: 0px;\r\n}\r\n:deep(.btn.allFilter__cta) {\r\n  @media (max-width: 1199px) {\r\n    @apply pl-0;\r\n  }\r\n}\r\n.c-productFilterBar:before {\r\n  @apply absolute top-px left-1/2 -z-10 h-full w-[var(--100vw)] -translate-x-1/2 border-b border-inherit bg-inherit content-[\"\"];\r\n}\r\n\r\n:deep(.sortFilter__header) {\r\n  @apply flex items-center;\r\n}\r\n\r\n:deep(.sortFilter__header-title) {\r\n  @apply text-f-sm-lg;\r\n}\r\n\r\n:deep(.sortFilter__filters li) {\r\n  @apply my-2;\r\n}\r\n:deep(.sortFilter__filters) {\r\n  @apply absolute z-50 bg-white shadow-md p-4 w-64 mt-3;\r\n}\r\n:deep(.sortFilter__filter) {\r\n  @apply text-f-sm-lg;\r\n}\r\n</style>\r\n","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 1);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DEVICE_TYPES = {\n  MOBILE: \"mobile\",\n  TABLET: \"tablet\",\n  SMART_TV: \"smarttv\",\n  CONSOLE: \"console\",\n  WEARABLE: \"wearable\",\n  BROWSER: undefined\n};\n\nvar BROWSER_TYPES = {\n  CHROME: \"Chrome\",\n  FIREFOX: \"Firefox\",\n  OPERA: \"Opera\",\n  YANDEX: \"Yandex\",\n  SAFARI: \"Safari\",\n  INTERNET_EXPLORER: \"Internet Explorer\",\n  EDGE: \"Edge\",\n  CHROMIUM: \"Chromium\",\n  IE: \"IE\",\n  MOBILE_SAFARI: \"Mobile Safari\",\n  EDGE_CHROMIUM: \"Edge Chromium\"\n};\n\nvar OS_TYPES = {\n  IOS: \"iOS\",\n  ANDROID: \"Android\",\n  WINDOWS_PHONE: \"Windows Phone\",\n  WINDOWS: \"Windows\",\n  MAC_OS: \"Mac OS\"\n};\n\nvar defaultData = {\n  isMobile: false,\n  isTablet: false,\n  isBrowser: false,\n  isSmartTV: false,\n  isConsole: false,\n  isWearable: false\n};\n\nmodule.exports = { BROWSER_TYPES: BROWSER_TYPES, DEVICE_TYPES: DEVICE_TYPES, OS_TYPES: OS_TYPES, defaultData: defaultData };\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar UAParser = __webpack_require__(2);\n\nvar _require = __webpack_require__(0),\n    BROWSER_TYPES = _require.BROWSER_TYPES,\n    OS_TYPES = _require.OS_TYPES,\n    DEVICE_TYPES = _require.DEVICE_TYPES;\n\nvar _require2 = __webpack_require__(4),\n    checkType = _require2.checkType,\n    broPayload = _require2.broPayload,\n    mobilePayload = _require2.mobilePayload,\n    wearPayload = _require2.wearPayload,\n    consolePayload = _require2.consolePayload,\n    stvPayload = _require2.stvPayload,\n    getNavigatorInstance = _require2.getNavigatorInstance,\n    isIOS13Check = _require2.isIOS13Check;\n\nvar UA = new UAParser();\n\nvar browser = UA.getBrowser();\nvar device = UA.getDevice();\nvar engine = UA.getEngine();\nvar os = UA.getOS();\nvar ua = UA.getUA();\n\nvar CHROME = BROWSER_TYPES.CHROME,\n    CHROMIUM = BROWSER_TYPES.CHROMIUM,\n    IE = BROWSER_TYPES.IE,\n    INTERNET_EXPLORER = BROWSER_TYPES.INTERNET_EXPLORER,\n    OPERA = BROWSER_TYPES.OPERA,\n    FIREFOX = BROWSER_TYPES.FIREFOX,\n    SAFARI = BROWSER_TYPES.SAFARI,\n    EDGE = BROWSER_TYPES.EDGE,\n    YANDEX = BROWSER_TYPES.YANDEX,\n    MOBILE_SAFARI = BROWSER_TYPES.MOBILE_SAFARI;\nvar MOBILE = DEVICE_TYPES.MOBILE,\n    TABLET = DEVICE_TYPES.TABLET,\n    SMART_TV = DEVICE_TYPES.SMART_TV,\n    BROWSER = DEVICE_TYPES.BROWSER,\n    WEARABLE = DEVICE_TYPES.WEARABLE,\n    CONSOLE = DEVICE_TYPES.CONSOLE;\nvar ANDROID = OS_TYPES.ANDROID,\n    WINDOWS_PHONE = OS_TYPES.WINDOWS_PHONE,\n    IOS = OS_TYPES.IOS,\n    WINDOWS = OS_TYPES.WINDOWS,\n    MAC_OS = OS_TYPES.MAC_OS;\n\n\nvar isMobileType = function isMobileType() {\n  return device.type === MOBILE;\n};\nvar isTabletType = function isTabletType() {\n  return device.type === TABLET;\n};\n\nvar isMobileAndTabletType = function isMobileAndTabletType() {\n  switch (device.type) {\n    case MOBILE:\n    case TABLET:\n      return true;\n    default:\n      return false;\n  }\n};\n\nvar isEdgeChromiumType = function isEdgeChromiumType() {\n  if (os.name === OS_TYPES.WINDOWS && os.version === '10') {\n    return typeof ua === 'string' && ua.indexOf('Edg/') !== -1;\n  }\n\n  return false;\n};\n\nvar isSmartTVType = function isSmartTVType() {\n  return device.type === SMART_TV;\n};\nvar isBrowserType = function isBrowserType() {\n  return device.type === BROWSER;\n};\nvar isWearableType = function isWearableType() {\n  return device.type === WEARABLE;\n};\nvar isConsoleType = function isConsoleType() {\n  return device.type === CONSOLE;\n};\nvar isAndroidType = function isAndroidType() {\n  return os.name === ANDROID;\n};\nvar isWindowsType = function isWindowsType() {\n  return os.name === WINDOWS;\n};\nvar isMacOsType = function isMacOsType() {\n  return os.name === MAC_OS;\n};\nvar isWinPhoneType = function isWinPhoneType() {\n  return os.name === WINDOWS_PHONE;\n};\nvar isIOSType = function isIOSType() {\n  return os.name === IOS;\n};\nvar isChromeType = function isChromeType() {\n  return browser.name === CHROME;\n};\nvar isFirefoxType = function isFirefoxType() {\n  return browser.name === FIREFOX;\n};\nvar isChromiumType = function isChromiumType() {\n  return browser.name === CHROMIUM;\n};\nvar isEdgeType = function isEdgeType() {\n  return browser.name === EDGE;\n};\nvar isYandexType = function isYandexType() {\n  return browser.name === YANDEX;\n};\nvar isSafariType = function isSafariType() {\n  return browser.name === SAFARI || browser.name === MOBILE_SAFARI;\n};\n\nvar isMobileSafariType = function isMobileSafariType() {\n  return browser.name === MOBILE_SAFARI;\n};\nvar isOperaType = function isOperaType() {\n  return browser.name === OPERA;\n};\nvar isIEType = function isIEType() {\n  return browser.name === INTERNET_EXPLORER || browser.name === IE;\n};\n\nvar isElectronType = function isElectronType() {\n  var nav = getNavigatorInstance();\n  var ua = nav && nav.userAgent.toLowerCase();\n\n  return typeof ua === 'string' ? /electron/.test(ua) : false;\n};\n\nvar getIOS13 = function getIOS13() {\n  var nav = getNavigatorInstance();\n  return nav && (/iPad|iPhone|iPod/.test(nav.platform) || nav.platform === 'MacIntel' && nav.maxTouchPoints > 1) && !window.MSStream;\n};\n\nvar getIPad13 = function getIPad13() {\n  return isIOS13Check('iPad');\n};\nvar getIphone13 = function getIphone13() {\n  return isIOS13Check('iPhone');\n};\nvar getIPod13 = function getIPod13() {\n  return isIOS13Check('iPod');\n};\n\nvar getBrowserFullVersion = function getBrowserFullVersion() {\n  return browser.major;\n};\nvar getBrowserVersion = function getBrowserVersion() {\n  return browser.version;\n};\nvar getOsVersion = function getOsVersion() {\n  return os.version ? os.version : \"none\";\n};\nvar getOsName = function getOsName() {\n  return os.name ? os.name : \"none\";\n};\nvar getBrowserName = function getBrowserName() {\n  return browser.name;\n};\nvar getMobileVendor = function getMobileVendor() {\n  return device.vendor ? device.vendor : \"none\";\n};\nvar getMobileModel = function getMobileModel() {\n  return device.model ? device.model : \"none\";\n};\nvar getEngineName = function getEngineName() {\n  return engine.name;\n};\nvar getEngineVersion = function getEngineVersion() {\n  return engine.version;\n};\nvar getUseragent = function getUseragent() {\n  return ua;\n};\nvar getDeviceType = function getDeviceType() {\n  return device.type;\n};\n\nvar isSmartTV = isSmartTVType();\nvar isConsole = isConsoleType();\nvar isWearable = isWearableType();\nvar isMobileSafari = isMobileSafariType() || getIPad13();\nvar isChromium = isChromiumType();\nvar isMobile = isMobileAndTabletType() || getIPad13();\nvar isMobileOnly = isMobileType();\nvar isTablet = isTabletType() || getIPad13();\nvar isBrowser = isBrowserType();\nvar isAndroid = isAndroidType();\nvar isWinPhone = isWinPhoneType();\nvar isIOS = isIOSType() || getIPad13();\nvar isChrome = isChromeType();\nvar isFirefox = isFirefoxType();\nvar isSafari = isSafariType();\nvar isOpera = isOperaType();\nvar isIE = isIEType();\nvar osVersion = getOsVersion();\nvar osName = getOsName();\nvar fullBrowserVersion = getBrowserFullVersion();\nvar browserVersion = getBrowserVersion();\nvar browserName = getBrowserName();\nvar mobileVendor = getMobileVendor();\nvar mobileModel = getMobileModel();\nvar engineName = getEngineName();\nvar engineVersion = getEngineVersion();\nvar getUA = getUseragent();\nvar isEdge = isEdgeType() || isEdgeChromiumType();\nvar isYandex = isYandexType();\nvar deviceType = getDeviceType();\nvar isIOS13 = getIOS13();\nvar isIPad13 = getIPad13();\nvar isIPhone13 = getIphone13();\nvar isIPod13 = getIPod13();\nvar isElectron = isElectronType();\nvar isEdgeChromium = isEdgeChromiumType();\nvar isLegacyEdge = isEdgeType();\nvar isWindows = isWindowsType();\nvar isMacOs = isMacOsType();\n\nvar type = checkType(device.type);\n\nfunction deviceDetect() {\n  var isBrowser = type.isBrowser,\n      isMobile = type.isMobile,\n      isTablet = type.isTablet,\n      isSmartTV = type.isSmartTV,\n      isConsole = type.isConsole,\n      isWearable = type.isWearable;\n\n  if (isBrowser) {\n    return broPayload(isBrowser, browser, engine, os, ua);\n  }\n\n  if (isSmartTV) {\n    return stvPayload(isSmartTV, engine, os, ua);\n  }\n\n  if (isConsole) {\n    return consolePayload(isConsole, engine, os, ua);\n  }\n\n  if (isMobile) {\n    return mobilePayload(type, device, os, ua);\n  }\n\n  if (isTablet) {\n    return mobilePayload(type, device, os, ua);\n  }\n\n  if (isWearable) {\n    return wearPayload(isWearable, engine, os, ua);\n  }\n};\n\nmodule.exports = {\n  deviceDetect: deviceDetect,\n  isSmartTV: isSmartTV,\n  isConsole: isConsole,\n  isWearable: isWearable,\n  isMobileSafari: isMobileSafari,\n  isChromium: isChromium,\n  isMobile: isMobile,\n  isMobileOnly: isMobileOnly,\n  isTablet: isTablet,\n  isBrowser: isBrowser,\n  isAndroid: isAndroid,\n  isWinPhone: isWinPhone,\n  isIOS: isIOS,\n  isChrome: isChrome,\n  isFirefox: isFirefox,\n  isSafari: isSafari,\n  isOpera: isOpera,\n  isIE: isIE,\n  osVersion: osVersion,\n  osName: osName,\n  fullBrowserVersion: fullBrowserVersion,\n  browserVersion: browserVersion,\n  browserName: browserName,\n  mobileVendor: mobileVendor,\n  mobileModel: mobileModel,\n  engineName: engineName,\n  engineVersion: engineVersion,\n  getUA: getUA,\n  isEdge: isEdge,\n  isYandex: isYandex,\n  deviceType: deviceType,\n  isIOS13: isIOS13,\n  isIPad13: isIPad13,\n  isIPhone13: isIPhone13,\n  isIPod13: isIPod13,\n  isElectron: isElectron,\n  isEdgeChromium: isEdgeChromium,\n  isLegacyEdge: isLegacyEdge,\n  isWindows: isWindows,\n  isMacOs: isMacOs\n};\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * UAParser.js v0.7.18\n * Lightweight JavaScript-based User-Agent string parser\n * https://github.com/faisalman/ua-parser-js\n *\n * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com>\n * Dual licensed under GPLv2 or MIT\n */\n(function(window,undefined){\"use strict\";var LIBVERSION=\"0.7.18\",EMPTY=\"\",UNKNOWN=\"?\",FUNC_TYPE=\"function\",UNDEF_TYPE=\"undefined\",OBJ_TYPE=\"object\",STR_TYPE=\"string\",MAJOR=\"major\",MODEL=\"model\",NAME=\"name\",TYPE=\"type\",VENDOR=\"vendor\",VERSION=\"version\",ARCHITECTURE=\"architecture\",CONSOLE=\"console\",MOBILE=\"mobile\",TABLET=\"tablet\",SMARTTV=\"smarttv\",WEARABLE=\"wearable\",EMBEDDED=\"embedded\";var util={extend:function(regexes,extensions){var margedRegexes={};for(var i in regexes){if(extensions[i]&&extensions[i].length%2===0){margedRegexes[i]=extensions[i].concat(regexes[i])}else{margedRegexes[i]=regexes[i]}}return margedRegexes},has:function(str1,str2){if(typeof str1===\"string\"){return str2.toLowerCase().indexOf(str1.toLowerCase())!==-1}else{return false}},lowerize:function(str){return str.toLowerCase()},major:function(version){return typeof version===STR_TYPE?version.replace(/[^\\d\\.]/g,\"\").split(\".\")[0]:undefined},trim:function(str){return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\")}};var mapper={rgx:function(ua,arrays){var i=0,j,k,p,q,matches,match;while(i<arrays.length&&!matches){var regex=arrays[i],props=arrays[i+1];j=k=0;while(j<regex.length&&!matches){matches=regex[j++].exec(ua);if(!!matches){for(p=0;p<props.length;p++){match=matches[++k];q=props[p];if(typeof q===OBJ_TYPE&&q.length>0){if(q.length==2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length==3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){this[q[0]]=match?q[1].call(this,match,q[2]):undefined}else{this[q[0]]=match?match.replace(q[1],q[2]):undefined}}else if(q.length==4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}}else{this[q]=match?match:undefined}}}}i+=2}},str:function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j<map[i].length;j++){if(util.has(map[i][j],str)){return i===UNKNOWN?undefined:i}}}else if(util.has(map[i],str)){return i===UNKNOWN?undefined:i}}return str}};var maps={browser:{oldsafari:{version:{\"1.0\":\"/8\",1.2:\"/1\",1.3:\"/3\",\"2.0\":\"/412\",\"2.0.2\":\"/416\",\"2.0.3\":\"/417\",\"2.0.4\":\"/419\",\"?\":\"/\"}}},device:{amazon:{model:{\"Fire Phone\":[\"SD\",\"KF\"]}},sprint:{model:{\"Evo Shift 4G\":\"7373KT\"},vendor:{HTC:\"APA\",Sprint:\"Sprint\"}}},os:{windows:{version:{ME:\"4.90\",\"NT 3.11\":\"NT3.51\",\"NT 4.0\":\"NT4.0\",2000:\"NT 5.0\",XP:[\"NT 5.1\",\"NT 5.2\"],Vista:\"NT 6.0\",7:\"NT 6.1\",8:\"NT 6.2\",8.1:\"NT 6.3\",10:[\"NT 6.4\",\"NT 10.0\"],RT:\"ARM\"}}}};var regexes={browser:[[/(opera\\smini)\\/([\\w\\.-]+)/i,/(opera\\s[mobiletab]+).+version\\/([\\w\\.-]+)/i,/(opera).+version\\/([\\w\\.]+)/i,/(opera)[\\/\\s]+([\\w\\.]+)/i],[NAME,VERSION],[/(opios)[\\/\\s]+([\\w\\.]+)/i],[[NAME,\"Opera Mini\"],VERSION],[/\\s(opr)\\/([\\w\\.]+)/i],[[NAME,\"Opera\"],VERSION],[/(kindle)\\/([\\w\\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\\/\\s]?([\\w\\.]*)/i,/(avant\\s|iemobile|slim|baidu)(?:browser)?[\\/\\s]?([\\w\\.]*)/i,/(?:ms|\\()(ie)\\s([\\w\\.]+)/i,/(rekonq)\\/([\\w\\.]*)/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark)\\/([\\w\\.-]+)/i],[NAME,VERSION],[/(trident).+rv[:\\s]([\\w\\.]+).+like\\sgecko/i],[[NAME,\"IE\"],VERSION],[/(edge|edgios|edgea)\\/((\\d+)?[\\w\\.]+)/i],[[NAME,\"Edge\"],VERSION],[/(yabrowser)\\/([\\w\\.]+)/i],[[NAME,\"Yandex\"],VERSION],[/(puffin)\\/([\\w\\.]+)/i],[[NAME,\"Puffin\"],VERSION],[/((?:[\\s\\/])uc?\\s?browser|(?:juc.+)ucweb)[\\/\\s]?([\\w\\.]+)/i],[[NAME,\"UCBrowser\"],VERSION],[/(comodo_dragon)\\/([\\w\\.]+)/i],[[NAME,/_/g,\" \"],VERSION],[/(micromessenger)\\/([\\w\\.]+)/i],[[NAME,\"WeChat\"],VERSION],[/(qqbrowserlite)\\/([\\w\\.]+)/i],[NAME,VERSION],[/(QQ)\\/([\\d\\.]+)/i],[NAME,VERSION],[/m?(qqbrowser)[\\/\\s]?([\\w\\.]+)/i],[NAME,VERSION],[/(BIDUBrowser)[\\/\\s]?([\\w\\.]+)/i],[NAME,VERSION],[/(2345Explorer)[\\/\\s]?([\\w\\.]+)/i],[NAME,VERSION],[/(MetaSr)[\\/\\s]?([\\w\\.]+)/i],[NAME],[/(LBBROWSER)/i],[NAME],[/xiaomi\\/miuibrowser\\/([\\w\\.]+)/i],[VERSION,[NAME,\"MIUI Browser\"]],[/;fbav\\/([\\w\\.]+);/i],[VERSION,[NAME,\"Facebook\"]],[/headlesschrome(?:\\/([\\w\\.]+)|\\s)/i],[VERSION,[NAME,\"Chrome Headless\"]],[/\\swv\\).+(chrome)\\/([\\w\\.]+)/i],[[NAME,/(.+)/,\"$1 WebView\"],VERSION],[/((?:oculus|samsung)browser)\\/([\\w\\.]+)/i],[[NAME,/(.+(?:g|us))(.+)/,\"$1 $2\"],VERSION],[/android.+version\\/([\\w\\.]+)\\s+(?:mobile\\s?safari|safari)*/i],[VERSION,[NAME,\"Android Browser\"]],[/(chrome|omniweb|arora|[tizenoka]{5}\\s?browser)\\/v?([\\w\\.]+)/i],[NAME,VERSION],[/(dolfin)\\/([\\w\\.]+)/i],[[NAME,\"Dolphin\"],VERSION],[/((?:android.+)crmo|crios)\\/([\\w\\.]+)/i],[[NAME,\"Chrome\"],VERSION],[/(coast)\\/([\\w\\.]+)/i],[[NAME,\"Opera Coast\"],VERSION],[/fxios\\/([\\w\\.-]+)/i],[VERSION,[NAME,\"Firefox\"]],[/version\\/([\\w\\.]+).+?mobile\\/\\w+\\s(safari)/i],[VERSION,[NAME,\"Mobile Safari\"]],[/version\\/([\\w\\.]+).+?(mobile\\s?safari|safari)/i],[VERSION,NAME],[/webkit.+?(gsa)\\/([\\w\\.]+).+?(mobile\\s?safari|safari)(\\/[\\w\\.]+)/i],[[NAME,\"GSA\"],VERSION],[/webkit.+?(mobile\\s?safari|safari)(\\/[\\w\\.]+)/i],[NAME,[VERSION,mapper.str,maps.browser.oldsafari.version]],[/(konqueror)\\/([\\w\\.]+)/i,/(webkit|khtml)\\/([\\w\\.]+)/i],[NAME,VERSION],[/(navigator|netscape)\\/([\\w\\.-]+)/i],[[NAME,\"Netscape\"],VERSION],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\\sbrowser|minimo|conkeror)[\\/\\s]?([\\w\\.\\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([\\w\\.-]+)$/i,/(mozilla)\\/([\\w\\.]+).+rv\\:.+gecko\\/\\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\\/\\s]?([\\w\\.]+)/i,/(links)\\s\\(([\\w\\.]+)/i,/(gobrowser)\\/?([\\w\\.]*)/i,/(ice\\s?browser)\\/v?([\\w\\._]+)/i,/(mosaic)[\\/\\s]([\\w\\.]+)/i],[NAME,VERSION]],cpu:[[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\\)]/i],[[ARCHITECTURE,\"amd64\"]],[/(ia32(?=;))/i],[[ARCHITECTURE,util.lowerize]],[/((?:i[346]|x)86)[;\\)]/i],[[ARCHITECTURE,\"ia32\"]],[/windows\\s(ce|mobile);\\sppc;/i],[[ARCHITECTURE,\"arm\"]],[/((?:ppc|powerpc)(?:64)?)(?:\\smac|;|\\))/i],[[ARCHITECTURE,/ower/,\"\",util.lowerize]],[/(sun4\\w)[;\\)]/i],[[ARCHITECTURE,\"sparc\"]],[/((?:avr32|ia64(?=;))|68k(?=\\))|arm(?:64|(?=v\\d+;))|(?=atmel\\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i],[[ARCHITECTURE,util.lowerize]]],device:[[/\\((ipad|playbook);[\\w\\s\\);-]+(rim|apple)/i],[MODEL,VENDOR,[TYPE,TABLET]],[/applecoremedia\\/[\\w\\.]+ \\((ipad)/],[MODEL,[VENDOR,\"Apple\"],[TYPE,TABLET]],[/(apple\\s{0,1}tv)/i],[[MODEL,\"Apple TV\"],[VENDOR,\"Apple\"]],[/(archos)\\s(gamepad2?)/i,/(hp).+(touchpad)/i,/(hp).+(tablet)/i,/(kindle)\\/([\\w\\.]+)/i,/\\s(nook)[\\w\\s]+build\\/(\\w+)/i,/(dell)\\s(strea[kpr\\s\\d]*[\\dko])/i],[VENDOR,MODEL,[TYPE,TABLET]],[/(kf[A-z]+)\\sbuild\\/.+silk\\//i],[MODEL,[VENDOR,\"Amazon\"],[TYPE,TABLET]],[/(sd|kf)[0349hijorstuw]+\\sbuild\\/.+silk\\//i],[[MODEL,mapper.str,maps.device.amazon.model],[VENDOR,\"Amazon\"],[TYPE,MOBILE]],[/\\((ip[honed|\\s\\w*]+);.+(apple)/i],[MODEL,VENDOR,[TYPE,MOBILE]],[/\\((ip[honed|\\s\\w*]+);/i],[MODEL,[VENDOR,\"Apple\"],[TYPE,MOBILE]],[/(blackberry)[\\s-]?(\\w+)/i,/(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\\s_-]?([\\w-]*)/i,/(hp)\\s([\\w\\s]+\\w)/i,/(asus)-?(\\w+)/i],[VENDOR,MODEL,[TYPE,MOBILE]],[/\\(bb10;\\s(\\w+)/i],[MODEL,[VENDOR,\"BlackBerry\"],[TYPE,MOBILE]],[/android.+(transfo[prime\\s]{4,10}\\s\\w+|eeepc|slider\\s\\w+|nexus 7|padfone)/i],[MODEL,[VENDOR,\"Asus\"],[TYPE,TABLET]],[/(sony)\\s(tablet\\s[ps])\\sbuild\\//i,/(sony)?(?:sgp.+)\\sbuild\\//i],[[VENDOR,\"Sony\"],[MODEL,\"Xperia Tablet\"],[TYPE,TABLET]],[/android.+\\s([c-g]\\d{4}|so[-l]\\w+)\\sbuild\\//i],[MODEL,[VENDOR,\"Sony\"],[TYPE,MOBILE]],[/\\s(ouya)\\s/i,/(nintendo)\\s([wids3u]+)/i],[VENDOR,MODEL,[TYPE,CONSOLE]],[/android.+;\\s(shield)\\sbuild/i],[MODEL,[VENDOR,\"Nvidia\"],[TYPE,CONSOLE]],[/(playstation\\s[34portablevi]+)/i],[MODEL,[VENDOR,\"Sony\"],[TYPE,CONSOLE]],[/(sprint\\s(\\w+))/i],[[VENDOR,mapper.str,maps.device.sprint.vendor],[MODEL,mapper.str,maps.device.sprint.model],[TYPE,MOBILE]],[/(lenovo)\\s?(S(?:5000|6000)+(?:[-][\\w+]))/i],[VENDOR,MODEL,[TYPE,TABLET]],[/(htc)[;_\\s-]+([\\w\\s]+(?=\\))|\\w+)*/i,/(zte)-(\\w*)/i,/(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\\s)sony)[_\\s-]?([\\w-]*)/i],[VENDOR,[MODEL,/_/g,\" \"],[TYPE,MOBILE]],[/(nexus\\s9)/i],[MODEL,[VENDOR,\"HTC\"],[TYPE,TABLET]],[/d\\/huawei([\\w\\s-]+)[;\\)]/i,/(nexus\\s6p)/i],[MODEL,[VENDOR,\"Huawei\"],[TYPE,MOBILE]],[/(microsoft);\\s(lumia[\\s\\w]+)/i],[VENDOR,MODEL,[TYPE,MOBILE]],[/[\\s\\(;](xbox(?:\\sone)?)[\\s\\);]/i],[MODEL,[VENDOR,\"Microsoft\"],[TYPE,CONSOLE]],[/(kin\\.[onetw]{3})/i],[[MODEL,/\\./g,\" \"],[VENDOR,\"Microsoft\"],[TYPE,MOBILE]],[/\\s(milestone|droid(?:[2-4x]|\\s(?:bionic|x2|pro|razr))?:?(\\s4g)?)[\\w\\s]+build\\//i,/mot[\\s-]?(\\w*)/i,/(XT\\d{3,4}) build\\//i,/(nexus\\s6)/i],[MODEL,[VENDOR,\"Motorola\"],[TYPE,MOBILE]],[/android.+\\s(mz60\\d|xoom[\\s2]{0,2})\\sbuild\\//i],[MODEL,[VENDOR,\"Motorola\"],[TYPE,TABLET]],[/hbbtv\\/\\d+\\.\\d+\\.\\d+\\s+\\([\\w\\s]*;\\s*(\\w[^;]*);([^;]*)/i],[[VENDOR,util.trim],[MODEL,util.trim],[TYPE,SMARTTV]],[/hbbtv.+maple;(\\d+)/i],[[MODEL,/^/,\"SmartTV\"],[VENDOR,\"Samsung\"],[TYPE,SMARTTV]],[/\\(dtv[\\);].+(aquos)/i],[MODEL,[VENDOR,\"Sharp\"],[TYPE,SMARTTV]],[/android.+((sch-i[89]0\\d|shw-m380s|gt-p\\d{4}|gt-n\\d+|sgh-t8[56]9|nexus 10))/i,/((SM-T\\w+))/i],[[VENDOR,\"Samsung\"],MODEL,[TYPE,TABLET]],[/smart-tv.+(samsung)/i],[VENDOR,[TYPE,SMARTTV],MODEL],[/((s[cgp]h-\\w+|gt-\\w+|galaxy\\snexus|sm-\\w[\\w\\d]+))/i,/(sam[sung]*)[\\s-]*(\\w+-?[\\w-]*)/i,/sec-((sgh\\w+))/i],[[VENDOR,\"Samsung\"],MODEL,[TYPE,MOBILE]],[/sie-(\\w*)/i],[MODEL,[VENDOR,\"Siemens\"],[TYPE,MOBILE]],[/(maemo|nokia).*(n900|lumia\\s\\d+)/i,/(nokia)[\\s_-]?([\\w-]*)/i],[[VENDOR,\"Nokia\"],MODEL,[TYPE,MOBILE]],[/android\\s3\\.[\\s\\w;-]{10}(a\\d{3})/i],[MODEL,[VENDOR,\"Acer\"],[TYPE,TABLET]],[/android.+([vl]k\\-?\\d{3})\\s+build/i],[MODEL,[VENDOR,\"LG\"],[TYPE,TABLET]],[/android\\s3\\.[\\s\\w;-]{10}(lg?)-([06cv9]{3,4})/i],[[VENDOR,\"LG\"],MODEL,[TYPE,TABLET]],[/(lg) netcast\\.tv/i],[VENDOR,MODEL,[TYPE,SMARTTV]],[/(nexus\\s[45])/i,/lg[e;\\s\\/-]+(\\w*)/i,/android.+lg(\\-?[\\d\\w]+)\\s+build/i],[MODEL,[VENDOR,\"LG\"],[TYPE,MOBILE]],[/android.+(ideatab[a-z0-9\\-\\s]+)/i],[MODEL,[VENDOR,\"Lenovo\"],[TYPE,TABLET]],[/linux;.+((jolla));/i],[VENDOR,MODEL,[TYPE,MOBILE]],[/((pebble))app\\/[\\d\\.]+\\s/i],[VENDOR,MODEL,[TYPE,WEARABLE]],[/android.+;\\s(oppo)\\s?([\\w\\s]+)\\sbuild/i],[VENDOR,MODEL,[TYPE,MOBILE]],[/crkey/i],[[MODEL,\"Chromecast\"],[VENDOR,\"Google\"]],[/android.+;\\s(glass)\\s\\d/i],[MODEL,[VENDOR,\"Google\"],[TYPE,WEARABLE]],[/android.+;\\s(pixel c)\\s/i],[MODEL,[VENDOR,\"Google\"],[TYPE,TABLET]],[/android.+;\\s(pixel xl|pixel)\\s/i],[MODEL,[VENDOR,\"Google\"],[TYPE,MOBILE]],[/android.+;\\s(\\w+)\\s+build\\/hm\\1/i,/android.+(hm[\\s\\-_]*note?[\\s_]*(?:\\d\\w)?)\\s+build/i,/android.+(mi[\\s\\-_]*(?:one|one[\\s_]plus|note lte)?[\\s_]*(?:\\d?\\w?)[\\s_]*(?:plus)?)\\s+build/i,/android.+(redmi[\\s\\-_]*(?:note)?(?:[\\s_]*[\\w\\s]+))\\s+build/i],[[MODEL,/_/g,\" \"],[VENDOR,\"Xiaomi\"],[TYPE,MOBILE]],[/android.+(mi[\\s\\-_]*(?:pad)(?:[\\s_]*[\\w\\s]+))\\s+build/i],[[MODEL,/_/g,\" \"],[VENDOR,\"Xiaomi\"],[TYPE,TABLET]],[/android.+;\\s(m[1-5]\\snote)\\sbuild/i],[MODEL,[VENDOR,\"Meizu\"],[TYPE,TABLET]],[/android.+a000(1)\\s+build/i,/android.+oneplus\\s(a\\d{4})\\s+build/i],[MODEL,[VENDOR,\"OnePlus\"],[TYPE,MOBILE]],[/android.+[;\\/]\\s*(RCT[\\d\\w]+)\\s+build/i],[MODEL,[VENDOR,\"RCA\"],[TYPE,TABLET]],[/android.+[;\\/\\s]+(Venue[\\d\\s]{2,7})\\s+build/i],[MODEL,[VENDOR,\"Dell\"],[TYPE,TABLET]],[/android.+[;\\/]\\s*(Q[T|M][\\d\\w]+)\\s+build/i],[MODEL,[VENDOR,\"Verizon\"],[TYPE,TABLET]],[/android.+[;\\/]\\s+(Barnes[&\\s]+Noble\\s+|BN[RT])(V?.*)\\s+build/i],[[VENDOR,\"Barnes & Noble\"],MODEL,[TYPE,TABLET]],[/android.+[;\\/]\\s+(TM\\d{3}.*\\b)\\s+build/i],[MODEL,[VENDOR,\"NuVision\"],[TYPE,TABLET]],[/android.+;\\s(k88)\\sbuild/i],[MODEL,[VENDOR,\"ZTE\"],[TYPE,TABLET]],[/android.+[;\\/]\\s*(gen\\d{3})\\s+build.*49h/i],[MODEL,[VENDOR,\"Swiss\"],[TYPE,MOBILE]],[/android.+[;\\/]\\s*(zur\\d{3})\\s+build/i],[MODEL,[VENDOR,\"Swiss\"],[TYPE,TABLET]],[/android.+[;\\/]\\s*((Zeki)?TB.*\\b)\\s+build/i],[MODEL,[VENDOR,\"Zeki\"],[TYPE,TABLET]],[/(android).+[;\\/]\\s+([YR]\\d{2})\\s+build/i,/android.+[;\\/]\\s+(Dragon[\\-\\s]+Touch\\s+|DT)(\\w{5})\\sbuild/i],[[VENDOR,\"Dragon Touch\"],MODEL,[TYPE,TABLET]],[/android.+[;\\/]\\s*(NS-?\\w{0,9})\\sbuild/i],[MODEL,[VENDOR,\"Insignia\"],[TYPE,TABLET]],[/android.+[;\\/]\\s*((NX|Next)-?\\w{0,9})\\s+build/i],[MODEL,[VENDOR,\"NextBook\"],[TYPE,TABLET]],[/android.+[;\\/]\\s*(Xtreme\\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\\s+build/i],[[VENDOR,\"Voice\"],MODEL,[TYPE,MOBILE]],[/android.+[;\\/]\\s*(LVTEL\\-)?(V1[12])\\s+build/i],[[VENDOR,\"LvTel\"],MODEL,[TYPE,MOBILE]],[/android.+[;\\/]\\s*(V(100MD|700NA|7011|917G).*\\b)\\s+build/i],[MODEL,[VENDOR,\"Envizen\"],[TYPE,TABLET]],[/android.+[;\\/]\\s*(Le[\\s\\-]+Pan)[\\s\\-]+(\\w{1,9})\\s+build/i],[VENDOR,MODEL,[TYPE,TABLET]],[/android.+[;\\/]\\s*(Trio[\\s\\-]*.*)\\s+build/i],[MODEL,[VENDOR,\"MachSpeed\"],[TYPE,TABLET]],[/android.+[;\\/]\\s*(Trinity)[\\-\\s]*(T\\d{3})\\s+build/i],[VENDOR,MODEL,[TYPE,TABLET]],[/android.+[;\\/]\\s*TU_(1491)\\s+build/i],[MODEL,[VENDOR,\"Rotor\"],[TYPE,TABLET]],[/android.+(KS(.+))\\s+build/i],[MODEL,[VENDOR,\"Amazon\"],[TYPE,TABLET]],[/android.+(Gigaset)[\\s\\-]+(Q\\w{1,9})\\s+build/i],[VENDOR,MODEL,[TYPE,TABLET]],[/\\s(tablet|tab)[;\\/]/i,/\\s(mobile)(?:[;\\/]|\\ssafari)/i],[[TYPE,util.lowerize],VENDOR,MODEL],[/(android[\\w\\.\\s\\-]{0,9});.+build/i],[MODEL,[VENDOR,\"Generic\"]]],engine:[[/windows.+\\sedge\\/([\\w\\.]+)/i],[VERSION,[NAME,\"EdgeHTML\"]],[/(presto)\\/([\\w\\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\\/([\\w\\.]+)/i,/(khtml|tasman|links)[\\/\\s]\\(?([\\w\\.]+)/i,/(icab)[\\/\\s]([23]\\.[\\d\\.]+)/i],[NAME,VERSION],[/rv\\:([\\w\\.]{1,9}).+(gecko)/i],[VERSION,NAME]],os:[[/microsoft\\s(windows)\\s(vista|xp)/i],[NAME,VERSION],[/(windows)\\snt\\s6\\.2;\\s(arm)/i,/(windows\\sphone(?:\\sos)*)[\\s\\/]?([\\d\\.\\s\\w]*)/i,/(windows\\smobile|windows)[\\s\\/]?([ntce\\d\\.\\s]+\\w)/i],[NAME,[VERSION,mapper.str,maps.os.windows.version]],[/(win(?=3|9|n)|win\\s9x\\s)([nt\\d\\.]+)/i],[[NAME,\"Windows\"],[VERSION,mapper.str,maps.os.windows.version]],[/\\((bb)(10);/i],[[NAME,\"BlackBerry\"],VERSION],[/(blackberry)\\w*\\/?([\\w\\.]*)/i,/(tizen)[\\/\\s]([\\w\\.]+)/i,/(android|webos|palm\\sos|qnx|bada|rim\\stablet\\sos|meego|contiki)[\\/\\s-]?([\\w\\.]*)/i,/linux;.+(sailfish);/i],[NAME,VERSION],[/(symbian\\s?os|symbos|s60(?=;))[\\/\\s-]?([\\w\\.]*)/i],[[NAME,\"Symbian\"],VERSION],[/\\((series40);/i],[NAME],[/mozilla.+\\(mobile;.+gecko.+firefox/i],[[NAME,\"Firefox OS\"],VERSION],[/(nintendo|playstation)\\s([wids34portablevu]+)/i,/(mint)[\\/\\s\\(]?(\\w*)/i,/(mageia|vectorlinux)[;\\s]/i,/(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\\/\\s-]?(?!chrom)([\\w\\.-]*)/i,/(hurd|linux)\\s?([\\w\\.]*)/i,/(gnu)\\s?([\\w\\.]*)/i],[NAME,VERSION],[/(cros)\\s[\\w]+\\s([\\w\\.]+\\w)/i],[[NAME,\"Chromium OS\"],VERSION],[/(sunos)\\s?([\\w\\.\\d]*)/i],[[NAME,\"Solaris\"],VERSION],[/\\s([frentopc-]{0,4}bsd|dragonfly)\\s?([\\w\\.]*)/i],[NAME,VERSION],[/(haiku)\\s(\\w+)/i],[NAME,VERSION],[/cfnetwork\\/.+darwin/i,/ip[honead]{2,4}(?:.*os\\s([\\w]+)\\slike\\smac|;\\sopera)/i],[[VERSION,/_/g,\".\"],[NAME,\"iOS\"]],[/(mac\\sos\\sx)\\s?([\\w\\s\\.]*)/i,/(macintosh|mac(?=_powerpc)\\s)/i],[[NAME,\"Mac OS\"],[VERSION,/_/g,\".\"]],[/((?:open)?solaris)[\\/\\s-]?([\\w\\.]*)/i,/(aix)\\s((\\d)(?=\\.|\\)|\\s)[\\w\\.])*/i,/(plan\\s9|minix|beos|os\\/2|amigaos|morphos|risc\\sos|openvms)/i,/(unix)\\s?([\\w\\.]*)/i],[NAME,VERSION]]};var UAParser=function(uastring,extensions){if(typeof uastring===\"object\"){extensions=uastring;uastring=undefined}if(!(this instanceof UAParser)){return new UAParser(uastring,extensions).getResult()}var ua=uastring||(window&&window.navigator&&window.navigator.userAgent?window.navigator.userAgent:EMPTY);var rgxmap=extensions?util.extend(regexes,extensions):regexes;this.getBrowser=function(){var browser={name:undefined,version:undefined};mapper.rgx.call(browser,ua,rgxmap.browser);browser.major=util.major(browser.version);return browser};this.getCPU=function(){var cpu={architecture:undefined};mapper.rgx.call(cpu,ua,rgxmap.cpu);return cpu};this.getDevice=function(){var device={vendor:undefined,model:undefined,type:undefined};mapper.rgx.call(device,ua,rgxmap.device);return device};this.getEngine=function(){var engine={name:undefined,version:undefined};mapper.rgx.call(engine,ua,rgxmap.engine);return engine};this.getOS=function(){var os={name:undefined,version:undefined};mapper.rgx.call(os,ua,rgxmap.os);return os};this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}};this.getUA=function(){return ua};this.setUA=function(uastring){ua=uastring;return this};return this};UAParser.VERSION=LIBVERSION;UAParser.BROWSER={NAME:NAME,MAJOR:MAJOR,VERSION:VERSION};UAParser.CPU={ARCHITECTURE:ARCHITECTURE};UAParser.DEVICE={MODEL:MODEL,VENDOR:VENDOR,TYPE:TYPE,CONSOLE:CONSOLE,MOBILE:MOBILE,SMARTTV:SMARTTV,TABLET:TABLET,WEARABLE:WEARABLE,EMBEDDED:EMBEDDED};UAParser.ENGINE={NAME:NAME,VERSION:VERSION};UAParser.OS={NAME:NAME,VERSION:VERSION};if(typeof exports!==UNDEF_TYPE){if(typeof module!==UNDEF_TYPE&&module.exports){exports=module.exports=UAParser}exports.UAParser=UAParser}else{if(\"function\"===FUNC_TYPE&&__webpack_require__(3)){!(__WEBPACK_AMD_DEFINE_RESULT__ = (function(){return UAParser}).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))}else if(window){window.UAParser=UAParser}}var $=window&&(window.jQuery||window.Zepto);if(typeof $!==UNDEF_TYPE){var parser=new UAParser;$.ua=parser.getResult();$.ua.get=function(){return parser.getUA()};$.ua.set=function(uastring){parser.setUA(uastring);var result=parser.getResult();for(var prop in result){$.ua[prop]=result[prop]}}}})(typeof window===\"object\"?window:this);\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */\r\nmodule.exports = __webpack_amd_options__;\r\n\n/* WEBPACK VAR INJECTION */}.call(exports, {}))\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _require = __webpack_require__(0),\n    DEVICE_TYPES = _require.DEVICE_TYPES,\n    defaultData = _require.defaultData;\n\nvar checkType = function checkType(type) {\n    switch (type) {\n        case DEVICE_TYPES.MOBILE:\n            return { isMobile: true };\n        case DEVICE_TYPES.TABLET:\n            return { isTablet: true };\n        case DEVICE_TYPES.SMART_TV:\n            return { isSmartTV: true };\n        case DEVICE_TYPES.CONSOLE:\n            return { isConsole: true };\n        case DEVICE_TYPES.WEARABLE:\n            return { isWearable: true };\n        case DEVICE_TYPES.BROWSER:\n            return { isBrowser: true };\n        default:\n            return defaultData;\n    }\n};\n\nvar broPayload = function broPayload(isBrowser, browser, engine, os, ua) {\n    return {\n        isBrowser: isBrowser,\n        browserMajorVersion: browser.major,\n        browserFullVersion: browser.version,\n        browserName: browser.name,\n        engineName: engine.name || false,\n        engineVersion: engine.version,\n        osName: os.name,\n        osVersion: os.version,\n        userAgent: ua\n    };\n};\n\nvar mobilePayload = function mobilePayload(type, device, os, ua) {\n    return _extends({}, type, {\n        vendor: device.vendor,\n        model: device.model,\n        os: os.name,\n        osVersion: os.version,\n        ua: ua\n    });\n};\n\nvar stvPayload = function stvPayload(isSmartTV, engine, os, ua) {\n    return {\n        isSmartTV: isSmartTV,\n        engineName: engine.name,\n        engineVersion: engine.version,\n        osName: os.name,\n        osVersion: os.version,\n        userAgent: ua\n    };\n};\n\nvar consolePayload = function consolePayload(isConsole, engine, os, ua) {\n    return {\n        isConsole: isConsole,\n        engineName: engine.name,\n        engineVersion: engine.version,\n        osName: os.name,\n        osVersion: os.version,\n        userAgent: ua\n    };\n};\n\nvar wearPayload = function wearPayload(isWearable, engine, os, ua) {\n    return {\n        isWearable: isWearable,\n        engineName: engine.name,\n        engineVersion: engine.version,\n        osName: os.name,\n        osVersion: os.version,\n        userAgent: ua\n    };\n};\n\nvar getNavigatorInstance = exports.getNavigatorInstance = function getNavigatorInstance() {\n    if (typeof window !== 'undefined') {\n        if (window.navigator || navigator) {\n            return window.navigator || navigator;\n        }\n    }\n\n    return false;\n};\n\nvar isIOS13Check = exports.isIOS13Check = function isIOS13Check(type) {\n    var nav = getNavigatorInstance();\n    return nav && nav.platform && (nav.platform.indexOf(type) !== -1 || nav.platform === 'MacIntel' && nav.maxTouchPoints > 1 && !window.MSStream);\n};\n\nmodule.exports = {\n    checkType: checkType,\n    broPayload: broPayload,\n    mobilePayload: mobilePayload,\n    stvPayload: stvPayload,\n    consolePayload: consolePayload,\n    wearPayload: wearPayload,\n    getNavigatorInstance: getNavigatorInstance,\n    isIOS13Check: isIOS13Check\n};\n\n/***/ })\n/******/ ]);","<script setup>\r\nimport { ref, computed, inject } from \"vue\";\r\nimport { debounce } from \"lodash\";\r\nimport FhImage from \"@/components/FhImage.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhProductTags from \"@/components/FhProductTags.vue\";\r\nimport formatPrice from \"@/util/formatPrice.js\";\r\nimport FhQuantityInput from \"@/components/FhQuantityInput.vue\";\r\nimport { event_selectItem } from \"@/util/googleAnalytics\";\r\nimport { isMobile } from \"mobile-device-detect\";\r\n\r\nconst props = defineProps({\r\n  product: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isShoppingList: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isOwner: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isPreview: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isCADPrice: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isCustomerGuest: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdminShoppingList: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst hoverSwatch = ref(null);\r\nconst selectedSwatch = ref(null);\r\nconst activeSwatch = computed(() => hoverSwatch.value ?? selectedSwatch.value);\r\nconst activeDetailsObj = computed(() => activeSwatch.value ?? props.product);\r\n\r\nconst isImageHovered = ref(false);\r\nconst image = computed(() => activeDetailsObj.value.images?.default);\r\nconst hoverImage = computed(() => activeDetailsObj.value.images?.hover);\r\nconst imageSrc = computed(() => (isImageHovered.value && hoverImage.value ? hoverImage.value : image.value));\r\n\r\nconst url = computed(() => activeDetailsObj.value.url);\r\nconst tags = computed(() => activeDetailsObj.value.tags);\r\nconst inStock = computed(() => activeDetailsObj.value.inStock);\r\n\r\nconst price = computed(() => activeDetailsObj.value.price);\r\nconst originalPrice = computed(() => activeDetailsObj.value.originalPrice);\r\nconst isDiscounted = computed(() => activeDetailsObj.value.isDiscounted);\r\n\r\nconst buildPriceString = (priceData) => {\r\n  if (typeof priceData === \"object\" && priceData !== null && !Number.isNaN(Number(priceData.min)) && !Number.isNaN(Number(priceData.max))) {\r\n    if ((props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin) || (props.isCADPrice && props.isAdmin && props.isPreview)) {\r\n      return `CAD${formatPrice(Number(priceData.min))} - CAD${formatPrice(Number(priceData.max))}`;\r\n    } else {\r\n      return `${formatPrice(Number(priceData.min))} - ${formatPrice(Number(priceData.max))}`;\r\n    }\r\n  } else if (priceData !== null && priceData !== \"\" && !Number.isNaN(Number(priceData))) {\r\n    if ((props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin) || (props.isCADPrice && props.isAdmin && props.isPreview)) {\r\n      return `CAD${formatPrice(Number(priceData))}`;\r\n    } else {\r\n      return formatPrice(Number(priceData));\r\n    }\r\n  } else {\r\n    return undefined;\r\n  }\r\n};\r\n\r\nconst priceString = computed(() => buildPriceString(price.value));\r\nconst originalPriceString = computed(() => buildPriceString(originalPrice.value));\r\n\r\n// Show the original (strikethrough) price when the isDiscounted prop is true, except when:\r\n//   1. price is a range (i.e., price string contains a dash)\r\n//   2. price and originalPrice are the same\r\nconst showOriginalPrice = computed(() => isDiscounted.value && priceString.value.indexOf(\"-\") === -1 && price.value !== originalPrice.value);\r\n\r\nconst handleSwatchMouseEnter = (swatch) => (hoverSwatch.value = swatch);\r\nconst handleSwatchMouseLeave = () => (hoverSwatch.value = null);\r\nconst handleSwatchClick = (swatch) => (selectedSwatch.value = swatch);\r\nconst isSwatchSelected = (swatch) => selectedSwatch.value && selectedSwatch.value.swatchName === swatch.swatchName;\r\nconst categoryList = inject(\"product_category_list\");\r\n\r\nconst navigateToProduct = (event) => {\r\n  if (props.isShoppingList && event.srcElement.localName === \"img\") {\r\n    window.location = props.product.url;\r\n  } else if (props.product.url && !props.isShoppingList) {\r\n    event_selectItem([props.product], categoryList);\r\n    window.location = url.value;\r\n  }\r\n};\r\nconst emit = defineEmits([\"update:quantity\", \"delete\", \"addtocart\", \"addtoshoppinglist\"]);\r\n\r\nconst _quantity = computed({\r\n  get: () => props.product.quantity,\r\n  set: debounce((val) => {\r\n    if (val && val !== props.product.quantity) {\r\n      emit(\"update:quantity\", val);\r\n    }\r\n  }, 500)\r\n});\r\n\r\nconst getSwatchName = () => {\r\n  if (!activeDetailsObj.value?.swatches) return activeDetailsObj.value?.skuName || activeDetailsObj.value?.swatchName;\r\n\r\n  if (activeSwatch.value) return activeSwatch.value.swatchName;\r\n\r\n  return activeDetailsObj.value?.swatches[0]?.swatchName;\r\n};\r\nconst getSwatchPrice = () => {\r\n  if (activeDetailsObj.value?.swatches) {\r\n    const activesku = activeDetailsObj.value?.sku || activeDetailsObj.value?.skuNumber;\r\n    const swatch = activeDetailsObj.value?.swatches.find((sku) => sku.skuNumber === activesku);\r\n    return swatch.skuPrice.price;\r\n  } else if (activeDetailsObj.value.skuPrice != null) {\r\n    return activeDetailsObj.value.skuPrice.price;\r\n  } else {\r\n    return activeDetailsObj.value.price;\r\n  }\r\n};\r\n\r\nconst getSelectedProductObject = () => {\r\n  return {\r\n    name: props.product.name,\r\n    skuNumber: activeSwatch.value ? activeSwatch.value.skuNumber : activeDetailsObj.value?.sku,\r\n    thumbUrl: image.value ?? props.product.images.default,\r\n    price: getSwatchPrice(),\r\n    skuName: getSwatchName(),\r\n    categoryList,\r\n    index: props.product?.index,\r\n    inStock: inStock.value\r\n  };\r\n};\r\n\r\nconst handleHeartClick = () => {\r\n  emit(\"addtoshoppinglist\", getSelectedProductObject());\r\n};\r\nconst isImageHoveredFn = (isHovered) => {\r\n  if (!isMobile) {\r\n    isImageHovered.value = isHovered;\r\n  }\r\n};\r\n</script>\r\n\r\n<template>\r\n  <component :is=\"props.product.url ? 'a' : 'div'\" :href=\"props.isShoppingList ? undefined : url\" class=\"block\" @click.prevent=\"navigateToProduct\">\r\n    <div class=\"relative\" :class=\"{ group: !isShoppingList }\" @mouseenter=\"isImageHoveredFn(true)\" @mouseleave=\"isImageHoveredFn(false)\">\r\n      <!-- PRODUCT TAGS -->\r\n      <FhProductTags :tags=\"tags\" class=\"absolute top-4 left-4 z-[1] hidden md:block\" />\r\n      <!-- PRODUCT IMAGE -->\r\n      <FhImage\r\n        :class=\"{ 'cursor-pointer': isShoppingList }\"\r\n        :src=\"isShoppingList ? props.product.thumbUrl : imageSrc\"\r\n        :alt=\"isShoppingList ? props.product.productName : props.product.name\"\r\n        square\r\n        border\r\n      />\r\n      <div v-if=\"!isShoppingList\" class=\"absolute right-1 top-1 md:right-5 md:top-5 lg:hidden lg:group-hover:block\">\r\n        <button aria-label=\"Add to List\" class=\"rounded-full bg-white p-2\" @click.stop.prevent=\"handleHeartClick\">\r\n          <FhIcon name=\"OutlineHeart\" class=\"w-[24px] h-[24px] text-gray-500\" />\r\n        </button>\r\n      </div>\r\n    </div>\r\n    <div\r\n      v-if=\"isShoppingList && !props.isPreview\"\r\n      class=\"mt-6 hidden gap-4 md:grid\"\r\n      :class=\"(props.isOwner && isAdmin) || (isAdmin && !props.isAdminShoppingList) ? 'grid-cols-3' : 'grid-cols-1'\"\r\n    >\r\n      <!-- First column -->\r\n      <div\r\n        v-if=\"(isShoppingList && props.isOwner) || (isShoppingList && props.isAdmin && !props.isAdminShoppingList)\"\r\n        :class=\"{ 'col-span-3': !props.isOwner && !props.isAdmin }\"\r\n      >\r\n        <FhQuantityInput v-model=\"_quantity\" class=\"md:mb-2.5 md:w-full\" />\r\n      </div>\r\n\r\n      <!-- Second column -->\r\n      <div\r\n        v-if=\"(isShoppingList && props.isOwner && isAdmin) || (isShoppingList && isAdmin && !props.isAdminShoppingList)\"\r\n        class=\"col-span-2\"\r\n        :class=\"{ 'col-span-3': !props.isOwner && !isAdmin }\"\r\n      >\r\n        <FhButton class=\"mb-2.5 w-full border-neutral-30 md:w-full\" @click=\"emit('addtocart')\"> Add to Cart </FhButton>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- PRODUCT CARD CONTENT CONTAINER -->\r\n    <div class=\"relative flex flex-col px-2.5 py-f3\">\r\n      <!-- eyebrowText NAME -->\r\n      <div v-if=\"props.product.eyebrowText\" class=\"text-body-sm font-medium mb-f1 text-neutral-50\">Amber Lewis x Four Hands</div>\r\n      <div\r\n        :class=\"{\r\n          'flex grow flex-col md:flex-row md:items-baseline md:justify-between': !isShoppingList,\r\n          'flex items-center justify-between text-f-sm-lg text-neutral-70': isShoppingList\r\n        }\"\r\n      >\r\n        <!-- PRODUCT NAME -->\r\n        <div class=\"mb-f1 flex flex-row items-baseline justify-between\">\r\n          <div class=\"mr-f3 text-f-sm-lg\">{{ isShoppingList ? props.product.productName : props.product.name }}</div>\r\n          <!-- MOBILE IN STOCK ICON -->\r\n          <div class=\"text-xs md:hidden\">\r\n            <FhIcon\r\n              name=\"LightningBolt\"\r\n              class=\"relative -top-px\"\r\n              :class=\"{\r\n                hidden: !inStock || isShoppingList\r\n              }\"\r\n            />\r\n          </div>\r\n        </div>\r\n        <!-- PRODUCT PRICE -->\r\n        <div v-if=\"price && !isShoppingList\" class=\"mb-f1 whitespace-nowrap text-f-xs-lg\">\r\n          <span v-if=\"showOriginalPrice\" class=\"mr-2 line-through\">\r\n            {{ originalPriceString }}\r\n          </span>\r\n          <span :class=\"{ 'text-brand-red': isDiscounted }\">\r\n            {{ priceString }}\r\n          </span>\r\n        </div>\r\n        <div v-if=\"isShoppingList && props.isOwner && !props.isPreview\" class=\"mb-f1 whitespace-nowrap text-f-xs-lg\">\r\n          <span v-if=\"props.product.isDiscounted && props.isAdmin\" class=\"mr-2 line-through\">\r\n            <span\r\n              v-if=\"\r\n                (props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin) || (props.isCADPrice && props.isAdmin && props.isPreview)\r\n              \"\r\n              >CAD</span\r\n            >{{ formatPrice(props.product.originalPrice * props.product.quantity) }}\r\n          </span>\r\n          <span v-if=\"props.product.totalPrice\" :class=\"{ 'text-brand-red': props.product.isDiscounted && props.isAdmin }\">\r\n            <span\r\n              v-if=\"\r\n                (props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin) || (props.isCADPrice && props.isAdmin && props.isPreview)\r\n              \"\r\n              >CAD</span\r\n            >{{ formatPrice(props.product.totalPrice) }}\r\n          </span>\r\n        </div>\r\n        <div\r\n          v-if=\"\r\n            (isShoppingList && props.isPreview) ||\r\n            (isShoppingList && props.isAdmin && !props.isOwner && props.isAdminShoppingList) ||\r\n            (isShoppingList && props.isAdmin && !props.isOwner && !props.isAdminShoppingList) ||\r\n            (isShoppingList && !props.isAdmin && !props.isOwner)\r\n          \"\r\n          class=\"text-neutral-50 whitespace-nowrap\"\r\n        >\r\n          Qty: {{ props.product.quantity }}\r\n        </div>\r\n      </div>\r\n      <div\r\n        v-if=\"\r\n          (isShoppingList && props.isPreview) ||\r\n          (isShoppingList && props.isAdmin && !props.isOwner && props.isAdminShoppingList) ||\r\n          (isShoppingList && props.isAdmin && !props.isOwner && !props.isAdminShoppingList) ||\r\n          (isShoppingList && !props.isAdmin && !props.isOwner)\r\n        \"\r\n        class=\"mb-f1 whitespace-nowrap text-f-xs-lg\"\r\n      >\r\n        <span v-if=\"props.product.isDiscounted && props.isAdmin\" class=\"mr-2 line-through\">\r\n          <span\r\n            v-if=\"(props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin) || (props.isCADPrice && props.isAdmin && props.isPreview)\"\r\n            >CAD</span\r\n          >{{ formatPrice(props.product.originalPrice * props.product.quantity) }}\r\n        </span>\r\n        <span v-if=\"props.product.totalPrice\" :class=\"{ 'text-brand-red': props.product.isDiscounted && props.isAdmin }\">\r\n          <span\r\n            v-if=\"(props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin) || (props.isCADPrice && props.isAdmin && props.isPreview)\"\r\n            >CAD</span\r\n          >{{ formatPrice(props.product.totalPrice) }}\r\n        </span>\r\n      </div>\r\n      <!-- ARTIST NAME -->\r\n      <div v-if=\"props.product.artistName\" class=\"text-body-sm mb-f1 text-neutral-50\">\r\n        {{ props.product.artistName }}\r\n      </div>\r\n      <!-- MORE OPTIONS -->\r\n      <div v-if=\"props.product.hasMoreOptions\" class=\"text-body-sm mb-f1 text-neutral-50\">More Options</div>\r\n      <!-- SWATCHES -->\r\n      <div v-if=\"props.product.swatches?.length\" class=\"mb-f1 flex flex-row flex-wrap\">\r\n        <button\r\n          v-for=\"(swatch, i) in props.product.swatches\"\r\n          :key=\"i\"\r\n          class=\"group hidden items-center justify-center px-0.5 first:-ml-1 md:flex\"\r\n          :title=\"swatch.name\"\r\n          @click.stop.prevent=\"handleSwatchClick(swatch)\"\r\n          @mouseenter=\"handleSwatchMouseEnter(swatch)\"\r\n          @mouseleave=\"handleSwatchMouseLeave\"\r\n        >\r\n          <img\r\n            :src=\"swatch.swatchImage\"\r\n            :alt=\"swatch.name\"\r\n            class=\"box-content h-5 w-5 rounded-full border border-solid border-transparent object-cover p-0.5 group-hover:border-neutral-50\"\r\n            :class=\"{ '!border-neutral-70': isSwatchSelected(swatch) }\"\r\n          />\r\n        </button>\r\n        <div v-if=\"!props.product.hasMoreOptions\" class=\"text-body-sm text-neutral-50 md:hidden\">{{ props.product.swatches.length }} Styles</div>\r\n      </div>\r\n      <div v-if=\"isShoppingList\" class=\"truncate text-f-xs-base text-neutral-50\">\r\n        <span v-if=\"props.product.skuName\">{{ props.product.skuName }}&nbsp;&bull;&nbsp;</span>\r\n        <span>{{ props.product.skuNumber }}</span>\r\n      </div>\r\n      <!-- IN STOCK -->\r\n      <div v-if=\"inStock\" class=\"text-body-sm flex items-center\" :class=\"{ 'hidden md:block': !isShoppingList }\">\r\n        <span class=\"mr-px\" :class=\"{ 'hidden md:inline-block': !isShoppingList }\">In Stock</span>\r\n        <FhIcon name=\"LightningBolt\" class=\"relative -top-px\" />\r\n      </div>\r\n      <!-- mobile view -->\r\n      <div\r\n        v-if=\"isShoppingList && !props.isPreview\"\r\n        class=\"mt-6 grid gap-4 md:hidden\"\r\n        :class=\"(props.isOwner && props.isAdmin) || (props.isAdmin && !props.isAdminShoppingList) ? 'grid-cols-3' : 'grid-cols-1'\"\r\n      >\r\n        <!-- First column -->\r\n        <div\r\n          v-if=\"(isShoppingList && props.isOwner) || (props.isAdmin && !props.isAdminShoppingList)\"\r\n          :class=\"{ 'col-span-3': !props.isOwner && !props.isAdmin }\"\r\n        >\r\n          <FhQuantityInput v-model=\"_quantity\" class=\"md:mb-2.5 md:w-full\" :class=\"{ 'w-auto': isShoppingList }\" />\r\n        </div>\r\n\r\n        <!-- Second column -->\r\n        <div\r\n          v-if=\"(isShoppingList && props.isOwner && props.isAdmin) || (props.isAdmin && !props.isAdminShoppingList)\"\r\n          class=\"col-span-2\"\r\n          :class=\"{ 'col-span-3': !props.isOwner && !isAdmin }\"\r\n        >\r\n          <FhButton class=\"mb-2.5 w-full border-neutral-30 md:w-full\" @click=\"emit('addtocart')\"> Add to Cart </FhButton>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"mt-3 flex justify-center text-neutral-50 md:mt-1 md:justify-end\">\r\n        <div\r\n          v-if=\"(isShoppingList && !props.isPreview && props.isOwner) || (isAdmin && !props.isAdminShoppingList && isShoppingList)\"\r\n          class=\"mt-auto mb-f1 whitespace-nowrap text-center text-f-xs-lg\"\r\n        >\r\n          <FhButton class=\"items-end justify-end text-f-xs-base\" variant=\"link\" @click=\"emit('delete')\">Remove Item</FhButton>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </component>\r\n</template>\r\n<style scoped>\r\n.text-3xl {\r\n  font-size: 1.75rem;\r\n  line-height: 1rem;\r\n}\r\n.truncate-text {\r\n  display: flex;\r\n  overflow: hidden;\r\n  white-space: nowrap;\r\n  text-overflow: ellipsis;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed, ref } from \"vue\";\r\nimport FhProductCard from \"@/components/FhProductCard.vue\";\r\n\r\nconst props = defineProps({\r\n  products: {\r\n    type: Array,\r\n    required: true\r\n  },\r\n  isCADPrice: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isCustomerGuest: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\nconst emits = defineEmits([\"addtoshoppinglist\"]);\r\nconst productsContainer = ref(null);\r\nconst products = computed(() => {\r\n  return props.products.map((product, index) => {\r\n    return {\r\n      ...product,\r\n      index\r\n    };\r\n  });\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div id=\"productsContainer\" ref=\"productsContainer\" class=\"my-f5 grid grid-cols-2 gap-x-f2.5 gap-y-f10 lg:grid-cols-3\">\r\n    <FhProductCard\r\n      v-for=\"product in products\"\r\n      :key=\"product.id\"\r\n      :product=\"product\"\r\n      :is-c-a-d-price=\"props.isCADPrice\"\r\n      :is-customer-guest=\"props.isCustomerGuest\"\r\n      :is-admin=\"props.isAdmin\"\r\n      @addtoshoppinglist=\"(selectedProduct) => emits('addtoshoppinglist', selectedProduct)\"\r\n    />\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed, ref } from \"vue\";\r\nimport FhProductFilterBar from \"@/components/FhProductFilterBar.vue\";\r\nimport FhProductGrid from \"@/components/FhProductGrid.vue\";\r\nimport FhAddToShoppingListFormModal from \"@/components/FhAddToShoppingListFormModal.vue\";\r\nimport FhShoppingListForm from \"@/components/FhShoppingListForm.vue\";\r\nimport FhLoader from \"@/components/FhLoader.vue\";\r\nimport { useUpdateItemMutation, useDeleteShoppingItemMutation, useCreateShoppingListMutation } from \"@/api/shoppingListApi\";\r\nimport { event_AddToWishList } from \"@/util/googleAnalytics\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\n\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst { isLoading: addToMutationLoading, mutate: addToShoppingListMutation } = useUpdateItemMutation();\r\nconst { isLoading: removeItemToMutationLoading, mutate: removeItemToShoppingListMutation } = useDeleteShoppingItemMutation();\r\nconst { isLoading: createShoppingListMutationLoading, mutate: createShoppingListMutation } = useCreateShoppingListMutation();\r\n\r\nconst props = defineProps({\r\n  products: {\r\n    type: Array,\r\n    default: () => [],\r\n    required: true\r\n  },\r\n  totalProducts: {\r\n    type: Number,\r\n    required: true,\r\n    default: 0,\r\n    validator: (value) => value >= 0\r\n  },\r\n  isLoading: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  filters: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  sortOptions: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  sortOrder: {\r\n    type: String,\r\n    default: \"default\"\r\n  },\r\n  activeFilters: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  facetCounts: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  hasError: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  priceMarkup: {\r\n    type: Object,\r\n    default: () => {}\r\n  },\r\n  isCADPrice: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isCustomerGuest: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  merchandisingSkus: {\r\n    type: Object,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:activeFilters\", \"update:sortValue\"]);\r\n\r\nconst showAddToShoppingListForm = ref(false);\r\nconst shoppingListToModify = ref(null);\r\nconst showForm = ref(false);\r\n\r\nconst showResults = computed(() => props.totalProducts > 0);\r\nconst showNoResults = computed(() => !props.isLoading & (props.totalProducts == 0) && !props.hasError);\r\nconst productsContainer = ref(null);\r\nconst markup = ref(props.priceMarkup?.markup || 0);\r\nconst showPriceMarkup = ref(props.priceMarkup?.showPriceMarkup || false);\r\nconst showCADPricing = ref(props.priceMarkup?.showCADPricing || false);\r\ndefineExpose({\r\n  productsContainer\r\n});\r\nfunction handleaddtoshoppinglist(selectedProduct) {\r\n  shoppingListToModify.value = selectedProduct;\r\n  showAddToShoppingListForm.value = true;\r\n}\r\n\r\nconst toggleShoppingListFormValue = () => {\r\n  showAddToShoppingListForm.value = false;\r\n};\r\n\r\nconst handaleheartclickevent = (item) => {\r\n  const data = {\r\n    skuNumber: item.formData.skuNumber,\r\n    Quantity: 1,\r\n    ShoppingListId: item.item.id\r\n  };\r\n  addToShoppingListMutation(data, {\r\n    onSuccess: () => {\r\n      notificationStore.notifySuccess(\"Item added to shopping list.\");\r\n      event_AddToWishList({\r\n        ...item.formData,\r\n        title: item.item?.title,\r\n        listId: item.item?.guid\r\n      });\r\n    },\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not create that shopping List.\")\r\n  });\r\n};\r\nconst handleheartfilledevent = (item) => {\r\n  const data = {\r\n    skuNumber: item.formData.skuNumber,\r\n    ShoppingListId: item.item.id\r\n  };\r\n  const shoppingListId = data.ShoppingListId;\r\n  const targetSkuNumber = data.skuNumber;\r\n  const targetShoppingList = item.shopping.find((item) => item.id === shoppingListId);\r\n  const matchingProduct = targetShoppingList.products.find((product) => product.skuNumber === targetSkuNumber);\r\n  const product = { ShoppingListID: item.item.id, id: matchingProduct.id, quantity: 1 };\r\n  removeItemToShoppingListMutation(product, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Item removed from shopping list.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not create that shopping List.\")\r\n  });\r\n};\r\n\r\nfunction addtolistModal(val) {\r\n  if (val == true) {\r\n    showAddToShoppingListForm.value = false;\r\n    showForm.value = val;\r\n  } else {\r\n    showAddToShoppingListForm.value = true;\r\n    showForm.value = false;\r\n  }\r\n  showForm.value = val;\r\n}\r\nconst createShoppingList = (shoppingListDetails) => {\r\n  const shoppinglist = {\r\n    title: shoppingListDetails.title,\r\n    description: shoppingListDetails.description,\r\n    pricingVisibility: shoppingListDetails.pricingVisibility,\r\n    ShoppingListItems: [{ SkuNumber: shoppingListDetails.skuNumber, Quantity: 1 }]\r\n  };\r\n  createShoppingListMutation(shoppinglist, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Your shopping list has been created.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not create that shopping List.\"),\r\n    onSettled: () => {\r\n      showForm.value = false;\r\n      showAddToShoppingListForm.value = true;\r\n      event_AddToWishList(shoppingListDetails);\r\n    }\r\n  });\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhProductFilterBar\r\n    :filters=\"props.filters\"\r\n    :sort-options=\"props.sortOptions\"\r\n    :sort-order=\"props.sortOrder\"\r\n    :total-products-count=\"props.totalProducts\"\r\n    :model-value=\"props.activeFilters\"\r\n    :facet-counts=\"props.facetCounts\"\r\n    @update:model-value=\"(filtersModel) => emit('update:activeFilters', filtersModel)\"\r\n    @update:sort-value=\"(sortValue) => emit('update:sortValue', sortValue)\"\r\n  />\r\n\r\n  <div v-if=\"props.isLoading\" class=\"my-6\"><FhLoader class=\"h-9 w-9\" /></div>\r\n  <div v-else ref=\"productsContainer\">\r\n    <FhProductGrid\r\n      v-if=\"showResults\"\r\n      :products=\"props.products\"\r\n      :is-c-a-d-price=\"props.isCADPrice\"\r\n      :is-customer-guest=\"props.isCustomerGuest\"\r\n      :is-admin=\"props.isAdmin\"\r\n      @addtoshoppinglist=\"handleaddtoshoppinglist\"\r\n    />\r\n  </div>\r\n\r\n  <!--- Empty Results -->\r\n  <div v-if=\"showNoResults\" class=\"py-5 text-center text-xl\">There are no results</div>\r\n\r\n  <!-- Error State-->\r\n  <div v-if=\"hasError\" class=\"py-5 text-center text-xl\">There was an error searching for products</div>\r\n\r\n  <FhAddToShoppingListFormModal\r\n    v-if=\"showAddToShoppingListForm\"\r\n    :is-open=\"showAddToShoppingListForm\"\r\n    :shopping-details=\"shoppingListToModify\"\r\n    :is-loading=\"removeItemToMutationLoading\"\r\n    :is-admin=\"props.isAdmin\"\r\n    :is-c-a-d-price=\"props.isCADPrice\"\r\n    :is-customer-guest=\"props.isCustomerGuest\"\r\n    @addtolist=\"addtolistModal\"\r\n    @heart-icon-clicked=\"handaleheartclickevent\"\r\n    @heart-icon-filled=\"handleheartfilledevent\"\r\n    @update:is-open=\"toggleShoppingListFormValue\"\r\n  ></FhAddToShoppingListFormModal>\r\n\r\n  <FhShoppingListForm\r\n    v-if=\"showForm\"\r\n    :is-admin=\"props.isAdmin\"\r\n    :is-open=\"showForm\"\r\n    :is-creating=\"addToMutationLoading || createShoppingListMutationLoading\"\r\n    :shopping-details=\"shoppingListToModify\"\r\n    :edit-mode=\"false\"\r\n    :is-plp-pdp=\"true\"\r\n    :markup=\"markup\"\r\n    :show-price-markup=\"showPriceMarkup\"\r\n    :show-c-a-d-pricing=\"showCADPricing\"\r\n    :is-c-a-d-price=\"props.isCADPrice\"\r\n    :is-customer-guest=\"props.isCustomerGuest\"\r\n    @create=\"createShoppingList\"\r\n    @update:is-open=\"addtolistModal\"\r\n  ></FhShoppingListForm>\r\n</template>\r\n","import axiosClient from \"./axiosClient\";\r\nimport { useQuery, useQueryClient, useInfiniteQuery } from \"@tanstack/vue-query\";\r\n\r\nconst QUERY_KEY_BASE = \"products\";\r\n\r\n// TODO: Maybe look into creating a simpler object for filters instead of passing the whole filters object\r\nexport const useProductQuery = (searchBody, pageIndex, activeFilters, sortOrder) => {\r\n  const queryClient = useQueryClient();\r\n  return useQuery({\r\n    queryKey: [QUERY_KEY_BASE, pageIndex, activeFilters, sortOrder],\r\n    queryFn: ({ queryKey }) => {\r\n      // TODO: possibly figure out why its not pulling from cache on its own\r\n      // but for now this is manually looking in cache\r\n      const hasQueryCache = queryClient.getQueryData(queryKey);\r\n      if (hasQueryCache) return hasQueryCache;\r\n      return axiosClient.post(`/products/v2/search`, { ...searchBody, pageIndex: queryKey[1] });\r\n    },\r\n    keepPreviousData: true,\r\n    refetchOnWindowFocus: false\r\n  });\r\n};\r\n\r\nexport const useInfiniteProductQuery = (searchBody, activeFilters, sortOrder) => {\r\n  return useInfiniteQuery({\r\n    queryKey: [QUERY_KEY_BASE, activeFilters, sortOrder],\r\n    queryFn: ({ pageParam }) => {\r\n      return axiosClient.post(`/products/v2/search`, { ...searchBody, pageIndex: pageParam });\r\n    },\r\n    getNextPageParam: (lastPage, allPages) => {\r\n      if (allPages.length == 0) return 0;\r\n      let totalProducts = allPages.reduce((accumulator, page) => accumulator + page.pageSize, 0);\r\n      if (totalProducts < lastPage.total) return lastPage.pageIndex + 1;\r\n      return null;\r\n    },\r\n    refetchOnWindowFocus: false,\r\n    gcTime: 0 // Lets look into another way to handle this turning off cache feels dirty :(\r\n  });\r\n};\r\n","<script setup>\r\nimport { ref, computed, provide, reactive, onMounted, nextTick, watch } from \"vue\";\r\nimport FhProductListingPresenter_InfiniteScroll from \"@/components/FhProductListingPresenter.vue\";\r\nimport { useInfiniteProductQuery } from \"@/api/productServiceApi\";\r\nimport { event_viewListItem } from \"@/util/googleAnalytics\";\r\nimport { useProductFiltersStore } from \"@/stores/ProductFiltersStore\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhLoader from \"@/components/FhLoader.vue\";\r\nimport { useViewportSizes } from \"@/composables\";\r\n\r\nconst props = defineProps({\r\n  baseQuery: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  categoryId: {\r\n    type: Number,\r\n    default: 0\r\n  },\r\n  filters: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  sortOptions: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  searchText: {\r\n    type: String,\r\n    default: undefined\r\n  },\r\n  categoryList: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  priceMarkup: {\r\n    type: Object,\r\n    default: () => {}\r\n  },\r\n  isCADPrice: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isCustomerGuest: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  productListingClientComponentParams: {\r\n    type: Object,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nconst productFilterStore = useProductFiltersStore();\r\nconst { searchParams, setURLParam, updateURL, currentPage, currentSortOrder } = productFilterStore.urlState;\r\n\r\nconst { isSm, isMd } = useViewportSizes();\r\n\r\nconst lastScrollPosition = ref(0);\r\nconst filterKeysToFacet = props.filters.map((filter) => filter.key);\r\nconst isFirstLoad = ref(true);\r\nconst resultSetContainer = ref(null);\r\nconst isViewMore = ref(false);\r\n\r\nconst headerElement = ref(null);\r\nconst productFilterElement = ref(null);\r\n\r\nconst infiniteScrollDefaults = reactive({\r\n  initialPageSize: 18,\r\n  normalPageSize: 18,\r\n  displayThreshold: computed(() => (isSm.value || isMd.value ? 102 : 105))\r\n});\r\n\r\nconst sortOptions = computed(() => {\r\n  if (!props.sortOptions) return [];\r\n  return props.sortOptions;\r\n});\r\nconst sortOrder = ref(currentSortOrder || sortOptions.value[0]?.key);\r\nconst scrollComponent = ref(null);\r\n\r\nconst merchandisingSkus = computed(() => {\r\n  if (!props.productListingClientComponentParams) return [];\r\n  return props.productListingClientComponentParams.merchandisingSkus;\r\n});\r\n\r\nconst baseQuery = computed(() => {\r\n  if (!props.baseQuery) return [];\r\n  return props.baseQuery;\r\n});\r\n\r\nconst baseFilterQuery = buildFiltersQuery(baseQuery.value, searchParams);\r\n\r\nconst searchBody = ref({\r\n  pageSize: infiniteScrollDefaults.initialPageSize,\r\n  pageIndex: currentPage,\r\n  sortOrder: sortOrder,\r\n  offset: 0,\r\n  filters: baseFilterQuery,\r\n  filterKeysToFacet: filterKeysToFacet,\r\n  searchText: props.searchText,\r\n  condensed: true,\r\n  merchandisingSkus: merchandisingSkus\r\n});\r\n\r\nconst activeFilters = ref(searchParams);\r\n\r\nfunction handleActiveFiltersChange(filters) {\r\n  const filterQueryTransform = Object.entries(filters).map(([key, value]) => {\r\n    return {\r\n      key: key,\r\n      values: value\r\n    };\r\n  });\r\n\r\n  searchBody.value.pageIndex = 0;\r\n  searchBody.value.offset = 0;\r\n  searchBody.value.pageSize = infiniteScrollDefaults.initialPageSize;\r\n  activeFilters.value = filterQueryTransform;\r\n  isViewMore.value = false;\r\n\r\n  searchBody.value.filters = buildFiltersQuery(baseQuery.value, filterQueryTransform);\r\n}\r\n\r\nfunction buildFiltersQuery(baseFilterQuery, updatedFilterQuery) {\r\n  const filteredBaseQuery = baseFilterQuery.filter((queryObj) => {\r\n    return !updatedFilterQuery.find((filterQuery) => filterQuery.key === queryObj.key);\r\n  });\r\n\r\n  return [...filteredBaseQuery, ...updatedFilterQuery];\r\n}\r\n\r\nconst {\r\n  data: productListingsQueryData,\r\n  fetchNextPage,\r\n  hasNextPage,\r\n  isFetching,\r\n  isFetchingNextPage,\r\n  isError\r\n} = useInfiniteProductQuery(searchBody.value, activeFilters, sortOrder);\r\n\r\nconst productListings = reactive({\r\n  total: computed(() => productListingsQueryData.value?.pages[0].total || 0),\r\n  facets: computed(() => productListingsQueryData.value?.pages[0].facets || []),\r\n  products: computed(() => {\r\n    return productListingsQueryData.value?.pages.map((listings) => listings.products).flat();\r\n  })\r\n});\r\n\r\nconst thresholdMeet = computed(() => {\r\n  if (productListings.products) {\r\n    return (\r\n      productListings.products.length >= infiniteScrollDefaults.displayThreshold ||\r\n      productListings.total <= infiniteScrollDefaults.initialPageSize ||\r\n      (!hasNextPage.value && productListings.products.length <= infiniteScrollDefaults.displayThreshold)\r\n    );\r\n  }\r\n\r\n  return false;\r\n});\r\n\r\nconst percantageComplete = computed(() => {\r\n  if (productListings.products) {\r\n    return (productListings.products.length / productListings.total) * 100;\r\n  }\r\n  return 0;\r\n});\r\n\r\nprovide(\"fetching_products\", isFetching);\r\nprovide(\"product_category_list\", props.categoryList);\r\n\r\n//TODO: Will leave in for now until we get final word on tracking for this\r\nwatch(productListings, () => {\r\n  if (history.state && isFirstLoad.value) {\r\n    nextTick(() => {\r\n      window.scrollTo(0, history.state?.scroll_position);\r\n      history.replaceState(null, \"\");\r\n    });\r\n  }\r\n\r\n  if (!isFirstLoad.value && !isViewMore.value) {\r\n    const resultSet = resultSetContainer.value.productsContainer;\r\n    const chipsBar = document.querySelector(\"[data-product-chips]\");\r\n    const filterBar = document.querySelector(\".c-productFilterBar\");\r\n    const offsetTop = chipsBar ? chipsBar.offsetTop : resultSet.offsetTop;\r\n    nextTick(() => {\r\n      window.scrollTo({\r\n        top: offsetTop - filterBar.offsetHeight,\r\n        left: 0,\r\n        behavior: \"smooth\"\r\n      });\r\n    });\r\n  } else {\r\n    event_viewListItem(productListings.products, props.categoryList);\r\n  }\r\n\r\n  isFirstLoad.value = false;\r\n});\r\n\r\nconst handleSort = (value) => {\r\n  setURLParam(\"sort\", value);\r\n  updateURL();\r\n  searchBody.value.pageIndex = 0;\r\n  searchBody.value.offset = 0;\r\n  searchBody.value.pageSize = infiniteScrollDefaults.initialPageSize;\r\n  sortOrder.value = value;\r\n};\r\n\r\nonMounted(() => {\r\n  window.addEventListener(\"scroll\", handleScroll);\r\n  window.addEventListener(\"beforeunload\", unmounted);\r\n  headerElement.value = document.querySelector(\"header\");\r\n  productFilterElement.value = document.querySelector(\".c-productFilterBar\");\r\n  if (headerElement.value) {\r\n    nextTick(() => document.documentElement.style.setProperty(\"--header-height\", `${headerElement.value.offsetHeight}px`));\r\n  }\r\n});\r\n\r\nconst unmounted = () => {\r\n  history.replaceState(\r\n    {\r\n      scroll_position: document.documentElement.scrollTop,\r\n      products_length: productListings.products.length\r\n    },\r\n    \"\"\r\n  );\r\n};\r\n\r\nconst handleScroll = () => {\r\n  const currentScrollPosition = document.documentElement.scrollTop;\r\n\r\n  const scrollElement = scrollComponent.value;\r\n  if (scrollElement.getBoundingClientRect().bottom - 300 < window.innerHeight) {\r\n    fetchMoreProduct();\r\n  }\r\n\r\n  if (currentScrollPosition <= headerElement.value.offsetHeight) {\r\n    if (headerElement.value.classList.contains(\"show-header\")) {\r\n      headerElement.value.classList.remove(\"show-header\");\r\n      headerElement.value.classList.remove(\"animate-header-slide\");\r\n      productFilterElement.value.classList.remove(\"animate-main-content-slide\");\r\n    }\r\n    // bail so we don't inadvertantly show the header\r\n    return;\r\n  }\r\n\r\n  if (currentScrollPosition < lastScrollPosition.value) {\r\n    if (!headerElement.value.classList.contains(\"show-header\")) {\r\n      headerElement.value.classList.add(\"show-header\");\r\n      headerElement.value.classList.add(\"animate-header-slide\");\r\n      productFilterElement.value.classList.add(\"animate-main-content-slide\");\r\n    } else if (headerElement.value.classList.contains(\"show-header\") && headerElement.value.classList.contains(\"animate-header-slide-leave\")) {\r\n      headerElement.value.classList.remove(\"animate-header-slide-leave\");\r\n      productFilterElement.value.classList.remove(\"animate-main-content-slide-leave\");\r\n      headerElement.value.classList.add(\"animate-header-slide\");\r\n      productFilterElement.value.classList.add(\"animate-main-content-slide\");\r\n    }\r\n  } else {\r\n    if (headerElement.value.classList.contains(\"show-header\")) {\r\n      headerElement.value.classList.remove(\"animate-header-slide\");\r\n      productFilterElement.value.classList.remove(\"animate-main-content-slide\");\r\n      headerElement.value.classList.add(\"animate-header-slide-leave\");\r\n      productFilterElement.value.classList.add(\"animate-main-content-slide-leave\");\r\n    }\r\n  }\r\n\r\n  lastScrollPosition.value = currentScrollPosition;\r\n};\r\n\r\nconst fetchMoreProduct = () => {\r\n  if (!isFetchingNextPage.value && hasNextPage.value && !thresholdMeet.value) {\r\n    searchBody.value.pageSize = infiniteScrollDefaults.normalPageSize;\r\n    isViewMore.value = true;\r\n    fetchNextPage();\r\n  }\r\n};\r\n\r\nconst scrollToTop = () => {\r\n  window.scrollTo({ top: 0, left: 0, behavior: \"smooth\" });\r\n};\r\n</script>\r\n\r\n<template>\r\n  <div>\r\n    <div ref=\"scrollComponent\">\r\n      <FhProductListingPresenter_InfiniteScroll\r\n        ref=\"resultSetContainer\"\r\n        :is-loading=\"isFetching && !isFetchingNextPage\"\r\n        :products=\"productListings?.products\"\r\n        :total-products=\"productListings?.total\"\r\n        :filters=\"props.filters\"\r\n        :sort-options=\"props.sortOptions\"\r\n        :sort-order=\"sortOrder\"\r\n        :active-filters=\"activeFilters\"\r\n        :facet-counts=\"productListings?.facets\"\r\n        :has-error=\"isError\"\r\n        :is-admin=\"props.isAdmin\"\r\n        :price-markup=\"props.priceMarkup\"\r\n        :is-c-a-d-price=\"props.isCADPrice\"\r\n        :is-customer-guest=\"props.isCustomerGuest\"\r\n        :merchandising-skus=\"merchandisingSkus\"\r\n        @update:active-filters=\"handleActiveFiltersChange\"\r\n        @update:sort-value=\"handleSort\"\r\n      />\r\n    </div>\r\n    <div class=\"py-20\">\r\n      <span v-if=\"isFetchingNextPage\"><FhLoader class=\"h-9 w-9\" /></span>\r\n      <div v-else-if=\"thresholdMeet\" class=\"flex flex-col justify-center items-center\">\r\n        <div class=\"mb-8 w-56\">\r\n          <span class=\"text-base font-medium text-neutral-50 block w-full text-center mb-2\"\r\n            >Showing {{ productListings.products?.length }} of {{ productListings.total }}</span\r\n          >\r\n          <div class=\"mb-5 h-2 rounded-full bg-neutral-30\">\r\n            <div class=\"h-2 rounded-full bg-black\" :style=\"{ width: `${percantageComplete}%` }\"></div>\r\n          </div>\r\n        </div>\r\n        <div class=\"flex items-center justify-center gap-3\">\r\n          <FhButton class=\"py-4 px-8\" data-fh-ga=\"scroll-to-top\" @click=\"scrollToTop\">Back To Top</FhButton>\r\n          <FhButton\r\n            v-if=\"hasNextPage && !isFetchingNextPage\"\r\n            color=\"primary\"\r\n            class=\"py-4 px-8\"\r\n            data-fh-ga=\"load-more\"\r\n            :disabled=\"isFetchingNextPage\"\r\n            @click=\"() => fetchNextPage()\"\r\n            >View More</FhButton\r\n          >\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { copy } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection :base=\"style.base\">\r\n    <!-- PRODUCT SUPPORT -->\r\n    <div class=\"mb-f10 flex flex-col text-neutral-70 md:border-b md:border-solid md:border-neutral-70 md:border-opacity-10 md:pb-f10\">\r\n      <FhHeading tag=\"h2\">Product Support</FhHeading>\r\n      <div class=\"flex flex-col md:flex-row\">\r\n        <!-- eslint-disable-next-line vue/no-v-html -->\r\n        <div class=\"text-f-sm-base\" v-html=\"copy\"></div>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * The Promo Banner message\r\n   */\r\n  largeMessageText: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  smallMessageText: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  /**\r\n   * The color of notification\r\n   * @values Slate, Limestone, Umber, Sage\r\n   */\r\n  backgroundColor: {\r\n    type: String,\r\n    default: \"limestone\",\r\n    validator: (val) => [\"slate\", \"limestone\", \"umber\", \"sage\"].includes(val)\r\n  },\r\n  linkUrl: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  linkTarget: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst bgColorClass = computed(() => {\r\n  switch (props.backgroundColor) {\r\n    case \"limestone\":\r\n      return \"bg-limestone\";\r\n    case \"slate\":\r\n      return \"bg-slate\";\r\n    case \"umber\":\r\n      return \"bg-umber\";\r\n    case \"sage\":\r\n      return \"bg-sage\";\r\n    default:\r\n      return \"bg-limestone\";\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"linkClick\"]);\r\n</script>\r\n\r\n<template>\r\n  <div class=\"z-[100]\">\r\n    <a data-ga=\"promo-banner\" :href=\"props.linkUrl\" :target=\"props.linkTarget ? '_blank' : ''\" @click=\"emit('linkClick')\">\r\n      <div class=\"w-full py-f1.5 px-f3\" :class=\"[bgColorClass, props.backgroundColor !== 'limestone' ? 'text-white' : '']\">\r\n        <div class=\"mx-auto max-w-max\">\r\n          <span v-if=\"props.largeMessageText\" class=\"mr-f2 inline-block font-bold\">{{ props.largeMessageText }}</span>\r\n          <span>{{ props.smallMessageText }}</span>\r\n        </div>\r\n      </div>\r\n    </a>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhRepresentativeCard from \"./FhRepresentativeCards/FhRepresentativeCard.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { heading, cards } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection :base=\"style.base\">\r\n    <div class=\"mb-16 flex flex-col text-neutral-70 md:border-b md:border-solid md:border-neutral-70 md:border-opacity-10 md:pb-16\">\r\n      <FhHeading tag=\"h2\">{{ heading }}</FhHeading>\r\n      <div class=\"grid grid-cols-[1fr] gap-y-[1rem] md:grid-cols-[repeat(2,1fr)] md:gap-y-[2.5rem] md:gap-x-[1.5rem]\">\r\n        <FhRepresentativeCard v-for=\"(card, i) in cards\" :key=\"`card-${i}`\" :card=\"card\"></FhRepresentativeCard>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhWysiwyg from \"../includes/FhWysiwyg.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { content, gaTagging } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    :base=\"style.base\"\r\n    :data-ga=\"gaTagging\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <FhWysiwyg :content=\"content\" :spacing=\"true\"></FhWysiwyg>\r\n  </FhSection>\r\n</template>\r\n\r\n<style scoped lang=\"pcss\"></style>\r\n","<script setup></script>\r\n\r\n<template>\r\n  <div class=\"transition-fade\">\r\n    <Transition name=\"fade\" mode=\"out-in\">\r\n      <slot></slot>\r\n    </Transition>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.transition-fade {\r\n  display: contents;\r\n  &:deep(.fade-enter-active),\r\n  &:deep(.fade-leave-active) {\r\n    transition: opacity 0.35s;\r\n  }\r\n  &:deep(.fade-enter-from),\r\n  &:deep(.fade-leave-to) {\r\n    opacity: 0\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport TransitionExpand from \"../transitions/TransitionExpand.vue\";\r\nimport TransitionFade from \"../transitions/TransitionFade.vue\";\r\nimport { ref, computed } from \"vue\";\r\nimport { cloneDeep } from \"lodash\";\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport { useViewportSizes } from \"../composables\";\r\nimport UpRightArrow from \"./icons/IconUpRightArrow.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { items } = getDataRefs(props.data);\r\n\r\nconst idBase = ref(Math.floor(Math.random() * parseInt(Date.now())));\r\nconst triggerId = ref(`trigger-${idBase.value}`);\r\nconst regionId = ref(`region-${idBase.value}`);\r\nconst triggerAriaAttributes = computed(() => {\r\n  if (isSm) {\r\n    return {\r\n      id: triggerId.value,\r\n      role: \"button\",\r\n      \"aria-controls\": regionId.value,\r\n      \"aria-expanded\": menuOpen.value ? \"true\" : \"false\"\r\n    };\r\n  }\r\n  return {};\r\n});\r\nconst regionAriaAttributes = computed(() => {\r\n  if (isSm) {\r\n    return {\r\n      id: regionId.value,\r\n      role: \"region\",\r\n      \"aria-labelledby\": triggerId.value\r\n    };\r\n  }\r\n  return {};\r\n});\r\n\r\nconst menuOpen = ref(false);\r\nconst activePage = computed(() => {\r\n  return items.value.find((item) => item.isActive);\r\n});\r\n\r\nconst { isSm } = useViewportSizes();\r\n\r\nconst menuItems = computed(() => {\r\n  if (isSm.value) {\r\n    return cloneDeep(items.value).filter((item) => !item.isActive);\r\n  }\r\n  return items.value;\r\n});\r\n\r\nconst menuStyles = computed(() => {\r\n  if (isSm.value) {\r\n    return \"absolute top-[100%] w-full pb-2 bg-slate text-white-opacity-70 z-[2]\";\r\n  }\r\n  return \"flex flex-col items-start text-neutral-50\";\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div :class=\"{ 'relative left-1/2 z-50 w-[var(--100vw)] -translate-x-1/2 border-t border-t-neutral-60 text-white': isSm }\">\r\n    <button\r\n      v-if=\"isSm\"\r\n      v-bind=\"triggerAriaAttributes\"\r\n      :id=\"triggerId\"\r\n      :class=\"['z-[2] flex w-full items-center justify-between bg-slate px-f5 pt-5 text-left transition-all', menuOpen ? 'mb-2.5 pb-2.5' : 'mb-0 pb-5']\"\r\n      type=\"button\"\r\n      @click.stop.prevent=\"menuOpen = !menuOpen\"\r\n    >\r\n      <span class=\"grow\">\r\n        {{ activePage.name }}\r\n      </span>\r\n      <span class=\"relative flex flex-[0_0_auto]\">\r\n        <span :class=\"['fh-section-nav__toggle relative', { 'is-open': menuOpen }]\"></span>\r\n      </span>\r\n    </button>\r\n    <TransitionExpand v-bind=\"regionAriaAttributes\">\r\n      <ul v-if=\"menuOpen || !isSm\" :class=\"menuStyles\">\r\n        <li v-for=\"(item, index) in menuItems\" :key=\"index\" :class=\"{ 'text-neutral-70': item.isActive }\">\r\n          <a\r\n            :href=\"item.url\"\r\n            class=\"flex items-center px-f5 py-2.5 transition-all duration-200 ease-linear md:px-3 md:hover:text-neutral-70\"\r\n            :class=\"{ group: item.target == '_blank' }\"\r\n            :aria-label=\"item.ariaLabel\"\r\n            :target=\"item.target\"\r\n          >\r\n            {{ item.name }}\r\n            <UpRightArrow\r\n              v-if=\"item.target == '_blank'\"\r\n              :class=\"{ 'visible opacity-100': isSm, 'invisible ml-2 opacity-0': !isSm }\"\r\n              class=\"transition-all duration-200 group-hover:visible group-hover:opacity-100\"\r\n            />\r\n          </a>\r\n          <ul v-if=\"!isSm && item.childItems && item.isActive\" class=\"ml-3 border-l border-solid border-[black] border-opacity-10 md:ml-0\">\r\n            <li\r\n              v-for=\"(childItem, i) in item.childItems\"\r\n              :key=\"i\"\r\n              class=\"mb-4 pl-8\"\r\n              :class=\"{\r\n                'border-current -ml-px border-l border-solid text-neutral-70': childItem.isActive,\r\n                'text-neutral-50': !childItem.isActive,\r\n                'text-white': isSm\r\n              }\"\r\n            >\r\n              <a\r\n                class=\"transition-all duration-200 ease-linear md:hover:text-neutral-70\"\r\n                :href=\"childItem.url\"\r\n                :aria-label=\"childItem.ariaLabel\"\r\n                :target=\"childItem.target\"\r\n              >\r\n                {{ childItem.name }}\r\n              </a>\r\n            </li>\r\n          </ul>\r\n        </li>\r\n      </ul>\r\n    </TransitionExpand>\r\n    <TransitionFade>\r\n      <div v-if=\"menuOpen && isSm\" class=\"absolute top-0 left-0 right-0 z-[-1] h-screen w-[var(--100vw)] bg-neutral-80 opacity-[0.35] md:hidden\"></div>\r\n    </TransitionFade>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.fh-section-nav__toggle {\r\n  display: grid;\r\n  grid-template-columns: 1fr;\r\n  grid-template-rows: 1fr;\r\n  width: 1rem;\r\n  height: 0.5rem;\r\n  align-items: start;\r\n  justify-items: center;\r\n\r\n  &::before,\r\n  &::after {\r\n    content: \"\";\r\n    display: block;\r\n    grid-area: 1 / 1 / 2 / 2;\r\n    border-radius: 2px;\r\n    height: 2px;\r\n    width: 8px;\r\n    background: #fff;\r\n    transition: 0.2s ease;\r\n  }\r\n  &::before {\r\n    transform: translateX(1px) rotate(-45deg);\r\n    transform-origin: top right;\r\n  }\r\n  &::after {\r\n    transform: rotate(45deg);\r\n    transform-origin: top left;\r\n  }\r\n}\r\n.fh-section-nav__toggle.is-open {\r\n  &::before,\r\n  &::after {\r\n    transform-origin: 50% 50%;\r\n    width: 12px;\r\n  }\r\n  &::before {\r\n    transform: rotate(-45deg);\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, reactive, computed } from \"vue\";\r\nimport { getDataRefs } from \"@/util/vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, required } from \"@vuelidate/validators\";\r\nimport { useUpdatePasswordMutation } from \"@/api/authApi\";\r\nimport { useNotificationStore } from \"../stores/NotificationStore\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhNewPassword from \"@/components/FhNewPassword.vue\";\r\nimport FhSection from \"@/includes/FhSection.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  userType: {\r\n    type: String,\r\n    required: false,\r\n    default: \"\"\r\n  }\r\n});\r\nconst isGuest = computed(() => props.userType == \"customerGuest\");\r\n\r\nconst { heading, customerIdLabel, customerId } = getDataRefs(props.data);\r\n\r\nconst isModalOpen = ref(false);\r\n\r\nconst model = reactive({\r\n  currentPassword: \"\",\r\n  newPassword: \"\"\r\n});\r\n\r\nconst $externalResults = ref({});\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    currentPassword: {\r\n      required: helpers.withMessage(\"Please enter your current password.\", required)\r\n    }\r\n  },\r\n  model,\r\n  { $externalResults }\r\n);\r\n\r\nconst serverErrorMessages = ref([]);\r\n\r\nconst { mutate: updatePasswordMutate, isLoading: isUpdating } = useUpdatePasswordMutation();\r\nconst notificationStore = useNotificationStore();\r\n\r\nasync function updatePassword() {\r\n  if (await vuelidate.value.$validate()) {\r\n    serverErrorMessages.value = [];\r\n    updatePasswordMutate(model, {\r\n      onSuccess: handleUpdatePasswordSuccess,\r\n      onError: handleUpdatePasswordError\r\n    });\r\n  }\r\n}\r\n\r\nfunction handleUpdatePasswordSuccess() {\r\n  isModalOpen.value = false;\r\n  notificationStore.notifySuccess(\"Password updated.\");\r\n}\r\n\r\nfunction handleUpdatePasswordError(error) {\r\n  const { data, status } = error.response;\r\n  if (status === 400 && data?.errors?.length) {\r\n    data.errors.forEach((err) => {\r\n      if (err.code === \"PasswordMismatch\") {\r\n        $externalResults.value = { currentPassword: \"Incorrect password.\" };\r\n      } else {\r\n        serverErrorMessages.value.push(err.description);\r\n      }\r\n    });\r\n  } else {\r\n    notificationStore.notifyError(\"Sorry, something went wrong and we could not update your password. Please try again.\");\r\n  }\r\n}\r\n\r\nfunction reset() {\r\n  model.currentPassword = \"\";\r\n  model.newPassword = \"\";\r\n  vuelidate.value.$reset();\r\n}\r\n</script>\r\n\r\n<template>\r\n  <FhSection :base=\"style.base\">\r\n    <div class=\"relative mb-f10 flex flex-col pb-f10 text-neutral-70 md:border-b md:border-solid md:border-neutral-70 md:border-opacity-10\">\r\n      <FhButton\r\n        v-if=\"!isGuest\"\r\n        class=\"absolute bottom-0 left-0 right-0 md:top-0 md:left-auto md:right-0 md:bottom-auto\"\r\n        aria-label=\"Update Password\"\r\n        @click=\"isModalOpen = true\"\r\n      >\r\n        Update Password\r\n      </FhButton>\r\n      <FhHeading tag=\"h2\">{{ heading }}</FhHeading>\r\n      <div class=\"mb-4 flex flex-col md:mb-2 md:flex-row\">\r\n        <span class=\"mb-0.5 text-f-sm-base font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\">\r\n          {{ customerIdLabel }}\r\n        </span>\r\n        <span class=\"text-neutral-50\">\r\n          {{ customerId }}\r\n        </span>\r\n      </div>\r\n      <div class=\"mb-4 flex flex-col md:mb-2 md:flex-row\">\r\n        <span class=\"mb-0.5 flex flex-col text-f-sm-base font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\">Password</span>\r\n        <div class=\"flex flex-col\">\r\n          <span class=\"text-neutral-570\">***************</span>\r\n          <span v-if=\"isGuest\" class=\"text-neutral-50 font-sans text-f-2xs-xs mt-2\">Reset password on login screen.</span>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <FhModal v-if=\"!isGuest\" v-model:is-open=\"isModalOpen\" :data=\"{ heading: 'Update Password' }\" @close=\"reset\">\r\n      <template #body>\r\n        <form id=\"updatePasswordForm\" class=\"flex flex-col gap-f4\" @submit.prevent=\"updatePassword\">\r\n          <FhInput\r\n            v-model=\"model.currentPassword\"\r\n            type=\"password\"\r\n            label=\"Current Password\"\r\n            placeholder=\"Enter current password\"\r\n            :vuelidate=\"vuelidate.currentPassword\"\r\n            @input=\"() => vuelidate.$clearExternalResults()\"\r\n          />\r\n          <FhNewPassword v-model=\"model.newPassword\" />\r\n          <div v-if=\"serverErrorMessages.length\" role=\"alert\" class=\"text-body-sm flex flex-row gap-f1 text-brand-red\">\r\n            <FhIcon name=\"AlertCircle\" class=\"relative top-px text-[125%]\" />\r\n            <ul>\r\n              <li v-for=\"errorMessage in serverErrorMessages\" :key=\"errorMessage\">{{ errorMessage }}</li>\r\n            </ul>\r\n          </div>\r\n        </form>\r\n      </template>\r\n      <template #footer=\"{ close }\">\r\n        <FhButton type=\"submit\" form=\"updatePasswordForm\" color=\"primary\" :disabled=\"vuelidate.$invalid || isUpdating\" :is-loading=\"isUpdating\">Save</FhButton>\r\n        <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n      </template>\r\n    </FhModal>\r\n  </FhSection>\r\n</template>\r\n","<script setup>\r\nimport { ref, onMounted, onBeforeUnmount } from \"vue\";\r\nimport { useTimeAgo } from \"@vueuse/core\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhImage from \"@/components/FhImage.vue\";\r\nimport FhProductTags from \"@/components/FhProductTags.vue\";\r\nconst props = defineProps({\r\n  id: {\r\n    type: String || Number,\r\n    default: null\r\n  },\r\n  guid: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  title: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  description: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  pricingVisibility: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  totalItems: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  updatedAt: {\r\n    type: Date,\r\n    required: true\r\n  },\r\n  products: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  userName: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  isAdminShoppingList: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emits = defineEmits([\"update\", \"delete\"]);\r\nconst shopplingListProducts = ref(props.products);\r\nconst availabilityUpdatedTimeAgo = useTimeAgo(() => props.updatedAt);\r\n\r\nconst showPopup = ref(false);\r\nconst togglePopup = () => {\r\n  showPopup.value = !showPopup.value;\r\n};\r\n\r\nconst handleClickTriggers = (click_type) => {\r\n  switch (click_type) {\r\n    case \"update\": {\r\n      emits(\"update\", props.id);\r\n      break;\r\n    }\r\n    case \"delete\": {\r\n      emits(\"delete\", props.id);\r\n      break;\r\n    }\r\n  }\r\n  showPopup.value = false;\r\n};\r\n\r\nconst closePopupOnClick = (event) => {\r\n  if (!(event.target.closest(\".toggle-button\") !== null)) {\r\n    showPopup.value = false;\r\n  }\r\n};\r\n\r\nonMounted(() => {\r\n  window.addEventListener(\"click\", closePopupOnClick);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n  window.removeEventListener(\"click\", closePopupOnClick);\r\n});\r\n</script>\r\n<template>\r\n  <div class=\"relative\">\r\n    <div class=\"headerText mb-0 py-4\">\r\n      <h1 class=\"text-1xl truncate font-serif md:pb-1 md:text-4xl\">{{ props.title }}</h1>\r\n    </div>\r\n    <a\r\n      class=\"grid grid-cols-[70%_30%] grid-rows-2 border border-solid border-neutral-30 relative flex-1\"\r\n      :class=\"{\r\n        'min-h-52 lg:min-h-80': !shopplingListProducts[0]?.thumbUrl\r\n      }\"\r\n      :href=\"`/shopping-lists/${props.guid}`\"\r\n    >\r\n      <div\r\n        class=\"row-span-2 border-r border-solid border-neutral-30\"\r\n        :class=\"{ 'flex justify-center items-center cursor-pointer': !shopplingListProducts[0]?.thumbUrl }\"\r\n      >\r\n        <FhProductTags v-if=\"props.isAdmin && props.userName && !props.isAdminShoppingList\" :tags=\"[props.userName]\" class=\"absolute top-4 left-4 z-[1]\" />\r\n        <FhImage\r\n          v-if=\"shopplingListProducts[0]?.thumbUrl\"\r\n          :src=\"shopplingListProducts[0]?.thumbUrl\"\r\n          :alt=\"shopplingListProducts[0]?.ProductName\"\r\n          class=\"w-full h-full object-contain\"\r\n        />\r\n        <a v-else class=\"flex items-center justify-center rounded-full border border-solid border-neutral-30 p-3 h-14 w-14\">\r\n          <FhIcon name=\"PlusSign\" />\r\n        </a>\r\n      </div>\r\n      <div>\r\n        <FhImage\r\n          v-if=\"shopplingListProducts[1]?.thumbUrl\"\r\n          :src=\"shopplingListProducts[1]?.thumbUrl\"\r\n          :alt=\"shopplingListProducts[1]?.ProductName\"\r\n          class=\"w-full h-full object-contain\"\r\n        />\r\n      </div>\r\n      <div class=\"border-t border-solid border-neutral-30\">\r\n        <FhImage\r\n          v-if=\"shopplingListProducts[2]?.thumbUrl\"\r\n          :src=\"shopplingListProducts[2]?.thumbUrl\"\r\n          :alt=\"shopplingListProducts[2]?.ProductName\"\r\n          class=\"w-full h-full object-contain\"\r\n        />\r\n      </div>\r\n    </a>\r\n    <div class=\"relative py-3 px-6 text-f-xs-lg\">\r\n      <span>{{ props.totalItems }} {{ props.totalItems === 1 ? \"item\" : \"items\" }}</span>\r\n      <span class=\"mx-f1.5 inline-block text-neutral-50\">&bull;</span>\r\n      <span class=\"text-neutral-50\">Updated: {{ availabilityUpdatedTimeAgo }}</span>\r\n      <span class=\"toggle-button\" @click=\"togglePopup\"><FhIcon name=\"HorizontalEllipse\" class=\"relative top-1 float-right hover:cursor-pointer\" /></span>\r\n    </div>\r\n    <!-- modal popup for edit remove action -->\r\n    <div v-if=\"showPopup\" class=\"absolute right-0 bottom-12 mr-2 bg-white shadow-lg\">\r\n      <div class=\"p-4\">\r\n        <button\r\n          class=\"bg-blue-500 hover:bg-blue-600 hover:text-red-500 block rounded hover:underline\"\r\n          variant=\"link\"\r\n          :aria-label=\"AriaClickText\"\r\n          @click=\"handleClickTriggers('update')\"\r\n        >\r\n          Edit\r\n        </button>\r\n        <button\r\n          class=\"bg-red-500 hover:text-red-500 mt-2 block rounded hover:underline\"\r\n          variant=\"link\"\r\n          :aria-label=\"AriaClickText\"\r\n          @click=\"handleClickTriggers('delete')\"\r\n        >\r\n          Remove\r\n        </button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\"></style>\r\n","<script setup>\r\nimport FhShoppingListCard from \"@/components/FhShoppingListCard.vue\";\r\nimport FhLoader from \"@/components/FhLoader.vue\";\r\nimport { computed } from \"vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  isLoading: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  hasError: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isEmpty: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdminShoppingList: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isGuestAccount: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isSelectedGuestAccount: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isSearchQuery: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\nconst emits = defineEmits([\"delete\", \"update\"]);\r\nconst shoppingLists = computed(() => props.modelValue);\r\nconst isEmptyAccount = computed(() => shoppingLists.value.length == 0);\r\n</script>\r\n\r\n<template>\r\n  <div v-if=\"props.isLoading\" class=\"w-full\"><FhLoader class=\"h-10 w-10\" /></div>\r\n  <div class=\"top-block mt-8 mb-8 grid gap-f5 md:grid-cols-3\">\r\n    <FhShoppingListCard\r\n      v-for=\"item in shoppingLists\"\r\n      :key=\"item.key || item.id\"\r\n      :is-admin=\"props.isAdmin\"\r\n      v-bind=\"item\"\r\n      class=\"scroll-mt-24 flex flex-col\"\r\n      @delete=\"(shoppingListId) => emits('delete', shoppingListId)\"\r\n      @update=\"(shoppingListId) => emits('update', shoppingListId)\"\r\n    ></FhShoppingListCard>\r\n  </div>\r\n  <div v-if=\"props.hasError && !props.isLoading\">\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">Sorry, we are not able to load your Shopping Lists at this time.</p>\r\n  </div>\r\n  <div\r\n    v-if=\"\r\n      (isEmpty && isEmptyAccount && props.isAdmin && !props.isLoading) ||\r\n      (isEmpty && isEmptyAccount && !props.isAdmin && !props.isLoading) ||\r\n      (isEmpty && isEmptyAccount && !props.isAdmin && !props.isLoading)\r\n    \"\r\n  >\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">You have no Shopping Lists.</p>\r\n  </div>\r\n  <div\r\n    v-if=\"\r\n      (isEmpty && isEmptyAccount && props.isAdmin && props.isAdminShoppingList && !isSelectedGuestAccount && isSearchQuery && !props.isLoading) ||\r\n      (!isEmpty && isEmptyAccount && props.isAdmin && props.isAdminShoppingList && !isSelectedGuestAccount && isSearchQuery && !props.isLoading)\r\n    \"\r\n  >\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">You have no Shopping Lists.</p>\r\n  </div>\r\n  <div\r\n    v-if=\"\r\n      (isEmpty &&\r\n        isEmptyAccount &&\r\n        !isGuestAccount &&\r\n        props.isAdmin &&\r\n        !props.isAdminShoppingList &&\r\n        !isSelectedGuestAccount &&\r\n        isSearchQuery &&\r\n        !props.isLoading) ||\r\n      (!isEmpty &&\r\n        isEmptyAccount &&\r\n        !isGuestAccount &&\r\n        props.isAdmin &&\r\n        !props.isAdminShoppingList &&\r\n        !isSelectedGuestAccount &&\r\n        isSearchQuery &&\r\n        !props.isLoading)\r\n    \"\r\n  >\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">You have no Guest Accounts or your Guest Accounts do not have any Shopping Lists.</p>\r\n  </div>\r\n  <div\r\n    v-if=\"\r\n      (isEmpty &&\r\n        isEmptyAccount &&\r\n        isGuestAccount &&\r\n        props.isAdmin &&\r\n        !props.isAdminShoppingList &&\r\n        !isSelectedGuestAccount &&\r\n        isSearchQuery &&\r\n        !props.isLoading) ||\r\n      (!isEmpty &&\r\n        isEmptyAccount &&\r\n        isGuestAccount &&\r\n        props.isAdmin &&\r\n        !props.isAdminShoppingList &&\r\n        !isSelectedGuestAccount &&\r\n        isSearchQuery &&\r\n        !props.isLoading)\r\n    \"\r\n  >\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">Your Guest Accounts do not have any Shopping Lists.</p>\r\n  </div>\r\n  <div v-if=\"!isEmpty && isEmptyAccount && props.isGuestAccount && isSearchQuery && !props.isAdminShoppingList && isSelectedGuestAccount && !props.isLoading\">\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">The selected Guest Account does not have any Shopping Lists.</p>\r\n  </div>\r\n  <div\r\n    v-if=\"\r\n      (!isEmpty && isEmptyAccount && !isSearchQuery) ||\r\n      (!isEmpty && isEmptyAccount && isGuestAccount && props.isAdmin && !props.isAdminShoppingList && !isSelectedGuestAccount && !isSearchQuery)\r\n    \"\r\n  >\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">There are no Shopping Lists with that name.</p>\r\n  </div>\r\n</template>\r\n<style scoped>\r\n@media (min-width: 768px) and (max-width: 1024px) {\r\n  .top-block {\r\n    grid-template-columns: repeat(2, minmax(0, 1fr));\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed, ref, nextTick, watch } from \"vue\";\r\nimport FhShoppingListCardPresenter from \"./FhShoppingListCardPresenter.vue\";\r\nimport { useShoppingListQuery, useCreateShoppingListMutation, useUpdateShoppingListMutation, useDeleteShoppingListMutation } from \"@/api/shoppingListApi\";\r\nimport FhPaginationNav from \"@/components/FhPaginationNav.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhShoppingListForm from \"@/components/FhShoppingListForm.vue\";\r\nimport { usePaginatedList } from \"@/composables\";\r\nimport scrollToTopOf from \"@/util/scrollToTopOf\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\nimport FhPageHeader from \"@/components/FhPageHeader.vue\";\r\nimport FhLoader from \"@/components/FhLoader.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhFilterSelect from \"@/components/FhFilterSelect.vue\";\r\nimport { useGuestAccountQuery } from \"@/api/accountApi\";\r\n\r\nconst props = defineProps({\r\n  perPage: {\r\n    type: Number,\r\n    default: 12\r\n  },\r\n  header: {\r\n    type: String,\r\n    default: \"Shopping Lists\"\r\n  },\r\n  subheader: {\r\n    type: String,\r\n    default: \"Saved\"\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdminShoppingList: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  priceMarkup: {\r\n    type: Object,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nconst showDeleteModal = ref(false);\r\nconst showForm = ref(false);\r\nconst isEditForm = ref(false);\r\nconst shoppingListToModify = ref(null);\r\nconst rootElem = ref(null);\r\nconst showPopup = ref(false);\r\nconst shoppingListToDelete = ref(null);\r\n\r\nconst { isLoading: createMutationLoading, mutate: createShoppingListMutate } = useCreateShoppingListMutation();\r\nconst { isLoading: updateMutationLoading, mutate: updateShoppingListMutate } = useUpdateShoppingListMutation();\r\nconst { isLoading: deleteMutationLoading, mutate: deleteShoppingListMutate } = useDeleteShoppingListMutation();\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst PER_PAGE = ref(props.perPage);\r\nlet { isLoading, isError, data: shoppingListData } = useShoppingListQuery();\r\n\r\nlet { data: guestAccountsData } = useGuestAccountQuery();\r\n\r\nconst selectedGuestAccount = ref(null);\r\n\r\nconst guestAccountOptions = computed(() => {\r\n  if (guestAccountsData.value) {\r\n    return guestAccountsData.value.map((account) => ({\r\n      name: account.name,\r\n      value: account.name\r\n    }));\r\n  } else {\r\n    return [];\r\n  }\r\n});\r\n\r\nconst shoppingLists = computed(() => {\r\n  if (isLoading.value || isError.value) return [];\r\n\r\n  return shoppingListData.value.filter((shoppingList) => shoppingList.isAdminShoppingList == props.isAdminShoppingList);\r\n});\r\nconst totalItem = computed(() => shoppingLists.value.length);\r\nconst markup = ref(props.priceMarkup?.markup);\r\nconst showPriceMarkup = ref(props.priceMarkup?.showPriceMarkup || false);\r\nconst showCADPricing = ref(props.priceMarkup?.showCADPricing || false);\r\nconst searchQuery = ref(\"\");\r\n\r\nconst filteredItems = computed(() => {\r\n  const query = searchQuery.value.toLowerCase().trim();\r\n  if (!query) {\r\n    return shoppingLists.value;\r\n  }\r\n  return shoppingLists.value.filter((item) => {\r\n    return item.title.toLowerCase().includes(query);\r\n  });\r\n});\r\n\r\nconst filteredItemsGuest = computed(() => {\r\n  const searchQueryGuestValue = searchQuery.value.toLowerCase();\r\n  const selectedUserName = selectedGuestAccount.value ? selectedGuestAccount.value.toLowerCase() : null;\r\n\r\n  return shoppingLists.value.filter((item) => {\r\n    const titleMatch = item.title.toLowerCase().includes(searchQueryGuestValue);\r\n    const userNameMatch = selectedUserName ? item.userName.toLowerCase().includes(selectedUserName) : true;\r\n    if (selectedUserName === null) {\r\n      return titleMatch;\r\n    } else {\r\n      return titleMatch && userNameMatch;\r\n    }\r\n  });\r\n});\r\n\r\nconst displayedShoppingLists = props.isAdmin ? filteredItemsGuest : filteredItems;\r\n\r\nlet { page, totalPages, sublist: pageShoppingList } = usePaginatedList(displayedShoppingLists, PER_PAGE.value);\r\n\r\nwatch([searchQuery, selectedGuestAccount], () => {\r\n  ({ page, totalPages, sublist: pageShoppingList } = usePaginatedList(displayedShoppingLists, PER_PAGE.value));\r\n});\r\nconst isShoppingListDataEmpty = computed(() => shoppingListData.value.length === 0);\r\nconst isGuestAccount = computed(() => guestAccountOptions.value.length > 0);\r\nconst isSelectedGuestAccount = computed(() => props.isAdmin && !props.isAdminShoppingList && selectedGuestAccount.value !== null);\r\nconst isSearchQuery = computed(() => searchQuery.value.trim() === \"\");\r\n\r\nconst shoppingListModalTrigger = (val) => {\r\n  showForm.value = val;\r\n  shoppingListToModify.value = null;\r\n  isEditForm.value = false;\r\n};\r\nconst createShoppingList = (shoppingListDetails) => {\r\n  createShoppingListMutate(shoppingListDetails, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Your shopping list has been created.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not create that shopping List.\"),\r\n    onSettled: () => {\r\n      shoppingListModalTrigger(false);\r\n      if (page.value !== 1) {\r\n        page.value = 1;\r\n      }\r\n      rootElem.value.scrollIntoView(true);\r\n    }\r\n  });\r\n};\r\n\r\nconst updateShoppingList = (shoppingListDetails) => {\r\n  updateShoppingListMutate(shoppingListDetails, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Shopping list updated.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not update that Shopping list.\"),\r\n    onSettled: () => {\r\n      shoppingListModalTrigger(false);\r\n      shoppingListToModify.value = null;\r\n      isEditForm.value = false;\r\n      showPopup.value = false;\r\n    }\r\n  });\r\n};\r\n\r\nconst updateClick = (shoppingListId) => {\r\n  shoppingListToModify.value = shoppingListData.value.find((shoppingList) => shoppingList.id == shoppingListId);\r\n  isEditForm.value = true;\r\n  showForm.value = true;\r\n};\r\n\r\nconst handleDeleteShoppingList = (shoppingListId) => {\r\n  shoppingListToDelete.value = shoppingListId;\r\n  showDeleteModal.value = true;\r\n};\r\n\r\nconst closeDeleteModal = () => {\r\n  showDeleteModal.value = false;\r\n  shoppingListToDelete.value = null;\r\n};\r\n\r\nconst removeShoppingList = () => {\r\n  deleteShoppingListMutate(shoppingListToDelete.value, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Shopping List removed\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not remove that shopping list.\"),\r\n    onSettled: () => {\r\n      closeDeleteModal();\r\n    }\r\n  });\r\n};\r\n</script>\r\n\r\n<template>\r\n  <div ref=\"rootElem\">\r\n    <FhPageHeader v-if=\"!props.isAdmin\" :header=\"props?.header\" :subheader=\"props?.subheader\" />\r\n    <div v-if=\"!props.isAdmin\" class=\"button addButton mt-4 self-center text-right md:mt-0\">\r\n      <span class=\"md:mr-6\">{{ totalItem }} Lists </span>\r\n      <hr class=\"sm:block mb-6 mt-6 opacity-20 md:hidden\" />\r\n      <FhButton color=\"primary\" size=\"medium\" class=\"w-full md:w-auto\" @click=\"shoppingListModalTrigger(true)\">\r\n        <FhIcon name=\"PlusSign\" /> Create List\r\n      </FhButton>\r\n    </div>\r\n\r\n    <div\r\n      :class=\"[\r\n        'grid gap-2',\r\n        {\r\n          'grid-cols-1': !props.isAdminShoppingList || props.isAdminShoppingList,\r\n          'md:grid-cols-2': props.isAdminShoppingList && shoppingLists.length > 0,\r\n          'md:grid-cols-1': shoppingLists.length === 0,\r\n          'md:grid-cols-4': !props.isAdminShoppingList,\r\n          'lg:grid-cols-4': !props.isAdminShoppingList\r\n        }\r\n      ]\"\r\n    >\r\n      <div v-if=\"shoppingLists && shoppingLists.length > 0\" class=\"relative max-w-full\">\r\n        <FhInput\r\n          v-model=\"searchQuery\"\r\n          type=\"text\"\r\n          placeholder=\"Search by Shopping List Name\"\r\n          :wrapper-attrs=\"{ class: 'bg-white relative' }\"\r\n          class=\"border-gray-300 pl-10 md:max-w-md\"\r\n        />\r\n        <FhIcon name=\"Search\" class=\"absolute top-[50%] left-3 -translate-y-1/2 transform text-2xl\" style=\"color: grey\" />\r\n      </div>\r\n      <div v-if=\"props.isAdminShoppingList && !isLoading\" class=\"button addButton mt-4 self-center text-right md:mt-0\">\r\n        <FhButton v-if=\"props.isAdminShoppingList\" color=\"primary\" size=\"medium\" class=\"w-full md:w-auto\" @click=\"shoppingListModalTrigger(true)\">\r\n          <FhIcon name=\"PlusSign\" /> Create List\r\n        </FhButton>\r\n      </div>\r\n      <div v-if=\"shoppingLists && shoppingLists.length > 0 && !props.isAdminShoppingList && props.isAdmin\" class=\"relative max-w-full\">\r\n        <FhFilterSelect v-model=\"selectedGuestAccount\" :options=\"guestAccountOptions\"></FhFilterSelect>\r\n      </div>\r\n    </div>\r\n\r\n    <FhShoppingListCardPresenter\r\n      v-if=\"!isLoading\"\r\n      v-model=\"pageShoppingList\"\r\n      :has-error=\"isError\"\r\n      :is-empty=\"isShoppingListDataEmpty\"\r\n      :is-admin=\"props.isAdmin\"\r\n      :is-admin-shopping-list=\"props.isAdminShoppingList\"\r\n      :is-guest-account=\"isGuestAccount\"\r\n      :is-selected-guest-account=\"isSelectedGuestAccount\"\r\n      :is-search-query=\"isSearchQuery\"\r\n      @create=\"createShoppingList\"\r\n      @update=\"updateClick\"\r\n      @delete=\"handleDeleteShoppingList\"\r\n    >\r\n    </FhShoppingListCardPresenter>\r\n  </div>\r\n  <div v-if=\"totalPages > 1\" class=\"mt-f4 mb-f4 md:w-full\">\r\n    <FhPaginationNav v-model:page=\"page\" :total-items=\"shoppingLists.length\" :per-page=\"PER_PAGE\" @page-change=\"nextTick(() => scrollToTopOf(rootElem))\" />\r\n  </div>\r\n  <FhLoader v-if=\"isLoading\" class=\"h-10 w-10\" />\r\n  <FhModal :data=\"{ heading: 'Confirm Shopping List Deletion' }\" :is-open=\"showDeleteModal\" @close=\"closeDeleteModal\">\r\n    <template #body>\r\n      <p>This action will permanently delete this shopping list.</p>\r\n    </template>\r\n    <template #footer=\"{ close }\">\r\n      <FhButton color=\"primary\" :disabled=\"deleteMutationLoading\" :is-loading=\"deleteMutationLoading\" @click=\"removeShoppingList\">Delete</FhButton>\r\n      <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n  <FhShoppingListForm\r\n    v-if=\"showForm\"\r\n    :is-open=\"showForm\"\r\n    :is-creating=\"createMutationLoading || updateMutationLoading\"\r\n    :shopping-details=\"shoppingListToModify\"\r\n    :edit-mode=\"isEditForm\"\r\n    :is-admin=\"props.isAdmin\"\r\n    :markup=\"markup\"\r\n    :show-price-markup=\"showPriceMarkup\"\r\n    :show-c-a-d-pricing=\"showCADPricing\"\r\n    :is-admin-shopping-list=\"props.isAdminShoppingList\"\r\n    @create=\"createShoppingList\"\r\n    @update=\"updateShoppingList\"\r\n    @update:is-open=\"shoppingListModalTrigger\"\r\n  ></FhShoppingListForm>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhProductCard from \"./FhProductCard.vue\";\r\nimport FhLoader from \"@/components/FhLoader.vue\";\r\n\r\nconst props = defineProps({\r\n  products: {\r\n    type: Array,\r\n    default: () => []\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    required: true\r\n  },\r\n  hasError: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isLoading: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isOwner: {\r\n    type: Boolean,\r\n    default: true\r\n  },\r\n  isPreview: {\r\n    type: Boolean,\r\n    default: true\r\n  },\r\n  isCADPrice: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isCustomerGuest: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdminShoppingList: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\nconst products = computed(() => props.products);\r\nconst isEmpty = computed(() => products.value.length === 0);\r\nconst hasError = computed(() => props.hasError);\r\nconst emit = defineEmits([\"itemQuantityUpdate\", \"itemDelete\", \"additemtoCart\"]);\r\n</script>\r\n\r\n<template>\r\n  <div v-if=\"props.isLoading\" class=\"w-full\"><FhLoader class=\"mt-10 h-10 w-10\" /></div>\r\n  <div v-else class=\"grid-action sm:grid-cols-1 my-f5 grid grid-cols-1 gap-x-f2.5 gap-y-f10 md:grid-cols-4 lg:grid-cols-4 portrait:grid-cols-2\">\r\n    <FhProductCard\r\n      v-for=\"product in products\"\r\n      :key=\"product.id\"\r\n      :product=\"product\"\r\n      :is-shopping-list=\"true\"\r\n      :is-admin=\"props.isAdmin\"\r\n      :is-preview=\"props.isPreview\"\r\n      :is-owner=\"props.isOwner\"\r\n      :is-c-a-d-price=\"props.isCADPrice\"\r\n      :is-customer-guest=\"props.isCustomerGuest\"\r\n      :is-admin-shopping-list=\"props.isAdminShoppingList\"\r\n      @update:quantity=\"(quantity) => emit('itemQuantityUpdate', { SkuNumber: product.skuNumber, Quantity: quantity, actualQuantity: product.quantity })\"\r\n      @delete=\"() => emit('itemDelete', { id: product.id })\"\r\n      @addtocart=\"() => emit('additemtoCart', { skuNumber: product.skuNumber, Quantity: product.quantity })\"\r\n    />\r\n  </div>\r\n  <div v-if=\"hasError && !props.isLoading\">\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">Sorry, we are not able to load your shopping list items.</p>\r\n  </div>\r\n  <div v-else-if=\"isEmpty && !props.isLoading\">\r\n    <p class=\"text-body-lg mb-f2 text-neutral-50\">Your shopping list is empty.</p>\r\n  </div>\r\n</template>\r\n<style scoped>\r\n@media (max-width: 767px) {\r\n  .grid-action {\r\n    grid-template-columns: repeat(1, minmax(0, 1fr)) !important;\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { reactive } from \"vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst props = defineProps({\r\n  pathUrl: {\r\n    type: String,\r\n    default: \"\"\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: true\r\n  }\r\n});\r\nconst initialState = {\r\n  pathUrl: \"\"\r\n};\r\n\r\nconst formData = reactive({ ...initialState, pathUrl: props.pathUrl });\r\nconst copyLink = () => {\r\n  navigator.clipboard.writeText(formData.pathUrl);\r\n  notificationStore.notifySuccess(\"Link copied\");\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhModal\r\n    ref=\"modal\"\r\n    :data=\"{ heading: 'Share List', subheading: props.isAdmin ? 'Shared lists display client pricing. Wholesale pricing is not shared.' : '' }\"\r\n    @close=\"reset\"\r\n  >\r\n    <template #activator=\"{ open }\">\r\n      <slot name=\"activator\" :open=\"open\"></slot>\r\n    </template>\r\n    <template #body>\r\n      <FhButton class=\"copy-link mb-2.5 flex w-full flex-col border-neutral-30 md:w-full\" @click=\"copyLink\">\r\n        Copy Link\r\n        <span class=\"text-sm font-normal\">Anyone with the link can view the list</span>\r\n      </FhButton>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n\r\n<style scoped>\r\n.copy-link {\r\n  align-items: start !important;\r\n}\r\n</style>\r\n","export default \"__VITE_ASSET__825b3e52__\"","<script setup>\r\nimport { computed, ref, onMounted, onBeforeUnmount } from \"vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\nimport FhShoppingListProductGrid from \"@/components/FhShoppingListProductGrid.vue\";\r\nimport {\r\n  useShoppingListDetailQuery,\r\n  useDeleteShoppingItemMutation,\r\n  useDeleteShoppingListMutation,\r\n  useUpdateShoppingListMutation,\r\n  useUpdateItemMutation,\r\n  useAddToCartMutation,\r\n  useAddAllToCartMutation\r\n} from \"@/api/shoppingListApi\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhShoppingListForm from \"@/components/FhShoppingListForm.vue\";\r\nimport formatPrice from \"../util/formatPrice.js\";\r\nimport FhShareModal from \"./FhShareModal.vue\";\r\nimport IconNewWindow from \"../assets/icons/icon-new-window.svg\";\r\nconst { isLoading: updateMutationLoading, mutate: updateShoppingListMutate } = useUpdateShoppingListMutation(null, true);\r\nconst { isLoading: deleteMutationLoading, mutate: deleteShoppingListMutate } = useDeleteShoppingListMutation(null, true);\r\nconst { isLoading: removeCartItemLoading, mutate: removeCartItemMutation } = useDeleteShoppingItemMutation(null, true);\r\nconst { isLoading: AddAllToCartLoading, mutate: addAllToCartMutation } = useAddAllToCartMutation();\r\nconst { isLoading: AddToCartLoading, mutate: addToCartMutation } = useAddToCartMutation();\r\nconst { isLoading: updateCartItemLoading, mutate: updateItemMutation } = useUpdateItemMutation(null, true);\r\n\r\nconst props = defineProps({\r\n  title: {\r\n    type: String,\r\n    default: \"\"\r\n  },\r\n  description: {\r\n    type: String,\r\n    default: \"\"\r\n  },\r\n  header: {\r\n    type: String,\r\n    default: \"\"\r\n  },\r\n  guid: {\r\n    type: String,\r\n    default: \"1\"\r\n  },\r\n  isOwner: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isPreview: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  priceMarkup: {\r\n    type: Object,\r\n    default: () => {}\r\n  },\r\n  isCADPrice: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isCustomerGuest: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  userName: {\r\n    type: String,\r\n    default: \"\"\r\n  }\r\n});\r\n\r\nlet { isLoading, data: shoppingListData } = useShoppingListDetailQuery(props.guid, props.isPreview);\r\n\r\nconst notificationStore = useNotificationStore();\r\nconst shoppingLists = computed(() => (isLoading.value ? [] : shoppingListData.value));\r\nconst shoppingListId = computed(() => shoppingListData.value?.id || null);\r\nconst markup = ref(props.priceMarkup?.markup || 0);\r\nconst showPriceMarkup = ref(props.priceMarkup?.showPriceMarkup || false);\r\nconst showCADPricing = ref(props.priceMarkup?.showCADPricing || false);\r\nconst handleItemDelete = (item) => {\r\n  const data = { ShoppingListID: shoppingLists.value.id, id: item.id };\r\n  removeCartItemMutation(data, {\r\n    onSuccess: () => {\r\n      notificationStore.notifySuccess(\"Item removed.\");\r\n    },\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not remove that shopping list.\")\r\n  });\r\n};\r\nconst showDeleteModal = ref(false);\r\nconst showForm = ref(false);\r\nconst isEditForm = ref(false);\r\nconst shoppingListToModify = ref(null);\r\nconst showPopup = ref(false);\r\nconst showSharedList = ref(false);\r\nconst shoppingListSharedLink = ref(null);\r\nconst shouldShowPricing = computed(() => {\r\n  if (shoppingLists.value.length == 0) return false;\r\n  if (shoppingLists.value.totalPrice !== 0) return true;\r\n  return false;\r\n});\r\n\r\nconst handleDeleteShoppingList = () => {\r\n  showDeleteModal.value = true;\r\n};\r\nconst closeDeleteModal = () => {\r\n  showDeleteModal.value = false;\r\n};\r\nconst togglePopup = () => {\r\n  showPopup.value = !showPopup.value;\r\n};\r\n\r\nconst removeShoppingList = () => {\r\n  deleteShoppingListMutate(shoppingListId.value, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Shopping List removed.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not remove that shopping list.\"),\r\n    onSettled: () => {\r\n      closeDeleteModal();\r\n      window.location.href = \"/shopping-lists\";\r\n    }\r\n  });\r\n};\r\n\r\nconst updateClick = () => {\r\n  shoppingListToModify.value = shoppingLists.value;\r\n  isEditForm.value = true;\r\n  showForm.value = true;\r\n};\r\n\r\nconst shoppingListModalTrigger = (val) => {\r\n  showForm.value = val;\r\n  shoppingListToModify.value = null;\r\n  isEditForm.value = false;\r\n};\r\n\r\nconst updateShoppingList = (shoppingListDetails) => {\r\n  updateShoppingListMutate(shoppingListDetails, {\r\n    onSuccess: () => notificationStore.notifySuccess(\"Shopping list updated.\"),\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not update that Shopping list.\"),\r\n    onSettled: () => {\r\n      shoppingListModalTrigger(false);\r\n      shoppingListToModify.value = null;\r\n      isEditForm.value = false;\r\n      showPopup.value = false;\r\n    }\r\n  });\r\n};\r\nconst handleClickTriggers = (click_type) => {\r\n  switch (click_type) {\r\n    case \"update\": {\r\n      updateClick();\r\n      break;\r\n    }\r\n    case \"delete\": {\r\n      handleDeleteShoppingList();\r\n      break;\r\n    }\r\n  }\r\n};\r\n\r\nconst itemKeyTouches = ref({});\r\n\r\nfunction touchItemKey(itemId) {\r\n  itemKeyTouches.value = {\r\n    ...itemKeyTouches.value,\r\n    [itemId]: (itemKeyTouches.value[itemId] || 0) + 1\r\n  };\r\n}\r\nfunction handleItemQuantityUpdate(item) {\r\n  const data = { ShoppingListID: shoppingLists.value.id, SkuNumber: item.SkuNumber, Quantity: item.Quantity };\r\n  updateItemMutation(data, {\r\n    onSuccess: () => {\r\n      notifyItemQuantityUpdateSuccess();\r\n    },\r\n    onError: () => {\r\n      touchItemKey(item.id);\r\n      notifyItemQuantityUpdateError();\r\n    }\r\n  });\r\n}\r\nfunction notifyItemQuantityUpdateSuccess() {\r\n  notificationStore.notifySuccess(` Quantity updated.`);\r\n}\r\n\r\nfunction notifyItemQuantityUpdateError() {\r\n  notificationStore.notifyError(`Sorry, something went wrong and we could not update the quantity of. Please try again.`);\r\n}\r\n\r\nconst closePopup = () => {\r\n  showPopup.value = false;\r\n};\r\nconst sharedList = (val) => {\r\n  showSharedList.value = val;\r\n  const pathArray = window.location.href;\r\n  shoppingListSharedLink.value = pathArray;\r\n};\r\n\r\nfunction viewAsClient() {\r\n  const url = window.location.href;\r\n  const base_url = url.substring(0, url.lastIndexOf(\"/\") + 1);\r\n  const detailPageUrl = `${base_url}preview/${props.guid}`;\r\n  window.open(detailPageUrl, \"_blank\");\r\n}\r\n\r\nfunction notifyAddAllToCartSuccess() {\r\n  notificationStore.notifySuccess(`All Shopping List Items Added To Cart`);\r\n}\r\n\r\nfunction notifyAddAllToCartError() {\r\n  notificationStore.notifyError(`Sorry, something went wrong and we could not add All to Cart Please try again.`);\r\n}\r\nfunction handleAddAllToCart() {\r\n  addAllToCartMutation(props.guid, {\r\n    onSuccess: () => {\r\n      notifyAddAllToCartSuccess();\r\n    },\r\n    onError: () => {\r\n      notifyAddAllToCartError();\r\n    }\r\n  });\r\n}\r\nconst handleAddToCart = (item) => {\r\n  const data = { SkuNumber: item.skuNumber, Quantity: item.Quantity };\r\n  addToCartMutation(data, {\r\n    onSuccess: () => {\r\n      notificationStore.notifySuccess(\"Shopping List Items Added To Cart\");\r\n    },\r\n    onError: () => notificationStore.notifyError(\"Sorry, something went wrong and we could not add to Cart Please try again.\")\r\n  });\r\n};\r\n\r\nconst closePopupOnClick = (event) => {\r\n  if (!(event.target.closest(\".toggle-button\") !== null)) {\r\n    showPopup.value = false;\r\n  }\r\n};\r\n\r\nonMounted(() => {\r\n  window.addEventListener(\"click\", closePopupOnClick);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n  window.removeEventListener(\"click\", closePopupOnClick);\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"grid grid-cols-1 gap-2 md:grid-cols-2 pt-12\">\r\n    <FhHeading class=\"headerText relative mb-0\" :subheading=\"shoppingLists.description\"\r\n      >{{ shoppingLists.title }}\r\n      <span v-if=\"(!props.isPreview && props.isOwner) || (shoppingLists.isAdmin && !shoppingLists.isAdminShoppingList && !props.isPreview)\" class=\"relative\">\r\n        <div class=\"inline-block toggle-button\" @click=\"togglePopup\">\r\n          <FhIcon name=\"HorizontalEllipse\" class=\"ml-4 rounded-full border border-solid border-neutral-30 p-2 hover:cursor-pointer\" />\r\n        </div>\r\n        <div v-if=\"showPopup\" ref=\"popup\" class=\"absolute left-10 mt-[-1.5rem] bg-white shadow-lg\">\r\n          <div class=\"action-button relative p-4\">\r\n            <button\r\n              class=\"bg-blue-500 hover:bg-blue-600 hover:text-red-500 block rounded text-base hover:underline\"\r\n              variant=\"link\"\r\n              :aria-label=\"AriaClickText\"\r\n              @click=\"\r\n                handleClickTriggers('update', shoppingLists.id);\r\n                closePopup();\r\n              \"\r\n            >\r\n              Edit\r\n            </button>\r\n            <button\r\n              class=\"bg-blue-500 hover:bg-blue-600 hover:text-red-500 mt-2 block rounded text-base hover:underline\"\r\n              variant=\"link\"\r\n              :aria-label=\"AriaClickText\"\r\n              @click=\"\r\n                handleClickTriggers('delete', shoppingLists.id);\r\n                closePopup();\r\n              \"\r\n            >\r\n              Remove\r\n            </button>\r\n          </div>\r\n        </div>\r\n      </span>\r\n    </FhHeading>\r\n    <div v-if=\"shoppingLists.isAdmin && !shoppingLists.isAdminShoppingList && !props.isPreview\" class=\"items-top flex w-full bg-limestone py-f3 px-f3\">\r\n      <FhIcon name=\"InformationCircle\" class=\"mr-4\" />\r\n      <div class=\"mx-auto max-w-max\">\r\n        <span class=\"mr-f2 inline-block font-bold\"\r\n          >You're viewing your Guest Account's Shopping List with your Wholesale pricing. To view this Shopping List with your Guest Account's pricing, click\r\n          \"View as Client\".</span\r\n        >\r\n      </div>\r\n    </div>\r\n  </div>\r\n  <FhModal :data=\"{ heading: 'Confirm Shopping List Deletion' }\" :is-open=\"showDeleteModal\" @close=\"closeDeleteModal\">\r\n    <template #body>\r\n      <p>This action will permanently delete this shopping list.</p>\r\n    </template>\r\n    <template #footer=\"{ close }\">\r\n      <FhButton color=\"primary\" :disabled=\"deleteMutationLoading\" :is-loading=\"deleteMutationLoading\" @click=\"removeShoppingList\">Delete</FhButton>\r\n      <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n  <div class=\"top-block grid-col-1 mt-6 block justify-between md:grid md:grid-cols-3 md:border md:border-solid md:border-neutral-30 portrait:grid-cols-2\">\r\n    <div class=\"item-block mb-3 flex w-full items-center justify-between md:mb-0 md:grid-cols-2 md:flex-row md:justify-start\">\r\n      <div class=\"bg-blue-500 border-solid border-neutral-30 p-0 md:border-r md:p-3\">\r\n        <!-- Show this on mobile -->\r\n        <div class=\"w-32 truncate text-f-xs-base text-neutral-50 md:hidden\">\r\n          <span>{{ shoppingLists.totalItems }} Items</span>\r\n        </div>\r\n        <!-- Show this on screens larger than mobile -->\r\n        <div class=\"sm:block hidden w-32 truncate text-f-xs-base text-neutral-50 md:block\">\r\n          <span>Items in List</span>\r\n          <div class=\"mr-f3 text-f-sm-lg\">{{ shoppingLists.totalItems }}</div>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"bg-blue-500 flex items-center justify-end border-solid border-neutral-30 p-0 md:p-3\" :class=\"{ 'md:border-r': shouldShowPricing }\">\r\n        <!-- Show this on mobile -->\r\n        <div v-if=\"shouldShowPricing\" class=\"truncate text-f-xs-base text-neutral-50 md:hidden\">\r\n          <span\r\n            >{{ isOwner && !isPreview ? \"Your Price\" : \"Total\" }} :\r\n            <span\r\n              v-if=\"\r\n                (props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin) || (props.isCADPrice && props.isAdmin && props.isPreview)\r\n              \"\r\n              >CAD</span\r\n            >{{ formatPrice(shoppingLists?.totalPrice || 0) }}</span\r\n          >\r\n        </div>\r\n        <!-- Show this on screens larger than mobile -->\r\n        <div v-if=\"shouldShowPricing\" class=\"sm:block hidden w-32 truncate text-f-xs-base text-neutral-50 md:block\">\r\n          <span>{{ isOwner && !isPreview ? \"Your Price\" : \"Total\" }}</span>\r\n          <div class=\"mr-f3 text-f-sm-lg\">\r\n            <span\r\n              v-if=\"\r\n                (props.isCADPrice && props.isCustomerGuest) || (props.isCADPrice && !props.isAdmin) || (props.isCADPrice && props.isAdmin && props.isPreview)\r\n              \"\r\n              >CAD</span\r\n            >{{ formatPrice(shoppingLists?.totalPrice || 0) }}\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"empty-block md:grid-cols-1 md:flex-row md:justify-end\"></div>\r\n    <div\r\n      v-if=\"(!props.isPreview && shoppingLists.isAdmin) || (!props.isPreview && props.isOwner)\"\r\n      class=\"action-block flex flex-wrap items-center portrait:flex-nowrap\"\r\n      :class=\"!props.isOwner ? (shoppingLists.isAdmin && shoppingLists.isAdminShoppingList ? 'justify-end' : 'justify-between') : 'justify-between'\"\r\n    >\r\n      <div v-if=\"props.isOwner || (shoppingLists.isAdmin && !shoppingLists.isAdminShoppingList)\" class=\"bg-blue-500 mb-3 rounded-md md:mb-0\">\r\n        <FhButton variant=\"text\" class=\"group w-full md:w-auto\" @click=\"viewAsClient\">\r\n          <FhIcon name=\"PasswordReveal\" class=\"relative -top-px\" /> View As Client\r\n          <img\r\n            class=\"visible ml-2 transition-all duration-200 group-hover:visible group-hover:opacity-100 lg:invisible lg:opacity-0\"\r\n            :src=\"IconNewWindow\"\r\n            alt=\"\"\r\n          />\r\n        </FhButton>\r\n      </div>\r\n      <div v-if=\"props.isOwner || (shoppingLists.isAdmin && !shoppingLists.isAdminShoppingList)\" class=\"bg-blue-500 mb-3 rounded-md p-0 md:mb-0 md:p-3\">\r\n        <FhButton variant=\"text\" class=\"w-full md:w-auto\" @click=\"sharedList(true)\"><FhIcon name=\"Share\" class=\"relative -top-px\" /> Share List</FhButton>\r\n      </div>\r\n      <div v-if=\"shoppingLists.isAdmin && shoppingLists.products.length > 0\" class=\"bg-blue-500 w-full rounded-md p-0 md:w-auto md:p-3\">\r\n        <FhButton color=\"primary\" size=\"small\" class=\"w-full md:w-auto\" @click=\"handleAddAllToCart\"> Add All To Cart </FhButton>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <FhShoppingListProductGrid\r\n    :products=\"shoppingLists.products\"\r\n    :is-admin=\"shoppingLists.isAdmin\"\r\n    :is-shopping-list=\"true\"\r\n    :is-loading=\"removeCartItemLoading || AddAllToCartLoading || AddToCartLoading || updateCartItemLoading\"\r\n    :is-preview=\"props.isPreview\"\r\n    :is-owner=\"props.isOwner\"\r\n    :is-c-a-d-price=\"props.isCADPrice\"\r\n    :is-customer-guest=\"props.isCustomerGuest\"\r\n    :is-admin-shopping-list=\"shoppingLists.isAdminShoppingList\"\r\n    @additemto-cart=\"handleAddToCart\"\r\n    @item-delete=\"handleItemDelete\"\r\n    @item-quantity-update=\"handleItemQuantityUpdate\"\r\n  ></FhShoppingListProductGrid>\r\n  <FhShoppingListForm\r\n    v-if=\"showForm\"\r\n    :is-open=\"showForm\"\r\n    :is-creating=\"updateMutationLoading\"\r\n    :shopping-details=\"shoppingListToModify\"\r\n    :edit-mode=\"isEditForm\"\r\n    :is-admin=\"shoppingLists.isAdmin\"\r\n    :markup=\"markup\"\r\n    :show-price-markup=\"showPriceMarkup\"\r\n    :show-c-a-d-pricing=\"showCADPricing\"\r\n    :is-c-a-d-price=\"props.isCADPrice\"\r\n    :is-customer-guest=\"props.isCustomerGuest\"\r\n    :is-admin-shopping-list=\"shoppingLists.isAdminShoppingList\"\r\n    @update=\"updateShoppingList\"\r\n    @update:is-open=\"shoppingListModalTrigger\"\r\n  ></FhShoppingListForm>\r\n  <FhShareModal\r\n    v-if=\"showSharedList\"\r\n    :is-open=\"showSharedList\"\r\n    :is-creating=\"showSharedList\"\r\n    :is-admin=\"shoppingLists.isAdmin\"\r\n    :path-url=\"shoppingListSharedLink\"\r\n    @update:is-open=\"sharedList\"\r\n  ></FhShareModal>\r\n</template>\r\n<style scoped>\r\n@media (min-width: 768px) and (max-width: 1024px) {\r\n  .empty-block {\r\n    display: none;\r\n  }\r\n  .top-block .col-md-3 {\r\n    grid-template-columns: repeat(2, minmax(0, 1fr));\r\n  }\r\n  .top-block {\r\n    border-width: 0px;\r\n    grid-template-columns: repeat(3, minmax(0, 1fr));\r\n  }\r\n  .item-block div {\r\n    border-right-width: 0px;\r\n  }\r\n  .action-block {\r\n    grid-column: span 2 / span 2;\r\n  }\r\n}\r\n/* Styles for iPhone */\r\n@media (max-width: 767px) {\r\n  .action-block {\r\n    flex-wrap: wrap !important;\r\n  }\r\n}\r\n.action-button {\r\n  font-family: \"Universal Sans\";\r\n}\r\n</style>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhShowroomCard from \"./FhShowroomCards/FhShowroomCard.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { heading, cards } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div class=\"mb-16 flex flex-col text-neutral-70 md:pb-16\">\r\n      <h2 class=\"mb-f8 font-serif text-f-2xl-5xl\">{{ heading }}</h2>\r\n      <div class=\"grid grid-cols-[1fr] gap-y-[1rem] md:grid-cols-[repeat(2,1fr)] md:gap-y-[2.5rem] md:gap-x-[1.5rem]\">\r\n        <FhShowroomCard v-for=\"(card, i) in cards\" :key=\"`card-${i}`\" :card=\"card\"></FhShowroomCard>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n<style lang=\"pcss\" scoped>\r\n.text-white * {\r\n  color: white;\r\n}\r\n</style>\r\n","import axiosClient from \"./axiosClient\";\r\nimport { useMutation } from \"@tanstack/vue-query\";\r\n\r\nexport function useSubmitContactSubscriptionMutation(options) {\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (data) => axiosClient.post(\"/contact-subscription\", data)\r\n  });\r\n}\r\n","<script setup>\r\nimport { reactive, ref } from \"vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhCheckbox from \"@/components/FhCheckbox.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, required, maxLength, sameAs, email } from \"@vuelidate/validators\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore.js\";\r\nimport { useSubmitContactSubscriptionMutation } from \"@/api/contactSubscriptionApi.js\";\r\nconst props = defineProps({\r\n  contactDetails: {\r\n    type: Object,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nconst initialState = {\r\n  firstName: null,\r\n  lastName: null,\r\n  email: null,\r\n  terms: false\r\n};\r\n\r\nconst modal = ref(null);\r\n\r\nconst toggleModal = () => {\r\n  modal.value.close();\r\n};\r\n\r\nconst formData = reactive({ ...initialState, ...props.contactDetails });\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    firstName: {\r\n      required: helpers.withMessage(\"Please enter a first name.\", required),\r\n      maxLength: helpers.withMessage(\"Please keep your entry to no more than 15 characters.\", maxLength(15))\r\n    },\r\n    lastName: {\r\n      required: helpers.withMessage(\"Please enter a last name\", required),\r\n      maxLength: helpers.withMessage(\"Please keep your entry to no more than 15 characters.\", maxLength(15))\r\n    },\r\n    email: {\r\n      required: helpers.withMessage(\"Please enter an email address.\", required),\r\n      email: helpers.withMessage(\"Please enter a valid email address.\", email)\r\n    },\r\n    terms: { sameAs: sameAs(true) }\r\n  },\r\n  formData\r\n);\r\n\r\nconst notificationStore = useNotificationStore();\r\n\r\nconst { mutate: submitContactSubscriptionMutation, isLoading } = useSubmitContactSubscriptionMutation();\r\n\r\nasync function createContact() {\r\n  if (await vuelidate.value.$validate()) {\r\n    let data = { ...formData };\r\n    submitContactSubscriptionMutation(data, {\r\n      onSuccess: handleSaveSuccess,\r\n      onError: handleSaveError,\r\n      onSettled: () => {\r\n        toggleModal();\r\n      }\r\n    });\r\n  }\r\n}\r\n\r\nfunction handleSaveSuccess() {\r\n  vuelidate.value.$reset();\r\n  notificationStore.notifySuccess(`Thank you for signing up!`, {\r\n    linkText: \"Follow us on Instagram\",\r\n    linkUrl: \"https://www.instagram.com/fourhandsfurniture\",\r\n    linkTarget: \"_blank\"\r\n  });\r\n}\r\n\r\nfunction handleSaveError() {\r\n  notificationStore.notifyError(\"Sorry, something went wrong. Please try again.\");\r\n}\r\n\r\nconst reset = () => {\r\n  vuelidate.value.$reset();\r\n  formData.firstName = null;\r\n  formData.lastName = null;\r\n  formData.email = null;\r\n  formData.terms = false;\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhModal ref=\"modal\" :data=\"{ heading: 'Email Signup', subheading: `Don’t miss out on new arrivals, Market news and exclusive savings.` }\" @close=\"reset\">\r\n    <template #activator=\"{ open }\">\r\n      <slot name=\"activator\" :open=\"open\"></slot>\r\n    </template>\r\n    <template #body>\r\n      <form id=\"contactCreateForm\">\r\n        <fieldset class=\"mb-f8\">\r\n          <div class=\"flex flex-col gap-f3\">\r\n            <div class=\"flex flex-col gap-f3 md:flex-row\">\r\n              <FhInput v-model=\"formData.firstName\" label=\"First Name\" required :vuelidate=\"vuelidate.firstName\" />\r\n              <FhInput v-model=\"formData.lastName\" label=\"Last Name\" required :vuelidate=\"vuelidate.lastName\" />\r\n            </div>\r\n            <FhInput v-model=\"formData.email\" label=\"Email Address\" required :vuelidate=\"vuelidate.email\" />\r\n            <div>\r\n              <FhCheckbox v-model=\"formData.terms\" required :vuelidate=\"vuelidate.terms\" class=\"lg:col-span-2\">\r\n                <div>Yes, please send me the latest collections, news and promotions from Four Hands.</div>\r\n              </FhCheckbox>\r\n            </div>\r\n          </div>\r\n        </fieldset>\r\n      </form>\r\n    </template>\r\n    <template #footer=\"{ close }\">\r\n      <FhButton\r\n        type=\"submit\"\r\n        form=\"createContactForm\"\r\n        color=\"primary\"\r\n        :disabled=\"vuelidate.$invalid || isLoading\"\r\n        :is-loading=\"isLoading\"\r\n        @click.stop.prevent=\"createContact\"\r\n        >{{ \"Subscribe\" }}</FhButton\r\n      >\r\n      <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n","<script setup>\r\nimport { SUPPORT_HOURS_OF_OPERATION, SUPPORT_PHONE_NUMBER } from \"../constants/strings\";\r\nimport Logo from \"../assets/four-hands-logo.svg\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\n\r\ndefineProps({\r\n  social: {\r\n    type: Object,\r\n    default: null\r\n  },\r\n  legal: {\r\n    type: Object,\r\n    default: null\r\n  },\r\n  artStudioUrl: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  simpleMode: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst currentYear = new Date().getFullYear();\r\n</script>\r\n\r\n<template>\r\n  <!-- Footer: Bottom Section -->\r\n  <div class=\"py-f5\" :class=\"{ 'lg:border-t lg:border-neutral-30': !simpleMode }\">\r\n    <div class=\"pg-container flex flex-col gap-4 lg:flex-row lg:flex-wrap lg:items-center lg:gap-8\">\r\n      <div class=\"flex flex-col gap-1 lg:flex-row lg:items-center\">\r\n        <img :src=\"Logo\" alt=\"Four Hands Logo\" class=\"mr-f3 w-f5\" />\r\n        <div class=\"text-body-sm mt-1 text-neutral-opacity-60\">&copy; {{ currentYear }} Four Hands · All Rights Reserved</div>\r\n      </div>\r\n      <div class=\"md:flex-grow\">\r\n        <ul v-if=\"!simpleMode\" class=\"text-body-xs flex space-x-f2\">\r\n          <li v-for=\"(link, linkIndex) in social\" :key=\"linkIndex\" class=\"text-xl\">\r\n            <a :href=\"link.ctaLink\" target=\"_blank\"><FhIcon :name=\"link.title\"></FhIcon></a>\r\n          </li>\r\n        </ul>\r\n        <span v-if=\"simpleMode\" class=\"text-body-sm\">{{ SUPPORT_PHONE_NUMBER }} &#8226; {{ SUPPORT_HOURS_OF_OPERATION }}</span>\r\n      </div>\r\n      <div>\r\n        <ul class=\"text-body-xs flex flex-col gap-2 text-neutral-40 lg:flex-row lg:gap-5\">\r\n          <li v-for=\"(link, Index) in legal\" :key=\"Index\" class=\"text-body-sm text-neutral-opacity-60\">\r\n            <a :href=\"link.ctaLink\">{{ link.title }}</a>\r\n          </li>\r\n        </ul>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\nimport { CART } from \"../constants/routes\";\r\n\r\nconst props = defineProps({\r\n  totalItemsCount: {\r\n    type: Number,\r\n    default: 0,\r\n    validator: (val) => val >= 0\r\n  },\r\n  iconWrapperClass: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst isEmpty = computed(() => props.totalItemsCount === 0);\r\nconst title = computed(() => (isEmpty.value ? \"Cart\" : `Cart: ${props.totalItemsCount} ${props.totalItemsCount === 1 ? \"item\" : \"items\"}`));\r\n</script>\r\n\r\n<template>\r\n  <a class=\"inline-block\" :href=\"CART\" :aria-label=\"title\" :title=\"title\">\r\n    <span :class=\"props.iconWrapperClass\">\r\n      <FhIcon v-if=\"isEmpty\" name=\"ShoppingCart\" class=\"text-2xl\" />\r\n      <span\r\n        v-else\r\n        class=\"flex h-[1.5rem] min-w-[1.5rem] items-center justify-center bg-neutral-70 px-1 font-bold text-white\"\r\n        :class=\"{\r\n          'text-base': props.totalItemsCount < 10,\r\n          'text-sm': props.totalItemsCount >= 10 && props.totalItemsCount < 100,\r\n          'text-xs': props.totalItemsCount >= 100\r\n        }\"\r\n      >\r\n        {{ props.totalItemsCount }}\r\n      </span>\r\n    </span>\r\n  </a>\r\n</template>\r\n\r\n<style scoped></style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { useCartQuery } from \"../api/cartApi\";\r\nimport FhNavCartPresenter from \"./FhNavCartPresenter.vue\";\r\n\r\nconst props = defineProps({\r\n  iconWrapperClass: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst { data: cart } = useCartQuery();\r\n\r\nconst totalItemsCount = computed(() => cart.value?.totalItemsCount || 0);\r\n</script>\r\n\r\n<template>\r\n  <FhNavCartPresenter :total-items-count=\"totalItemsCount\" :icon-wrapper-class=\"props.iconWrapperClass\" />\r\n</template>\r\n","<template>\r\n  <svg width=\"376\" height=\"33\" viewBox=\"0 0 376 33\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path\r\n      d=\"M0 0.524333H27.9789L29.7878 6.644L29.479 6.85911C28.9487 6.46922 28.2727 6.12822 27.4485 5.83367C26.5655 5.52571 25.6582 5.28944 24.7358 5.12722C23.7019 4.94323 22.653 4.85281 21.6023 4.85711H6.88454V14.4418H24.8018L25.0221 14.8378L21.8886 19.8037H21.4915C21.1964 19.558 20.7993 19.349 20.3 19.1779C19.1413 18.7941 17.9263 18.5992 16.7034 18.601H6.88454V23.0853C6.88454 23.5229 6.89077 24.1694 6.90695 25.025C6.92065 25.8818 6.97916 26.7667 7.08373 27.6809C7.18582 28.5963 7.34019 29.4604 7.54561 30.2732C7.75227 31.086 8.05976 31.6678 8.47309 32.0149V32.4097H0V32.0149C0.412076 31.6653 0.73576 31.0677 0.971054 30.2194C1.20635 29.3737 1.37442 28.4692 1.47775 27.5061C1.58108 26.5442 1.63959 25.6251 1.65453 24.7488C1.66947 23.8749 1.67694 23.2173 1.67694 22.7798V6.93733C1.67694 6.49856 1.66947 6.01089 1.65453 5.46944C1.6385 4.91866 1.5794 4.3699 1.47775 3.828C1.37442 3.27433 1.20635 2.74267 0.971054 2.23178C0.73576 1.72089 0.412076 1.29067 0 0.939889V0.524333ZM52.9474 4.28878C51.0937 4.28878 49.3433 4.55889 47.6963 5.09911C46.048 5.63933 44.5989 6.42644 43.3489 7.46167C42.0866 8.51308 41.0704 9.81966 40.3698 11.2921C39.634 12.8089 39.2668 14.5457 39.2668 16.5C39.2668 18.4556 39.634 20.1911 40.3698 21.7079C41.0701 23.1805 42.0863 24.4872 43.3489 25.5383C44.5989 26.5736 46.048 27.3607 47.6963 27.9009C49.3433 28.4411 51.0937 28.71 52.9474 28.71C54.8012 28.71 56.5578 28.4411 58.221 27.9009C59.883 27.3607 61.3321 26.5736 62.5671 25.5383C63.8034 24.5019 64.7881 23.2259 65.5239 21.7079C66.2596 20.1911 66.6281 18.4556 66.6281 16.5C66.6281 14.5457 66.2596 12.8089 65.5239 11.2921C64.7881 9.77533 63.8034 8.49811 62.5671 7.46167C61.3321 6.42644 59.883 5.63933 58.221 5.09911C56.5189 4.55276 54.7382 4.27915 52.9474 4.28878ZM52.9474 0C55.4772 0 57.8961 0.378889 60.2067 1.13789C62.5161 1.89689 64.5453 2.98344 66.297 4.39756C68.0502 5.81801 69.4785 7.58551 70.4887 9.58467C71.5332 11.627 72.0561 13.9333 72.0561 16.5C72.0561 19.0667 71.5332 21.373 70.4887 23.4153C69.4794 25.4147 68.0509 27.182 66.297 28.6012C64.5453 30.0166 62.5161 31.1031 60.2067 31.8621C57.8961 32.6199 55.4772 33 52.9474 33C50.4165 33 48.005 32.6199 45.7093 31.8621C43.4149 31.1031 41.3919 30.0166 39.6415 28.6012C37.8871 27.1824 36.4586 25.415 35.4498 23.4153C34.404 21.373 33.8824 19.0667 33.8824 16.5C33.8824 13.9333 34.404 11.627 35.4498 9.58467C36.4595 7.58525 37.8879 5.81767 39.6415 4.39756C41.3919 2.98344 43.4149 1.89689 45.7093 1.13789C48.005 0.377667 50.4165 0 52.9474 0ZM85.0645 18.7318C85.0645 20.1312 85.2263 21.439 85.55 22.649C85.8494 23.8136 86.4239 24.8926 87.227 25.7987C88.0212 26.6897 89.0944 27.3827 90.4489 27.8777C91.8009 28.3751 93.4928 28.6232 95.5233 28.6232C97.5824 28.6232 99.2892 28.3751 100.642 27.8777C101.996 27.3827 103.076 26.6897 103.886 25.7987C104.702 24.8953 105.292 23.8165 105.607 22.649C105.945 21.439 106.115 20.1312 106.115 18.7318V6.95811C106.115 6.51933 106.107 6.03167 106.093 5.49144C106.076 4.93999 106.009 4.3911 105.894 3.85122C105.778 3.30344 105.608 2.76802 105.387 2.25256C105.171 1.74771 104.829 1.30402 104.393 0.961889V0.568333H113.043V0.961889C112.627 1.31662 112.295 1.75735 112.072 2.25256C111.836 2.76344 111.668 3.29633 111.564 3.85122C111.461 4.40489 111.403 4.95244 111.388 5.49144C111.374 6.03167 111.366 6.51933 111.366 6.95811V19.5629C111.366 21.6627 111.005 23.5388 110.285 25.1863C109.592 26.7976 108.527 28.2287 107.173 29.3663C105.82 30.5042 104.173 31.3732 102.231 31.9697C100.289 32.5686 98.0829 32.8692 95.6116 32.8692C93.1404 32.8692 90.9269 32.5686 88.9699 31.9697C87.0128 31.3732 85.3583 30.5042 84.0051 29.3663C82.6519 28.2287 81.5868 26.7976 80.8939 25.1863C80.1731 23.5388 79.8133 21.6627 79.8133 19.5629V6.95811C79.8133 6.51933 79.8059 6.03167 79.7909 5.49144C79.775 4.94106 79.7159 4.39269 79.6141 3.85122C79.5125 3.29983 79.3419 2.76287 79.1062 2.25256C78.8829 1.75759 78.5514 1.31694 78.1351 0.961889V0.568333H86.785V0.961889C86.3443 1.31144 86.0131 1.74167 85.7928 2.25256C85.3575 3.28064 85.1182 4.37849 85.0869 5.49144C85.072 6.03167 85.0645 6.51933 85.0645 6.95811V18.7318ZM202.28 14.399C202.28 14.399 202.272 6.03289 202.258 5.49267C202.241 4.94093 202.175 4.39173 202.061 3.85122C201.942 3.30165 201.765 2.76611 201.53 2.25378C201.3 1.75069 200.952 1.30834 200.514 0.963111V0.569556H209.209V0.961889C208.796 1.31144 208.472 1.74167 208.237 2.25256C208.001 2.76344 207.833 3.29633 207.73 3.85C207.627 4.40367 207.567 4.95122 207.553 5.49144C207.537 6.03167 207.537 23.8957 207.553 24.7708C207.567 25.6459 207.627 26.565 207.73 27.5269C207.833 28.49 208.001 29.3944 208.237 30.2414C208.472 31.0884 208.796 31.6861 209.209 32.0369V32.4292H200.514V32.0369C200.955 31.6861 201.295 31.0884 201.53 30.2414C201.764 29.3944 201.94 28.49 202.061 27.5269C202.173 26.612 202.239 25.6921 202.258 24.7708C202.272 23.8957 202.28 18.7318 202.28 18.7318H181.185C181.185 18.7318 181.193 23.8957 181.209 24.7708C181.223 25.6459 181.289 26.565 181.408 27.5269C181.524 28.49 181.695 29.3944 181.914 30.2414C182.136 31.0884 182.465 31.6861 182.908 32.0369V32.4292H174.215V32.0369C174.656 31.6861 174.993 31.0884 175.228 30.2414C175.462 29.3944 175.639 28.49 175.759 27.5269C175.877 26.565 175.94 25.6459 175.958 24.7708C175.972 23.8957 175.972 6.03167 175.958 5.49144C175.94 4.93963 175.874 4.39037 175.759 3.85C175.641 3.30028 175.463 2.76468 175.228 2.25256C174.999 1.74984 174.652 1.30756 174.215 0.961889V0.569556H182.908V0.961889C182.466 1.31144 182.136 1.74167 181.914 2.25256C181.692 2.7675 181.523 3.30255 181.408 3.85C181.291 4.38998 181.224 4.93945 181.209 5.49144C181.193 6.03167 181.185 14.3978 181.185 14.3978L202.28 14.399ZM291.073 24.772C291.101 25.6471 291.169 26.5662 291.272 27.5281C291.374 28.4912 291.542 29.3957 291.779 30.2414C292.015 31.0884 292.338 31.6861 292.75 32.0369V32.4304H284.01V32.0369C284.01 31.0151 283.695 30.0447 283.062 29.1268C282.365 28.1234 281.621 27.1519 280.833 26.2154L264.287 6.95811H264.111C264.111 6.95811 264.117 23.8957 264.132 24.772C264.147 25.6471 264.206 26.5662 264.31 27.5281C264.411 28.4912 264.575 29.3957 264.796 30.2414C265.016 31.0884 265.332 31.6861 265.744 32.0369V32.4304H257.536V32.0369C257.919 31.6861 258.214 31.0884 258.419 30.2414C258.625 29.3957 258.771 28.4912 258.86 27.5281C258.947 26.5662 258.998 25.6471 259.014 24.772C259.029 23.8957 259.029 6.03167 259.014 5.49267C258.998 4.95244 258.947 4.40489 258.86 3.85122C258.773 3.30402 258.626 2.76787 258.419 2.25256C258.227 1.76274 257.926 1.32161 257.536 0.961889V0.568333H267.024V0.961889C267.024 2.04233 267.334 3.01889 267.95 3.894C268.711 4.95102 269.521 5.97345 270.377 6.95811L285.778 24.7268H285.957C285.957 24.7268 285.949 6.03167 285.932 5.49267C285.917 4.9419 285.858 4.39312 285.757 3.85122C285.655 3.30225 285.491 2.76608 285.269 2.25256C285.064 1.76437 284.756 1.32444 284.365 0.961889V0.568333H292.661V0.961889C292.248 1.31452 291.923 1.75623 291.711 2.25256C291.491 2.76344 291.329 3.29756 291.226 3.85122C291.123 4.40489 291.064 4.95244 291.049 5.49267C291.037 6.03167 291.045 23.8957 291.073 24.772ZM309.325 28.2284H321.595C322.996 28.2303 324.386 27.9857 325.698 27.5061C327.021 27.0258 328.206 26.3034 329.25 25.3403C330.295 24.3772 331.126 23.1599 331.745 21.6859C332.363 20.2131 332.671 18.4837 332.671 16.5C332.671 14.5163 332.348 12.7869 331.7 11.3129C331.053 9.84011 330.191 8.62156 329.12 7.65845C328.064 6.70688 326.827 5.97069 325.479 5.49267C324.15 5.01547 322.746 4.77099 321.331 4.77033H309.325V28.2284ZM304.097 5.49144C304.081 4.94062 304.022 4.39184 303.919 3.85C303.817 3.29633 303.647 2.76344 303.413 2.25256C303.179 1.74167 302.854 1.31144 302.443 0.961889V0.569556H322.214C324.419 0.569556 326.48 0.933778 328.392 1.66222C330.258 2.36274 331.949 3.44472 333.356 4.83633C334.753 6.22233 335.85 7.89189 336.644 9.84744C337.438 11.803 337.837 14.0054 337.837 16.456C337.837 18.9078 337.446 21.1176 336.666 23.0866C335.887 25.0568 334.813 26.7349 333.444 28.1197C332.074 29.5083 330.419 30.597 328.59 31.3146C326.722 32.0589 324.684 32.4304 322.48 32.4304H302.444V32.0381C302.855 31.6873 303.18 31.0897 303.414 30.2414C303.648 29.3957 303.819 28.4912 303.921 27.5281C304.025 26.5662 304.082 25.6471 304.099 24.772C304.112 23.8969 304.112 6.03289 304.097 5.49144ZM250.942 30.2414C250.397 29.3511 249.876 28.4463 249.381 27.5281C248.862 26.5662 248.385 25.6459 247.954 24.772C247.522 23.8957 247.202 23.2393 246.996 22.8018L238.658 5.20789C238.257 4.39059 237.929 3.54084 237.677 2.66811C237.469 1.91033 237.484 1.34078 237.722 0.961889V0.568333H228.228V0.961889C228.554 1.31144 228.738 1.74167 228.783 2.25256C228.828 2.76344 228.783 3.289 228.651 3.828C228.517 4.36944 228.339 4.91578 228.116 5.46944C227.892 6.02433 218.567 26.5662 218.062 27.5281C217.575 28.4592 217.039 29.3649 216.457 30.2414C215.893 31.0884 215.373 31.6861 214.897 32.0369V32.4292H223.278V32.0369C223.009 31.6861 222.891 31.2706 222.922 30.789C222.949 30.3087 223.04 29.8051 223.188 29.2783C223.339 28.754 223.53 28.2223 223.77 27.6821C224.004 27.1419 226.8 20.2632 226.8 20.2632L233.177 5.46944H233.356L240.041 20.2632C240.041 20.2632 234.194 20.2461 233.508 20.1936C232.821 20.1386 232.28 19.9894 231.882 19.7401H231.395L229.663 24.7366L230.043 25.003C230.547 24.7891 231.16 24.6302 231.882 24.5251C232.604 24.4176 233.381 24.3638 234.21 24.3638L241.958 24.376C241.958 24.376 243.904 28.7088 244.055 29.2356C244.203 29.7599 244.277 30.2696 244.277 30.7682C244.277 31.2644 244.145 31.6861 243.877 32.0369V32.4292H252.349V32.0369C251.93 31.6861 251.461 31.0884 250.942 30.2414ZM132.314 14.5017H132.626C133.042 14.7351 133.511 14.8744 134.032 14.9184C134.552 14.9624 135.081 14.9844 135.617 14.9844H141.331C143.354 14.9844 144.857 14.4956 145.839 13.5166C146.82 12.5376 147.313 11.3324 147.313 9.9C147.313 8.26467 146.769 6.99478 145.682 6.08911C144.596 5.18344 143.206 4.73 141.509 4.73H127.226V22.7847C127.226 23.3114 127.232 24.0264 127.248 24.9321C127.262 25.8366 127.322 26.7569 127.426 27.6931C127.53 28.6281 127.686 29.4971 127.894 30.3001C128.102 31.1043 128.416 31.68 128.832 32.032V32.4256H120.172V32.032C120.589 31.68 120.916 31.0823 121.154 30.2353C121.392 29.3883 121.564 28.4814 121.668 27.5171C121.772 26.5528 121.831 25.6337 121.846 24.7561C121.861 23.881 121.869 23.2222 121.869 22.7847V6.92145C121.869 6.48389 121.861 5.99378 121.846 5.45356C121.83 4.90192 121.771 4.35233 121.668 3.80967C121.564 3.256 121.392 2.72067 121.154 2.20978C120.916 1.69889 120.589 1.26867 120.172 0.917889V0.523111H141.152C142.849 0.523111 144.402 0.749222 145.816 1.20267C147.231 1.65489 148.435 2.29167 149.431 3.10811C150.426 3.92324 151.22 4.94964 151.752 6.10989C152.303 7.293 152.578 8.60078 152.578 10.032C152.578 12.5156 151.79 14.5017 150.214 15.9928C148.635 17.4814 146.494 18.4018 143.785 18.7526L143.741 18.8846L146.642 23.0474C147.268 23.9531 147.929 24.8441 148.629 25.7204C149.327 26.598 150.042 27.4303 150.771 28.2187C151.501 29.007 152.229 29.7232 152.959 30.3649C153.617 30.9583 154.343 31.4735 155.124 31.9V32.2496C154.053 32.7458 152.892 32.9951 151.642 32.9951C150.724 33.0052 149.811 32.8639 148.941 32.5771C148.124 32.3015 147.356 31.9027 146.664 31.3952C145.939 30.8596 145.28 30.2422 144.701 29.5558C144.055 28.7921 143.452 27.9949 142.893 27.1676L137.448 19.1913H129.591L129.412 18.8846L132.314 14.5017ZM375.48 19.7316C375.107 18.8212 374.535 18.0028 373.803 17.3348C373.047 16.6572 372.179 16.1108 371.236 15.719C370.214 15.2895 369.155 14.9489 368.073 14.7009C366.95 14.4406 365.773 14.234 364.542 14.0873C363.311 13.9407 362.107 13.8441 360.932 13.8013C359.563 13.7545 358.196 13.6534 356.836 13.4982C355.546 13.3479 354.422 13.1169 353.462 12.8003C352.502 12.4862 351.753 12.0536 351.215 11.5036C350.676 10.9536 350.423 10.2227 350.457 9.30967C350.515 7.80878 351.4 6.58044 353.115 5.62589C354.829 4.67133 357.434 4.25822 360.933 4.38533C363.46 4.477 365.736 4.851 367.758 5.50733C368.663 5.7987 369.536 6.18168 370.361 6.65011C371.883 7.53133 371.923 8.63256 372.06 9.27056L372.453 9.449L375.65 4.00033L373.982 3.17289C373.187 2.77933 372.18 2.37111 370.96 1.94578C369.571 1.47635 368.155 1.08902 366.719 0.785889C365.113 0.435111 363.339 0.223667 361.4 0.154C359.196 0.0733334 357.128 0.218778 355.201 0.589111C353.274 0.959445 351.575 1.54978 350.102 2.36133C348.625 3.17411 347.455 4.202 346.584 5.44622C345.713 6.69045 345.245 8.162 345.182 9.86089C345.108 11.7663 345.561 13.2794 346.534 14.399C347.509 15.5198 348.786 16.3814 350.367 16.9816C351.948 17.5817 353.721 18.0046 355.684 18.2527C357.613 18.4973 359.552 18.6555 361.495 18.7269C362.669 18.7709 363.809 18.8772 364.904 19.0508C366.002 19.2243 366.978 19.4883 367.833 19.8452C368.69 20.2033 369.364 20.6702 369.857 21.2496C370.35 21.8313 370.579 22.5793 370.545 23.4948C370.518 24.2437 370.285 24.9714 369.87 25.6007C369.422 26.2949 368.602 26.8962 367.821 27.2641C366.958 27.6711 366.124 28.0243 364.864 28.2578C363.603 28.4937 362.12 28.5792 360.417 28.5181C357.447 28.4106 354.758 27.9706 352.35 27.0637C351.358 26.6969 350.401 26.2437 349.492 25.7094C347.785 24.651 347.521 23.529 347.416 22.8837L347.003 22.6514L346.481 23.6023L344.007 28.1661C344.696 28.6 345.466 29.073 346.315 29.5851C347.164 30.0972 348.183 30.5788 349.373 31.0322C350.562 31.4844 351.947 31.8768 353.524 32.2104C355.101 32.5453 356.964 32.7531 359.108 32.8313C364.43 33.0244 368.543 32.2764 371.448 30.5886C374.352 28.9007 375.866 26.3988 375.992 23.0804C376.041 21.7886 375.87 20.6727 375.48 19.7316Z\"\r\n      fill=\"#212121\"\r\n    />\r\n  </svg>\r\n</template>\r\n","<script setup>\r\nimport { computed, ref, reactive } from \"vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport IconFhLogo from \"@/components/icons/IconFhLogo.vue\";\r\nimport FhAccordion from \"@/components/FhAccordion.vue\";\r\nimport UpRightArrow from \"./icons/IconUpRightArrow.vue\";\r\nconst props = defineProps({\r\n  isAuthenticated: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  navItems: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isAccountMenu: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emits = defineEmits([\"close\", \"search\"]);\r\n\r\nconst mainMenuItems = computed(() => ({\r\n  mainMenu: props.navItems.mainMenu,\r\n  moreMenu: props.navItems.moreMenu,\r\n  accountMenu: props.navItems.accountMenu?.childItems\r\n}));\r\nconst menuChildItems = ref(null);\r\nconst menuStack = reactive([]);\r\nconst sectionHeadline = ref(null);\r\nconst searchText = ref(\"\");\r\nconst showAllLink = ref(false);\r\nconst isNotCategoryLinks = ref(false);\r\n\r\nconst menuItemClick = (event, menuItemClicked) => {\r\n  event.preventDefault();\r\n  const menuItemKey = menuItemClicked;\r\n  let nextMenuItem = null;\r\n  if (menuChildItems.value) {\r\n    nextMenuItem = menuChildItems?.value?.childItems[menuItemKey];\r\n  } else {\r\n    nextMenuItem = mainMenuItems?.value?.mainMenu[menuItemKey];\r\n  }\r\n\r\n  if (nextMenuItem?.childItems) {\r\n    menuStack.push(nextMenuItem);\r\n  }\r\n\r\n  // Filter nextMemuItem.childItems to get to the lowest level\r\n  const hasChildren = nextMenuItem?.childItems?.filter((childItem) => {\r\n    if (childItem?.childItems) return true;\r\n  });\r\n\r\n  if (menuStack[0].name.toLowerCase() === \"discover\" || menuStack[0].name.toLowerCase() === \"products\") {\r\n    isNotCategoryLinks.value = true;\r\n  } else {\r\n    isNotCategoryLinks.value = false;\r\n  }\r\n\r\n  if (hasChildren?.length === 0 && !isNotCategoryLinks.value) {\r\n    showAllLink.value = true;\r\n  } else {\r\n    showAllLink.value = false;\r\n  }\r\n  showMenuContent(nextMenuItem);\r\n};\r\n\r\nconst goBack = (event) => {\r\n  event.preventDefault();\r\n  menuStack.pop();\r\n  const sectionToGoTo = menuStack[menuStack.length - 1];\r\n  if (sectionToGoTo) {\r\n    showMenuContent(sectionToGoTo);\r\n  } else {\r\n    menuChildItems.value = null;\r\n    sectionHeadline.value = null;\r\n  }\r\n\r\n  // reset showAllLink flag when reversing back through the menuStack\r\n  showAllLink.value = false;\r\n};\r\n\r\nconst onSearch = () => {\r\n  emits(\"search\", searchText.value);\r\n};\r\n\r\nconst close = (event) => {\r\n  event.preventDefault();\r\n  emits(\"close\");\r\n};\r\n\r\nconst showMenuContent = (content) => {\r\n  if (content?.childItems) {\r\n    menuChildItems.value = content;\r\n    sectionHeadline.value = menuChildItems?.value?.name;\r\n  } else {\r\n    switch (content.target) {\r\n      case \"_self\":\r\n        window.location.href = content.url;\r\n        break;\r\n      case \"_blank\":\r\n        window.open(content.url);\r\n        break;\r\n      default:\r\n        window.location.href = content.url;\r\n    }\r\n  }\r\n};\r\n\r\nconst navPath = (childItems) => {\r\n  if (childItems?.childItems) return \"\";\r\n\r\n  return menuStack.map((menuItem) => menuItem.name).join(\"/\");\r\n};\r\n</script>\r\n\r\n<template>\r\n  <section class=\"fixed top-0 left-0 z-[101] h-screen w-screen bg-white overflow-y-auto\">\r\n    <div class=\"h-full bg-limestone-opacity-50\">\r\n      <header class=\"grid h-[var(--site-header-height)] grid-cols-[50px_1fr_50px] items-center border-b-[1px] border-neutral-30 bg-white\">\r\n        <button v-if=\"menuStack.length >= 1\" aria-label=\"Go Back\" @click=\"goBack\"><FhIcon class=\"main-nav-item__icon text-2xl\" name=\"LeftChevron\" /></button>\r\n        <div class=\"col-start-2\">\r\n          <!-- <h2 v-if=\"sectionHeadline\" class=\"text-center text-2xl\">{{ sectionHeadline }}</h2> -->\r\n          <IconFhLogo class=\"m-auto w-[150px]\" />\r\n        </div>\r\n        <button aria-label=\"Close Navigation\" @click=\"close\"><FhIcon name=\"XIcon\" class=\"main-nav-item__icon text-2xl\" /></button>\r\n      </header>\r\n      <div v-if=\"!isAccountMenu\">\r\n        <div v-if=\"menuChildItems == null && props.isAuthenticated\" class=\"search-section relative\">\r\n          <FhIcon name=\"Search\" class=\"search-icon pointer-events-none absolute top-0 left-5 z-10 h-full text-xl\" />\r\n          <FhInput\r\n            v-model=\"searchText\"\r\n            placeholder=\"Search\"\r\n            class=\"border-t-0 h-12 px-12 py-0 leading-tight outline-none focus:outline-none focus:border-neutral-30\"\r\n            @keyup.enter=\"onSearch\"\r\n          />\r\n        </div>\r\n        <nav data-ga=\"mobile_nav\">\r\n          <div>\r\n            <!-- First layer -->\r\n            <ul v-if=\"menuChildItems == null\">\r\n              <li v-for=\"(mainMenuItem, index) in mainMenuItems.mainMenu\" :key=\"index\">\r\n                <a\r\n                  v-if=\"mainMenuItem\"\r\n                  class=\"flex items-center text-xl px-5 leading-tight bg-white py-6 border-b-[1px] border-neutral-30\"\r\n                  :href=\"mainMenuItem?.url || '#'\"\r\n                  :target=\"mainMenuItem?.target || '_self'\"\r\n                  @click=\"menuItemClick($event, index)\"\r\n                >\r\n                  <span>{{ mainMenuItem.name }}</span\r\n                  ><FhIcon class=\"main-nav-item__icon\" name=\"RightChevron\" />\r\n                </a>\r\n              </li>\r\n              <template v-if=\"!props.isAuthenticated\">\r\n                <li>\r\n                  <a\r\n                    class=\"flex items-center text-xl px-5 leading-tight bg-white py-6 border-b-[1px] border-neutral-30\"\r\n                    href=\"/our-locations\"\r\n                    data-ga=\"mobile_nav_click\"\r\n                  >\r\n                    <span>Locations</span>\r\n                  </a>\r\n                </li>\r\n                <li>\r\n                  <a\r\n                    class=\"flex items-center text-xl px-5 leading-tight bg-white py-6 border-b-[1px] border-neutral-30\"\r\n                    href=\"/art-studio\"\r\n                    data-ga=\"mobile_nav_click\"\r\n                  >\r\n                    <span>Art Studio</span>\r\n                  </a>\r\n                </li>\r\n                <li>\r\n                  <a\r\n                    class=\"flex items-center text-xl px-5 leading-tight bg-white py-6 border-b-[1px] border-neutral-30\"\r\n                    href=\"/to-the-trade\"\r\n                    data-ga=\"mobile_nav_click\"\r\n                  >\r\n                    <span>To the Trade</span>\r\n                  </a>\r\n                </li>\r\n              </template>\r\n            </ul>\r\n            <ul v-if=\"menuChildItems == null\" class=\"pt-2.5 pb-[30px]\">\r\n              <li v-for=\"item in mainMenuItems.moreMenu.childItems\" :key=\"item.name\" class=\"px-5 pt-2.5 mt-2.5 pb-0 bt-0\">\r\n                <template v-if=\"item.childItems && item.childItems.length\">\r\n                  <ul class=\"ml-2 flex flex-col gap-4\">\r\n                    <li v-for=\"childItem in item.childItems\" :key=\"childItem.name\">\r\n                      <a\r\n                        :href=\"childItem?.url || '#'\"\r\n                        :target=\"item?.target || '_self'\"\r\n                        class=\"text-base text-neutral-70 leading-tight\"\r\n                        data-ga=\"mobile_nav_click\"\r\n                        >{{ childItem.name }}</a\r\n                      >\r\n                    </li>\r\n                  </ul>\r\n                </template>\r\n                <template v-else>\r\n                  <a :href=\"item?.url || '#'\" :target=\"item?.target || '_self'\" class=\"text-base text-neutral-70 leading-tight\" data-ga=\"mobile_nav_click\">{{\r\n                    item.name\r\n                  }}</a>\r\n                </template>\r\n              </li>\r\n            </ul>\r\n          </div>\r\n          <!-- Category level -->\r\n          <div v-if=\"menuChildItems != null\">\r\n            <ul class=\"bg-white\">\r\n              <li v-for=\"(childItem, childIndex) in menuChildItems?.childItems\" :key=\"childIndex\">\r\n                <template v-if=\"menuStack.length === 2 && childItem.childItems\">\r\n                  <FhAccordion\r\n                    :is-nav-item=\"true\"\r\n                    :view-all-link=\"{ url: `${childItem?.url || ''}`, title: `View All ${childItem?.name || ''}` }\"\r\n                    :data=\"{\r\n                      version: 'single',\r\n                      items: [\r\n                        {\r\n                          title: childItem?.name,\r\n                          copy: childItem?.childItems?.map((item) => ({\r\n                            content: item.name,\r\n                            url: item.url\r\n                          }))\r\n                        }\r\n                      ]\r\n                    }\"\r\n                  />\r\n                </template>\r\n                <template v-else>\r\n                  <a\r\n                    class=\"flex items-center text-xl px-5 leading-tight bg-white py-6 border-b-[1px] border-neutral-30\"\r\n                    :data-ga=\"`${childItem?.childItems ? '' : 'mobile_nav_click'}`\"\r\n                    :data-ga-nav-path=\"navPath(childItem)\"\r\n                    :href=\"childItem?.url || '#'\"\r\n                    :target=\"childItem?.target || '_self'\"\r\n                    @click=\"menuItemClick($event, childIndex)\"\r\n                  >\r\n                    <span :class=\"[childItem?.name === 'Sale' ? 'text-sale-red' : '']\">{{ childItem?.name }}</span>\r\n                    <FhIcon :class=\"[menuStack.length === 2 ? 'hidden' : '']\" class=\"main-nav-item__icon\" name=\"RightChevron\" />\r\n                  </a>\r\n                </template>\r\n              </li>\r\n              <li v-if=\"menuStack.length >= 2\" class=\"bg-white py-6 border-b-[1px] border-neutral-30\">\r\n                <a class=\"flex items-center text-xl px-5 leading-tight\" :href=\"menuStack[menuStack.length - 1].url || '#'\">\r\n                  <span>All {{ menuStack[menuStack.length - 1].name }}</span></a\r\n                >\r\n              </li>\r\n              <!-- Show primaryCta if set -->\r\n              <li v-if=\"menuStack.length > 0 && menuStack[menuStack.length - 1].primaryCTA\" class=\"pt-3 px-3 pb-[60px]\">\r\n                <a\r\n                  :href=\"menuStack[menuStack.length - 1].primaryCTA.ctaLink\"\r\n                  :target=\"menuStack[menuStack.length - 1].primaryCTA.ctaTarget || `_self`\"\r\n                  :data-ga-nav-path=\"navPath(null)\"\r\n                  data-ga=\"nav_marketing_banner_primary\"\r\n                  class=\"text-base text-neutral-70 leading-tight\"\r\n                >\r\n                  <img :src=\"menuStack[menuStack.length - 1].primaryCTA.imageUrl\" class=\"aspect-square\" />\r\n                  <p v-if=\"menuStack[menuStack.length - 1].primaryCTA.ctaText\" class=\"text-neutral-800 text-base underline leading-tight text-center mt-[25px]\">\r\n                    {{ menuStack[menuStack.length - 1].primaryCTA.ctaText }}\r\n                  </p>\r\n                </a>\r\n              </li>\r\n            </ul>\r\n            <ul v-if=\"menuChildItems.extraLinks\" class=\"pt-2.5 pb-[30px]\">\r\n              <li v-for=\"extraLink in menuChildItems?.extraLinks\" :key=\"extraLink.name\" class=\"px-5 pt-2.5 mt-2.5 pb-0 bt-0\">\r\n                <a\r\n                  :href=\"extraLink?.url || '#'\"\r\n                  :target=\"extraLink?.target || '_self'\"\r\n                  class=\"text-base text-neutral-70 leading-tight\"\r\n                  data-ga=\"mobile_nav_click\"\r\n                  >{{ extraLink?.name }}</a\r\n                >\r\n              </li>\r\n            </ul>\r\n          </div>\r\n        </nav>\r\n      </div>\r\n      <!-- Account Menu -->\r\n      <div v-if=\"isAccountMenu\">\r\n        <nav data-ga=\"mobile_nav\">\r\n          <ul>\r\n            <li v-for=\"accountMenuItem in mainMenuItems?.accountMenu\" :key=\"accountMenuItem.name\">\r\n              <a\r\n                class=\"flex items-center text-xl px-5 leading-tight bg-white py-6 border-b-[1px] border-neutral-30\"\r\n                :class=\"accountMenuItem?.name == 'Sign Out' ? 'isSignOut mx-5' : ''\"\r\n                :href=\"accountMenuItem?.url || '#'\"\r\n                data-ga=\"mobile_nav_click\"\r\n              >\r\n                <span>{{ accountMenuItem?.name }}</span>\r\n                <UpRightArrow v-if=\"accountMenuItem?.name === 'Claims Portal'\" class=\"ml-1 w-4\" />\r\n              </a>\r\n            </li>\r\n          </ul>\r\n        </nav>\r\n      </div>\r\n    </div>\r\n  </section>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n:deep(.site-logo) {\r\n  width: 376px;\r\n}\r\n:deep(.search-icon) {\r\n  height: 100%;\r\n}\r\n:deep(.search-section > div) {\r\n  gap: 0;\r\n}\r\n:deep(.isSignOut) {\r\n  @apply border border-neutral-40 justify-center font-bold py-2 mt-10 text-base;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, reactive, computed, nextTick, watch } from \"vue\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport FhNavCart from \"@/components/FhNavCart.vue\";\r\nimport FhNav from \"@/components/FhNav.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport Logo from \"@/assets/four-hands-wordmark.svg\"; // TODO: how to inline SVGs?\r\nimport { event_Search } from \"@/util/googleAnalytics\";\r\nimport { ACCOUNT } from \"@/constants/routes\";\r\nimport UpRightArrow from \"./icons/IconUpRightArrow.vue\";\r\n\r\nconst props = defineProps({\r\n  isAuthenticated: {\r\n    type: Boolean\r\n  },\r\n  canAddToCart: {\r\n    type: Boolean\r\n  },\r\n  mainMenu: {\r\n    type: Object,\r\n    require: true,\r\n    default: () => {}\r\n  },\r\n  accountMenu: {\r\n    type: Object,\r\n    require: true,\r\n    default: () => {}\r\n  },\r\n  moreMenu: {\r\n    type: Object,\r\n    require: true,\r\n    default: () => {}\r\n  }\r\n});\r\n\r\nlet { isSm, isMd, isLg } = useViewportSizes();\r\nlet superCategoryHoverTimer;\r\n\r\nconst mainMenuIsOpen = ref(false);\r\nconst mainMenuActiveSection = ref(null);\r\nconst mainMenuActiveSuperCategory = ref(null);\r\nconst mainMenuActiveCategory = ref(null);\r\nconst isNavOpen = ref(false);\r\nconst isAccountMenu = ref(false);\r\nconst searchText = ref(null);\r\nconst showSearchInput = ref(false);\r\nconst searchInput = ref(null);\r\nconst mobileMenuRef = ref(null);\r\nconst searchInputElement = ref(null);\r\nconst showAllLink = ref(true);\r\n\r\nwatch(mobileMenuRef, async () => {\r\n  if (mobileMenuRef.value && showSearchInput.value) {\r\n    showSearchInput.value = false;\r\n    searchInput.value = null;\r\n  }\r\n});\r\n\r\nconst mainMenuDropdownHasSupercategories = computed(() => {\r\n  return mainMenuActiveSection.value !== null && mainMenuActiveSection.value.hasSuperCategories;\r\n});\r\n\r\nconst mainNavItems = computed(() => {\r\n  if (props.isAuthenticated) {\r\n    return [\r\n      { ...props.mainMenu.products, hasSuperCategories: true, key: \"products\" },\r\n      { ...props.mainMenu.rooms, hasSuperCategories: false, key: \"rooms\" },\r\n      { ...props.mainMenu.discover, hasSuperCategories: false, key: \"discover\" },\r\n      { ...props.mainMenu.explore, hasSuperCategories: false, key: \"explore\" },\r\n      { ...props.mainMenu.locations, hasSuperCategories: false, key: \"locations\" },\r\n      { ...props.mainMenu.artStudio, hasSuperCategories: false, key: \"artStudio\" }\r\n    ];\r\n  }\r\n\r\n  return [{ ...props.mainMenu.explore, hasSuperCategories: false, key: \"explore\" }];\r\n});\r\n\r\nconst mobileNavItems = computed(() => {\r\n  return {\r\n    mainMenu: props.mainMenu,\r\n    moreMenu: props.moreMenu,\r\n    accountMenu: props.accountMenu\r\n  };\r\n});\r\n\r\nconst MENU_HOVER_SHOW_DELAY = 200;\r\nconst MENU_HOVER_HIDE_DELAY = 300;\r\nconst MENU_ITEM_HOVER_DELAY = 350;\r\nlet mainMenuMouseEnterTimer, mainMenuMouseLeaveTimer;\r\n\r\nconst marketingCTAs = reactive({ primaryCTA: ref({}), secondaryCTA: ref({}) });\r\n\r\nfunction setCtaProperties(item) {\r\n  marketingCTAs.primaryCTA = item.primaryCTA || null;\r\n  marketingCTAs.secondaryCTA = item.secondCTA || null;\r\n}\r\n\r\nfunction handleMainNavItemMouseEnter(item) {\r\n  clearTimeout(mainMenuMouseLeaveTimer);\r\n  mainMenuMouseEnterTimer = setTimeout(() => {\r\n    mainMenuIsOpen.value = true;\r\n    activateMainNavItem(item);\r\n  }, MENU_ITEM_HOVER_DELAY);\r\n}\r\n\r\nfunction handleMainNavItemMouseLeave() {\r\n  clearTimeout(mainMenuMouseEnterTimer);\r\n}\r\n\r\nfunction handleMainMenuMouseEnter() {\r\n  clearTimeout(mainMenuMouseLeaveTimer);\r\n}\r\n\r\nfunction handleMainMenuMouseLeave() {\r\n  clearTimeout(mainMenuMouseEnterTimer);\r\n  mainMenuMouseLeaveTimer = setTimeout(() => closeMainMenu(), MENU_HOVER_HIDE_DELAY);\r\n}\r\n\r\nfunction activateMainNavItem(item) {\r\n  mainMenuActiveSection.value = item;\r\n  if (mainMenuDropdownHasSupercategories.value) {\r\n    activateSuperCategory(item.childItems[0]);\r\n  } else {\r\n    activateSuperCategory(item);\r\n  }\r\n}\r\n\r\nfunction activateSuperCategory(item) {\r\n  setCtaProperties(item);\r\n  mainMenuActiveSuperCategory.value = item;\r\n  if (!mainMenuDropdownHasSupercategories.value && item?.childItems) {\r\n    activateCategory(item.childItems[0]);\r\n  } else {\r\n    mainMenuActiveCategory.value = null;\r\n  }\r\n}\r\n\r\nfunction activateCategory(item) {\r\n  if (mainMenuActiveSection.value.key === \"discover\" || mainMenuActiveSection.value.key === \"explore\") {\r\n    setCtaProperties(item);\r\n    showAllLink.value = false;\r\n  } else if (mainMenuDropdownHasSupercategories.value) {\r\n    setCtaProperties(mainMenuActiveSuperCategory.value);\r\n    showAllLink.value = true;\r\n  } else {\r\n    setCtaProperties(item);\r\n    showAllLink.value = true;\r\n  }\r\n  mainMenuActiveCategory.value = item;\r\n}\r\n\r\nfunction isMainMenuItemActive(item) {\r\n  return mainMenuActiveSection.value !== null && mainMenuActiveSection.value.name === item.name;\r\n}\r\n\r\nfunction isSuperCategoryActive(item) {\r\n  return mainMenuActiveSuperCategory.value !== null && mainMenuActiveSuperCategory.value.name == item.name;\r\n}\r\n\r\nfunction isCategoryActive(item) {\r\n  return mainMenuActiveCategory.value != null && mainMenuActiveCategory.value.name == item.name;\r\n}\r\n\r\nfunction closeMainMenu() {\r\n  mainMenuIsOpen.value = false;\r\n  mainMenuActiveSection.value = null;\r\n  mainMenuActiveSuperCategory.value = null;\r\n  mainMenuActiveCategory.value = null;\r\n}\r\n\r\n// Account menu\r\nconst accountMenuIsOpen = ref(false);\r\nlet accountMenuMouseEnterTimer, accountMenuMouseLeaveTimer;\r\n\r\nfunction handleAccountMenuMouseEnter() {\r\n  if (isSm.value || isMd.value) return false;\r\n  if (moreMenuIsOpen.value) {\r\n    accountMenuIsOpen.value = true;\r\n    nextTick(() => (moreMenuIsOpen.value = false));\r\n  } else {\r\n    clearTimeout(accountMenuMouseLeaveTimer);\r\n    accountMenuMouseEnterTimer = setTimeout(() => (accountMenuIsOpen.value = true), MENU_HOVER_SHOW_DELAY);\r\n  }\r\n}\r\n\r\nfunction handleAccountMenuMouseLeave() {\r\n  if (isSm.value || isMd.value) return false;\r\n  clearTimeout(accountMenuMouseEnterTimer);\r\n  accountMenuMouseLeaveTimer = setTimeout(() => (accountMenuIsOpen.value = false), MENU_HOVER_HIDE_DELAY);\r\n}\r\n\r\n// More menu\r\nconst moreMenuIsOpen = ref(false);\r\nlet moreMenuMouseEnterTimer, moreMenuMouseLeaveTimer;\r\n\r\nfunction handleMoreMenuMouseEnter() {\r\n  if (accountMenuIsOpen.value) {\r\n    moreMenuIsOpen.value = true;\r\n    nextTick(() => (accountMenuIsOpen.value = false));\r\n  } else {\r\n    clearTimeout(moreMenuMouseLeaveTimer);\r\n    moreMenuMouseEnterTimer = setTimeout(() => (moreMenuIsOpen.value = true), MENU_HOVER_SHOW_DELAY);\r\n  }\r\n}\r\n\r\nfunction handleMoreMenuMouseLeave() {\r\n  clearTimeout(moreMenuMouseEnterTimer);\r\n  moreMenuMouseLeaveTimer = setTimeout(() => (moreMenuIsOpen.value = false), MENU_HOVER_HIDE_DELAY);\r\n}\r\n\r\nconst pageOverlayIsActive = computed(() => mainMenuIsOpen.value || moreMenuIsOpen.value || accountMenuIsOpen.value);\r\n\r\nconst navMenuToggle = (event, openAccountMenu = false) => {\r\n  event?.preventDefault();\r\n  if (isLg.value && openAccountMenu) {\r\n    window.location = ACCOUNT;\r\n    return false;\r\n  }\r\n  isNavOpen.value = !isNavOpen.value;\r\n  isAccountMenu.value = openAccountMenu;\r\n};\r\n\r\nconst closeMenu = () => {\r\n  isNavOpen.value = !isNavOpen.value;\r\n  if (isAccountMenu.value) {\r\n    isAccountMenu.value = !isAccountMenu.value;\r\n  }\r\n};\r\nconst tirggerSearch = (searchValue = null) => {\r\n  let termsToSearch = searchText.value;\r\n  if (typeof searchValue === \"string\") {\r\n    termsToSearch = searchValue;\r\n  }\r\n  event_Search(termsToSearch);\r\n  window.location = `/search?query=${encodeURIComponent(termsToSearch ?? \"\")}`;\r\n};\r\nconst searchInputToggle = () => {\r\n  showSearchInput.value = !showSearchInput.value;\r\n  searchText.value = null;\r\n  if (showSearchInput.value) nextTick(() => searchInputElement.value.inputElement.focus());\r\n};\r\n// check for safari broswer\r\nconst isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n\r\nconst dataGAValueForCategory = computed(() => {\r\n  if (!mainMenuActiveSection.value) return null;\r\n  if (mainMenuDropdownHasSupercategories.value) {\r\n    return `${mainMenuActiveSection.value?.name}/${mainMenuActiveSuperCategory.value?.name}/${mainMenuActiveCategory.value?.name}`;\r\n  }\r\n\r\n  return `${mainMenuActiveSection.value?.name}/${mainMenuActiveCategory.value?.name}`;\r\n});\r\n\r\nconst dataGaValueForSuperCat = computed(() => {\r\n  if (!mainMenuActiveSection.value) return null;\r\n  if (mainMenuDropdownHasSupercategories.value) {\r\n    return `${mainMenuActiveSection.value?.name}/${mainMenuActiveSuperCategory.value?.name}`;\r\n  }\r\n\r\n  return mainMenuActiveSection.value?.name;\r\n});\r\n\r\n// add a delay to activateSuperCategory on mouse enter\r\nfunction handleSuperCategoryMouseEnter(item) {\r\n  clearTimeout(superCategoryHoverTimer);\r\n  superCategoryHoverTimer = setTimeout(() => activateSuperCategory(item), MENU_ITEM_HOVER_DELAY);\r\n}\r\n// Clear the timer on mouse leave\r\nfunction handleSuperCategoryMouseLeave() {\r\n  clearTimeout(superCategoryHoverTimer);\r\n}\r\n</script>\r\n\r\n<template>\r\n  <header class=\"relative z-20 h-[var(--site-header-height)] md:h-[var(--site-header-height-md)]\">\r\n    <a href=\"/\" class=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2\" :class=\"{ 'z-10': showSearchInput, 'z-30': !showSearchInput }\">\r\n      <img :src=\"Logo\" alt=\"Four Hands\" class=\"w-[150px] md:w-[180px]\" />\r\n    </a>\r\n\r\n    <div class=\"absolute z-20 h-full w-full bg-white\">\r\n      <!-- this empty div is the bottom \"border\" of the header - needed so it floats over the drop-down menu as it's animating in -->\r\n      <div class=\"absolute top-full left-0 -z-10 h-px w-full bg-neutral-30\"></div>\r\n      <div class=\"pg-container relative flex h-full items-center bg-white\">\r\n        <div class=\"order-[-13]\" :class=\"{ 'h-full': showSearchInput }\">\r\n          <button v-if=\"isSm || isMd\" ref=\"mobileMenuRef\" class=\"order-first\" aria-label=\"Menu\" title=\"Menu\" data-ga=\"MobileMenuIcon\" @click=\"navMenuToggle\">\r\n            <FhIcon name=\"Browse\" class=\"text-2xl\" />\r\n          </button>\r\n          <button\r\n            v-if=\"props.isAuthenticated && isLg\"\r\n            aria-label=\"Search\"\r\n            title=\"Search\"\r\n            class=\"searchIcon\"\r\n            :class=\"{ isSearch: showSearchInput }\"\r\n            @click.prevent=\"searchInputToggle\"\r\n          >\r\n            <FhIcon :name=\"showSearchInput ? 'XIcon' : 'Search'\" class=\"text-2xl\" />\r\n          </button>\r\n        </div>\r\n        <!-- Main nav links -->\r\n        <nav v-if=\"isLg\" class=\"items-center self-stretch\" :class=\"{ 'ml-f3': props.isAuthenticated }\" @mouseleave=\"handleMainMenuMouseLeave\">\r\n          <ul class=\"flex h-full items-stretch\">\r\n            <li v-for=\"item in mainNavItems\" :key=\"item.name\" class=\"flex items-stretch\">\r\n              <a\r\n                class=\"navItem text-body-lg px-f1.5\"\r\n                :class=\"{\r\n                  'navItem--active': isMainMenuItemActive(item),\r\n                  'first:pl-0': !props.isAuthenticated,\r\n                  'cursor-default': !item.url\r\n                }\"\r\n                :href=\"item.url\"\r\n                @mouseenter=\"handleMainNavItemMouseEnter(item)\"\r\n                @mouseleave=\"handleMainNavItemMouseLeave\"\r\n              >\r\n                <span class=\"navItem__inner\">{{ item.name }}</span>\r\n              </a>\r\n            </li>\r\n            <template v-if=\"!props.isAuthenticated\">\r\n              <li class=\"flex items-stretch\">\r\n                <a class=\"navItem text-body-lg px-f1.5\" href=\"/art-studio\" @mouseenter=\"handleMainMenuMouseLeave\">\r\n                  <span class=\"navItem__inner\">Art Studio</span>\r\n                </a>\r\n              </li>\r\n            </template>\r\n          </ul>\r\n        </nav>\r\n        <!-- Spacer -->\r\n        <div class=\"mx-auto\"></div>\r\n        <!-- Trade Program link -->\r\n        <a v-if=\"isLg && !props.isAuthenticated\" href=\"/to-the-trade\" class=\"text-body-lg navItem self-stretch px-f1.5\">\r\n          <span class=\"navItem__inner\"> To the Trade </span>\r\n        </a>\r\n        <a v-if=\"isLg && !props.isAuthenticated\" class=\"text-body-lg navItem self-stretch px-f1.5\" href=\"/our-locations\">\r\n          <span class=\"navItem__inner\">Locations</span>\r\n        </a>\r\n\r\n        <!-- \"Log In\" button -->\r\n        <a v-if=\"!props.isAuthenticated\" href=\"/login\" class=\"text-body-lg navItem self-stretch px-f1.5\" aria-label=\"Log In\" title=\"Log In\">\r\n          <span class=\"navItem__inner\">\r\n            <FhIcon v-if=\"isSm || isMd\" name=\"User\" class=\"text-2xl\" />\r\n            <span v-if=\"isLg\">Log In</span>\r\n          </span>\r\n        </a>\r\n        <!-- Lists button -->\r\n        <a v-if=\"props.isAuthenticated\" href=\"/shopping-lists\" class=\"navItem -order-1 self-stretch px-f1.5 md:order-none\" aria-label=\"Lists\" title=\"Lists\">\r\n          <span class=\"navItem__inner\">\r\n            <FhIcon name=\"OutlineHeart\" class=\"text-2xl\" />\r\n          </span>\r\n        </a>\r\n        <!-- Cart button -->\r\n        <FhNavCart v-if=\"props.isAuthenticated && props.canAddToCart\" class=\"navItem self-stretch px-f1.5\" icon-wrapper-class=\"navItem__inner\" />\r\n        <!-- Account menu -->\r\n        <button\r\n          v-if=\"props.isAuthenticated\"\r\n          class=\"navItem self-stretch px-f1.5\"\r\n          :class=\"{ 'navItem--active': accountMenuIsOpen }\"\r\n          aria-label=\"Account\"\r\n          title=\"Account\"\r\n          @mouseenter=\"handleAccountMenuMouseEnter\"\r\n          @mouseleave=\"handleAccountMenuMouseLeave\"\r\n          @click=\"navMenuToggle($event, true)\"\r\n        >\r\n          <span class=\"navItem__inner\">\r\n            <FhIcon name=\"User\" class=\"text-2xl\" />\r\n          </span>\r\n        </button>\r\n        <!-- More menu button -->\r\n        <button\r\n          v-if=\"isLg\"\r\n          class=\"navItem self-stretch px-f1.5\"\r\n          :class=\"{ 'navItem--active': moreMenuIsOpen }\"\r\n          aria-label=\"More\"\r\n          title=\"More\"\r\n          @mouseenter=\"handleMoreMenuMouseEnter\"\r\n          @mouseleave=\"handleMoreMenuMouseLeave\"\r\n        >\r\n          <span class=\"navItem__inner\">\r\n            <FhIcon name=\"VerticalEllipse\" class=\"text-2xl\" />\r\n          </span>\r\n        </button>\r\n        <!-- \r\n          TODO: Update header items to not be absolute -- suggestion of grid implementation\r\n          Add animation once we can fix our styles for the header, also once we fix the header this should live with the icon \r\n        -->\r\n        <div v-show=\"showSearchInput && isLg\" class=\"pg-container absolute top-0 left-0 w-full md:h-[var(--site-header-height-md)]\">\r\n          <FhInput\r\n            ref=\"searchInputElement\"\r\n            v-model=\"searchText\"\r\n            tabindex=\"0\"\r\n            type=\"text\"\r\n            placeholder=\"Search for products, styles, materials\"\r\n            :wrapper-attrs=\"{ class: 'h-full gap-0 pl-6 bg-white' }\"\r\n            class=\"ml-f3 h-full border-0 pl-f1.5\"\r\n            @keyup.enter=\"tirggerSearch\"\r\n          />\r\n        </div>\r\n        <!-- account menu dropdown -->\r\n        <Transition :name=\"moreMenuIsOpen ? null : 'slide'\">\r\n          <div\r\n            v-if=\"accountMenuIsOpen\"\r\n            class=\"absolute right-0 top-full mt-[1px] w-[280px] bg-white p-f3\"\r\n            :class=\"isSafari ? 'z-10' : '-z-10'\"\r\n            @mouseenter=\"handleAccountMenuMouseEnter\"\r\n            @mouseleave=\"handleAccountMenuMouseLeave\"\r\n          >\r\n            <ul class=\"flex flex-col gap-f2\">\r\n              <li v-for=\"(link, index) in props.accountMenu.childItems\" :key=\"index\">\r\n                <a\r\n                  :href=\"link.url\"\r\n                  class=\"relative inline-flex\"\r\n                  :target=\"link.target\"\r\n                  :class=\"{ 'is-active text-neutral-70': link.isActive, group: link.target == '_blank' }\"\r\n                >\r\n                  {{ link.name }}\r\n                  <UpRightArrow\r\n                    v-if=\"link.target === '_blank'\"\r\n                    class=\"absolute left-[calc(100%-5px)] ml-2 w-3.5 md:opacity-0 transition-all duration-200 group-hover:visible group-hover:opacity-100 md:w-4\"\r\n                  />\r\n                </a>\r\n              </li>\r\n            </ul>\r\n          </div>\r\n        </Transition>\r\n        <!-- more menu dropdown -->\r\n        <Transition :name=\"accountMenuIsOpen ? null : 'slide'\">\r\n          <div\r\n            v-if=\"moreMenuIsOpen\"\r\n            class=\"absolute right-0 top-full mt-[1px] w-[280px] bg-white p-f3\"\r\n            :class=\"isSafari ? 'z-10' : '-z-10'\"\r\n            @mouseenter=\"handleMoreMenuMouseEnter\"\r\n            @mouseleave=\"handleMoreMenuMouseLeave\"\r\n          >\r\n            <ul class=\"flex flex-col gap-f2\">\r\n              <li v-for=\"item in props.moreMenu.childItems\" :key=\"item.name\" class=\"text-neutral-70\">\r\n                <template v-if=\"item.childItems && item.childItems.length\">\r\n                  <div class=\"mb-f2 text-neutral-50\">{{ item.name }}</div>\r\n                  <ul class=\"ml-2 flex flex-col gap-f2\">\r\n                    <li v-for=\"childItem in item.childItems\" :key=\"childItem.name\">\r\n                      <a :href=\"childItem.url\" class=\"hover-underline-with-transition\">{{ childItem.name }}</a>\r\n                    </li>\r\n                  </ul>\r\n                </template>\r\n                <template v-else>\r\n                  <a :href=\"item.url\" class=\"hover-underline-with-transition\">{{ item.name }}</a>\r\n                </template>\r\n              </li>\r\n            </ul>\r\n          </div>\r\n        </Transition>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- main nav dropdown -->\r\n    <Transition name=\"slide\">\r\n      <div\r\n        v-if=\"mainMenuIsOpen\"\r\n        class=\"absolute left-0 top-full z-10 w-full bg-white\"\r\n        @mouseenter=\"handleMainMenuMouseEnter\"\r\n        @mouseleave=\"handleMainMenuMouseLeave\"\r\n      >\r\n        <!-- main nav dropdown: top section -->\r\n        <div v-if=\"mainMenuDropdownHasSupercategories\" class=\"border-b border-neutral-30\">\r\n          <!-- super category section -->\r\n          <div class=\"pg-container flex h-[84px] items-stretch\">\r\n            <ul class=\"-mx-f2.5 flex\">\r\n              <li v-for=\"item in mainMenuActiveSection.childItems\" :key=\"item.name\" class=\"flex\">\r\n                <a\r\n                  :href=\"item.url\"\r\n                  class=\"navItem px-f2.5 text-base\"\r\n                  data-ga=\"primary_navigation\"\r\n                  :class=\"[isSuperCategoryActive(item) ? 'navItem--active text-neutral-70' : 'text-neutral-50 hover:text-neutral-70']\"\r\n                  :data-ga-nav-path=\"mainMenuActiveSection?.name\"\r\n                  @mouseenter=\"handleSuperCategoryMouseEnter(item)\"\r\n                  @mouseleave=\"handleSuperCategoryMouseLeave\"\r\n                >\r\n                  <span class=\"navItem__inner\" :class=\"[item.name === 'Sale' ? 'text-sale-red' : '']\">{{ item.name }}</span>\r\n                </a>\r\n              </li>\r\n            </ul>\r\n            <ul v-if=\"mainMenuActiveSection.extraLinks\" class=\"ml-auto flex items-center gap-f3\">\r\n              <li v-for=\"extraLink in mainMenuActiveSection.extraLinks\" :key=\"extraLink.name\">\r\n                <a :href=\"extraLink.url\" class=\"text-body-lg ga-extra-links\">{{ extraLink.name }}</a>\r\n              </li>\r\n            </ul>\r\n          </div>\r\n          <!-- end super category section -->\r\n        </div>\r\n        <!-- main nav dropdown: bottom section -->\r\n        <div class=\"pg-container min-h-[350px] bottom-section max-h-[630px] py-10\">\r\n          <div\r\n            :class=\"{\r\n              'grid-cols-[minmax(200px,1fr)_minmax(150px,1fr)_3fr]': marketingCTAs.primaryCTA?.imageUrl || marketingCTAs.secondaryCTA?.imageUrl,\r\n              'grid-cols-[minmax(200px,1fr)_minmax(150px,1fr)_1fr_1fr]': !marketingCTAs.primaryCTA?.imageUrl || marketingCTAs.secondaryCTA?.imageUrl\r\n            }\"\r\n            class=\"grid grid-flow-col gap-10\"\r\n          >\r\n            <div>\r\n              <TransitionGroup name=\"list\" tag=\"ul\" class=\"flex flex-col gap-3\">\r\n                <li v-for=\"(item, index) in mainMenuActiveSuperCategory.childItems\" :key=\"item.name\" :data-index=\"index\" :class=\"'list-item-' + index\">\r\n                  <a\r\n                    :href=\"item.url\"\r\n                    :target=\"item?.target || `_self`\"\r\n                    class=\"hover-underline-with-transition group relative pb-0.5 text-base hover:text-neutral-70\"\r\n                    :class=\"[isCategoryActive(item) ? 'text-neutral-70 after:w-full' : 'text-neutral-50', { 'cursor-default': !item.url }]\"\r\n                    data-ga=\"secondary_navigation\"\r\n                    :data-ga-nav-path=\"dataGaValueForSuperCat\"\r\n                    @mouseenter=\"activateCategory(item)\"\r\n                  >\r\n                    {{ item.name }}\r\n                    <FhIcon v-if=\"item.hasOwnProperty('childItems')\" name=\"RightChevron\" class=\"relative -top-px\" />\r\n                  </a>\r\n                </li>\r\n              </TransitionGroup>\r\n            </div>\r\n            <div>\r\n              <TransitionGroup v-if=\"mainMenuActiveCategory\" name=\"list\" tag=\"ul\" class=\"flex flex-col gap-f2\">\r\n                <li v-for=\"item in mainMenuActiveCategory.childItems\" :key=\"`${mainMenuActiveCategory.name}_${item.name}`\">\r\n                  <a\r\n                    :href=\"item.url\"\r\n                    :target=\"item?.target || `_self`\"\r\n                    :data-ga-nav-path=\"dataGAValueForCategory\"\r\n                    class=\"hover-underline-with-transition\"\r\n                    data-ga=\"third_navigation\"\r\n                    >{{ item.name }}</a\r\n                  >\r\n                </li>\r\n                <li v-if=\"mainMenuActiveCategory?.childItems?.length > 0 && showAllLink\" :key=\"`${mainMenuActiveCategory.name}_showAllLink`\">\r\n                  <a :href=\"mainMenuActiveCategory.url\" class=\"hover-underline-with-transition\" :data-ga-nav-path=\"dataGAValueForCategory\"\r\n                    >All {{ mainMenuActiveCategory.name }}</a\r\n                  >\r\n                </li>\r\n              </TransitionGroup>\r\n            </div>\r\n            <!-- Note: we don't want to show the secondary one if there is only a secondaryCta and no primary -->\r\n            <div v-if=\"marketingCTAs.primaryCTA?.imageUrl\" class=\"menu__category-image-wrapper grid grid-flow-col gap-10\">\r\n              <div class=\"justify-self-end\">\r\n                <a\r\n                  :href=\"marketingCTAs.primaryCTA?.ctaLink\"\r\n                  :target=\"marketingCTAs.primaryCTA?.ctaTarget || `_self`\"\r\n                  data-ga=\"nav_marketing_banner_primary\"\r\n                  :data-ga-nav-path=\"dataGaValueForSuperCat\"\r\n                >\r\n                  <div class=\"menu__category-image\" :style=\"{ 'background-image': `url(${marketingCTAs.primaryCTA?.imageUrl}` }\"></div>\r\n                  <p class=\"text-neutral-800 text-base underline leading-tight mt-[25px]\">{{ marketingCTAs.primaryCTA?.ctaText }}</p>\r\n                </a>\r\n              </div>\r\n              <div v-if=\"marketingCTAs.secondaryCTA?.imageUrl\" class=\"cta-secondary justify-self-end\">\r\n                <a\r\n                  :href=\"marketingCTAs.secondaryCTA?.ctaLink\"\r\n                  :target=\"marketingCTAs.secondaryCTA?.ctaTarget || `_self`\"\r\n                  data-ga=\"nav_marketing_banner_secondary\"\r\n                  :data-ga-nav-path=\"dataGaValueForSuperCat\"\r\n                >\r\n                  <div class=\"menu__category-image\" :style=\"{ 'background-image': `url(${marketingCTAs.secondaryCTA?.imageUrl}` }\"></div>\r\n                  <p class=\"text-neutral-800 text-base underline leading-tight mt-[25px]\">{{ marketingCTAs.secondaryCTA?.ctaText }}</p>\r\n                </a>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </Transition>\r\n\r\n    <!-- page overlay (behind main nav dropdown)-->\r\n    <Transition name=\"fade\">\r\n      <div\r\n        v-if=\"pageOverlayIsActive\"\r\n        class=\"fixed top-[49px] left-0 right-0 bottom-0 bg-neutral-overlay-opacity-80 mix-blend-multiply md:top-[77px] h-screen w-screen\"\r\n      ></div>\r\n    </Transition>\r\n  </header>\r\n  <Transition name=\"nav-menu\">\r\n    <FhNav\r\n      v-if=\"isNavOpen\"\r\n      :is-authenticated=\"props.isAuthenticated\"\r\n      :nav-items=\"mobileNavItems\"\r\n      :is-account-menu=\"isAccountMenu\"\r\n      @close=\"closeMenu\"\r\n      @search=\"tirggerSearch\"\r\n    />\r\n  </Transition>\r\n</template>\r\n\r\n<style scoped>\r\n:deep(.navItem) {\r\n  @apply flex items-stretch;\r\n}\r\n:deep(.navItem__inner) {\r\n  @apply relative flex items-center;\r\n}\r\n:deep(.navItem__inner:after) {\r\n  content: \"\";\r\n  @apply absolute -bottom-px left-0 block h-px w-0 bg-neutral-70 transition-[width] duration-200;\r\n}\r\n:deep(.navItem:hover .navItem__inner:after),\r\n:deep(.navItem--active .navItem__inner:after) {\r\n  @apply w-full;\r\n}\r\n:deep(.searchIcon.isSearch) {\r\n  @apply absolute top-2/4 z-40 -translate-y-2/4;\r\n}\r\n\r\n.show-header {\r\n  @apply fixed w-full;\r\n}\r\n\r\n.menu__category-image {\r\n  background-size: cover;\r\n  background-repeat: no-repeat;\r\n  background-position: center center;\r\n\r\n  @media (min-width: 1200px) {\r\n    height: 336px;\r\n    width: 336px;\r\n  }\r\n\r\n  @media (min-width: 1440px) {\r\n    height: 480px;\r\n    width: 480px;\r\n  }\r\n\r\n  @media (max-height: 800px) {\r\n    height: 240px;\r\n    width: 240px;\r\n  }\r\n}\r\n\r\n.cta-secondary {\r\n  display: none;\r\n  @media (min-width: 1200px) {\r\n    display: block;\r\n  }\r\n}\r\n\r\n.nav-menu-enter-active,\r\n.nav-menu-leave-active {\r\n  transition: transform 300ms linear;\r\n}\r\n.nav-menu-enter-from,\r\n.nav-menu-leave-to {\r\n  transform: translateX(-100vw);\r\n}\r\n\r\n.fade-enter-active,\r\n.fade-leave-active {\r\n  @apply transition-opacity duration-300;\r\n}\r\n.fade-enter-from,\r\n.fade-leave-to {\r\n  opacity: 0;\r\n}\r\n\r\n.slide-enter-active {\r\n  animation: menu-slide 0.3s;\r\n}\r\n.slide-leave-active {\r\n  animation: menu-slide 0.3s reverse;\r\n}\r\n@keyframes menu-slide {\r\n  from {\r\n    transform: translateY(-100%);\r\n  }\r\n  to {\r\n    transform: translateY(0);\r\n  }\r\n}\r\n\r\n@keyframes fadeOut {\r\n  0% {\r\n    opacity: 1;\r\n    transform: translateY(0);\r\n  }\r\n  100% {\r\n    opacity: 0;\r\n  }\r\n}\r\n@keyframes fadeIn {\r\n  0% {\r\n    opacity: 0;\r\n    transform: translateY(-20px);\r\n  }\r\n  100% {\r\n    opacity: 1;\r\n    transform: translateY(0);\r\n  }\r\n}\r\n.list-leave-active {\r\n  position: absolute;\r\n  animation: fadeOut 0.4s forwards;\r\n  visibility: hidden;\r\n  opacity: 0;\r\n}\r\n.list-leave-to {\r\n  opacity: 0;\r\n}\r\n.list-enter-active {\r\n  animation: fadeIn 0.4s forwards;\r\n  animation-delay: calc(var(--list-index) * 100ms);\r\n}\r\n.list-enter {\r\n  opacity: 0;\r\n  transform: translateY(-20px);\r\n  transition: all 0.4s;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhIcon from \"./FhIcon.vue\";\r\n\r\nconst props = defineProps({\r\n  /**\r\n   * The notification message\r\n   */\r\n  message: {\r\n    type: String,\r\n    required: true\r\n  },\r\n  /**\r\n   * The type of notification\r\n   * @values default, success, error\r\n   */\r\n  type: {\r\n    type: String,\r\n    default: \"default\",\r\n    validator: (val) => [\"default\", \"success\", \"error\"].includes(val)\r\n  },\r\n  linkText: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  linkUrl: {\r\n    type: String,\r\n    default: null\r\n  },\r\n  linkTarget: {\r\n    type: String,\r\n    default: null\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"dismiss\", \"linkClick\"]);\r\n\r\nconst iconName = computed(() => {\r\n  if (props.type === \"success\") return \"Check\";\r\n  if (props.type === \"error\") return \"AlertCircle\";\r\n  return null;\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div\r\n    class=\"flex min-h-[var(--site-header-height)] w-full items-center gap-f5 py-f4 px-f3 md:min-h-[var(--site-header-height-md)]\"\r\n    :class=\"[props.type === 'error' ? 'bg-slate text-white' : 'bg-limestone']\"\r\n  >\r\n    <div class=\"flex flex-1 items-center gap-f2 text-f-sm-lg md:justify-center\">\r\n      <FhIcon v-if=\"iconName\" :name=\"iconName\" class=\"flex-none self-start text-[125%]\" />\r\n      <span>\r\n        {{ props.message }}\r\n        <FhButton v-if=\"props.linkText\" variant=\"link\" :href=\"props.linkUrl\" :target=\"props.linkTarget\" @click=\"emit('linkClick')\">{{\r\n          props.linkText\r\n        }}</FhButton>\r\n      </span>\r\n    </div>\r\n    <FhButton variant=\"link\" @click=\"emit('dismiss')\">Dismiss</FhButton>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { useNotificationStore } from \"../stores/NotificationStore.js\";\r\nimport FhNotification from \"./FhNotification.vue\";\r\n\r\nconst NOTIFICATION_DURATION = 3000;\r\nconst NOTIFICATION_DURATION_LONG = 5000;\r\n\r\nconst notificationStore = useNotificationStore();\r\nconst notifications = computed(() => notificationStore.notifications);\r\n\r\nconst timers = {};\r\n\r\nfunction startTimer(notification) {\r\n  if (!timers[notification.id]) {\r\n    // show errors for longer to give the user more time to digest them\r\n    const time = notification.type === \"error\" ? NOTIFICATION_DURATION_LONG : NOTIFICATION_DURATION;\r\n    timers[notification.id] = setTimeout(() => dismiss(notification), time);\r\n  }\r\n}\r\n\r\nfunction cancelTimer(notification) {\r\n  if (timers[notification.id]) {\r\n    clearTimeout(timers[notification.id]);\r\n    delete timers[notification.id];\r\n  }\r\n}\r\n\r\nfunction dismiss(notification) {\r\n  notificationStore.dismiss(notification.id);\r\n}\r\n</script>\r\n\r\n<template>\r\n  <Teleport to=\"body\">\r\n    <div class=\"fixed left-0 top-0 right-0 z-body-notifications\" aria-live=\"assertive\">\r\n      <TransitionGroup\r\n        enter-active-class=\"transform ease-out duration-300 transition\"\r\n        enter-from-class=\"-translate-y-1/2 opacity-0\"\r\n        enter-to-class=\"translate-y-0 opacity-100\"\r\n        leave-active-class=\"transition ease-in duration-200 absolute\"\r\n        leave-from-class=\"translate-y-0 opacity-100\"\r\n        leave-to-class=\"-translate-y-1/2 opacity-0\"\r\n        move-class=\"transtion duration-500\"\r\n      >\r\n        <FhNotification\r\n          v-for=\"notification in notifications\"\r\n          :key=\"notification.id\"\r\n          v-bind=\"notification\"\r\n          @vue:mounted=\"startTimer(notification)\"\r\n          @mouseenter=\"cancelTimer(notification)\"\r\n          @mouseleave=\"startTimer(notification)\"\r\n          @dismiss=\"dismiss(notification)\"\r\n          @link-click=\"dismiss(notification)\"\r\n        />\r\n      </TransitionGroup>\r\n    </div>\r\n  </Teleport>\r\n</template>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport UpRightArrow from \"./icons/IconUpRightArrow.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isFullWidth: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst { pageTitle, links } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection class=\"\" aria-label=\"Page Navigation\" :base=\"style.base\">\r\n    <div\r\n      v-if=\"links != null\"\r\n      :class=\"isFullWidth ? '' : 'relative'\"\r\n      class=\"mb-f5 after:absolute after:left-0 after:h-px after:w-full after:bg-neutral-30 after:content-['']\"\r\n    >\r\n      <div class=\"p-f5 pl-0 text-f-base-2xl text-neutral-80\">{{ pageTitle }}</div>\r\n      <nav class=\"w-full overflow-visible\">\r\n        <div class=\"fh-nav-wrapper flex w-full overflow-x-scroll\">\r\n          <h1 v-for=\"(link, index) in links\" :key=\"index\" class=\"mr-f5 [&:not(:first-child)]:ml-f5\">\r\n            <a\r\n              :href=\"link.url\"\r\n              :target=\"link.target\"\r\n              :aria-label=\"link.ariaLabel\"\r\n              class=\"relative inline-flex w-max items-center whitespace-nowrap py-f5 text-f-base-2xl text-neutral-50 transition duration-200 hover:text-neutral-70\"\r\n              :class=\"{ 'is-active text-neutral-70': link.isActive, group: link.target == '_blank' }\"\r\n            >\r\n              {{ link.name }}\r\n              <UpRightArrow\r\n                v-if=\"link.target === '_blank'\"\r\n                class=\"invisible absolute left-[calc(100%-5px)] ml-2 h-3.5 w-3.5 opacity-0 transition-all duration-200 group-hover:visible group-hover:opacity-100 md:h-4 md:w-4 lg:h-5 lg:w-5\"\r\n              />\r\n            </a>\r\n          </h1>\r\n        </div>\r\n      </nav>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.is-active:after {\r\n  @apply content-[\"\"] absolute top-[calc(100%-1px)] left-0 right-0 w-full h-px bg-neutral-80 z-10;\r\n}\r\n/* Hide scrollbar for Chrome, Safari and Opera */\r\n.fh-nav-wrapper::-webkit-scrollbar {\r\n  display: none;\r\n}\r\n/* Hide scrollbar for IE, Edge and Firefox */\r\n.fh-nav-wrapper {\r\n  -ms-overflow-style: none; /* IE and Edge */\r\n  scrollbar-width: none; /* Firefox */\r\n}\r\n</style>\r\n","<script setup>\r\nimport { ref, computed, onMounted } from \"vue\";\r\nimport formatPrice from \"@/util/formatPrice.js\";\r\nimport { MEASUREMENT_UNITS, MEASUREMENT_SYSTEM } from \"@/constants/measurements\";\r\nimport FhProductDetailSpec from \"@/components/FhProductDetailSpec.vue\";\r\n\r\nconst props = defineProps({\r\n  product: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isAuthenticated: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isAdmin: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  isCADPrice: {\r\n    type: Boolean,\r\n    default: false\r\n  },\r\n  displaySystem: {\r\n    type: String,\r\n    default: () => MEASUREMENT_SYSTEM.IMPERIAL,\r\n    validator: (val) => Object.keys(MEASUREMENT_SYSTEM).includes(val)\r\n  }\r\n});\r\n\r\nconst tearSheetProductSku = ref(props.product?.sku);\r\nconst showPrice = computed(() => tearSheetProductSku.value.price && props.isAuthenticated);\r\nconst availabilityUpdatedTimeAgo = new Date().toLocaleDateString();\r\nconst tearSheetImages = computed(() => tearSheetProductSku.value?.tearsheetMedia || []);\r\n\r\nconst tearSheetProductSpec = computed(() => {\r\n  let sku = tearSheetProductSku.value;\r\n  let specs = [];\r\n  if (sku?.dimensionsImperial) specs.push({ label: \"Overall Dimensions\", value: sku.dimensionsImperial });\r\n  if (sku?.colors) specs.push({ label: \"Colors\", value: sku.colors });\r\n  if (sku?.materials) specs.push({ label: \"Materials\", value: sku.materials });\r\n  if (sku?.hasPerformanceFabric) specs.push({ label: \"Fabric\", value: \"Performance\" });\r\n  if (sku?.weightPounds) specs.push({ label: \"Weight\", value: sku.weightPounds, unit: MEASUREMENT_UNITS.POUND });\r\n  if (sku?.volumeCubicFeet) specs.push({ label: \"Volume\", value: sku.volumeCubicFeet, unit: MEASUREMENT_UNITS.CUBIC_FOOT });\r\n  return specs;\r\n});\r\n\r\nonMounted(() => {\r\n  print();\r\n});\r\n</script>\r\n\r\n<template>\r\n  <table>\r\n    <tr>\r\n      <td class=\"w-1/3 align-top\">\r\n        <section class=\"grid grid-cols-2 gap-3\">\r\n          <template v-for=\"(productImage, index) in tearSheetImages\" :key=\"index\">\r\n            <img\r\n              :class=\"{ 'col-span-2': index === 0 }\"\r\n              class=\"mb-3 border border-solid border-neutral-30\"\r\n              :src=\"productImage.largeUrl\"\r\n              :alt=\"productImage.altText\"\r\n            />\r\n          </template>\r\n        </section>\r\n      </td>\r\n      <td class=\"w-1/2 align-top\">\r\n        <section class=\"tearsheet pl-7 text-neutral-50\">\r\n          <!-- eyebrowText NAME -->\r\n          <div v-if=\"tearSheetProductSku?.eyebrowText\" class=\"text-body-sm font-medium md:w-full mb-f1 text-neutral-50\">\r\n            {{ tearSheetProductSku.eyebrowText }}\r\n          </div>\r\n          <h1 class=\"text-5xl text-neutral-70\">{{ props.product.name }}</h1>\r\n          <section class=\"text-body mb-f1\">\r\n            <span v-if=\"tearSheetProductSku.name\">{{ tearSheetProductSku.name }}&nbsp;&bull;&nbsp;</span>\r\n            <span>{{ tearSheetProductSku.skuNumber }}</span>\r\n          </section>\r\n          <section v-if=\"showPrice\" class=\"mt-f3 flex items-center gap-f3 text-neutral-70\">\r\n            <div class=\"text-f-3xl-5xl\" :class=\"{ 'text-brand-red': tearSheetProductSku.isDiscounted }\">\r\n              <span v-if=\"props.isCADPrice && !props.isAdmin\">CAD</span>{{ formatPrice(tearSheetProductSku.price) }}\r\n            </div>\r\n            <div\r\n              v-if=\"tearSheetProductSku.isDiscounted && tearSheetProductSku.originalPrice\"\r\n              class=\"text-f-3xl-5xl line-through\"\r\n              :class=\"{ 'hidden md:block': tearSheetProductSku.secondaryPrice }\"\r\n            >\r\n              <span v-if=\"props.isCADPrice && !props.isAdmin\">CAD</span>{{ formatPrice(tearSheetProductSku.originalPrice) }}\r\n            </div>\r\n          </section>\r\n          <section class=\"my-5\">\r\n            <h3 class=\"text-md mb-2 inline-block border-b border-b-slate pb-1 font-bold text-neutral-70\">Overview</h3>\r\n            <div>{{ tearSheetProductSku.description }}</div>\r\n          </section>\r\n          <section>\r\n            <h3 class=\"text-md mb-2 inline-block border-b border-b-slate pb-1 font-bold text-neutral-70\">Details</h3>\r\n            <div v-for=\"spec in tearSheetProductSpec\" :key=\"spec.label\" class=\"text-body spec-list mb-2\">\r\n              <FhProductDetailSpec v-bind=\"spec\" :display-system=\"props.displaySystem\" />\r\n            </div>\r\n          </section>\r\n          <section v-if=\"props.isAuthenticated\" class=\"mt-8 w-full border border-solid border-neutral-30 bg-neutral-10 p-f2\">\r\n            <div v-if=\"tearSheetProductSku.availabilityDescription\">\r\n              <div\r\n                v-if=\"tearSheetProductSku.availabilityDescription\"\r\n                class=\"font-semibold text-neutral-70\"\r\n                v-html=\"tearSheetProductSku.availabilityDescription.replaceAll('strong', 'span')\"\r\n              ></div>\r\n              <div v-if=\"availabilityUpdatedTimeAgo\">As of {{ availabilityUpdatedTimeAgo }}</div>\r\n            </div>\r\n          </section>\r\n        </section>\r\n      </td>\r\n    </tr>\r\n  </table>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.spec-list {\r\n  line-height: 14pt;\r\n  &::v-deep(span:first-child) {\r\n    @apply block font-bold text-neutral-70;\r\n  }\r\n  &::v-deep(span:last-child) {\r\n    @apply block;\r\n  }\r\n}\r\n\r\n.tearsheet {\r\n  line-height: 14pt;\r\n}\r\n</style>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhWysiwyg from \"@/includes/FhWysiwyg.vue\";\r\n\r\nconst props = defineProps({\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { item } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <!-- item ITEM -->\r\n  <div :class=\"['-mx-f5 flex flex-col md:flex-row lg:mx-auto', item.layout === 'imageRight' ? 'md:flex-row-reverse' : '']\">\r\n    <div class=\"fhTestimonial__image relative box-border min-w-[50%] md:flex-[1_1_0]\">\r\n      <img :src=\"item.image\" class=\"absolute inset-0 h-full w-full object-cover object-center\" :alt=\"item.imageAltText\" />\r\n    </div>\r\n    <div class=\"relative box-border flex min-w-[50%] flex-col items-start justify-center bg-limestone py-f5 px-f5 md:flex-[1_1_0] lg:px-f12.5\">\r\n      <FhWysiwyg>\r\n        <!-- eslint-disable-next-line vue/no-v-html -->\r\n        <div class=\"quote mb-f3 text-f-base-4xl\" v-html=\"item.quote\"></div>\r\n      </FhWysiwyg>\r\n      <div class=\"mb-1 text-f-sm-xl\">{{ item.firstName }} {{ item.lastName }}</div>\r\n      <div class=\"text-f-xs-sm text-neutral-opacity-60\">{{ item.role }}</div>\r\n      <div v-if=\"item.logo\" class=\"absolute bottom-f5 right-f4 flex h-14 w-16 items-center justify-center lg:h-28 lg:w-32\">\r\n        <img :src=\"item.logo\" :alt=\"item.logoAltText\" class=\"max-h-auto max-w-full\" />\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.quote {\r\n  position: relative;\r\n  &::before {\r\n    @apply absolute top-0 left-[-0.5rem] md:left-[-0.75rem] lg:left-[-1rem];\r\n    content: open-quote;\r\n  }\r\n  &::after {\r\n    @apply inline;\r\n    content: close-quote;\r\n  }\r\n}\r\n\r\n.fhTestimonial__image::after {\r\n  content: '';\r\n  display: block;\r\n  padding-top: calc((3 / 4) * 100%);\r\n}\r\n</style>\r\n","<script setup>\r\nimport { useViewportSizes } from \"../composables\";\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhTabs from \"./FhTabs.vue\";\r\nimport FhTestimonial from \"./FhTestimonial.vue\";\r\nimport { ref } from \"vue\";\r\n\r\nconst props = defineProps({\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { testimonials } = getDataRefs(props.data);\r\nlet { isSm } = useViewportSizes();\r\nconst selectedIndex = ref(0);\r\nconst updateTab = (index) => (selectedIndex.value = index);\r\n</script>\r\n\r\n<template>\r\n  <FhTabs :align=\"[isSm ? 'left' : 'center', 'left']\" :selected-index=\"selectedIndex\" @change=\"updateTab\">\r\n    <template v-for=\"testimonial in testimonials\" :key=\"testimonial.id\" #[`trigger-${testimonial.id}`]>\r\n      {{ testimonial.tabTitle }}\r\n    </template>\r\n    <template v-for=\"testimonial in testimonials\" :key=\"testimonial.id\" #[`content-${testimonial.id}`]>\r\n      <FhTestimonial :data=\"{ item: testimonial }\"></FhTestimonial>\r\n    </template>\r\n  </FhTabs>\r\n</template>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { heading, downloadLabel, downloadUrl, downloadTarget, tipsCopy } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection :base=\"style.base\">\r\n    <!-- PRODUCT SUPPORT -->\r\n    <div class=\"mb-f4 flex flex-col border-b border-solid border-neutral-70 border-opacity-10 pb-10 text-neutral-70 md:pb-f10\">\r\n      <FhHeading tag=\"h2\">{{ heading }}</FhHeading>\r\n      <div v-if=\"downloadLabel\" class=\"mb-8\">\r\n        <a :href=\"downloadUrl\" :aria-label=\"downloadLabel\" :target=\"downloadTarget\" class=\"mb-2 inline-flex font-bold\" download>\r\n          <span\r\n            :class=\"`pr-3 after:-mr-3 after:inline-block after:h-[12px] after:w-[12px] after:bg-[url('/src/assets/icons/icon-download.svg')] after:bg-contain after:bg-center after:content-['']`\"\r\n          >\r\n            <span class=\"underline\">\r\n              {{ downloadLabel }}\r\n            </span>\r\n            &nbsp;&nbsp;\r\n          </span>\r\n        </a>\r\n      </div>\r\n      <div class=\"md:grid md:grid-cols-7\">\r\n        <!-- eslint-disable-next-line vue/no-v-html -->\r\n        <div class=\"last:mb-0 md:col-span-5 md:mb-10\" v-html=\"tipsCopy\"></div>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { date, location, title } = getDataRefs(props.data);\r\n\r\nconst convertedDate = computed(() => {\r\n  //convert html entities to text w/o using v-html\r\n  if (!date.value) return false;\r\n  const ta = document.createElement(\"textarea\");\r\n  ta.innerHTML = date.value;\r\n  return ta.textContent;\r\n});\r\nconst convertedLocation = computed(() => {\r\n  //convert html entities to text w/o using v-html\r\n  //convert html entities to text w/o using v-html\r\n  if (!location.value) return false;\r\n  const ta = document.createElement(\"textarea\");\r\n  ta.innerHTML = location.value;\r\n  return ta.textContent;\r\n});\r\nconst convertedTitle = computed(() => {\r\n  //convert html entities to text w/o using v-html\r\n  const ta = document.createElement(\"textarea\");\r\n  ta.innerHTML = title.value;\r\n  return ta.textContent;\r\n});\r\n</script>\r\n\r\n<template>\r\n  <FhSection :base=\"style.base\">\r\n    <div class=\"flex flex-col items-center gap-f3 text-center\">\r\n      <p class=\"text-f-sm-base text-neutral-60 md:-mb-4\">\r\n        <span v-if=\"date\">{{ convertedDate }}</span>\r\n        <span v-if=\"date && location\"> &mdash; </span>\r\n        <span v-if=\"location\">{{ convertedLocation }}</span>\r\n      </p>\r\n      <h1 class=\"mb-f10 w-full whitespace-pre-line font-serif text-f-4xl-9xl font-light leading-[1.125]\">{{ convertedTitle }}</h1>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  userType: {\r\n    type: String,\r\n    required: false,\r\n    default: \"\"\r\n  }\r\n});\r\n\r\nconst { heading, fields } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection :base=\"style.base\">\r\n    <!-- MY ACCOUNT COMPANY -->\r\n    <div class=\"mb-f10 flex flex-col md:border-b md:border-solid md:border-neutral-70 md:border-opacity-10 md:pb-f10\">\r\n      <FhHeading tag=\"h2\">{{ heading }}</FhHeading>\r\n      <template v-if=\"userType !== 'customerGuest'\">\r\n        <div v-for=\"(item, i) in fields\" :key=\"i\" class=\"mb-4 flex flex-col md:mb-2 md:flex-row\">\r\n          <span class=\"mb-0.5 text-f-sm-base font-bold md:mb-0 md:basis-4/12 lg:basis-3/12\">\r\n            {{ item[0] }}\r\n          </span>\r\n          <span class=\"whitespace-pre-line text-neutral-50\">{{ item[1] }}</span>\r\n        </div>\r\n      </template>\r\n      <template v-else>\r\n        <div class=\"mb-4 flex flex-col md:mb-2 md:flex-row\">\r\n          <p class=\"mb-0.5 text-f-sm-base md:mb-0 md:basis-8/12 lg:basis-7/12\">\r\n            A guest account has been created for you by a Four Hands customer. With this account, you can browse the entire Four Hands catalog anytime you'd\r\n            like.\r\n            <br /><br />\r\n            If you have any questions, please reach out to the Four Hands customer who created this account.\r\n          </p>\r\n        </div>\r\n      </template>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n","import axiosClient from \"./axiosClient\";\r\nimport { useMutation } from \"@tanstack/vue-query\";\r\n\r\nexport function useSubmitTradeApplicationMutation(options) {\r\n  return useMutation({\r\n    ...(options || {}),\r\n    mutationFn: (data) => axiosClient.post(\"/trade_application\", data)\r\n  });\r\n}\r\n","<script setup>\r\nimport { computed, ref, onMounted } from \"vue\";\r\n\r\nconst props = defineProps({\r\n  step: {\r\n    type: Number,\r\n    required: true\r\n  },\r\n  total: {\r\n    type: Number,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst barWidth = computed(() => {\r\n  return `${(props.step / props.total) * 100}%`;\r\n});\r\n\r\nconst mounted = ref(false);\r\nonMounted(() => {\r\n  setTimeout(() => (mounted.value = true), 400);\r\n});\r\n</script>\r\n\r\n<template>\r\n  <div class=\"z-10 mb-f5 flex flex-col gap-f2 bg-white pb-f3\">\r\n    <h6 id=\"tpaProgressBarLabel\">Trade Application</h6>\r\n    <div\r\n      role=\"progressbar\"\r\n      aria-labelledby=\"tpaProgressBarLabel\"\r\n      aria-valuetext=\"current page\"\r\n      aria-valuemin=\"1\"\r\n      :aria-valuemax=\"step\"\r\n      :aria-valuenow=\"total\"\r\n      :class=\"{ mounted }\"\r\n    ></div>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n[role=\"progressbar\"] {\r\n  @apply bg-neutral-opacity-10 flex h-px;\r\n\r\n  &.mounted {\r\n    &::before {\r\n      width: v-bind(\"barWidth\");\r\n    }\r\n  }\r\n\r\n  &::before {\r\n    @apply bg-neutral-70;\r\n    content: '';\r\n    width: 0;\r\n    transition: width 0.35s ease;\r\n  }\r\n}\r\n</style>\r\n","<script setup>\r\nimport { computed, onMounted } from \"vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhOptionCard from \"@/components/FhOptionCard.vue\";\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"navigate\"]);\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: String,\r\n    default: null,\r\n    validator: (val) => typeof val === \"string\" || val === null\r\n  },\r\n  model: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  options: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\nconst modelProperties = computed(() => props.model);\r\n\r\nconst nextPage = () => {\r\n  let pageValue = 4;\r\n\r\n  if (value.value === \"commercial-design\") {\r\n    pageValue = 2;\r\n  } else if (value.value === \"residential-design\") {\r\n    modelProperties.value.primaryProject.primaryProjectType = \"residential-design\";\r\n    pageValue = 3;\r\n  } else if (value.value === \"e-commerce\") {\r\n    modelProperties.value.businessDetails.social.website.selected = true;\r\n  }\r\n\r\n  emit(\"navigate\", pageValue);\r\n};\r\n\r\nonMounted(() => {\r\n  if (modelProperties.value.primaryProject.primaryProjectType !== null) {\r\n    modelProperties.value.primaryProject.primaryProjectType = null;\r\n    modelProperties.value.primaryProject.primaryProjectTypeOther = \"\";\r\n  }\r\n\r\n  if (modelProperties.value.projectType.projectTypeOther.length > 0) {\r\n    modelProperties.value.projectType.projectTypeOther = [];\r\n    modelProperties.value.projectType.projectTypeOtherOther = \"\";\r\n  }\r\n});\r\n\r\nconst allowNext = computed(() => !!value.value);\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col\">\r\n    <FhHeading\r\n      heading=\"Select your primary business\"\r\n      subheading=\"Please select the response that most closely aligns with your main business model. You'll have the option of adding on other services you provide in the next question.\"\r\n    />\r\n    <div class=\"grid grid-cols-2 gap-f3 lg:grid-cols-3\">\r\n      <FhOptionCard\r\n        v-for=\"option in options\"\r\n        :key=\"option.value\"\r\n        v-model=\"value\"\r\n        :value=\"option.value\"\r\n        :label=\"option.label\"\r\n        type=\"radio\"\r\n        layout=\"column\"\r\n        class=\"cb-grid__item\"\r\n      />\r\n    </div>\r\n    <div class=\"mt-f8 flex flex-col justify-center gap-6 md:self-end\">\r\n      <FhButton :disabled=\"!allowNext\" color=\"primary\" @click=\"nextPage\">Continue</FhButton>\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed, watch, onMounted } from \"vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, requiredIf, maxLength } from \"@vuelidate/validators\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhOptionCard from \"@/components/FhOptionCard.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport TransitionExpand from \"@/transitions/TransitionExpand.vue\";\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"navigate\"]);\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: Object,\r\n    default: null\r\n  },\r\n  model: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  options: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\nconst modelProperties = computed(() => props.model);\r\n\r\nconst primaryProjectTypeOtherRequired = computed(() => {\r\n  return value.value.primaryProjectType === \"commercial-specialty\";\r\n});\r\n\r\nwatch(primaryProjectTypeOtherRequired, (val) => {\r\n  if (val) return;\r\n  value.value.primaryProjectTypeOther = \"\";\r\n});\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    primaryProjectType: {\r\n      required: helpers.withMessage(\r\n        \"An option must be selected\",\r\n        requiredIf(() => value.value.primaryProjectType == null)\r\n      )\r\n    },\r\n    primaryProjectTypeOther: {\r\n      requiredIf: helpers.withMessage(\"Please describe what types of projects you work on.\", requiredIf(primaryProjectTypeOtherRequired)),\r\n      maxLength: helpers.withMessage(\"Character limit exceeded, please shorten your entry.\", maxLength(255))\r\n    }\r\n  },\r\n  value\r\n);\r\n\r\nonMounted(() => {\r\n  if (modelProperties.value.projectType.projectTypeOther.length > 0) {\r\n    modelProperties.value.projectType.projectTypeOther = [];\r\n    modelProperties.value.projectType.projectTypeOtherOther = \"\";\r\n  }\r\n});\r\n\r\nconst { isSm } = useViewportSizes();\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col\">\r\n    <FhHeading heading=\"What commercial design projects does your business do most?\" subheading=\"Select only one.\" />\r\n    <div class=\"grid grid-cols-2 gap-f3 lg:grid-cols-3\">\r\n      <FhOptionCard\r\n        v-for=\"option in options\"\r\n        :key=\"option.value\"\r\n        v-model=\"value.primaryProjectType\"\r\n        :value=\"option.value\"\r\n        :label=\"option.label\"\r\n        type=\"radio\"\r\n        layout=\"column\"\r\n        class=\"cb-grid__item\"\r\n      />\r\n    </div>\r\n    <TransitionExpand>\r\n      <FhInput\r\n        v-if=\"primaryProjectTypeOtherRequired\"\r\n        v-model=\"value.primaryProjectTypeOther\"\r\n        label=\"If other, please describe\"\r\n        :wrapper-attrs=\"{ class: 'mt-4 lg:col-span-3' }\"\r\n        required\r\n        :vuelidate=\"vuelidate.primaryProjectTypeOther\"\r\n      />\r\n    </TransitionExpand>\r\n\r\n    <div class=\"mt-f8 flex items-center gap-f3 md:self-end\">\r\n      <FhButton :variant=\"isSm ? false : 'text'\" :class=\"{ 'flex-1': isSm }\" @click=\"emit('navigate', -1)\">Back</FhButton>\r\n      <FhButton :disabled=\"vuelidate.$invalid\" color=\"primary\" :class=\"{ 'flex-1': isSm }\" @click=\"emit('navigate', 3)\">Continue</FhButton>\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed, watch } from \"vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, requiredIf, maxLength } from \"@vuelidate/validators\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhOptionCard from \"@/components/FhOptionCard.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport TransitionExpand from \"@/transitions/TransitionExpand.vue\";\r\nimport { useViewportSizes } from \"@/composables\";\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"navigate\"]);\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: Object,\r\n    default: null\r\n  },\r\n  model: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  options: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\n// Compute the page to return to when the \"Back\" link is clicked, based on where they came from\r\nconst prevPage = computed(() => (props.model.primaryBusiness == \"commercial-design\" ? 2 : 1));\r\n\r\nconst projectTypeOtherOtherRequired = computed(() => {\r\n  return value.value.projectTypeOther.includes(\"commercial-specialty\");\r\n});\r\n\r\nwatch(projectTypeOtherOtherRequired, (val) => {\r\n  if (val) return;\r\n  value.value.projectTypeOtherOther = \"\";\r\n});\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    projectTypeOtherOther: {\r\n      requiredIf: helpers.withMessage(\"Please describe what types of projects you work on.\", requiredIf(projectTypeOtherOtherRequired)),\r\n      maxLength: helpers.withMessage(\"Character limit exceeded, please shorten your entry.\", maxLength(255))\r\n    }\r\n  },\r\n  value\r\n);\r\n\r\nconst { isSm } = useViewportSizes();\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col\">\r\n    <FhHeading\r\n      heading=\"Select any other types of design projects you work on.\"\r\n      subheading=\"Select all that apply. If none are applicable, do not select any.\"\r\n    />\r\n    <div class=\"grid grid-cols-2 gap-f3 lg:grid-cols-3\">\r\n      <FhOptionCard\r\n        v-for=\"option in options\"\r\n        :key=\"option.value\"\r\n        v-model=\"value.projectTypeOther\"\r\n        :value=\"option.value\"\r\n        :label=\"option.label\"\r\n        type=\"checkbox\"\r\n        layout=\"column\"\r\n        class=\"cb-grid__item\"\r\n      />\r\n    </div>\r\n    <TransitionExpand>\r\n      <FhInput\r\n        v-if=\"projectTypeOtherOtherRequired\"\r\n        v-model=\"value.projectTypeOtherOther\"\r\n        label=\"If other, please describe\"\r\n        :wrapper-attrs=\"{ class: 'mt-4 lg:col-span-3' }\"\r\n        required\r\n        :vuelidate=\"vuelidate.projectTypeOtherOther\"\r\n      />\r\n    </TransitionExpand>\r\n    <div class=\"mt-f8 flex items-center gap-f3 md:self-end\">\r\n      <FhButton :variant=\"isSm ? false : 'text'\" :class=\"{ 'flex-1': isSm }\" @click=\"emit('navigate', prevPage)\">Back</FhButton>\r\n      <FhButton :disabled=\"vuelidate.$invalid\" color=\"primary\" :class=\"{ 'flex-1': isSm }\" @click=\"emit('navigate', 4)\">Continue</FhButton>\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { computed, watch } from \"vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, required, maxLength } from \"@vuelidate/validators\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport COUNTRIES from \"@/constants/countries\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhSelect from \"@/components/FhSelect.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  model: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\n// Compute the page to return to when the \"Back\" link is clicked, based on where they came from\r\nconst prevPage = computed(() => (props.model.primaryBusiness == \"commercial-design\" || props.model.primaryBusiness == \"residential-design\" ? 3 : 1));\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"navigate\"]);\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\nconst countryOptions = Object.keys(COUNTRIES).map((key) => ({ value: key, text: COUNTRIES[key].name }));\r\n\r\nconst hasStateOptions = computed(() => {\r\n  return value.value.registeredLocation === \"US\" || value.value.registeredLocation === \"CA\";\r\n});\r\nconst country = computed(() => COUNTRIES[value.value.registeredLocation]);\r\nconst stateLabel = computed(() => country.value.stateName ?? \"State/Province/Region\");\r\nconst stateOptions = computed(() =>\r\n  country.value.states ? Object.keys(country.value.states).map((key) => ({ value: key, text: country.value.states[key] })) : []\r\n);\r\nconst postalCodeLabel = computed(() => country.value.postalCodeName ?? \"Postal Code\");\r\nconst postalCodeRegex = computed(() => country.value.postalCodeRegex);\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    name: {\r\n      required: helpers.withMessage(\"Please enter a business name.\", required),\r\n      maxLength: helpers.withMessage(\"Please keep your entry to no more than 30 characters.\", maxLength(30))\r\n    },\r\n    registeredLocation: { required: helpers.withMessage(\"Please select a country.\", required) },\r\n    address1: {\r\n      required: helpers.withMessage(\"Please enter an address.\", required),\r\n      maxLength: helpers.withMessage(\"Please keep your entry to no more than 30 characters.\", maxLength(30))\r\n    },\r\n    address2: {\r\n      maxLength: helpers.withMessage(\"Please keep your entry to no more than 30 characters.\", maxLength(30))\r\n    },\r\n    city: {\r\n      required: helpers.withMessage(\"Please enter a city.\", required),\r\n      maxLength: helpers.withMessage(\"Please keep your entry to no more than 40 characters.\", maxLength(40))\r\n    },\r\n    state: {\r\n      required: helpers.withMessage(\r\n        () => (hasStateOptions.value ? `Please select a ${stateLabel.value.toLowerCase()}.` : `Please enter a ${stateLabel.value.toLowerCase()}.`),\r\n        required\r\n      )\r\n    },\r\n    zip: {\r\n      required: helpers.withMessage(() => `Please enter a ${postalCodeLabel.value.toLowerCase()}.`, required),\r\n      validPostalCode: helpers.withMessage(\r\n        () => `Please enter a valid ${postalCodeLabel.value.toLowerCase()}.`,\r\n        (value) => !helpers.req(value) || !postalCodeRegex.value || postalCodeRegex.value.test(value)\r\n      )\r\n    }\r\n  },\r\n  value\r\n);\r\n\r\nwatch(\r\n  () => value.value.registeredLocation,\r\n  (newVal, oldVal) => {\r\n    if (newVal !== oldVal) {\r\n      // Reset state value\r\n      value.value.state = \"\";\r\n\r\n      // Trigger validation\r\n      vuelidate.state.$touch();\r\n    }\r\n  }\r\n);\r\n\r\nconst { isSm } = useViewportSizes();\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col\">\r\n    <FhHeading heading=\"Business Contact Details\" subheading=\"Please enter your business contact information.\" />\r\n    <div class=\"grid grid-cols-1 gap-x-f3 gap-y-f4 lg:grid-cols-2\">\r\n      <FhInput v-model=\"value.name\" label=\"Business Name\" required :vuelidate=\"vuelidate.name\" :wrapper-attrs=\"{ class: 'lg:col-span-2' }\" />\r\n      <FhSelect\r\n        v-model=\"value.registeredLocation\"\r\n        label=\"Country\"\r\n        :options=\"countryOptions\"\r\n        required\r\n        :vuelidate=\"vuelidate.registeredLocation\"\r\n        :wrapper-attrs=\"{ class: 'lg:col-span-2' }\"\r\n      />\r\n      <FhInput v-model=\"value.address1\" label=\"Address Line 1\" required :vuelidate=\"vuelidate.address1\" :wrapper-attrs=\"{ class: 'lg:col-span-2' }\" />\r\n      <FhInput v-model=\"value.address2\" label=\"Address Line 2\" :vuelidate=\"vuelidate.address2\" :wrapper-attrs=\"{ class: 'lg:col-span-2' }\" />\r\n      <FhInput v-model=\"value.city\" label=\"City\" required :vuelidate=\"vuelidate.city\" />\r\n      <component\r\n        :is=\"hasStateOptions ? FhSelect : FhInput\"\r\n        v-model=\"value.state\"\r\n        :options=\"stateOptions\"\r\n        :label=\"stateLabel\"\r\n        required\r\n        :vuelidate=\"vuelidate.state\"\r\n      />\r\n      <FhInput v-model=\"value.zip\" :label=\"postalCodeLabel\" required :vuelidate=\"vuelidate.zip\" />\r\n    </div>\r\n    <div class=\"mt-f8 flex items-center gap-f3 md:self-end\">\r\n      <FhButton :variant=\"isSm ? false : 'text'\" :class=\"{ 'flex-1': isSm }\" @click=\"emit('navigate', prevPage)\">Back</FhButton>\r\n      <FhButton :disabled=\"vuelidate.$invalid\" color=\"primary\" :class=\"{ 'flex-1': isSm }\" @click=\"emit('navigate', 5)\">Continue</FhButton>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { computed, onMounted, watch } from \"vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, requiredIf, required, maxLength } from \"@vuelidate/validators\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhCheckbox from \"@/components/FhCheckbox.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhOptionGroup from \"@/components/FhOptionGroup.vue\";\r\nimport FhSelect from \"@/components/FhSelect.vue\";\r\nimport FhTextarea from \"@/components/FhTextarea.vue\";\r\nimport FhRadio from \"@/components/FhRadio.vue\";\r\nimport TransitionExpand from \"@/transitions/TransitionExpand.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  model: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"navigate\"]);\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\nconst isRetail = computed(() => {\r\n  return props.model.primaryBusiness === \"retailer\";\r\n});\r\n\r\nconst isNotCommercialorResidential = computed(() => {\r\n  return props.model.primaryBusiness === \"retailer\" || props.model.primaryBusiness.includes(\"e-commerce\");\r\n});\r\n\r\nconst isEcommerce = computed(() => {\r\n  return props.model.primaryBusiness === \"e-commerce\";\r\n});\r\n\r\nconst servicesOtherRequired = computed(() => {\r\n  return value.value.services.includes(\"OTHER (please describe)\");\r\n});\r\n\r\nwatch(servicesOtherRequired, (val) => {\r\n  if (val) return;\r\n  value.value.servicesOther = \"\";\r\n});\r\n\r\nonMounted(() => {\r\n  if (!isNotCommercialorResidential.value) {\r\n    value.value.services = [];\r\n    value.value.servicesOther = \"\";\r\n    value.value.brands = \"\";\r\n  }\r\n\r\n  if (!isRetail.value) {\r\n    value.value.locations = \"\";\r\n  }\r\n\r\n  if (!servicesOtherRequired.value) {\r\n    value.value.servicesOther = \"\";\r\n  }\r\n\r\n  if (!value.value.social.website.selected) {\r\n    value.value.websiteEcommCapable = null;\r\n  }\r\n\r\n  if (isEcommerce.value) {\r\n    value.value.websiteEcommCapable = true;\r\n  }\r\n});\r\n\r\nconst validatedState = computed(() => {\r\n  return {\r\n    ...value.value,\r\n    isAtLeastOneSocialSelected: computed(() => Object.values(value.value.social).some((item) => item.selected))\r\n  };\r\n});\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    locations: { requiredIf: helpers.withMessage(\"Please select a number of locations.\", requiredIf(isRetail)) },\r\n    revenue: { required: helpers.withMessage(\"Please select your annual revenue.\", required) },\r\n    staff: { required: helpers.withMessage(\"Please select the number of designers and/or sales people you have on staff.\", required) },\r\n    servicesOther: {\r\n      requiredIf: helpers.withMessage(\"Please enter other services offered.\", requiredIf(servicesOtherRequired)),\r\n      maxLength: helpers.withMessage(\"Character limit exceeded, please shorten your entry.\", maxLength(32768))\r\n    },\r\n    description: {\r\n      required: helpers.withMessage(\"Please enter information about your business.\", required),\r\n      maxLength: helpers.withMessage(\"Character limit exceeded, please shorten your entry.\", maxLength(32768))\r\n    },\r\n    brands: {\r\n      requiredIf: helpers.withMessage(\"Please enter key brands you carry.\", requiredIf(isNotCommercialorResidential)),\r\n      maxLength: helpers.withMessage(\"Character limit exceeded, please shorten your entry.\", maxLength(32768))\r\n    },\r\n    social: {\r\n      website: {\r\n        user: {\r\n          requiredIf: helpers.withMessage(\r\n            \"Please enter a website URL.\",\r\n            requiredIf(() => value.value.social.website.selected)\r\n          ),\r\n          maxLength: helpers.withMessage(\"Character limit exceeded, please shorten your entry.\", maxLength(255)),\r\n          validWebsite: helpers.withMessage(\r\n            \"Please enter a valid website URL.\",\r\n            helpers.regex(\r\n              /^((ftp|http|https):\\/\\/)?(www.)?(?![a-zA-Z0-9_.-]*(ftp|http|https|www\\.))[a-zA-Z0-9_.-]+(\\.[a-zA-Z]{2,62})+((\\/)[\\w#]+)*(\\/\\w+\\?[a-zA-Z0-9_]+=\\w+(&[a-zA-Z0-9_]+=\\w+)*)?$/\r\n            )\r\n          )\r\n        }\r\n      },\r\n      instagram: {\r\n        user: {\r\n          requiredIf: helpers.withMessage(\r\n            \"Please enter Instagram handle.\",\r\n            requiredIf(() => value.value.social.instagram.selected)\r\n          ),\r\n          maxLength: helpers.withMessage(\"Character limit exceeded, please shorten your entry.\", maxLength(255))\r\n        }\r\n      },\r\n      facebook: {\r\n        user: {\r\n          requiredIf: helpers.withMessage(\r\n            \"Please enter Facebook page.\",\r\n            requiredIf(() => value.value.social.facebook.selected)\r\n          ),\r\n          maxLength: helpers.withMessage(\"Character limit exceeded, please shorten your entry.\", maxLength(255))\r\n        }\r\n      },\r\n      pinterest: {\r\n        user: {\r\n          requiredIf: helpers.withMessage(\r\n            \"Please enter Pinterest handle.\",\r\n            requiredIf(() => value.value.social.pinterest.selected)\r\n          ),\r\n          maxLength: helpers.withMessage(\"Character limit exceeded, please shorten your entry.\", maxLength(255))\r\n        }\r\n      },\r\n      other: {\r\n        network: {\r\n          requiredIf: helpers.withMessage(\r\n            \"Please enter other social platform.\",\r\n            requiredIf(() => value.value.social.other.selected)\r\n          ),\r\n          maxLength: helpers.withMessage(\"Character limit exceeded, please shorten your entry.\", maxLength(50))\r\n        },\r\n        user: {\r\n          requiredIf: helpers.withMessage(\r\n            \"Please enter other social platform handle.\",\r\n            requiredIf(() => value.value.social.other.selected)\r\n          ),\r\n          maxLength: helpers.withMessage(\"Character limit exceeded, please shorten your entry.\", maxLength(200))\r\n        }\r\n      }\r\n    },\r\n    isAtLeastOneSocialSelected: {\r\n      required: helpers.withMessage(\"Please select at least one social network.\", (val) => val === true)\r\n    },\r\n    websiteEcommCapable: {\r\n      requiredIf: helpers.withMessage(\r\n        \"Please select Yes or No.\",\r\n        requiredIf(() => value.value.social.website.selected && !isEcommerce.value)\r\n      )\r\n    }\r\n  },\r\n  validatedState\r\n);\r\n\r\nconst locations = [\r\n  [\"1-2\", \"1-2\"],\r\n  [\"3-5\", \"3-5\"],\r\n  [\"6+\", \"6+\"]\r\n];\r\n\r\nconst revenue = [\r\n  [\"< $500K\", \"<$500K\"],\r\n  [\"$500K-$1M\", \"$500K-$1M\"],\r\n  [\"$1M-$5M\", \"$1M-$5M\"],\r\n  [\"$5M-$10M\", \"$5M-$10M\"],\r\n  [\"$10M+\", \"$10M+\"]\r\n];\r\n\r\nconst numberStaff = [\r\n  [\"1-2\", \"1-2\"],\r\n  [\"3-5\", \"3-5\"],\r\n  [\"6-10\", \"6-10\"],\r\n  [\"10+\", \"10+\"]\r\n];\r\n\r\nconst services = [\r\n  {\r\n    value: \"IN HOME DESIGN SERVICES\",\r\n    label: \"Design Services\"\r\n  },\r\n  {\r\n    value: \"TRADE PROGRAM\",\r\n    label: \"Trade program\"\r\n  },\r\n  {\r\n    value: \"OTHER (please describe)\",\r\n    label: \"Other\"\r\n  }\r\n];\r\n\r\nconst { isSm } = useViewportSizes();\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col\">\r\n    <FhHeading heading=\"Business details\" subheading=\"Please tell us more about your business.\" />\r\n    <div class=\"flex flex-col gap-f4\">\r\n      <div class=\"flex flex-col gap-f4 lg:flex-row lg:gap-f3\">\r\n        <FhSelect\r\n          v-if=\"isRetail\"\r\n          v-model=\"value.locations\"\r\n          label=\"How many locations do you have?\"\r\n          :options=\"locations\"\r\n          required\r\n          :vuelidate=\"vuelidate.locations\"\r\n          :wrapper-attrs=\"{ class: 'flex-1' }\"\r\n        />\r\n        <FhSelect\r\n          v-model=\"value.revenue\"\r\n          label=\"What is your annual revenue?\"\r\n          :options=\"revenue\"\r\n          required\r\n          :vuelidate=\"vuelidate.revenue\"\r\n          :wrapper-attrs=\"{ class: 'flex-1' }\"\r\n        />\r\n      </div>\r\n      <FhSelect\r\n        v-model=\"value.staff\"\r\n        label=\"How many designers and/or salespeople do you have on staff?\"\r\n        :options=\"numberStaff\"\r\n        required\r\n        :vuelidate=\"vuelidate.staff\"\r\n      />\r\n      <div>\r\n        <FhOptionGroup\r\n          v-if=\"isNotCommercialorResidential\"\r\n          v-model=\"value.services\"\r\n          type=\"checkbox\"\r\n          label=\"Do you offer any additional services?\"\r\n          :options=\"services\"\r\n        />\r\n        <TransitionExpand>\r\n          <FhTextarea\r\n            v-if=\"isNotCommercialorResidential && value.services.includes('OTHER (please describe)')\"\r\n            v-model=\"value.servicesOther\"\r\n            label=\"If other, please describe\"\r\n            required\r\n            :vuelidate=\"vuelidate.servicesOther\"\r\n            :wrapper-attrs=\"{ class: 'pt-f3' }\"\r\n          />\r\n        </TransitionExpand>\r\n      </div>\r\n      <FhTextarea v-model=\"value.description\" label=\"Briefly describe your business\" required :vuelidate=\"vuelidate.description\" />\r\n      <FhTextarea\r\n        v-if=\"isNotCommercialorResidential\"\r\n        v-model=\"value.brands\"\r\n        label=\"What are the key brands you carry?\"\r\n        required\r\n        :vuelidate=\"vuelidate.brands\"\r\n      />\r\n      <fieldset\r\n        :aria-required=\"true\"\r\n        :aria-invalid=\"vuelidate.isAtLeastOneSocialSelected.$error\"\r\n        :aria-errormessage=\"vuelidate.isAtLeastOneSocialSelected.$error ? 'socialErrorMessage' : null\"\r\n      >\r\n        <legend class=\"mb-f2 flex flex-row flex-wrap items-baseline gap-f1\">\r\n          <span>Please provide your current online presence. Select all that apply.</span>\r\n          <span class=\"text-body-xs text-neutral-50\">(Required)</span>\r\n        </legend>\r\n        <div class=\"flex flex-col gap-f2\">\r\n          <FhCheckbox\r\n            v-model=\"value.social.website.selected\"\r\n            label=\"Website URL\"\r\n            :disabled=\"isEcommerce\"\r\n            @change=\"vuelidate.isAtLeastOneSocialSelected.$touch\"\r\n          />\r\n          <FhInput\r\n            v-if=\"value.social.website.selected\"\r\n            v-model=\"value.social.website.user\"\r\n            label=\"Enter website URL\"\r\n            required\r\n            :vuelidate=\"vuelidate.social.website.user\"\r\n          />\r\n          <FhCheckbox v-model=\"value.social.instagram.selected\" label=\"Instagram\" @change=\"vuelidate.isAtLeastOneSocialSelected.$touch\" />\r\n          <FhInput\r\n            v-if=\"value.social.instagram.selected\"\r\n            v-model=\"value.social.instagram.user\"\r\n            label=\"Enter your Instagram handle\"\r\n            required\r\n            :vuelidate=\"vuelidate.social.instagram.user\"\r\n          />\r\n          <FhCheckbox v-model=\"value.social.facebook.selected\" label=\"Facebook\" @change=\"vuelidate.isAtLeastOneSocialSelected.$touch\" />\r\n          <FhInput\r\n            v-if=\"value.social.facebook.selected\"\r\n            v-model=\"value.social.facebook.user\"\r\n            label=\"Enter your Facebook page\"\r\n            required\r\n            :vuelidate=\"vuelidate.social.facebook.user\"\r\n          />\r\n          <FhCheckbox v-model=\"value.social.pinterest.selected\" label=\"Pinterest\" @change=\"vuelidate.isAtLeastOneSocialSelected.$touch\" />\r\n          <FhInput\r\n            v-if=\"value.social.pinterest.selected\"\r\n            v-model=\"value.social.pinterest.user\"\r\n            label=\"Enter your Pinterest handle\"\r\n            required\r\n            :vuelidate=\"vuelidate.social.pinterest.user\"\r\n          />\r\n          <FhCheckbox v-model=\"value.social.other.selected\" label=\"Other\" @change=\"vuelidate.isAtLeastOneSocialSelected.$touch\" />\r\n          <FhInput\r\n            v-if=\"value.social.other.selected\"\r\n            v-model=\"value.social.other.network\"\r\n            label=\"Enter name of social platform\"\r\n            required\r\n            :vuelidate=\"vuelidate.social.other.network\"\r\n          />\r\n          <FhInput\r\n            v-if=\"value.social.other.selected\"\r\n            v-model=\"value.social.other.user\"\r\n            label=\"Enter your username\"\r\n            required\r\n            :vuelidate=\"vuelidate.social.other.user\"\r\n          />\r\n        </div>\r\n        <div v-if=\"vuelidate.isAtLeastOneSocialSelected.$error\" id=\"socialErrorMessage\" class=\"text-body-sm mt-f2 text-brand-red\">\r\n          <div v-for=\"err of vuelidate.isAtLeastOneSocialSelected.$errors\" :key=\"err.$uid\">{{ err.$message }}</div>\r\n        </div>\r\n      </fieldset>\r\n      <fieldset\r\n        v-if=\"value.social.website.selected && !isEcommerce\"\r\n        :aria-required=\"value.social.website.selected && !isEcommerce\"\r\n        :aria-invalid=\"vuelidate.websiteEcommCapable.$error\"\r\n        :aria-errormessage=\"vuelidate.websiteEcommCapable.$error ? 'websiteEcommCapableErrorMessage' : null\"\r\n      >\r\n        <legend class=\"mb-f2 flex flex-row flex-wrap items-baseline gap-f1\">\r\n          <span>Do you allow customers to purchase from your website?</span>\r\n          <span class=\"text-body-xs text-neutral-50\">(Required)</span>\r\n        </legend>\r\n        <div class=\"flex flex-col gap-f2\">\r\n          <FhRadio v-model=\"value.websiteEcommCapable\" :value=\"true\">Yes</FhRadio>\r\n          <FhRadio v-model=\"value.websiteEcommCapable\" :value=\"false\">No</FhRadio>\r\n        </div>\r\n        <div v-if=\"vuelidate.websiteEcommCapable.$error\" id=\"websiteEcommCapableErrorMessage\" class=\"text-body-sm mt-f2 text-brand-red\">\r\n          <div v-for=\"err of vuelidate.websiteEcommCapable.$errors\" :key=\"err.$uid\">{{ err.$message }}</div>\r\n        </div>\r\n      </fieldset>\r\n    </div>\r\n    <div class=\"mt-f8 flex items-center gap-f3 md:self-end\">\r\n      <FhButton :variant=\"isSm ? false : 'text'\" :class=\"{ 'flex-1': isSm }\" @click=\"emit('navigate', -1)\">Back</FhButton>\r\n      <FhButton :disabled=\"vuelidate.$invalid\" color=\"primary\" :class=\"{ 'flex-1': isSm }\" @click=\"emit('navigate', 6)\">Continue</FhButton>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { computed } from \"vue\";\r\nimport { useVuelidate } from \"@vuelidate/core\";\r\nimport { helpers, required, email, sameAs, maxLength } from \"@vuelidate/validators\";\r\nimport { useViewportSizes } from \"@/composables\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhCheckbox from \"@/components/FhCheckbox.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhInputPhone from \"@/components/FhInputPhone.vue\";\r\nimport FhLink from \"@/components/FhLink.vue\";\r\n\r\nconst props = defineProps({\r\n  modelValue: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  model: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isSubmitting: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"navigate\", \"submit\"]);\r\n\r\nconst value = computed({\r\n  get: () => props.modelValue,\r\n  set: (value) => emit(\"update:modelValue\", value)\r\n});\r\n\r\nconst isCountryUSorCA = computed(() => {\r\n  return props.model.businessContact.registeredLocation === \"US\" || props.model.businessContact.registeredLocation === \"CA\";\r\n});\r\n\r\nconst phoneNumberValidation = (value) => {\r\n  if (isCountryUSorCA.value) {\r\n    return helpers.regex(/^\\([0-9]{3}\\) [0-9]{3}-[0-9]{4}$/)(value);\r\n  }\r\n  return true;\r\n};\r\n\r\nconst phoneNumberLengthValidation = (value) => {\r\n  if (!isCountryUSorCA.value) {\r\n    const phoneLength = value.length;\r\n    return phoneLength <= 15;\r\n  }\r\n  return true;\r\n};\r\n\r\nconst emailAddress = computed(() => {\r\n  return value.value.email;\r\n});\r\n\r\nconst vuelidate = useVuelidate(\r\n  {\r\n    firstName: {\r\n      required: helpers.withMessage(\"Please enter a first name.\", required),\r\n      maxLength: helpers.withMessage(\"Please keep your entry to no more than 15 characters.\", maxLength(15))\r\n    },\r\n    lastName: {\r\n      required: helpers.withMessage(\"Please enter a last name\", required),\r\n      maxLength: helpers.withMessage(\"Please keep your entry to no more than 15 characters.\", maxLength(15))\r\n    },\r\n    title: { maxLength: helpers.withMessage(\"Please keep your entry to no more than 20 characters.\", maxLength(20)) },\r\n    email: {\r\n      required: helpers.withMessage(\"Please enter an email address.\", required),\r\n      email: helpers.withMessage(\"Please enter a valid email address.\", email)\r\n    },\r\n    confirmEmail: {\r\n      required: helpers.withMessage(\"Please confirm your email address.\", required),\r\n      sameAs: helpers.withMessage(\"Email addresses do not match.\", sameAs(emailAddress))\r\n    },\r\n    terms: { sameAs: sameAs(true) },\r\n    phone: {\r\n      required: helpers.withMessage(\"Please enter a phone number.\", required),\r\n      validPhone: helpers.withMessage(\"Please enter a valid phone number.\", phoneNumberValidation),\r\n      validPhoneLength: helpers.withMessage(\"Please keep your entry to no more than 15 characters.\", phoneNumberLengthValidation)\r\n    }\r\n  },\r\n  value\r\n);\r\n\r\nconst { isSm } = useViewportSizes();\r\n</script>\r\n\r\n<template>\r\n  <div class=\"flex flex-col\">\r\n    <FhHeading\r\n      heading=\"Contact details\"\r\n      subheading=\"Enter the contact details for the person who will be managing the Four Hands account and placing orders.\"\r\n    />\r\n    <div class=\"grid grid-cols-1 items-start gap-x-f3 gap-y-f4 lg:grid-cols-2\">\r\n      <FhInput v-model=\"value.firstName\" label=\"First name\" required :vuelidate=\"vuelidate.firstName\" />\r\n      <FhInput v-model=\"value.lastName\" label=\"Last name\" required :vuelidate=\"vuelidate.lastName\" />\r\n      <FhInput v-model=\"value.title\" label=\"Title or role\" :vuelidate=\"vuelidate.title\" :wrapper-attrs=\"{ class: 'lg:col-span-2' }\" />\r\n      <FhInput v-model=\"value.email\" label=\"Email address\" class=\"flex-[1_1_0]\" required :vuelidate=\"vuelidate.email\" />\r\n      <FhInput v-model=\"value.confirmEmail\" label=\"Confirm email address\" class=\"flex-[1_1_0]\" required :vuelidate=\"vuelidate.confirmEmail\" />\r\n      <component :is=\"isCountryUSorCA ? FhInputPhone : FhInput\" v-model=\"value.phone\" label=\"Phone number\" required :vuelidate=\"vuelidate.phone\" />\r\n      <FhCheckbox v-model=\"value.terms\" required :vuelidate=\"vuelidate.terms\" class=\"lg:col-span-2\">\r\n        <div>\r\n          To submit your application, please acknowledge you have read and agree to comply with our minimum advertised pricing (MAP) policy. Review the Four\r\n          Hands MAP policy\r\n          <FhLink target=\"_blank\" href=\"https://secure.fourhands.com/SecondaryInfo/documents/IMAP%20Policy.pdf\">here</FhLink>.\r\n        </div>\r\n      </FhCheckbox>\r\n    </div>\r\n    <div class=\"mt-f8 flex items-center gap-f3 md:self-end\">\r\n      <FhButton :variant=\"isSm ? false : 'text'\" :class=\"{ 'flex-1': isSm }\" @click=\"emit('navigate', -1)\">Back</FhButton>\r\n      <FhButton :disabled=\"vuelidate.$invalid || isSubmitting\" :is-loading=\"isSubmitting\" color=\"primary\" :class=\"{ 'flex-1': isSm }\" @click=\"emit('submit')\">\r\n        Submit&nbsp;Application\r\n      </FhButton>\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup>\r\nimport { ref, reactive, computed, onMounted, watch, nextTick } from \"vue\";\r\nimport { cloneDeep } from \"lodash\";\r\nimport { useSubmitTradeApplicationMutation } from \"../api/tradeApplicationApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore.js\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport SidebarImg from \"@/assets/img/trade_program_sidebar.jpg\";\r\nimport FhTPAProgress from \"./FhTradeProgramApp/FhTPA-Progress.vue\";\r\nimport Page1 from \"@/components/FhTradeProgramApp/FhTPA-Page-1.vue\";\r\nimport Page2 from \"@/components/FhTradeProgramApp/FhTPA-Page-2.vue\";\r\nimport Page3 from \"@/components/FhTradeProgramApp/FhTPA-Page-3.vue\";\r\nimport Page4 from \"@/components/FhTradeProgramApp/FhTPA-Page-4.vue\";\r\nimport Page5 from \"@/components/FhTradeProgramApp/FhTPA-Page-5.vue\";\r\nimport Page6 from \"@/components/FhTradeProgramApp/FhTPA-Page-6.vue\";\r\nimport FhFullscreenFocusedLayout from \"@/components/FhFullscreenFocusedLayout.vue\";\r\n\r\nconst isComplete = ref(false);\r\n\r\nconst currentPage = ref(1);\r\nconst previousPage = ref(1);\r\n\r\nconst layout = ref(null);\r\n\r\nconst pageTransition = computed(() => {\r\n  if (currentPage.value > previousPage.value) return \"page-next\";\r\n  else return \"page-prev\";\r\n});\r\n\r\nconst currentPageComponent = computed(() => {\r\n  switch (currentPage.value) {\r\n    case 1:\r\n      return Page1;\r\n    case 2:\r\n      return Page2;\r\n    case 3:\r\n      return Page3;\r\n    case 4:\r\n      return Page4;\r\n    case 5:\r\n      return Page5;\r\n    case 6:\r\n      return Page6;\r\n  }\r\n  return \"div\";\r\n});\r\n\r\nconst navigateTo = (pageNumber) => {\r\n  layout.value.scrollContainer.scrollTo({ top: 0 });\r\n  previousPage.value = currentPage.value;\r\n  if (pageNumber === -1) {\r\n    window.history.pushState({ page: --currentPage.value }, \"\", \"\");\r\n  } else {\r\n    window.history.pushState({ page: pageNumber }, \"\", \"\");\r\n    currentPage.value = pageNumber;\r\n  }\r\n};\r\n\r\nonMounted(() => {\r\n  window.history.replaceState({ page: currentPage.value }, \"\", \"\");\r\n  window.onpopstate = (e) => {\r\n    previousPage.value = currentPage.value;\r\n    currentPage.value = e.state.page;\r\n  };\r\n});\r\n\r\nconst serviceOptions = reactive([\r\n  {\r\n    value: \"retailer\",\r\n    label: \"I run a physical retail store or series of stores.\"\r\n  },\r\n  {\r\n    value: \"residential-design\",\r\n    label: \"I offer interior design services and/or buy for residential spaces.\"\r\n  },\r\n  {\r\n    value: \"commercial-design\",\r\n    label: \"I offer design services and/or buy for use in commercial properties.\"\r\n  },\r\n  {\r\n    value: \"e-commerce\",\r\n    label: \"I sell online and ship directly to customers.\"\r\n  }\r\n]);\r\n\r\nconst primaryProjectTypeOptions = reactive([\r\n  {\r\n    value: \"commercial-contract-office\",\r\n    label: \"Office design, property management, multi-family​\"\r\n  },\r\n  {\r\n    value: \"commercial-contract-home\",\r\n    label: \"Home builder or staging​\"\r\n  },\r\n  {\r\n    value: \"commercial-contract-art\",\r\n    label: \"Art consulting or buying​\"\r\n  },\r\n  {\r\n    value: \"commercial-hospitality\",\r\n    label: \"Hospitality spaces like hotels, resorts, spas & restaurants\"\r\n  },\r\n  {\r\n    value: \"commercial-contract-healthcare\",\r\n    label: \"Healthcare and senior living​\"\r\n  },\r\n  {\r\n    value: \"commercial-specialty\",\r\n    label: \"Other - please describe\"\r\n  }\r\n]);\r\n\r\nconst projectTypeOtherOptions = reactive([\r\n  {\r\n    value: \"residential-design\",\r\n    label: \"Residential Homes\"\r\n  },\r\n  {\r\n    value: \"commercial-contract-office\",\r\n    label: \"Office design, property management, multi-family​\"\r\n  },\r\n  {\r\n    value: \"commercial-contract-home\",\r\n    label: \"Home builder or staging​\"\r\n  },\r\n  {\r\n    value: \"commercial-contract-art\",\r\n    label: \"Art consulting or buying​\"\r\n  },\r\n  {\r\n    value: \"commercial-hospitality\",\r\n    label: \"Hospitality spaces like hotels, resorts, spas & restaurants\"\r\n  },\r\n  {\r\n    value: \"commercial-contract-healthcare\",\r\n    label: \"Healthcare and senior living​\"\r\n  },\r\n  {\r\n    value: \"commercial-specialty\",\r\n    label: \"Other - please describe\"\r\n  }\r\n]);\r\n\r\nconst options = computed(() => {\r\n  switch (currentPage.value) {\r\n    case 1:\r\n      return serviceOptions;\r\n    case 2:\r\n      return primaryProjectTypeOptions;\r\n    case 3:\r\n      if (model.value.primaryBusiness === \"residential-design\") {\r\n        return projectTypeOtherOptions.filter((o) => !o.value.includes(model.value.primaryBusiness));\r\n      }\r\n      if (model.value.primaryProject && model.value.primaryProject.primaryProjectType) {\r\n        return projectTypeOtherOptions.filter((o) => !o.value.includes(model.value.primaryProject.primaryProjectType));\r\n      }\r\n      return projectTypeOtherOptions;\r\n  }\r\n  return false;\r\n});\r\n\r\nconst model = ref({\r\n  primaryBusiness: null,\r\n  primaryProject: {\r\n    primaryProjectType: null,\r\n    primaryProjectTypeOther: \"\"\r\n  },\r\n  projectType: {\r\n    projectTypeOther: [],\r\n    projectTypeOtherOther: \"\"\r\n  },\r\n  businessContact: {\r\n    name: \"\",\r\n    registeredLocation: \"US\",\r\n    address1: \"\",\r\n    address2: \"\",\r\n    city: \"\",\r\n    state: \"\",\r\n    zip: \"\"\r\n  },\r\n  businessDetails: {\r\n    locations: \"\",\r\n    revenue: \"\",\r\n    staff: \"\",\r\n    services: [],\r\n    servicesOther: \"\",\r\n    description: \"\",\r\n    brands: \"\",\r\n    websiteEcommCapable: \"\",\r\n    social: {\r\n      website: {\r\n        selected: false,\r\n        user: \"\"\r\n      },\r\n      instagram: {\r\n        selected: false,\r\n        user: \"\"\r\n      },\r\n      facebook: {\r\n        selected: false,\r\n        user: \"\"\r\n      },\r\n      pinterest: {\r\n        selected: false,\r\n        user: \"\"\r\n      },\r\n      other: {\r\n        selected: false,\r\n        network: \"\",\r\n        user: \"\"\r\n      }\r\n    }\r\n  },\r\n  contact: {\r\n    firstName: \"\",\r\n    lastName: \"\",\r\n    title: \"\",\r\n    email: \"\",\r\n    confirmEmail: \"\",\r\n    phone: \"\",\r\n    terms: false\r\n  }\r\n});\r\n\r\nconst currentPageModel = computed({\r\n  get() {\r\n    switch (currentPage.value) {\r\n      case 1:\r\n        return model.value.primaryBusiness;\r\n      case 2:\r\n        return model.value.primaryProject;\r\n      case 3:\r\n        return model.value.projectType;\r\n      case 4:\r\n        return model.value.businessContact;\r\n      case 5:\r\n        return model.value.businessDetails;\r\n      case 6:\r\n        return model.value.contact;\r\n    }\r\n    return {};\r\n  },\r\n  set(value) {\r\n    const _model = cloneDeep(model.value);\r\n    switch (currentPage.value) {\r\n      case 1:\r\n        _model.primaryBusiness = value;\r\n        break;\r\n      case 2:\r\n        _model.primaryProject = value;\r\n        break;\r\n      case 3:\r\n        _model.projectType = value;\r\n        break;\r\n      case 4:\r\n        _model.businessContact = value;\r\n        break;\r\n      case 5:\r\n        _model.businessDetails = value;\r\n        break;\r\n      case 6:\r\n        _model.contact = value;\r\n        break;\r\n    }\r\n    model.value = _model;\r\n  }\r\n});\r\n\r\nconst form = ref(null);\r\nconst selectFirstInput = () => {\r\n  nextTick(() => form.value.querySelector(\"input, select, textarea\")?.focus());\r\n};\r\nonMounted(selectFirstInput);\r\nwatch(currentPage, selectFirstInput);\r\n\r\nconst { mutate: submitTradeApplication, isLoading: isSubmitting } = useSubmitTradeApplicationMutation();\r\n\r\nfunction submit() {\r\n  submitTradeApplication(model.value, {\r\n    onSuccess: () => {\r\n      isComplete.value = true;\r\n    },\r\n    onError: () => {\r\n      useNotificationStore().notifyError(\"Sorry, something went wrong and we could not submit your application. Please try again.\");\r\n    }\r\n  });\r\n}\r\n</script>\r\n\r\n<template>\r\n  <FhFullscreenFocusedLayout ref=\"layout\" :background-image=\"SidebarImg\" :hide-header-on-mobile=\"currentPage !== 1 && !isComplete\" align-content=\"top\">\r\n    <div ref=\"form\" class=\"grid min-h-full grid-rows-[auto_1fr]\">\r\n      <template v-if=\"!isComplete\">\r\n        <FhTPAProgress :step=\"currentPage\" :total=\"6\" class=\"relative after:absolute after:left-0 after:-top-f8 after:h-f8 after:w-full after:bg-white\" />\r\n        <transition :name=\"pageTransition\">\r\n          <component\r\n            :is=\"currentPageComponent\"\r\n            v-model=\"currentPageModel\"\r\n            :options=\"options\"\r\n            :model=\"model\"\r\n            :is-submitting=\"isSubmitting\"\r\n            class=\"col-start-1 row-start-2\"\r\n            @submit=\"submit\"\r\n            @navigate=\"navigateTo\"\r\n          >\r\n          </component>\r\n        </transition>\r\n      </template>\r\n      <template v-else>\r\n        <div class=\"row-span-2 mt-f8 flex flex-col gap-f3 self-center md:-translate-y-f5\">\r\n          <h1 class=\"mb-f3 font-serif text-f-5xl-9xl\">Thank You, {{ model.businessContact.name }}</h1>\r\n          <p class=\"mb-f5\">Your application has been received. We will be in touch shortly.</p>\r\n          <!-- <p class=\"mb-f5\">Your application has been received. We will be in touch within one business day.</p> -->\r\n          <FhButton href=\"/\" color=\"primary\" class=\"md:self-start\">Return to FourHands.com</FhButton>\r\n        </div>\r\n      </template>\r\n    </div>\r\n  </FhFullscreenFocusedLayout>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.page-next-enter-active,\r\n.page-next-leave-active,\r\n.page-prev-enter-active,\r\n.page-prev-leave-active {\r\n  transition: 0.75s ease;\r\n}\r\n\r\n.page-next-enter-from,\r\n.page-prev-leave-to {\r\n  transform: translateY(100%);\r\n  opacity: 0;\r\n}\r\n.page-next-leave-to,\r\n.page-prev-enter-from {\r\n  transform: translateY(-100%);\r\n  opacity: 0;\r\n}\r\n</style>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { items } = getDataRefs(props.data);\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <!-- VALUE PROPS WRAPPING GRID -->\r\n    <div class=\"flex flex-col gap-f8 lg:flex-row\">\r\n      <!-- VALUE PROP ITEM -->\r\n      <div v-for=\"item in items\" :key=\"item.id\" class=\"flex flex-[1_1_0] flex-col\">\r\n        <!--  VALUE PROP ITEM TITLE -->\r\n        <h3 v-if=\"item.title\" class=\"mb-4 font-serif text-f-2xl-5xl lg:mb-6\" role=\"heading\" aria-level=\"3\">\r\n          {{ item.title }}\r\n        </h3>\r\n        <!--  VALUE PROP ITEM DESCRIPTION -->\r\n        <p class=\"mb-3 grow text-f-sm-xl lg:mb-6\">\r\n          {{ item.copy }}\r\n        </p>\r\n        <!--  VALUE PROP ITEM LINK -->\r\n        <a :href=\"item.linkHref\" :aria-label=\"item.ariaLabel\" :target=\"item.linkTarget\" class=\"text-f-sm-lg underline\">\r\n          {{ item.linkText }}\r\n        </a>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n","<script setup>\r\nimport { ref, computed } from \"vue\";\r\nimport FhModal from \"../FhModal.vue\";\r\n\r\nconst props = defineProps({\r\n  modalData: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst modal = ref(null);\r\nconst isOpen = ref(false);\r\nconst toggleModal = () => {\r\n  isOpen.value = !isOpen.value;\r\n};\r\n\r\nconst videoURL = computed(() => {\r\n  if (props.modalData.embedLink.includes(\"?\")) return `${props.modalData.embedLink}&autoplay=1`;\r\n  return `${props.modalData.embedLink}?autoplay=1`;\r\n});\r\n</script>\r\n\r\n<template>\r\n  <slot :toggle-modal=\"toggleModal\">\r\n    <!-- Button To Open/Close Injected Here -->\r\n  </slot>\r\n  <FhModal ref=\"modal\" v-model:is-open=\"isOpen\" wide>\r\n    <template #body>\r\n      <div class=\"relative aspect-video w-full after:block after:pb-[56.25%] after:content-['']\">\r\n        <iframe\r\n          :src=\"videoURL\"\r\n          class=\"absolute inset-0 h-full w-full\"\r\n          frameborder=\"0\"\r\n          allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n          allowfullscreen\r\n        ></iframe>\r\n      </div>\r\n    </template>\r\n    <template #footer>\r\n      <p>{{ modalData.caption }}</p>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { getDataRefs } from \"@/util/vue\";\r\nimport FhSection from \"@/includes/FhSection.vue\";\r\nimport FhVideoModal from \"@/components/FhVideo/FhVideoModal.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { posterImage, caption, gaTagging } = getDataRefs(props.data);\r\n\r\nlet modalData = {\r\n  embedLink: props.data.embedLink,\r\n  caption: props.data.caption\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    aria-label=\"Video\"\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n    :data-ga=\"gaTagging\"\r\n  >\r\n    <div class=\"mx-auto max-w-[1530px]\">\r\n      <figure class=\"relative aspect-video\">\r\n        <FhVideoModal :modal-data=\"modalData\">\r\n          <template #default=\"{ toggleModal }\">\r\n            <FhButton\r\n              variant=\"round\"\r\n              class=\"absolute top-1/2 left-1/2 z-10 flex !h-f15 !w-f15 -translate-y-1/2 -translate-x-1/2 items-center justify-center border-none !bg-neutral-opacity-35\"\r\n              aria-label=\"Play video\"\r\n              @click=\"toggleModal\"\r\n            >\r\n              <FhIcon name=\"Play\" class=\"h-f5 w-f5 translate-x-1\" />\r\n              <span class=\"sr-only\">Play Video</span>\r\n            </FhButton>\r\n          </template>\r\n        </FhVideoModal>\r\n        <img class=\"h-full w-full object-cover object-center\" :src=\"posterImage\" :alt=\"caption\" />\r\n        <figcaption class=\"pt-f4 text-f-sm-xl md:px-4\">{{ caption }}</figcaption>\r\n      </figure>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { computed, reactive, ref } from \"vue\";\r\nimport FhInput from \"@/components/FhInput.vue\";\r\nimport FhModal from \"@/components/FhModal.vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhIcon from \"@/components/FhIcon.vue\";\r\nimport { useUpdateAccountPriceMarkup } from \"@/api/accountApi\";\r\nimport { useNotificationStore } from \"@/stores/NotificationStore\";\r\n\r\nconst props = defineProps({\r\n  markupValue: {\r\n    type: Number,\r\n    default: 0\r\n  }\r\n});\r\n\r\nconst emits = defineEmits([\"update\"]);\r\nconst isSaveButtonDisabled = ref(false);\r\nconst formData = reactive({ markup: props.markupValue });\r\nconst modal = ref(null);\r\nconst notificationStore = useNotificationStore();\r\nconst { isLoading: updatingPriceModifer, mutate: updatePriceModiferMutation } = useUpdateAccountPriceMarkup();\r\nconst isMaxMarkupError = ref(false);\r\nconst isNegativeError = ref(false);\r\n\r\nconst grandfatheredUserCurrentMarkup = computed(() => {\r\n  const value = props.markupValue;\r\n  return Math.round(value * 2) / 2 !== value;\r\n});\r\n\r\nfunction updateSentence() {\r\n  const value = parseFloat(formData.markup);\r\n  if (grandfatheredUserCurrentMarkup.value && value === props.markupValue) {\r\n    isSaveButtonDisabled.value = true;\r\n    isMaxMarkupError.value = false;\r\n    isNegativeError.value = false;\r\n    return `We now only allow markups in 0.5% increments (e.g., 0.5%, 1.0%, 1.5%). Your current markup of ${value}% is grandfathered in, but if you change it, <strong>you will not be able to revert to this exact value.</strong>\r\n    <div class=\"mt-f2\">\r\n    After the ${value}% markup is applied, a $1000 product will become $${(1000 + (value / 100) * 1000).toFixed(2)}.\r\n    </div>\r\n    `;\r\n  } else if (Math.round(value * 2) / 2 !== value && !isNaN(value)) {\r\n    isSaveButtonDisabled.value = true;\r\n    isMaxMarkupError.value = true;\r\n    isNegativeError.value = false;\r\n    return `Markups must be in increments of 0.5% (e.g., 0.5%, 1.0%, 1.5%).`;\r\n  } else if (value !== null && value < 0) {\r\n    isSaveButtonDisabled.value = true;\r\n    isMaxMarkupError.value = false;\r\n    isNegativeError.value = true;\r\n    return `Please enter a value of 0 or greater.`;\r\n  } else if (value === 0) {\r\n    isSaveButtonDisabled.value = false;\r\n    isMaxMarkupError.value = false;\r\n    isNegativeError.value = false;\r\n    return `Enter a value greater than 0% to apply a markup.`;\r\n  } else if (!isNaN(value) && value > 0 && value <= 500.0) {\r\n    const roundedValue = parseFloat(value.toFixed(2));\r\n    formData.markup = roundedValue;\r\n    isSaveButtonDisabled.value = false;\r\n    isMaxMarkupError.value = false;\r\n    isNegativeError.value = false;\r\n    return `After the ${value}% markup is applied, a $1000 product will become $${(1000 + (value / 100) * 1000).toFixed(2)}.`;\r\n  } else if (value > 500.0) {\r\n    isSaveButtonDisabled.value = true;\r\n    isMaxMarkupError.value = true;\r\n    isNegativeError.value = false;\r\n    return \"Maximum allowed markup is 500.00%\";\r\n  } else {\r\n    isSaveButtonDisabled.value = false;\r\n    isMaxMarkupError.value = false;\r\n    isNegativeError.value = false;\r\n    return \"Enter a value greater than 0% to apply a markup.\";\r\n  }\r\n}\r\n\r\nconst triggerUpdatePriceModifer = () => {\r\n  formData.markup = formData.markup == \"\" ? 0 : formData.markup;\r\n  updatePriceModiferMutation(formData, {\r\n    onSuccess: (updatePriceModiferResponse) => {\r\n      notificationStore.notifySuccess(\"Your price markup has been updated.\");\r\n      emits(\"update\", updatePriceModiferResponse.markup);\r\n      modal.value.close();\r\n    },\r\n    onError: () => {\r\n      notificationStore.notifySuccess(\"Sorry, something went wrong and we could not update your price markup.\");\r\n    }\r\n  });\r\n};\r\n\r\nconst reset = () => {\r\n  formData.markup = props.markupValue;\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhModal ref=\"modal\" :data=\"{ heading: 'Update Price Markup' }\" @close=\"reset\">\r\n    <template #activator=\"{ open }\">\r\n      <slot name=\"activator\" :open=\"open\"></slot>\r\n    </template>\r\n    <template #body>\r\n      <form>\r\n        <fieldset class=\"\">\r\n          <div class=\"flex flex-col gap-f2\">\r\n            <div class=\"flex w-full md:w-1/2\">\r\n              <FhInput\r\n                v-model=\"formData.markup\"\r\n                :class=\"{ 'border-brand-red focus:border-brand-red': isMaxMarkupError || isNegativeError }\"\r\n                type=\"number\"\r\n                step=\"0.5\"\r\n                min=\"0\"\r\n                max=\"500.00\"\r\n                :max-decimal-places=\"1\"\r\n                @change=\"updateSentence\"\r\n              />\r\n              <span><FhIcon name=\"IconPercentage\" /></span>\r\n            </div>\r\n\r\n            <div class=\"sentence-container\" :class=\"{ 'text-brand-red': isMaxMarkupError || isNegativeError }\" v-html=\"updateSentence()\"></div>\r\n            <ul class=\"list-[square] p-4 grid gap-y-2\">\r\n              <li class=\"mx-4\">To remove the markup, enter 0 or leave the field blank.</li>\r\n              <li class=\"mx-4\">Updates may take up to 5 minutes to reflect on Guest Accounts and Shopping Lists.</li>\r\n            </ul>\r\n            <div>\r\n              Do you typically calculate markup using a multiplier? Here are some examples of common multipliers converted to markup percentages:<br /><br />\r\n              <div class=\"grid grid-cols-2 border border-neutral-30 mx-f4 mt-f3\">\r\n                <div class=\"font-bold f-sm-base p-f2.5 border-b border-neutral-30\">Multiplier</div>\r\n                <div class=\"font-bold f-sm-base p-f2.5 border-b border-neutral-30\">Markup %</div>\r\n                <div class=\"text-neutral-50 border-b border-neutral-30 px-f2.5 h-[44px] content-center\">1.8x</div>\r\n                <div class=\"text-neutral-50 border-b border-neutral-30 px-f2.5 h-[44px] content-center\">80%</div>\r\n                <div class=\"text-neutral-50 border-b border-neutral-30 px-f2.5 h-[44px] content-center\">2x</div>\r\n                <div class=\"text-neutral-50 border-b border-neutral-30 px-f2.5 h-[44px] content-center\">100%</div>\r\n                <div class=\"text-neutral-50 border-b border-neutral-30 px-f2.5 h-[44px] content-center\">2.1x</div>\r\n                <div class=\"text-neutral-50 border-b border-neutral-30 px-f2.5 h-[44px] content-center\">110%</div>\r\n                <div class=\"text-neutral-50 border-b border-neutral-30 px-f2.5 h-[44px] content-center\">2.5x</div>\r\n                <div class=\"text-neutral-50 border-b border-neutral-30 px-f2.5 h-[44px] content-center\">150%</div>\r\n                <div class=\"text-neutral-50 border-b border-neutral-30 px-f2.5 h-[44px] content-center\">3x</div>\r\n                <div class=\"text-neutral-50 border-b border-neutral-30 px-f2.5 h-[44px] content-center\">200%</div>\r\n                <div class=\"text-neutral-50 px-f2.5 h-[44px] content-center\">3.2x</div>\r\n                <div class=\"text-neutral-50 px-f2.5 h-[44px] content-center\">220%</div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </fieldset>\r\n      </form>\r\n    </template>\r\n    <template #footer=\"{ close }\">\r\n      <FhButton\r\n        type=\"submit\"\r\n        color=\"primary\"\r\n        :is-loading=\"updatingPriceModifer\"\r\n        :disabled=\"updatingPriceModifer || isSaveButtonDisabled\"\r\n        @click=\"triggerUpdatePriceModifer\"\r\n        >{{ props.editMode ? \"Update\" : \"Save\" }}</FhButton\r\n      >\r\n      <FhButton variant=\"text\" @click=\"close\">Cancel</FhButton>\r\n    </template>\r\n  </FhModal>\r\n</template>\r\n","<script setup>\r\nimport { ref } from \"vue\";\r\nimport { getDataRefs } from \"@/util/vue\";\r\nimport FhButton from \"@/components/FhButton.vue\";\r\nimport FhHeading from \"@/components/FhHeading.vue\";\r\nimport FhSection from \"@/includes/FhSection.vue\";\r\nimport FhPriceMarkupModal from \"@/components/FhPriceMarkupModal.vue\";\r\n\r\nconst props = defineProps({\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { heading, subHeading, markup } = getDataRefs(props.data);\r\n\r\nconst markupValue = ref(markup.value == null ? 0 : markup);\r\n\r\nconst handleMarkupUpdate = (updatedMarkupValue) => {\r\n  markupValue.value = updatedMarkupValue;\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhSection>\r\n    <div class=\"mb-f10 flex flex-col text-neutral-70 md:flex-row md:flex-wrap md:border-b md:border-solid md:border-neutral-70 md:border-opacity-10 md:pb-f10\">\r\n      <FhHeading tag=\"h2\" class=\"md:order-1 md:mb-0 md:flex-1 md:justify-center\">{{ heading }}</FhHeading>\r\n      <div class=\"my-4 flex flex-col md:order-3 md:mb-2 md:w-full md:flex-row md:gap-24\">\r\n        <span class=\"mb-3 text-f-sm-base font-bold md:mb-0 md:basis-4/12\">\r\n          {{ subHeading }}\r\n        </span>\r\n        <span>\r\n          <p class=\"text-neutral-50\">Your Markup</p>\r\n          <p class=\"text-f-sm-base font-bold md:mb-0 md:basis-4/12\">{{ markupValue }}%</p>\r\n        </span>\r\n      </div>\r\n      <FhPriceMarkupModal :markup-value=\"markupValue\" @update=\"handleMarkupUpdate\">\r\n        <template #activator=\"{ open }\">\r\n          <FhButton class=\"w-full md:order-2 md:w-auto md:self-end\" @click=\"open\">Update Markup</FhButton>\r\n        </template>\r\n      </FhPriceMarkupModal>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhContactSubscriptionFormModal from \"./FhContactSubscriptionFormModal.vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <FhSection aria-label=\"Newsletter Signup\" :base=\"props.style.base\" class=\"border-b border-solid border-neutral-30\">\r\n    <div class=\"flex flex-col items-center justify-center\">\r\n      <div class=\"mb-f6 text-center\">\r\n        <h2 class=\"mb-f4 font-serif text-f-4xl-8xl\">Stay in Touch</h2>\r\n        <p class=\"max-w-[700px] text-f-sm-xl\">Subscribe to our email list and be the first to hear about new collections, special promotions and more.</p>\r\n      </div>\r\n\r\n      <div class=\"flex flex-col md:flex-row md:justify-center\">\r\n        <FhContactSubscriptionFormModal class=\"col-span-full md:col-span-5\">\r\n          <template #activator=\"{ open }\"> <FhButton color=\"secondary\" size=\"small\" class=\"md:justify-center\" @click=\"open\">Sign Up</FhButton></template>\r\n        </FhContactSubscriptionFormModal>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { ref } from \"vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { heading, quote, author, imageUrl, skusWhitelist } = getDataRefs(props.data);\r\nconst activeSku = ref(null); // Used in the PDP context\r\nfunction setActiveSku(sku) {\r\n  activeSku.value = sku.skuNumber;\r\n}\r\ndefineExpose({ setActiveSku });\r\n</script>\r\n\r\n<template>\r\n  <slot name=\"banner\" :set-active-sku=\"setActiveSku\"></slot>\r\n  <div\r\n    v-if=\"data && (activeSku === null || !skusWhitelist || skusWhitelist.length === 0 || Array.from(skusWhitelist).includes(activeSku))\"\r\n    aria-label=\"Quote Block\"\r\n    :base=\"style.base\"\r\n    :class=\"[\r\n      'relative p-12 md:p-20 overflow-hidden',\r\n      style.base?.background ? `bg-${style.base.background}` : '',\r\n      (style.base?.background !== 'limestone' && props.style.base?.background !== null && props.style.base?.background !== '') || imageUrl ? 'text-white' : ''\r\n    ]\"\r\n    :style=\"{ backgroundImage: `url('${imageUrl}')` }\"\r\n  >\r\n    <div class=\"relative z-10 flex flex-col text-center\">\r\n      <h2 v-if=\"heading\" class=\"text-base\" aria-level=\"2\">{{ heading }}</h2>\r\n      <h3 v-if=\"quote\" class=\"my-8 font-serif text-6xl md:my-10\" role=\"heading\" aria-level=\"5\">&ldquo;{{ quote }}&rdquo;</h3>\r\n      <h2 v-if=\"author\" class=\"text-base\" aria-level=\"2\">{{ author }}</h2>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { computed, ref } from \"vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhColumnModuleItem from \"./FhColumnModule/FhColumnModuleItem.vue\";\r\nimport FhColumnModuleItems from \"./FhColumnModule/FhColumnModuleItems.vue\";\r\nimport { useViewportSizes } from \"../composables\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { isSm, isMd } = useViewportSizes();\r\nconst isMobile = computed(() => isSm.value || isMd.value);\r\n\r\nconst { items, skusWhitelist } = getDataRefs(props.data);\r\nconst totalItemCount = computed(() => items.value.length);\r\n\r\nconst filteredBase = computed(() => {\r\n  const base = { ...props.style.base };\r\n  if (totalItemCount.value > 0 && totalItemCount.value < 2) {\r\n    delete base.background;\r\n  }\r\n  return base;\r\n});\r\n\r\nconst activeSku = ref(null); // Used in the PDP context\r\nfunction setActiveSku(sku) {\r\n  activeSku.value = sku.skuNumber;\r\n}\r\ndefineExpose({ setActiveSku });\r\n</script>\r\n\r\n<template>\r\n  <slot name=\"banner\" :set-active-sku=\"setActiveSku\"></slot>\r\n  <FhSection\r\n    v-if=\"data && (activeSku === null || !skusWhitelist || skusWhitelist.length === 0 || Array.from(skusWhitelist).includes(activeSku))\"\r\n    aria-label=\"Column Module\"\r\n    :base=\"filteredBase\"\r\n    :class=\"[\r\n      props.style.base?.background !== 'limestone' && props.style.base?.background !== null && props.style.base?.background !== '' ? 'text-white' : '',\r\n      totalItemCount > 0 && totalItemCount < 2 && !isMobile ? `bg-${style.base.background}` : `widget--bg-${style.base.background}`\r\n    ]\"\r\n  >\r\n    <template v-if=\"totalItemCount > 0 && totalItemCount < 2\">\r\n      <fh-column-module-item v-for=\"item in items\" :key=\"item.title\" :item=\"item\"></fh-column-module-item>\r\n    </template>\r\n    <template v-else>\r\n      <fh-column-module-items :items=\"items\" :total-item-count=\"totalItemCount\"></fh-column-module-items>\r\n    </template>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped></style>\r\n","<script setup>\r\nimport { computed, ref } from \"vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport FhButton from \"./FhButton.vue\";\r\nimport FhVideo from \"@/components/FhVideo.vue\";\r\nimport { useViewportSizes } from \"../composables\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    default: null\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  },\r\n  isVideo: {\r\n    type: Boolean,\r\n    default: false\r\n  }\r\n});\r\n\r\nconst { isSm, isMd, isLg } = useViewportSizes();\r\nconst isTabletOrDesktop = computed(() => isMd.value || isLg.value);\r\nconst isMobile = computed(() => isSm.value);\r\n\r\nconst { layout, image, imageAltText, heading, eyebrowText, description, linkText, linkUrl, linkAltText, linkTarget, gaTagging, skusWhitelist } = getDataRefs(\r\n  props.data\r\n);\r\nconst activeSku = ref(null); // Used in the PDP context\r\nfunction setActiveSku(sku) {\r\n  activeSku.value = sku.skuNumber;\r\n}\r\ndefineExpose({ setActiveSku });\r\n</script>\r\n\r\n<template>\r\n  <slot name=\"banner\" :set-active-sku=\"setActiveSku\"></slot>\r\n  <FhSection\r\n    v-if=\"data && (activeSku === null || !skusWhitelist || skusWhitelist.length === 0 || Array.from(skusWhitelist).includes(activeSku))\"\r\n    :base=\"style.base\"\r\n    class=\"overflow-hidden\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <!-- CTA BLOCK FLEX CONTAINER -->\r\n    <div\r\n      class=\"widget__container grid grid-cols-1 md:grid-cols-2 md:grid-flow-col justify-stretch md:overflow-hidden\"\r\n      :class=\"[layout === 'imageLeft' && isTabletOrDesktop ? 'reverse-cols' : '']\"\r\n    >\r\n      <!-- CTA BLOCK CONTENT -->\r\n      <div\r\n        class=\"widget__containerItem widget__containerItem--text flex-1 flex flex-col items-start mdmax:px-[32px] mdmax:py-[60px] md:p-[40px] tb:p-f15 md:justify-center w-full\"\r\n        :class=\"isMobile ? 'order-2' : ''\"\r\n      >\r\n        <!-- CTA BLOCK CONTENT Eyebrow Text -->\r\n        <h2 v-if=\"eyebrowText\" class=\"text-base font-sans pb-3\" aria-level=\"2\">{{ eyebrowText }}</h2>\r\n        <!-- CTA BLOCK CONTENT TITLE -->\r\n        <h5 v-if=\"heading\" class=\"mb-[32px] font-sans text-3xl\" role=\"heading\" aria-level=\"5\">\r\n          {{ heading }}\r\n        </h5>\r\n        <p v-if=\"description\" class=\"mb-[24px] text-base font-normal\" v-html=\"description\"></p>\r\n        <!-- CTA BLOCK LINK -->\r\n        <FhButton\r\n          v-if=\"linkText != ''\"\r\n          class=\"item-start\"\r\n          v-bind=\"{ href: linkUrl, variant: 'link', inverse: false }\"\r\n          :target=\"linkTarget\"\r\n          :aria-label=\"linkAltText\"\r\n          :data-ga=\"gaTagging\"\r\n        >\r\n          {{ linkText }}\r\n        </FhButton>\r\n      </div>\r\n      <!-- CTA BLOCK IMAGE -->\r\n      <div v-if=\"image\" class=\"widget__containerItem widget__containerItem--image flex-1\" :class=\"isMobile ? 'order-1' : ''\">\r\n        <FhVideo v-if=\"props.isVideo\" :src=\"image\" :autoplay=\"true\" :loop=\"true\" :controls=\"false\"></FhVideo>\r\n        <img v-else class=\"h-full w-full object-cover\" :src=\"image\" :alt=\"imageAltText\" />\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n<style scoped>\r\n.reverse-cols {\r\n  display: grid;\r\n  direction: rtl;\r\n}\r\n.reverse-cols > * {\r\n  direction: ltr;\r\n}\r\n</style>\r\n","<script setup>\r\nimport FhSection from \"../includes/FhSection.vue\";\r\nimport { getDataRefs } from \"../util/vue\";\r\nimport { ref } from \"vue\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true\r\n  }\r\n});\r\n\r\nconst { title, description, skusWhitelist } = getDataRefs(props.data);\r\nconst activeSku = ref(null); // Used in the PDP context\r\nfunction setActiveSku(sku) {\r\n  activeSku.value = sku.skuNumber;\r\n}\r\ndefineExpose({ setActiveSku });\r\n</script>\r\n\r\n<template>\r\n  <slot name=\"banner\" :set-active-sku=\"setActiveSku\"></slot>\r\n  <FhSection\r\n    v-if=\"data && (activeSku === null || !skusWhitelist || skusWhitelist.length === 0 || Array.from(skusWhitelist).includes(activeSku))\"\r\n    aria-label=\"items\"\r\n    :base=\"style.base\"\r\n    class=\"pb-f3 pt-f3\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div class=\"grid md:justify-items-center text-center justify-center mb-f5\">\r\n      <div class=\"md:max-w-[600px] md:basis-1/2 mb-[32px]\">\r\n        <h2 class=\"font-sans text-f-xl-3xl\">{{ title }}</h2>\r\n      </div>\r\n      <p class=\"text-f-sm-base font-normal md:max-w-[600px] md:basis-1/2\">{{ description }}</p>\r\n    </div>\r\n    <div\r\n      :class=\"[\r\n        'grid grid-cols-2 gap-f4 md:gap-x-f3 gap-y-f6 md:gap-y-f4',\r\n        data.layout === 'normal' ? 'lg:grid-cols-4' : '',\r\n        data.layout === 'small' ? 'lg:grid-cols-6' : ''\r\n      ]\"\r\n    >\r\n      <div class=\"flex flex-col\" :class=\"[data.layout === 'small' ? 'lg:col-start-2' : '']\">\r\n        <div class=\"\">\r\n          <img :src=\"data.image1\" class=\"h-auto w-full object-cover\" :alt=\"data.image1AltText\" />\r\n        </div>\r\n        <div v-if=\"!!data.optionalSubcopy1\" class=\"pt-[24px] h-full\">\r\n          <p :class=\"['text-f-sm-base font-normal ', data.subcopyTextAlignment]\">{{ data.optionalSubcopy1 }}</p>\r\n        </div>\r\n      </div>\r\n      <div class=\"flex flex-col\">\r\n        <div class=\"\">\r\n          <img :src=\"data.image2\" class=\"h-auto w-full object-cover\" :alt=\"data.ima2AltText\" />\r\n        </div>\r\n        <div v-if=\"!!data.optionalSubcopy2\" class=\"pt-[24px] h-full\">\r\n          <p :class=\"['text-f-sm-base font-normal ', data.subcopyTextAlignment]\">{{ data.optionalSubcopy2 }}</p>\r\n        </div>\r\n      </div>\r\n      <div class=\"flex flex-col\">\r\n        <div class=\"\">\r\n          <img :src=\"data.image3\" class=\"h-auto w-full object-cover\" :alt=\"data.ima3AltText\" />\r\n        </div>\r\n        <div v-if=\"!!data.optionalSubcopy3\" class=\"pt-[24px] h-full\">\r\n          <p :class=\"['text-f-sm-base font-normal ', data.subcopyTextAlignment]\">{{ data.optionalSubcopy3 }}</p>\r\n        </div>\r\n      </div>\r\n      <div class=\"flex flex-col\">\r\n        <div class=\"\">\r\n          <img :src=\"data.image4\" class=\"h-auto w-full object-cover\" :alt=\"data.ima4AltText\" />\r\n        </div>\r\n        <div v-if=\"!!data.optionalSubcopy4\" class=\"pt-[24px] h-full\">\r\n          <p :class=\"['text-f-sm-base font-normal ', data.subcopyTextAlignment]\">{{ data.optionalSubcopy4 }}</p>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.text-white * {\r\n  color: white !important;\r\n}\r\n</style>\r\n","import { defineComponent, ref, h, watch, computed, reactive, shallowRef, nextTick, getCurrentInstance, onMounted, isVue2, watchEffect, toRefs } from 'vue-demi';\nimport { onClickOutside as onClickOutside$1, useActiveElement, useBattery, useBrowserLocation, useClipboard, useDark, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDocumentVisibility, useStorage as useStorage$1, isClient as isClient$1, useDraggable, useElementBounding, useElementSize as useElementSize$1, useElementVisibility as useElementVisibility$1, useEyeDropper, useFullscreen, useGeolocation, useIdle, useMouse, useMouseInElement, useMousePressed, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, usePointer, usePointerLock, usePreferredColorScheme, usePreferredContrast, usePreferredDark as usePreferredDark$1, usePreferredLanguages, usePreferredReducedMotion, useTimeAgo, useTimestamp, useVirtualList, useWindowFocus, useWindowSize } from '@vueuse/core';\nimport { toValue, isClient, noop, isObject, tryOnScopeDispose, isIOS, directiveHooks, pausableWatch, tryOnMounted, toRef, useToggle, notNullish, promiseTimeout, until, useDebounceFn, useThrottleFn } from '@vueuse/shared';\n\nconst OnClickOutside = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"OnClickOutside\",\n  props: [\"as\", \"options\"],\n  emits: [\"trigger\"],\n  setup(props, { slots, emit }) {\n    const target = ref();\n    onClickOutside$1(target, (e) => {\n      emit(\"trigger\", e);\n    }, props.options);\n    return () => {\n      if (slots.default)\n        return h(props.as || \"div\", { ref: target }, slots.default());\n    };\n  }\n});\n\nfunction unrefElement(elRef) {\n  var _a;\n  const plain = toValue(elRef);\n  return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\n\nconst defaultWindow = isClient ? window : void 0;\n\nfunction useEventListener(...args) {\n  let target;\n  let events;\n  let listeners;\n  let options;\n  if (typeof args[0] === \"string\" || Array.isArray(args[0])) {\n    [events, listeners, options] = args;\n    target = defaultWindow;\n  } else {\n    [target, events, listeners, options] = args;\n  }\n  if (!target)\n    return noop;\n  if (!Array.isArray(events))\n    events = [events];\n  if (!Array.isArray(listeners))\n    listeners = [listeners];\n  const cleanups = [];\n  const cleanup = () => {\n    cleanups.forEach((fn) => fn());\n    cleanups.length = 0;\n  };\n  const register = (el, event, listener, options2) => {\n    el.addEventListener(event, listener, options2);\n    return () => el.removeEventListener(event, listener, options2);\n  };\n  const stopWatch = watch(\n    () => [unrefElement(target), toValue(options)],\n    ([el, options2]) => {\n      cleanup();\n      if (!el)\n        return;\n      const optionsClone = isObject(options2) ? { ...options2 } : options2;\n      cleanups.push(\n        ...events.flatMap((event) => {\n          return listeners.map((listener) => register(el, event, listener, optionsClone));\n        })\n      );\n    },\n    { immediate: true, flush: \"post\" }\n  );\n  const stop = () => {\n    stopWatch();\n    cleanup();\n  };\n  tryOnScopeDispose(stop);\n  return stop;\n}\n\nlet _iOSWorkaround = false;\nfunction onClickOutside(target, handler, options = {}) {\n  const { window = defaultWindow, ignore = [], capture = true, detectIframe = false } = options;\n  if (!window)\n    return noop;\n  if (isIOS && !_iOSWorkaround) {\n    _iOSWorkaround = true;\n    Array.from(window.document.body.children).forEach((el) => el.addEventListener(\"click\", noop));\n    window.document.documentElement.addEventListener(\"click\", noop);\n  }\n  let shouldListen = true;\n  const shouldIgnore = (event) => {\n    return ignore.some((target2) => {\n      if (typeof target2 === \"string\") {\n        return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));\n      } else {\n        const el = unrefElement(target2);\n        return el && (event.target === el || event.composedPath().includes(el));\n      }\n    });\n  };\n  const listener = (event) => {\n    const el = unrefElement(target);\n    if (!el || el === event.target || event.composedPath().includes(el))\n      return;\n    if (event.detail === 0)\n      shouldListen = !shouldIgnore(event);\n    if (!shouldListen) {\n      shouldListen = true;\n      return;\n    }\n    handler(event);\n  };\n  const cleanup = [\n    useEventListener(window, \"click\", listener, { passive: true, capture }),\n    useEventListener(window, \"pointerdown\", (e) => {\n      const el = unrefElement(target);\n      shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));\n    }, { passive: true }),\n    detectIframe && useEventListener(window, \"blur\", (event) => {\n      setTimeout(() => {\n        var _a;\n        const el = unrefElement(target);\n        if (((_a = window.document.activeElement) == null ? void 0 : _a.tagName) === \"IFRAME\" && !(el == null ? void 0 : el.contains(window.document.activeElement)))\n          handler(event);\n      }, 0);\n    })\n  ].filter(Boolean);\n  const stop = () => cleanup.forEach((fn) => fn());\n  return stop;\n}\n\nconst vOnClickOutside = {\n  [directiveHooks.mounted](el, binding) {\n    const capture = !binding.modifiers.bubble;\n    if (typeof binding.value === \"function\") {\n      el.__onClickOutside_stop = onClickOutside(el, binding.value, { capture });\n    } else {\n      const [handler, options] = binding.value;\n      el.__onClickOutside_stop = onClickOutside(el, handler, Object.assign({ capture }, options));\n    }\n  },\n  [directiveHooks.unmounted](el) {\n    el.__onClickOutside_stop();\n  }\n};\n\nfunction createKeyPredicate(keyFilter) {\n  if (typeof keyFilter === \"function\")\n    return keyFilter;\n  else if (typeof keyFilter === \"string\")\n    return (event) => event.key === keyFilter;\n  else if (Array.isArray(keyFilter))\n    return (event) => keyFilter.includes(event.key);\n  return () => true;\n}\nfunction onKeyStroke(...args) {\n  let key;\n  let handler;\n  let options = {};\n  if (args.length === 3) {\n    key = args[0];\n    handler = args[1];\n    options = args[2];\n  } else if (args.length === 2) {\n    if (typeof args[1] === \"object\") {\n      key = true;\n      handler = args[0];\n      options = args[1];\n    } else {\n      key = args[0];\n      handler = args[1];\n    }\n  } else {\n    key = true;\n    handler = args[0];\n  }\n  const {\n    target = defaultWindow,\n    eventName = \"keydown\",\n    passive = false,\n    dedupe = false\n  } = options;\n  const predicate = createKeyPredicate(key);\n  const listener = (e) => {\n    if (e.repeat && toValue(dedupe))\n      return;\n    if (predicate(e))\n      handler(e);\n  };\n  return useEventListener(target, eventName, listener, passive);\n}\n\nconst vOnKeyStroke = {\n  [directiveHooks.mounted](el, binding) {\n    var _a, _b;\n    const keys = (_b = (_a = binding.arg) == null ? void 0 : _a.split(\",\")) != null ? _b : true;\n    if (typeof binding.value === \"function\") {\n      onKeyStroke(keys, binding.value, {\n        target: el\n      });\n    } else {\n      const [handler, options] = binding.value;\n      onKeyStroke(keys, handler, {\n        target: el,\n        ...options\n      });\n    }\n  }\n};\n\nconst DEFAULT_DELAY = 500;\nconst DEFAULT_THRESHOLD = 10;\nfunction onLongPress(target, handler, options) {\n  var _a, _b;\n  const elementRef = computed(() => unrefElement(target));\n  let timeout;\n  let posStart;\n  function clear() {\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = void 0;\n    }\n    posStart = void 0;\n  }\n  function onDown(ev) {\n    var _a2, _b2, _c, _d;\n    if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n      return;\n    clear();\n    if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n      ev.preventDefault();\n    if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n      ev.stopPropagation();\n    posStart = {\n      x: ev.x,\n      y: ev.y\n    };\n    timeout = setTimeout(\n      () => handler(ev),\n      (_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY\n    );\n  }\n  function onMove(ev) {\n    var _a2, _b2, _c, _d;\n    if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n      return;\n    if (!posStart || (options == null ? void 0 : options.distanceThreshold) === false)\n      return;\n    if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n      ev.preventDefault();\n    if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n      ev.stopPropagation();\n    const dx = ev.x - posStart.x;\n    const dy = ev.y - posStart.y;\n    const distance = Math.sqrt(dx * dx + dy * dy);\n    if (distance >= ((_d = options == null ? void 0 : options.distanceThreshold) != null ? _d : DEFAULT_THRESHOLD))\n      clear();\n  }\n  const listenerOptions = {\n    capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,\n    once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once\n  };\n  const cleanup = [\n    useEventListener(elementRef, \"pointerdown\", onDown, listenerOptions),\n    useEventListener(elementRef, \"pointermove\", onMove, listenerOptions),\n    useEventListener(elementRef, [\"pointerup\", \"pointerleave\"], clear, listenerOptions)\n  ];\n  const stop = () => cleanup.forEach((fn) => fn());\n  return stop;\n}\n\nconst OnLongPress = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"OnLongPress\",\n  props: [\"as\", \"options\"],\n  emits: [\"trigger\"],\n  setup(props, { slots, emit }) {\n    const target = ref();\n    onLongPress(\n      target,\n      (e) => {\n        emit(\"trigger\", e);\n      },\n      props.options\n    );\n    return () => {\n      if (slots.default)\n        return h(props.as || \"div\", { ref: target }, slots.default());\n    };\n  }\n});\n\nconst vOnLongPress = {\n  [directiveHooks.mounted](el, binding) {\n    if (typeof binding.value === \"function\")\n      onLongPress(el, binding.value, { modifiers: binding.modifiers });\n    else\n      onLongPress(el, ...binding.value);\n  }\n};\n\nconst UseActiveElement = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseActiveElement\",\n  setup(props, { slots }) {\n    const data = reactive({\n      element: useActiveElement()\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseBattery = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseBattery\",\n  setup(props, { slots }) {\n    const data = reactive(useBattery(props));\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseBrowserLocation = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseBrowserLocation\",\n  setup(props, { slots }) {\n    const data = reactive(useBrowserLocation());\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseClipboard = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseClipboard\",\n  props: [\n    \"source\",\n    \"read\",\n    \"navigator\",\n    \"copiedDuring\",\n    \"legacy\"\n  ],\n  setup(props, { slots }) {\n    const data = reactive(useClipboard(props));\n    return () => {\n      var _a;\n      return (_a = slots.default) == null ? void 0 : _a.call(slots, data);\n    };\n  }\n});\n\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\nconst handlers = /* @__PURE__ */ getHandlers();\nfunction getHandlers() {\n  if (!(globalKey in _global))\n    _global[globalKey] = _global[globalKey] || {};\n  return _global[globalKey];\n}\nfunction getSSRHandler(key, fallback) {\n  return handlers[key] || fallback;\n}\n\nfunction guessSerializerType(rawInit) {\n  return rawInit == null ? \"any\" : rawInit instanceof Set ? \"set\" : rawInit instanceof Map ? \"map\" : rawInit instanceof Date ? \"date\" : typeof rawInit === \"boolean\" ? \"boolean\" : typeof rawInit === \"string\" ? \"string\" : typeof rawInit === \"object\" ? \"object\" : !Number.isNaN(rawInit) ? \"number\" : \"any\";\n}\n\nconst StorageSerializers = {\n  boolean: {\n    read: (v) => v === \"true\",\n    write: (v) => String(v)\n  },\n  object: {\n    read: (v) => JSON.parse(v),\n    write: (v) => JSON.stringify(v)\n  },\n  number: {\n    read: (v) => Number.parseFloat(v),\n    write: (v) => String(v)\n  },\n  any: {\n    read: (v) => v,\n    write: (v) => String(v)\n  },\n  string: {\n    read: (v) => v,\n    write: (v) => String(v)\n  },\n  map: {\n    read: (v) => new Map(JSON.parse(v)),\n    write: (v) => JSON.stringify(Array.from(v.entries()))\n  },\n  set: {\n    read: (v) => new Set(JSON.parse(v)),\n    write: (v) => JSON.stringify(Array.from(v))\n  },\n  date: {\n    read: (v) => new Date(v),\n    write: (v) => v.toISOString()\n  }\n};\nconst customStorageEventName = \"vueuse-storage\";\nfunction useStorage(key, defaults, storage, options = {}) {\n  var _a;\n  const {\n    flush = \"pre\",\n    deep = true,\n    listenToStorageChanges = true,\n    writeDefaults = true,\n    mergeDefaults = false,\n    shallow,\n    window = defaultWindow,\n    eventFilter,\n    onError = (e) => {\n      console.error(e);\n    },\n    initOnMounted\n  } = options;\n  const data = (shallow ? shallowRef : ref)(typeof defaults === \"function\" ? defaults() : defaults);\n  if (!storage) {\n    try {\n      storage = getSSRHandler(\"getDefaultStorage\", () => {\n        var _a2;\n        return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n      })();\n    } catch (e) {\n      onError(e);\n    }\n  }\n  if (!storage)\n    return data;\n  const rawInit = toValue(defaults);\n  const type = guessSerializerType(rawInit);\n  const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n  const { pause: pauseWatch, resume: resumeWatch } = pausableWatch(\n    data,\n    () => write(data.value),\n    { flush, deep, eventFilter }\n  );\n  if (window && listenToStorageChanges) {\n    tryOnMounted(() => {\n      useEventListener(window, \"storage\", update);\n      useEventListener(window, customStorageEventName, updateFromCustomEvent);\n      if (initOnMounted)\n        update();\n    });\n  }\n  if (!initOnMounted)\n    update();\n  function dispatchWriteEvent(oldValue, newValue) {\n    if (window) {\n      window.dispatchEvent(new CustomEvent(customStorageEventName, {\n        detail: {\n          key,\n          oldValue,\n          newValue,\n          storageArea: storage\n        }\n      }));\n    }\n  }\n  function write(v) {\n    try {\n      const oldValue = storage.getItem(key);\n      if (v == null) {\n        dispatchWriteEvent(oldValue, null);\n        storage.removeItem(key);\n      } else {\n        const serialized = serializer.write(v);\n        if (oldValue !== serialized) {\n          storage.setItem(key, serialized);\n          dispatchWriteEvent(oldValue, serialized);\n        }\n      }\n    } catch (e) {\n      onError(e);\n    }\n  }\n  function read(event) {\n    const rawValue = event ? event.newValue : storage.getItem(key);\n    if (rawValue == null) {\n      if (writeDefaults && rawInit != null)\n        storage.setItem(key, serializer.write(rawInit));\n      return rawInit;\n    } else if (!event && mergeDefaults) {\n      const value = serializer.read(rawValue);\n      if (typeof mergeDefaults === \"function\")\n        return mergeDefaults(value, rawInit);\n      else if (type === \"object\" && !Array.isArray(value))\n        return { ...rawInit, ...value };\n      return value;\n    } else if (typeof rawValue !== \"string\") {\n      return rawValue;\n    } else {\n      return serializer.read(rawValue);\n    }\n  }\n  function update(event) {\n    if (event && event.storageArea !== storage)\n      return;\n    if (event && event.key == null) {\n      data.value = rawInit;\n      return;\n    }\n    if (event && event.key !== key)\n      return;\n    pauseWatch();\n    try {\n      if ((event == null ? void 0 : event.newValue) !== serializer.write(data.value))\n        data.value = read(event);\n    } catch (e) {\n      onError(e);\n    } finally {\n      if (event)\n        nextTick(resumeWatch);\n      else\n        resumeWatch();\n    }\n  }\n  function updateFromCustomEvent(event) {\n    update(event.detail);\n  }\n  return data;\n}\n\nfunction useMounted() {\n  const isMounted = ref(false);\n  const instance = getCurrentInstance();\n  if (instance) {\n    onMounted(() => {\n      isMounted.value = true;\n    }, isVue2 ? null : instance);\n  }\n  return isMounted;\n}\n\nfunction useSupported(callback) {\n  const isMounted = useMounted();\n  return computed(() => {\n    isMounted.value;\n    return Boolean(callback());\n  });\n}\n\nfunction useMediaQuery(query, options = {}) {\n  const { window = defaultWindow } = options;\n  const isSupported = useSupported(() => window && \"matchMedia\" in window && typeof window.matchMedia === \"function\");\n  let mediaQuery;\n  const matches = ref(false);\n  const handler = (event) => {\n    matches.value = event.matches;\n  };\n  const cleanup = () => {\n    if (!mediaQuery)\n      return;\n    if (\"removeEventListener\" in mediaQuery)\n      mediaQuery.removeEventListener(\"change\", handler);\n    else\n      mediaQuery.removeListener(handler);\n  };\n  const stopWatch = watchEffect(() => {\n    if (!isSupported.value)\n      return;\n    cleanup();\n    mediaQuery = window.matchMedia(toValue(query));\n    if (\"addEventListener\" in mediaQuery)\n      mediaQuery.addEventListener(\"change\", handler);\n    else\n      mediaQuery.addListener(handler);\n    matches.value = mediaQuery.matches;\n  });\n  tryOnScopeDispose(() => {\n    stopWatch();\n    cleanup();\n    mediaQuery = void 0;\n  });\n  return matches;\n}\n\nfunction usePreferredDark(options) {\n  return useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n\nfunction useColorMode(options = {}) {\n  const {\n    selector = \"html\",\n    attribute = \"class\",\n    initialValue = \"auto\",\n    window = defaultWindow,\n    storage,\n    storageKey = \"vueuse-color-scheme\",\n    listenToStorageChanges = true,\n    storageRef,\n    emitAuto,\n    disableTransition = true\n  } = options;\n  const modes = {\n    auto: \"\",\n    light: \"light\",\n    dark: \"dark\",\n    ...options.modes || {}\n  };\n  const preferredDark = usePreferredDark({ window });\n  const system = computed(() => preferredDark.value ? \"dark\" : \"light\");\n  const store = storageRef || (storageKey == null ? toRef(initialValue) : useStorage(storageKey, initialValue, storage, { window, listenToStorageChanges }));\n  const state = computed(() => store.value === \"auto\" ? system.value : store.value);\n  const updateHTMLAttrs = getSSRHandler(\n    \"updateHTMLAttrs\",\n    (selector2, attribute2, value) => {\n      const el = typeof selector2 === \"string\" ? window == null ? void 0 : window.document.querySelector(selector2) : unrefElement(selector2);\n      if (!el)\n        return;\n      let style;\n      if (disableTransition) {\n        style = window.document.createElement(\"style\");\n        const styleString = \"*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}\";\n        style.appendChild(document.createTextNode(styleString));\n        window.document.head.appendChild(style);\n      }\n      if (attribute2 === \"class\") {\n        const current = value.split(/\\s/g);\n        Object.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n          if (current.includes(v))\n            el.classList.add(v);\n          else\n            el.classList.remove(v);\n        });\n      } else {\n        el.setAttribute(attribute2, value);\n      }\n      if (disableTransition) {\n        window.getComputedStyle(style).opacity;\n        document.head.removeChild(style);\n      }\n    }\n  );\n  function defaultOnChanged(mode) {\n    var _a;\n    updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);\n  }\n  function onChanged(mode) {\n    if (options.onChanged)\n      options.onChanged(mode, defaultOnChanged);\n    else\n      defaultOnChanged(mode);\n  }\n  watch(state, onChanged, { flush: \"post\", immediate: true });\n  tryOnMounted(() => onChanged(state.value));\n  const auto = computed({\n    get() {\n      return emitAuto ? store.value : state.value;\n    },\n    set(v) {\n      store.value = v;\n    }\n  });\n  try {\n    return Object.assign(auto, { store, system, state });\n  } catch (e) {\n    return auto;\n  }\n}\n\nconst UseColorMode = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseColorMode\",\n  props: [\"selector\", \"attribute\", \"modes\", \"onChanged\", \"storageKey\", \"storage\", \"emitAuto\"],\n  setup(props, { slots }) {\n    const mode = useColorMode(props);\n    const data = reactive({\n      mode,\n      system: mode.system,\n      store: mode.store\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseDark = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseDark\",\n  props: [\"selector\", \"attribute\", \"valueDark\", \"valueLight\", \"onChanged\", \"storageKey\", \"storage\"],\n  setup(props, { slots }) {\n    const isDark = useDark(props);\n    const data = reactive({\n      isDark,\n      toggleDark: useToggle(isDark)\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseDeviceMotion = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseDeviceMotion\",\n  setup(props, { slots }) {\n    const data = reactive(useDeviceMotion());\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseDeviceOrientation = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseDeviceOrientation\",\n  setup(props, { slots }) {\n    const data = reactive(useDeviceOrientation());\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseDevicePixelRatio = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseDevicePixelRatio\",\n  setup(props, { slots }) {\n    const data = reactive({\n      pixelRatio: useDevicePixelRatio()\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseDevicesList = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseDevicesList\",\n  props: [\"onUpdated\", \"requestPermissions\", \"constraints\"],\n  setup(props, { slots }) {\n    const data = reactive(useDevicesList(props));\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseDocumentVisibility = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseDocumentVisibility\",\n  setup(props, { slots }) {\n    const data = reactive({\n      visibility: useDocumentVisibility()\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseDraggable = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseDraggable\",\n  props: [\n    \"storageKey\",\n    \"storageType\",\n    \"initialValue\",\n    \"exact\",\n    \"preventDefault\",\n    \"stopPropagation\",\n    \"pointerTypes\",\n    \"as\",\n    \"handle\",\n    \"axis\",\n    \"onStart\",\n    \"onMove\",\n    \"onEnd\",\n    \"disabled\"\n  ],\n  setup(props, { slots }) {\n    const target = ref();\n    const handle = computed(() => {\n      var _a;\n      return (_a = props.handle) != null ? _a : target.value;\n    });\n    const disabled = computed(() => !!props.disabled);\n    const storageValue = props.storageKey && useStorage$1(\n      props.storageKey,\n      toValue(props.initialValue) || { x: 0, y: 0 },\n      isClient$1 ? props.storageType === \"session\" ? sessionStorage : localStorage : void 0\n    );\n    const initialValue = storageValue || props.initialValue || { x: 0, y: 0 };\n    const onEnd = (position, event) => {\n      var _a;\n      (_a = props.onEnd) == null ? void 0 : _a.call(props, position, event);\n      if (!storageValue)\n        return;\n      storageValue.value.x = position.x;\n      storageValue.value.y = position.y;\n    };\n    const data = reactive(useDraggable(target, {\n      ...props,\n      handle,\n      initialValue,\n      onEnd,\n      disabled\n    }));\n    return () => {\n      if (slots.default)\n        return h(props.as || \"div\", { ref: target, style: `touch-action:none;${data.style}` }, slots.default(data));\n    };\n  }\n});\n\nconst UseElementBounding = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseElementBounding\",\n  props: [\"box\", \"as\"],\n  setup(props, { slots }) {\n    const target = ref();\n    const data = reactive(useElementBounding(target));\n    return () => {\n      if (slots.default)\n        return h(props.as || \"div\", { ref: target }, slots.default(data));\n    };\n  }\n});\n\nfunction useElementHover(el, options = {}) {\n  const {\n    delayEnter = 0,\n    delayLeave = 0,\n    window = defaultWindow\n  } = options;\n  const isHovered = ref(false);\n  let timer;\n  const toggle = (entering) => {\n    const delay = entering ? delayEnter : delayLeave;\n    if (timer) {\n      clearTimeout(timer);\n      timer = void 0;\n    }\n    if (delay)\n      timer = setTimeout(() => isHovered.value = entering, delay);\n    else\n      isHovered.value = entering;\n  };\n  if (!window)\n    return isHovered;\n  useEventListener(el, \"mouseenter\", () => toggle(true), { passive: true });\n  useEventListener(el, \"mouseleave\", () => toggle(false), { passive: true });\n  return isHovered;\n}\n\nconst vElementHover = {\n  [directiveHooks.mounted](el, binding) {\n    if (typeof binding.value === \"function\") {\n      const isHovered = useElementHover(el);\n      watch(isHovered, (v) => binding.value(v));\n    }\n  }\n};\n\nconst UseElementSize = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseElementSize\",\n  props: [\"width\", \"height\", \"box\", \"as\"],\n  setup(props, { slots }) {\n    const target = ref();\n    const data = reactive(useElementSize$1(target, { width: props.width, height: props.height }, { box: props.box }));\n    return () => {\n      if (slots.default)\n        return h(props.as || \"div\", { ref: target }, slots.default(data));\n    };\n  }\n});\n\nfunction useResizeObserver(target, callback, options = {}) {\n  const { window = defaultWindow, ...observerOptions } = options;\n  let observer;\n  const isSupported = useSupported(() => window && \"ResizeObserver\" in window);\n  const cleanup = () => {\n    if (observer) {\n      observer.disconnect();\n      observer = void 0;\n    }\n  };\n  const targets = computed(() => Array.isArray(target) ? target.map((el) => unrefElement(el)) : [unrefElement(target)]);\n  const stopWatch = watch(\n    targets,\n    (els) => {\n      cleanup();\n      if (isSupported.value && window) {\n        observer = new ResizeObserver(callback);\n        for (const _el of els)\n          _el && observer.observe(_el, observerOptions);\n      }\n    },\n    { immediate: true, flush: \"post\" }\n  );\n  const stop = () => {\n    cleanup();\n    stopWatch();\n  };\n  tryOnScopeDispose(stop);\n  return {\n    isSupported,\n    stop\n  };\n}\n\nfunction useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {\n  const { window = defaultWindow, box = \"content-box\" } = options;\n  const isSVG = computed(() => {\n    var _a, _b;\n    return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes(\"svg\");\n  });\n  const width = ref(initialSize.width);\n  const height = ref(initialSize.height);\n  const { stop: stop1 } = useResizeObserver(\n    target,\n    ([entry]) => {\n      const boxSize = box === \"border-box\" ? entry.borderBoxSize : box === \"content-box\" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;\n      if (window && isSVG.value) {\n        const $elem = unrefElement(target);\n        if ($elem) {\n          const styles = window.getComputedStyle($elem);\n          width.value = Number.parseFloat(styles.width);\n          height.value = Number.parseFloat(styles.height);\n        }\n      } else {\n        if (boxSize) {\n          const formatBoxSize = Array.isArray(boxSize) ? boxSize : [boxSize];\n          width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);\n          height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);\n        } else {\n          width.value = entry.contentRect.width;\n          height.value = entry.contentRect.height;\n        }\n      }\n    },\n    options\n  );\n  tryOnMounted(() => {\n    const ele = unrefElement(target);\n    if (ele) {\n      width.value = \"offsetWidth\" in ele ? ele.offsetWidth : initialSize.width;\n      height.value = \"offsetHeight\" in ele ? ele.offsetHeight : initialSize.height;\n    }\n  });\n  const stop2 = watch(\n    () => unrefElement(target),\n    (ele) => {\n      width.value = ele ? initialSize.width : 0;\n      height.value = ele ? initialSize.height : 0;\n    }\n  );\n  function stop() {\n    stop1();\n    stop2();\n  }\n  return {\n    width,\n    height,\n    stop\n  };\n}\n\nconst vElementSize = {\n  [directiveHooks.mounted](el, binding) {\n    var _a;\n    const handler = typeof binding.value === \"function\" ? binding.value : (_a = binding.value) == null ? void 0 : _a[0];\n    const options = typeof binding.value === \"function\" ? [] : binding.value.slice(1);\n    const { width, height } = useElementSize(el, ...options);\n    watch([width, height], ([width2, height2]) => handler({ width: width2, height: height2 }));\n  }\n};\n\nconst UseElementVisibility = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseElementVisibility\",\n  props: [\"as\"],\n  setup(props, { slots }) {\n    const target = ref();\n    const data = reactive({\n      isVisible: useElementVisibility$1(target)\n    });\n    return () => {\n      if (slots.default)\n        return h(props.as || \"div\", { ref: target }, slots.default(data));\n    };\n  }\n});\n\nfunction useIntersectionObserver(target, callback, options = {}) {\n  const {\n    root,\n    rootMargin = \"0px\",\n    threshold = 0.1,\n    window = defaultWindow,\n    immediate = true\n  } = options;\n  const isSupported = useSupported(() => window && \"IntersectionObserver\" in window);\n  const targets = computed(() => {\n    const _target = toValue(target);\n    return (Array.isArray(_target) ? _target : [_target]).map(unrefElement).filter(notNullish);\n  });\n  let cleanup = noop;\n  const isActive = ref(immediate);\n  const stopWatch = isSupported.value ? watch(\n    () => [targets.value, unrefElement(root), isActive.value],\n    ([targets2, root2]) => {\n      cleanup();\n      if (!isActive.value)\n        return;\n      if (!targets2.length)\n        return;\n      const observer = new IntersectionObserver(\n        callback,\n        {\n          root: unrefElement(root2),\n          rootMargin,\n          threshold\n        }\n      );\n      targets2.forEach((el) => el && observer.observe(el));\n      cleanup = () => {\n        observer.disconnect();\n        cleanup = noop;\n      };\n    },\n    { immediate, flush: \"post\" }\n  ) : noop;\n  const stop = () => {\n    cleanup();\n    stopWatch();\n    isActive.value = false;\n  };\n  tryOnScopeDispose(stop);\n  return {\n    isSupported,\n    isActive,\n    pause() {\n      cleanup();\n      isActive.value = false;\n    },\n    resume() {\n      isActive.value = true;\n    },\n    stop\n  };\n}\n\nfunction useElementVisibility(element, options = {}) {\n  const { window = defaultWindow, scrollTarget, threshold = 0 } = options;\n  const elementIsVisible = ref(false);\n  useIntersectionObserver(\n    element,\n    (intersectionObserverEntries) => {\n      let isIntersecting = elementIsVisible.value;\n      let latestTime = 0;\n      for (const entry of intersectionObserverEntries) {\n        if (entry.time >= latestTime) {\n          latestTime = entry.time;\n          isIntersecting = entry.isIntersecting;\n        }\n      }\n      elementIsVisible.value = isIntersecting;\n    },\n    {\n      root: scrollTarget,\n      window,\n      threshold\n    }\n  );\n  return elementIsVisible;\n}\n\nconst vElementVisibility = {\n  [directiveHooks.mounted](el, binding) {\n    if (typeof binding.value === \"function\") {\n      const handler = binding.value;\n      const isVisible = useElementVisibility(el);\n      watch(isVisible, (v) => handler(v), { immediate: true });\n    } else {\n      const [handler, options] = binding.value;\n      const isVisible = useElementVisibility(el, options);\n      watch(isVisible, (v) => handler(v), { immediate: true });\n    }\n  }\n};\n\nconst UseEyeDropper = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseEyeDropper\",\n  props: {\n    sRGBHex: String\n  },\n  setup(props, { slots }) {\n    const data = reactive(useEyeDropper());\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseFullscreen = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseFullscreen\",\n  props: [\"as\"],\n  setup(props, { slots }) {\n    const target = ref();\n    const data = reactive(useFullscreen(target));\n    return () => {\n      if (slots.default)\n        return h(props.as || \"div\", { ref: target }, slots.default(data));\n    };\n  }\n});\n\nconst UseGeolocation = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseGeolocation\",\n  props: [\"enableHighAccuracy\", \"maximumAge\", \"timeout\", \"navigator\"],\n  setup(props, { slots }) {\n    const data = reactive(useGeolocation(props));\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseIdle = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseIdle\",\n  props: [\"timeout\", \"events\", \"listenForVisibilityChange\", \"initialState\"],\n  setup(props, { slots }) {\n    const data = reactive(useIdle(props.timeout, props));\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nfunction useAsyncState(promise, initialState, options) {\n  const {\n    immediate = true,\n    delay = 0,\n    onError = noop,\n    onSuccess = noop,\n    resetOnExecute = true,\n    shallow = true,\n    throwError\n  } = options != null ? options : {};\n  const state = shallow ? shallowRef(initialState) : ref(initialState);\n  const isReady = ref(false);\n  const isLoading = ref(false);\n  const error = shallowRef(void 0);\n  async function execute(delay2 = 0, ...args) {\n    if (resetOnExecute)\n      state.value = initialState;\n    error.value = void 0;\n    isReady.value = false;\n    isLoading.value = true;\n    if (delay2 > 0)\n      await promiseTimeout(delay2);\n    const _promise = typeof promise === \"function\" ? promise(...args) : promise;\n    try {\n      const data = await _promise;\n      state.value = data;\n      isReady.value = true;\n      onSuccess(data);\n    } catch (e) {\n      error.value = e;\n      onError(e);\n      if (throwError)\n        throw e;\n    } finally {\n      isLoading.value = false;\n    }\n    return state.value;\n  }\n  if (immediate)\n    execute(delay);\n  const shell = {\n    state,\n    isReady,\n    isLoading,\n    error,\n    execute\n  };\n  function waitUntilIsLoaded() {\n    return new Promise((resolve, reject) => {\n      until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);\n    });\n  }\n  return {\n    ...shell,\n    then(onFulfilled, onRejected) {\n      return waitUntilIsLoaded().then(onFulfilled, onRejected);\n    }\n  };\n}\n\nasync function loadImage(options) {\n  return new Promise((resolve, reject) => {\n    const img = new Image();\n    const { src, srcset, sizes, class: clazz, loading, crossorigin, referrerPolicy } = options;\n    img.src = src;\n    if (srcset)\n      img.srcset = srcset;\n    if (sizes)\n      img.sizes = sizes;\n    if (clazz)\n      img.className = clazz;\n    if (loading)\n      img.loading = loading;\n    if (crossorigin)\n      img.crossOrigin = crossorigin;\n    if (referrerPolicy)\n      img.referrerPolicy = referrerPolicy;\n    img.onload = () => resolve(img);\n    img.onerror = reject;\n  });\n}\nfunction useImage(options, asyncStateOptions = {}) {\n  const state = useAsyncState(\n    () => loadImage(toValue(options)),\n    void 0,\n    {\n      resetOnExecute: true,\n      ...asyncStateOptions\n    }\n  );\n  watch(\n    () => toValue(options),\n    () => state.execute(asyncStateOptions.delay),\n    { deep: true }\n  );\n  return state;\n}\n\nconst UseImage = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseImage\",\n  props: [\n    \"src\",\n    \"srcset\",\n    \"sizes\",\n    \"as\",\n    \"alt\",\n    \"class\",\n    \"loading\",\n    \"crossorigin\",\n    \"referrerPolicy\"\n  ],\n  setup(props, { slots }) {\n    const data = reactive(useImage(props));\n    return () => {\n      if (data.isLoading && slots.loading)\n        return slots.loading(data);\n      else if (data.error && slots.error)\n        return slots.error(data.error);\n      if (slots.default)\n        return slots.default(data);\n      return h(props.as || \"img\", props);\n    };\n  }\n});\n\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\nfunction useScroll(element, options = {}) {\n  const {\n    throttle = 0,\n    idle = 200,\n    onStop = noop,\n    onScroll = noop,\n    offset = {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    },\n    eventListenerOptions = {\n      capture: false,\n      passive: true\n    },\n    behavior = \"auto\",\n    window = defaultWindow,\n    onError = (e) => {\n      console.error(e);\n    }\n  } = options;\n  const internalX = ref(0);\n  const internalY = ref(0);\n  const x = computed({\n    get() {\n      return internalX.value;\n    },\n    set(x2) {\n      scrollTo(x2, void 0);\n    }\n  });\n  const y = computed({\n    get() {\n      return internalY.value;\n    },\n    set(y2) {\n      scrollTo(void 0, y2);\n    }\n  });\n  function scrollTo(_x, _y) {\n    var _a, _b, _c;\n    if (!window)\n      return;\n    const _element = toValue(element);\n    if (!_element)\n      return;\n    (_c = _element instanceof Document ? window.document.body : _element) == null ? void 0 : _c.scrollTo({\n      top: (_a = toValue(_y)) != null ? _a : y.value,\n      left: (_b = toValue(_x)) != null ? _b : x.value,\n      behavior: toValue(behavior)\n    });\n  }\n  const isScrolling = ref(false);\n  const arrivedState = reactive({\n    left: true,\n    right: false,\n    top: true,\n    bottom: false\n  });\n  const directions = reactive({\n    left: false,\n    right: false,\n    top: false,\n    bottom: false\n  });\n  const onScrollEnd = (e) => {\n    if (!isScrolling.value)\n      return;\n    isScrolling.value = false;\n    directions.left = false;\n    directions.right = false;\n    directions.top = false;\n    directions.bottom = false;\n    onStop(e);\n  };\n  const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);\n  const setArrivedState = (target) => {\n    var _a;\n    if (!window)\n      return;\n    const el = ((_a = target == null ? void 0 : target.document) == null ? void 0 : _a.documentElement) || (target == null ? void 0 : target.documentElement) || unrefElement(target);\n    const { display, flexDirection } = getComputedStyle(el);\n    const scrollLeft = el.scrollLeft;\n    directions.left = scrollLeft < internalX.value;\n    directions.right = scrollLeft > internalX.value;\n    const left = Math.abs(scrollLeft) <= (offset.left || 0);\n    const right = Math.abs(scrollLeft) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n    if (display === \"flex\" && flexDirection === \"row-reverse\") {\n      arrivedState.left = right;\n      arrivedState.right = left;\n    } else {\n      arrivedState.left = left;\n      arrivedState.right = right;\n    }\n    internalX.value = scrollLeft;\n    let scrollTop = el.scrollTop;\n    if (target === window.document && !scrollTop)\n      scrollTop = window.document.body.scrollTop;\n    directions.top = scrollTop < internalY.value;\n    directions.bottom = scrollTop > internalY.value;\n    const top = Math.abs(scrollTop) <= (offset.top || 0);\n    const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n    if (display === \"flex\" && flexDirection === \"column-reverse\") {\n      arrivedState.top = bottom;\n      arrivedState.bottom = top;\n    } else {\n      arrivedState.top = top;\n      arrivedState.bottom = bottom;\n    }\n    internalY.value = scrollTop;\n  };\n  const onScrollHandler = (e) => {\n    var _a;\n    if (!window)\n      return;\n    const eventTarget = (_a = e.target.documentElement) != null ? _a : e.target;\n    setArrivedState(eventTarget);\n    isScrolling.value = true;\n    onScrollEndDebounced(e);\n    onScroll(e);\n  };\n  useEventListener(\n    element,\n    \"scroll\",\n    throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,\n    eventListenerOptions\n  );\n  tryOnMounted(() => {\n    try {\n      const _element = toValue(element);\n      if (!_element)\n        return;\n      setArrivedState(_element);\n    } catch (e) {\n      onError(e);\n    }\n  });\n  useEventListener(\n    element,\n    \"scrollend\",\n    onScrollEnd,\n    eventListenerOptions\n  );\n  return {\n    x,\n    y,\n    isScrolling,\n    arrivedState,\n    directions,\n    measure() {\n      const _element = toValue(element);\n      if (window && _element)\n        setArrivedState(_element);\n    }\n  };\n}\n\nfunction resolveElement(el) {\n  if (typeof Window !== \"undefined\" && el instanceof Window)\n    return el.document.documentElement;\n  if (typeof Document !== \"undefined\" && el instanceof Document)\n    return el.documentElement;\n  return el;\n}\n\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n  var _a;\n  const {\n    direction = \"bottom\",\n    interval = 100,\n    canLoadMore = () => true\n  } = options;\n  const state = reactive(useScroll(\n    element,\n    {\n      ...options,\n      offset: {\n        [direction]: (_a = options.distance) != null ? _a : 0,\n        ...options.offset\n      }\n    }\n  ));\n  const promise = ref();\n  const isLoading = computed(() => !!promise.value);\n  const observedElement = computed(() => {\n    return resolveElement(toValue(element));\n  });\n  const isElementVisible = useElementVisibility(observedElement);\n  function checkAndLoad() {\n    state.measure();\n    if (!observedElement.value || !isElementVisible.value || !canLoadMore(observedElement.value))\n      return;\n    const { scrollHeight, clientHeight, scrollWidth, clientWidth } = observedElement.value;\n    const isNarrower = direction === \"bottom\" || direction === \"top\" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth;\n    if (state.arrivedState[direction] || isNarrower) {\n      if (!promise.value) {\n        promise.value = Promise.all([\n          onLoadMore(state),\n          new Promise((resolve) => setTimeout(resolve, interval))\n        ]).finally(() => {\n          promise.value = null;\n          nextTick(() => checkAndLoad());\n        });\n      }\n    }\n  }\n  watch(\n    () => [state.arrivedState[direction], isElementVisible.value],\n    checkAndLoad,\n    { immediate: true }\n  );\n  return {\n    isLoading\n  };\n}\n\nconst vInfiniteScroll = {\n  [directiveHooks.mounted](el, binding) {\n    if (typeof binding.value === \"function\")\n      useInfiniteScroll(el, binding.value);\n    else\n      useInfiniteScroll(el, ...binding.value);\n  }\n};\n\nconst vIntersectionObserver = {\n  [directiveHooks.mounted](el, binding) {\n    if (typeof binding.value === \"function\")\n      useIntersectionObserver(el, binding.value);\n    else\n      useIntersectionObserver(el, ...binding.value);\n  }\n};\n\nconst UseMouse = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseMouse\",\n  props: [\"touch\", \"resetOnTouchEnds\", \"initialValue\"],\n  setup(props, { slots }) {\n    const data = reactive(useMouse(props));\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseMouseInElement = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseMouseElement\",\n  props: [\"handleOutside\", \"as\"],\n  setup(props, { slots }) {\n    const target = ref();\n    const data = reactive(useMouseInElement(target, props));\n    return () => {\n      if (slots.default)\n        return h(props.as || \"div\", { ref: target }, slots.default(data));\n    };\n  }\n});\n\nconst UseMousePressed = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseMousePressed\",\n  props: [\"touch\", \"initialValue\", \"as\"],\n  setup(props, { slots }) {\n    const target = ref();\n    const data = reactive(useMousePressed({ ...props, target }));\n    return () => {\n      if (slots.default)\n        return h(props.as || \"div\", { ref: target }, slots.default(data));\n    };\n  }\n});\n\nconst UseNetwork = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseNetwork\",\n  setup(props, { slots }) {\n    const data = reactive(useNetwork());\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseNow = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseNow\",\n  props: [\"interval\"],\n  setup(props, { slots }) {\n    const data = reactive(useNow({ ...props, controls: true }));\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseObjectUrl = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseObjectUrl\",\n  props: [\n    \"object\"\n  ],\n  setup(props, { slots }) {\n    const object = toRef(props, \"object\");\n    const url = useObjectUrl(object);\n    return () => {\n      if (slots.default && url.value)\n        return slots.default(url);\n    };\n  }\n});\n\nconst UseOffsetPagination = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseOffsetPagination\",\n  props: [\n    \"total\",\n    \"page\",\n    \"pageSize\",\n    \"onPageChange\",\n    \"onPageSizeChange\",\n    \"onPageCountChange\"\n  ],\n  emits: [\n    \"page-change\",\n    \"page-size-change\",\n    \"page-count-change\"\n  ],\n  setup(props, { slots, emit }) {\n    const data = reactive(useOffsetPagination({\n      ...props,\n      onPageChange(...args) {\n        var _a;\n        (_a = props.onPageChange) == null ? void 0 : _a.call(props, ...args);\n        emit(\"page-change\", ...args);\n      },\n      onPageSizeChange(...args) {\n        var _a;\n        (_a = props.onPageSizeChange) == null ? void 0 : _a.call(props, ...args);\n        emit(\"page-size-change\", ...args);\n      },\n      onPageCountChange(...args) {\n        var _a;\n        (_a = props.onPageCountChange) == null ? void 0 : _a.call(props, ...args);\n        emit(\"page-count-change\", ...args);\n      }\n    }));\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseOnline = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseOnline\",\n  setup(props, { slots }) {\n    const data = reactive({\n      isOnline: useOnline()\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UsePageLeave = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UsePageLeave\",\n  setup(props, { slots }) {\n    const data = reactive({\n      isLeft: usePageLeave()\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UsePointer = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UsePointer\",\n  props: [\n    \"pointerTypes\",\n    \"initialValue\",\n    \"target\"\n  ],\n  setup(props, { slots }) {\n    const el = ref(null);\n    const data = reactive(usePointer({\n      ...props,\n      target: props.target === \"self\" ? el : defaultWindow\n    }));\n    return () => {\n      if (slots.default)\n        return slots.default(data, { ref: el });\n    };\n  }\n});\n\nconst UsePointerLock = /* #__PURE__ */ defineComponent({\n  name: \"UsePointerLock\",\n  props: [\"as\"],\n  setup(props, { slots }) {\n    const target = ref();\n    const data = reactive(usePointerLock(target));\n    return () => {\n      if (slots.default)\n        return h(props.as || \"div\", { ref: target }, slots.default(data));\n    };\n  }\n});\n\nconst UsePreferredColorScheme = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UsePreferredColorScheme\",\n  setup(props, { slots }) {\n    const data = reactive({\n      colorScheme: usePreferredColorScheme()\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UsePreferredContrast = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UsePreferredContrast\",\n  setup(props, { slots }) {\n    const data = reactive({\n      contrast: usePreferredContrast()\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UsePreferredDark = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UsePreferredDark\",\n  setup(props, { slots }) {\n    const data = reactive({\n      prefersDark: usePreferredDark$1()\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UsePreferredLanguages = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UsePreferredLanguages\",\n  setup(props, { slots }) {\n    const data = reactive({\n      languages: usePreferredLanguages()\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UsePreferredReducedMotion = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UsePreferredReducedMotion\",\n  setup(props, { slots }) {\n    const data = reactive({\n      motion: usePreferredReducedMotion()\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nfunction useMutationObserver(target, callback, options = {}) {\n  const { window = defaultWindow, ...mutationOptions } = options;\n  let observer;\n  const isSupported = useSupported(() => window && \"MutationObserver\" in window);\n  const cleanup = () => {\n    if (observer) {\n      observer.disconnect();\n      observer = void 0;\n    }\n  };\n  const targets = computed(() => {\n    const value = toValue(target);\n    const items = (Array.isArray(value) ? value : [value]).map(unrefElement).filter(notNullish);\n    return new Set(items);\n  });\n  const stopWatch = watch(\n    () => targets.value,\n    (targets2) => {\n      cleanup();\n      if (isSupported.value && window && targets2.size) {\n        observer = new MutationObserver(callback);\n        targets2.forEach((el) => observer.observe(el, mutationOptions));\n      }\n    },\n    { immediate: true, flush: \"post\" }\n  );\n  const takeRecords = () => {\n    return observer == null ? void 0 : observer.takeRecords();\n  };\n  const stop = () => {\n    cleanup();\n    stopWatch();\n  };\n  tryOnScopeDispose(stop);\n  return {\n    isSupported,\n    stop,\n    takeRecords\n  };\n}\n\nfunction useCssVar(prop, target, options = {}) {\n  const { window = defaultWindow, initialValue = \"\", observe = false } = options;\n  const variable = ref(initialValue);\n  const elRef = computed(() => {\n    var _a;\n    return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);\n  });\n  function updateCssVar() {\n    var _a;\n    const key = toValue(prop);\n    const el = toValue(elRef);\n    if (el && window) {\n      const value = (_a = window.getComputedStyle(el).getPropertyValue(key)) == null ? void 0 : _a.trim();\n      variable.value = value || initialValue;\n    }\n  }\n  if (observe) {\n    useMutationObserver(elRef, updateCssVar, {\n      attributeFilter: [\"style\", \"class\"],\n      window\n    });\n  }\n  watch(\n    [elRef, () => toValue(prop)],\n    updateCssVar,\n    { immediate: true }\n  );\n  watch(\n    variable,\n    (val) => {\n      var _a;\n      if ((_a = elRef.value) == null ? void 0 : _a.style)\n        elRef.value.style.setProperty(toValue(prop), val);\n    }\n  );\n  return variable;\n}\n\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\nfunction useScreenSafeArea() {\n  const top = ref(\"\");\n  const right = ref(\"\");\n  const bottom = ref(\"\");\n  const left = ref(\"\");\n  if (isClient) {\n    const topCssVar = useCssVar(topVarName);\n    const rightCssVar = useCssVar(rightVarName);\n    const bottomCssVar = useCssVar(bottomVarName);\n    const leftCssVar = useCssVar(leftVarName);\n    topCssVar.value = \"env(safe-area-inset-top, 0px)\";\n    rightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n    bottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n    leftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n    update();\n    useEventListener(\"resize\", useDebounceFn(update));\n  }\n  function update() {\n    top.value = getValue(topVarName);\n    right.value = getValue(rightVarName);\n    bottom.value = getValue(bottomVarName);\n    left.value = getValue(leftVarName);\n  }\n  return {\n    top,\n    right,\n    bottom,\n    left,\n    update\n  };\n}\nfunction getValue(position) {\n  return getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n\nconst UseScreenSafeArea = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseScreenSafeArea\",\n  props: {\n    top: Boolean,\n    right: Boolean,\n    bottom: Boolean,\n    left: Boolean\n  },\n  setup(props, { slots }) {\n    const {\n      top,\n      right,\n      bottom,\n      left\n    } = useScreenSafeArea();\n    return () => {\n      if (slots.default) {\n        return h(\"div\", {\n          style: {\n            paddingTop: props.top ? top.value : \"\",\n            paddingRight: props.right ? right.value : \"\",\n            paddingBottom: props.bottom ? bottom.value : \"\",\n            paddingLeft: props.left ? left.value : \"\",\n            boxSizing: \"border-box\",\n            maxHeight: \"100vh\",\n            maxWidth: \"100vw\",\n            overflow: \"auto\"\n          }\n        }, slots.default());\n      }\n    };\n  }\n});\n\nconst vScroll = {\n  [directiveHooks.mounted](el, binding) {\n    if (typeof binding.value === \"function\") {\n      const handler = binding.value;\n      const state = useScroll(el, {\n        onScroll() {\n          handler(state);\n        },\n        onStop() {\n          handler(state);\n        }\n      });\n    } else {\n      const [handler, options] = binding.value;\n      const state = useScroll(el, {\n        ...options,\n        onScroll(e) {\n          var _a;\n          (_a = options.onScroll) == null ? void 0 : _a.call(options, e);\n          handler(state);\n        },\n        onStop(e) {\n          var _a;\n          (_a = options.onStop) == null ? void 0 : _a.call(options, e);\n          handler(state);\n        }\n      });\n    }\n  }\n};\n\nfunction checkOverflowScroll(ele) {\n  const style = window.getComputedStyle(ele);\n  if (style.overflowX === \"scroll\" || style.overflowY === \"scroll\" || style.overflowX === \"auto\" && ele.clientWidth < ele.scrollWidth || style.overflowY === \"auto\" && ele.clientHeight < ele.scrollHeight) {\n    return true;\n  } else {\n    const parent = ele.parentNode;\n    if (!parent || parent.tagName === \"BODY\")\n      return false;\n    return checkOverflowScroll(parent);\n  }\n}\nfunction preventDefault(rawEvent) {\n  const e = rawEvent || window.event;\n  const _target = e.target;\n  if (checkOverflowScroll(_target))\n    return false;\n  if (e.touches.length > 1)\n    return true;\n  if (e.preventDefault)\n    e.preventDefault();\n  return false;\n}\nconst elInitialOverflow = /* @__PURE__ */ new WeakMap();\nfunction useScrollLock(element, initialState = false) {\n  const isLocked = ref(initialState);\n  let stopTouchMoveListener = null;\n  watch(toRef(element), (el) => {\n    const target = resolveElement(toValue(el));\n    if (target) {\n      const ele = target;\n      if (!elInitialOverflow.get(ele))\n        elInitialOverflow.set(ele, ele.style.overflow);\n      if (isLocked.value)\n        ele.style.overflow = \"hidden\";\n    }\n  }, {\n    immediate: true\n  });\n  const lock = () => {\n    const el = resolveElement(toValue(element));\n    if (!el || isLocked.value)\n      return;\n    if (isIOS) {\n      stopTouchMoveListener = useEventListener(\n        el,\n        \"touchmove\",\n        (e) => {\n          preventDefault(e);\n        },\n        { passive: false }\n      );\n    }\n    el.style.overflow = \"hidden\";\n    isLocked.value = true;\n  };\n  const unlock = () => {\n    var _a;\n    const el = resolveElement(toValue(element));\n    if (!el || !isLocked.value)\n      return;\n    isIOS && (stopTouchMoveListener == null ? void 0 : stopTouchMoveListener());\n    el.style.overflow = (_a = elInitialOverflow.get(el)) != null ? _a : \"\";\n    elInitialOverflow.delete(el);\n    isLocked.value = false;\n  };\n  tryOnScopeDispose(unlock);\n  return computed({\n    get() {\n      return isLocked.value;\n    },\n    set(v) {\n      if (v)\n        lock();\n      else\n        unlock();\n    }\n  });\n}\n\nfunction onScrollLock() {\n  let isMounted = false;\n  const state = ref(false);\n  return (el, binding) => {\n    state.value = binding.value;\n    if (isMounted)\n      return;\n    isMounted = true;\n    const isLocked = useScrollLock(el, binding.value);\n    watch(state, (v) => isLocked.value = v);\n  };\n}\nconst vScrollLock = onScrollLock();\n\nconst UseTimeAgo = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseTimeAgo\",\n  props: [\"time\", \"updateInterval\", \"max\", \"fullDateFormatter\", \"messages\", \"showSecond\"],\n  setup(props, { slots }) {\n    const data = reactive(useTimeAgo(() => props.time, { ...props, controls: true }));\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseTimestamp = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseTimestamp\",\n  props: [\"immediate\", \"interval\", \"offset\"],\n  setup(props, { slots }) {\n    const data = reactive(useTimestamp({ ...props, controls: true }));\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseVirtualList = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseVirtualList\",\n  props: [\n    \"list\",\n    \"options\",\n    \"height\"\n  ],\n  setup(props, { slots, expose }) {\n    const { list: listRef } = toRefs(props);\n    const { list, containerProps, wrapperProps, scrollTo } = useVirtualList(listRef, props.options);\n    expose({ scrollTo });\n    if (containerProps.style && typeof containerProps.style === \"object\" && !Array.isArray(containerProps.style))\n      containerProps.style.height = props.height || \"300px\";\n    return () => h(\"div\", { ...containerProps }, [\n      h(\"div\", { ...wrapperProps.value }, list.value.map((item) => h(\"div\", { style: { overflow: \"hidden\", height: item.height } }, slots.default ? slots.default(item) : \"Please set content!\")))\n    ]);\n  }\n});\n\nconst UseWindowFocus = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseWindowFocus\",\n  setup(props, { slots }) {\n    const data = reactive({\n      focused: useWindowFocus()\n    });\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nconst UseWindowSize = /* @__PURE__ */ /* #__PURE__ */ defineComponent({\n  name: \"UseWindowSize\",\n  props: [\"initialWidth\", \"initialHeight\"],\n  setup(props, { slots }) {\n    const data = reactive(useWindowSize(props));\n    return () => {\n      if (slots.default)\n        return slots.default(data);\n    };\n  }\n});\n\nexport { OnClickOutside, OnLongPress, UseActiveElement, UseBattery, UseBrowserLocation, UseClipboard, UseColorMode, UseDark, UseDeviceMotion, UseDeviceOrientation, UseDevicePixelRatio, UseDevicesList, UseDocumentVisibility, UseDraggable, UseElementBounding, UseElementSize, UseElementVisibility, UseEyeDropper, UseFullscreen, UseGeolocation, UseIdle, UseImage, UseMouse, UseMouseInElement, UseMousePressed, UseNetwork, UseNow, UseObjectUrl, UseOffsetPagination, UseOnline, UsePageLeave, UsePointer, UsePointerLock, UsePreferredColorScheme, UsePreferredContrast, UsePreferredDark, UsePreferredLanguages, UsePreferredReducedMotion, UseScreenSafeArea, UseTimeAgo, UseTimestamp, UseVirtualList, UseWindowFocus, UseWindowSize, vOnClickOutside as VOnClickOutside, vOnLongPress as VOnLongPress, vElementHover, vElementSize, vElementVisibility, vInfiniteScroll, vIntersectionObserver, vOnClickOutside, vOnKeyStroke, vOnLongPress, vScroll, vScrollLock };\n","<script setup>\r\nimport { getDataRefs } from \"@/util/vue\";\r\n\r\nimport { Navigation, Scrollbar } from \"swiper/modules\";\r\nimport { Swiper, SwiperSlide } from \"swiper/vue\";\r\nimport { vIntersectionObserver } from \"@vueuse/components\";\r\n\r\nimport \"swiper/css\";\r\nimport \"swiper/css/navigation\";\r\nimport \"swiper/css/scrollbar\";\r\n\r\nimport FhFigure from \"@/components/FhFigure.vue\";\r\nimport FhSection from \"@/includes/FhSection.vue\";\r\nimport { sent_custom_event } from \"@/util/googleAnalytics.js\";\r\n\r\nconst props = defineProps({\r\n  style: {\r\n    type: Object,\r\n    required: false,\r\n    default: () => ({})\r\n  },\r\n  data: {\r\n    type: Object,\r\n    required: true,\r\n    default: () => ({})\r\n  }\r\n});\r\n\r\nconst { slides } = getDataRefs(props.data);\r\n\r\nconst onInView = ([{ isIntersecting }]) => {\r\n  if (isIntersecting) {\r\n    sent_custom_event(\"slide_viewed\", { slide: 1 });\r\n  }\r\n};\r\nconst onSlide = (slideEvent) => {\r\n  const { activeIndex } = slideEvent;\r\n  sent_custom_event(\"slide_navigation\", { slide: activeIndex + 1 });\r\n};\r\n</script>\r\n\r\n<template>\r\n  <FhSection\r\n    v-intersection-observer=\"onInView\"\r\n    class=\"fhSlideshowSection\"\r\n    :base=\"style.base\"\r\n    :class=\"{\r\n      'text-white': ['slate', 'umber', 'sage'].includes(props.style?.base?.background)\r\n    }\"\r\n  >\r\n    <div class=\"fhSlideshow\">\r\n      <swiper :loop=\"true\" :modules=\"[Navigation, Scrollbar]\" :slides-per-view=\"1\" :scrollbar=\"{ draggable: true }\" navigation @slide-change=\"onSlide\">\r\n        <swiper-slide v-for=\"slide in slides\" :key=\"slide\" :class=\"slide.hasOverlay ? 'filter' : ''\">\r\n          <FhFigure v-if=\"!slide.isVideo\" :data=\"{ ...slide, gaTagging: `${slide.gaTagging}_image_${slide.id}` }\" />\r\n          <FhFigure v-else :data=\"{ ...slide, gaTagging: `${slide.gaTagging}_video_${slide.id}` }\" is-video=\"slide.isVideo\" />\r\n        </swiper-slide>\r\n      </swiper>\r\n    </div>\r\n  </FhSection>\r\n</template>\r\n\r\n<style lang=\"pcss\" scoped>\r\n.fhSlideshowSection.widget--width-md,\r\n.fhSlideshowSection.widget--width-sm,\r\n.fhSlideshowSection.widget--width-md:before,\r\n.fhSlideshowSection.widget--width-sm:before,\r\n.fhSlideshowSection.widget--width-md:after,\r\n.fhSlideshowSection.widget--width-sm:after {\r\n  --1vw: 0px;\r\n}\r\n.fhSlideshowSection:not(.widget--width-full)::before {\r\n  width: auto;\r\n}\r\n\r\n.fhSlideshowSection[class*=\"slate\"] .swiper {\r\n  @apply bg-slate;\r\n}\r\n.fhSlideshowSection[class*=\"umber\"] .swiper {\r\n  @apply bg-umber;\r\n}\r\n.fhSlideshowSection[class*=\"limestone\"] .swiper {\r\n  @apply bg-limestone;\r\n}\r\n.fhSlideshowSection[class*=\"sage\"] .swiper {\r\n  @apply bg-sage;\r\n}\r\n\r\n.fhSlideshow {\r\n  &:deep(.content) {\r\n    @apply px-[56px] lg:px-[82px];\r\n  }\r\n  &:deep(.content > div) {\r\n    @apply px-f5;\r\n  }\r\n  &:deep(.swiper) {\r\n    @apply pb-[100px];\r\n  }\r\n  &:deep(.swiper-slide) {\r\n    @apply h-auto;\r\n  }\r\n  &:deep(.fh_video) {\r\n    object-fit: cover;\r\n  }\r\n\r\n  &:deep(.swiper-button-prev) {\r\n    background-image: url(\"../assets/icons/chevron-left.svg\");\r\n    background-position: center;\r\n    background-repeat: no-repeat;\r\n    background-color: #ffffff;\r\n    border-radius: 50px;\r\n    top: 0;\r\n    bottom: 100px;\r\n    margin: auto;\r\n    @apply w-[32px] lg:w-[52px] h-[32px] lg:h-[52px] left-f5;\r\n  }\r\n  &:deep(.swiper-button-next) {\r\n    background-image: url(\"../assets/icons/chevron-right.svg\");\r\n    background-position: center;\r\n    background-repeat: no-repeat;\r\n    background-color: #ffffff;\r\n    border-radius: 50px;\r\n    top: 0;\r\n    bottom: 100px;\r\n    margin: auto;\r\n    @apply w-[32px] lg:w-[52px] h-[32px] lg:h-[52px] right-f5;\r\n  }\r\n  &:deep(.swiper-button-prev::after),\r\n  &:deep(.swiper-button-next::after) {\r\n    @apply hidden;\r\n  }\r\n\r\n  &:deep(.swiper-scrollbar) {\r\n    @apply bottom-0 left-0 right-0 m-auto overflow-hidden py-[40px] w-[50%];\r\n    height: auto;\r\n    border-radius: 0;\r\n    background: transparent;\r\n    &::before {\r\n      @apply bg-neutral-30;\r\n      content: \"\";\r\n      position: absolute;\r\n      top: 0;\r\n      left: 0;\r\n      right: 0;\r\n      bottom: 0;\r\n      height: 2px;\r\n      margin: auto;\r\n    }\r\n  }\r\n\r\n  &:deep(.swiper-scrollbar-drag) {\r\n    @apply bg-slate;\r\n    cursor: pointer;\r\n    height: 4px;\r\n    border-top: 0.5rem solid transparent;\r\n    border-bottom: 0.5rem solid transparent;\r\n    border-radius: 0;\r\n    background-clip: content-box;\r\n    box-sizing: content-box;\r\n  }\r\n\r\n  &:deep(figure) {\r\n    @apply absolute left-0 right-0 top-0 bottom-0 h-full w-full object-cover overflow-hidden object-center;\r\n  }\r\n\r\n  &:deep(section),\r\n  &:deep(figure img),\r\n  &:deep(section .widget__inner),\r\n  &:deep(section .fh-figure) {\r\n    @apply h-full w-full object-cover object-center;\r\n  }\r\n}\r\n\r\n.video_block {\r\n  @apply static;\r\n}\r\n\r\n:deep(.filter .fh-figure > div:before) {\r\n  @apply bg-neutral-opacity-35;\r\n  content: \"\";\r\n  width: 100%;\r\n  height: 100%;\r\n  top: 0;\r\n  left: 0;\r\n  position: absolute;\r\n  pointer-events: none;\r\n  z-index: -1;\r\n}\r\n\r\n/** SLATE CONTROLS **/\r\n.widget--bg-slate :deep(.fhSlideshow .swiper-scrollbar-drag) {\r\n  @apply bg-white-opacity-70;\r\n}\r\n.widget--bg-slate :deep(.fhSlideshow .swiper-scrollbar::before) {\r\n  @apply bg-neutral-opacity-80;\r\n}\r\n\r\n/** END SLATE CONTROLS **/\r\n</style>\r\n","<script setup>\r\nimport { computed, ref, onMounted } from \"vue\";\r\n\r\nconst props = defineProps({\r\n  artists: {\r\n    type: Array,\r\n    default: () => []\r\n  }\r\n});\r\n\r\nconst alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\");\r\nconst activeLetter = ref(\"\"); // Track the currently active letter\r\nconst showLeftGradient = ref(false); // State for showing left gradient\r\nconst showRightGradient = ref(false); // State for showing right gradient\r\n\r\nconst onLetterClick = (letter) => {\r\n  // If there are no artists for the selected letter, ignore the click event\r\n  if (!hasArtistsForLetter(letter)) {\r\n    return;\r\n  }\r\n\r\n  // If there's already an active letter, remove its active class\r\n  if (activeLetter.value) {\r\n    const previousElement = document.getElementById(`letter-${activeLetter.value}`);\r\n    if (previousElement) {\r\n      previousElement.classList.remove(\"active\");\r\n    }\r\n  }\r\n\r\n  // Set the new active letter\r\n  activeLetter.value = letter;\r\n\r\n  // Add the active class to the new letter\r\n  const currentElement = document.getElementById(`letter-${letter}`);\r\n  if (currentElement) {\r\n    currentElement.classList.add(\"active\");\r\n  }\r\n\r\n  scrollToLetter(letter); // Scroll to the selected letter section\r\n  console.log(\"Letter clicked\", letter); // Log the clicked letter\r\n};\r\n\r\nconst hasArtistsForLetter = (letter) => {\r\n  return props.artists.some((artist) => artist.letter === letter);\r\n};\r\n\r\nconst scrollToLetter = (letter) => {\r\n  const element = document.getElementById(letter);\r\n  if (element) {\r\n    element.scrollIntoView({ behavior: \"smooth\" });\r\n  }\r\n};\r\n\r\nconst artistsByLetter = computed(() => {\r\n  const groupedArtists = {};\r\n  for (const artist of props.artists) {\r\n    if (!groupedArtists[artist.letter]) {\r\n      groupedArtists[artist.letter] = [];\r\n    }\r\n    groupedArtists[artist.letter].push(artist);\r\n  }\r\n  return groupedArtists;\r\n});\r\n\r\nconst updateGradientVisibility = (event) => {\r\n  const target = event.target;\r\n\r\n  showLeftGradient.value = target.scrollLeft > 0;\r\n  showRightGradient.value = target.scrollWidth - target.clientWidth > target.scrollLeft;\r\n};\r\n\r\nonMounted(() => {\r\n  const alphabetList = document.querySelector(\".alphabet-list\");\r\n\r\n  if (alphabetList) {\r\n    alphabetList.addEventListener(\"scroll\", updateGradientVisibility);\r\n    // Initial check to see if gradients are needed\r\n    updateGradientVisibility({ target: alphabetList });\r\n  }\r\n});\r\n</script>\r\n\r\n<template>\r\n  <section class=\"w-full widget widget--bg-umber pt-f8 bg-slate items-center justify-between tb:hidden\">\r\n    <h2 class=\"text-white text-f-3xl-7xl font-serif leading-10\">Artists</h2>\r\n  </section>\r\n\r\n  <section class=\"letter-wrapper sticky top-0 bg-slate mb-f4 tb:py-f8 widget widget--bg-umber items-center justify-between z-10\">\r\n    <div class=\"flex items-center justify-between\">\r\n      <h2 class=\"text-white text-f-3xl-7xl font-serif leading-10 hidden tb:block\">Artists</h2>\r\n      <div\r\n        class=\"alphabet-list items-start w-full inline-flex overflow-y-hidden overflow-x-auto scroll-smooth py-f8 justify-start gap-f6 hide-scrollbar tb:gap-f2 tb:p-0 tb:w-auto\"\r\n      >\r\n        <a\r\n          v-for=\"letter in alphabet\"\r\n          :id=\"'letter-' + letter\"\r\n          :key=\"letter\"\r\n          class=\"artist-letter relative\"\r\n          :class=\"[hasArtistsForLetter(letter) ? 'default text-white cursor-pointer' : 'disabled cursor-default text-neutral-40']\"\r\n          @click=\"onLetterClick(letter)\"\r\n        >\r\n          {{ letter }}\r\n        </a>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Gradient overlays -->\r\n    <div v-if=\"showLeftGradient\" class=\"absolute top-0 left-0 w-10 h-full bg-gradient-to-r from-slate via-transparent to-transparent pointer-events-none\"></div>\r\n    <div\r\n      v-if=\"showRightGradient\"\r\n      class=\"absolute top-0 right-0 w-10 h-full bg-gradient-to-l from-slate via-transparent to-transparent pointer-events-none\"\r\n    ></div>\r\n  </section>\r\n\r\n  <section class=\"tb:grid tb:grid-cols-2 lg:grid-cols-3 gap-f8 pb-f8\">\r\n    <div v-for=\"(artistsGroup, letter) in artistsByLetter\" :id=\"letter\" :key=\"letter\" class=\"pt-f4 scroll-mt-f25\">\r\n      <h2 class=\"text-neutral-70 text-2xl leading-tight mb-4 pb-4 border-b-[1px]\">{{ letter }}</h2>\r\n      <ul>\r\n        <li v-for=\"artist in artistsGroup\" :key=\"artist.url\" class=\"leading-tight mb-4\">\r\n          <a :href=\"artist.url\" class=\"text-neutral-50 text-base hover:text-neutral-70 pb-1 cursor-pointer hover-underline-with-transition\">{{\r\n            artist.name\r\n          }}</a>\r\n        </li>\r\n      </ul>\r\n    </div>\r\n  </section>\r\n</template>\r\n\r\n<style scoped>\r\n.letter-wrapper {\r\n  scroll-snap-type: x mandatory;\r\n}\r\n\r\n.artist-letter.default {\r\n  &::after {\r\n    content: \"\";\r\n    height: 1px;\r\n    width: 100%;\r\n    background-color: white;\r\n    position: absolute;\r\n    bottom: 0;\r\n    left: 0;\r\n    opacity: 0;\r\n    transform: translateY(2px);\r\n    transition:\r\n      transform 0.3s ease,\r\n      opacity 0.3s ease;\r\n  }\r\n\r\n  &.active,\r\n  &:hover {\r\n    &::after {\r\n      content: \"\";\r\n      opacity: 1;\r\n      transform: translateY(0);\r\n      transition:\r\n        transform 0.3s ease,\r\n        opacity 0.3s ease;\r\n    }\r\n  }\r\n}\r\n</style>\r\n","// Composables\nimport { createDate, DateAdapterSymbol, DateOptionsSymbol } from \"./composables/date/date.mjs\";\nimport { createDefaults, DefaultsSymbol } from \"./composables/defaults.mjs\";\nimport { createDisplay, DisplaySymbol } from \"./composables/display.mjs\";\nimport { createGoTo, GoToSymbol } from \"./composables/goto.mjs\";\nimport { createIcons, IconSymbol } from \"./composables/icons.mjs\";\nimport { createLocale, LocaleSymbol } from \"./composables/locale.mjs\";\nimport { createTheme, ThemeSymbol } from \"./composables/theme.mjs\"; // Utilities\nimport { nextTick, reactive } from 'vue';\nimport { defineComponent, getUid, IN_BROWSER, mergeDeep } from \"./util/index.mjs\"; // Types\nexport * from \"./composables/index.mjs\";\nexport function createVuetify() {\n  let vuetify = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  const {\n    blueprint,\n    ...rest\n  } = vuetify;\n  const options = mergeDeep(blueprint, rest);\n  const {\n    aliases = {},\n    components = {},\n    directives = {}\n  } = options;\n  const defaults = createDefaults(options.defaults);\n  const display = createDisplay(options.display, options.ssr);\n  const theme = createTheme(options.theme);\n  const icons = createIcons(options.icons);\n  const locale = createLocale(options.locale);\n  const date = createDate(options.date, locale);\n  const goTo = createGoTo(options.goTo, locale);\n  const install = app => {\n    for (const key in directives) {\n      app.directive(key, directives[key]);\n    }\n    for (const key in components) {\n      app.component(key, components[key]);\n    }\n    for (const key in aliases) {\n      app.component(key, defineComponent({\n        ...aliases[key],\n        name: key,\n        aliasName: aliases[key].name\n      }));\n    }\n    theme.install(app);\n    app.provide(DefaultsSymbol, defaults);\n    app.provide(DisplaySymbol, display);\n    app.provide(ThemeSymbol, theme);\n    app.provide(IconSymbol, icons);\n    app.provide(LocaleSymbol, locale);\n    app.provide(DateOptionsSymbol, date.options);\n    app.provide(DateAdapterSymbol, date.instance);\n    app.provide(GoToSymbol, goTo);\n    if (IN_BROWSER && options.ssr) {\n      if (app.$nuxt) {\n        app.$nuxt.hook('app:suspense:resolve', () => {\n          display.update();\n        });\n      } else {\n        const {\n          mount\n        } = app;\n        app.mount = function () {\n          const vm = mount(...arguments);\n          nextTick(() => display.update());\n          app.mount = mount;\n          return vm;\n        };\n      }\n    }\n    getUid.reset();\n    if (typeof __VUE_OPTIONS_API__ !== 'boolean' || __VUE_OPTIONS_API__) {\n      app.mixin({\n        computed: {\n          $vuetify() {\n            return reactive({\n              defaults: inject.call(this, DefaultsSymbol),\n              display: inject.call(this, DisplaySymbol),\n              theme: inject.call(this, ThemeSymbol),\n              icons: inject.call(this, IconSymbol),\n              locale: inject.call(this, LocaleSymbol),\n              date: inject.call(this, DateAdapterSymbol)\n            });\n          }\n        }\n      });\n    }\n  };\n  return {\n    install,\n    defaults,\n    display,\n    theme,\n    icons,\n    locale,\n    date,\n    goTo\n  };\n}\nexport const version = \"3.6.6\";\ncreateVuetify.version = version;\n\n// Vue's inject() can only be used in setup\nfunction inject(key) {\n  const vm = this.$;\n  const provides = vm.parent?.provides ?? vm.vnode.appContext?.provides;\n  if (provides && key in provides) {\n    return provides[key];\n  }\n}\n//# sourceMappingURL=framework.mjs.map","import { createPinia } from \"pinia\";\r\nimport { VueQueryPlugin } from \"@tanstack/vue-query\";\r\nimport { createVuetify } from \"vuetify\";\r\n\r\nconst plugins = {\r\n  pinia: (app) => {\r\n    const pinia = createPinia();\r\n    app.use(pinia);\r\n  },\r\n  vueQuery: (app) => {\r\n    app.use(VueQueryPlugin, {\r\n      queryClientConfig: {\r\n        defaultOptions: {\r\n          queries: {\r\n            retryDelay: (failureCount, error) => {\r\n              const responseRegex = /^4\\d{2}$/g;\r\n              if (responseRegex.test(error.response.status)) return false;\r\n              return failureCount < 2;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    });\r\n  },\r\n  vuetify: (app) => {\r\n    const vuetify = createVuetify();\r\n    app.use(vuetify);\r\n  }\r\n};\r\n\r\nexport default function registerVuePlugins(app) {\r\n  Object.keys(plugins).forEach((plugin) => plugins[plugin](app));\r\n}\r\n","export const envrionmentTypes = {\r\n  default: \"development\",\r\n  envrionments: {\r\n    local: [\"localhost\"],\r\n    test: [\"fh-test-fourhandscom.azurewebsites.net\"],\r\n    development: [\"fh-dev-fourhandscom.azurewebsites.net\"],\r\n    staging: [\"fh-staging-fourhandscom.azurewebsites.net\"],\r\n    production: [\"fh-prod-fourhandscom.azurewebsites.net\", \"fourhands.com\"]\r\n  },\r\n  getEnvrionment: function (hostName) {\r\n    if (!hostName) return this.default;\r\n    const envrionment = Object.entries(this.envrionments).find(([_, value]) => {\r\n      if (value.includes(hostName)) return true;\r\n    });\r\n    return envrionment?.[0] ?? this.default;\r\n  }\r\n};\r\n","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst objectToString = Object.prototype.toString;\n\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isError(wat) {\n  switch (objectToString.call(wat)) {\n    case '[object Error]':\n    case '[object Exception]':\n    case '[object DOMException]':\n    case '[object WebAssembly.Exception]':\n      return true;\n    default:\n      return isInstanceOf(wat, Error);\n  }\n}\n/**\n * Checks whether given value is an instance of the given built-in class.\n *\n * @param wat The value to be checked\n * @param className\n * @returns A boolean representing the result.\n */\nfunction isBuiltin(wat, className) {\n  return objectToString.call(wat) === `[object ${className}]`;\n}\n\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isErrorEvent(wat) {\n  return isBuiltin(wat, 'ErrorEvent');\n}\n\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isDOMError(wat) {\n  return isBuiltin(wat, 'DOMError');\n}\n\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isDOMException(wat) {\n  return isBuiltin(wat, 'DOMException');\n}\n\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isString(wat) {\n  return isBuiltin(wat, 'String');\n}\n\n/**\n * Checks whether given string is parameterized\n * {@link isParameterizedString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isParameterizedString(wat) {\n  return (\n    typeof wat === 'object' &&\n    wat !== null &&\n    '__sentry_template_string__' in wat &&\n    '__sentry_template_values__' in wat\n  );\n}\n\n/**\n * Checks whether given value is a primitive (undefined, null, number, boolean, string, bigint, symbol)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isPrimitive(wat) {\n  return wat === null || isParameterizedString(wat) || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n\n/**\n * Checks whether given value's type is an object literal, or a class instance.\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isPlainObject(wat) {\n  return isBuiltin(wat, 'Object');\n}\n\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isEvent(wat) {\n  return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isElement(wat) {\n  return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isRegExp(wat) {\n  return isBuiltin(wat, 'RegExp');\n}\n\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nfunction isThenable(wat) {\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n  return Boolean(wat && wat.then && typeof wat.then === 'function');\n}\n\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isSyntheticEvent(wat) {\n  return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nfunction isInstanceOf(wat, base) {\n  try {\n    return wat instanceof base;\n  } catch (_e) {\n    return false;\n  }\n}\n\n/**\n * Checks whether given value's type is a Vue ViewModel.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isVueViewModel(wat) {\n  // Not using Object.prototype.toString because in Vue 3 it would read the instance's Symbol(Symbol.toStringTag) property.\n  return !!(typeof wat === 'object' && wat !== null && ((wat ).__isVue || (wat )._isVue));\n}\n\nexport { isDOMError, isDOMException, isElement, isError, isErrorEvent, isEvent, isInstanceOf, isParameterizedString, isPlainObject, isPrimitive, isRegExp, isString, isSyntheticEvent, isThenable, isVueViewModel };\n//# sourceMappingURL=is.js.map\n","import { isVueViewModel, isString, isRegExp } from './is.js';\n\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string (0 = unlimited)\n * @returns string Encoded\n */\nfunction truncate(str, max = 0) {\n  if (typeof str !== 'string' || max === 0) {\n    return str;\n  }\n  return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\n\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nfunction snipLine(line, colno) {\n  let newLine = line;\n  const lineLength = newLine.length;\n  if (lineLength <= 150) {\n    return newLine;\n  }\n  if (colno > lineLength) {\n    // eslint-disable-next-line no-param-reassign\n    colno = lineLength;\n  }\n\n  let start = Math.max(colno - 60, 0);\n  if (start < 5) {\n    start = 0;\n  }\n\n  let end = Math.min(start + 140, lineLength);\n  if (end > lineLength - 5) {\n    end = lineLength;\n  }\n  if (end === lineLength) {\n    start = Math.max(end - 140, 0);\n  }\n\n  newLine = newLine.slice(start, end);\n  if (start > 0) {\n    newLine = `'{snip} ${newLine}`;\n  }\n  if (end < lineLength) {\n    newLine += ' {snip}';\n  }\n\n  return newLine;\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction safeJoin(input, delimiter) {\n  if (!Array.isArray(input)) {\n    return '';\n  }\n\n  const output = [];\n  // eslint-disable-next-line @typescript-eslint/prefer-for-of\n  for (let i = 0; i < input.length; i++) {\n    const value = input[i];\n    try {\n      // This is a hack to fix a Vue3-specific bug that causes an infinite loop of\n      // console warnings. This happens when a Vue template is rendered with\n      // an undeclared variable, which we try to stringify, ultimately causing\n      // Vue to issue another warning which repeats indefinitely.\n      // see: https://github.com/getsentry/sentry-javascript/pull/8981\n      if (isVueViewModel(value)) {\n        output.push('[VueViewModel]');\n      } else {\n        output.push(String(value));\n      }\n    } catch (e) {\n      output.push('[value cannot be serialized]');\n    }\n  }\n\n  return output.join(delimiter);\n}\n\n/**\n * Checks if the given value matches a regex or string\n *\n * @param value The string to test\n * @param pattern Either a regex or a string against which `value` will be matched\n * @param requireExactStringMatch If true, `value` must match `pattern` exactly. If false, `value` will match\n * `pattern` if it contains `pattern`. Only applies to string-type patterns.\n */\nfunction isMatchingPattern(\n  value,\n  pattern,\n  requireExactStringMatch = false,\n) {\n  if (!isString(value)) {\n    return false;\n  }\n\n  if (isRegExp(pattern)) {\n    return pattern.test(value);\n  }\n  if (isString(pattern)) {\n    return requireExactStringMatch ? value === pattern : value.includes(pattern);\n  }\n\n  return false;\n}\n\n/**\n * Test the given string against an array of strings and regexes. By default, string matching is done on a\n * substring-inclusion basis rather than a strict equality basis\n *\n * @param testString The string to test\n * @param patterns The patterns against which to test the string\n * @param requireExactStringMatch If true, `testString` must match one of the given string patterns exactly in order to\n * count. If false, `testString` will match a string pattern if it contains that pattern.\n * @returns\n */\nfunction stringMatchesSomePattern(\n  testString,\n  patterns = [],\n  requireExactStringMatch = false,\n) {\n  return patterns.some(pattern => isMatchingPattern(testString, pattern, requireExactStringMatch));\n}\n\nexport { isMatchingPattern, safeJoin, snipLine, stringMatchesSomePattern, truncate };\n//# sourceMappingURL=string.js.map\n","import { isInstanceOf } from './is.js';\nimport { truncate } from './string.js';\n\n/**\n * Creates exceptions inside `event.exception.values` for errors that are nested on properties based on the `key` parameter.\n */\nfunction applyAggregateErrorsToEvent(\n  exceptionFromErrorImplementation,\n  parser,\n  maxValueLimit = 250,\n  key,\n  limit,\n  event,\n  hint,\n) {\n  if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n    return;\n  }\n\n  // Generally speaking the last item in `event.exception.values` is the exception originating from the original Error\n  const originalException =\n    event.exception.values.length > 0 ? event.exception.values[event.exception.values.length - 1] : undefined;\n\n  // We only create exception grouping if there is an exception in the event.\n  if (originalException) {\n    event.exception.values = truncateAggregateExceptions(\n      aggregateExceptionsFromError(\n        exceptionFromErrorImplementation,\n        parser,\n        limit,\n        hint.originalException ,\n        key,\n        event.exception.values,\n        originalException,\n        0,\n      ),\n      maxValueLimit,\n    );\n  }\n}\n\nfunction aggregateExceptionsFromError(\n  exceptionFromErrorImplementation,\n  parser,\n  limit,\n  error,\n  key,\n  prevExceptions,\n  exception,\n  exceptionId,\n) {\n  if (prevExceptions.length >= limit + 1) {\n    return prevExceptions;\n  }\n\n  let newExceptions = [...prevExceptions];\n\n  // Recursively call this function in order to walk down a chain of errors\n  if (isInstanceOf(error[key], Error)) {\n    applyExceptionGroupFieldsForParentException(exception, exceptionId);\n    const newException = exceptionFromErrorImplementation(parser, error[key]);\n    const newExceptionId = newExceptions.length;\n    applyExceptionGroupFieldsForChildException(newException, key, newExceptionId, exceptionId);\n    newExceptions = aggregateExceptionsFromError(\n      exceptionFromErrorImplementation,\n      parser,\n      limit,\n      error[key],\n      key,\n      [newException, ...newExceptions],\n      newException,\n      newExceptionId,\n    );\n  }\n\n  // This will create exception grouping for AggregateErrors\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError\n  if (Array.isArray(error.errors)) {\n    error.errors.forEach((childError, i) => {\n      if (isInstanceOf(childError, Error)) {\n        applyExceptionGroupFieldsForParentException(exception, exceptionId);\n        const newException = exceptionFromErrorImplementation(parser, childError);\n        const newExceptionId = newExceptions.length;\n        applyExceptionGroupFieldsForChildException(newException, `errors[${i}]`, newExceptionId, exceptionId);\n        newExceptions = aggregateExceptionsFromError(\n          exceptionFromErrorImplementation,\n          parser,\n          limit,\n          childError,\n          key,\n          [newException, ...newExceptions],\n          newException,\n          newExceptionId,\n        );\n      }\n    });\n  }\n\n  return newExceptions;\n}\n\nfunction applyExceptionGroupFieldsForParentException(exception, exceptionId) {\n  // Don't know if this default makes sense. The protocol requires us to set these values so we pick *some* default.\n  exception.mechanism = exception.mechanism || { type: 'generic', handled: true };\n\n  exception.mechanism = {\n    ...exception.mechanism,\n    ...(exception.type === 'AggregateError' && { is_exception_group: true }),\n    exception_id: exceptionId,\n  };\n}\n\nfunction applyExceptionGroupFieldsForChildException(\n  exception,\n  source,\n  exceptionId,\n  parentId,\n) {\n  // Don't know if this default makes sense. The protocol requires us to set these values so we pick *some* default.\n  exception.mechanism = exception.mechanism || { type: 'generic', handled: true };\n\n  exception.mechanism = {\n    ...exception.mechanism,\n    type: 'chained',\n    source,\n    exception_id: exceptionId,\n    parent_id: parentId,\n  };\n}\n\n/**\n * Truncate the message (exception.value) of all exceptions in the event.\n * Because this event processor is ran after `applyClientOptions`,\n * we need to truncate the message of the added exceptions here.\n */\nfunction truncateAggregateExceptions(exceptions, maxValueLength) {\n  return exceptions.map(exception => {\n    if (exception.value) {\n      exception.value = truncate(exception.value, maxValueLength);\n    }\n    return exception;\n  });\n}\n\nexport { applyAggregateErrorsToEvent };\n//# sourceMappingURL=aggregate-errors.js.map\n","/**\n * Determine a breadcrumb's log level (only `warning` or `error`) based on an HTTP status code.\n */\nfunction getBreadcrumbLogLevelFromHttpStatusCode(statusCode) {\n  // NOTE: undefined defaults to 'info' in Sentry\n  if (statusCode === undefined) {\n    return undefined;\n  } else if (statusCode >= 400 && statusCode < 500) {\n    return 'warning';\n  } else if (statusCode >= 500) {\n    return 'error';\n  } else {\n    return undefined;\n  }\n}\n\nexport { getBreadcrumbLogLevelFromHttpStatusCode };\n//# sourceMappingURL=breadcrumb-log-level.js.map\n","const SDK_VERSION = '8.35.0';\n\nexport { SDK_VERSION };\n//# sourceMappingURL=version.js.map\n","import { SDK_VERSION } from './version.js';\n\n/** Get's the global object for the current JavaScript runtime */\nconst GLOBAL_OBJ = globalThis ;\n\n/**\n * Returns a global singleton contained in the global `__SENTRY__[]` object.\n *\n * If the singleton doesn't already exist in `__SENTRY__`, it will be created using the given factory\n * function and added to the `__SENTRY__` object.\n *\n * @param name name of the global singleton on __SENTRY__\n * @param creator creator Factory function to create the singleton if it doesn't already exist on `__SENTRY__`\n * @param obj (Optional) The global object on which to look for `__SENTRY__`, if not `GLOBAL_OBJ`'s return value\n * @returns the singleton\n */\nfunction getGlobalSingleton(name, creator, obj) {\n  const gbl = (obj || GLOBAL_OBJ) ;\n  const __SENTRY__ = (gbl.__SENTRY__ = gbl.__SENTRY__ || {});\n  const versionedCarrier = (__SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {});\n  return versionedCarrier[name] || (versionedCarrier[name] = creator());\n}\n\nexport { GLOBAL_OBJ, getGlobalSingleton };\n//# sourceMappingURL=worldwide.js.map\n","import { isString } from './is.js';\nimport { GLOBAL_OBJ } from './worldwide.js';\n\nconst WINDOW = GLOBAL_OBJ ;\n\nconst DEFAULT_MAX_STRING_LENGTH = 80;\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction htmlTreeAsString(\n  elem,\n  options = {},\n) {\n  if (!elem) {\n    return '<unknown>';\n  }\n\n  // try/catch both:\n  // - accessing event.target (see getsentry/raven-js#838, #768)\n  // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n  // - can throw an exception in some circumstances.\n  try {\n    let currentElem = elem ;\n    const MAX_TRAVERSE_HEIGHT = 5;\n    const out = [];\n    let height = 0;\n    let len = 0;\n    const separator = ' > ';\n    const sepLength = separator.length;\n    let nextStr;\n    const keyAttrs = Array.isArray(options) ? options : options.keyAttrs;\n    const maxStringLength = (!Array.isArray(options) && options.maxStringLength) || DEFAULT_MAX_STRING_LENGTH;\n\n    while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n      nextStr = _htmlElementAsString(currentElem, keyAttrs);\n      // bail out if\n      // - nextStr is the 'html' element\n      // - the length of the string that would be created exceeds maxStringLength\n      //   (ignore this limit if we are on the first iteration)\n      if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= maxStringLength)) {\n        break;\n      }\n\n      out.push(nextStr);\n\n      len += nextStr.length;\n      currentElem = currentElem.parentNode;\n    }\n\n    return out.reverse().join(separator);\n  } catch (_oO) {\n    return '<unknown>';\n  }\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el, keyAttrs) {\n  const elem = el\n\n;\n\n  const out = [];\n\n  if (!elem || !elem.tagName) {\n    return '';\n  }\n\n  // @ts-expect-error WINDOW has HTMLElement\n  if (WINDOW.HTMLElement) {\n    // If using the component name annotation plugin, this value may be available on the DOM node\n    if (elem instanceof HTMLElement && elem.dataset) {\n      if (elem.dataset['sentryComponent']) {\n        return elem.dataset['sentryComponent'];\n      }\n      if (elem.dataset['sentryElement']) {\n        return elem.dataset['sentryElement'];\n      }\n    }\n  }\n\n  out.push(elem.tagName.toLowerCase());\n\n  // Pairs of attribute keys defined in `serializeAttribute` and their values on element.\n  const keyAttrPairs =\n    keyAttrs && keyAttrs.length\n      ? keyAttrs.filter(keyAttr => elem.getAttribute(keyAttr)).map(keyAttr => [keyAttr, elem.getAttribute(keyAttr)])\n      : null;\n\n  if (keyAttrPairs && keyAttrPairs.length) {\n    keyAttrPairs.forEach(keyAttrPair => {\n      out.push(`[${keyAttrPair[0]}=\"${keyAttrPair[1]}\"]`);\n    });\n  } else {\n    if (elem.id) {\n      out.push(`#${elem.id}`);\n    }\n\n    const className = elem.className;\n    if (className && isString(className)) {\n      const classes = className.split(/\\s+/);\n      for (const c of classes) {\n        out.push(`.${c}`);\n      }\n    }\n  }\n  const allowedAttrs = ['aria-label', 'type', 'name', 'title', 'alt'];\n  for (const k of allowedAttrs) {\n    const attr = elem.getAttribute(k);\n    if (attr) {\n      out.push(`[${k}=\"${attr}\"]`);\n    }\n  }\n\n  return out.join('');\n}\n\n/**\n * A safe form of location.href\n */\nfunction getLocationHref() {\n  try {\n    return WINDOW.document.location.href;\n  } catch (oO) {\n    return '';\n  }\n}\n\n/**\n * Gets a DOM element by using document.querySelector.\n *\n * This wrapper will first check for the existance of the function before\n * actually calling it so that we don't have to take care of this check,\n * every time we want to access the DOM.\n *\n * Reason: DOM/querySelector is not available in all environments.\n *\n * We have to cast to any because utils can be consumed by a variety of environments,\n * and we don't want to break TS users. If you know what element will be selected by\n * `document.querySelector`, specify it as part of the generic call. For example,\n * `const element = getDomElement<Element>('selector');`\n *\n * @param selector the selector string passed on to document.querySelector\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getDomElement(selector) {\n  if (WINDOW.document && WINDOW.document.querySelector) {\n    return WINDOW.document.querySelector(selector) ;\n  }\n  return null;\n}\n\n/**\n * Given a DOM element, traverses up the tree until it finds the first ancestor node\n * that has the `data-sentry-component` or `data-sentry-element` attribute with `data-sentry-component` taking\n * precendence. This attribute is added at build-time by projects that have the component name annotation plugin installed.\n *\n * @returns a string representation of the component for the provided DOM element, or `null` if not found\n */\nfunction getComponentName(elem) {\n  // @ts-expect-error WINDOW has HTMLElement\n  if (!WINDOW.HTMLElement) {\n    return null;\n  }\n\n  let currentElem = elem ;\n  const MAX_TRAVERSE_HEIGHT = 5;\n  for (let i = 0; i < MAX_TRAVERSE_HEIGHT; i++) {\n    if (!currentElem) {\n      return null;\n    }\n\n    if (currentElem instanceof HTMLElement) {\n      if (currentElem.dataset['sentryComponent']) {\n        return currentElem.dataset['sentryComponent'];\n      }\n      if (currentElem.dataset['sentryElement']) {\n        return currentElem.dataset['sentryElement'];\n      }\n    }\n\n    currentElem = currentElem.parentNode;\n  }\n\n  return null;\n}\n\nexport { getComponentName, getDomElement, getLocationHref, htmlTreeAsString };\n//# sourceMappingURL=browser.js.map\n","/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nconst DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);\n\nexport { DEBUG_BUILD };\n//# sourceMappingURL=debug-build.js.map\n","import { DEBUG_BUILD } from './debug-build.js';\nimport { getGlobalSingleton, GLOBAL_OBJ } from './worldwide.js';\n\n/** Prefix for logging strings */\nconst PREFIX = 'Sentry Logger ';\n\nconst CONSOLE_LEVELS = [\n  'debug',\n  'info',\n  'warn',\n  'error',\n  'log',\n  'assert',\n  'trace',\n] ;\n\n/** This may be mutated by the console instrumentation. */\nconst originalConsoleMethods\n\n = {};\n\n/** JSDoc */\n\n/**\n * Temporarily disable sentry console instrumentations.\n *\n * @param callback The function to run against the original `console` messages\n * @returns The results of the callback\n */\nfunction consoleSandbox(callback) {\n  if (!('console' in GLOBAL_OBJ)) {\n    return callback();\n  }\n\n  const console = GLOBAL_OBJ.console ;\n  const wrappedFuncs = {};\n\n  const wrappedLevels = Object.keys(originalConsoleMethods) ;\n\n  // Restore all wrapped console methods\n  wrappedLevels.forEach(level => {\n    const originalConsoleMethod = originalConsoleMethods[level] ;\n    wrappedFuncs[level] = console[level] ;\n    console[level] = originalConsoleMethod;\n  });\n\n  try {\n    return callback();\n  } finally {\n    // Revert restoration to wrapped state\n    wrappedLevels.forEach(level => {\n      console[level] = wrappedFuncs[level] ;\n    });\n  }\n}\n\nfunction makeLogger() {\n  let enabled = false;\n  const logger = {\n    enable: () => {\n      enabled = true;\n    },\n    disable: () => {\n      enabled = false;\n    },\n    isEnabled: () => enabled,\n  };\n\n  if (DEBUG_BUILD) {\n    CONSOLE_LEVELS.forEach(name => {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      logger[name] = (...args) => {\n        if (enabled) {\n          consoleSandbox(() => {\n            GLOBAL_OBJ.console[name](`${PREFIX}[${name}]:`, ...args);\n          });\n        }\n      };\n    });\n  } else {\n    CONSOLE_LEVELS.forEach(name => {\n      logger[name] = () => undefined;\n    });\n  }\n\n  return logger ;\n}\n\n/**\n * This is a logger singleton which either logs things or no-ops if logging is not enabled.\n * The logger is a singleton on the carrier, to ensure that a consistent logger is used throughout the SDK.\n */\nconst logger = getGlobalSingleton('logger', makeLogger);\n\nexport { CONSOLE_LEVELS, consoleSandbox, logger, originalConsoleMethods };\n//# sourceMappingURL=logger.js.map\n","import { DEBUG_BUILD } from './debug-build.js';\nimport { consoleSandbox, logger } from './logger.js';\n\n/** Regular expression used to parse a Dsn. */\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+)?)?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\n\nfunction isValidProtocol(protocol) {\n  return protocol === 'http' || protocol === 'https';\n}\n\n/**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\nfunction dsnToString(dsn, withPassword = false) {\n  const { host, path, pass, port, projectId, protocol, publicKey } = dsn;\n  return (\n    `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : ''}` +\n    `@${host}${port ? `:${port}` : ''}/${path ? `${path}/` : path}${projectId}`\n  );\n}\n\n/**\n * Parses a Dsn from a given string.\n *\n * @param str A Dsn as string\n * @returns Dsn as DsnComponents or undefined if @param str is not a valid DSN string\n */\nfunction dsnFromString(str) {\n  const match = DSN_REGEX.exec(str);\n\n  if (!match) {\n    // This should be logged to the console\n    consoleSandbox(() => {\n      // eslint-disable-next-line no-console\n      console.error(`Invalid Sentry Dsn: ${str}`);\n    });\n    return undefined;\n  }\n\n  const [protocol, publicKey, pass = '', host = '', port = '', lastPath = ''] = match.slice(1);\n  let path = '';\n  let projectId = lastPath;\n\n  const split = projectId.split('/');\n  if (split.length > 1) {\n    path = split.slice(0, -1).join('/');\n    projectId = split.pop() ;\n  }\n\n  if (projectId) {\n    const projectMatch = projectId.match(/^\\d+/);\n    if (projectMatch) {\n      projectId = projectMatch[0];\n    }\n  }\n\n  return dsnFromComponents({ host, pass, path, projectId, port, protocol: protocol , publicKey });\n}\n\nfunction dsnFromComponents(components) {\n  return {\n    protocol: components.protocol,\n    publicKey: components.publicKey || '',\n    pass: components.pass || '',\n    host: components.host,\n    port: components.port || '',\n    path: components.path || '',\n    projectId: components.projectId,\n  };\n}\n\nfunction validateDsn(dsn) {\n  if (!DEBUG_BUILD) {\n    return true;\n  }\n\n  const { port, projectId, protocol } = dsn;\n\n  const requiredComponents = ['protocol', 'publicKey', 'host', 'projectId'];\n  const hasMissingRequiredComponent = requiredComponents.find(component => {\n    if (!dsn[component]) {\n      logger.error(`Invalid Sentry Dsn: ${component} missing`);\n      return true;\n    }\n    return false;\n  });\n\n  if (hasMissingRequiredComponent) {\n    return false;\n  }\n\n  if (!projectId.match(/^\\d+$/)) {\n    logger.error(`Invalid Sentry Dsn: Invalid projectId ${projectId}`);\n    return false;\n  }\n\n  if (!isValidProtocol(protocol)) {\n    logger.error(`Invalid Sentry Dsn: Invalid protocol ${protocol}`);\n    return false;\n  }\n\n  if (port && isNaN(parseInt(port, 10))) {\n    logger.error(`Invalid Sentry Dsn: Invalid port ${port}`);\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Creates a valid Sentry Dsn object, identifying a Sentry instance and project.\n * @returns a valid DsnComponents object or `undefined` if @param from is an invalid DSN source\n */\nfunction makeDsn(from) {\n  const components = typeof from === 'string' ? dsnFromString(from) : dsnFromComponents(from);\n  if (!components || !validateDsn(components)) {\n    return undefined;\n  }\n  return components;\n}\n\nexport { dsnFromString, dsnToString, makeDsn };\n//# sourceMappingURL=dsn.js.map\n","/** An error emitted by Sentry SDKs and related utilities. */\nclass SentryError extends Error {\n  /** Display name of this error instance. */\n\n   constructor( message, logLevel = 'warn') {\n    super(message);this.message = message;\n    this.name = new.target.prototype.constructor.name;\n    // This sets the prototype to be `Error`, not `SentryError`. It's unclear why we do this, but commenting this line\n    // out causes various (seemingly totally unrelated) playwright tests consistently time out. FYI, this makes\n    // instances of `SentryError` fail `obj instanceof SentryError` checks.\n    Object.setPrototypeOf(this, new.target.prototype);\n    this.logLevel = logLevel;\n  }\n}\n\nexport { SentryError };\n//# sourceMappingURL=error.js.map\n","import { htmlTreeAsString } from './browser.js';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { isError, isEvent, isInstanceOf, isElement, isPlainObject, isPrimitive } from './is.js';\nimport { logger } from './logger.js';\nimport { truncate } from './string.js';\n\n/**\n * Replace a method in an object with a wrapped version of itself.\n *\n * @param source An object that contains a method to be wrapped.\n * @param name The name of the method to be wrapped.\n * @param replacementFactory A higher-order function that takes the original version of the given method and returns a\n * wrapped version. Note: The function returned by `replacementFactory` needs to be a non-arrow function, in order to\n * preserve the correct value of `this`, and the original method must be called using `origMethod.call(this, <other\n * args>)` or `origMethod.apply(this, [<other args>])` (rather than being called directly), again to preserve `this`.\n * @returns void\n */\nfunction fill(source, name, replacementFactory) {\n  if (!(name in source)) {\n    return;\n  }\n\n  const original = source[name] ;\n  const wrapped = replacementFactory(original) ;\n\n  // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n  // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n  if (typeof wrapped === 'function') {\n    markFunctionWrapped(wrapped, original);\n  }\n\n  source[name] = wrapped;\n}\n\n/**\n * Defines a non-enumerable property on the given object.\n *\n * @param obj The object on which to set the property\n * @param name The name of the property to be set\n * @param value The value to which to set the property\n */\nfunction addNonEnumerableProperty(obj, name, value) {\n  try {\n    Object.defineProperty(obj, name, {\n      // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n      value: value,\n      writable: true,\n      configurable: true,\n    });\n  } catch (o_O) {\n    DEBUG_BUILD && logger.log(`Failed to add non-enumerable property \"${name}\" to object`, obj);\n  }\n}\n\n/**\n * Remembers the original function on the wrapped function and\n * patches up the prototype.\n *\n * @param wrapped the wrapper function\n * @param original the original function that gets wrapped\n */\nfunction markFunctionWrapped(wrapped, original) {\n  try {\n    const proto = original.prototype || {};\n    wrapped.prototype = original.prototype = proto;\n    addNonEnumerableProperty(wrapped, '__sentry_original__', original);\n  } catch (o_O) {} // eslint-disable-line no-empty\n}\n\n/**\n * This extracts the original function if available.  See\n * `markFunctionWrapped` for more information.\n *\n * @param func the function to unwrap\n * @returns the unwrapped version of the function if available.\n */\nfunction getOriginalFunction(func) {\n  return func.__sentry_original__;\n}\n\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\nfunction urlEncode(object) {\n  return Object.keys(object)\n    .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(object[key])}`)\n    .join('&');\n}\n\n/**\n * Transforms any `Error` or `Event` into a plain object with all of their enumerable properties, and some of their\n * non-enumerable properties attached.\n *\n * @param value Initial source that we have to transform in order for it to be usable by the serializer\n * @returns An Event or Error turned into an object - or the value argurment itself, when value is neither an Event nor\n *  an Error.\n */\nfunction convertToPlainObject(\n  value,\n)\n\n {\n  if (isError(value)) {\n    return {\n      message: value.message,\n      name: value.name,\n      stack: value.stack,\n      ...getOwnProperties(value),\n    };\n  } else if (isEvent(value)) {\n    const newObj\n\n = {\n      type: value.type,\n      target: serializeEventTarget(value.target),\n      currentTarget: serializeEventTarget(value.currentTarget),\n      ...getOwnProperties(value),\n    };\n\n    if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n      newObj.detail = value.detail;\n    }\n\n    return newObj;\n  } else {\n    return value;\n  }\n}\n\n/** Creates a string representation of the target of an `Event` object */\nfunction serializeEventTarget(target) {\n  try {\n    return isElement(target) ? htmlTreeAsString(target) : Object.prototype.toString.call(target);\n  } catch (_oO) {\n    return '<unknown>';\n  }\n}\n\n/** Filters out all but an object's own properties */\nfunction getOwnProperties(obj) {\n  if (typeof obj === 'object' && obj !== null) {\n    const extractedProps = {};\n    for (const property in obj) {\n      if (Object.prototype.hasOwnProperty.call(obj, property)) {\n        extractedProps[property] = (obj )[property];\n      }\n    }\n    return extractedProps;\n  } else {\n    return {};\n  }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nfunction extractExceptionKeysForMessage(exception, maxLength = 40) {\n  const keys = Object.keys(convertToPlainObject(exception));\n  keys.sort();\n\n  const firstKey = keys[0];\n\n  if (!firstKey) {\n    return '[object has no keys]';\n  }\n\n  if (firstKey.length >= maxLength) {\n    return truncate(firstKey, maxLength);\n  }\n\n  for (let includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n    const serialized = keys.slice(0, includedKeys).join(', ');\n    if (serialized.length > maxLength) {\n      continue;\n    }\n    if (includedKeys === keys.length) {\n      return serialized;\n    }\n    return truncate(serialized, maxLength);\n  }\n\n  return '';\n}\n\n/**\n * Given any object, return a new object having removed all fields whose value was `undefined`.\n * Works recursively on objects and arrays.\n *\n * Attention: This function keeps circular references in the returned object.\n */\nfunction dropUndefinedKeys(inputValue) {\n  // This map keeps track of what already visited nodes map to.\n  // Our Set - based memoBuilder doesn't work here because we want to the output object to have the same circular\n  // references as the input object.\n  const memoizationMap = new Map();\n\n  // This function just proxies `_dropUndefinedKeys` to keep the `memoBuilder` out of this function's API\n  return _dropUndefinedKeys(inputValue, memoizationMap);\n}\n\nfunction _dropUndefinedKeys(inputValue, memoizationMap) {\n  if (isPojo(inputValue)) {\n    // If this node has already been visited due to a circular reference, return the object it was mapped to in the new object\n    const memoVal = memoizationMap.get(inputValue);\n    if (memoVal !== undefined) {\n      return memoVal ;\n    }\n\n    const returnValue = {};\n    // Store the mapping of this value in case we visit it again, in case of circular data\n    memoizationMap.set(inputValue, returnValue);\n\n    for (const key of Object.getOwnPropertyNames(inputValue)) {\n      if (typeof inputValue[key] !== 'undefined') {\n        returnValue[key] = _dropUndefinedKeys(inputValue[key], memoizationMap);\n      }\n    }\n\n    return returnValue ;\n  }\n\n  if (Array.isArray(inputValue)) {\n    // If this node has already been visited due to a circular reference, return the array it was mapped to in the new object\n    const memoVal = memoizationMap.get(inputValue);\n    if (memoVal !== undefined) {\n      return memoVal ;\n    }\n\n    const returnValue = [];\n    // Store the mapping of this value in case we visit it again, in case of circular data\n    memoizationMap.set(inputValue, returnValue);\n\n    inputValue.forEach((item) => {\n      returnValue.push(_dropUndefinedKeys(item, memoizationMap));\n    });\n\n    return returnValue ;\n  }\n\n  return inputValue;\n}\n\nfunction isPojo(input) {\n  if (!isPlainObject(input)) {\n    return false;\n  }\n\n  try {\n    const name = (Object.getPrototypeOf(input) ).constructor.name;\n    return !name || name === 'Object';\n  } catch (e) {\n    return true;\n  }\n}\n\n/**\n * Ensure that something is an object.\n *\n * Turns `undefined` and `null` into `String`s and all other primitives into instances of their respective wrapper\n * classes (String, Boolean, Number, etc.). Acts as the identity function on non-primitives.\n *\n * @param wat The subject of the objectification\n * @returns A version of `wat` which can safely be used with `Object` class methods\n */\nfunction objectify(wat) {\n  let objectified;\n  switch (true) {\n    case wat === undefined || wat === null:\n      objectified = new String(wat);\n      break;\n\n    // Though symbols and bigints do have wrapper classes (`Symbol` and `BigInt`, respectively), for whatever reason\n    // those classes don't have constructors which can be used with the `new` keyword. We therefore need to cast each as\n    // an object in order to wrap it.\n    case typeof wat === 'symbol' || typeof wat === 'bigint':\n      objectified = Object(wat);\n      break;\n\n    // this will catch the remaining primitives: `String`, `Number`, and `Boolean`\n    case isPrimitive(wat):\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n      objectified = new (wat ).constructor(wat);\n      break;\n\n    // by process of elimination, at this point we know that `wat` must already be an object\n    default:\n      objectified = wat;\n      break;\n  }\n  return objectified;\n}\n\nexport { addNonEnumerableProperty, convertToPlainObject, dropUndefinedKeys, extractExceptionKeysForMessage, fill, getOriginalFunction, markFunctionWrapped, objectify, urlEncode };\n//# sourceMappingURL=object.js.map\n","const STACKTRACE_FRAME_LIMIT = 50;\nconst UNKNOWN_FUNCTION = '?';\n// Used to sanitize webpack (error: *) wrapped stack errors\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/;\nconst STRIP_FRAME_REGEXP = /captureMessage|captureException/;\n\n/**\n * Creates a stack parser with the supplied line parsers\n *\n * StackFrames are returned in the correct order for Sentry Exception\n * frames and with Sentry SDK internal frames removed from the top and bottom\n *\n */\nfunction createStackParser(...parsers) {\n  const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map(p => p[1]);\n\n  return (stack, skipFirstLines = 0, framesToPop = 0) => {\n    const frames = [];\n    const lines = stack.split('\\n');\n\n    for (let i = skipFirstLines; i < lines.length; i++) {\n      const line = lines[i] ;\n      // Ignore lines over 1kb as they are unlikely to be stack frames.\n      // Many of the regular expressions use backtracking which results in run time that increases exponentially with\n      // input size. Huge strings can result in hangs/Denial of Service:\n      // https://github.com/getsentry/sentry-javascript/issues/2286\n      if (line.length > 1024) {\n        continue;\n      }\n\n      // https://github.com/getsentry/sentry-javascript/issues/5459\n      // Remove webpack (error: *) wrappers\n      const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line;\n\n      // https://github.com/getsentry/sentry-javascript/issues/7813\n      // Skip Error: lines\n      if (cleanedLine.match(/\\S*Error: /)) {\n        continue;\n      }\n\n      for (const parser of sortedParsers) {\n        const frame = parser(cleanedLine);\n\n        if (frame) {\n          frames.push(frame);\n          break;\n        }\n      }\n\n      if (frames.length >= STACKTRACE_FRAME_LIMIT + framesToPop) {\n        break;\n      }\n    }\n\n    return stripSentryFramesAndReverse(frames.slice(framesToPop));\n  };\n}\n\n/**\n * Gets a stack parser implementation from Options.stackParser\n * @see Options\n *\n * If options contains an array of line parsers, it is converted into a parser\n */\nfunction stackParserFromStackParserOptions(stackParser) {\n  if (Array.isArray(stackParser)) {\n    return createStackParser(...stackParser);\n  }\n  return stackParser;\n}\n\n/**\n * Removes Sentry frames from the top and bottom of the stack if present and enforces a limit of max number of frames.\n * Assumes stack input is ordered from top to bottom and returns the reverse representation so call site of the\n * function that caused the crash is the last frame in the array.\n * @hidden\n */\nfunction stripSentryFramesAndReverse(stack) {\n  if (!stack.length) {\n    return [];\n  }\n\n  const localStack = Array.from(stack);\n\n  // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n  if (/sentryWrapped/.test(getLastStackFrame(localStack).function || '')) {\n    localStack.pop();\n  }\n\n  // Reversing in the middle of the procedure allows us to just pop the values off the stack\n  localStack.reverse();\n\n  // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n  if (STRIP_FRAME_REGEXP.test(getLastStackFrame(localStack).function || '')) {\n    localStack.pop();\n\n    // When using synthetic events, we will have a 2 levels deep stack, as `new Error('Sentry syntheticException')`\n    // is produced within the hub itself, making it:\n    //\n    //   Sentry.captureException()\n    //   getCurrentHub().captureException()\n    //\n    // instead of just the top `Sentry` call itself.\n    // This forces us to possibly strip an additional frame in the exact same was as above.\n    if (STRIP_FRAME_REGEXP.test(getLastStackFrame(localStack).function || '')) {\n      localStack.pop();\n    }\n  }\n\n  return localStack.slice(0, STACKTRACE_FRAME_LIMIT).map(frame => ({\n    ...frame,\n    filename: frame.filename || getLastStackFrame(localStack).filename,\n    function: frame.function || UNKNOWN_FUNCTION,\n  }));\n}\n\nfunction getLastStackFrame(arr) {\n  return arr[arr.length - 1] || {};\n}\n\nconst defaultFunctionName = '<anonymous>';\n\n/**\n * Safely extract function name from itself\n */\nfunction getFunctionName(fn) {\n  try {\n    if (!fn || typeof fn !== 'function') {\n      return defaultFunctionName;\n    }\n    return fn.name || defaultFunctionName;\n  } catch (e) {\n    // Just accessing custom props in some Selenium environments\n    // can cause a \"Permission denied\" exception (see raven-js#495).\n    return defaultFunctionName;\n  }\n}\n\n/**\n * Get's stack frames from an event without needing to check for undefined properties.\n */\nfunction getFramesFromEvent(event) {\n  const exception = event.exception;\n\n  if (exception) {\n    const frames = [];\n    try {\n      // @ts-expect-error Object could be undefined\n      exception.values.forEach(value => {\n        // @ts-expect-error Value could be undefined\n        if (value.stacktrace.frames) {\n          // @ts-expect-error Value could be undefined\n          frames.push(...value.stacktrace.frames);\n        }\n      });\n      return frames;\n    } catch (_oO) {\n      return undefined;\n    }\n  }\n  return undefined;\n}\n\nexport { UNKNOWN_FUNCTION, createStackParser, getFramesFromEvent, getFunctionName, stackParserFromStackParserOptions, stripSentryFramesAndReverse };\n//# sourceMappingURL=stacktrace.js.map\n","import { DEBUG_BUILD } from '../debug-build.js';\nimport { logger } from '../logger.js';\nimport { getFunctionName } from '../stacktrace.js';\n\n// We keep the handlers globally\nconst handlers = {};\nconst instrumented = {};\n\n/** Add a handler function. */\nfunction addHandler(type, handler) {\n  handlers[type] = handlers[type] || [];\n  (handlers[type] ).push(handler);\n}\n\n/**\n * Reset all instrumentation handlers.\n * This can be used by tests to ensure we have a clean slate of instrumentation handlers.\n */\nfunction resetInstrumentationHandlers() {\n  Object.keys(handlers).forEach(key => {\n    handlers[key ] = undefined;\n  });\n}\n\n/** Maybe run an instrumentation function, unless it was already called. */\nfunction maybeInstrument(type, instrumentFn) {\n  if (!instrumented[type]) {\n    instrumentFn();\n    instrumented[type] = true;\n  }\n}\n\n/** Trigger handlers for a given instrumentation type. */\nfunction triggerHandlers(type, data) {\n  const typeHandlers = type && handlers[type];\n  if (!typeHandlers) {\n    return;\n  }\n\n  for (const handler of typeHandlers) {\n    try {\n      handler(data);\n    } catch (e) {\n      DEBUG_BUILD &&\n        logger.error(\n          `Error while triggering instrumentation handler.\\nType: ${type}\\nName: ${getFunctionName(handler)}\\nError:`,\n          e,\n        );\n    }\n  }\n}\n\nexport { addHandler, maybeInstrument, resetInstrumentationHandlers, triggerHandlers };\n//# sourceMappingURL=handlers.js.map\n","import { CONSOLE_LEVELS, originalConsoleMethods } from '../logger.js';\nimport { fill } from '../object.js';\nimport { GLOBAL_OBJ } from '../worldwide.js';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers.js';\n\n/**\n * Add an instrumentation handler for when a console.xxx method is called.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nfunction addConsoleInstrumentationHandler(handler) {\n  const type = 'console';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentConsole);\n}\n\nfunction instrumentConsole() {\n  if (!('console' in GLOBAL_OBJ)) {\n    return;\n  }\n\n  CONSOLE_LEVELS.forEach(function (level) {\n    if (!(level in GLOBAL_OBJ.console)) {\n      return;\n    }\n\n    fill(GLOBAL_OBJ.console, level, function (originalConsoleMethod) {\n      originalConsoleMethods[level] = originalConsoleMethod;\n\n      return function (...args) {\n        const handlerData = { args, level };\n        triggerHandlers('console', handlerData);\n\n        const log = originalConsoleMethods[level];\n        log && log.apply(GLOBAL_OBJ.console, args);\n      };\n    });\n  });\n}\n\nexport { addConsoleInstrumentationHandler };\n//# sourceMappingURL=console.js.map\n","import { DEBUG_BUILD } from './debug-build.js';\nimport { logger } from './logger.js';\nimport { GLOBAL_OBJ } from './worldwide.js';\n\nconst WINDOW = GLOBAL_OBJ ;\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsErrorEvent() {\n  try {\n    new ErrorEvent('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsDOMError() {\n  try {\n    // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n    // 1 argument required, but only 0 present.\n    // @ts-expect-error It really needs 1 argument, not 0.\n    new DOMError('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsDOMException() {\n  try {\n    new DOMException('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsFetch() {\n  if (!('fetch' in WINDOW)) {\n    return false;\n  }\n\n  try {\n    new Headers();\n    new Request('http://www.example.com');\n    new Response();\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * isNative checks if the given function is a native implementation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction isNativeFunction(func) {\n  return func && /^function\\s+\\w+\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nfunction supportsNativeFetch() {\n  if (typeof EdgeRuntime === 'string') {\n    return true;\n  }\n\n  if (!supportsFetch()) {\n    return false;\n  }\n\n  // Fast path to avoid DOM I/O\n  // eslint-disable-next-line @typescript-eslint/unbound-method\n  if (isNativeFunction(WINDOW.fetch)) {\n    return true;\n  }\n\n  // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n  // so create a \"pure\" iframe to see if that has native fetch\n  let result = false;\n  const doc = WINDOW.document;\n  // eslint-disable-next-line deprecation/deprecation\n  if (doc && typeof (doc.createElement ) === 'function') {\n    try {\n      const sandbox = doc.createElement('iframe');\n      sandbox.hidden = true;\n      doc.head.appendChild(sandbox);\n      if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        result = isNativeFunction(sandbox.contentWindow.fetch);\n      }\n      doc.head.removeChild(sandbox);\n    } catch (err) {\n      DEBUG_BUILD &&\n        logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n    }\n  }\n\n  return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsReportingObserver() {\n  return 'ReportingObserver' in WINDOW;\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsReferrerPolicy() {\n  // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n  // (see https://caniuse.com/#feat=referrer-policy),\n  // it doesn't. And it throws an exception instead of ignoring this parameter...\n  // REF: https://github.com/getsentry/raven-js/issues/1233\n\n  if (!supportsFetch()) {\n    return false;\n  }\n\n  try {\n    new Request('_', {\n      referrerPolicy: 'origin' ,\n    });\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nexport { isNativeFunction, supportsDOMError, supportsDOMException, supportsErrorEvent, supportsFetch, supportsNativeFetch, supportsReferrerPolicy, supportsReportingObserver };\n//# sourceMappingURL=supports.js.map\n","import { GLOBAL_OBJ } from './worldwide.js';\n\nconst ONE_SECOND_IN_MS = 1000;\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high-resolution monotonic clock.\n */\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n *\n * TODO(v8): Return type should be rounded.\n */\nfunction dateTimestampInSeconds() {\n  return Date.now() / ONE_SECOND_IN_MS;\n}\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction createUnixTimestampInSecondsFunc() {\n  const { performance } = GLOBAL_OBJ ;\n  if (!performance || !performance.now) {\n    return dateTimestampInSeconds;\n  }\n\n  // Some browser and environments don't have a timeOrigin, so we fallback to\n  // using Date.now() to compute the starting time.\n  const approxStartingTimeOrigin = Date.now() - performance.now();\n  const timeOrigin = performance.timeOrigin == undefined ? approxStartingTimeOrigin : performance.timeOrigin;\n\n  // performance.now() is a monotonic clock, which means it starts at 0 when the process begins. To get the current\n  // wall clock time (actual UNIX timestamp), we need to add the starting time origin and the current time elapsed.\n  //\n  // TODO: This does not account for the case where the monotonic clock that powers performance.now() drifts from the\n  // wall clock time, which causes the returned timestamp to be inaccurate. We should investigate how to detect and\n  // correct for this.\n  // See: https://github.com/getsentry/sentry-javascript/issues/2590\n  // See: https://github.com/mdn/content/issues/4713\n  // See: https://dev.to/noamr/when-a-millisecond-is-not-a-millisecond-3h6\n  return () => {\n    return (timeOrigin + performance.now()) / ONE_SECOND_IN_MS;\n  };\n}\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nconst timestampInSeconds = createUnixTimestampInSecondsFunc();\n\n/**\n * Internal helper to store what is the source of browserPerformanceTimeOrigin below. For debugging only.\n */\nlet _browserPerformanceTimeOriginMode;\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nconst browserPerformanceTimeOrigin = (() => {\n  // Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n  // performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n  // data as reliable if they are within a reasonable threshold of the current time.\n\n  const { performance } = GLOBAL_OBJ ;\n  if (!performance || !performance.now) {\n    _browserPerformanceTimeOriginMode = 'none';\n    return undefined;\n  }\n\n  const threshold = 3600 * 1000;\n  const performanceNow = performance.now();\n  const dateNow = Date.now();\n\n  // if timeOrigin isn't available set delta to threshold so it isn't used\n  const timeOriginDelta = performance.timeOrigin\n    ? Math.abs(performance.timeOrigin + performanceNow - dateNow)\n    : threshold;\n  const timeOriginIsReliable = timeOriginDelta < threshold;\n\n  // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n  // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n  // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n  // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n  // Date API.\n  // eslint-disable-next-line deprecation/deprecation\n  const navigationStart = performance.timing && performance.timing.navigationStart;\n  const hasNavigationStart = typeof navigationStart === 'number';\n  // if navigationStart isn't available set delta to threshold so it isn't used\n  const navigationStartDelta = hasNavigationStart ? Math.abs(navigationStart + performanceNow - dateNow) : threshold;\n  const navigationStartIsReliable = navigationStartDelta < threshold;\n\n  if (timeOriginIsReliable || navigationStartIsReliable) {\n    // Use the more reliable time origin\n    if (timeOriginDelta <= navigationStartDelta) {\n      _browserPerformanceTimeOriginMode = 'timeOrigin';\n      return performance.timeOrigin;\n    } else {\n      _browserPerformanceTimeOriginMode = 'navigationStart';\n      return navigationStart;\n    }\n  }\n\n  // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date.\n  _browserPerformanceTimeOriginMode = 'dateNow';\n  return dateNow;\n})();\n\nexport { _browserPerformanceTimeOriginMode, browserPerformanceTimeOrigin, dateTimestampInSeconds, timestampInSeconds };\n//# sourceMappingURL=time.js.map\n","import { isError } from '../is.js';\nimport { fill, addNonEnumerableProperty } from '../object.js';\nimport { supportsNativeFetch } from '../supports.js';\nimport { timestampInSeconds } from '../time.js';\nimport { GLOBAL_OBJ } from '../worldwide.js';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers.js';\n\n/**\n * Add an instrumentation handler for when a fetch request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nfunction addFetchInstrumentationHandler(\n  handler,\n  skipNativeFetchCheck,\n) {\n  const type = 'fetch';\n  addHandler(type, handler);\n  maybeInstrument(type, () => instrumentFetch(undefined, skipNativeFetchCheck));\n}\n\n/**\n * Add an instrumentation handler for long-lived fetch requests, like consuming server-sent events (SSE) via fetch.\n * The handler will resolve the request body and emit the actual `endTimestamp`, so that the\n * span can be updated accordingly.\n *\n * Only used internally\n * @hidden\n */\nfunction addFetchEndInstrumentationHandler(handler) {\n  const type = 'fetch-body-resolved';\n  addHandler(type, handler);\n  maybeInstrument(type, () => instrumentFetch(streamHandler));\n}\n\nfunction instrumentFetch(onFetchResolved, skipNativeFetchCheck = false) {\n  if (skipNativeFetchCheck && !supportsNativeFetch()) {\n    return;\n  }\n\n  fill(GLOBAL_OBJ, 'fetch', function (originalFetch) {\n    return function (...args) {\n      const { method, url } = parseFetchArgs(args);\n      const handlerData = {\n        args,\n        fetchData: {\n          method,\n          url,\n        },\n        startTimestamp: timestampInSeconds() * 1000,\n      };\n\n      // if there is no callback, fetch is instrumented directly\n      if (!onFetchResolved) {\n        triggerHandlers('fetch', {\n          ...handlerData,\n        });\n      }\n\n      // We capture the stack right here and not in the Promise error callback because Safari (and probably other\n      // browsers too) will wipe the stack trace up to this point, only leaving us with this file which is useless.\n\n      // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n      //       it means the error, that was caused by your fetch call did not\n      //       have a stack trace, so the SDK backfilled the stack trace so\n      //       you can see which fetch call failed.\n      const virtualStackTrace = new Error().stack;\n\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n      return originalFetch.apply(GLOBAL_OBJ, args).then(\n        async (response) => {\n          if (onFetchResolved) {\n            onFetchResolved(response);\n          } else {\n            triggerHandlers('fetch', {\n              ...handlerData,\n              endTimestamp: timestampInSeconds() * 1000,\n              response,\n            });\n          }\n\n          return response;\n        },\n        (error) => {\n          triggerHandlers('fetch', {\n            ...handlerData,\n            endTimestamp: timestampInSeconds() * 1000,\n            error,\n          });\n\n          if (isError(error) && error.stack === undefined) {\n            // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n            //       it means the error, that was caused by your fetch call did not\n            //       have a stack trace, so the SDK backfilled the stack trace so\n            //       you can see which fetch call failed.\n            error.stack = virtualStackTrace;\n            addNonEnumerableProperty(error, 'framesToPop', 1);\n          }\n\n          // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n          //       it means the sentry.javascript SDK caught an error invoking your application code.\n          //       This is expected behavior and NOT indicative of a bug with sentry.javascript.\n          throw error;\n        },\n      );\n    };\n  });\n}\n\nasync function resolveResponse(res, onFinishedResolving) {\n  if (res && res.body) {\n    const body = res.body;\n    const responseReader = body.getReader();\n\n    // Define a maximum duration after which we just cancel\n    const maxFetchDurationTimeout = setTimeout(\n      () => {\n        body.cancel().then(null, () => {\n          // noop\n        });\n      },\n      90 * 1000, // 90s\n    );\n\n    let readingActive = true;\n    while (readingActive) {\n      let chunkTimeout;\n      try {\n        // abort reading if read op takes more than 5s\n        chunkTimeout = setTimeout(() => {\n          body.cancel().then(null, () => {\n            // noop on error\n          });\n        }, 5000);\n\n        // This .read() call will reject/throw when we abort due to timeouts through `body.cancel()`\n        const { done } = await responseReader.read();\n\n        clearTimeout(chunkTimeout);\n\n        if (done) {\n          onFinishedResolving();\n          readingActive = false;\n        }\n      } catch (error) {\n        readingActive = false;\n      } finally {\n        clearTimeout(chunkTimeout);\n      }\n    }\n\n    clearTimeout(maxFetchDurationTimeout);\n\n    responseReader.releaseLock();\n    body.cancel().then(null, () => {\n      // noop on error\n    });\n  }\n}\n\nfunction streamHandler(response) {\n  // clone response for awaiting stream\n  let clonedResponseForResolving;\n  try {\n    clonedResponseForResolving = response.clone();\n  } catch (e) {\n    return;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-floating-promises\n  resolveResponse(clonedResponseForResolving, () => {\n    triggerHandlers('fetch-body-resolved', {\n      endTimestamp: timestampInSeconds() * 1000,\n      response,\n    });\n  });\n}\n\nfunction hasProp(obj, prop) {\n  return !!obj && typeof obj === 'object' && !!(obj )[prop];\n}\n\nfunction getUrlFromResource(resource) {\n  if (typeof resource === 'string') {\n    return resource;\n  }\n\n  if (!resource) {\n    return '';\n  }\n\n  if (hasProp(resource, 'url')) {\n    return resource.url;\n  }\n\n  if (resource.toString) {\n    return resource.toString();\n  }\n\n  return '';\n}\n\n/**\n * Parses the fetch arguments to find the used Http method and the url of the request.\n * Exported for tests only.\n */\nfunction parseFetchArgs(fetchArgs) {\n  if (fetchArgs.length === 0) {\n    return { method: 'GET', url: '' };\n  }\n\n  if (fetchArgs.length === 2) {\n    const [url, options] = fetchArgs ;\n\n    return {\n      url: getUrlFromResource(url),\n      method: hasProp(options, 'method') ? String(options.method).toUpperCase() : 'GET',\n    };\n  }\n\n  const arg = fetchArgs[0];\n  return {\n    url: getUrlFromResource(arg ),\n    method: hasProp(arg, 'method') ? String(arg.method).toUpperCase() : 'GET',\n  };\n}\n\nexport { addFetchEndInstrumentationHandler, addFetchInstrumentationHandler, parseFetchArgs };\n//# sourceMappingURL=fetch.js.map\n","import { GLOBAL_OBJ } from '../worldwide.js';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers.js';\n\nlet _oldOnErrorHandler = null;\n\n/**\n * Add an instrumentation handler for when an error is captured by the global error handler.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nfunction addGlobalErrorInstrumentationHandler(handler) {\n  const type = 'error';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentError);\n}\n\nfunction instrumentError() {\n  _oldOnErrorHandler = GLOBAL_OBJ.onerror;\n\n  GLOBAL_OBJ.onerror = function (\n    msg,\n    url,\n    line,\n    column,\n    error,\n  ) {\n    const handlerData = {\n      column,\n      error,\n      line,\n      msg,\n      url,\n    };\n    triggerHandlers('error', handlerData);\n\n    if (_oldOnErrorHandler && !_oldOnErrorHandler.__SENTRY_LOADER__) {\n      // eslint-disable-next-line prefer-rest-params\n      return _oldOnErrorHandler.apply(this, arguments);\n    }\n\n    return false;\n  };\n\n  GLOBAL_OBJ.onerror.__SENTRY_INSTRUMENTED__ = true;\n}\n\nexport { addGlobalErrorInstrumentationHandler };\n//# sourceMappingURL=globalError.js.map\n","import { GLOBAL_OBJ } from '../worldwide.js';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers.js';\n\nlet _oldOnUnhandledRejectionHandler = null;\n\n/**\n * Add an instrumentation handler for when an unhandled promise rejection is captured.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nfunction addGlobalUnhandledRejectionInstrumentationHandler(\n  handler,\n) {\n  const type = 'unhandledrejection';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentUnhandledRejection);\n}\n\nfunction instrumentUnhandledRejection() {\n  _oldOnUnhandledRejectionHandler = GLOBAL_OBJ.onunhandledrejection;\n\n  GLOBAL_OBJ.onunhandledrejection = function (e) {\n    const handlerData = e;\n    triggerHandlers('unhandledrejection', handlerData);\n\n    if (_oldOnUnhandledRejectionHandler && !_oldOnUnhandledRejectionHandler.__SENTRY_LOADER__) {\n      // eslint-disable-next-line prefer-rest-params\n      return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n    }\n\n    return true;\n  };\n\n  GLOBAL_OBJ.onunhandledrejection.__SENTRY_INSTRUMENTED__ = true;\n}\n\nexport { addGlobalUnhandledRejectionInstrumentationHandler };\n//# sourceMappingURL=globalUnhandledRejection.js.map\n","/*\n * This module exists for optimizations in the build process through rollup and terser.  We define some global\n * constants, which can be overridden during build. By guarding certain pieces of code with functions that return these\n * constants, we can control whether or not they appear in the final bundle. (Any code guarded by a false condition will\n * never run, and will hence be dropped during treeshaking.) The two primary uses for this are stripping out calls to\n * `logger` and preventing node-related code from appearing in browser bundles.\n *\n * Attention:\n * This file should not be used to define constants/flags that are intended to be used for tree-shaking conducted by\n * users. These flags should live in their respective packages, as we identified user tooling (specifically webpack)\n * having issues tree-shaking these constants across package boundaries.\n * An example for this is the __SENTRY_DEBUG__ constant. It is declared in each package individually because we want\n * users to be able to shake away expressions that it guards.\n */\n\n/**\n * Figures out if we're building a browser bundle.\n *\n * @returns true if this is a browser bundle build.\n */\nfunction isBrowserBundle() {\n  return typeof __SENTRY_BROWSER_BUNDLE__ !== 'undefined' && !!__SENTRY_BROWSER_BUNDLE__;\n}\n\n/**\n * Get source of SDK.\n */\nfunction getSDKSource() {\n  // This comment is used to identify this line in the CDN bundle build step and replace this with \"return 'cdn';\"\n  /* __SENTRY_SDK_SOURCE__ */ return 'npm';\n}\n\nexport { getSDKSource, isBrowserBundle };\n//# sourceMappingURL=env.js.map\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Helper to decycle json objects\n */\nfunction memoBuilder() {\n  const hasWeakSet = typeof WeakSet === 'function';\n  const inner = hasWeakSet ? new WeakSet() : [];\n  function memoize(obj) {\n    if (hasWeakSet) {\n      if (inner.has(obj)) {\n        return true;\n      }\n      inner.add(obj);\n      return false;\n    }\n    // eslint-disable-next-line @typescript-eslint/prefer-for-of\n    for (let i = 0; i < inner.length; i++) {\n      const value = inner[i];\n      if (value === obj) {\n        return true;\n      }\n    }\n    inner.push(obj);\n    return false;\n  }\n\n  function unmemoize(obj) {\n    if (hasWeakSet) {\n      inner.delete(obj);\n    } else {\n      for (let i = 0; i < inner.length; i++) {\n        if (inner[i] === obj) {\n          inner.splice(i, 1);\n          break;\n        }\n      }\n    }\n  }\n  return [memoize, unmemoize];\n}\n\nexport { memoBuilder };\n//# sourceMappingURL=memo.js.map\n","import { addNonEnumerableProperty } from './object.js';\nimport { snipLine } from './string.js';\nimport { GLOBAL_OBJ } from './worldwide.js';\n\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\nfunction uuid4() {\n  const gbl = GLOBAL_OBJ ;\n  const crypto = gbl.crypto || gbl.msCrypto;\n\n  let getRandomByte = () => Math.random() * 16;\n  try {\n    if (crypto && crypto.randomUUID) {\n      return crypto.randomUUID().replace(/-/g, '');\n    }\n    if (crypto && crypto.getRandomValues) {\n      getRandomByte = () => {\n        // crypto.getRandomValues might return undefined instead of the typed array\n        // in old Chromium versions (e.g. 23.0.1235.0 (151422))\n        // However, `typedArray` is still filled in-place.\n        // @see https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues#typedarray\n        const typedArray = new Uint8Array(1);\n        crypto.getRandomValues(typedArray);\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        return typedArray[0];\n      };\n    }\n  } catch (_) {\n    // some runtimes can crash invoking crypto\n    // https://github.com/getsentry/sentry-javascript/issues/8935\n  }\n\n  // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n  // Concatenating the following numbers as strings results in '10000000100040008000100000000000'\n  return (([1e7] ) + 1e3 + 4e3 + 8e3 + 1e11).replace(/[018]/g, c =>\n    // eslint-disable-next-line no-bitwise\n    ((c ) ^ ((getRandomByte() & 15) >> ((c ) / 4))).toString(16),\n  );\n}\n\nfunction getFirstException(event) {\n  return event.exception && event.exception.values ? event.exception.values[0] : undefined;\n}\n\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nfunction getEventDescription(event) {\n  const { message, event_id: eventId } = event;\n  if (message) {\n    return message;\n  }\n\n  const firstException = getFirstException(event);\n  if (firstException) {\n    if (firstException.type && firstException.value) {\n      return `${firstException.type}: ${firstException.value}`;\n    }\n    return firstException.type || firstException.value || eventId || '<unknown>';\n  }\n  return eventId || '<unknown>';\n}\n\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nfunction addExceptionTypeValue(event, value, type) {\n  const exception = (event.exception = event.exception || {});\n  const values = (exception.values = exception.values || []);\n  const firstException = (values[0] = values[0] || {});\n  if (!firstException.value) {\n    firstException.value = value || '';\n  }\n  if (!firstException.type) {\n    firstException.type = type || 'Error';\n  }\n}\n\n/**\n * Adds exception mechanism data to a given event. Uses defaults if the second parameter is not passed.\n *\n * @param event The event to modify.\n * @param newMechanism Mechanism data to add to the event.\n * @hidden\n */\nfunction addExceptionMechanism(event, newMechanism) {\n  const firstException = getFirstException(event);\n  if (!firstException) {\n    return;\n  }\n\n  const defaultMechanism = { type: 'generic', handled: true };\n  const currentMechanism = firstException.mechanism;\n  firstException.mechanism = { ...defaultMechanism, ...currentMechanism, ...newMechanism };\n\n  if (newMechanism && 'data' in newMechanism) {\n    const mergedData = { ...(currentMechanism && currentMechanism.data), ...newMechanism.data };\n    firstException.mechanism.data = mergedData;\n  }\n}\n\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nconst SEMVER_REGEXP =\n  /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\n/**\n * Represents Semantic Versioning object\n */\n\nfunction _parseInt(input) {\n  return parseInt(input || '', 10);\n}\n\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nfunction parseSemver(input) {\n  const match = input.match(SEMVER_REGEXP) || [];\n  const major = _parseInt(match[1]);\n  const minor = _parseInt(match[2]);\n  const patch = _parseInt(match[3]);\n  return {\n    buildmetadata: match[5],\n    major: isNaN(major) ? undefined : major,\n    minor: isNaN(minor) ? undefined : minor,\n    patch: isNaN(patch) ? undefined : patch,\n    prerelease: match[4],\n  };\n}\n\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nfunction addContextToFrame(lines, frame, linesOfContext = 5) {\n  // When there is no line number in the frame, attaching context is nonsensical and will even break grouping\n  if (frame.lineno === undefined) {\n    return;\n  }\n\n  const maxLines = lines.length;\n  const sourceLine = Math.max(Math.min(maxLines - 1, frame.lineno - 1), 0);\n\n  frame.pre_context = lines\n    .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n    .map((line) => snipLine(line, 0));\n\n  // We guard here to ensure this is not larger than the existing number of lines\n  const lineIndex = Math.min(maxLines - 1, sourceLine);\n\n  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n  frame.context_line = snipLine(lines[lineIndex], frame.colno || 0);\n\n  frame.post_context = lines\n    .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n    .map((line) => snipLine(line, 0));\n}\n\n/**\n * Checks whether or not we've already captured the given exception (note: not an identical exception - the very object\n * in question), and marks it captured if not.\n *\n * This is useful because it's possible for an error to get captured by more than one mechanism. After we intercept and\n * record an error, we rethrow it (assuming we've intercepted it before it's reached the top-level global handlers), so\n * that we don't interfere with whatever effects the error might have had were the SDK not there. At that point, because\n * the error has been rethrown, it's possible for it to bubble up to some other code we've instrumented. If it's not\n * caught after that, it will bubble all the way up to the global handlers (which of course we also instrument). This\n * function helps us ensure that even if we encounter the same error more than once, we only record it the first time we\n * see it.\n *\n * Note: It will ignore primitives (always return `false` and not mark them as seen), as properties can't be set on\n * them. {@link: Object.objectify} can be used on exceptions to convert any that are primitives into their equivalent\n * object wrapper forms so that this check will always work. However, because we need to flag the exact object which\n * will get rethrown, and because that rethrowing happens outside of the event processing pipeline, the objectification\n * must be done before the exception captured.\n *\n * @param A thrown exception to check or flag as having been seen\n * @returns `true` if the exception has already been captured, `false` if not (with the side effect of marking it seen)\n */\nfunction checkOrSetAlreadyCaught(exception) {\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n  if (exception && (exception ).__sentry_captured__) {\n    return true;\n  }\n\n  try {\n    // set it this way rather than by assignment so that it's not ennumerable and therefore isn't recorded by the\n    // `ExtraErrorData` integration\n    addNonEnumerableProperty(exception , '__sentry_captured__', true);\n  } catch (err) {\n    // `exception` is a primitive, so we can't mark it seen\n  }\n\n  return false;\n}\n\n/**\n * Checks whether the given input is already an array, and if it isn't, wraps it in one.\n *\n * @param maybeArray Input to turn into an array, if necessary\n * @returns The input, if already an array, or an array with the input as the only element, if not\n */\nfunction arrayify(maybeArray) {\n  return Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n}\n\nexport { addContextToFrame, addExceptionMechanism, addExceptionTypeValue, arrayify, checkOrSetAlreadyCaught, getEventDescription, parseSemver, uuid4 };\n//# sourceMappingURL=misc.js.map\n","import { isVueViewModel, isSyntheticEvent } from './is.js';\nimport { memoBuilder } from './memo.js';\nimport { convertToPlainObject } from './object.js';\nimport { getFunctionName } from './stacktrace.js';\n\n/**\n * Recursively normalizes the given object.\n *\n * - Creates a copy to prevent original input mutation\n * - Skips non-enumerable properties\n * - When stringifying, calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializable values (`undefined`/`NaN`/functions) to serializable format\n * - Translates known global objects/classes to a string representations\n * - Takes care of `Error` object serialization\n * - Optionally limits depth of final output\n * - Optionally limits number of properties/elements included in any single object/array\n *\n * @param input The object to be normalized.\n * @param depth The max depth to which to normalize the object. (Anything deeper stringified whole.)\n * @param maxProperties The max number of elements or properties to be included in any single array or\n * object in the normallized output.\n * @returns A normalized version of the object, or `\"**non-serializable**\"` if any errors are thrown during normalization.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalize(input, depth = 100, maxProperties = +Infinity) {\n  try {\n    // since we're at the outermost level, we don't provide a key\n    return visit('', input, depth, maxProperties);\n  } catch (err) {\n    return { ERROR: `**non-serializable** (${err})` };\n  }\n}\n\n/** JSDoc */\nfunction normalizeToSize(\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  object,\n  // Default Node.js REPL depth\n  depth = 3,\n  // 100kB, as 200kB is max payload size, so half sounds reasonable\n  maxSize = 100 * 1024,\n) {\n  const normalized = normalize(object, depth);\n\n  if (jsonSize(normalized) > maxSize) {\n    return normalizeToSize(object, depth - 1, maxSize);\n  }\n\n  return normalized ;\n}\n\n/**\n * Visits a node to perform normalization on it\n *\n * @param key The key corresponding to the given node\n * @param value The node to be visited\n * @param depth Optional number indicating the maximum recursion depth\n * @param maxProperties Optional maximum number of properties/elements included in any single object/array\n * @param memo Optional Memo class handling decycling\n */\nfunction visit(\n  key,\n  value,\n  depth = +Infinity,\n  maxProperties = +Infinity,\n  memo = memoBuilder(),\n) {\n  const [memoize, unmemoize] = memo;\n\n  // Get the simple cases out of the way first\n  if (\n    value == null || // this matches null and undefined -> eqeq not eqeqeq\n    ['boolean', 'string'].includes(typeof value) ||\n    (typeof value === 'number' && Number.isFinite(value))\n  ) {\n    return value ;\n  }\n\n  const stringified = stringifyValue(key, value);\n\n  // Anything we could potentially dig into more (objects or arrays) will have come back as `\"[object XXXX]\"`.\n  // Everything else will have already been serialized, so if we don't see that pattern, we're done.\n  if (!stringified.startsWith('[object ')) {\n    return stringified;\n  }\n\n  // From here on, we can assert that `value` is either an object or an array.\n\n  // Do not normalize objects that we know have already been normalized. As a general rule, the\n  // \"__sentry_skip_normalization__\" property should only be used sparingly and only should only be set on objects that\n  // have already been normalized.\n  if ((value )['__sentry_skip_normalization__']) {\n    return value ;\n  }\n\n  // We can set `__sentry_override_normalization_depth__` on an object to ensure that from there\n  // We keep a certain amount of depth.\n  // This should be used sparingly, e.g. we use it for the redux integration to ensure we get a certain amount of state.\n  const remainingDepth =\n    typeof (value )['__sentry_override_normalization_depth__'] === 'number'\n      ? ((value )['__sentry_override_normalization_depth__'] )\n      : depth;\n\n  // We're also done if we've reached the max depth\n  if (remainingDepth === 0) {\n    // At this point we know `serialized` is a string of the form `\"[object XXXX]\"`. Clean it up so it's just `\"[XXXX]\"`.\n    return stringified.replace('object ', '');\n  }\n\n  // If we've already visited this branch, bail out, as it's circular reference. If not, note that we're seeing it now.\n  if (memoize(value)) {\n    return '[Circular ~]';\n  }\n\n  // If the value has a `toJSON` method, we call it to extract more information\n  const valueWithToJSON = value ;\n  if (valueWithToJSON && typeof valueWithToJSON.toJSON === 'function') {\n    try {\n      const jsonValue = valueWithToJSON.toJSON();\n      // We need to normalize the return value of `.toJSON()` in case it has circular references\n      return visit('', jsonValue, remainingDepth - 1, maxProperties, memo);\n    } catch (err) {\n      // pass (The built-in `toJSON` failed, but we can still try to do it ourselves)\n    }\n  }\n\n  // At this point we know we either have an object or an array, we haven't seen it before, and we're going to recurse\n  // because we haven't yet reached the max depth. Create an accumulator to hold the results of visiting each\n  // property/entry, and keep track of the number of items we add to it.\n  const normalized = (Array.isArray(value) ? [] : {}) ;\n  let numAdded = 0;\n\n  // Before we begin, convert`Error` and`Event` instances into plain objects, since some of each of their relevant\n  // properties are non-enumerable and otherwise would get missed.\n  const visitable = convertToPlainObject(value );\n\n  for (const visitKey in visitable) {\n    // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n    if (!Object.prototype.hasOwnProperty.call(visitable, visitKey)) {\n      continue;\n    }\n\n    if (numAdded >= maxProperties) {\n      normalized[visitKey] = '[MaxProperties ~]';\n      break;\n    }\n\n    // Recursively visit all the child nodes\n    const visitValue = visitable[visitKey];\n    normalized[visitKey] = visit(visitKey, visitValue, remainingDepth - 1, maxProperties, memo);\n\n    numAdded++;\n  }\n\n  // Once we've visited all the branches, remove the parent from memo storage\n  unmemoize(value);\n\n  // Return accumulated values\n  return normalized;\n}\n\n/* eslint-disable complexity */\n/**\n * Stringify the given value. Handles various known special values and types.\n *\n * Not meant to be used on simple primitives which already have a string representation, as it will, for example, turn\n * the number 1231 into \"[Object Number]\", nor on `null`, as it will throw.\n *\n * @param value The value to stringify\n * @returns A stringified representation of the given value\n */\nfunction stringifyValue(\n  key,\n  // this type is a tiny bit of a cheat, since this function does handle NaN (which is technically a number), but for\n  // our internal use, it'll do\n  value,\n) {\n  try {\n    if (key === 'domain' && value && typeof value === 'object' && (value )._events) {\n      return '[Domain]';\n    }\n\n    if (key === 'domainEmitter') {\n      return '[DomainEmitter]';\n    }\n\n    // It's safe to use `global`, `window`, and `document` here in this manner, as we are asserting using `typeof` first\n    // which won't throw if they are not present.\n\n    if (typeof global !== 'undefined' && value === global) {\n      return '[Global]';\n    }\n\n    // eslint-disable-next-line no-restricted-globals\n    if (typeof window !== 'undefined' && value === window) {\n      return '[Window]';\n    }\n\n    // eslint-disable-next-line no-restricted-globals\n    if (typeof document !== 'undefined' && value === document) {\n      return '[Document]';\n    }\n\n    if (isVueViewModel(value)) {\n      return '[VueViewModel]';\n    }\n\n    // React's SyntheticEvent thingy\n    if (isSyntheticEvent(value)) {\n      return '[SyntheticEvent]';\n    }\n\n    if (typeof value === 'number' && !Number.isFinite(value)) {\n      return `[${value}]`;\n    }\n\n    if (typeof value === 'function') {\n      return `[Function: ${getFunctionName(value)}]`;\n    }\n\n    if (typeof value === 'symbol') {\n      return `[${String(value)}]`;\n    }\n\n    // stringified BigInts are indistinguishable from regular numbers, so we need to label them to avoid confusion\n    if (typeof value === 'bigint') {\n      return `[BigInt: ${String(value)}]`;\n    }\n\n    // Now that we've knocked out all the special cases and the primitives, all we have left are objects. Simply casting\n    // them to strings means that instances of classes which haven't defined their `toStringTag` will just come out as\n    // `\"[object Object]\"`. If we instead look at the constructor's name (which is the same as the name of the class),\n    // we can make sure that only plain objects come out that way.\n    const objName = getConstructorName(value);\n\n    // Handle HTML Elements\n    if (/^HTML(\\w*)Element$/.test(objName)) {\n      return `[HTMLElement: ${objName}]`;\n    }\n\n    return `[object ${objName}]`;\n  } catch (err) {\n    return `**non-serializable** (${err})`;\n  }\n}\n/* eslint-enable complexity */\n\nfunction getConstructorName(value) {\n  const prototype = Object.getPrototypeOf(value);\n\n  return prototype ? prototype.constructor.name : 'null prototype';\n}\n\n/** Calculates bytes size of input string */\nfunction utf8Length(value) {\n  // eslint-disable-next-line no-bitwise\n  return ~-encodeURI(value).split(/%..|./).length;\n}\n\n/** Calculates bytes size of input object */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction jsonSize(value) {\n  return utf8Length(JSON.stringify(value));\n}\n\n/**\n * Normalizes URLs in exceptions and stacktraces to a base path so Sentry can fingerprint\n * across platforms and working directory.\n *\n * @param url The URL to be normalized.\n * @param basePath The application base path.\n * @returns The normalized URL.\n */\nfunction normalizeUrlToBase(url, basePath) {\n  const escapedBase = basePath\n    // Backslash to forward\n    .replace(/\\\\/g, '/')\n    // Escape RegExp special characters\n    .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n\n  let newUrl = url;\n  try {\n    newUrl = decodeURI(url);\n  } catch (_Oo) {\n    // Sometime this breaks\n  }\n  return (\n    newUrl\n      .replace(/\\\\/g, '/')\n      .replace(/webpack:\\/?/g, '') // Remove intermediate base path\n      // eslint-disable-next-line @sentry-internal/sdk/no-regexp-constructor\n      .replace(new RegExp(`(file://)?/*${escapedBase}/*`, 'ig'), 'app:///')\n  );\n}\n\nexport { normalize, normalizeToSize, normalizeUrlToBase };\n//# sourceMappingURL=normalize.js.map\n","import { isThenable } from './is.js';\n\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/** SyncPromise internal states */\nvar States; (function (States) {\n  /** Pending */\n  const PENDING = 0; States[States[\"PENDING\"] = PENDING] = \"PENDING\";\n  /** Resolved / OK */\n  const RESOLVED = 1; States[States[\"RESOLVED\"] = RESOLVED] = \"RESOLVED\";\n  /** Rejected / Error */\n  const REJECTED = 2; States[States[\"REJECTED\"] = REJECTED] = \"REJECTED\";\n})(States || (States = {}));\n\n// Overloads so we can call resolvedSyncPromise without arguments and generic argument\n\n/**\n * Creates a resolved sync promise.\n *\n * @param value the value to resolve the promise with\n * @returns the resolved sync promise\n */\nfunction resolvedSyncPromise(value) {\n  return new SyncPromise(resolve => {\n    resolve(value);\n  });\n}\n\n/**\n * Creates a rejected sync promise.\n *\n * @param value the value to reject the promise with\n * @returns the rejected sync promise\n */\nfunction rejectedSyncPromise(reason) {\n  return new SyncPromise((_, reject) => {\n    reject(reason);\n  });\n}\n\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nclass SyncPromise {\n\n   constructor(\n    executor,\n  ) {SyncPromise.prototype.__init.call(this);SyncPromise.prototype.__init2.call(this);SyncPromise.prototype.__init3.call(this);SyncPromise.prototype.__init4.call(this);\n    this._state = States.PENDING;\n    this._handlers = [];\n\n    try {\n      executor(this._resolve, this._reject);\n    } catch (e) {\n      this._reject(e);\n    }\n  }\n\n  /** JSDoc */\n   then(\n    onfulfilled,\n    onrejected,\n  ) {\n    return new SyncPromise((resolve, reject) => {\n      this._handlers.push([\n        false,\n        result => {\n          if (!onfulfilled) {\n            // TODO: ¯\\_(ツ)_/¯\n            // TODO: FIXME\n            resolve(result );\n          } else {\n            try {\n              resolve(onfulfilled(result));\n            } catch (e) {\n              reject(e);\n            }\n          }\n        },\n        reason => {\n          if (!onrejected) {\n            reject(reason);\n          } else {\n            try {\n              resolve(onrejected(reason));\n            } catch (e) {\n              reject(e);\n            }\n          }\n        },\n      ]);\n      this._executeHandlers();\n    });\n  }\n\n  /** JSDoc */\n   catch(\n    onrejected,\n  ) {\n    return this.then(val => val, onrejected);\n  }\n\n  /** JSDoc */\n   finally(onfinally) {\n    return new SyncPromise((resolve, reject) => {\n      let val;\n      let isRejected;\n\n      return this.then(\n        value => {\n          isRejected = false;\n          val = value;\n          if (onfinally) {\n            onfinally();\n          }\n        },\n        reason => {\n          isRejected = true;\n          val = reason;\n          if (onfinally) {\n            onfinally();\n          }\n        },\n      ).then(() => {\n        if (isRejected) {\n          reject(val);\n          return;\n        }\n\n        resolve(val );\n      });\n    });\n  }\n\n  /** JSDoc */\n    __init() {this._resolve = (value) => {\n    this._setResult(States.RESOLVED, value);\n  };}\n\n  /** JSDoc */\n    __init2() {this._reject = (reason) => {\n    this._setResult(States.REJECTED, reason);\n  };}\n\n  /** JSDoc */\n    __init3() {this._setResult = (state, value) => {\n    if (this._state !== States.PENDING) {\n      return;\n    }\n\n    if (isThenable(value)) {\n      void (value ).then(this._resolve, this._reject);\n      return;\n    }\n\n    this._state = state;\n    this._value = value;\n\n    this._executeHandlers();\n  };}\n\n  /** JSDoc */\n    __init4() {this._executeHandlers = () => {\n    if (this._state === States.PENDING) {\n      return;\n    }\n\n    const cachedHandlers = this._handlers.slice();\n    this._handlers = [];\n\n    cachedHandlers.forEach(handler => {\n      if (handler[0]) {\n        return;\n      }\n\n      if (this._state === States.RESOLVED) {\n        handler[1](this._value );\n      }\n\n      if (this._state === States.REJECTED) {\n        handler[2](this._value);\n      }\n\n      handler[0] = true;\n    });\n  };}\n}\n\nexport { SyncPromise, rejectedSyncPromise, resolvedSyncPromise };\n//# sourceMappingURL=syncpromise.js.map\n","import { SentryError } from './error.js';\nimport { rejectedSyncPromise, SyncPromise, resolvedSyncPromise } from './syncpromise.js';\n\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nfunction makePromiseBuffer(limit) {\n  const buffer = [];\n\n  function isReady() {\n    return limit === undefined || buffer.length < limit;\n  }\n\n  /**\n   * Remove a promise from the queue.\n   *\n   * @param task Can be any PromiseLike<T>\n   * @returns Removed promise.\n   */\n  function remove(task) {\n    return buffer.splice(buffer.indexOf(task), 1)[0] || Promise.resolve(undefined);\n  }\n\n  /**\n   * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n   *\n   * @param taskProducer A function producing any PromiseLike<T>; In previous versions this used to be `task:\n   *        PromiseLike<T>`, but under that model, Promises were instantly created on the call-site and their executor\n   *        functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n   *        requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n   *        limit check.\n   * @returns The original promise.\n   */\n  function add(taskProducer) {\n    if (!isReady()) {\n      return rejectedSyncPromise(new SentryError('Not adding Promise because buffer limit was reached.'));\n    }\n\n    // start the task and add its promise to the queue\n    const task = taskProducer();\n    if (buffer.indexOf(task) === -1) {\n      buffer.push(task);\n    }\n    void task\n      .then(() => remove(task))\n      // Use `then(null, rejectionHandler)` rather than `catch(rejectionHandler)` so that we can use `PromiseLike`\n      // rather than `Promise`. `PromiseLike` doesn't have a `.catch` method, making its polyfill smaller. (ES5 didn't\n      // have promises, so TS has to polyfill when down-compiling.)\n      .then(null, () =>\n        remove(task).then(null, () => {\n          // We have to add another catch here because `remove()` starts a new promise chain.\n        }),\n      );\n    return task;\n  }\n\n  /**\n   * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n   *\n   * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n   * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n   * `true`.\n   * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n   * `false` otherwise\n   */\n  function drain(timeout) {\n    return new SyncPromise((resolve, reject) => {\n      let counter = buffer.length;\n\n      if (!counter) {\n        return resolve(true);\n      }\n\n      // wait for `timeout` ms and then resolve to `false` (if not cancelled first)\n      const capturedSetTimeout = setTimeout(() => {\n        if (timeout && timeout > 0) {\n          resolve(false);\n        }\n      }, timeout);\n\n      // if all promises resolve in time, cancel the timer and resolve to `true`\n      buffer.forEach(item => {\n        void resolvedSyncPromise(item).then(() => {\n          if (!--counter) {\n            clearTimeout(capturedSetTimeout);\n            resolve(true);\n          }\n        }, reject);\n      });\n    });\n  }\n\n  return {\n    $: buffer,\n    add,\n    drain,\n  };\n}\n\nexport { makePromiseBuffer };\n//# sourceMappingURL=promisebuffer.js.map\n","/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not <a/> href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\nfunction parseUrl(url) {\n  if (!url) {\n    return {};\n  }\n\n  const match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n  if (!match) {\n    return {};\n  }\n\n  // coerce to undefined values to empty string so we don't get 'undefined'\n  const query = match[6] || '';\n  const fragment = match[8] || '';\n  return {\n    host: match[4],\n    path: match[5],\n    protocol: match[2],\n    search: query,\n    hash: fragment,\n    relative: match[5] + query + fragment, // everything minus origin\n  };\n}\n\n/**\n * Strip the query string and fragment off of a given URL or path (if present)\n *\n * @param urlPath Full URL or path, including possible query string and/or fragment\n * @returns URL or path without query string or fragment\n */\nfunction stripUrlQueryAndFragment(urlPath) {\n  return (urlPath.split(/[?#]/, 1) )[0];\n}\n\n/**\n * Returns number of URL segments of a passed string URL.\n */\nfunction getNumberOfUrlSegments(url) {\n  // split at '/' or at '\\/' to split regex urls correctly\n  return url.split(/\\\\?\\//).filter(s => s.length > 0 && s !== ',').length;\n}\n\n/**\n * Takes a URL object and returns a sanitized string which is safe to use as span name\n * see: https://develop.sentry.dev/sdk/data-handling/#structuring-data\n */\nfunction getSanitizedUrlString(url) {\n  const { protocol, host, path } = url;\n\n  const filteredHost =\n    (host &&\n      host\n        // Always filter out authority\n        .replace(/^.*@/, '[filtered]:[filtered]@')\n        // Don't show standard :80 (http) and :443 (https) ports to reduce the noise\n        // TODO: Use new URL global if it exists\n        .replace(/(:80)$/, '')\n        .replace(/(:443)$/, '')) ||\n    '';\n\n  return `${protocol ? `${protocol}://` : ''}${filteredHost}${path}`;\n}\n\nexport { getNumberOfUrlSegments, getSanitizedUrlString, parseUrl, stripUrlQueryAndFragment };\n//# sourceMappingURL=url.js.map\n","// Note: Ideally the `SeverityLevel` type would be derived from `validSeverityLevels`, but that would mean either\n//\n// a) moving `validSeverityLevels` to `@sentry/types`,\n// b) moving the`SeverityLevel` type here, or\n// c) importing `validSeverityLevels` from here into `@sentry/types`.\n//\n// Option A would make `@sentry/types` a runtime dependency of `@sentry/utils` (not good), and options B and C would\n// create a circular dependency between `@sentry/types` and `@sentry/utils` (also not good). So a TODO accompanying the\n// type, reminding anyone who changes it to change this list also, will have to do.\n\nconst validSeverityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug'];\n\n/**\n * Converts a string-based level into a `SeverityLevel`, normalizing it along the way.\n *\n * @param level String representation of desired `SeverityLevel`.\n * @returns The `SeverityLevel` corresponding to the given string, or 'log' if the string isn't a valid level.\n */\nfunction severityLevelFromString(level) {\n  return (level === 'warn' ? 'warning' : validSeverityLevels.includes(level) ? level : 'log') ;\n}\n\nexport { severityLevelFromString, validSeverityLevels };\n//# sourceMappingURL=severity.js.map\n","import { DEBUG_BUILD } from './debug-build.js';\nimport { isString } from './is.js';\nimport { logger } from './logger.js';\n\nconst BAGGAGE_HEADER_NAME = 'baggage';\n\nconst SENTRY_BAGGAGE_KEY_PREFIX = 'sentry-';\n\nconst SENTRY_BAGGAGE_KEY_PREFIX_REGEX = /^sentry-/;\n\n/**\n * Max length of a serialized baggage string\n *\n * https://www.w3.org/TR/baggage/#limits\n */\nconst MAX_BAGGAGE_STRING_LENGTH = 8192;\n\n/**\n * Takes a baggage header and turns it into Dynamic Sampling Context, by extracting all the \"sentry-\" prefixed values\n * from it.\n *\n * @param baggageHeader A very bread definition of a baggage header as it might appear in various frameworks.\n * @returns The Dynamic Sampling Context that was found on `baggageHeader`, if there was any, `undefined` otherwise.\n */\nfunction baggageHeaderToDynamicSamplingContext(\n  // Very liberal definition of what any incoming header might look like\n  baggageHeader,\n) {\n  const baggageObject = parseBaggageHeader(baggageHeader);\n\n  if (!baggageObject) {\n    return undefined;\n  }\n\n  // Read all \"sentry-\" prefixed values out of the baggage object and put it onto a dynamic sampling context object.\n  const dynamicSamplingContext = Object.entries(baggageObject).reduce((acc, [key, value]) => {\n    if (key.match(SENTRY_BAGGAGE_KEY_PREFIX_REGEX)) {\n      const nonPrefixedKey = key.slice(SENTRY_BAGGAGE_KEY_PREFIX.length);\n      acc[nonPrefixedKey] = value;\n    }\n    return acc;\n  }, {});\n\n  // Only return a dynamic sampling context object if there are keys in it.\n  // A keyless object means there were no sentry values on the header, which means that there is no DSC.\n  if (Object.keys(dynamicSamplingContext).length > 0) {\n    return dynamicSamplingContext ;\n  } else {\n    return undefined;\n  }\n}\n\n/**\n * Turns a Dynamic Sampling Object into a baggage header by prefixing all the keys on the object with \"sentry-\".\n *\n * @param dynamicSamplingContext The Dynamic Sampling Context to turn into a header. For convenience and compatibility\n * with the `getDynamicSamplingContext` method on the Transaction class ,this argument can also be `undefined`. If it is\n * `undefined` the function will return `undefined`.\n * @returns a baggage header, created from `dynamicSamplingContext`, or `undefined` either if `dynamicSamplingContext`\n * was `undefined`, or if `dynamicSamplingContext` didn't contain any values.\n */\nfunction dynamicSamplingContextToSentryBaggageHeader(\n  // this also takes undefined for convenience and bundle size in other places\n  dynamicSamplingContext,\n) {\n  if (!dynamicSamplingContext) {\n    return undefined;\n  }\n\n  // Prefix all DSC keys with \"sentry-\" and put them into a new object\n  const sentryPrefixedDSC = Object.entries(dynamicSamplingContext).reduce(\n    (acc, [dscKey, dscValue]) => {\n      if (dscValue) {\n        acc[`${SENTRY_BAGGAGE_KEY_PREFIX}${dscKey}`] = dscValue;\n      }\n      return acc;\n    },\n    {},\n  );\n\n  return objectToBaggageHeader(sentryPrefixedDSC);\n}\n\n/**\n * Take a baggage header and parse it into an object.\n */\nfunction parseBaggageHeader(\n  baggageHeader,\n) {\n  if (!baggageHeader || (!isString(baggageHeader) && !Array.isArray(baggageHeader))) {\n    return undefined;\n  }\n\n  if (Array.isArray(baggageHeader)) {\n    // Combine all baggage headers into one object containing the baggage values so we can later read the Sentry-DSC-values from it\n    return baggageHeader.reduce((acc, curr) => {\n      const currBaggageObject = baggageHeaderToObject(curr);\n      Object.entries(currBaggageObject).forEach(([key, value]) => {\n        acc[key] = value;\n      });\n      return acc;\n    }, {});\n  }\n\n  return baggageHeaderToObject(baggageHeader);\n}\n\n/**\n * Will parse a baggage header, which is a simple key-value map, into a flat object.\n *\n * @param baggageHeader The baggage header to parse.\n * @returns a flat object containing all the key-value pairs from `baggageHeader`.\n */\nfunction baggageHeaderToObject(baggageHeader) {\n  return baggageHeader\n    .split(',')\n    .map(baggageEntry => baggageEntry.split('=').map(keyOrValue => decodeURIComponent(keyOrValue.trim())))\n    .reduce((acc, [key, value]) => {\n      if (key && value) {\n        acc[key] = value;\n      }\n      return acc;\n    }, {});\n}\n\n/**\n * Turns a flat object (key-value pairs) into a baggage header, which is also just key-value pairs.\n *\n * @param object The object to turn into a baggage header.\n * @returns a baggage header string, or `undefined` if the object didn't have any values, since an empty baggage header\n * is not spec compliant.\n */\nfunction objectToBaggageHeader(object) {\n  if (Object.keys(object).length === 0) {\n    // An empty baggage header is not spec compliant: We return undefined.\n    return undefined;\n  }\n\n  return Object.entries(object).reduce((baggageHeader, [objectKey, objectValue], currentIndex) => {\n    const baggageEntry = `${encodeURIComponent(objectKey)}=${encodeURIComponent(objectValue)}`;\n    const newBaggageHeader = currentIndex === 0 ? baggageEntry : `${baggageHeader},${baggageEntry}`;\n    if (newBaggageHeader.length > MAX_BAGGAGE_STRING_LENGTH) {\n      DEBUG_BUILD &&\n        logger.warn(\n          `Not adding key: ${objectKey} with val: ${objectValue} to baggage header due to exceeding baggage size limits.`,\n        );\n      return baggageHeader;\n    } else {\n      return newBaggageHeader;\n    }\n  }, '');\n}\n\nexport { BAGGAGE_HEADER_NAME, MAX_BAGGAGE_STRING_LENGTH, SENTRY_BAGGAGE_KEY_PREFIX, SENTRY_BAGGAGE_KEY_PREFIX_REGEX, baggageHeaderToDynamicSamplingContext, dynamicSamplingContextToSentryBaggageHeader, parseBaggageHeader };\n//# sourceMappingURL=baggage.js.map\n","import { dsnToString } from './dsn.js';\nimport { normalize } from './normalize.js';\nimport { dropUndefinedKeys } from './object.js';\nimport { GLOBAL_OBJ } from './worldwide.js';\n\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nfunction createEnvelope(headers, items = []) {\n  return [headers, items] ;\n}\n\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nfunction addItemToEnvelope(envelope, newItem) {\n  const [headers, items] = envelope;\n  return [headers, [...items, newItem]] ;\n}\n\n/**\n * Convenience function to loop through the items and item types of an envelope.\n * (This function was mostly created because working with envelope types is painful at the moment)\n *\n * If the callback returns true, the rest of the items will be skipped.\n */\nfunction forEachEnvelopeItem(\n  envelope,\n  callback,\n) {\n  const envelopeItems = envelope[1];\n\n  for (const envelopeItem of envelopeItems) {\n    const envelopeItemType = envelopeItem[0].type;\n    const result = callback(envelopeItem, envelopeItemType);\n\n    if (result) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Returns true if the envelope contains any of the given envelope item types\n */\nfunction envelopeContainsItemType(envelope, types) {\n  return forEachEnvelopeItem(envelope, (_, type) => types.includes(type));\n}\n\n/**\n * Encode a string to UTF8 array.\n */\nfunction encodeUTF8(input) {\n  return GLOBAL_OBJ.__SENTRY__ && GLOBAL_OBJ.__SENTRY__.encodePolyfill\n    ? GLOBAL_OBJ.__SENTRY__.encodePolyfill(input)\n    : new TextEncoder().encode(input);\n}\n\n/**\n * Decode a UTF8 array to string.\n */\nfunction decodeUTF8(input) {\n  return GLOBAL_OBJ.__SENTRY__ && GLOBAL_OBJ.__SENTRY__.decodePolyfill\n    ? GLOBAL_OBJ.__SENTRY__.decodePolyfill(input)\n    : new TextDecoder().decode(input);\n}\n\n/**\n * Serializes an envelope.\n */\nfunction serializeEnvelope(envelope) {\n  const [envHeaders, items] = envelope;\n\n  // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data\n  let parts = JSON.stringify(envHeaders);\n\n  function append(next) {\n    if (typeof parts === 'string') {\n      parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts), next];\n    } else {\n      parts.push(typeof next === 'string' ? encodeUTF8(next) : next);\n    }\n  }\n\n  for (const item of items) {\n    const [itemHeaders, payload] = item;\n\n    append(`\\n${JSON.stringify(itemHeaders)}\\n`);\n\n    if (typeof payload === 'string' || payload instanceof Uint8Array) {\n      append(payload);\n    } else {\n      let stringifiedPayload;\n      try {\n        stringifiedPayload = JSON.stringify(payload);\n      } catch (e) {\n        // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.strinify()` still\n        // fails, we try again after normalizing it again with infinite normalization depth. This of course has a\n        // performance impact but in this case a performance hit is better than throwing.\n        stringifiedPayload = JSON.stringify(normalize(payload));\n      }\n      append(stringifiedPayload);\n    }\n  }\n\n  return typeof parts === 'string' ? parts : concatBuffers(parts);\n}\n\nfunction concatBuffers(buffers) {\n  const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n  const merged = new Uint8Array(totalLength);\n  let offset = 0;\n  for (const buffer of buffers) {\n    merged.set(buffer, offset);\n    offset += buffer.length;\n  }\n\n  return merged;\n}\n\n/**\n * Parses an envelope\n */\nfunction parseEnvelope(env) {\n  let buffer = typeof env === 'string' ? encodeUTF8(env) : env;\n\n  function readBinary(length) {\n    const bin = buffer.subarray(0, length);\n    // Replace the buffer with the remaining data excluding trailing newline\n    buffer = buffer.subarray(length + 1);\n    return bin;\n  }\n\n  function readJson() {\n    let i = buffer.indexOf(0xa);\n    // If we couldn't find a newline, we must have found the end of the buffer\n    if (i < 0) {\n      i = buffer.length;\n    }\n\n    return JSON.parse(decodeUTF8(readBinary(i))) ;\n  }\n\n  const envelopeHeader = readJson();\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const items = [];\n\n  while (buffer.length) {\n    const itemHeader = readJson();\n    const binaryLength = typeof itemHeader.length === 'number' ? itemHeader.length : undefined;\n\n    items.push([itemHeader, binaryLength ? readBinary(binaryLength) : readJson()]);\n  }\n\n  return [envelopeHeader, items];\n}\n\n/**\n * Creates envelope item for a single span\n */\nfunction createSpanEnvelopeItem(spanJson) {\n  const spanHeaders = {\n    type: 'span',\n  };\n\n  return [spanHeaders, spanJson];\n}\n\n/**\n * Creates attachment envelope items\n */\nfunction createAttachmentEnvelopeItem(attachment) {\n  const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data) : attachment.data;\n\n  return [\n    dropUndefinedKeys({\n      type: 'attachment',\n      length: buffer.length,\n      filename: attachment.filename,\n      content_type: attachment.contentType,\n      attachment_type: attachment.attachmentType,\n    }),\n    buffer,\n  ];\n}\n\nconst ITEM_TYPE_TO_DATA_CATEGORY_MAP = {\n  session: 'session',\n  sessions: 'session',\n  attachment: 'attachment',\n  transaction: 'transaction',\n  event: 'error',\n  client_report: 'internal',\n  user_report: 'default',\n  profile: 'profile',\n  profile_chunk: 'profile',\n  replay_event: 'replay',\n  replay_recording: 'replay',\n  check_in: 'monitor',\n  feedback: 'feedback',\n  span: 'span',\n  statsd: 'metric_bucket',\n};\n\n/**\n * Maps the type of an envelope item to a data category.\n */\nfunction envelopeItemTypeToDataCategory(type) {\n  return ITEM_TYPE_TO_DATA_CATEGORY_MAP[type];\n}\n\n/** Extracts the minimal SDK info from the metadata or an events */\nfunction getSdkMetadataForEnvelopeHeader(metadataOrEvent) {\n  if (!metadataOrEvent || !metadataOrEvent.sdk) {\n    return;\n  }\n  const { name, version } = metadataOrEvent.sdk;\n  return { name, version };\n}\n\n/**\n * Creates event envelope headers, based on event, sdk info and tunnel\n * Note: This function was extracted from the core package to make it available in Replay\n */\nfunction createEventEnvelopeHeaders(\n  event,\n  sdkInfo,\n  tunnel,\n  dsn,\n) {\n  const dynamicSamplingContext = event.sdkProcessingMetadata && event.sdkProcessingMetadata.dynamicSamplingContext;\n  return {\n    event_id: event.event_id ,\n    sent_at: new Date().toISOString(),\n    ...(sdkInfo && { sdk: sdkInfo }),\n    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n    ...(dynamicSamplingContext && {\n      trace: dropUndefinedKeys({ ...dynamicSamplingContext }),\n    }),\n  };\n}\n\nexport { addItemToEnvelope, createAttachmentEnvelopeItem, createEnvelope, createEventEnvelopeHeaders, createSpanEnvelopeItem, envelopeContainsItemType, envelopeItemTypeToDataCategory, forEachEnvelopeItem, getSdkMetadataForEnvelopeHeader, parseEnvelope, serializeEnvelope };\n//# sourceMappingURL=envelope.js.map\n","import { createEnvelope } from './envelope.js';\nimport { dateTimestampInSeconds } from './time.js';\n\n/**\n * Creates client report envelope\n * @param discarded_events An array of discard events\n * @param dsn A DSN that can be set on the header. Optional.\n */\nfunction createClientReportEnvelope(\n  discarded_events,\n  dsn,\n  timestamp,\n) {\n  const clientReportItem = [\n    { type: 'client_report' },\n    {\n      timestamp: timestamp || dateTimestampInSeconds(),\n      discarded_events,\n    },\n  ];\n  return createEnvelope(dsn ? { dsn } : {}, [clientReportItem]);\n}\n\nexport { createClientReportEnvelope };\n//# sourceMappingURL=clientreport.js.map\n","// Intentionally keeping the key broad, as we don't know for sure what rate limit headers get returned from backend\n\nconst DEFAULT_RETRY_AFTER = 60 * 1000; // 60 seconds\n\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param header string representation of 'Retry-After' header\n * @param now current unix timestamp\n *\n */\nfunction parseRetryAfterHeader(header, now = Date.now()) {\n  const headerDelay = parseInt(`${header}`, 10);\n  if (!isNaN(headerDelay)) {\n    return headerDelay * 1000;\n  }\n\n  const headerDate = Date.parse(`${header}`);\n  if (!isNaN(headerDate)) {\n    return headerDate - now;\n  }\n\n  return DEFAULT_RETRY_AFTER;\n}\n\n/**\n * Gets the time that the given category is disabled until for rate limiting.\n * In case no category-specific limit is set but a general rate limit across all categories is active,\n * that time is returned.\n *\n * @return the time in ms that the category is disabled until or 0 if there's no active rate limit.\n */\nfunction disabledUntil(limits, dataCategory) {\n  return limits[dataCategory] || limits.all || 0;\n}\n\n/**\n * Checks if a category is rate limited\n */\nfunction isRateLimited(limits, dataCategory, now = Date.now()) {\n  return disabledUntil(limits, dataCategory) > now;\n}\n\n/**\n * Update ratelimits from incoming headers.\n *\n * @return the updated RateLimits object.\n */\nfunction updateRateLimits(\n  limits,\n  { statusCode, headers },\n  now = Date.now(),\n) {\n  const updatedRateLimits = {\n    ...limits,\n  };\n\n  // \"The name is case-insensitive.\"\n  // https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n  const rateLimitHeader = headers && headers['x-sentry-rate-limits'];\n  const retryAfterHeader = headers && headers['retry-after'];\n\n  if (rateLimitHeader) {\n    /**\n     * rate limit headers are of the form\n     *     <header>,<header>,..\n     * where each <header> is of the form\n     *     <retry_after>: <categories>: <scope>: <reason_code>: <namespaces>\n     * where\n     *     <retry_after> is a delay in seconds\n     *     <categories> is the event type(s) (error, transaction, etc) being rate limited and is of the form\n     *         <category>;<category>;...\n     *     <scope> is what's being limited (org, project, or key) - ignored by SDK\n     *     <reason_code> is an arbitrary string like \"org_quota\" - ignored by SDK\n     *     <namespaces> Semicolon-separated list of metric namespace identifiers. Defines which namespace(s) will be affected.\n     *         Only present if rate limit applies to the metric_bucket data category.\n     */\n    for (const limit of rateLimitHeader.trim().split(',')) {\n      const [retryAfter, categories, , , namespaces] = limit.split(':', 5) ;\n      const headerDelay = parseInt(retryAfter, 10);\n      const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n      if (!categories) {\n        updatedRateLimits.all = now + delay;\n      } else {\n        for (const category of categories.split(';')) {\n          if (category === 'metric_bucket') {\n            // namespaces will be present when category === 'metric_bucket'\n            if (!namespaces || namespaces.split(';').includes('custom')) {\n              updatedRateLimits[category] = now + delay;\n            }\n          } else {\n            updatedRateLimits[category] = now + delay;\n          }\n        }\n      }\n    }\n  } else if (retryAfterHeader) {\n    updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now);\n  } else if (statusCode === 429) {\n    updatedRateLimits.all = now + 60 * 1000;\n  }\n\n  return updatedRateLimits;\n}\n\nexport { DEFAULT_RETRY_AFTER, disabledUntil, isRateLimited, parseRetryAfterHeader, updateRateLimits };\n//# sourceMappingURL=ratelimit.js.map\n","import { uuid4 } from './misc.js';\n\n/**\n * Returns a new minimal propagation context\n */\nfunction generatePropagationContext() {\n  return {\n    traceId: uuid4(),\n    spanId: uuid4().substring(16),\n  };\n}\n\nexport { generatePropagationContext };\n//# sourceMappingURL=propagationContext.js.map\n","import { GLOBAL_OBJ } from '../worldwide.js';\n\n// Based on https://github.com/angular/angular.js/pull/13945/files\n// The MIT License\n\n\nconst WINDOW = GLOBAL_OBJ ;\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsHistory() {\n  // NOTE: in Chrome App environment, touching history.pushState, *even inside\n  //       a try/catch block*, will cause Chrome to output an error to console.error\n  // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n  /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const chromeVar = (WINDOW ).chrome;\n  const isChromePackagedApp = chromeVar && chromeVar.app && chromeVar.app.runtime;\n  /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n  const hasHistoryApi = 'history' in WINDOW && !!WINDOW.history.pushState && !!WINDOW.history.replaceState;\n\n  return !isChromePackagedApp && hasHistoryApi;\n}\n\nexport { supportsHistory };\n//# sourceMappingURL=supportsHistory.js.map\n","/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nconst DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);\n\nexport { DEBUG_BUILD };\n//# sourceMappingURL=debug-build.js.map\n","import { GLOBAL_OBJ, SDK_VERSION } from '@sentry/utils';\n\n/**\n * An object that contains globally accessible properties and maintains a scope stack.\n * @hidden\n */\n\n/**\n * Returns the global shim registry.\n *\n * FIXME: This function is problematic, because despite always returning a valid Carrier,\n * it has an optional `__SENTRY__` property, which then in turn requires us to always perform an unnecessary check\n * at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there.\n **/\nfunction getMainCarrier() {\n  // This ensures a Sentry carrier exists\n  getSentryCarrier(GLOBAL_OBJ);\n  return GLOBAL_OBJ;\n}\n\n/** Will either get the existing sentry carrier, or create a new one. */\nfunction getSentryCarrier(carrier) {\n  const __SENTRY__ = (carrier.__SENTRY__ = carrier.__SENTRY__ || {});\n\n  // For now: First SDK that sets the .version property wins\n  __SENTRY__.version = __SENTRY__.version || SDK_VERSION;\n\n  // Intentionally populating and returning the version of \"this\" SDK instance\n  // rather than what's set in .version so that \"this\" SDK always gets its carrier\n  return (__SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {});\n}\n\nexport { getMainCarrier, getSentryCarrier };\n//# sourceMappingURL=carrier.js.map\n","import { timestampInSeconds, uuid4, dropUndefinedKeys } from '@sentry/utils';\n\n/**\n * Creates a new `Session` object by setting certain default parameters. If optional @param context\n * is passed, the passed properties are applied to the session object.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns a new `Session` object\n */\nfunction makeSession(context) {\n  // Both timestamp and started are in seconds since the UNIX epoch.\n  const startingTime = timestampInSeconds();\n\n  const session = {\n    sid: uuid4(),\n    init: true,\n    timestamp: startingTime,\n    started: startingTime,\n    duration: 0,\n    status: 'ok',\n    errors: 0,\n    ignoreDuration: false,\n    toJSON: () => sessionToJSON(session),\n  };\n\n  if (context) {\n    updateSession(session, context);\n  }\n\n  return session;\n}\n\n/**\n * Updates a session object with the properties passed in the context.\n *\n * Note that this function mutates the passed object and returns void.\n * (Had to do this instead of returning a new and updated session because closing and sending a session\n * makes an update to the session after it was passed to the sending logic.\n * @see BaseClient.captureSession )\n *\n * @param session the `Session` to update\n * @param context the `SessionContext` holding the properties that should be updated in @param session\n */\n// eslint-disable-next-line complexity\nfunction updateSession(session, context = {}) {\n  if (context.user) {\n    if (!session.ipAddress && context.user.ip_address) {\n      session.ipAddress = context.user.ip_address;\n    }\n\n    if (!session.did && !context.did) {\n      session.did = context.user.id || context.user.email || context.user.username;\n    }\n  }\n\n  session.timestamp = context.timestamp || timestampInSeconds();\n\n  if (context.abnormal_mechanism) {\n    session.abnormal_mechanism = context.abnormal_mechanism;\n  }\n\n  if (context.ignoreDuration) {\n    session.ignoreDuration = context.ignoreDuration;\n  }\n  if (context.sid) {\n    // Good enough uuid validation. — Kamil\n    session.sid = context.sid.length === 32 ? context.sid : uuid4();\n  }\n  if (context.init !== undefined) {\n    session.init = context.init;\n  }\n  if (!session.did && context.did) {\n    session.did = `${context.did}`;\n  }\n  if (typeof context.started === 'number') {\n    session.started = context.started;\n  }\n  if (session.ignoreDuration) {\n    session.duration = undefined;\n  } else if (typeof context.duration === 'number') {\n    session.duration = context.duration;\n  } else {\n    const duration = session.timestamp - session.started;\n    session.duration = duration >= 0 ? duration : 0;\n  }\n  if (context.release) {\n    session.release = context.release;\n  }\n  if (context.environment) {\n    session.environment = context.environment;\n  }\n  if (!session.ipAddress && context.ipAddress) {\n    session.ipAddress = context.ipAddress;\n  }\n  if (!session.userAgent && context.userAgent) {\n    session.userAgent = context.userAgent;\n  }\n  if (typeof context.errors === 'number') {\n    session.errors = context.errors;\n  }\n  if (context.status) {\n    session.status = context.status;\n  }\n}\n\n/**\n * Closes a session by setting its status and updating the session object with it.\n * Internally calls `updateSession` to update the passed session object.\n *\n * Note that this function mutates the passed session (@see updateSession for explanation).\n *\n * @param session the `Session` object to be closed\n * @param status the `SessionStatus` with which the session was closed. If you don't pass a status,\n *               this function will keep the previously set status, unless it was `'ok'` in which case\n *               it is changed to `'exited'`.\n */\nfunction closeSession(session, status) {\n  let context = {};\n  if (status) {\n    context = { status };\n  } else if (session.status === 'ok') {\n    context = { status: 'exited' };\n  }\n\n  updateSession(session, context);\n}\n\n/**\n * Serializes a passed session object to a JSON object with a slightly different structure.\n * This is necessary because the Sentry backend requires a slightly different schema of a session\n * than the one the JS SDKs use internally.\n *\n * @param session the session to be converted\n *\n * @returns a JSON object of the passed session\n */\nfunction sessionToJSON(session) {\n  return dropUndefinedKeys({\n    sid: `${session.sid}`,\n    init: session.init,\n    // Make sure that sec is converted to ms for date constructor\n    started: new Date(session.started * 1000).toISOString(),\n    timestamp: new Date(session.timestamp * 1000).toISOString(),\n    status: session.status,\n    errors: session.errors,\n    did: typeof session.did === 'number' || typeof session.did === 'string' ? `${session.did}` : undefined,\n    duration: session.duration,\n    abnormal_mechanism: session.abnormal_mechanism,\n    attrs: {\n      release: session.release,\n      environment: session.environment,\n      ip_address: session.ipAddress,\n      user_agent: session.userAgent,\n    },\n  });\n}\n\nexport { closeSession, makeSession, updateSession };\n//# sourceMappingURL=session.js.map\n","import { addNonEnumerableProperty } from '@sentry/utils';\n\nconst SCOPE_SPAN_FIELD = '_sentrySpan';\n\n/**\n * Set the active span for a given scope.\n * NOTE: This should NOT be used directly, but is only used internally by the trace methods.\n */\nfunction _setSpanForScope(scope, span) {\n  if (span) {\n    addNonEnumerableProperty(scope , SCOPE_SPAN_FIELD, span);\n  } else {\n    // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n    delete (scope )[SCOPE_SPAN_FIELD];\n  }\n}\n\n/**\n * Get the active span for a given scope.\n * NOTE: This should NOT be used directly, but is only used internally by the trace methods.\n */\nfunction _getSpanForScope(scope) {\n  return scope[SCOPE_SPAN_FIELD];\n}\n\nexport { _getSpanForScope, _setSpanForScope };\n//# sourceMappingURL=spanOnScope.js.map\n","import { generatePropagationContext, isPlainObject, dateTimestampInSeconds, uuid4, logger } from '@sentry/utils';\nimport { updateSession } from './session.js';\nimport { _setSpanForScope, _getSpanForScope } from './utils/spanOnScope.js';\n\n/**\n * Default value for maximum number of breadcrumbs added to an event.\n */\nconst DEFAULT_MAX_BREADCRUMBS = 100;\n\n/**\n * Holds additional event information.\n */\nclass ScopeClass  {\n  /** Flag if notifying is happening. */\n\n  /** Callback for client to receive scope changes. */\n\n  /** Callback list that will be called during event processing. */\n\n  /** Array of breadcrumbs. */\n\n  /** User */\n\n  /** Tags */\n\n  /** Extra */\n\n  /** Contexts */\n\n  /** Attachments */\n\n  /** Propagation Context for distributed tracing */\n\n  /**\n   * A place to stash data which is needed at some point in the SDK's event processing pipeline but which shouldn't get\n   * sent to Sentry\n   */\n\n  /** Fingerprint */\n\n  /** Severity */\n\n  /**\n   * Transaction Name\n   *\n   * IMPORTANT: The transaction name on the scope has nothing to do with root spans/transaction objects.\n   * It's purpose is to assign a transaction to the scope that's added to non-transaction events.\n   */\n\n  /** Session */\n\n  /** Request Mode Session Status */\n\n  /** The client on this scope */\n\n  /** Contains the last event id of a captured event.  */\n\n  // NOTE: Any field which gets added here should get added not only to the constructor but also to the `clone` method.\n\n   constructor() {\n    this._notifyingListeners = false;\n    this._scopeListeners = [];\n    this._eventProcessors = [];\n    this._breadcrumbs = [];\n    this._attachments = [];\n    this._user = {};\n    this._tags = {};\n    this._extra = {};\n    this._contexts = {};\n    this._sdkProcessingMetadata = {};\n    this._propagationContext = generatePropagationContext();\n  }\n\n  /**\n   * @inheritDoc\n   */\n   clone() {\n    const newScope = new ScopeClass();\n    newScope._breadcrumbs = [...this._breadcrumbs];\n    newScope._tags = { ...this._tags };\n    newScope._extra = { ...this._extra };\n    newScope._contexts = { ...this._contexts };\n    newScope._user = this._user;\n    newScope._level = this._level;\n    newScope._session = this._session;\n    newScope._transactionName = this._transactionName;\n    newScope._fingerprint = this._fingerprint;\n    newScope._eventProcessors = [...this._eventProcessors];\n    newScope._requestSession = this._requestSession;\n    newScope._attachments = [...this._attachments];\n    newScope._sdkProcessingMetadata = { ...this._sdkProcessingMetadata };\n    newScope._propagationContext = { ...this._propagationContext };\n    newScope._client = this._client;\n    newScope._lastEventId = this._lastEventId;\n\n    _setSpanForScope(newScope, _getSpanForScope(this));\n\n    return newScope;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setClient(client) {\n    this._client = client;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setLastEventId(lastEventId) {\n    this._lastEventId = lastEventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   getClient() {\n    return this._client ;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   lastEventId() {\n    return this._lastEventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   addScopeListener(callback) {\n    this._scopeListeners.push(callback);\n  }\n\n  /**\n   * @inheritDoc\n   */\n   addEventProcessor(callback) {\n    this._eventProcessors.push(callback);\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setUser(user) {\n    // If null is passed we want to unset everything, but still define keys,\n    // so that later down in the pipeline any existing values are cleared.\n    this._user = user || {\n      email: undefined,\n      id: undefined,\n      ip_address: undefined,\n      username: undefined,\n    };\n\n    if (this._session) {\n      updateSession(this._session, { user });\n    }\n\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   getUser() {\n    return this._user;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   getRequestSession() {\n    return this._requestSession;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setRequestSession(requestSession) {\n    this._requestSession = requestSession;\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setTags(tags) {\n    this._tags = {\n      ...this._tags,\n      ...tags,\n    };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setTag(key, value) {\n    this._tags = { ...this._tags, [key]: value };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setExtras(extras) {\n    this._extra = {\n      ...this._extra,\n      ...extras,\n    };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setExtra(key, extra) {\n    this._extra = { ...this._extra, [key]: extra };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setFingerprint(fingerprint) {\n    this._fingerprint = fingerprint;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setLevel(level) {\n    this._level = level;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setTransactionName(name) {\n    this._transactionName = name;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setContext(key, context) {\n    if (context === null) {\n      // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n      delete this._contexts[key];\n    } else {\n      this._contexts[key] = context;\n    }\n\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setSession(session) {\n    if (!session) {\n      delete this._session;\n    } else {\n      this._session = session;\n    }\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   getSession() {\n    return this._session;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   update(captureContext) {\n    if (!captureContext) {\n      return this;\n    }\n\n    const scopeToMerge = typeof captureContext === 'function' ? captureContext(this) : captureContext;\n\n    const [scopeInstance, requestSession] =\n      scopeToMerge instanceof Scope\n        ? [scopeToMerge.getScopeData(), scopeToMerge.getRequestSession()]\n        : isPlainObject(scopeToMerge)\n          ? [captureContext , (captureContext ).requestSession]\n          : [];\n\n    const { tags, extra, user, contexts, level, fingerprint = [], propagationContext } = scopeInstance || {};\n\n    this._tags = { ...this._tags, ...tags };\n    this._extra = { ...this._extra, ...extra };\n    this._contexts = { ...this._contexts, ...contexts };\n\n    if (user && Object.keys(user).length) {\n      this._user = user;\n    }\n\n    if (level) {\n      this._level = level;\n    }\n\n    if (fingerprint.length) {\n      this._fingerprint = fingerprint;\n    }\n\n    if (propagationContext) {\n      this._propagationContext = propagationContext;\n    }\n\n    if (requestSession) {\n      this._requestSession = requestSession;\n    }\n\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   clear() {\n    // client is not cleared here on purpose!\n    this._breadcrumbs = [];\n    this._tags = {};\n    this._extra = {};\n    this._user = {};\n    this._contexts = {};\n    this._level = undefined;\n    this._transactionName = undefined;\n    this._fingerprint = undefined;\n    this._requestSession = undefined;\n    this._session = undefined;\n    _setSpanForScope(this, undefined);\n    this._attachments = [];\n    this._propagationContext = generatePropagationContext();\n\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   addBreadcrumb(breadcrumb, maxBreadcrumbs) {\n    const maxCrumbs = typeof maxBreadcrumbs === 'number' ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS;\n\n    // No data has been changed, so don't notify scope listeners\n    if (maxCrumbs <= 0) {\n      return this;\n    }\n\n    const mergedBreadcrumb = {\n      timestamp: dateTimestampInSeconds(),\n      ...breadcrumb,\n    };\n\n    const breadcrumbs = this._breadcrumbs;\n    breadcrumbs.push(mergedBreadcrumb);\n    this._breadcrumbs = breadcrumbs.length > maxCrumbs ? breadcrumbs.slice(-maxCrumbs) : breadcrumbs;\n\n    this._notifyScopeListeners();\n\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   getLastBreadcrumb() {\n    return this._breadcrumbs[this._breadcrumbs.length - 1];\n  }\n\n  /**\n   * @inheritDoc\n   */\n   clearBreadcrumbs() {\n    this._breadcrumbs = [];\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   addAttachment(attachment) {\n    this._attachments.push(attachment);\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   clearAttachments() {\n    this._attachments = [];\n    return this;\n  }\n\n  /** @inheritDoc */\n   getScopeData() {\n    return {\n      breadcrumbs: this._breadcrumbs,\n      attachments: this._attachments,\n      contexts: this._contexts,\n      tags: this._tags,\n      extra: this._extra,\n      user: this._user,\n      level: this._level,\n      fingerprint: this._fingerprint || [],\n      eventProcessors: this._eventProcessors,\n      propagationContext: this._propagationContext,\n      sdkProcessingMetadata: this._sdkProcessingMetadata,\n      transactionName: this._transactionName,\n      span: _getSpanForScope(this),\n    };\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setSDKProcessingMetadata(newData) {\n    this._sdkProcessingMetadata = { ...this._sdkProcessingMetadata, ...newData };\n\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setPropagationContext(context) {\n    this._propagationContext = context;\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   getPropagationContext() {\n    return this._propagationContext;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   captureException(exception, hint) {\n    const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n\n    if (!this._client) {\n      logger.warn('No client configured on scope - will not capture exception!');\n      return eventId;\n    }\n\n    const syntheticException = new Error('Sentry syntheticException');\n\n    this._client.captureException(\n      exception,\n      {\n        originalException: exception,\n        syntheticException,\n        ...hint,\n        event_id: eventId,\n      },\n      this,\n    );\n\n    return eventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   captureMessage(message, level, hint) {\n    const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n\n    if (!this._client) {\n      logger.warn('No client configured on scope - will not capture message!');\n      return eventId;\n    }\n\n    const syntheticException = new Error(message);\n\n    this._client.captureMessage(\n      message,\n      level,\n      {\n        originalException: message,\n        syntheticException,\n        ...hint,\n        event_id: eventId,\n      },\n      this,\n    );\n\n    return eventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   captureEvent(event, hint) {\n    const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n\n    if (!this._client) {\n      logger.warn('No client configured on scope - will not capture event!');\n      return eventId;\n    }\n\n    this._client.captureEvent(event, { ...hint, event_id: eventId }, this);\n\n    return eventId;\n  }\n\n  /**\n   * This will be called on every set call.\n   */\n   _notifyScopeListeners() {\n    // We need this check for this._notifyingListeners to be able to work on scope during updates\n    // If this check is not here we'll produce endless recursion when something is done with the scope\n    // during the callback.\n    if (!this._notifyingListeners) {\n      this._notifyingListeners = true;\n      this._scopeListeners.forEach(callback => {\n        callback(this);\n      });\n      this._notifyingListeners = false;\n    }\n  }\n}\n\n// NOTE: By exporting this here as const & type, instead of doing `export class`,\n// We can get the correct class when importing from `@sentry/core`, but the original type (from `@sentry/types`)\n// This is helpful for interop, e.g. when doing `import type { Scope } from '@sentry/node';` (which re-exports this)\n\n/**\n * Holds additional event information.\n */\nconst Scope = ScopeClass;\n\n/**\n * Holds additional event information.\n */\n\nexport { Scope };\n//# sourceMappingURL=scope.js.map\n","import { getGlobalSingleton } from '@sentry/utils';\nimport { Scope } from './scope.js';\n\n/** Get the default current scope. */\nfunction getDefaultCurrentScope() {\n  return getGlobalSingleton('defaultCurrentScope', () => new Scope());\n}\n\n/** Get the default isolation scope. */\nfunction getDefaultIsolationScope() {\n  return getGlobalSingleton('defaultIsolationScope', () => new Scope());\n}\n\nexport { getDefaultCurrentScope, getDefaultIsolationScope };\n//# sourceMappingURL=defaultScopes.js.map\n","import { isThenable } from '@sentry/utils';\nimport { getDefaultCurrentScope, getDefaultIsolationScope } from '../defaultScopes.js';\nimport { Scope } from '../scope.js';\nimport { getMainCarrier, getSentryCarrier } from '../carrier.js';\n\n/**\n * This is an object that holds a stack of scopes.\n */\nclass AsyncContextStack {\n\n   constructor(scope, isolationScope) {\n    let assignedScope;\n    if (!scope) {\n      assignedScope = new Scope();\n    } else {\n      assignedScope = scope;\n    }\n\n    let assignedIsolationScope;\n    if (!isolationScope) {\n      assignedIsolationScope = new Scope();\n    } else {\n      assignedIsolationScope = isolationScope;\n    }\n\n    // scope stack for domains or the process\n    this._stack = [{ scope: assignedScope }];\n    this._isolationScope = assignedIsolationScope;\n  }\n\n  /**\n   * Fork a scope for the stack.\n   */\n   withScope(callback) {\n    const scope = this._pushScope();\n\n    let maybePromiseResult;\n    try {\n      maybePromiseResult = callback(scope);\n    } catch (e) {\n      this._popScope();\n      throw e;\n    }\n\n    if (isThenable(maybePromiseResult)) {\n      // @ts-expect-error - isThenable returns the wrong type\n      return maybePromiseResult.then(\n        res => {\n          this._popScope();\n          return res;\n        },\n        e => {\n          this._popScope();\n          throw e;\n        },\n      );\n    }\n\n    this._popScope();\n    return maybePromiseResult;\n  }\n\n  /**\n   * Get the client of the stack.\n   */\n   getClient() {\n    return this.getStackTop().client ;\n  }\n\n  /**\n   * Returns the scope of the top stack.\n   */\n   getScope() {\n    return this.getStackTop().scope;\n  }\n\n  /**\n   * Get the isolation scope for the stack.\n   */\n   getIsolationScope() {\n    return this._isolationScope;\n  }\n\n  /**\n   * Returns the topmost scope layer in the order domain > local > process.\n   */\n   getStackTop() {\n    return this._stack[this._stack.length - 1] ;\n  }\n\n  /**\n   * Push a scope to the stack.\n   */\n   _pushScope() {\n    // We want to clone the content of prev scope\n    const scope = this.getScope().clone();\n    this._stack.push({\n      client: this.getClient(),\n      scope,\n    });\n    return scope;\n  }\n\n  /**\n   * Pop a scope from the stack.\n   */\n   _popScope() {\n    if (this._stack.length <= 1) return false;\n    return !!this._stack.pop();\n  }\n}\n\n/**\n * Get the global async context stack.\n * This will be removed during the v8 cycle and is only here to make migration easier.\n */\nfunction getAsyncContextStack() {\n  const registry = getMainCarrier();\n  const sentry = getSentryCarrier(registry);\n\n  return (sentry.stack = sentry.stack || new AsyncContextStack(getDefaultCurrentScope(), getDefaultIsolationScope()));\n}\n\nfunction withScope(callback) {\n  return getAsyncContextStack().withScope(callback);\n}\n\nfunction withSetScope(scope, callback) {\n  const stack = getAsyncContextStack() ;\n  return stack.withScope(() => {\n    stack.getStackTop().scope = scope;\n    return callback(scope);\n  });\n}\n\nfunction withIsolationScope(callback) {\n  return getAsyncContextStack().withScope(() => {\n    return callback(getAsyncContextStack().getIsolationScope());\n  });\n}\n\n/**\n * Get the stack-based async context strategy.\n */\nfunction getStackAsyncContextStrategy() {\n  return {\n    withIsolationScope,\n    withScope,\n    withSetScope,\n    withSetIsolationScope: (_isolationScope, callback) => {\n      return withIsolationScope(callback);\n    },\n    getCurrentScope: () => getAsyncContextStack().getScope(),\n    getIsolationScope: () => getAsyncContextStack().getIsolationScope(),\n  };\n}\n\nexport { AsyncContextStack, getStackAsyncContextStrategy };\n//# sourceMappingURL=stackStrategy.js.map\n","import { getMainCarrier, getSentryCarrier } from '../carrier.js';\nimport { getStackAsyncContextStrategy } from './stackStrategy.js';\n\n/**\n * @private Private API with no semver guarantees!\n *\n * Sets the global async context strategy\n */\nfunction setAsyncContextStrategy(strategy) {\n  // Get main carrier (global for every environment)\n  const registry = getMainCarrier();\n  const sentry = getSentryCarrier(registry);\n  sentry.acs = strategy;\n}\n\n/**\n * Get the current async context strategy.\n * If none has been setup, the default will be used.\n */\nfunction getAsyncContextStrategy(carrier) {\n  const sentry = getSentryCarrier(carrier);\n\n  if (sentry.acs) {\n    return sentry.acs;\n  }\n\n  // Otherwise, use the default one (stack)\n  return getStackAsyncContextStrategy();\n}\n\nexport { getAsyncContextStrategy, setAsyncContextStrategy };\n//# sourceMappingURL=index.js.map\n","import { getGlobalSingleton } from '@sentry/utils';\nimport { getAsyncContextStrategy } from './asyncContext/index.js';\nimport { getMainCarrier } from './carrier.js';\nimport { Scope } from './scope.js';\n\n/**\n * Get the currently active scope.\n */\nfunction getCurrentScope() {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n  return acs.getCurrentScope();\n}\n\n/**\n * Get the currently active isolation scope.\n * The isolation scope is active for the current exection context.\n */\nfunction getIsolationScope() {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n  return acs.getIsolationScope();\n}\n\n/**\n * Get the global scope.\n * This scope is applied to _all_ events.\n */\nfunction getGlobalScope() {\n  return getGlobalSingleton('globalScope', () => new Scope());\n}\n\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n */\n\n/**\n * Either creates a new active scope, or sets the given scope as active scope in the given callback.\n */\nfunction withScope(\n  ...rest\n) {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n\n  // If a scope is defined, we want to make this the active scope instead of the default one\n  if (rest.length === 2) {\n    const [scope, callback] = rest;\n\n    if (!scope) {\n      return acs.withScope(callback);\n    }\n\n    return acs.withSetScope(scope, callback);\n  }\n\n  return acs.withScope(rest[0]);\n}\n\n/**\n * Attempts to fork the current isolation scope and the current scope based on the current async context strategy. If no\n * async context strategy is set, the isolation scope and the current scope will not be forked (this is currently the\n * case, for example, in the browser).\n *\n * Usage of this function in environments without async context strategy is discouraged and may lead to unexpected behaviour.\n *\n * This function is intended for Sentry SDK and SDK integration development. It is not recommended to be used in \"normal\"\n * applications directly because it comes with pitfalls. Use at your own risk!\n */\n\n/**\n * Either creates a new active isolation scope, or sets the given isolation scope as active scope in the given callback.\n */\nfunction withIsolationScope(\n  ...rest\n\n) {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n\n  // If a scope is defined, we want to make this the active scope instead of the default one\n  if (rest.length === 2) {\n    const [isolationScope, callback] = rest;\n\n    if (!isolationScope) {\n      return acs.withIsolationScope(callback);\n    }\n\n    return acs.withSetIsolationScope(isolationScope, callback);\n  }\n\n  return acs.withIsolationScope(rest[0]);\n}\n\n/**\n * Get the currently active client.\n */\nfunction getClient() {\n  return getCurrentScope().getClient();\n}\n\nexport { getClient, getCurrentScope, getGlobalScope, getIsolationScope, withIsolationScope, withScope };\n//# sourceMappingURL=currentScopes.js.map\n","import { dropUndefinedKeys } from '@sentry/utils';\n\n/**\n * key: bucketKey\n * value: [exportKey, MetricSummary]\n */\n\nconst METRICS_SPAN_FIELD = '_sentryMetrics';\n\n/**\n * Fetches the metric summary if it exists for the passed span\n */\nfunction getMetricSummaryJsonForSpan(span) {\n  const storage = (span )[METRICS_SPAN_FIELD];\n\n  if (!storage) {\n    return undefined;\n  }\n  const output = {};\n\n  for (const [, [exportKey, summary]] of storage) {\n    const arr = output[exportKey] || (output[exportKey] = []);\n    arr.push(dropUndefinedKeys(summary));\n  }\n\n  return output;\n}\n\n/**\n * Updates the metric summary on a span.\n */\nfunction updateMetricSummaryOnSpan(\n  span,\n  metricType,\n  sanitizedName,\n  value,\n  unit,\n  tags,\n  bucketKey,\n) {\n  const existingStorage = (span )[METRICS_SPAN_FIELD];\n  const storage =\n    existingStorage ||\n    ((span )[METRICS_SPAN_FIELD] = new Map());\n\n  const exportKey = `${metricType}:${sanitizedName}@${unit}`;\n  const bucketItem = storage.get(bucketKey);\n\n  if (bucketItem) {\n    const [, summary] = bucketItem;\n    storage.set(bucketKey, [\n      exportKey,\n      {\n        min: Math.min(summary.min, value),\n        max: Math.max(summary.max, value),\n        count: (summary.count += 1),\n        sum: (summary.sum += value),\n        tags: summary.tags,\n      },\n    ]);\n  } else {\n    storage.set(bucketKey, [\n      exportKey,\n      {\n        min: value,\n        max: value,\n        count: 1,\n        sum: value,\n        tags,\n      },\n    ]);\n  }\n}\n\nexport { getMetricSummaryJsonForSpan, updateMetricSummaryOnSpan };\n//# sourceMappingURL=metric-summary.js.map\n","/**\n * Use this attribute to represent the source of a span.\n * Should be one of: custom, url, route, view, component, task, unknown\n *\n */\nconst SEMANTIC_ATTRIBUTE_SENTRY_SOURCE = 'sentry.source';\n\n/**\n * Use this attribute to represent the sample rate used for a span.\n */\nconst SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE = 'sentry.sample_rate';\n\n/**\n * Use this attribute to represent the operation of a span.\n */\nconst SEMANTIC_ATTRIBUTE_SENTRY_OP = 'sentry.op';\n\n/**\n * Use this attribute to represent the origin of a span.\n */\nconst SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN = 'sentry.origin';\n\n/** The reason why an idle span finished. */\nconst SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON = 'sentry.idle_span_finish_reason';\n\n/** The unit of a measurement, which may be stored as a TimedEvent. */\nconst SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT = 'sentry.measurement_unit';\n\n/** The value of a measurement, which may be stored as a TimedEvent. */\nconst SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE = 'sentry.measurement_value';\n\n/**\n * The id of the profile that this span occured in.\n */\nconst SEMANTIC_ATTRIBUTE_PROFILE_ID = 'sentry.profile_id';\n\nconst SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME = 'sentry.exclusive_time';\n\nconst SEMANTIC_ATTRIBUTE_CACHE_HIT = 'cache.hit';\n\nconst SEMANTIC_ATTRIBUTE_CACHE_KEY = 'cache.key';\n\nconst SEMANTIC_ATTRIBUTE_CACHE_ITEM_SIZE = 'cache.item_size';\n\n/** TODO: Remove these once we update to latest semantic conventions */\nconst SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD = 'http.request.method';\nconst SEMANTIC_ATTRIBUTE_URL_FULL = 'url.full';\n\nexport { SEMANTIC_ATTRIBUTE_CACHE_HIT, SEMANTIC_ATTRIBUTE_CACHE_ITEM_SIZE, SEMANTIC_ATTRIBUTE_CACHE_KEY, SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME, SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD, SEMANTIC_ATTRIBUTE_PROFILE_ID, SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT, SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_URL_FULL };\n//# sourceMappingURL=semanticAttributes.js.map\n","const SPAN_STATUS_UNSET = 0;\nconst SPAN_STATUS_OK = 1;\nconst SPAN_STATUS_ERROR = 2;\n\n/**\n * Converts a HTTP status code into a sentry status with a message.\n *\n * @param httpStatus The HTTP response status code.\n * @returns The span status or unknown_error.\n */\n// https://develop.sentry.dev/sdk/event-payloads/span/\nfunction getSpanStatusFromHttpCode(httpStatus) {\n  if (httpStatus < 400 && httpStatus >= 100) {\n    return { code: SPAN_STATUS_OK };\n  }\n\n  if (httpStatus >= 400 && httpStatus < 500) {\n    switch (httpStatus) {\n      case 401:\n        return { code: SPAN_STATUS_ERROR, message: 'unauthenticated' };\n      case 403:\n        return { code: SPAN_STATUS_ERROR, message: 'permission_denied' };\n      case 404:\n        return { code: SPAN_STATUS_ERROR, message: 'not_found' };\n      case 409:\n        return { code: SPAN_STATUS_ERROR, message: 'already_exists' };\n      case 413:\n        return { code: SPAN_STATUS_ERROR, message: 'failed_precondition' };\n      case 429:\n        return { code: SPAN_STATUS_ERROR, message: 'resource_exhausted' };\n      case 499:\n        return { code: SPAN_STATUS_ERROR, message: 'cancelled' };\n      default:\n        return { code: SPAN_STATUS_ERROR, message: 'invalid_argument' };\n    }\n  }\n\n  if (httpStatus >= 500 && httpStatus < 600) {\n    switch (httpStatus) {\n      case 501:\n        return { code: SPAN_STATUS_ERROR, message: 'unimplemented' };\n      case 503:\n        return { code: SPAN_STATUS_ERROR, message: 'unavailable' };\n      case 504:\n        return { code: SPAN_STATUS_ERROR, message: 'deadline_exceeded' };\n      default:\n        return { code: SPAN_STATUS_ERROR, message: 'internal_error' };\n    }\n  }\n\n  return { code: SPAN_STATUS_ERROR, message: 'unknown_error' };\n}\n\n/**\n * Sets the Http status attributes on the current span based on the http code.\n * Additionally, the span's status is updated, depending on the http code.\n */\nfunction setHttpStatus(span, httpStatus) {\n  span.setAttribute('http.response.status_code', httpStatus);\n\n  const spanStatus = getSpanStatusFromHttpCode(httpStatus);\n  if (spanStatus.message !== 'unknown_error') {\n    span.setStatus(spanStatus);\n  }\n}\n\nexport { SPAN_STATUS_ERROR, SPAN_STATUS_OK, SPAN_STATUS_UNSET, getSpanStatusFromHttpCode, setHttpStatus };\n//# sourceMappingURL=spanstatus.js.map\n","import { dropUndefinedKeys, generateSentryTraceHeader, timestampInSeconds, addNonEnumerableProperty } from '@sentry/utils';\nimport { getAsyncContextStrategy } from '../asyncContext/index.js';\nimport { getMainCarrier } from '../carrier.js';\nimport { getCurrentScope } from '../currentScopes.js';\nimport { getMetricSummaryJsonForSpan, updateMetricSummaryOnSpan } from '../metrics/metric-summary.js';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes.js';\nimport { SPAN_STATUS_UNSET, SPAN_STATUS_OK } from '../tracing/spanstatus.js';\nimport { _getSpanForScope } from './spanOnScope.js';\n\n// These are aligned with OpenTelemetry trace flags\nconst TRACE_FLAG_NONE = 0x0;\nconst TRACE_FLAG_SAMPLED = 0x1;\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in an event.\n * By default, this will only include trace_id, span_id & parent_span_id.\n * If `includeAllData` is true, it will also include data, op, status & origin.\n */\nfunction spanToTransactionTraceContext(span) {\n  const { spanId: span_id, traceId: trace_id } = span.spanContext();\n  const { data, op, parent_span_id, status, origin } = spanToJSON(span);\n\n  return dropUndefinedKeys({\n    parent_span_id,\n    span_id,\n    trace_id,\n    data,\n    op,\n    status,\n    origin,\n  });\n}\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in a non-transaction event.\n */\nfunction spanToTraceContext(span) {\n  const { spanId: span_id, traceId: trace_id } = span.spanContext();\n  const { parent_span_id } = spanToJSON(span);\n\n  return dropUndefinedKeys({ parent_span_id, span_id, trace_id });\n}\n\n/**\n * Convert a Span to a Sentry trace header.\n */\nfunction spanToTraceHeader(span) {\n  const { traceId, spanId } = span.spanContext();\n  const sampled = spanIsSampled(span);\n  return generateSentryTraceHeader(traceId, spanId, sampled);\n}\n\n/**\n * Convert a span time input into a timestamp in seconds.\n */\nfunction spanTimeInputToSeconds(input) {\n  if (typeof input === 'number') {\n    return ensureTimestampInSeconds(input);\n  }\n\n  if (Array.isArray(input)) {\n    // See {@link HrTime} for the array-based time format\n    return input[0] + input[1] / 1e9;\n  }\n\n  if (input instanceof Date) {\n    return ensureTimestampInSeconds(input.getTime());\n  }\n\n  return timestampInSeconds();\n}\n\n/**\n * Converts a timestamp to second, if it was in milliseconds, or keeps it as second.\n */\nfunction ensureTimestampInSeconds(timestamp) {\n  const isMs = timestamp > 9999999999;\n  return isMs ? timestamp / 1000 : timestamp;\n}\n\n/**\n * Convert a span to a JSON representation.\n */\n// Note: Because of this, we currently have a circular type dependency (which we opted out of in package.json).\n// This is not avoidable as we need `spanToJSON` in `spanUtils.ts`, which in turn is needed by `span.ts` for backwards compatibility.\n// And `spanToJSON` needs the Span class from `span.ts` to check here.\nfunction spanToJSON(span) {\n  if (spanIsSentrySpan(span)) {\n    return span.getSpanJSON();\n  }\n\n  try {\n    const { spanId: span_id, traceId: trace_id } = span.spanContext();\n\n    // Handle a span from @opentelemetry/sdk-base-trace's `Span` class\n    if (spanIsOpenTelemetrySdkTraceBaseSpan(span)) {\n      const { attributes, startTime, name, endTime, parentSpanId, status } = span;\n\n      return dropUndefinedKeys({\n        span_id,\n        trace_id,\n        data: attributes,\n        description: name,\n        parent_span_id: parentSpanId,\n        start_timestamp: spanTimeInputToSeconds(startTime),\n        // This is [0,0] by default in OTEL, in which case we want to interpret this as no end time\n        timestamp: spanTimeInputToSeconds(endTime) || undefined,\n        status: getStatusMessage(status),\n        op: attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n        origin: attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] ,\n        _metrics_summary: getMetricSummaryJsonForSpan(span),\n      });\n    }\n\n    // Finally, at least we have `spanContext()`....\n    return {\n      span_id,\n      trace_id,\n    };\n  } catch (e) {\n    return {};\n  }\n}\n\nfunction spanIsOpenTelemetrySdkTraceBaseSpan(span) {\n  const castSpan = span ;\n  return !!castSpan.attributes && !!castSpan.startTime && !!castSpan.name && !!castSpan.endTime && !!castSpan.status;\n}\n\n/** Exported only for tests. */\n\n/**\n * Sadly, due to circular dependency checks we cannot actually import the Span class here and check for instanceof.\n * :( So instead we approximate this by checking if it has the `getSpanJSON` method.\n */\nfunction spanIsSentrySpan(span) {\n  return typeof (span ).getSpanJSON === 'function';\n}\n\n/**\n * Returns true if a span is sampled.\n * In most cases, you should just use `span.isRecording()` instead.\n * However, this has a slightly different semantic, as it also returns false if the span is finished.\n * So in the case where this distinction is important, use this method.\n */\nfunction spanIsSampled(span) {\n  // We align our trace flags with the ones OpenTelemetry use\n  // So we also check for sampled the same way they do.\n  const { traceFlags } = span.spanContext();\n  return traceFlags === TRACE_FLAG_SAMPLED;\n}\n\n/** Get the status message to use for a JSON representation of a span. */\nfunction getStatusMessage(status) {\n  if (!status || status.code === SPAN_STATUS_UNSET) {\n    return undefined;\n  }\n\n  if (status.code === SPAN_STATUS_OK) {\n    return 'ok';\n  }\n\n  return status.message || 'unknown_error';\n}\n\nconst CHILD_SPANS_FIELD = '_sentryChildSpans';\nconst ROOT_SPAN_FIELD = '_sentryRootSpan';\n\n/**\n * Adds an opaque child span reference to a span.\n */\nfunction addChildSpanToSpan(span, childSpan) {\n  // We store the root span reference on the child span\n  // We need this for `getRootSpan()` to work\n  const rootSpan = span[ROOT_SPAN_FIELD] || span;\n  addNonEnumerableProperty(childSpan , ROOT_SPAN_FIELD, rootSpan);\n\n  // We store a list of child spans on the parent span\n  // We need this for `getSpanDescendants()` to work\n  if (span[CHILD_SPANS_FIELD]) {\n    span[CHILD_SPANS_FIELD].add(childSpan);\n  } else {\n    addNonEnumerableProperty(span, CHILD_SPANS_FIELD, new Set([childSpan]));\n  }\n}\n\n/** This is only used internally by Idle Spans. */\nfunction removeChildSpanFromSpan(span, childSpan) {\n  if (span[CHILD_SPANS_FIELD]) {\n    span[CHILD_SPANS_FIELD].delete(childSpan);\n  }\n}\n\n/**\n * Returns an array of the given span and all of its descendants.\n */\nfunction getSpanDescendants(span) {\n  const resultSet = new Set();\n\n  function addSpanChildren(span) {\n    // This exit condition is required to not infinitely loop in case of a circular dependency.\n    if (resultSet.has(span)) {\n      return;\n      // We want to ignore unsampled spans (e.g. non recording spans)\n    } else if (spanIsSampled(span)) {\n      resultSet.add(span);\n      const childSpans = span[CHILD_SPANS_FIELD] ? Array.from(span[CHILD_SPANS_FIELD]) : [];\n      for (const childSpan of childSpans) {\n        addSpanChildren(childSpan);\n      }\n    }\n  }\n\n  addSpanChildren(span);\n\n  return Array.from(resultSet);\n}\n\n/**\n * Returns the root span of a given span.\n */\nfunction getRootSpan(span) {\n  return span[ROOT_SPAN_FIELD] || span;\n}\n\n/**\n * Returns the currently active span.\n */\nfunction getActiveSpan() {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n  if (acs.getActiveSpan) {\n    return acs.getActiveSpan();\n  }\n\n  return _getSpanForScope(getCurrentScope());\n}\n\n/**\n * Updates the metric summary on the currently active span\n */\nfunction updateMetricSummaryOnActiveSpan(\n  metricType,\n  sanitizedName,\n  value,\n  unit,\n  tags,\n  bucketKey,\n) {\n  const span = getActiveSpan();\n  if (span) {\n    updateMetricSummaryOnSpan(span, metricType, sanitizedName, value, unit, tags, bucketKey);\n  }\n}\n\nexport { TRACE_FLAG_NONE, TRACE_FLAG_SAMPLED, addChildSpanToSpan, getActiveSpan, getRootSpan, getSpanDescendants, getStatusMessage, removeChildSpanFromSpan, spanIsSampled, spanTimeInputToSeconds, spanToJSON, spanToTraceContext, spanToTraceHeader, spanToTransactionTraceContext, updateMetricSummaryOnActiveSpan };\n//# sourceMappingURL=spanUtils.js.map\n","import { addNonEnumerableProperty } from '@sentry/utils';\nexport { stripUrlQueryAndFragment } from '@sentry/utils';\n\nconst SCOPE_ON_START_SPAN_FIELD = '_sentryScope';\nconst ISOLATION_SCOPE_ON_START_SPAN_FIELD = '_sentryIsolationScope';\n\n/** Store the scope & isolation scope for a span, which can the be used when it is finished. */\nfunction setCapturedScopesOnSpan(span, scope, isolationScope) {\n  if (span) {\n    addNonEnumerableProperty(span, ISOLATION_SCOPE_ON_START_SPAN_FIELD, isolationScope);\n    addNonEnumerableProperty(span, SCOPE_ON_START_SPAN_FIELD, scope);\n  }\n}\n\n/**\n * Grabs the scope and isolation scope off a span that were active when the span was started.\n */\nfunction getCapturedScopesOnSpan(span) {\n  return {\n    scope: (span )[SCOPE_ON_START_SPAN_FIELD],\n    isolationScope: (span )[ISOLATION_SCOPE_ON_START_SPAN_FIELD],\n  };\n}\n\nexport { getCapturedScopesOnSpan, setCapturedScopesOnSpan };\n//# sourceMappingURL=utils.js.map\n","import { getClient } from '../currentScopes.js';\n\n// Treeshakable guard to remove all code related to tracing\n\n/**\n * Determines if tracing is currently enabled.\n *\n * Tracing is enabled when at least one of `tracesSampleRate` and `tracesSampler` is defined in the SDK config.\n */\nfunction hasTracingEnabled(\n  maybeOptions,\n) {\n  if (typeof __SENTRY_TRACING__ === 'boolean' && !__SENTRY_TRACING__) {\n    return false;\n  }\n\n  const client = getClient();\n  const options = maybeOptions || (client && client.getOptions());\n  // eslint-disable-next-line deprecation/deprecation\n  return !!options && (options.enableTracing || 'tracesSampleRate' in options || 'tracesSampler' in options);\n}\n\nexport { hasTracingEnabled };\n//# sourceMappingURL=hasTracingEnabled.js.map\n","import { uuid4 } from '@sentry/utils';\nimport { TRACE_FLAG_NONE } from '../utils/spanUtils.js';\n\n/**\n * A Sentry Span that is non-recording, meaning it will not be sent to Sentry.\n */\nclass SentryNonRecordingSpan  {\n\n   constructor(spanContext = {}) {\n    this._traceId = spanContext.traceId || uuid4();\n    this._spanId = spanContext.spanId || uuid4().substring(16);\n  }\n\n  /** @inheritdoc */\n   spanContext() {\n    return {\n      spanId: this._spanId,\n      traceId: this._traceId,\n      traceFlags: TRACE_FLAG_NONE,\n    };\n  }\n\n  /** @inheritdoc */\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n   end(_timestamp) {}\n\n  /** @inheritdoc */\n   setAttribute(_key, _value) {\n    return this;\n  }\n\n  /** @inheritdoc */\n   setAttributes(_values) {\n    return this;\n  }\n\n  /** @inheritdoc */\n   setStatus(_status) {\n    return this;\n  }\n\n  /** @inheritdoc */\n   updateName(_name) {\n    return this;\n  }\n\n  /** @inheritdoc */\n   isRecording() {\n    return false;\n  }\n\n  /** @inheritdoc */\n   addEvent(\n    _name,\n    _attributesOrStartTime,\n    _startTime,\n  ) {\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but we need it for being comliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n   addLink(_link) {\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but we need it for being comliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n   addLinks(_links) {\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but we need it for being comliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n   recordException(_exception, _time) {\n    // noop\n  }\n}\n\nexport { SentryNonRecordingSpan };\n//# sourceMappingURL=sentryNonRecordingSpan.js.map\n","const DEFAULT_ENVIRONMENT = 'production';\n\nexport { DEFAULT_ENVIRONMENT };\n//# sourceMappingURL=constants.js.map\n","import { dropUndefinedKeys, baggageHeaderToDynamicSamplingContext, dynamicSamplingContextToSentryBaggageHeader, addNonEnumerableProperty } from '@sentry/utils';\nimport { DEFAULT_ENVIRONMENT } from '../constants.js';\nimport { getClient } from '../currentScopes.js';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '../semanticAttributes.js';\nimport { hasTracingEnabled } from '../utils/hasTracingEnabled.js';\nimport { spanToJSON, getRootSpan, spanIsSampled } from '../utils/spanUtils.js';\n\n/**\n * If you change this value, also update the terser plugin config to\n * avoid minification of the object property!\n */\nconst FROZEN_DSC_FIELD = '_frozenDsc';\n\n/**\n * Freeze the given DSC on the given span.\n */\nfunction freezeDscOnSpan(span, dsc) {\n  const spanWithMaybeDsc = span ;\n  addNonEnumerableProperty(spanWithMaybeDsc, FROZEN_DSC_FIELD, dsc);\n}\n\n/**\n * Creates a dynamic sampling context from a client.\n *\n * Dispatches the `createDsc` lifecycle hook as a side effect.\n */\nfunction getDynamicSamplingContextFromClient(trace_id, client) {\n  const options = client.getOptions();\n\n  const { publicKey: public_key } = client.getDsn() || {};\n\n  const dsc = dropUndefinedKeys({\n    environment: options.environment || DEFAULT_ENVIRONMENT,\n    release: options.release,\n    public_key,\n    trace_id,\n  }) ;\n\n  client.emit('createDsc', dsc);\n\n  return dsc;\n}\n\n/**\n * Creates a dynamic sampling context from a span (and client and scope)\n *\n * @param span the span from which a few values like the root span name and sample rate are extracted.\n *\n * @returns a dynamic sampling context\n */\nfunction getDynamicSamplingContextFromSpan(span) {\n  const client = getClient();\n  if (!client) {\n    return {};\n  }\n\n  const dsc = getDynamicSamplingContextFromClient(spanToJSON(span).trace_id || '', client);\n\n  const rootSpan = getRootSpan(span);\n\n  // For core implementation, we freeze the DSC onto the span as a non-enumerable property\n  const frozenDsc = (rootSpan )[FROZEN_DSC_FIELD];\n  if (frozenDsc) {\n    return frozenDsc;\n  }\n\n  // For OpenTelemetry, we freeze the DSC on the trace state\n  const traceState = rootSpan.spanContext().traceState;\n  const traceStateDsc = traceState && traceState.get('sentry.dsc');\n\n  // If the span has a DSC, we want it to take precedence\n  const dscOnTraceState = traceStateDsc && baggageHeaderToDynamicSamplingContext(traceStateDsc);\n\n  if (dscOnTraceState) {\n    return dscOnTraceState;\n  }\n\n  // Else, we generate it from the span\n  const jsonSpan = spanToJSON(rootSpan);\n  const attributes = jsonSpan.data || {};\n  const maybeSampleRate = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE];\n\n  if (maybeSampleRate != null) {\n    dsc.sample_rate = `${maybeSampleRate}`;\n  }\n\n  // We don't want to have a transaction name in the DSC if the source is \"url\" because URLs might contain PII\n  const source = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n  // after JSON conversion, txn.name becomes jsonSpan.description\n  const name = jsonSpan.description;\n  if (source !== 'url' && name) {\n    dsc.transaction = name;\n  }\n\n  // How can we even land here with hasTracingEnabled() returning false?\n  // Otel creates a Non-recording span in Tracing Without Performance mode when handling incoming requests\n  // So we end up with an active span that is not sampled (neither positively nor negatively)\n  if (hasTracingEnabled()) {\n    dsc.sampled = String(spanIsSampled(rootSpan));\n  }\n\n  client.emit('createDsc', dsc, rootSpan);\n\n  return dsc;\n}\n\n/**\n * Convert a Span to a baggage header.\n */\nfunction spanToBaggageHeader(span) {\n  const dsc = getDynamicSamplingContextFromSpan(span);\n  return dynamicSamplingContextToSentryBaggageHeader(dsc);\n}\n\nexport { freezeDscOnSpan, getDynamicSamplingContextFromClient, getDynamicSamplingContextFromSpan, spanToBaggageHeader };\n//# sourceMappingURL=dynamicSamplingContext.js.map\n","import { logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { spanToJSON, spanIsSampled, getRootSpan } from '../utils/spanUtils.js';\n\n/**\n * Print a log message for a started span.\n */\nfunction logSpanStart(span) {\n  if (!DEBUG_BUILD) return;\n\n  const { description = '< unknown name >', op = '< unknown op >', parent_span_id: parentSpanId } = spanToJSON(span);\n  const { spanId } = span.spanContext();\n\n  const sampled = spanIsSampled(span);\n  const rootSpan = getRootSpan(span);\n  const isRootSpan = rootSpan === span;\n\n  const header = `[Tracing] Starting ${sampled ? 'sampled' : 'unsampled'} ${isRootSpan ? 'root ' : ''}span`;\n\n  const infoParts = [`op: ${op}`, `name: ${description}`, `ID: ${spanId}`];\n\n  if (parentSpanId) {\n    infoParts.push(`parent ID: ${parentSpanId}`);\n  }\n\n  if (!isRootSpan) {\n    const { op, description } = spanToJSON(rootSpan);\n    infoParts.push(`root ID: ${rootSpan.spanContext().spanId}`);\n    if (op) {\n      infoParts.push(`root op: ${op}`);\n    }\n    if (description) {\n      infoParts.push(`root description: ${description}`);\n    }\n  }\n\n  logger.log(`${header}\n  ${infoParts.join('\\n  ')}`);\n}\n\n/**\n * Print a log message for an ended span.\n */\nfunction logSpanEnd(span) {\n  if (!DEBUG_BUILD) return;\n\n  const { description = '< unknown name >', op = '< unknown op >' } = spanToJSON(span);\n  const { spanId } = span.spanContext();\n  const rootSpan = getRootSpan(span);\n  const isRootSpan = rootSpan === span;\n\n  const msg = `[Tracing] Finishing \"${op}\" ${isRootSpan ? 'root ' : ''}span \"${description}\" with ID ${spanId}`;\n  logger.log(msg);\n}\n\nexport { logSpanEnd, logSpanStart };\n//# sourceMappingURL=logSpans.js.map\n","import { logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\n\n/**\n * Parse a sample rate from a given value.\n * This will either return a boolean or number sample rate, if the sample rate is valid (between 0 and 1).\n * If a string is passed, we try to convert it to a number.\n *\n * Any invalid sample rate will return `undefined`.\n */\nfunction parseSampleRate(sampleRate) {\n  if (typeof sampleRate === 'boolean') {\n    return Number(sampleRate);\n  }\n\n  const rate = typeof sampleRate === 'string' ? parseFloat(sampleRate) : sampleRate;\n  if (typeof rate !== 'number' || isNaN(rate) || rate < 0 || rate > 1) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `[Tracing] Given sample rate is invalid. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify(\n          sampleRate,\n        )} of type ${JSON.stringify(typeof sampleRate)}.`,\n      );\n    return undefined;\n  }\n\n  return rate;\n}\n\nexport { parseSampleRate };\n//# sourceMappingURL=parseSampleRate.js.map\n","import { logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { hasTracingEnabled } from '../utils/hasTracingEnabled.js';\nimport { parseSampleRate } from '../utils/parseSampleRate.js';\n\n/**\n * Makes a sampling decision for the given options.\n *\n * Called every time a root span is created. Only root spans which emerge with a `sampled` value of `true` will be\n * sent to Sentry.\n */\nfunction sampleSpan(\n  options,\n  samplingContext,\n) {\n  // nothing to do if tracing is not enabled\n  if (!hasTracingEnabled(options)) {\n    return [false];\n  }\n\n  // we would have bailed already if neither `tracesSampler` nor `tracesSampleRate` nor `enableTracing` were defined, so one of these should\n  // work; prefer the hook if so\n  let sampleRate;\n  if (typeof options.tracesSampler === 'function') {\n    sampleRate = options.tracesSampler(samplingContext);\n  } else if (samplingContext.parentSampled !== undefined) {\n    sampleRate = samplingContext.parentSampled;\n  } else if (typeof options.tracesSampleRate !== 'undefined') {\n    sampleRate = options.tracesSampleRate;\n  } else {\n    // When `enableTracing === true`, we use a sample rate of 100%\n    sampleRate = 1;\n  }\n\n  // Since this is coming from the user (or from a function provided by the user), who knows what we might get.\n  // (The only valid values are booleans or numbers between 0 and 1.)\n  const parsedSampleRate = parseSampleRate(sampleRate);\n\n  if (parsedSampleRate === undefined) {\n    DEBUG_BUILD && logger.warn('[Tracing] Discarding transaction because of invalid sample rate.');\n    return [false];\n  }\n\n  // if the function returned 0 (or false), or if `tracesSampleRate` is 0, it's a sign the transaction should be dropped\n  if (!parsedSampleRate) {\n    DEBUG_BUILD &&\n      logger.log(\n        `[Tracing] Discarding transaction because ${\n          typeof options.tracesSampler === 'function'\n            ? 'tracesSampler returned 0 or false'\n            : 'a negative sampling decision was inherited or tracesSampleRate is set to 0'\n        }`,\n      );\n    return [false, parsedSampleRate];\n  }\n\n  // Now we roll the dice. Math.random is inclusive of 0, but not of 1, so strict < is safe here. In case sampleRate is\n  // a boolean, the < comparison will cause it to be automatically cast to 1 if it's true and 0 if it's false.\n  const shouldSample = Math.random() < parsedSampleRate;\n\n  // if we're not going to keep it, we're done\n  if (!shouldSample) {\n    DEBUG_BUILD &&\n      logger.log(\n        `[Tracing] Discarding transaction because it's not included in the random sample (sampling rate = ${Number(\n          sampleRate,\n        )})`,\n      );\n    return [false, parsedSampleRate];\n  }\n\n  return [true, parsedSampleRate];\n}\n\nexport { sampleSpan };\n//# sourceMappingURL=sampling.js.map\n","import { getSdkMetadataForEnvelopeHeader, dsnToString, createEnvelope, createEventEnvelopeHeaders, createSpanEnvelopeItem } from '@sentry/utils';\nimport { getDynamicSamplingContextFromSpan } from './tracing/dynamicSamplingContext.js';\nimport { spanToJSON } from './utils/spanUtils.js';\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n **/\nfunction enhanceEventWithSdkInfo(event, sdkInfo) {\n  if (!sdkInfo) {\n    return event;\n  }\n  event.sdk = event.sdk || {};\n  event.sdk.name = event.sdk.name || sdkInfo.name;\n  event.sdk.version = event.sdk.version || sdkInfo.version;\n  event.sdk.integrations = [...(event.sdk.integrations || []), ...(sdkInfo.integrations || [])];\n  event.sdk.packages = [...(event.sdk.packages || []), ...(sdkInfo.packages || [])];\n  return event;\n}\n\n/** Creates an envelope from a Session */\nfunction createSessionEnvelope(\n  session,\n  dsn,\n  metadata,\n  tunnel,\n) {\n  const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n  const envelopeHeaders = {\n    sent_at: new Date().toISOString(),\n    ...(sdkInfo && { sdk: sdkInfo }),\n    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n  };\n\n  const envelopeItem =\n    'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session.toJSON()];\n\n  return createEnvelope(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nfunction createEventEnvelope(\n  event,\n  dsn,\n  metadata,\n  tunnel,\n) {\n  const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n\n  /*\n    Note: Due to TS, event.type may be `replay_event`, theoretically.\n    In practice, we never call `createEventEnvelope` with `replay_event` type,\n    and we'd have to adjut a looot of types to make this work properly.\n    We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type)\n    So the safe choice is to really guard against the replay_event type here.\n  */\n  const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';\n\n  enhanceEventWithSdkInfo(event, metadata && metadata.sdk);\n\n  const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n  // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n  // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n  // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n  // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n  delete event.sdkProcessingMetadata;\n\n  const eventItem = [{ type: eventType }, event];\n  return createEnvelope(envelopeHeaders, [eventItem]);\n}\n\n/**\n * Create envelope from Span item.\n *\n * Takes an optional client and runs spans through `beforeSendSpan` if available.\n */\nfunction createSpanEnvelope(spans, client) {\n  function dscHasRequiredProps(dsc) {\n    return !!dsc.trace_id && !!dsc.public_key;\n  }\n\n  // For the moment we'll obtain the DSC from the first span in the array\n  // This might need to be changed if we permit sending multiple spans from\n  // different segments in one envelope\n  const dsc = getDynamicSamplingContextFromSpan(spans[0]);\n\n  const dsn = client && client.getDsn();\n  const tunnel = client && client.getOptions().tunnel;\n\n  const headers = {\n    sent_at: new Date().toISOString(),\n    ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n  };\n\n  const beforeSendSpan = client && client.getOptions().beforeSendSpan;\n  const convertToSpanJSON = beforeSendSpan\n    ? (span) => beforeSendSpan(spanToJSON(span) )\n    : (span) => spanToJSON(span);\n\n  const items = [];\n  for (const span of spans) {\n    const spanJson = convertToSpanJSON(span);\n    if (spanJson) {\n      items.push(createSpanEnvelopeItem(spanJson));\n    }\n  }\n\n  return createEnvelope(headers, items);\n}\n\nexport { createEventEnvelope, createSessionEnvelope, createSpanEnvelope };\n//# sourceMappingURL=envelope.js.map\n","import { SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE, SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT } from '../semanticAttributes.js';\nimport { getRootSpan, getActiveSpan } from '../utils/spanUtils.js';\n\n/**\n * Adds a measurement to the active transaction on the current global scope. You can optionally pass in a different span\n * as the 4th parameter.\n */\nfunction setMeasurement(name, value, unit, activeSpan = getActiveSpan()) {\n  const rootSpan = activeSpan && getRootSpan(activeSpan);\n\n  if (rootSpan) {\n    rootSpan.addEvent(name, {\n      [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE]: value,\n      [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT]: unit ,\n    });\n  }\n}\n\n/**\n * Convert timed events to measurements.\n */\nfunction timedEventsToMeasurements(events) {\n  if (!events || events.length === 0) {\n    return undefined;\n  }\n\n  const measurements = {};\n  events.forEach(event => {\n    const attributes = event.attributes || {};\n    const unit = attributes[SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT] ;\n    const value = attributes[SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE] ;\n\n    if (typeof unit === 'string' && typeof value === 'number') {\n      measurements[event.name] = { value, unit };\n    }\n  });\n\n  return measurements;\n}\n\nexport { setMeasurement, timedEventsToMeasurements };\n//# sourceMappingURL=measurement.js.map\n","import { uuid4, timestampInSeconds, dropUndefinedKeys, logger } from '@sentry/utils';\nimport { getClient, getCurrentScope } from '../currentScopes.js';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { createSpanEnvelope } from '../envelope.js';\nimport { getMetricSummaryJsonForSpan } from '../metrics/metric-summary.js';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_PROFILE_ID, SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '../semanticAttributes.js';\nimport { TRACE_FLAG_SAMPLED, TRACE_FLAG_NONE, spanTimeInputToSeconds, getStatusMessage, getRootSpan, spanToJSON, getSpanDescendants, spanToTransactionTraceContext } from '../utils/spanUtils.js';\nimport { getDynamicSamplingContextFromSpan } from './dynamicSamplingContext.js';\nimport { logSpanEnd } from './logSpans.js';\nimport { timedEventsToMeasurements } from './measurement.js';\nimport { getCapturedScopesOnSpan } from './utils.js';\n\nconst MAX_SPAN_COUNT = 1000;\n\n/**\n * Span contains all data about a span\n */\nclass SentrySpan  {\n\n  /** Epoch timestamp in seconds when the span started. */\n\n  /** Epoch timestamp in seconds when the span ended. */\n\n  /** Internal keeper of the status */\n\n  /** The timed events added to this span. */\n\n  /** if true, treat span as a standalone span (not part of a transaction) */\n\n  /**\n   * You should never call the constructor manually, always use `Sentry.startSpan()`\n   * or other span methods.\n   * @internal\n   * @hideconstructor\n   * @hidden\n   */\n   constructor(spanContext = {}) {\n    this._traceId = spanContext.traceId || uuid4();\n    this._spanId = spanContext.spanId || uuid4().substring(16);\n    this._startTime = spanContext.startTimestamp || timestampInSeconds();\n\n    this._attributes = {};\n    this.setAttributes({\n      [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual',\n      [SEMANTIC_ATTRIBUTE_SENTRY_OP]: spanContext.op,\n      ...spanContext.attributes,\n    });\n\n    this._name = spanContext.name;\n\n    if (spanContext.parentSpanId) {\n      this._parentSpanId = spanContext.parentSpanId;\n    }\n    // We want to include booleans as well here\n    if ('sampled' in spanContext) {\n      this._sampled = spanContext.sampled;\n    }\n    if (spanContext.endTimestamp) {\n      this._endTime = spanContext.endTimestamp;\n    }\n\n    this._events = [];\n\n    this._isStandaloneSpan = spanContext.isStandalone;\n\n    // If the span is already ended, ensure we finalize the span immediately\n    if (this._endTime) {\n      this._onSpanEnded();\n    }\n  }\n\n  /**\n   * This should generally not be used,\n   * but it is needed for being compliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n   addLink(_link) {\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but it is needed for being compliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n   addLinks(_links) {\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but it is needed for being compliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n   recordException(_exception, _time) {\n    // noop\n  }\n\n  /** @inheritdoc */\n   spanContext() {\n    const { _spanId: spanId, _traceId: traceId, _sampled: sampled } = this;\n    return {\n      spanId,\n      traceId,\n      traceFlags: sampled ? TRACE_FLAG_SAMPLED : TRACE_FLAG_NONE,\n    };\n  }\n\n  /** @inheritdoc */\n   setAttribute(key, value) {\n    if (value === undefined) {\n      // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n      delete this._attributes[key];\n    } else {\n      this._attributes[key] = value;\n    }\n\n    return this;\n  }\n\n  /** @inheritdoc */\n   setAttributes(attributes) {\n    Object.keys(attributes).forEach(key => this.setAttribute(key, attributes[key]));\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but we need it for browser tracing where we want to adjust the start time afterwards.\n   * USE THIS WITH CAUTION!\n   *\n   * @hidden\n   * @internal\n   */\n   updateStartTime(timeInput) {\n    this._startTime = spanTimeInputToSeconds(timeInput);\n  }\n\n  /**\n   * @inheritDoc\n   */\n   setStatus(value) {\n    this._status = value;\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   updateName(name) {\n    this._name = name;\n    return this;\n  }\n\n  /** @inheritdoc */\n   end(endTimestamp) {\n    // If already ended, skip\n    if (this._endTime) {\n      return;\n    }\n\n    this._endTime = spanTimeInputToSeconds(endTimestamp);\n    logSpanEnd(this);\n\n    this._onSpanEnded();\n  }\n\n  /**\n   * Get JSON representation of this span.\n   *\n   * @hidden\n   * @internal This method is purely for internal purposes and should not be used outside\n   * of SDK code. If you need to get a JSON representation of a span,\n   * use `spanToJSON(span)` instead.\n   */\n   getSpanJSON() {\n    return dropUndefinedKeys({\n      data: this._attributes,\n      description: this._name,\n      op: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n      parent_span_id: this._parentSpanId,\n      span_id: this._spanId,\n      start_timestamp: this._startTime,\n      status: getStatusMessage(this._status),\n      timestamp: this._endTime,\n      trace_id: this._traceId,\n      origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] ,\n      _metrics_summary: getMetricSummaryJsonForSpan(this),\n      profile_id: this._attributes[SEMANTIC_ATTRIBUTE_PROFILE_ID] ,\n      exclusive_time: this._attributes[SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME] ,\n      measurements: timedEventsToMeasurements(this._events),\n      is_segment: (this._isStandaloneSpan && getRootSpan(this) === this) || undefined,\n      segment_id: this._isStandaloneSpan ? getRootSpan(this).spanContext().spanId : undefined,\n    });\n  }\n\n  /** @inheritdoc */\n   isRecording() {\n    return !this._endTime && !!this._sampled;\n  }\n\n  /**\n   * @inheritdoc\n   */\n   addEvent(\n    name,\n    attributesOrStartTime,\n    startTime,\n  ) {\n    DEBUG_BUILD && logger.log('[Tracing] Adding an event to span:', name);\n\n    const time = isSpanTimeInput(attributesOrStartTime) ? attributesOrStartTime : startTime || timestampInSeconds();\n    const attributes = isSpanTimeInput(attributesOrStartTime) ? {} : attributesOrStartTime || {};\n\n    const event = {\n      name,\n      time: spanTimeInputToSeconds(time),\n      attributes,\n    };\n\n    this._events.push(event);\n\n    return this;\n  }\n\n  /**\n   * This method should generally not be used,\n   * but for now we need a way to publicly check if the `_isStandaloneSpan` flag is set.\n   * USE THIS WITH CAUTION!\n   * @internal\n   * @hidden\n   * @experimental\n   */\n   isStandaloneSpan() {\n    return !!this._isStandaloneSpan;\n  }\n\n  /** Emit `spanEnd` when the span is ended. */\n   _onSpanEnded() {\n    const client = getClient();\n    if (client) {\n      client.emit('spanEnd', this);\n    }\n\n    // A segment span is basically the root span of a local span tree.\n    // So for now, this is either what we previously refer to as the root span,\n    // or a standalone span.\n    const isSegmentSpan = this._isStandaloneSpan || this === getRootSpan(this);\n\n    if (!isSegmentSpan) {\n      return;\n    }\n\n    // if this is a standalone span, we send it immediately\n    if (this._isStandaloneSpan) {\n      if (this._sampled) {\n        sendSpanEnvelope(createSpanEnvelope([this], client));\n      } else {\n        DEBUG_BUILD &&\n          logger.log('[Tracing] Discarding standalone span because its trace was not chosen to be sampled.');\n        if (client) {\n          client.recordDroppedEvent('sample_rate', 'span');\n        }\n      }\n      return;\n    }\n\n    const transactionEvent = this._convertSpanToTransaction();\n    if (transactionEvent) {\n      const scope = getCapturedScopesOnSpan(this).scope || getCurrentScope();\n      scope.captureEvent(transactionEvent);\n    }\n  }\n\n  /**\n   * Finish the transaction & prepare the event to send to Sentry.\n   */\n   _convertSpanToTransaction() {\n    // We can only convert finished spans\n    if (!isFullFinishedSpan(spanToJSON(this))) {\n      return undefined;\n    }\n\n    if (!this._name) {\n      DEBUG_BUILD && logger.warn('Transaction has no name, falling back to `<unlabeled transaction>`.');\n      this._name = '<unlabeled transaction>';\n    }\n\n    const { scope: capturedSpanScope, isolationScope: capturedSpanIsolationScope } = getCapturedScopesOnSpan(this);\n    const scope = capturedSpanScope || getCurrentScope();\n    const client = scope.getClient() || getClient();\n\n    if (this._sampled !== true) {\n      // At this point if `sampled !== true` we want to discard the transaction.\n      DEBUG_BUILD && logger.log('[Tracing] Discarding transaction because its trace was not chosen to be sampled.');\n\n      if (client) {\n        client.recordDroppedEvent('sample_rate', 'transaction');\n      }\n\n      return undefined;\n    }\n\n    // The transaction span itself as well as any potential standalone spans should be filtered out\n    const finishedSpans = getSpanDescendants(this).filter(span => span !== this && !isStandaloneSpan(span));\n\n    const spans = finishedSpans.map(span => spanToJSON(span)).filter(isFullFinishedSpan);\n\n    const source = this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] ;\n\n    const transaction = {\n      contexts: {\n        trace: spanToTransactionTraceContext(this),\n      },\n      spans:\n        // spans.sort() mutates the array, but `spans` is already a copy so we can safely do this here\n        // we do not use spans anymore after this point\n        spans.length > MAX_SPAN_COUNT\n          ? spans.sort((a, b) => a.start_timestamp - b.start_timestamp).slice(0, MAX_SPAN_COUNT)\n          : spans,\n      start_timestamp: this._startTime,\n      timestamp: this._endTime,\n      transaction: this._name,\n      type: 'transaction',\n      sdkProcessingMetadata: {\n        capturedSpanScope,\n        capturedSpanIsolationScope,\n        ...dropUndefinedKeys({\n          dynamicSamplingContext: getDynamicSamplingContextFromSpan(this),\n        }),\n      },\n      _metrics_summary: getMetricSummaryJsonForSpan(this),\n      ...(source && {\n        transaction_info: {\n          source,\n        },\n      }),\n    };\n\n    const measurements = timedEventsToMeasurements(this._events);\n    const hasMeasurements = measurements && Object.keys(measurements).length;\n\n    if (hasMeasurements) {\n      DEBUG_BUILD &&\n        logger.log(\n          '[Measurements] Adding measurements to transaction event',\n          JSON.stringify(measurements, undefined, 2),\n        );\n      transaction.measurements = measurements;\n    }\n\n    return transaction;\n  }\n}\n\nfunction isSpanTimeInput(value) {\n  return (value && typeof value === 'number') || value instanceof Date || Array.isArray(value);\n}\n\n// We want to filter out any incomplete SpanJSON objects\nfunction isFullFinishedSpan(input) {\n  return !!input.start_timestamp && !!input.timestamp && !!input.span_id && !!input.trace_id;\n}\n\n/** `SentrySpan`s can be sent as a standalone span rather than belonging to a transaction */\nfunction isStandaloneSpan(span) {\n  return span instanceof SentrySpan && span.isStandaloneSpan();\n}\n\n/**\n * Sends a `SpanEnvelope`.\n *\n * Note: If the envelope's spans are dropped, e.g. via `beforeSendSpan`,\n * the envelope will not be sent either.\n */\nfunction sendSpanEnvelope(envelope) {\n  const client = getClient();\n  if (!client) {\n    return;\n  }\n\n  const spanItems = envelope[1];\n  if (!spanItems || spanItems.length === 0) {\n    client.recordDroppedEvent('before_send', 'span');\n    return;\n  }\n\n  const transport = client.getTransport();\n  if (transport) {\n    transport.send(envelope).then(null, reason => {\n      DEBUG_BUILD && logger.error('Error while sending span:', reason);\n    });\n  }\n}\n\nexport { SentrySpan };\n//# sourceMappingURL=sentrySpan.js.map\n","import { propagationContextFromHeaders, generatePropagationContext, logger } from '@sentry/utils';\nimport { getMainCarrier } from '../carrier.js';\nimport { withScope, getCurrentScope, getIsolationScope, getClient } from '../currentScopes.js';\nimport { getAsyncContextStrategy } from '../asyncContext/index.js';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE } from '../semanticAttributes.js';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors.js';\nimport { hasTracingEnabled } from '../utils/hasTracingEnabled.js';\nimport { _setSpanForScope, _getSpanForScope } from '../utils/spanOnScope.js';\nimport { spanToJSON, addChildSpanToSpan, spanIsSampled, spanTimeInputToSeconds, getRootSpan } from '../utils/spanUtils.js';\nimport { getDynamicSamplingContextFromSpan, freezeDscOnSpan } from './dynamicSamplingContext.js';\nimport { logSpanStart } from './logSpans.js';\nimport { sampleSpan } from './sampling.js';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan.js';\nimport { SentrySpan } from './sentrySpan.js';\nimport { SPAN_STATUS_ERROR } from './spanstatus.js';\nimport { setCapturedScopesOnSpan } from './utils.js';\n\nconst SUPPRESS_TRACING_KEY = '__SENTRY_SUPPRESS_TRACING__';\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * If you want to create a span that is not set as active, use {@link startInactiveSpan}.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nfunction startSpan(options, callback) {\n  const acs = getAcs();\n  if (acs.startSpan) {\n    return acs.startSpan(options, callback);\n  }\n\n  const spanArguments = parseSentrySpanArguments(options);\n  const { forceTransaction, parentSpan: customParentSpan } = options;\n\n  return withScope(options.scope, () => {\n    // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n    const wrapper = getActiveSpanWrapper(customParentSpan);\n\n    return wrapper(() => {\n      const scope = getCurrentScope();\n      const parentSpan = getParentSpan(scope);\n\n      const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n      const activeSpan = shouldSkipSpan\n        ? new SentryNonRecordingSpan()\n        : createChildOrRootSpan({\n            parentSpan,\n            spanArguments,\n            forceTransaction,\n            scope,\n          });\n\n      _setSpanForScope(scope, activeSpan);\n\n      return handleCallbackErrors(\n        () => callback(activeSpan),\n        () => {\n          // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n          const { status } = spanToJSON(activeSpan);\n          if (activeSpan.isRecording() && (!status || status === 'ok')) {\n            activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n          }\n        },\n        () => activeSpan.end(),\n      );\n    });\n  });\n}\n\n/**\n * Similar to `Sentry.startSpan`. Wraps a function with a transaction/span, but does not finish the span\n * after the function is done automatically. You'll have to call `span.end()` manually.\n *\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nfunction startSpanManual(options, callback) {\n  const acs = getAcs();\n  if (acs.startSpanManual) {\n    return acs.startSpanManual(options, callback);\n  }\n\n  const spanArguments = parseSentrySpanArguments(options);\n  const { forceTransaction, parentSpan: customParentSpan } = options;\n\n  return withScope(options.scope, () => {\n    // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n    const wrapper = getActiveSpanWrapper(customParentSpan);\n\n    return wrapper(() => {\n      const scope = getCurrentScope();\n      const parentSpan = getParentSpan(scope);\n\n      const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n      const activeSpan = shouldSkipSpan\n        ? new SentryNonRecordingSpan()\n        : createChildOrRootSpan({\n            parentSpan,\n            spanArguments,\n            forceTransaction,\n            scope,\n          });\n\n      _setSpanForScope(scope, activeSpan);\n\n      function finishAndSetSpan() {\n        activeSpan.end();\n      }\n\n      return handleCallbackErrors(\n        () => callback(activeSpan, finishAndSetSpan),\n        () => {\n          // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n          const { status } = spanToJSON(activeSpan);\n          if (activeSpan.isRecording() && (!status || status === 'ok')) {\n            activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n          }\n        },\n      );\n    });\n  });\n}\n\n/**\n * Creates a span. This span is not set as active, so will not get automatic instrumentation spans\n * as children or be able to be accessed via `Sentry.getActiveSpan()`.\n *\n * If you want to create a span that is set as active, use {@link startSpan}.\n *\n * This function will always return a span,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nfunction startInactiveSpan(options) {\n  const acs = getAcs();\n  if (acs.startInactiveSpan) {\n    return acs.startInactiveSpan(options);\n  }\n\n  const spanArguments = parseSentrySpanArguments(options);\n  const { forceTransaction, parentSpan: customParentSpan } = options;\n\n  // If `options.scope` is defined, we use this as as a wrapper,\n  // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n  const wrapper = options.scope\n    ? (callback) => withScope(options.scope, callback)\n    : customParentSpan !== undefined\n      ? (callback) => withActiveSpan(customParentSpan, callback)\n      : (callback) => callback();\n\n  return wrapper(() => {\n    const scope = getCurrentScope();\n    const parentSpan = getParentSpan(scope);\n\n    const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n\n    if (shouldSkipSpan) {\n      return new SentryNonRecordingSpan();\n    }\n\n    return createChildOrRootSpan({\n      parentSpan,\n      spanArguments,\n      forceTransaction,\n      scope,\n    });\n  });\n}\n\n/**\n * Continue a trace from `sentry-trace` and `baggage` values.\n * These values can be obtained from incoming request headers, or in the browser from `<meta name=\"sentry-trace\">`\n * and `<meta name=\"baggage\">` HTML tags.\n *\n * Spans started with `startSpan`, `startSpanManual` and `startInactiveSpan`, within the callback will automatically\n * be attached to the incoming trace.\n */\nconst continueTrace = (\n  {\n    sentryTrace,\n    baggage,\n  }\n\n,\n  callback,\n) => {\n  return withScope(scope => {\n    const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n    scope.setPropagationContext(propagationContext);\n    return callback();\n  });\n};\n\n/**\n * Forks the current scope and sets the provided span as active span in the context of the provided callback. Can be\n * passed `null` to start an entirely new span tree.\n *\n * @param span Spans started in the context of the provided callback will be children of this span. If `null` is passed,\n * spans started within the callback will not be attached to a parent span.\n * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.\n * @returns the value returned from the provided callback function.\n */\nfunction withActiveSpan(span, callback) {\n  const acs = getAcs();\n  if (acs.withActiveSpan) {\n    return acs.withActiveSpan(span, callback);\n  }\n\n  return withScope(scope => {\n    _setSpanForScope(scope, span || undefined);\n    return callback(scope);\n  });\n}\n\n/** Suppress tracing in the given callback, ensuring no spans are generated inside of it. */\nfunction suppressTracing(callback) {\n  const acs = getAcs();\n\n  if (acs.suppressTracing) {\n    return acs.suppressTracing(callback);\n  }\n\n  return withScope(scope => {\n    scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: true });\n    return callback();\n  });\n}\n\n/**\n * Starts a new trace for the duration of the provided callback. Spans started within the\n * callback will be part of the new trace instead of a potentially previously started trace.\n *\n * Important: Only use this function if you want to override the default trace lifetime and\n * propagation mechanism of the SDK for the duration and scope of the provided callback.\n * The newly created trace will also be the root of a new distributed trace, for example if\n * you make http requests within the callback.\n * This function might be useful if the operation you want to instrument should not be part\n * of a potentially ongoing trace.\n *\n * Default behavior:\n * - Server-side: A new trace is started for each incoming request.\n * - Browser: A new trace is started for each page our route. Navigating to a new route\n *            or page will automatically create a new trace.\n */\nfunction startNewTrace(callback) {\n  return withScope(scope => {\n    scope.setPropagationContext(generatePropagationContext());\n    DEBUG_BUILD && logger.info(`Starting a new trace with id ${scope.getPropagationContext().traceId}`);\n    return withActiveSpan(null, callback);\n  });\n}\n\nfunction createChildOrRootSpan({\n  parentSpan,\n  spanArguments,\n  forceTransaction,\n  scope,\n}\n\n) {\n  if (!hasTracingEnabled()) {\n    return new SentryNonRecordingSpan();\n  }\n\n  const isolationScope = getIsolationScope();\n\n  let span;\n  if (parentSpan && !forceTransaction) {\n    span = _startChildSpan(parentSpan, scope, spanArguments);\n    addChildSpanToSpan(parentSpan, span);\n  } else if (parentSpan) {\n    // If we forced a transaction but have a parent span, make sure to continue from the parent span, not the scope\n    const dsc = getDynamicSamplingContextFromSpan(parentSpan);\n    const { traceId, spanId: parentSpanId } = parentSpan.spanContext();\n    const parentSampled = spanIsSampled(parentSpan);\n\n    span = _startRootSpan(\n      {\n        traceId,\n        parentSpanId,\n        ...spanArguments,\n      },\n      scope,\n      parentSampled,\n    );\n\n    freezeDscOnSpan(span, dsc);\n  } else {\n    const {\n      traceId,\n      dsc,\n      parentSpanId,\n      sampled: parentSampled,\n    } = {\n      ...isolationScope.getPropagationContext(),\n      ...scope.getPropagationContext(),\n    };\n\n    span = _startRootSpan(\n      {\n        traceId,\n        parentSpanId,\n        ...spanArguments,\n      },\n      scope,\n      parentSampled,\n    );\n\n    if (dsc) {\n      freezeDscOnSpan(span, dsc);\n    }\n  }\n\n  logSpanStart(span);\n\n  setCapturedScopesOnSpan(span, scope, isolationScope);\n\n  return span;\n}\n\n/**\n * This converts StartSpanOptions to SentrySpanArguments.\n * For the most part (for now) we accept the same options,\n * but some of them need to be transformed.\n */\nfunction parseSentrySpanArguments(options) {\n  const exp = options.experimental || {};\n  const initialCtx = {\n    isStandalone: exp.standalone,\n    ...options,\n  };\n\n  if (options.startTime) {\n    const ctx = { ...initialCtx };\n    ctx.startTimestamp = spanTimeInputToSeconds(options.startTime);\n    delete ctx.startTime;\n    return ctx;\n  }\n\n  return initialCtx;\n}\n\nfunction getAcs() {\n  const carrier = getMainCarrier();\n  return getAsyncContextStrategy(carrier);\n}\n\nfunction _startRootSpan(spanArguments, scope, parentSampled) {\n  const client = getClient();\n  const options = (client && client.getOptions()) || {};\n\n  const { name = '', attributes } = spanArguments;\n  const [sampled, sampleRate] = scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY]\n    ? [false]\n    : sampleSpan(options, {\n        name,\n        parentSampled,\n        attributes,\n        transactionContext: {\n          name,\n          parentSampled,\n        },\n      });\n\n  const rootSpan = new SentrySpan({\n    ...spanArguments,\n    attributes: {\n      [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n      ...spanArguments.attributes,\n    },\n    sampled,\n  });\n  if (sampleRate !== undefined) {\n    rootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, sampleRate);\n  }\n\n  if (client) {\n    client.emit('spanStart', rootSpan);\n  }\n\n  return rootSpan;\n}\n\n/**\n * Creates a new `Span` while setting the current `Span.id` as `parentSpanId`.\n * This inherits the sampling decision from the parent span.\n */\nfunction _startChildSpan(parentSpan, scope, spanArguments) {\n  const { spanId, traceId } = parentSpan.spanContext();\n  const sampled = scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] ? false : spanIsSampled(parentSpan);\n\n  const childSpan = sampled\n    ? new SentrySpan({\n        ...spanArguments,\n        parentSpanId: spanId,\n        traceId,\n        sampled,\n      })\n    : new SentryNonRecordingSpan({ traceId });\n\n  addChildSpanToSpan(parentSpan, childSpan);\n\n  const client = getClient();\n  if (client) {\n    client.emit('spanStart', childSpan);\n    // If it has an endTimestamp, it's already ended\n    if (spanArguments.endTimestamp) {\n      client.emit('spanEnd', childSpan);\n    }\n  }\n\n  return childSpan;\n}\n\nfunction getParentSpan(scope) {\n  const span = _getSpanForScope(scope) ;\n\n  if (!span) {\n    return undefined;\n  }\n\n  const client = getClient();\n  const options = client ? client.getOptions() : {};\n  if (options.parentSpanIsAlwaysRootSpan) {\n    return getRootSpan(span) ;\n  }\n\n  return span;\n}\n\nfunction getActiveSpanWrapper(parentSpan) {\n  return parentSpan !== undefined\n    ? (callback) => {\n        return withActiveSpan(parentSpan, callback);\n      }\n    : (callback) => callback();\n}\n\nexport { continueTrace, startInactiveSpan, startNewTrace, startSpan, startSpanManual, suppressTracing, withActiveSpan };\n//# sourceMappingURL=trace.js.map\n","import { SyncPromise, logger, isThenable } from '@sentry/utils';\nimport { DEBUG_BUILD } from './debug-build.js';\n\n/**\n * Process an array of event processors, returning the processed event (or `null` if the event was dropped).\n */\nfunction notifyEventProcessors(\n  processors,\n  event,\n  hint,\n  index = 0,\n) {\n  return new SyncPromise((resolve, reject) => {\n    const processor = processors[index];\n    if (event === null || typeof processor !== 'function') {\n      resolve(event);\n    } else {\n      const result = processor({ ...event }, hint) ;\n\n      DEBUG_BUILD && processor.id && result === null && logger.log(`Event processor \"${processor.id}\" dropped event`);\n\n      if (isThenable(result)) {\n        void result\n          .then(final => notifyEventProcessors(processors, final, hint, index + 1).then(resolve))\n          .then(null, reject);\n      } else {\n        void notifyEventProcessors(processors, result, hint, index + 1)\n          .then(resolve)\n          .then(null, reject);\n      }\n    }\n  });\n}\n\nexport { notifyEventProcessors };\n//# sourceMappingURL=eventProcessors.js.map\n","import { dropUndefinedKeys, arrayify } from '@sentry/utils';\nimport { getDynamicSamplingContextFromSpan } from '../tracing/dynamicSamplingContext.js';\nimport { spanToTraceContext, getRootSpan, spanToJSON } from './spanUtils.js';\n\n/**\n * Applies data from the scope to the event and runs all event processors on it.\n */\nfunction applyScopeDataToEvent(event, data) {\n  const { fingerprint, span, breadcrumbs, sdkProcessingMetadata } = data;\n\n  // Apply general data\n  applyDataToEvent(event, data);\n\n  // We want to set the trace context for normal events only if there isn't already\n  // a trace context on the event. There is a product feature in place where we link\n  // errors with transaction and it relies on that.\n  if (span) {\n    applySpanToEvent(event, span);\n  }\n\n  applyFingerprintToEvent(event, fingerprint);\n  applyBreadcrumbsToEvent(event, breadcrumbs);\n  applySdkMetadataToEvent(event, sdkProcessingMetadata);\n}\n\n/** Merge data of two scopes together. */\nfunction mergeScopeData(data, mergeData) {\n  const {\n    extra,\n    tags,\n    user,\n    contexts,\n    level,\n    sdkProcessingMetadata,\n    breadcrumbs,\n    fingerprint,\n    eventProcessors,\n    attachments,\n    propagationContext,\n    transactionName,\n    span,\n  } = mergeData;\n\n  mergeAndOverwriteScopeData(data, 'extra', extra);\n  mergeAndOverwriteScopeData(data, 'tags', tags);\n  mergeAndOverwriteScopeData(data, 'user', user);\n  mergeAndOverwriteScopeData(data, 'contexts', contexts);\n  mergeAndOverwriteScopeData(data, 'sdkProcessingMetadata', sdkProcessingMetadata);\n\n  if (level) {\n    data.level = level;\n  }\n\n  if (transactionName) {\n    data.transactionName = transactionName;\n  }\n\n  if (span) {\n    data.span = span;\n  }\n\n  if (breadcrumbs.length) {\n    data.breadcrumbs = [...data.breadcrumbs, ...breadcrumbs];\n  }\n\n  if (fingerprint.length) {\n    data.fingerprint = [...data.fingerprint, ...fingerprint];\n  }\n\n  if (eventProcessors.length) {\n    data.eventProcessors = [...data.eventProcessors, ...eventProcessors];\n  }\n\n  if (attachments.length) {\n    data.attachments = [...data.attachments, ...attachments];\n  }\n\n  data.propagationContext = { ...data.propagationContext, ...propagationContext };\n}\n\n/**\n * Merges certain scope data. Undefined values will overwrite any existing values.\n * Exported only for tests.\n */\nfunction mergeAndOverwriteScopeData\n\n(data, prop, mergeVal) {\n  if (mergeVal && Object.keys(mergeVal).length) {\n    // Clone object\n    data[prop] = { ...data[prop] };\n    for (const key in mergeVal) {\n      if (Object.prototype.hasOwnProperty.call(mergeVal, key)) {\n        data[prop][key] = mergeVal[key];\n      }\n    }\n  }\n}\n\nfunction applyDataToEvent(event, data) {\n  const { extra, tags, user, contexts, level, transactionName } = data;\n\n  const cleanedExtra = dropUndefinedKeys(extra);\n  if (cleanedExtra && Object.keys(cleanedExtra).length) {\n    event.extra = { ...cleanedExtra, ...event.extra };\n  }\n\n  const cleanedTags = dropUndefinedKeys(tags);\n  if (cleanedTags && Object.keys(cleanedTags).length) {\n    event.tags = { ...cleanedTags, ...event.tags };\n  }\n\n  const cleanedUser = dropUndefinedKeys(user);\n  if (cleanedUser && Object.keys(cleanedUser).length) {\n    event.user = { ...cleanedUser, ...event.user };\n  }\n\n  const cleanedContexts = dropUndefinedKeys(contexts);\n  if (cleanedContexts && Object.keys(cleanedContexts).length) {\n    event.contexts = { ...cleanedContexts, ...event.contexts };\n  }\n\n  if (level) {\n    event.level = level;\n  }\n\n  // transaction events get their `transaction` from the root span name\n  if (transactionName && event.type !== 'transaction') {\n    event.transaction = transactionName;\n  }\n}\n\nfunction applyBreadcrumbsToEvent(event, breadcrumbs) {\n  const mergedBreadcrumbs = [...(event.breadcrumbs || []), ...breadcrumbs];\n  event.breadcrumbs = mergedBreadcrumbs.length ? mergedBreadcrumbs : undefined;\n}\n\nfunction applySdkMetadataToEvent(event, sdkProcessingMetadata) {\n  event.sdkProcessingMetadata = {\n    ...event.sdkProcessingMetadata,\n    ...sdkProcessingMetadata,\n  };\n}\n\nfunction applySpanToEvent(event, span) {\n  event.contexts = {\n    trace: spanToTraceContext(span),\n    ...event.contexts,\n  };\n\n  event.sdkProcessingMetadata = {\n    dynamicSamplingContext: getDynamicSamplingContextFromSpan(span),\n    ...event.sdkProcessingMetadata,\n  };\n\n  const rootSpan = getRootSpan(span);\n  const transactionName = spanToJSON(rootSpan).description;\n  if (transactionName && !event.transaction && event.type === 'transaction') {\n    event.transaction = transactionName;\n  }\n}\n\n/**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\nfunction applyFingerprintToEvent(event, fingerprint) {\n  // Make sure it's an array first and we actually have something in place\n  event.fingerprint = event.fingerprint ? arrayify(event.fingerprint) : [];\n\n  // If we have something on the scope, then merge it with event\n  if (fingerprint) {\n    event.fingerprint = event.fingerprint.concat(fingerprint);\n  }\n\n  // If we have no data at all, remove empty array default\n  if (event.fingerprint && !event.fingerprint.length) {\n    delete event.fingerprint;\n  }\n}\n\nexport { applyScopeDataToEvent, mergeAndOverwriteScopeData, mergeScopeData };\n//# sourceMappingURL=applyScopeDataToEvent.js.map\n","import { uuid4, dateTimestampInSeconds, addExceptionMechanism, truncate, GLOBAL_OBJ, normalize } from '@sentry/utils';\nimport { DEFAULT_ENVIRONMENT } from '../constants.js';\nimport { getGlobalScope } from '../currentScopes.js';\nimport { notifyEventProcessors } from '../eventProcessors.js';\nimport { Scope } from '../scope.js';\nimport { mergeScopeData, applyScopeDataToEvent } from './applyScopeDataToEvent.js';\n\n/**\n * This type makes sure that we get either a CaptureContext, OR an EventHint.\n * It does not allow mixing them, which could lead to unexpected outcomes, e.g. this is disallowed:\n * { user: { id: '123' }, mechanism: { handled: false } }\n */\n\n/**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n * @hidden\n */\nfunction prepareEvent(\n  options,\n  event,\n  hint,\n  scope,\n  client,\n  isolationScope,\n) {\n  const { normalizeDepth = 3, normalizeMaxBreadth = 1000 } = options;\n  const prepared = {\n    ...event,\n    event_id: event.event_id || hint.event_id || uuid4(),\n    timestamp: event.timestamp || dateTimestampInSeconds(),\n  };\n  const integrations = hint.integrations || options.integrations.map(i => i.name);\n\n  applyClientOptions(prepared, options);\n  applyIntegrationsMetadata(prepared, integrations);\n\n  if (client) {\n    client.emit('applyFrameMetadata', event);\n  }\n\n  // Only put debug IDs onto frames for error events.\n  if (event.type === undefined) {\n    applyDebugIds(prepared, options.stackParser);\n  }\n\n  // If we have scope given to us, use it as the base for further modifications.\n  // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n  const finalScope = getFinalScope(scope, hint.captureContext);\n\n  if (hint.mechanism) {\n    addExceptionMechanism(prepared, hint.mechanism);\n  }\n\n  const clientEventProcessors = client ? client.getEventProcessors() : [];\n\n  // This should be the last thing called, since we want that\n  // {@link Scope.addEventProcessor} gets the finished prepared event.\n  // Merge scope data together\n  const data = getGlobalScope().getScopeData();\n\n  if (isolationScope) {\n    const isolationData = isolationScope.getScopeData();\n    mergeScopeData(data, isolationData);\n  }\n\n  if (finalScope) {\n    const finalScopeData = finalScope.getScopeData();\n    mergeScopeData(data, finalScopeData);\n  }\n\n  const attachments = [...(hint.attachments || []), ...data.attachments];\n  if (attachments.length) {\n    hint.attachments = attachments;\n  }\n\n  applyScopeDataToEvent(prepared, data);\n\n  const eventProcessors = [\n    ...clientEventProcessors,\n    // Run scope event processors _after_ all other processors\n    ...data.eventProcessors,\n  ];\n\n  const result = notifyEventProcessors(eventProcessors, prepared, hint);\n\n  return result.then(evt => {\n    if (evt) {\n      // We apply the debug_meta field only after all event processors have ran, so that if any event processors modified\n      // file names (e.g.the RewriteFrames integration) the filename -> debug ID relationship isn't destroyed.\n      // This should not cause any PII issues, since we're only moving data that is already on the event and not adding\n      // any new data\n      applyDebugMeta(evt);\n    }\n\n    if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n      return normalizeEvent(evt, normalizeDepth, normalizeMaxBreadth);\n    }\n    return evt;\n  });\n}\n\n/**\n *  Enhances event using the client configuration.\n *  It takes care of all \"static\" values like environment, release and `dist`,\n *  as well as truncating overly long values.\n * @param event event instance to be enhanced\n */\nfunction applyClientOptions(event, options) {\n  const { environment, release, dist, maxValueLength = 250 } = options;\n\n  if (!('environment' in event)) {\n    event.environment = 'environment' in options ? environment : DEFAULT_ENVIRONMENT;\n  }\n\n  if (event.release === undefined && release !== undefined) {\n    event.release = release;\n  }\n\n  if (event.dist === undefined && dist !== undefined) {\n    event.dist = dist;\n  }\n\n  if (event.message) {\n    event.message = truncate(event.message, maxValueLength);\n  }\n\n  const exception = event.exception && event.exception.values && event.exception.values[0];\n  if (exception && exception.value) {\n    exception.value = truncate(exception.value, maxValueLength);\n  }\n\n  const request = event.request;\n  if (request && request.url) {\n    request.url = truncate(request.url, maxValueLength);\n  }\n}\n\nconst debugIdStackParserCache = new WeakMap();\n\n/**\n * Puts debug IDs into the stack frames of an error event.\n */\nfunction applyDebugIds(event, stackParser) {\n  const debugIdMap = GLOBAL_OBJ._sentryDebugIds;\n\n  if (!debugIdMap) {\n    return;\n  }\n\n  let debugIdStackFramesCache;\n  const cachedDebugIdStackFrameCache = debugIdStackParserCache.get(stackParser);\n  if (cachedDebugIdStackFrameCache) {\n    debugIdStackFramesCache = cachedDebugIdStackFrameCache;\n  } else {\n    debugIdStackFramesCache = new Map();\n    debugIdStackParserCache.set(stackParser, debugIdStackFramesCache);\n  }\n\n  // Build a map of filename -> debug_id\n  const filenameDebugIdMap = Object.entries(debugIdMap).reduce(\n    (acc, [debugIdStackTrace, debugIdValue]) => {\n      let parsedStack;\n      const cachedParsedStack = debugIdStackFramesCache.get(debugIdStackTrace);\n      if (cachedParsedStack) {\n        parsedStack = cachedParsedStack;\n      } else {\n        parsedStack = stackParser(debugIdStackTrace);\n        debugIdStackFramesCache.set(debugIdStackTrace, parsedStack);\n      }\n\n      for (let i = parsedStack.length - 1; i >= 0; i--) {\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        const stackFrame = parsedStack[i];\n        if (stackFrame.filename) {\n          acc[stackFrame.filename] = debugIdValue;\n          break;\n        }\n      }\n      return acc;\n    },\n    {},\n  );\n\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    event.exception.values.forEach(exception => {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      exception.stacktrace.frames.forEach(frame => {\n        if (frame.filename) {\n          frame.debug_id = filenameDebugIdMap[frame.filename];\n        }\n      });\n    });\n  } catch (e) {\n    // To save bundle size we're just try catching here instead of checking for the existence of all the different objects.\n  }\n}\n\n/**\n * Moves debug IDs from the stack frames of an error event into the debug_meta field.\n */\nfunction applyDebugMeta(event) {\n  // Extract debug IDs and filenames from the stack frames on the event.\n  const filenameDebugIdMap = {};\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    event.exception.values.forEach(exception => {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      exception.stacktrace.frames.forEach(frame => {\n        if (frame.debug_id) {\n          if (frame.abs_path) {\n            filenameDebugIdMap[frame.abs_path] = frame.debug_id;\n          } else if (frame.filename) {\n            filenameDebugIdMap[frame.filename] = frame.debug_id;\n          }\n          delete frame.debug_id;\n        }\n      });\n    });\n  } catch (e) {\n    // To save bundle size we're just try catching here instead of checking for the existence of all the different objects.\n  }\n\n  if (Object.keys(filenameDebugIdMap).length === 0) {\n    return;\n  }\n\n  // Fill debug_meta information\n  event.debug_meta = event.debug_meta || {};\n  event.debug_meta.images = event.debug_meta.images || [];\n  const images = event.debug_meta.images;\n  Object.entries(filenameDebugIdMap).forEach(([filename, debug_id]) => {\n    images.push({\n      type: 'sourcemap',\n      code_file: filename,\n      debug_id,\n    });\n  });\n}\n\n/**\n * This function adds all used integrations to the SDK info in the event.\n * @param event The event that will be filled with all integrations.\n */\nfunction applyIntegrationsMetadata(event, integrationNames) {\n  if (integrationNames.length > 0) {\n    event.sdk = event.sdk || {};\n    event.sdk.integrations = [...(event.sdk.integrations || []), ...integrationNames];\n  }\n}\n\n/**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\nfunction normalizeEvent(event, depth, maxBreadth) {\n  if (!event) {\n    return null;\n  }\n\n  const normalized = {\n    ...event,\n    ...(event.breadcrumbs && {\n      breadcrumbs: event.breadcrumbs.map(b => ({\n        ...b,\n        ...(b.data && {\n          data: normalize(b.data, depth, maxBreadth),\n        }),\n      })),\n    }),\n    ...(event.user && {\n      user: normalize(event.user, depth, maxBreadth),\n    }),\n    ...(event.contexts && {\n      contexts: normalize(event.contexts, depth, maxBreadth),\n    }),\n    ...(event.extra && {\n      extra: normalize(event.extra, depth, maxBreadth),\n    }),\n  };\n\n  // event.contexts.trace stores information about a Transaction. Similarly,\n  // event.spans[] stores information about child Spans. Given that a\n  // Transaction is conceptually a Span, normalization should apply to both\n  // Transactions and Spans consistently.\n  // For now the decision is to skip normalization of Transactions and Spans,\n  // so this block overwrites the normalized event to add back the original\n  // Transaction information prior to normalization.\n  if (event.contexts && event.contexts.trace && normalized.contexts) {\n    normalized.contexts.trace = event.contexts.trace;\n\n    // event.contexts.trace.data may contain circular/dangerous data so we need to normalize it\n    if (event.contexts.trace.data) {\n      normalized.contexts.trace.data = normalize(event.contexts.trace.data, depth, maxBreadth);\n    }\n  }\n\n  // event.spans[].data may contain circular/dangerous data so we need to normalize it\n  if (event.spans) {\n    normalized.spans = event.spans.map(span => {\n      return {\n        ...span,\n        ...(span.data && {\n          data: normalize(span.data, depth, maxBreadth),\n        }),\n      };\n    });\n  }\n\n  return normalized;\n}\n\nfunction getFinalScope(\n  scope,\n  captureContext,\n) {\n  if (!captureContext) {\n    return scope;\n  }\n\n  const finalScope = scope ? scope.clone() : new Scope();\n  finalScope.update(captureContext);\n  return finalScope;\n}\n\n/**\n * Parse either an `EventHint` directly, or convert a `CaptureContext` to an `EventHint`.\n * This is used to allow to update method signatures that used to accept a `CaptureContext` but should now accept an `EventHint`.\n */\nfunction parseEventHintOrCaptureContext(\n  hint,\n) {\n  if (!hint) {\n    return undefined;\n  }\n\n  // If you pass a Scope or `() => Scope` as CaptureContext, we just return this as captureContext\n  if (hintIsScopeOrFunction(hint)) {\n    return { captureContext: hint };\n  }\n\n  if (hintIsScopeContext(hint)) {\n    return {\n      captureContext: hint,\n    };\n  }\n\n  return hint;\n}\n\nfunction hintIsScopeOrFunction(\n  hint,\n) {\n  return hint instanceof Scope || typeof hint === 'function';\n}\n\nconst captureContextKeys = [\n  'user',\n  'level',\n  'extra',\n  'contexts',\n  'tags',\n  'fingerprint',\n  'requestSession',\n  'propagationContext',\n] ;\n\nfunction hintIsScopeContext(hint) {\n  return Object.keys(hint).some(key => captureContextKeys.includes(key ));\n}\n\nexport { applyDebugIds, applyDebugMeta, parseEventHintOrCaptureContext, prepareEvent };\n//# sourceMappingURL=prepareEvent.js.map\n","import { logger, uuid4, timestampInSeconds, isThenable, GLOBAL_OBJ } from '@sentry/utils';\nimport { DEFAULT_ENVIRONMENT } from './constants.js';\nimport { getCurrentScope, getIsolationScope, getClient, withIsolationScope } from './currentScopes.js';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { makeSession, updateSession, closeSession } from './session.js';\nimport { parseEventHintOrCaptureContext } from './utils/prepareEvent.js';\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception The exception to capture.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured Sentry event.\n */\nfunction captureException(\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  exception,\n  hint,\n) {\n  return getCurrentScope().captureException(exception, parseEventHintOrCaptureContext(hint));\n}\n\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param captureContext Define the level of the message or pass in additional data to attach to the message.\n * @returns the id of the captured message.\n */\nfunction captureMessage(message, captureContext) {\n  // This is necessary to provide explicit scopes upgrade, without changing the original\n  // arity of the `captureMessage(message, level)` method.\n  const level = typeof captureContext === 'string' ? captureContext : undefined;\n  const context = typeof captureContext !== 'string' ? { captureContext } : undefined;\n  return getCurrentScope().captureMessage(message, level, context);\n}\n\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured event.\n */\nfunction captureEvent(event, hint) {\n  return getCurrentScope().captureEvent(event, hint);\n}\n\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setContext(name, context) {\n  getIsolationScope().setContext(name, context);\n}\n\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nfunction setExtras(extras) {\n  getIsolationScope().setExtras(extras);\n}\n\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\nfunction setExtra(key, extra) {\n  getIsolationScope().setExtra(key, extra);\n}\n\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nfunction setTags(tags) {\n  getIsolationScope().setTags(tags);\n}\n\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\nfunction setTag(key, value) {\n  getIsolationScope().setTag(key, value);\n}\n\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nfunction setUser(user) {\n  getIsolationScope().setUser(user);\n}\n\n/**\n * The last error event id of the isolation scope.\n *\n * Warning: This function really returns the last recorded error event id on the current\n * isolation scope. If you call this function after handling a certain error and another error\n * is captured in between, the last one is returned instead of the one you might expect.\n * Also, ids of events that were never sent to Sentry (for example because\n * they were dropped in `beforeSend`) could be returned.\n *\n * @returns The last event id of the isolation scope.\n */\nfunction lastEventId() {\n  return getIsolationScope().lastEventId();\n}\n\n/**\n * Create a cron monitor check in and send it to Sentry.\n *\n * @param checkIn An object that describes a check in.\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n */\nfunction captureCheckIn(checkIn, upsertMonitorConfig) {\n  const scope = getCurrentScope();\n  const client = getClient();\n  if (!client) {\n    DEBUG_BUILD && logger.warn('Cannot capture check-in. No client defined.');\n  } else if (!client.captureCheckIn) {\n    DEBUG_BUILD && logger.warn('Cannot capture check-in. Client does not support sending check-ins.');\n  } else {\n    return client.captureCheckIn(checkIn, upsertMonitorConfig, scope);\n  }\n\n  return uuid4();\n}\n\n/**\n * Wraps a callback with a cron monitor check in. The check in will be sent to Sentry when the callback finishes.\n *\n * @param monitorSlug The distinct slug of the monitor.\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n */\nfunction withMonitor(\n  monitorSlug,\n  callback,\n  upsertMonitorConfig,\n) {\n  const checkInId = captureCheckIn({ monitorSlug, status: 'in_progress' }, upsertMonitorConfig);\n  const now = timestampInSeconds();\n\n  function finishCheckIn(status) {\n    captureCheckIn({ monitorSlug, status, checkInId, duration: timestampInSeconds() - now });\n  }\n\n  return withIsolationScope(() => {\n    let maybePromiseResult;\n    try {\n      maybePromiseResult = callback();\n    } catch (e) {\n      finishCheckIn('error');\n      throw e;\n    }\n\n    if (isThenable(maybePromiseResult)) {\n      Promise.resolve(maybePromiseResult).then(\n        () => {\n          finishCheckIn('ok');\n        },\n        () => {\n          finishCheckIn('error');\n        },\n      );\n    } else {\n      finishCheckIn('ok');\n    }\n\n    return maybePromiseResult;\n  });\n}\n\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nasync function flush(timeout) {\n  const client = getClient();\n  if (client) {\n    return client.flush(timeout);\n  }\n  DEBUG_BUILD && logger.warn('Cannot flush events. No client defined.');\n  return Promise.resolve(false);\n}\n\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nasync function close(timeout) {\n  const client = getClient();\n  if (client) {\n    return client.close(timeout);\n  }\n  DEBUG_BUILD && logger.warn('Cannot flush events and disable SDK. No client defined.');\n  return Promise.resolve(false);\n}\n\n/**\n * Returns true if Sentry has been properly initialized.\n */\nfunction isInitialized() {\n  return !!getClient();\n}\n\n/** If the SDK is initialized & enabled. */\nfunction isEnabled() {\n  const client = getClient();\n  return !!client && client.getOptions().enabled !== false && !!client.getTransport();\n}\n\n/**\n * Add an event processor.\n * This will be added to the current isolation scope, ensuring any event that is processed in the current execution\n * context will have the processor applied.\n */\nfunction addEventProcessor(callback) {\n  getIsolationScope().addEventProcessor(callback);\n}\n\n/**\n * Start a session on the current isolation scope.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns the new active session\n */\nfunction startSession(context) {\n  const client = getClient();\n  const isolationScope = getIsolationScope();\n  const currentScope = getCurrentScope();\n\n  const { release, environment = DEFAULT_ENVIRONMENT } = (client && client.getOptions()) || {};\n\n  // Will fetch userAgent if called from browser sdk\n  const { userAgent } = GLOBAL_OBJ.navigator || {};\n\n  const session = makeSession({\n    release,\n    environment,\n    user: currentScope.getUser() || isolationScope.getUser(),\n    ...(userAgent && { userAgent }),\n    ...context,\n  });\n\n  // End existing session if there's one\n  const currentSession = isolationScope.getSession();\n  if (currentSession && currentSession.status === 'ok') {\n    updateSession(currentSession, { status: 'exited' });\n  }\n\n  endSession();\n\n  // Afterwards we set the new session on the scope\n  isolationScope.setSession(session);\n\n  // TODO (v8): Remove this and only use the isolation scope(?).\n  // For v7 though, we can't \"soft-break\" people using getCurrentHub().getScope().setSession()\n  currentScope.setSession(session);\n\n  return session;\n}\n\n/**\n * End the session on the current isolation scope.\n */\nfunction endSession() {\n  const isolationScope = getIsolationScope();\n  const currentScope = getCurrentScope();\n\n  const session = currentScope.getSession() || isolationScope.getSession();\n  if (session) {\n    closeSession(session);\n  }\n  _sendSessionUpdate();\n\n  // the session is over; take it off of the scope\n  isolationScope.setSession();\n\n  // TODO (v8): Remove this and only use the isolation scope(?).\n  // For v7 though, we can't \"soft-break\" people using getCurrentHub().getScope().setSession()\n  currentScope.setSession();\n}\n\n/**\n * Sends the current Session on the scope\n */\nfunction _sendSessionUpdate() {\n  const isolationScope = getIsolationScope();\n  const currentScope = getCurrentScope();\n  const client = getClient();\n  // TODO (v8): Remove currentScope and only use the isolation scope(?).\n  // For v7 though, we can't \"soft-break\" people using getCurrentHub().getScope().setSession()\n  const session = currentScope.getSession() || isolationScope.getSession();\n  if (session && client) {\n    client.captureSession(session);\n  }\n}\n\n/**\n * Sends the current session on the scope to Sentry\n *\n * @param end If set the session will be marked as exited and removed from the scope.\n *            Defaults to `false`.\n */\nfunction captureSession(end = false) {\n  // both send the update and pull the session from the scope\n  if (end) {\n    endSession();\n    return;\n  }\n\n  // only send the update\n  _sendSessionUpdate();\n}\n\nexport { addEventProcessor, captureCheckIn, captureEvent, captureException, captureMessage, captureSession, close, endSession, flush, isEnabled, isInitialized, lastEventId, setContext, setExtra, setExtras, setTag, setTags, setUser, startSession, withMonitor };\n//# sourceMappingURL=exports.js.map\n","import { makeDsn, dsnToString, urlEncode } from '@sentry/utils';\n\nconst SENTRY_API_VERSION = '7';\n\n/** Returns the prefix to construct Sentry ingestion API endpoints. */\nfunction getBaseApiEndpoint(dsn) {\n  const protocol = dsn.protocol ? `${dsn.protocol}:` : '';\n  const port = dsn.port ? `:${dsn.port}` : '';\n  return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : ''}/api/`;\n}\n\n/** Returns the ingest API endpoint for target. */\nfunction _getIngestEndpoint(dsn) {\n  return `${getBaseApiEndpoint(dsn)}${dsn.projectId}/envelope/`;\n}\n\n/** Returns a URL-encoded string with auth config suitable for a query string. */\nfunction _encodedAuth(dsn, sdkInfo) {\n  return urlEncode({\n    // We send only the minimum set of required information. See\n    // https://github.com/getsentry/sentry-javascript/issues/2572.\n    sentry_key: dsn.publicKey,\n    sentry_version: SENTRY_API_VERSION,\n    ...(sdkInfo && { sentry_client: `${sdkInfo.name}/${sdkInfo.version}` }),\n  });\n}\n\n/**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nfunction getEnvelopeEndpointWithUrlEncodedAuth(dsn, tunnel, sdkInfo) {\n  return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, sdkInfo)}`;\n}\n\n/** Returns the url to the report dialog endpoint. */\nfunction getReportDialogEndpoint(\n  dsnLike,\n  dialogOptions\n\n,\n) {\n  const dsn = makeDsn(dsnLike);\n  if (!dsn) {\n    return '';\n  }\n\n  const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n\n  let encodedOptions = `dsn=${dsnToString(dsn)}`;\n  for (const key in dialogOptions) {\n    if (key === 'dsn') {\n      continue;\n    }\n\n    if (key === 'onClose') {\n      continue;\n    }\n\n    if (key === 'user') {\n      const user = dialogOptions.user;\n      if (!user) {\n        continue;\n      }\n      if (user.name) {\n        encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n      }\n      if (user.email) {\n        encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n      }\n    } else {\n      encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key] )}`;\n    }\n  }\n\n  return `${endpoint}?${encodedOptions}`;\n}\n\nexport { getEnvelopeEndpointWithUrlEncodedAuth, getReportDialogEndpoint };\n//# sourceMappingURL=api.js.map\n","import { arrayify, logger } from '@sentry/utils';\nimport { getClient } from './currentScopes.js';\nimport { DEBUG_BUILD } from './debug-build.js';\n\nconst installedIntegrations = [];\n\n/** Map of integrations assigned to a client */\n\n/**\n * Remove duplicates from the given array, preferring the last instance of any duplicate. Not guaranteed to\n * preserve the order of integrations in the array.\n *\n * @private\n */\nfunction filterDuplicates(integrations) {\n  const integrationsByName = {};\n\n  integrations.forEach(currentInstance => {\n    const { name } = currentInstance;\n\n    const existingInstance = integrationsByName[name];\n\n    // We want integrations later in the array to overwrite earlier ones of the same type, except that we never want a\n    // default instance to overwrite an existing user instance\n    if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) {\n      return;\n    }\n\n    integrationsByName[name] = currentInstance;\n  });\n\n  return Object.values(integrationsByName);\n}\n\n/** Gets integrations to install */\nfunction getIntegrationsToSetup(options) {\n  const defaultIntegrations = options.defaultIntegrations || [];\n  const userIntegrations = options.integrations;\n\n  // We flag default instances, so that later we can tell them apart from any user-created instances of the same class\n  defaultIntegrations.forEach(integration => {\n    integration.isDefaultInstance = true;\n  });\n\n  let integrations;\n\n  if (Array.isArray(userIntegrations)) {\n    integrations = [...defaultIntegrations, ...userIntegrations];\n  } else if (typeof userIntegrations === 'function') {\n    integrations = arrayify(userIntegrations(defaultIntegrations));\n  } else {\n    integrations = defaultIntegrations;\n  }\n\n  const finalIntegrations = filterDuplicates(integrations);\n\n  // The `Debug` integration prints copies of the `event` and `hint` which will be passed to `beforeSend` or\n  // `beforeSendTransaction`. It therefore has to run after all other integrations, so that the changes of all event\n  // processors will be reflected in the printed values. For lack of a more elegant way to guarantee that, we therefore\n  // locate it and, assuming it exists, pop it out of its current spot and shove it onto the end of the array.\n  const debugIndex = finalIntegrations.findIndex(integration => integration.name === 'Debug');\n  if (debugIndex > -1) {\n    const [debugInstance] = finalIntegrations.splice(debugIndex, 1) ;\n    finalIntegrations.push(debugInstance);\n  }\n\n  return finalIntegrations;\n}\n\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nfunction setupIntegrations(client, integrations) {\n  const integrationIndex = {};\n\n  integrations.forEach(integration => {\n    // guard against empty provided integrations\n    if (integration) {\n      setupIntegration(client, integration, integrationIndex);\n    }\n  });\n\n  return integrationIndex;\n}\n\n/**\n * Execute the `afterAllSetup` hooks of the given integrations.\n */\nfunction afterSetupIntegrations(client, integrations) {\n  for (const integration of integrations) {\n    // guard against empty provided integrations\n    if (integration && integration.afterAllSetup) {\n      integration.afterAllSetup(client);\n    }\n  }\n}\n\n/** Setup a single integration.  */\nfunction setupIntegration(client, integration, integrationIndex) {\n  if (integrationIndex[integration.name]) {\n    DEBUG_BUILD && logger.log(`Integration skipped because it was already installed: ${integration.name}`);\n    return;\n  }\n  integrationIndex[integration.name] = integration;\n\n  // `setupOnce` is only called the first time\n  if (installedIntegrations.indexOf(integration.name) === -1 && typeof integration.setupOnce === 'function') {\n    integration.setupOnce();\n    installedIntegrations.push(integration.name);\n  }\n\n  // `setup` is run for each client\n  if (integration.setup && typeof integration.setup === 'function') {\n    integration.setup(client);\n  }\n\n  if (typeof integration.preprocessEvent === 'function') {\n    const callback = integration.preprocessEvent.bind(integration) ;\n    client.on('preprocessEvent', (event, hint) => callback(event, hint, client));\n  }\n\n  if (typeof integration.processEvent === 'function') {\n    const callback = integration.processEvent.bind(integration) ;\n\n    const processor = Object.assign((event, hint) => callback(event, hint, client), {\n      id: integration.name,\n    });\n\n    client.addEventProcessor(processor);\n  }\n\n  DEBUG_BUILD && logger.log(`Integration installed: ${integration.name}`);\n}\n\n/** Add an integration to the current scope's client. */\nfunction addIntegration(integration) {\n  const client = getClient();\n\n  if (!client) {\n    DEBUG_BUILD && logger.warn(`Cannot add integration \"${integration.name}\" because no SDK Client is available.`);\n    return;\n  }\n\n  client.addIntegration(integration);\n}\n\n/**\n * Define an integration function that can be used to create an integration instance.\n * Note that this by design hides the implementation details of the integration, as they are considered internal.\n */\nfunction defineIntegration(fn) {\n  return fn;\n}\n\nexport { addIntegration, afterSetupIntegrations, defineIntegration, getIntegrationsToSetup, installedIntegrations, setupIntegration, setupIntegrations };\n//# sourceMappingURL=integration.js.map\n","import { makeDsn, logger, uuid4, checkOrSetAlreadyCaught, isParameterizedString, isPrimitive, resolvedSyncPromise, addItemToEnvelope, createAttachmentEnvelopeItem, SyncPromise, dropUndefinedKeys, rejectedSyncPromise, SentryError, createClientReportEnvelope, dsnToString, isThenable, isPlainObject } from '@sentry/utils';\nimport { getEnvelopeEndpointWithUrlEncodedAuth } from './api.js';\nimport { getIsolationScope } from './currentScopes.js';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { createEventEnvelope, createSessionEnvelope } from './envelope.js';\nimport { setupIntegration, afterSetupIntegrations, setupIntegrations } from './integration.js';\nimport { updateSession } from './session.js';\nimport { getDynamicSamplingContextFromClient } from './tracing/dynamicSamplingContext.js';\nimport { parseSampleRate } from './utils/parseSampleRate.js';\nimport { prepareEvent } from './utils/prepareEvent.js';\n\nconst ALREADY_SEEN_ERROR = \"Not capturing exception because it's already been captured.\";\n\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event, it is passed through\n * {@link BaseClient._prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient<NodeOptions> {\n *   public constructor(options: NodeOptions) {\n *     super(options);\n *   }\n *\n *   // ...\n * }\n */\nclass BaseClient {\n  /** Options passed to the SDK. */\n\n  /** The client Dsn, if specified in options. Without this Dsn, the SDK will be disabled. */\n\n  /** Array of set up integrations. */\n\n  /** Number of calls being processed */\n\n  /** Holds flushable  */\n\n  // eslint-disable-next-line @typescript-eslint/ban-types\n\n  /**\n   * Initializes this client instance.\n   *\n   * @param options Options for the client.\n   */\n   constructor(options) {\n    this._options = options;\n    this._integrations = {};\n    this._numProcessing = 0;\n    this._outcomes = {};\n    this._hooks = {};\n    this._eventProcessors = [];\n\n    if (options.dsn) {\n      this._dsn = makeDsn(options.dsn);\n    } else {\n      DEBUG_BUILD && logger.warn('No DSN provided, client will not send events.');\n    }\n\n    if (this._dsn) {\n      const url = getEnvelopeEndpointWithUrlEncodedAuth(\n        this._dsn,\n        options.tunnel,\n        options._metadata ? options._metadata.sdk : undefined,\n      );\n      this._transport = options.transport({\n        tunnel: this._options.tunnel,\n        recordDroppedEvent: this.recordDroppedEvent.bind(this),\n        ...options.transportOptions,\n        url,\n      });\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n   captureException(exception, hint, scope) {\n    const eventId = uuid4();\n\n    // ensure we haven't captured this very object before\n    if (checkOrSetAlreadyCaught(exception)) {\n      DEBUG_BUILD && logger.log(ALREADY_SEEN_ERROR);\n      return eventId;\n    }\n\n    const hintWithEventId = {\n      event_id: eventId,\n      ...hint,\n    };\n\n    this._process(\n      this.eventFromException(exception, hintWithEventId).then(event =>\n        this._captureEvent(event, hintWithEventId, scope),\n      ),\n    );\n\n    return hintWithEventId.event_id;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   captureMessage(\n    message,\n    level,\n    hint,\n    currentScope,\n  ) {\n    const hintWithEventId = {\n      event_id: uuid4(),\n      ...hint,\n    };\n\n    const eventMessage = isParameterizedString(message) ? message : String(message);\n\n    const promisedEvent = isPrimitive(message)\n      ? this.eventFromMessage(eventMessage, level, hintWithEventId)\n      : this.eventFromException(message, hintWithEventId);\n\n    this._process(promisedEvent.then(event => this._captureEvent(event, hintWithEventId, currentScope)));\n\n    return hintWithEventId.event_id;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   captureEvent(event, hint, currentScope) {\n    const eventId = uuid4();\n\n    // ensure we haven't captured this very object before\n    if (hint && hint.originalException && checkOrSetAlreadyCaught(hint.originalException)) {\n      DEBUG_BUILD && logger.log(ALREADY_SEEN_ERROR);\n      return eventId;\n    }\n\n    const hintWithEventId = {\n      event_id: eventId,\n      ...hint,\n    };\n\n    const sdkProcessingMetadata = event.sdkProcessingMetadata || {};\n    const capturedSpanScope = sdkProcessingMetadata.capturedSpanScope;\n\n    this._process(this._captureEvent(event, hintWithEventId, capturedSpanScope || currentScope));\n\n    return hintWithEventId.event_id;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   captureSession(session) {\n    if (!(typeof session.release === 'string')) {\n      DEBUG_BUILD && logger.warn('Discarded session because of missing or non-string release');\n    } else {\n      this.sendSession(session);\n      // After sending, we set init false to indicate it's not the first occurrence\n      updateSession(session, { init: false });\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n   getDsn() {\n    return this._dsn;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   getOptions() {\n    return this._options;\n  }\n\n  /**\n   * @see SdkMetadata in @sentry/types\n   *\n   * @return The metadata of the SDK\n   */\n   getSdkMetadata() {\n    return this._options._metadata;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   getTransport() {\n    return this._transport;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   flush(timeout) {\n    const transport = this._transport;\n    if (transport) {\n      this.emit('flush');\n      return this._isClientDoneProcessing(timeout).then(clientFinished => {\n        return transport.flush(timeout).then(transportFlushed => clientFinished && transportFlushed);\n      });\n    } else {\n      return resolvedSyncPromise(true);\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n   close(timeout) {\n    return this.flush(timeout).then(result => {\n      this.getOptions().enabled = false;\n      this.emit('close');\n      return result;\n    });\n  }\n\n  /** Get all installed event processors. */\n   getEventProcessors() {\n    return this._eventProcessors;\n  }\n\n  /** @inheritDoc */\n   addEventProcessor(eventProcessor) {\n    this._eventProcessors.push(eventProcessor);\n  }\n\n  /** @inheritdoc */\n   init() {\n    if (\n      this._isEnabled() ||\n      // Force integrations to be setup even if no DSN was set when we have\n      // Spotlight enabled. This is particularly important for browser as we\n      // don't support the `spotlight` option there and rely on the users\n      // adding the `spotlightBrowserIntegration()` to their integrations which\n      // wouldn't get initialized with the check below when there's no DSN set.\n      this._options.integrations.some(({ name }) => name.startsWith('Spotlight'))\n    ) {\n      this._setupIntegrations();\n    }\n  }\n\n  /**\n   * Gets an installed integration by its name.\n   *\n   * @returns The installed integration or `undefined` if no integration with that `name` was installed.\n   */\n   getIntegrationByName(integrationName) {\n    return this._integrations[integrationName] ;\n  }\n\n  /**\n   * @inheritDoc\n   */\n   addIntegration(integration) {\n    const isAlreadyInstalled = this._integrations[integration.name];\n\n    // This hook takes care of only installing if not already installed\n    setupIntegration(this, integration, this._integrations);\n    // Here we need to check manually to make sure to not run this multiple times\n    if (!isAlreadyInstalled) {\n      afterSetupIntegrations(this, [integration]);\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n   sendEvent(event, hint = {}) {\n    this.emit('beforeSendEvent', event, hint);\n\n    let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);\n\n    for (const attachment of hint.attachments || []) {\n      env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment));\n    }\n\n    const promise = this.sendEnvelope(env);\n    if (promise) {\n      promise.then(sendResponse => this.emit('afterSendEvent', event, sendResponse), null);\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n   sendSession(session) {\n    const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);\n\n    // sendEnvelope should not throw\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.sendEnvelope(env);\n  }\n\n  /**\n   * @inheritDoc\n   */\n   recordDroppedEvent(reason, category, eventOrCount) {\n    if (this._options.sendClientReports) {\n      // TODO v9: We do not need the `event` passed as third argument anymore, and can possibly remove this overload\n      // If event is passed as third argument, we assume this is a count of 1\n      const count = typeof eventOrCount === 'number' ? eventOrCount : 1;\n\n      // We want to track each category (error, transaction, session, replay_event) separately\n      // but still keep the distinction between different type of outcomes.\n      // We could use nested maps, but it's much easier to read and type this way.\n      // A correct type for map-based implementation if we want to go that route\n      // would be `Partial<Record<SentryRequestType, Partial<Record<Outcome, number>>>>`\n      // With typescript 4.1 we could even use template literal types\n      const key = `${reason}:${category}`;\n      DEBUG_BUILD && logger.log(`Recording outcome: \"${key}\"${count > 1 ? ` (${count} times)` : ''}`);\n      this._outcomes[key] = (this._outcomes[key] || 0) + count;\n    }\n  }\n\n  // Keep on() & emit() signatures in sync with types' client.ts interface\n  /* eslint-disable @typescript-eslint/unified-signatures */\n\n  /** @inheritdoc */\n\n  /** @inheritdoc */\n   on(hook, callback) {\n    const hooks = (this._hooks[hook] = this._hooks[hook] || []);\n\n    // @ts-expect-error We assue the types are correct\n    hooks.push(callback);\n\n    // This function returns a callback execution handler that, when invoked,\n    // deregisters a callback. This is crucial for managing instances where callbacks\n    // need to be unregistered to prevent self-referencing in callback closures,\n    // ensuring proper garbage collection.\n    return () => {\n      // @ts-expect-error We assue the types are correct\n      const cbIndex = hooks.indexOf(callback);\n      if (cbIndex > -1) {\n        hooks.splice(cbIndex, 1);\n      }\n    };\n  }\n\n  /** @inheritdoc */\n\n  /** @inheritdoc */\n   emit(hook, ...rest) {\n    const callbacks = this._hooks[hook];\n    if (callbacks) {\n      callbacks.forEach(callback => callback(...rest));\n    }\n  }\n\n  /**\n   * @inheritdoc\n   */\n   sendEnvelope(envelope) {\n    this.emit('beforeEnvelope', envelope);\n\n    if (this._isEnabled() && this._transport) {\n      return this._transport.send(envelope).then(null, reason => {\n        DEBUG_BUILD && logger.error('Error while sending event:', reason);\n        return reason;\n      });\n    }\n\n    DEBUG_BUILD && logger.error('Transport disabled');\n\n    return resolvedSyncPromise({});\n  }\n\n  /* eslint-enable @typescript-eslint/unified-signatures */\n\n  /** Setup integrations for this client. */\n   _setupIntegrations() {\n    const { integrations } = this._options;\n    this._integrations = setupIntegrations(this, integrations);\n    afterSetupIntegrations(this, integrations);\n  }\n\n  /** Updates existing session based on the provided event */\n   _updateSessionFromEvent(session, event) {\n    let crashed = false;\n    let errored = false;\n    const exceptions = event.exception && event.exception.values;\n\n    if (exceptions) {\n      errored = true;\n\n      for (const ex of exceptions) {\n        const mechanism = ex.mechanism;\n        if (mechanism && mechanism.handled === false) {\n          crashed = true;\n          break;\n        }\n      }\n    }\n\n    // A session is updated and that session update is sent in only one of the two following scenarios:\n    // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update\n    // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update\n    const sessionNonTerminal = session.status === 'ok';\n    const shouldUpdateAndSend = (sessionNonTerminal && session.errors === 0) || (sessionNonTerminal && crashed);\n\n    if (shouldUpdateAndSend) {\n      updateSession(session, {\n        ...(crashed && { status: 'crashed' }),\n        errors: session.errors || Number(errored || crashed),\n      });\n      this.captureSession(session);\n    }\n  }\n\n  /**\n   * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying\n   * \"no\" (resolving to `false`) in order to give the client a chance to potentially finish first.\n   *\n   * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not\n   * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to\n   * `true`.\n   * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and\n   * `false` otherwise\n   */\n   _isClientDoneProcessing(timeout) {\n    return new SyncPromise(resolve => {\n      let ticked = 0;\n      const tick = 1;\n\n      const interval = setInterval(() => {\n        if (this._numProcessing == 0) {\n          clearInterval(interval);\n          resolve(true);\n        } else {\n          ticked += tick;\n          if (timeout && ticked >= timeout) {\n            clearInterval(interval);\n            resolve(false);\n          }\n        }\n      }, tick);\n    });\n  }\n\n  /** Determines whether this SDK is enabled and a transport is present. */\n   _isEnabled() {\n    return this.getOptions().enabled !== false && this._transport !== undefined;\n  }\n\n  /**\n   * Adds common information to events.\n   *\n   * The information includes release and environment from `options`,\n   * breadcrumbs and context (extra, tags and user) from the scope.\n   *\n   * Information that is already present in the event is never overwritten. For\n   * nested objects, such as the context, keys are merged.\n   *\n   * @param event The original event.\n   * @param hint May contain additional information about the original exception.\n   * @param currentScope A scope containing event metadata.\n   * @returns A new event with more information.\n   */\n   _prepareEvent(\n    event,\n    hint,\n    currentScope,\n    isolationScope = getIsolationScope(),\n  ) {\n    const options = this.getOptions();\n    const integrations = Object.keys(this._integrations);\n    if (!hint.integrations && integrations.length > 0) {\n      hint.integrations = integrations;\n    }\n\n    this.emit('preprocessEvent', event, hint);\n\n    if (!event.type) {\n      isolationScope.setLastEventId(event.event_id || hint.event_id);\n    }\n\n    return prepareEvent(options, event, hint, currentScope, this, isolationScope).then(evt => {\n      if (evt === null) {\n        return evt;\n      }\n\n      const propagationContext = {\n        ...isolationScope.getPropagationContext(),\n        ...(currentScope ? currentScope.getPropagationContext() : undefined),\n      };\n\n      const trace = evt.contexts && evt.contexts.trace;\n      if (!trace && propagationContext) {\n        const { traceId: trace_id, spanId, parentSpanId, dsc } = propagationContext;\n        evt.contexts = {\n          trace: dropUndefinedKeys({\n            trace_id,\n            span_id: spanId,\n            parent_span_id: parentSpanId,\n          }),\n          ...evt.contexts,\n        };\n\n        const dynamicSamplingContext = dsc ? dsc : getDynamicSamplingContextFromClient(trace_id, this);\n\n        evt.sdkProcessingMetadata = {\n          dynamicSamplingContext,\n          ...evt.sdkProcessingMetadata,\n        };\n      }\n      return evt;\n    });\n  }\n\n  /**\n   * Processes the event and logs an error in case of rejection\n   * @param event\n   * @param hint\n   * @param scope\n   */\n   _captureEvent(event, hint = {}, scope) {\n    return this._processEvent(event, hint, scope).then(\n      finalEvent => {\n        return finalEvent.event_id;\n      },\n      reason => {\n        if (DEBUG_BUILD) {\n          // If something's gone wrong, log the error as a warning. If it's just us having used a `SentryError` for\n          // control flow, log just the message (no stack) as a log-level log.\n          const sentryError = reason ;\n          if (sentryError.logLevel === 'log') {\n            logger.log(sentryError.message);\n          } else {\n            logger.warn(sentryError);\n          }\n        }\n        return undefined;\n      },\n    );\n  }\n\n  /**\n   * Processes an event (either error or message) and sends it to Sentry.\n   *\n   * This also adds breadcrumbs and context information to the event. However,\n   * platform specific meta data (such as the User's IP address) must be added\n   * by the SDK implementor.\n   *\n   *\n   * @param event The event to send to Sentry.\n   * @param hint May contain additional information about the original exception.\n   * @param currentScope A scope containing event metadata.\n   * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n   */\n   _processEvent(event, hint, currentScope) {\n    const options = this.getOptions();\n    const { sampleRate } = options;\n\n    const isTransaction = isTransactionEvent(event);\n    const isError = isErrorEvent(event);\n    const eventType = event.type || 'error';\n    const beforeSendLabel = `before send for type \\`${eventType}\\``;\n\n    // 1.0 === 100% events are sent\n    // 0.0 === 0% events are sent\n    // Sampling for transaction happens somewhere else\n    const parsedSampleRate = typeof sampleRate === 'undefined' ? undefined : parseSampleRate(sampleRate);\n    if (isError && typeof parsedSampleRate === 'number' && Math.random() > parsedSampleRate) {\n      this.recordDroppedEvent('sample_rate', 'error', event);\n      return rejectedSyncPromise(\n        new SentryError(\n          `Discarding event because it's not included in the random sample (sampling rate = ${sampleRate})`,\n          'log',\n        ),\n      );\n    }\n\n    const dataCategory = eventType === 'replay_event' ? 'replay' : eventType;\n\n    const sdkProcessingMetadata = event.sdkProcessingMetadata || {};\n    const capturedSpanIsolationScope = sdkProcessingMetadata.capturedSpanIsolationScope;\n\n    return this._prepareEvent(event, hint, currentScope, capturedSpanIsolationScope)\n      .then(prepared => {\n        if (prepared === null) {\n          this.recordDroppedEvent('event_processor', dataCategory, event);\n          throw new SentryError('An event processor returned `null`, will not send event.', 'log');\n        }\n\n        const isInternalException = hint.data && (hint.data ).__sentry__ === true;\n        if (isInternalException) {\n          return prepared;\n        }\n\n        const result = processBeforeSend(this, options, prepared, hint);\n        return _validateBeforeSendResult(result, beforeSendLabel);\n      })\n      .then(processedEvent => {\n        if (processedEvent === null) {\n          this.recordDroppedEvent('before_send', dataCategory, event);\n          if (isTransaction) {\n            const spans = event.spans || [];\n            // the transaction itself counts as one span, plus all the child spans that are added\n            const spanCount = 1 + spans.length;\n            this.recordDroppedEvent('before_send', 'span', spanCount);\n          }\n          throw new SentryError(`${beforeSendLabel} returned \\`null\\`, will not send event.`, 'log');\n        }\n\n        const session = currentScope && currentScope.getSession();\n        if (!isTransaction && session) {\n          this._updateSessionFromEvent(session, processedEvent);\n        }\n\n        if (isTransaction) {\n          const spanCountBefore =\n            (processedEvent.sdkProcessingMetadata && processedEvent.sdkProcessingMetadata.spanCountBeforeProcessing) ||\n            0;\n          const spanCountAfter = processedEvent.spans ? processedEvent.spans.length : 0;\n\n          const droppedSpanCount = spanCountBefore - spanCountAfter;\n          if (droppedSpanCount > 0) {\n            this.recordDroppedEvent('before_send', 'span', droppedSpanCount);\n          }\n        }\n\n        // None of the Sentry built event processor will update transaction name,\n        // so if the transaction name has been changed by an event processor, we know\n        // it has to come from custom event processor added by a user\n        const transactionInfo = processedEvent.transaction_info;\n        if (isTransaction && transactionInfo && processedEvent.transaction !== event.transaction) {\n          const source = 'custom';\n          processedEvent.transaction_info = {\n            ...transactionInfo,\n            source,\n          };\n        }\n\n        this.sendEvent(processedEvent, hint);\n        return processedEvent;\n      })\n      .then(null, reason => {\n        if (reason instanceof SentryError) {\n          throw reason;\n        }\n\n        this.captureException(reason, {\n          data: {\n            __sentry__: true,\n          },\n          originalException: reason,\n        });\n        throw new SentryError(\n          `Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: ${reason}`,\n        );\n      });\n  }\n\n  /**\n   * Occupies the client with processing and event\n   */\n   _process(promise) {\n    this._numProcessing++;\n    void promise.then(\n      value => {\n        this._numProcessing--;\n        return value;\n      },\n      reason => {\n        this._numProcessing--;\n        return reason;\n      },\n    );\n  }\n\n  /**\n   * Clears outcomes on this client and returns them.\n   */\n   _clearOutcomes() {\n    const outcomes = this._outcomes;\n    this._outcomes = {};\n    return Object.entries(outcomes).map(([key, quantity]) => {\n      const [reason, category] = key.split(':') ;\n      return {\n        reason,\n        category,\n        quantity,\n      };\n    });\n  }\n\n  /**\n   * Sends client reports as an envelope.\n   */\n   _flushOutcomes() {\n    DEBUG_BUILD && logger.log('Flushing outcomes...');\n\n    const outcomes = this._clearOutcomes();\n\n    if (outcomes.length === 0) {\n      DEBUG_BUILD && logger.log('No outcomes to send');\n      return;\n    }\n\n    // This is really the only place where we want to check for a DSN and only send outcomes then\n    if (!this._dsn) {\n      DEBUG_BUILD && logger.log('No dsn provided, will not send outcomes');\n      return;\n    }\n\n    DEBUG_BUILD && logger.log('Sending outcomes:', outcomes);\n\n    const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn));\n\n    // sendEnvelope should not throw\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.sendEnvelope(envelope);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n}\n\n/**\n * Verifies that return value of configured `beforeSend` or `beforeSendTransaction` is of expected type, and returns the value if so.\n */\nfunction _validateBeforeSendResult(\n  beforeSendResult,\n  beforeSendLabel,\n) {\n  const invalidValueError = `${beforeSendLabel} must return \\`null\\` or a valid event.`;\n  if (isThenable(beforeSendResult)) {\n    return beforeSendResult.then(\n      event => {\n        if (!isPlainObject(event) && event !== null) {\n          throw new SentryError(invalidValueError);\n        }\n        return event;\n      },\n      e => {\n        throw new SentryError(`${beforeSendLabel} rejected with ${e}`);\n      },\n    );\n  } else if (!isPlainObject(beforeSendResult) && beforeSendResult !== null) {\n    throw new SentryError(invalidValueError);\n  }\n  return beforeSendResult;\n}\n\n/**\n * Process the matching `beforeSendXXX` callback.\n */\nfunction processBeforeSend(\n  client,\n  options,\n  event,\n  hint,\n) {\n  const { beforeSend, beforeSendTransaction, beforeSendSpan } = options;\n\n  if (isErrorEvent(event) && beforeSend) {\n    return beforeSend(event, hint);\n  }\n\n  if (isTransactionEvent(event)) {\n    if (event.spans && beforeSendSpan) {\n      const processedSpans = [];\n      for (const span of event.spans) {\n        const processedSpan = beforeSendSpan(span);\n        if (processedSpan) {\n          processedSpans.push(processedSpan);\n        } else {\n          client.recordDroppedEvent('before_send', 'span');\n        }\n      }\n      event.spans = processedSpans;\n    }\n\n    if (beforeSendTransaction) {\n      if (event.spans) {\n        // We store the # of spans before processing in SDK metadata,\n        // so we can compare it afterwards to determine how many spans were dropped\n        const spanCountBefore = event.spans.length;\n        event.sdkProcessingMetadata = {\n          ...event.sdkProcessingMetadata,\n          spanCountBeforeProcessing: spanCountBefore,\n        };\n      }\n      return beforeSendTransaction(event, hint);\n    }\n  }\n\n  return event;\n}\n\nfunction isErrorEvent(event) {\n  return event.type === undefined;\n}\n\nfunction isTransactionEvent(event) {\n  return event.type === 'transaction';\n}\n\nexport { BaseClient };\n//# sourceMappingURL=baseclient.js.map\n","import { logger, consoleSandbox } from '@sentry/utils';\nimport { getCurrentScope } from './currentScopes.js';\nimport { DEBUG_BUILD } from './debug-build.js';\n\n/** A class object that can instantiate Client objects. */\n\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instantiate.\n * @param options Options to pass to the client.\n */\nfunction initAndBind(\n  clientClass,\n  options,\n) {\n  if (options.debug === true) {\n    if (DEBUG_BUILD) {\n      logger.enable();\n    } else {\n      // use `console.warn` rather than `logger.warn` since by non-debug bundles have all `logger.x` statements stripped\n      consoleSandbox(() => {\n        // eslint-disable-next-line no-console\n        console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n      });\n    }\n  }\n  const scope = getCurrentScope();\n  scope.update(options.initialScope);\n\n  const client = new clientClass(options);\n  setCurrentClient(client);\n  client.init();\n  return client;\n}\n\n/**\n * Make the given client the current client.\n */\nfunction setCurrentClient(client) {\n  getCurrentScope().setClient(client);\n}\n\nexport { initAndBind, setCurrentClient };\n//# sourceMappingURL=sdk.js.map\n","import { makePromiseBuffer, forEachEnvelopeItem, envelopeItemTypeToDataCategory, isRateLimited, resolvedSyncPromise, createEnvelope, SentryError, logger, serializeEnvelope, updateRateLimits } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\n\nconst DEFAULT_TRANSPORT_BUFFER_SIZE = 64;\n\n/**\n * Creates an instance of a Sentry `Transport`\n *\n * @param options\n * @param makeRequest\n */\nfunction createTransport(\n  options,\n  makeRequest,\n  buffer = makePromiseBuffer(\n    options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE,\n  ),\n) {\n  let rateLimits = {};\n  const flush = (timeout) => buffer.drain(timeout);\n\n  function send(envelope) {\n    const filteredEnvelopeItems = [];\n\n    // Drop rate limited items from envelope\n    forEachEnvelopeItem(envelope, (item, type) => {\n      const dataCategory = envelopeItemTypeToDataCategory(type);\n      if (isRateLimited(rateLimits, dataCategory)) {\n        const event = getEventForEnvelopeItem(item, type);\n        options.recordDroppedEvent('ratelimit_backoff', dataCategory, event);\n      } else {\n        filteredEnvelopeItems.push(item);\n      }\n    });\n\n    // Skip sending if envelope is empty after filtering out rate limited events\n    if (filteredEnvelopeItems.length === 0) {\n      return resolvedSyncPromise({});\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const filteredEnvelope = createEnvelope(envelope[0], filteredEnvelopeItems );\n\n    // Creates client report for each item in an envelope\n    const recordEnvelopeLoss = (reason) => {\n      forEachEnvelopeItem(filteredEnvelope, (item, type) => {\n        const event = getEventForEnvelopeItem(item, type);\n        options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type), event);\n      });\n    };\n\n    const requestTask = () =>\n      makeRequest({ body: serializeEnvelope(filteredEnvelope) }).then(\n        response => {\n          // We don't want to throw on NOK responses, but we want to at least log them\n          if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) {\n            DEBUG_BUILD && logger.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);\n          }\n\n          rateLimits = updateRateLimits(rateLimits, response);\n          return response;\n        },\n        error => {\n          recordEnvelopeLoss('network_error');\n          throw error;\n        },\n      );\n\n    return buffer.add(requestTask).then(\n      result => result,\n      error => {\n        if (error instanceof SentryError) {\n          DEBUG_BUILD && logger.error('Skipped sending event because buffer is full.');\n          recordEnvelopeLoss('queue_overflow');\n          return resolvedSyncPromise({});\n        } else {\n          throw error;\n        }\n      },\n    );\n  }\n\n  return {\n    send,\n    flush,\n  };\n}\n\nfunction getEventForEnvelopeItem(item, type) {\n  if (type !== 'event' && type !== 'transaction') {\n    return undefined;\n  }\n\n  return Array.isArray(item) ? (item )[1] : undefined;\n}\n\nexport { DEFAULT_TRANSPORT_BUFFER_SIZE, createTransport };\n//# sourceMappingURL=base.js.map\n","import { SDK_VERSION } from '@sentry/utils';\n\n/**\n * A builder for the SDK metadata in the options for the SDK initialization.\n *\n * Note: This function is identical to `buildMetadata` in Remix and NextJS and SvelteKit.\n * We don't extract it for bundle size reasons.\n * @see https://github.com/getsentry/sentry-javascript/pull/7404\n * @see https://github.com/getsentry/sentry-javascript/pull/4196\n *\n * If you make changes to this function consider updating the others as well.\n *\n * @param options SDK options object that gets mutated\n * @param names list of package names\n */\nfunction applySdkMetadata(options, name, names = [name], source = 'npm') {\n  const metadata = options._metadata || {};\n\n  if (!metadata.sdk) {\n    metadata.sdk = {\n      name: `sentry.javascript.${name}`,\n      packages: names.map(name => ({\n        name: `${source}:@sentry/${name}`,\n        version: SDK_VERSION,\n      })),\n      version: SDK_VERSION,\n    };\n  }\n\n  options._metadata = metadata;\n}\n\nexport { applySdkMetadata };\n//# sourceMappingURL=sdkMetadata.js.map\n","import { dateTimestampInSeconds, consoleSandbox } from '@sentry/utils';\nimport { getClient, getIsolationScope } from './currentScopes.js';\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 100;\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n */\nfunction addBreadcrumb(breadcrumb, hint) {\n  const client = getClient();\n  const isolationScope = getIsolationScope();\n\n  if (!client) return;\n\n  const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } = client.getOptions();\n\n  if (maxBreadcrumbs <= 0) return;\n\n  const timestamp = dateTimestampInSeconds();\n  const mergedBreadcrumb = { timestamp, ...breadcrumb };\n  const finalBreadcrumb = beforeBreadcrumb\n    ? (consoleSandbox(() => beforeBreadcrumb(mergedBreadcrumb, hint)) )\n    : mergedBreadcrumb;\n\n  if (finalBreadcrumb === null) return;\n\n  if (client.emit) {\n    client.emit('beforeAddBreadcrumb', finalBreadcrumb, hint);\n  }\n\n  isolationScope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);\n}\n\nexport { addBreadcrumb };\n//# sourceMappingURL=breadcrumbs.js.map\n","import { getOriginalFunction } from '@sentry/utils';\nimport { getClient } from '../currentScopes.js';\nimport { defineIntegration } from '../integration.js';\n\nlet originalFunctionToString;\n\nconst INTEGRATION_NAME = 'FunctionToString';\n\nconst SETUP_CLIENTS = new WeakMap();\n\nconst _functionToStringIntegration = (() => {\n  return {\n    name: INTEGRATION_NAME,\n    setupOnce() {\n      // eslint-disable-next-line @typescript-eslint/unbound-method\n      originalFunctionToString = Function.prototype.toString;\n\n      // intrinsics (like Function.prototype) might be immutable in some environments\n      // e.g. Node with --frozen-intrinsics, XS (an embedded JavaScript engine) or SES (a JavaScript proposal)\n      try {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        Function.prototype.toString = function ( ...args) {\n          const originalFunction = getOriginalFunction(this);\n          const context =\n            SETUP_CLIENTS.has(getClient() ) && originalFunction !== undefined ? originalFunction : this;\n          return originalFunctionToString.apply(context, args);\n        };\n      } catch (e) {\n        // ignore errors here, just don't patch this\n      }\n    },\n    setup(client) {\n      SETUP_CLIENTS.set(client, true);\n    },\n  };\n}) ;\n\n/**\n * Patch toString calls to return proper name for wrapped functions.\n *\n * ```js\n * Sentry.init({\n *   integrations: [\n *     functionToStringIntegration(),\n *   ],\n * });\n * ```\n */\nconst functionToStringIntegration = defineIntegration(_functionToStringIntegration);\n\nexport { functionToStringIntegration };\n//# sourceMappingURL=functiontostring.js.map\n","import { logger, getEventDescription, stringMatchesSomePattern } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { defineIntegration } from '../integration.js';\n\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nconst DEFAULT_IGNORE_ERRORS = [\n  /^Script error\\.?$/,\n  /^Javascript error: Script error\\.? on line 0$/,\n  /^ResizeObserver loop completed with undelivered notifications.$/, // The browser logs this when a ResizeObserver handler takes a bit longer. Usually this is not an actual issue though. It indicates slowness.\n  /^Cannot redefine property: googletag$/, // This is thrown when google tag manager is used in combination with an ad blocker\n  \"undefined is not an object (evaluating 'a.L')\", // Random error that happens but not actionable or noticeable to end-users.\n  'can\\'t redefine non-configurable property \"solana\"', // Probably a browser extension or custom browser (Brave) throwing this error\n  \"vv().getRestrictions is not a function. (In 'vv().getRestrictions(1,a)', 'vv().getRestrictions' is undefined)\", // Error thrown by GTM, seemingly not affecting end-users\n  \"Can't find variable: _AutofillCallbackHandler\", // Unactionable error in instagram webview https://developers.facebook.com/community/threads/320013549791141/\n];\n\n/** Options for the InboundFilters integration */\n\nconst INTEGRATION_NAME = 'InboundFilters';\nconst _inboundFiltersIntegration = ((options = {}) => {\n  return {\n    name: INTEGRATION_NAME,\n    processEvent(event, _hint, client) {\n      const clientOptions = client.getOptions();\n      const mergedOptions = _mergeOptions(options, clientOptions);\n      return _shouldDropEvent(event, mergedOptions) ? null : event;\n    },\n  };\n}) ;\n\nconst inboundFiltersIntegration = defineIntegration(_inboundFiltersIntegration);\n\nfunction _mergeOptions(\n  internalOptions = {},\n  clientOptions = {},\n) {\n  return {\n    allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])],\n    denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])],\n    ignoreErrors: [\n      ...(internalOptions.ignoreErrors || []),\n      ...(clientOptions.ignoreErrors || []),\n      ...(internalOptions.disableErrorDefaults ? [] : DEFAULT_IGNORE_ERRORS),\n    ],\n    ignoreTransactions: [...(internalOptions.ignoreTransactions || []), ...(clientOptions.ignoreTransactions || [])],\n    ignoreInternal: internalOptions.ignoreInternal !== undefined ? internalOptions.ignoreInternal : true,\n  };\n}\n\nfunction _shouldDropEvent(event, options) {\n  if (options.ignoreInternal && _isSentryError(event)) {\n    DEBUG_BUILD &&\n      logger.warn(`Event dropped due to being internal Sentry Error.\\nEvent: ${getEventDescription(event)}`);\n    return true;\n  }\n  if (_isIgnoredError(event, options.ignoreErrors)) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n      );\n    return true;\n  }\n  if (_isUselessError(event)) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `Event dropped due to not having an error message, error type or stacktrace.\\nEvent: ${getEventDescription(\n          event,\n        )}`,\n      );\n    return true;\n  }\n  if (_isIgnoredTransaction(event, options.ignoreTransactions)) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `Event dropped due to being matched by \\`ignoreTransactions\\` option.\\nEvent: ${getEventDescription(event)}`,\n      );\n    return true;\n  }\n  if (_isDeniedUrl(event, options.denyUrls)) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `Event dropped due to being matched by \\`denyUrls\\` option.\\nEvent: ${getEventDescription(\n          event,\n        )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n      );\n    return true;\n  }\n  if (!_isAllowedUrl(event, options.allowUrls)) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `Event dropped due to not being matched by \\`allowUrls\\` option.\\nEvent: ${getEventDescription(\n          event,\n        )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n      );\n    return true;\n  }\n  return false;\n}\n\nfunction _isIgnoredError(event, ignoreErrors) {\n  // If event.type, this is not an error\n  if (event.type || !ignoreErrors || !ignoreErrors.length) {\n    return false;\n  }\n\n  return _getPossibleEventMessages(event).some(message => stringMatchesSomePattern(message, ignoreErrors));\n}\n\nfunction _isIgnoredTransaction(event, ignoreTransactions) {\n  if (event.type !== 'transaction' || !ignoreTransactions || !ignoreTransactions.length) {\n    return false;\n  }\n\n  const name = event.transaction;\n  return name ? stringMatchesSomePattern(name, ignoreTransactions) : false;\n}\n\nfunction _isDeniedUrl(event, denyUrls) {\n  // TODO: Use Glob instead?\n  if (!denyUrls || !denyUrls.length) {\n    return false;\n  }\n  const url = _getEventFilterUrl(event);\n  return !url ? false : stringMatchesSomePattern(url, denyUrls);\n}\n\nfunction _isAllowedUrl(event, allowUrls) {\n  // TODO: Use Glob instead?\n  if (!allowUrls || !allowUrls.length) {\n    return true;\n  }\n  const url = _getEventFilterUrl(event);\n  return !url ? true : stringMatchesSomePattern(url, allowUrls);\n}\n\nfunction _getPossibleEventMessages(event) {\n  const possibleMessages = [];\n\n  if (event.message) {\n    possibleMessages.push(event.message);\n  }\n\n  let lastException;\n  try {\n    // @ts-expect-error Try catching to save bundle size\n    lastException = event.exception.values[event.exception.values.length - 1];\n  } catch (e) {\n    // try catching to save bundle size checking existence of variables\n  }\n\n  if (lastException) {\n    if (lastException.value) {\n      possibleMessages.push(lastException.value);\n      if (lastException.type) {\n        possibleMessages.push(`${lastException.type}: ${lastException.value}`);\n      }\n    }\n  }\n\n  return possibleMessages;\n}\n\nfunction _isSentryError(event) {\n  try {\n    // @ts-expect-error can't be a sentry error if undefined\n    return event.exception.values[0].type === 'SentryError';\n  } catch (e) {\n    // ignore\n  }\n  return false;\n}\n\nfunction _getLastValidUrl(frames = []) {\n  for (let i = frames.length - 1; i >= 0; i--) {\n    const frame = frames[i];\n\n    if (frame && frame.filename !== '<anonymous>' && frame.filename !== '[native code]') {\n      return frame.filename || null;\n    }\n  }\n\n  return null;\n}\n\nfunction _getEventFilterUrl(event) {\n  try {\n    let frames;\n    try {\n      // @ts-expect-error we only care about frames if the whole thing here is defined\n      frames = event.exception.values[0].stacktrace.frames;\n    } catch (e) {\n      // ignore\n    }\n    return frames ? _getLastValidUrl(frames) : null;\n  } catch (oO) {\n    DEBUG_BUILD && logger.error(`Cannot extract url for event ${getEventDescription(event)}`);\n    return null;\n  }\n}\n\nfunction _isUselessError(event) {\n  if (event.type) {\n    // event is not an error\n    return false;\n  }\n\n  // We only want to consider events for dropping that actually have recorded exception values.\n  if (!event.exception || !event.exception.values || event.exception.values.length === 0) {\n    return false;\n  }\n\n  return (\n    // No top-level message\n    !event.message &&\n    // There are no exception values that have a stacktrace, a non-generic-Error type or value\n    !event.exception.values.some(value => value.stacktrace || (value.type && value.type !== 'Error') || value.value)\n  );\n}\n\nexport { inboundFiltersIntegration };\n//# sourceMappingURL=inboundfilters.js.map\n","import { logger, getFramesFromEvent } from '@sentry/utils';\nimport { defineIntegration } from '../integration.js';\nimport { DEBUG_BUILD } from '../debug-build.js';\n\nconst INTEGRATION_NAME = 'Dedupe';\n\nconst _dedupeIntegration = (() => {\n  let previousEvent;\n\n  return {\n    name: INTEGRATION_NAME,\n    processEvent(currentEvent) {\n      // We want to ignore any non-error type events, e.g. transactions or replays\n      // These should never be deduped, and also not be compared against as _previousEvent.\n      if (currentEvent.type) {\n        return currentEvent;\n      }\n\n      // Juuust in case something goes wrong\n      try {\n        if (_shouldDropEvent(currentEvent, previousEvent)) {\n          DEBUG_BUILD && logger.warn('Event dropped due to being a duplicate of previously captured event.');\n          return null;\n        }\n      } catch (_oO) {} // eslint-disable-line no-empty\n\n      return (previousEvent = currentEvent);\n    },\n  };\n}) ;\n\n/**\n * Deduplication filter.\n */\nconst dedupeIntegration = defineIntegration(_dedupeIntegration);\n\n/** only exported for tests. */\nfunction _shouldDropEvent(currentEvent, previousEvent) {\n  if (!previousEvent) {\n    return false;\n  }\n\n  if (_isSameMessageEvent(currentEvent, previousEvent)) {\n    return true;\n  }\n\n  if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction _isSameMessageEvent(currentEvent, previousEvent) {\n  const currentMessage = currentEvent.message;\n  const previousMessage = previousEvent.message;\n\n  // If neither event has a message property, they were both exceptions, so bail out\n  if (!currentMessage && !previousMessage) {\n    return false;\n  }\n\n  // If only one event has a stacktrace, but not the other one, they are not the same\n  if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n    return false;\n  }\n\n  if (currentMessage !== previousMessage) {\n    return false;\n  }\n\n  if (!_isSameFingerprint(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  if (!_isSameStacktrace(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction _isSameExceptionEvent(currentEvent, previousEvent) {\n  const previousException = _getExceptionFromEvent(previousEvent);\n  const currentException = _getExceptionFromEvent(currentEvent);\n\n  if (!previousException || !currentException) {\n    return false;\n  }\n\n  if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n    return false;\n  }\n\n  if (!_isSameFingerprint(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  if (!_isSameStacktrace(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction _isSameStacktrace(currentEvent, previousEvent) {\n  let currentFrames = getFramesFromEvent(currentEvent);\n  let previousFrames = getFramesFromEvent(previousEvent);\n\n  // If neither event has a stacktrace, they are assumed to be the same\n  if (!currentFrames && !previousFrames) {\n    return true;\n  }\n\n  // If only one event has a stacktrace, but not the other one, they are not the same\n  if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n    return false;\n  }\n\n  currentFrames = currentFrames ;\n  previousFrames = previousFrames ;\n\n  // If number of frames differ, they are not the same\n  if (previousFrames.length !== currentFrames.length) {\n    return false;\n  }\n\n  // Otherwise, compare the two\n  for (let i = 0; i < previousFrames.length; i++) {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const frameA = previousFrames[i];\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const frameB = currentFrames[i];\n\n    if (\n      frameA.filename !== frameB.filename ||\n      frameA.lineno !== frameB.lineno ||\n      frameA.colno !== frameB.colno ||\n      frameA.function !== frameB.function\n    ) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction _isSameFingerprint(currentEvent, previousEvent) {\n  let currentFingerprint = currentEvent.fingerprint;\n  let previousFingerprint = previousEvent.fingerprint;\n\n  // If neither event has a fingerprint, they are assumed to be the same\n  if (!currentFingerprint && !previousFingerprint) {\n    return true;\n  }\n\n  // If only one event has a fingerprint, but not the other one, they are not the same\n  if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n    return false;\n  }\n\n  currentFingerprint = currentFingerprint ;\n  previousFingerprint = previousFingerprint ;\n\n  // Otherwise, compare the two\n  try {\n    return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n  } catch (_oO) {\n    return false;\n  }\n}\n\nfunction _getExceptionFromEvent(event) {\n  return event.exception && event.exception.values && event.exception.values[0];\n}\n\nexport { _shouldDropEvent, dedupeIntegration };\n//# sourceMappingURL=dedupe.js.map\n","import { withScope, captureException } from '@sentry/core';\nimport { GLOBAL_OBJ, getOriginalFunction, markFunctionWrapped, addNonEnumerableProperty, addExceptionTypeValue, addExceptionMechanism } from '@sentry/utils';\n\nconst WINDOW = GLOBAL_OBJ ;\n\nlet ignoreOnError = 0;\n\n/**\n * @hidden\n */\nfunction shouldIgnoreOnError() {\n  return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nfunction ignoreNextOnError() {\n  // onerror should trigger before setTimeout\n  ignoreOnError++;\n  setTimeout(() => {\n    ignoreOnError--;\n  });\n}\n\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap. It is generally safe to pass an unbound function, because the returned wrapper always\n * has a correct `this` context.\n * @returns The wrapped function.\n * @hidden\n */\nfunction wrap(\n  fn,\n  options\n\n = {},\n  before,\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n) {\n  // for future readers what this does is wrap a function and then create\n  // a bi-directional wrapping between them.\n  //\n  // example: wrapped = wrap(original);\n  //  original.__sentry_wrapped__ -> wrapped\n  //  wrapped.__sentry_original__ -> original\n\n  if (typeof fn !== 'function') {\n    return fn;\n  }\n\n  try {\n    // if we're dealing with a function that was previously wrapped, return\n    // the original wrapper.\n    const wrapper = fn.__sentry_wrapped__;\n    if (wrapper) {\n      if (typeof wrapper === 'function') {\n        return wrapper;\n      } else {\n        // If we find that the `__sentry_wrapped__` function is not a function at the time of accessing it, it means\n        // that something messed with it. In that case we want to return the originally passed function.\n        return fn;\n      }\n    }\n\n    // We don't wanna wrap it twice\n    if (getOriginalFunction(fn)) {\n      return fn;\n    }\n  } catch (e) {\n    // Just accessing custom props in some Selenium environments\n    // can cause a \"Permission denied\" exception (see raven-js#495).\n    // Bail on wrapping and return the function as-is (defers to window.onerror).\n    return fn;\n  }\n\n  /* eslint-disable prefer-rest-params */\n  // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this`\n  const sentryWrapped = function () {\n    const args = Array.prototype.slice.call(arguments);\n\n    try {\n      if (before && typeof before === 'function') {\n        before.apply(this, arguments);\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n      const wrappedArguments = args.map((arg) => wrap(arg, options));\n\n      // Attempt to invoke user-land function\n      // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n      //       means the sentry.javascript SDK caught an error invoking your application code. This\n      //       is expected behavior and NOT indicative of a bug with sentry.javascript.\n      return fn.apply(this, wrappedArguments);\n    } catch (ex) {\n      ignoreNextOnError();\n\n      withScope(scope => {\n        scope.addEventProcessor(event => {\n          if (options.mechanism) {\n            addExceptionTypeValue(event, undefined, undefined);\n            addExceptionMechanism(event, options.mechanism);\n          }\n\n          event.extra = {\n            ...event.extra,\n            arguments: args,\n          };\n\n          return event;\n        });\n\n        captureException(ex);\n      });\n\n      throw ex;\n    }\n  };\n  /* eslint-enable prefer-rest-params */\n\n  // Accessing some objects may throw\n  // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n  try {\n    for (const property in fn) {\n      if (Object.prototype.hasOwnProperty.call(fn, property)) {\n        sentryWrapped[property] = fn[property];\n      }\n    }\n  } catch (_oO) {} // eslint-disable-line no-empty\n\n  // Signal that this function has been wrapped/filled already\n  // for both debugging and to prevent it to being wrapped/filled twice\n  markFunctionWrapped(sentryWrapped, fn);\n\n  addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n\n  // Restore original function name (not all browsers allow that)\n  try {\n    const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name') ;\n    if (descriptor.configurable) {\n      Object.defineProperty(sentryWrapped, 'name', {\n        get() {\n          return fn.name;\n        },\n      });\n    }\n    // eslint-disable-next-line no-empty\n  } catch (_oO) {}\n\n  return sentryWrapped;\n}\n\nexport { WINDOW, ignoreNextOnError, shouldIgnoreOnError, wrap };\n//# sourceMappingURL=helpers.js.map\n","/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nconst DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);\n\nexport { DEBUG_BUILD };\n//# sourceMappingURL=debug-build.js.map\n","import { getClient } from '@sentry/core';\nimport { addExceptionMechanism, resolvedSyncPromise, isErrorEvent, isDOMError, isDOMException, addExceptionTypeValue, isError, isPlainObject, isEvent, isParameterizedString, normalizeToSize, extractExceptionKeysForMessage } from '@sentry/utils';\n\n/**\n * This function creates an exception from a JavaScript Error\n */\nfunction exceptionFromError(stackParser, ex) {\n  // Get the frames first since Opera can lose the stack if we touch anything else first\n  const frames = parseStackFrames(stackParser, ex);\n\n  const exception = {\n    type: extractType(ex),\n    value: extractMessage(ex),\n  };\n\n  if (frames.length) {\n    exception.stacktrace = { frames };\n  }\n\n  if (exception.type === undefined && exception.value === '') {\n    exception.value = 'Unrecoverable error caught';\n  }\n\n  return exception;\n}\n\nfunction eventFromPlainObject(\n  stackParser,\n  exception,\n  syntheticException,\n  isUnhandledRejection,\n) {\n  const client = getClient();\n  const normalizeDepth = client && client.getOptions().normalizeDepth;\n\n  // If we can, we extract an exception from the object properties\n  const errorFromProp = getErrorPropertyFromObject(exception);\n\n  const extra = {\n    __serialized__: normalizeToSize(exception, normalizeDepth),\n  };\n\n  if (errorFromProp) {\n    return {\n      exception: {\n        values: [exceptionFromError(stackParser, errorFromProp)],\n      },\n      extra,\n    };\n  }\n\n  const event = {\n    exception: {\n      values: [\n        {\n          type: isEvent(exception) ? exception.constructor.name : isUnhandledRejection ? 'UnhandledRejection' : 'Error',\n          value: getNonErrorObjectExceptionValue(exception, { isUnhandledRejection }),\n        } ,\n      ],\n    },\n    extra,\n  } ;\n\n  if (syntheticException) {\n    const frames = parseStackFrames(stackParser, syntheticException);\n    if (frames.length) {\n      // event.exception.values[0] has been set above\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      event.exception.values[0].stacktrace = { frames };\n    }\n  }\n\n  return event;\n}\n\nfunction eventFromError(stackParser, ex) {\n  return {\n    exception: {\n      values: [exceptionFromError(stackParser, ex)],\n    },\n  };\n}\n\n/** Parses stack frames from an error */\nfunction parseStackFrames(\n  stackParser,\n  ex,\n) {\n  // Access and store the stacktrace property before doing ANYTHING\n  // else to it because Opera is not very good at providing it\n  // reliably in other circumstances.\n  const stacktrace = ex.stacktrace || ex.stack || '';\n\n  const skipLines = getSkipFirstStackStringLines(ex);\n  const framesToPop = getPopFirstTopFrames(ex);\n\n  try {\n    return stackParser(stacktrace, skipLines, framesToPop);\n  } catch (e) {\n    // no-empty\n  }\n\n  return [];\n}\n\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i;\n\n/**\n * Certain known React errors contain links that would be falsely\n * parsed as frames. This function check for these errors and\n * returns number of the stack string lines to skip.\n */\nfunction getSkipFirstStackStringLines(ex) {\n  if (ex && reactMinifiedRegexp.test(ex.message)) {\n    return 1;\n  }\n\n  return 0;\n}\n\n/**\n * If error has `framesToPop` property, it means that the\n * creator tells us the first x frames will be useless\n * and should be discarded. Typically error from wrapper function\n * which don't point to the actual location in the developer's code.\n *\n * Example: https://github.com/zertosh/invariant/blob/master/invariant.js#L46\n */\nfunction getPopFirstTopFrames(ex) {\n  if (typeof ex.framesToPop === 'number') {\n    return ex.framesToPop;\n  }\n\n  return 0;\n}\n\n// https://developer.mozilla.org/en-US/docs/WebAssembly/JavaScript_interface/Exception\n// @ts-expect-error - WebAssembly.Exception is a valid class\nfunction isWebAssemblyException(exception) {\n  // Check for support\n  // @ts-expect-error - WebAssembly.Exception is a valid class\n  if (typeof WebAssembly !== 'undefined' && typeof WebAssembly.Exception !== 'undefined') {\n    // @ts-expect-error - WebAssembly.Exception is a valid class\n    return exception instanceof WebAssembly.Exception;\n  } else {\n    return false;\n  }\n}\n\n/**\n * Extracts from errors what we use as the exception `type` in error events.\n *\n * Usually, this is the `name` property on Error objects but WASM errors need to be treated differently.\n */\nfunction extractType(ex) {\n  const name = ex && ex.name;\n\n  // The name for WebAssembly.Exception Errors needs to be extracted differently.\n  // Context: https://github.com/getsentry/sentry-javascript/issues/13787\n  if (!name && isWebAssemblyException(ex)) {\n    // Emscripten sets array[type, message] to the \"message\" property on the WebAssembly.Exception object\n    const hasTypeInMessage = ex.message && Array.isArray(ex.message) && ex.message.length == 2;\n    return hasTypeInMessage ? ex.message[0] : 'WebAssembly.Exception';\n  }\n\n  return name;\n}\n\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nfunction extractMessage(ex) {\n  const message = ex && ex.message;\n\n  if (!message) {\n    return 'No error message';\n  }\n\n  if (message.error && typeof message.error.message === 'string') {\n    return message.error.message;\n  }\n\n  // Emscripten sets array[type, message] to the \"message\" property on the WebAssembly.Exception object\n  if (isWebAssemblyException(ex) && Array.isArray(ex.message) && ex.message.length == 2) {\n    return ex.message[1];\n  }\n\n  return message;\n}\n\n/**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n * @hidden\n */\nfunction eventFromException(\n  stackParser,\n  exception,\n  hint,\n  attachStacktrace,\n) {\n  const syntheticException = (hint && hint.syntheticException) || undefined;\n  const event = eventFromUnknownInput(stackParser, exception, syntheticException, attachStacktrace);\n  addExceptionMechanism(event); // defaults to { type: 'generic', handled: true }\n  event.level = 'error';\n  if (hint && hint.event_id) {\n    event.event_id = hint.event_id;\n  }\n  return resolvedSyncPromise(event);\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nfunction eventFromMessage(\n  stackParser,\n  message,\n  level = 'info',\n  hint,\n  attachStacktrace,\n) {\n  const syntheticException = (hint && hint.syntheticException) || undefined;\n  const event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n  event.level = level;\n  if (hint && hint.event_id) {\n    event.event_id = hint.event_id;\n  }\n  return resolvedSyncPromise(event);\n}\n\n/**\n * @hidden\n */\nfunction eventFromUnknownInput(\n  stackParser,\n  exception,\n  syntheticException,\n  attachStacktrace,\n  isUnhandledRejection,\n) {\n  let event;\n\n  if (isErrorEvent(exception ) && (exception ).error) {\n    // If it is an ErrorEvent with `error` property, extract it to get actual Error\n    const errorEvent = exception ;\n    return eventFromError(stackParser, errorEvent.error );\n  }\n\n  // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name\n  // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be\n  // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`.\n  //\n  // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n  // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n  // https://webidl.spec.whatwg.org/#es-DOMException-specialness\n  if (isDOMError(exception) || isDOMException(exception )) {\n    const domException = exception ;\n\n    if ('stack' in (exception )) {\n      event = eventFromError(stackParser, exception );\n    } else {\n      const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n      const message = domException.message ? `${name}: ${domException.message}` : name;\n      event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n      addExceptionTypeValue(event, message);\n    }\n    if ('code' in domException) {\n      // eslint-disable-next-line deprecation/deprecation\n      event.tags = { ...event.tags, 'DOMException.code': `${domException.code}` };\n    }\n\n    return event;\n  }\n  if (isError(exception)) {\n    // we have a real Error object, do nothing\n    return eventFromError(stackParser, exception);\n  }\n  if (isPlainObject(exception) || isEvent(exception)) {\n    // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize\n    // it manually. This will allow us to group events based on top-level keys which is much better than creating a new\n    // group on any key/value change.\n    const objectException = exception ;\n    event = eventFromPlainObject(stackParser, objectException, syntheticException, isUnhandledRejection);\n    addExceptionMechanism(event, {\n      synthetic: true,\n    });\n    return event;\n  }\n\n  // If none of previous checks were valid, then it means that it's not:\n  // - an instance of DOMError\n  // - an instance of DOMException\n  // - an instance of Event\n  // - an instance of Error\n  // - a valid ErrorEvent (one with an error property)\n  // - a plain Object\n  //\n  // So bail out and capture it as a simple message:\n  event = eventFromString(stackParser, exception , syntheticException, attachStacktrace);\n  addExceptionTypeValue(event, `${exception}`, undefined);\n  addExceptionMechanism(event, {\n    synthetic: true,\n  });\n\n  return event;\n}\n\nfunction eventFromString(\n  stackParser,\n  message,\n  syntheticException,\n  attachStacktrace,\n) {\n  const event = {};\n\n  if (attachStacktrace && syntheticException) {\n    const frames = parseStackFrames(stackParser, syntheticException);\n    if (frames.length) {\n      event.exception = {\n        values: [{ value: message, stacktrace: { frames } }],\n      };\n    }\n  }\n\n  if (isParameterizedString(message)) {\n    const { __sentry_template_string__, __sentry_template_values__ } = message;\n\n    event.logentry = {\n      message: __sentry_template_string__,\n      params: __sentry_template_values__,\n    };\n    return event;\n  }\n\n  event.message = message;\n  return event;\n}\n\nfunction getNonErrorObjectExceptionValue(\n  exception,\n  { isUnhandledRejection },\n) {\n  const keys = extractExceptionKeysForMessage(exception);\n  const captureType = isUnhandledRejection ? 'promise rejection' : 'exception';\n\n  // Some ErrorEvent instances do not have an `error` property, which is why they are not handled before\n  // We still want to try to get a decent message for these cases\n  if (isErrorEvent(exception)) {\n    return `Event \\`ErrorEvent\\` captured as ${captureType} with message \\`${exception.message}\\``;\n  }\n\n  if (isEvent(exception)) {\n    const className = getObjectClassName(exception);\n    return `Event \\`${className}\\` (type=${exception.type}) captured as ${captureType}`;\n  }\n\n  return `Object captured as ${captureType} with keys: ${keys}`;\n}\n\nfunction getObjectClassName(obj) {\n  try {\n    const prototype = Object.getPrototypeOf(obj);\n    return prototype ? prototype.constructor.name : undefined;\n  } catch (e) {\n    // ignore errors here\n  }\n}\n\n/** If a plain object has a property that is an `Error`, return this error. */\nfunction getErrorPropertyFromObject(obj) {\n  for (const prop in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n      const value = obj[prop];\n      if (value instanceof Error) {\n        return value;\n      }\n    }\n  }\n\n  return undefined;\n}\n\nexport { eventFromException, eventFromMessage, eventFromUnknownInput, exceptionFromError, extractMessage, extractType };\n//# sourceMappingURL=eventbuilder.js.map\n","import { dsnToString, createEnvelope } from '@sentry/utils';\n\n/**\n * Creates an envelope from a user feedback.\n */\nfunction createUserFeedbackEnvelope(\n  feedback,\n  {\n    metadata,\n    tunnel,\n    dsn,\n  }\n\n,\n) {\n  const headers = {\n    event_id: feedback.event_id,\n    sent_at: new Date().toISOString(),\n    ...(metadata &&\n      metadata.sdk && {\n        sdk: {\n          name: metadata.sdk.name,\n          version: metadata.sdk.version,\n        },\n      }),\n    ...(!!tunnel && !!dsn && { dsn: dsnToString(dsn) }),\n  };\n  const item = createUserFeedbackEnvelopeItem(feedback);\n\n  return createEnvelope(headers, [item]);\n}\n\nfunction createUserFeedbackEnvelopeItem(feedback) {\n  const feedbackHeaders = {\n    type: 'user_report',\n  };\n  return [feedbackHeaders, feedback];\n}\n\nexport { createUserFeedbackEnvelope };\n//# sourceMappingURL=userfeedback.js.map\n","import { BaseClient, applySdkMetadata } from '@sentry/core';\nimport { getSDKSource, logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { eventFromException, eventFromMessage } from './eventbuilder.js';\nimport { WINDOW } from './helpers.js';\nimport { createUserFeedbackEnvelope } from './userfeedback.js';\n\n/**\n * Configuration options for the Sentry Browser SDK.\n * @see @sentry/types Options for more information.\n */\n\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nclass BrowserClient extends BaseClient {\n  /**\n   * Creates a new Browser SDK instance.\n   *\n   * @param options Configuration options for this SDK.\n   */\n   constructor(options) {\n    const opts = {\n      // We default this to true, as it is the safer scenario\n      parentSpanIsAlwaysRootSpan: true,\n      ...options,\n    };\n    const sdkSource = WINDOW.SENTRY_SDK_SOURCE || getSDKSource();\n    applySdkMetadata(opts, 'browser', ['browser'], sdkSource);\n\n    super(opts);\n\n    if (opts.sendClientReports && WINDOW.document) {\n      WINDOW.document.addEventListener('visibilitychange', () => {\n        if (WINDOW.document.visibilityState === 'hidden') {\n          this._flushOutcomes();\n        }\n      });\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n   eventFromException(exception, hint) {\n    return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);\n  }\n\n  /**\n   * @inheritDoc\n   */\n   eventFromMessage(\n    message,\n    level = 'info',\n    hint,\n  ) {\n    return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);\n  }\n\n  /**\n   * Sends user feedback to Sentry.\n   *\n   * @deprecated Use `captureFeedback` instead.\n   */\n   captureUserFeedback(feedback) {\n    if (!this._isEnabled()) {\n      DEBUG_BUILD && logger.warn('SDK not enabled, will not capture user feedback.');\n      return;\n    }\n\n    const envelope = createUserFeedbackEnvelope(feedback, {\n      metadata: this.getSdkMetadata(),\n      dsn: this.getDsn(),\n      tunnel: this.getOptions().tunnel,\n    });\n\n    // sendEnvelope should not throw\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.sendEnvelope(envelope);\n  }\n\n  /**\n   * @inheritDoc\n   */\n   _prepareEvent(event, hint, scope) {\n    event.platform = event.platform || 'javascript';\n    return super._prepareEvent(event, hint, scope);\n  }\n}\n\nexport { BrowserClient };\n//# sourceMappingURL=client.js.map\n","/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nconst DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);\n\nexport { DEBUG_BUILD };\n//# sourceMappingURL=debug-build.js.map\n","import { GLOBAL_OBJ } from '@sentry/utils';\n\nconst WINDOW = GLOBAL_OBJ\n\n;\n\nexport { WINDOW };\n//# sourceMappingURL=types.js.map\n","import { addHandler, maybeInstrument, triggerHandlers, fill, addNonEnumerableProperty, uuid4 } from '@sentry/utils';\nimport { WINDOW } from '../types.js';\n\nconst DEBOUNCE_DURATION = 1000;\n\nlet debounceTimerID;\nlet lastCapturedEventType;\nlet lastCapturedEventTargetId;\n\n/**\n * Add an instrumentation handler for when a click or a keypress happens.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nfunction addClickKeypressInstrumentationHandler(handler) {\n  const type = 'dom';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentDOM);\n}\n\n/** Exported for tests only. */\nfunction instrumentDOM() {\n  if (!WINDOW.document) {\n    return;\n  }\n\n  // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n  // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n  // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n  const triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n  const globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n  WINDOW.document.addEventListener('click', globalDOMEventHandler, false);\n  WINDOW.document.addEventListener('keypress', globalDOMEventHandler, false);\n\n  // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n  // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n  // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n  // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n  // guaranteed to fire at least once.)\n  ['EventTarget', 'Node'].forEach((target) => {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n    const proto = (WINDOW )[target] && (WINDOW )[target].prototype;\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n    if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n      return;\n    }\n\n    fill(proto, 'addEventListener', function (originalAddEventListener) {\n      return function (\n\n        type,\n        listener,\n        options,\n      ) {\n        if (type === 'click' || type == 'keypress') {\n          try {\n            const el = this ;\n            const handlers = (el.__sentry_instrumentation_handlers__ = el.__sentry_instrumentation_handlers__ || {});\n            const handlerForType = (handlers[type] = handlers[type] || { refCount: 0 });\n\n            if (!handlerForType.handler) {\n              const handler = makeDOMEventHandler(triggerDOMHandler);\n              handlerForType.handler = handler;\n              originalAddEventListener.call(this, type, handler, options);\n            }\n\n            handlerForType.refCount++;\n          } catch (e) {\n            // Accessing dom properties is always fragile.\n            // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n          }\n        }\n\n        return originalAddEventListener.call(this, type, listener, options);\n      };\n    });\n\n    fill(\n      proto,\n      'removeEventListener',\n      function (originalRemoveEventListener) {\n        return function (\n\n          type,\n          listener,\n          options,\n        ) {\n          if (type === 'click' || type == 'keypress') {\n            try {\n              const el = this ;\n              const handlers = el.__sentry_instrumentation_handlers__ || {};\n              const handlerForType = handlers[type];\n\n              if (handlerForType) {\n                handlerForType.refCount--;\n                // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n                if (handlerForType.refCount <= 0) {\n                  originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n                  handlerForType.handler = undefined;\n                  delete handlers[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n                }\n\n                // If there are no longer any custom handlers of any type on this element, cleanup everything.\n                if (Object.keys(handlers).length === 0) {\n                  delete el.__sentry_instrumentation_handlers__;\n                }\n              }\n            } catch (e) {\n              // Accessing dom properties is always fragile.\n              // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n            }\n          }\n\n          return originalRemoveEventListener.call(this, type, listener, options);\n        };\n      },\n    );\n  });\n}\n\n/**\n * Check whether the event is similar to the last captured one. For example, two click events on the same button.\n */\nfunction isSimilarToLastCapturedEvent(event) {\n  // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n  if (event.type !== lastCapturedEventType) {\n    return false;\n  }\n\n  try {\n    // If both events have the same type, it's still possible that actions were performed on different targets.\n    // e.g. 2 clicks on different buttons.\n    if (!event.target || (event.target )._sentryId !== lastCapturedEventTargetId) {\n      return false;\n    }\n  } catch (e) {\n    // just accessing `target` property can throw an exception in some rare circumstances\n    // see: https://github.com/getsentry/sentry-javascript/issues/838\n  }\n\n  // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n  // to which an event listener was attached), we treat them as the same action, as we want to capture\n  // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n  return true;\n}\n\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\nfunction shouldSkipDOMEvent(eventType, target) {\n  // We are only interested in filtering `keypress` events for now.\n  if (eventType !== 'keypress') {\n    return false;\n  }\n\n  if (!target || !target.tagName) {\n    return true;\n  }\n\n  // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n  // e.g.tabbing through elements, hotkeys, etc.\n  if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n */\nfunction makeDOMEventHandler(\n  handler,\n  globalListener = false,\n) {\n  return (event) => {\n    // It's possible this handler might trigger multiple times for the same\n    // event (e.g. event propagation through node ancestors).\n    // Ignore if we've already captured that event.\n    if (!event || event['_sentryCaptured']) {\n      return;\n    }\n\n    const target = getEventTarget(event);\n\n    // We always want to skip _some_ events.\n    if (shouldSkipDOMEvent(event.type, target)) {\n      return;\n    }\n\n    // Mark event as \"seen\"\n    addNonEnumerableProperty(event, '_sentryCaptured', true);\n\n    if (target && !target._sentryId) {\n      // Add UUID to event target so we can identify if\n      addNonEnumerableProperty(target, '_sentryId', uuid4());\n    }\n\n    const name = event.type === 'keypress' ? 'input' : event.type;\n\n    // If there is no last captured event, it means that we can safely capture the new event and store it for future comparisons.\n    // If there is a last captured event, see if the new event is different enough to treat it as a unique one.\n    // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n    if (!isSimilarToLastCapturedEvent(event)) {\n      const handlerData = { event, name, global: globalListener };\n      handler(handlerData);\n      lastCapturedEventType = event.type;\n      lastCapturedEventTargetId = target ? target._sentryId : undefined;\n    }\n\n    // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n    clearTimeout(debounceTimerID);\n    debounceTimerID = WINDOW.setTimeout(() => {\n      lastCapturedEventTargetId = undefined;\n      lastCapturedEventType = undefined;\n    }, DEBOUNCE_DURATION);\n  };\n}\n\nfunction getEventTarget(event) {\n  try {\n    return event.target ;\n  } catch (e) {\n    // just accessing `target` property can throw an exception in some rare circumstances\n    // see: https://github.com/getsentry/sentry-javascript/issues/838\n    return null;\n  }\n}\n\nexport { addClickKeypressInstrumentationHandler, instrumentDOM };\n//# sourceMappingURL=dom.js.map\n","import { addHandler, maybeInstrument, supportsHistory, triggerHandlers, fill } from '@sentry/utils';\nimport { WINDOW } from '../types.js';\n\nlet lastHref;\n\n/**\n * Add an instrumentation handler for when a fetch request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nfunction addHistoryInstrumentationHandler(handler) {\n  const type = 'history';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentHistory);\n}\n\nfunction instrumentHistory() {\n  if (!supportsHistory()) {\n    return;\n  }\n\n  const oldOnPopState = WINDOW.onpopstate;\n  WINDOW.onpopstate = function ( ...args) {\n    const to = WINDOW.location.href;\n    // keep track of the current URL state, as we always receive only the updated state\n    const from = lastHref;\n    lastHref = to;\n    const handlerData = { from, to };\n    triggerHandlers('history', handlerData);\n    if (oldOnPopState) {\n      // Apparently this can throw in Firefox when incorrectly implemented plugin is installed.\n      // https://github.com/getsentry/sentry-javascript/issues/3344\n      // https://github.com/bugsnag/bugsnag-js/issues/469\n      try {\n        return oldOnPopState.apply(this, args);\n      } catch (_oO) {\n        // no-empty\n      }\n    }\n  };\n\n  function historyReplacementFunction(originalHistoryFunction) {\n    return function ( ...args) {\n      const url = args.length > 2 ? args[2] : undefined;\n      if (url) {\n        // coerce to string (this is what pushState does)\n        const from = lastHref;\n        const to = String(url);\n        // keep track of the current URL state, as we always receive only the updated state\n        lastHref = to;\n        const handlerData = { from, to };\n        triggerHandlers('history', handlerData);\n      }\n      return originalHistoryFunction.apply(this, args);\n    };\n  }\n\n  fill(WINDOW.history, 'pushState', historyReplacementFunction);\n  fill(WINDOW.history, 'replaceState', historyReplacementFunction);\n}\n\nexport { addHistoryInstrumentationHandler };\n//# sourceMappingURL=history.js.map\n","import { isNativeFunction, logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { WINDOW } from './types.js';\n\n/**\n * We generally want to use window.fetch / window.setTimeout.\n * However, in some cases this may be wrapped (e.g. by Zone.js for Angular),\n * so we try to get an unpatched version of this from a sandboxed iframe.\n */\n\nconst cachedImplementations = {};\n\n/**\n * Get the native implementation of a browser function.\n *\n * This can be used to ensure we get an unwrapped version of a function, in cases where a wrapped function can lead to problems.\n *\n * The following methods can be retrieved:\n * - `setTimeout`: This can be wrapped by e.g. Angular, causing change detection to be triggered.\n * - `fetch`: This can be wrapped by e.g. ad-blockers, causing an infinite loop when a request is blocked.\n */\nfunction getNativeImplementation(\n  name,\n) {\n  const cached = cachedImplementations[name];\n  if (cached) {\n    return cached;\n  }\n\n  let impl = WINDOW[name] ;\n\n  // Fast path to avoid DOM I/O\n  if (isNativeFunction(impl)) {\n    return (cachedImplementations[name] = impl.bind(WINDOW) );\n  }\n\n  const document = WINDOW.document;\n  // eslint-disable-next-line deprecation/deprecation\n  if (document && typeof document.createElement === 'function') {\n    try {\n      const sandbox = document.createElement('iframe');\n      sandbox.hidden = true;\n      document.head.appendChild(sandbox);\n      const contentWindow = sandbox.contentWindow;\n      if (contentWindow && contentWindow[name]) {\n        impl = contentWindow[name] ;\n      }\n      document.head.removeChild(sandbox);\n    } catch (e) {\n      // Could not create sandbox iframe, just use window.xxx\n      DEBUG_BUILD && logger.warn(`Could not create sandbox iframe for ${name} check, bailing to window.${name}: `, e);\n    }\n  }\n\n  // Sanity check: This _should_ not happen, but if it does, we just skip caching...\n  // This can happen e.g. in tests where fetch may not be available in the env, or similar.\n  if (!impl) {\n    return impl;\n  }\n\n  return (cachedImplementations[name] = impl.bind(WINDOW) );\n}\n\n/** Clear a cached implementation. */\nfunction clearCachedImplementation(name) {\n  cachedImplementations[name] = undefined;\n}\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n *   const p = f.apply(this, arguments);\n *\n *   p.then(function() {\n *     console.log('hi.');\n *   });\n *\n *   return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome:  Failed to fetch\n * Edge:    Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari:  resource blocked by content blocker\n */\nfunction fetch(...rest) {\n  return getNativeImplementation('fetch')(...rest);\n}\n\n/**\n * Get an unwrapped `setTimeout` method.\n * This ensures that even if e.g. Angular wraps `setTimeout`, we get the native implementation,\n * avoiding triggering change detection.\n */\nfunction setTimeout(...rest) {\n  return getNativeImplementation('setTimeout')(...rest);\n}\n\nexport { clearCachedImplementation, fetch, getNativeImplementation, setTimeout };\n//# sourceMappingURL=getNativeImplementation.js.map\n","import { addHandler, maybeInstrument, timestampInSeconds, isString, triggerHandlers } from '@sentry/utils';\nimport { WINDOW } from '../types.js';\n\nconst SENTRY_XHR_DATA_KEY = '__sentry_xhr_v3__';\n\n/**\n * Add an instrumentation handler for when an XHR request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nfunction addXhrInstrumentationHandler(handler) {\n  const type = 'xhr';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentXHR);\n}\n\n/** Exported only for tests. */\nfunction instrumentXHR() {\n  if (!(WINDOW ).XMLHttpRequest) {\n    return;\n  }\n\n  const xhrproto = XMLHttpRequest.prototype;\n\n  // eslint-disable-next-line @typescript-eslint/unbound-method\n  xhrproto.open = new Proxy(xhrproto.open, {\n    apply(originalOpen, xhrOpenThisArg, xhrOpenArgArray) {\n      const startTimestamp = timestampInSeconds() * 1000;\n\n      // open() should always be called with two or more arguments\n      // But to be on the safe side, we actually validate this and bail out if we don't have a method & url\n      const method = isString(xhrOpenArgArray[0]) ? xhrOpenArgArray[0].toUpperCase() : undefined;\n      const url = parseUrl(xhrOpenArgArray[1]);\n\n      if (!method || !url) {\n        return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);\n      }\n\n      xhrOpenThisArg[SENTRY_XHR_DATA_KEY] = {\n        method,\n        url,\n        request_headers: {},\n      };\n\n      // if Sentry key appears in URL, don't capture it as a request\n      if (method === 'POST' && url.match(/sentry_key/)) {\n        xhrOpenThisArg.__sentry_own_request__ = true;\n      }\n\n      const onreadystatechangeHandler = () => {\n        // For whatever reason, this is not the same instance here as from the outer method\n        const xhrInfo = xhrOpenThisArg[SENTRY_XHR_DATA_KEY];\n\n        if (!xhrInfo) {\n          return;\n        }\n\n        if (xhrOpenThisArg.readyState === 4) {\n          try {\n            // touching statusCode in some platforms throws\n            // an exception\n            xhrInfo.status_code = xhrOpenThisArg.status;\n          } catch (e) {\n            /* do nothing */\n          }\n\n          const handlerData = {\n            endTimestamp: timestampInSeconds() * 1000,\n            startTimestamp,\n            xhr: xhrOpenThisArg,\n          };\n          triggerHandlers('xhr', handlerData);\n        }\n      };\n\n      if ('onreadystatechange' in xhrOpenThisArg && typeof xhrOpenThisArg.onreadystatechange === 'function') {\n        xhrOpenThisArg.onreadystatechange = new Proxy(xhrOpenThisArg.onreadystatechange, {\n          apply(originalOnreadystatechange, onreadystatechangeThisArg, onreadystatechangeArgArray) {\n            onreadystatechangeHandler();\n            return originalOnreadystatechange.apply(onreadystatechangeThisArg, onreadystatechangeArgArray);\n          },\n        });\n      } else {\n        xhrOpenThisArg.addEventListener('readystatechange', onreadystatechangeHandler);\n      }\n\n      // Intercepting `setRequestHeader` to access the request headers of XHR instance.\n      // This will only work for user/library defined headers, not for the default/browser-assigned headers.\n      // Request cookies are also unavailable for XHR, as `Cookie` header can't be defined by `setRequestHeader`.\n      xhrOpenThisArg.setRequestHeader = new Proxy(xhrOpenThisArg.setRequestHeader, {\n        apply(\n          originalSetRequestHeader,\n          setRequestHeaderThisArg,\n          setRequestHeaderArgArray,\n        ) {\n          const [header, value] = setRequestHeaderArgArray;\n\n          const xhrInfo = setRequestHeaderThisArg[SENTRY_XHR_DATA_KEY];\n\n          if (xhrInfo && isString(header) && isString(value)) {\n            xhrInfo.request_headers[header.toLowerCase()] = value;\n          }\n\n          return originalSetRequestHeader.apply(setRequestHeaderThisArg, setRequestHeaderArgArray);\n        },\n      });\n\n      return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);\n    },\n  });\n\n  // eslint-disable-next-line @typescript-eslint/unbound-method\n  xhrproto.send = new Proxy(xhrproto.send, {\n    apply(originalSend, sendThisArg, sendArgArray) {\n      const sentryXhrData = sendThisArg[SENTRY_XHR_DATA_KEY];\n\n      if (!sentryXhrData) {\n        return originalSend.apply(sendThisArg, sendArgArray);\n      }\n\n      if (sendArgArray[0] !== undefined) {\n        sentryXhrData.body = sendArgArray[0];\n      }\n\n      const handlerData = {\n        startTimestamp: timestampInSeconds() * 1000,\n        xhr: sendThisArg,\n      };\n      triggerHandlers('xhr', handlerData);\n\n      return originalSend.apply(sendThisArg, sendArgArray);\n    },\n  });\n}\n\nfunction parseUrl(url) {\n  if (isString(url)) {\n    return url;\n  }\n\n  try {\n    // url can be a string or URL\n    // but since URL is not available in IE11, we do not check for it,\n    // but simply assume it is an URL and return `toString()` from it (which returns the full URL)\n    // If that fails, we just return undefined\n    return (url ).toString();\n  } catch (e2) {} // eslint-disable-line no-empty\n\n  return undefined;\n}\n\nexport { SENTRY_XHR_DATA_KEY, addXhrInstrumentationHandler, instrumentXHR };\n//# sourceMappingURL=xhr.js.map\n","import { getNativeImplementation, clearCachedImplementation } from '@sentry-internal/browser-utils';\nimport { createTransport } from '@sentry/core';\nimport { rejectedSyncPromise } from '@sentry/utils';\n\n/**\n * Creates a Transport that uses the Fetch API to send events to Sentry.\n */\nfunction makeFetchTransport(\n  options,\n  nativeFetch = getNativeImplementation('fetch'),\n) {\n  let pendingBodySize = 0;\n  let pendingCount = 0;\n\n  function makeRequest(request) {\n    const requestSize = request.body.length;\n    pendingBodySize += requestSize;\n    pendingCount++;\n\n    const requestOptions = {\n      body: request.body,\n      method: 'POST',\n      referrerPolicy: 'origin',\n      headers: options.headers,\n      // Outgoing requests are usually cancelled when navigating to a different page, causing a \"TypeError: Failed to\n      // fetch\" error and sending a \"network_error\" client-outcome - in Chrome, the request status shows \"(cancelled)\".\n      // The `keepalive` flag keeps outgoing requests alive, even when switching pages. We want this since we're\n      // frequently sending events right before the user is switching pages (eg. whenfinishing navigation transactions).\n      // Gotchas:\n      // - `keepalive` isn't supported by Firefox\n      // - As per spec (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch):\n      //   If the sum of contentLength and inflightKeepaliveBytes is greater than 64 kibibytes, then return a network error.\n      //   We will therefore only activate the flag when we're below that limit.\n      // There is also a limit of requests that can be open at the same time, so we also limit this to 15\n      // See https://github.com/getsentry/sentry-javascript/pull/7553 for details\n      keepalive: pendingBodySize <= 60000 && pendingCount < 15,\n      ...options.fetchOptions,\n    };\n\n    if (!nativeFetch) {\n      clearCachedImplementation('fetch');\n      return rejectedSyncPromise('No fetch implementation available');\n    }\n\n    try {\n      // TODO: This may need a `suppresTracing` call in the future when we switch the browser SDK to OTEL\n      return nativeFetch(options.url, requestOptions).then(response => {\n        pendingBodySize -= requestSize;\n        pendingCount--;\n        return {\n          statusCode: response.status,\n          headers: {\n            'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n            'retry-after': response.headers.get('Retry-After'),\n          },\n        };\n      });\n    } catch (e) {\n      clearCachedImplementation('fetch');\n      pendingBodySize -= requestSize;\n      pendingCount--;\n      return rejectedSyncPromise(e);\n    }\n  }\n\n  return createTransport(options, makeRequest);\n}\n\nexport { makeFetchTransport };\n//# sourceMappingURL=fetch.js.map\n","import { createStackParser, UNKNOWN_FUNCTION } from '@sentry/utils';\n\nconst OPERA10_PRIORITY = 10;\nconst OPERA11_PRIORITY = 20;\nconst CHROME_PRIORITY = 30;\nconst WINJS_PRIORITY = 40;\nconst GECKO_PRIORITY = 50;\n\nfunction createFrame(filename, func, lineno, colno) {\n  const frame = {\n    filename,\n    function: func === '<anonymous>' ? UNKNOWN_FUNCTION : func,\n    in_app: true, // All browser frames are considered in_app\n  };\n\n  if (lineno !== undefined) {\n    frame.lineno = lineno;\n  }\n\n  if (colno !== undefined) {\n    frame.colno = colno;\n  }\n\n  return frame;\n}\n\n// This regex matches frames that have no function name (ie. are at the top level of a module).\n// For example \"at http://localhost:5000//script.js:1:126\"\n// Frames _with_ function names usually look as follows: \"at commitLayoutEffects (react-dom.development.js:23426:1)\"\nconst chromeRegexNoFnName = /^\\s*at (\\S+?)(?::(\\d+))(?::(\\d+))\\s*$/i;\n\n// This regex matches all the frames that have a function name.\nconst chromeRegex =\n  /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\n// We cannot call this variable `chrome` because it can conflict with global `chrome` variable in certain environments\n// See: https://github.com/getsentry/sentry-javascript/issues/6880\nconst chromeStackParserFn = line => {\n  // If the stack line has no function name, we need to parse it differently\n  const noFnParts = chromeRegexNoFnName.exec(line) ;\n\n  if (noFnParts) {\n    const [, filename, line, col] = noFnParts;\n    return createFrame(filename, UNKNOWN_FUNCTION, +line, +col);\n  }\n\n  const parts = chromeRegex.exec(line) ;\n\n  if (parts) {\n    const isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n    if (isEval) {\n      const subMatch = chromeEvalRegex.exec(parts[2]) ;\n\n      if (subMatch) {\n        // throw out eval line/column and use top-most line/column number\n        parts[2] = subMatch[1]; // url\n        parts[3] = subMatch[2]; // line\n        parts[4] = subMatch[3]; // column\n      }\n    }\n\n    // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n    // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n    const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n\n    return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n  }\n\n  return;\n};\n\nconst chromeStackLineParser = [CHROME_PRIORITY, chromeStackParserFn];\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n  /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nconst gecko = line => {\n  const parts = geckoREgex.exec(line) ;\n\n  if (parts) {\n    const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n    if (isEval) {\n      const subMatch = geckoEvalRegex.exec(parts[3]) ;\n\n      if (subMatch) {\n        // throw out eval line/column and use top-most line number\n        parts[1] = parts[1] || 'eval';\n        parts[3] = subMatch[1];\n        parts[4] = subMatch[2];\n        parts[5] = ''; // no column when eval\n      }\n    }\n\n    let filename = parts[3];\n    let func = parts[1] || UNKNOWN_FUNCTION;\n    [func, filename] = extractSafariExtensionDetails(func, filename);\n\n    return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n  }\n\n  return;\n};\n\nconst geckoStackLineParser = [GECKO_PRIORITY, gecko];\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nconst winjs = line => {\n  const parts = winjsRegex.exec(line) ;\n\n  return parts\n    ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n    : undefined;\n};\n\nconst winjsStackLineParser = [WINJS_PRIORITY, winjs];\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nconst opera10 = line => {\n  const parts = opera10Regex.exec(line) ;\n  return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nconst opera10StackLineParser = [OPERA10_PRIORITY, opera10];\n\nconst opera11Regex =\n  / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nconst opera11 = line => {\n  const parts = opera11Regex.exec(line) ;\n  return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n\nconst opera11StackLineParser = [OPERA11_PRIORITY, opera11];\n\nconst defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser];\n\nconst defaultStackParser = createStackParser(...defaultStackLineParsers);\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n *   at function@url:row:col\n *   at function@url:row:col\n *   at function@url:row:col\n *\n * it produces something like:\n *\n *   function@url:row:col\n *   function@url:row:col\n *   function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func, filename) => {\n  const isSafariExtension = func.indexOf('safari-extension') !== -1;\n  const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n\n  return isSafariExtension || isSafariWebExtension\n    ? [\n        func.indexOf('@') !== -1 ? (func.split('@')[0] ) : UNKNOWN_FUNCTION,\n        isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n      ]\n    : [func, filename];\n};\n\nexport { chromeStackLineParser, defaultStackLineParsers, defaultStackParser, geckoStackLineParser, opera10StackLineParser, opera11StackLineParser, winjsStackLineParser };\n//# sourceMappingURL=stack-parsers.js.map\n","import { addClickKeypressInstrumentationHandler, addXhrInstrumentationHandler, addHistoryInstrumentationHandler, SENTRY_XHR_DATA_KEY } from '@sentry-internal/browser-utils';\nimport { defineIntegration, getClient, addBreadcrumb } from '@sentry/core';\nimport { addConsoleInstrumentationHandler, addFetchInstrumentationHandler, getEventDescription, logger, htmlTreeAsString, getComponentName, severityLevelFromString, safeJoin, getBreadcrumbLogLevelFromHttpStatusCode, parseUrl } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { WINDOW } from '../helpers.js';\n\n/** maxStringLength gets capped to prevent 100 breadcrumbs exceeding 1MB event payload size */\nconst MAX_ALLOWED_STRING_LENGTH = 1024;\n\nconst INTEGRATION_NAME = 'Breadcrumbs';\n\nconst _breadcrumbsIntegration = ((options = {}) => {\n  const _options = {\n    console: true,\n    dom: true,\n    fetch: true,\n    history: true,\n    sentry: true,\n    xhr: true,\n    ...options,\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    setup(client) {\n      if (_options.console) {\n        addConsoleInstrumentationHandler(_getConsoleBreadcrumbHandler(client));\n      }\n      if (_options.dom) {\n        addClickKeypressInstrumentationHandler(_getDomBreadcrumbHandler(client, _options.dom));\n      }\n      if (_options.xhr) {\n        addXhrInstrumentationHandler(_getXhrBreadcrumbHandler(client));\n      }\n      if (_options.fetch) {\n        addFetchInstrumentationHandler(_getFetchBreadcrumbHandler(client));\n      }\n      if (_options.history) {\n        addHistoryInstrumentationHandler(_getHistoryBreadcrumbHandler(client));\n      }\n      if (_options.sentry) {\n        client.on('beforeSendEvent', _getSentryBreadcrumbHandler(client));\n      }\n    },\n  };\n}) ;\n\nconst breadcrumbsIntegration = defineIntegration(_breadcrumbsIntegration);\n\n/**\n * Adds a breadcrumb for Sentry events or transactions if this option is enabled.\n */\nfunction _getSentryBreadcrumbHandler(client) {\n  return function addSentryBreadcrumb(event) {\n    if (getClient() !== client) {\n      return;\n    }\n\n    addBreadcrumb(\n      {\n        category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,\n        event_id: event.event_id,\n        level: event.level,\n        message: getEventDescription(event),\n      },\n      {\n        event,\n      },\n    );\n  };\n}\n\n/**\n * A HOC that creaes a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\nfunction _getDomBreadcrumbHandler(\n  client,\n  dom,\n) {\n  return function _innerDomBreadcrumb(handlerData) {\n    if (getClient() !== client) {\n      return;\n    }\n\n    let target;\n    let componentName;\n    let keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n\n    let maxStringLength =\n      typeof dom === 'object' && typeof dom.maxStringLength === 'number' ? dom.maxStringLength : undefined;\n    if (maxStringLength && maxStringLength > MAX_ALLOWED_STRING_LENGTH) {\n      DEBUG_BUILD &&\n        logger.warn(\n          `\\`dom.maxStringLength\\` cannot exceed ${MAX_ALLOWED_STRING_LENGTH}, but a value of ${maxStringLength} was configured. Sentry will use ${MAX_ALLOWED_STRING_LENGTH} instead.`,\n        );\n      maxStringLength = MAX_ALLOWED_STRING_LENGTH;\n    }\n\n    if (typeof keyAttrs === 'string') {\n      keyAttrs = [keyAttrs];\n    }\n\n    // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n    try {\n      const event = handlerData.event ;\n      const element = _isEvent(event) ? event.target : event;\n\n      target = htmlTreeAsString(element, { keyAttrs, maxStringLength });\n      componentName = getComponentName(element);\n    } catch (e) {\n      target = '<unknown>';\n    }\n\n    if (target.length === 0) {\n      return;\n    }\n\n    const breadcrumb = {\n      category: `ui.${handlerData.name}`,\n      message: target,\n    };\n\n    if (componentName) {\n      breadcrumb.data = { 'ui.component_name': componentName };\n    }\n\n    addBreadcrumb(breadcrumb, {\n      event: handlerData.event,\n      name: handlerData.name,\n      global: handlerData.global,\n    });\n  };\n}\n\n/**\n * Creates breadcrumbs from console API calls\n */\nfunction _getConsoleBreadcrumbHandler(client) {\n  return function _consoleBreadcrumb(handlerData) {\n    if (getClient() !== client) {\n      return;\n    }\n\n    const breadcrumb = {\n      category: 'console',\n      data: {\n        arguments: handlerData.args,\n        logger: 'console',\n      },\n      level: severityLevelFromString(handlerData.level),\n      message: safeJoin(handlerData.args, ' '),\n    };\n\n    if (handlerData.level === 'assert') {\n      if (handlerData.args[0] === false) {\n        breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'}`;\n        breadcrumb.data.arguments = handlerData.args.slice(1);\n      } else {\n        // Don't capture a breadcrumb for passed assertions\n        return;\n      }\n    }\n\n    addBreadcrumb(breadcrumb, {\n      input: handlerData.args,\n      level: handlerData.level,\n    });\n  };\n}\n\n/**\n * Creates breadcrumbs from XHR API calls\n */\nfunction _getXhrBreadcrumbHandler(client) {\n  return function _xhrBreadcrumb(handlerData) {\n    if (getClient() !== client) {\n      return;\n    }\n\n    const { startTimestamp, endTimestamp } = handlerData;\n\n    const sentryXhrData = handlerData.xhr[SENTRY_XHR_DATA_KEY];\n\n    // We only capture complete, non-sentry requests\n    if (!startTimestamp || !endTimestamp || !sentryXhrData) {\n      return;\n    }\n\n    const { method, url, status_code, body } = sentryXhrData;\n\n    const data = {\n      method,\n      url,\n      status_code,\n    };\n\n    const hint = {\n      xhr: handlerData.xhr,\n      input: body,\n      startTimestamp,\n      endTimestamp,\n    };\n\n    const level = getBreadcrumbLogLevelFromHttpStatusCode(status_code);\n\n    addBreadcrumb(\n      {\n        category: 'xhr',\n        data,\n        type: 'http',\n        level,\n      },\n      hint,\n    );\n  };\n}\n\n/**\n * Creates breadcrumbs from fetch API calls\n */\nfunction _getFetchBreadcrumbHandler(client) {\n  return function _fetchBreadcrumb(handlerData) {\n    if (getClient() !== client) {\n      return;\n    }\n\n    const { startTimestamp, endTimestamp } = handlerData;\n\n    // We only capture complete fetch requests\n    if (!endTimestamp) {\n      return;\n    }\n\n    if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n      // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n      return;\n    }\n\n    if (handlerData.error) {\n      const data = handlerData.fetchData;\n      const hint = {\n        data: handlerData.error,\n        input: handlerData.args,\n        startTimestamp,\n        endTimestamp,\n      };\n\n      addBreadcrumb(\n        {\n          category: 'fetch',\n          data,\n          level: 'error',\n          type: 'http',\n        },\n        hint,\n      );\n    } else {\n      const response = handlerData.response ;\n      const data = {\n        ...handlerData.fetchData,\n        status_code: response && response.status,\n      };\n      const hint = {\n        input: handlerData.args,\n        response,\n        startTimestamp,\n        endTimestamp,\n      };\n      const level = getBreadcrumbLogLevelFromHttpStatusCode(data.status_code);\n\n      addBreadcrumb(\n        {\n          category: 'fetch',\n          data,\n          type: 'http',\n          level,\n        },\n        hint,\n      );\n    }\n  };\n}\n\n/**\n * Creates breadcrumbs from history API calls\n */\nfunction _getHistoryBreadcrumbHandler(client) {\n  return function _historyBreadcrumb(handlerData) {\n    if (getClient() !== client) {\n      return;\n    }\n\n    let from = handlerData.from;\n    let to = handlerData.to;\n    const parsedLoc = parseUrl(WINDOW.location.href);\n    let parsedFrom = from ? parseUrl(from) : undefined;\n    const parsedTo = parseUrl(to);\n\n    // Initial pushState doesn't provide `from` information\n    if (!parsedFrom || !parsedFrom.path) {\n      parsedFrom = parsedLoc;\n    }\n\n    // Use only the path component of the URL if the URL matches the current\n    // document (almost all the time when using pushState)\n    if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n      to = parsedTo.relative;\n    }\n    if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n      from = parsedFrom.relative;\n    }\n\n    addBreadcrumb({\n      category: 'navigation',\n      data: {\n        from,\n        to,\n      },\n    });\n  };\n}\n\nfunction _isEvent(event) {\n  return !!event && !!(event ).target;\n}\n\nexport { breadcrumbsIntegration };\n//# sourceMappingURL=breadcrumbs.js.map\n","import { defineIntegration } from '@sentry/core';\nimport { fill, getFunctionName, getOriginalFunction } from '@sentry/utils';\nimport { WINDOW, wrap } from '../helpers.js';\n\nconst DEFAULT_EVENT_TARGET = [\n  'EventTarget',\n  'Window',\n  'Node',\n  'ApplicationCache',\n  'AudioTrackList',\n  'BroadcastChannel',\n  'ChannelMergerNode',\n  'CryptoOperation',\n  'EventSource',\n  'FileReader',\n  'HTMLUnknownElement',\n  'IDBDatabase',\n  'IDBRequest',\n  'IDBTransaction',\n  'KeyOperation',\n  'MediaController',\n  'MessagePort',\n  'ModalWindow',\n  'Notification',\n  'SVGElementInstance',\n  'Screen',\n  'SharedWorker',\n  'TextTrack',\n  'TextTrackCue',\n  'TextTrackList',\n  'WebSocket',\n  'WebSocketWorker',\n  'Worker',\n  'XMLHttpRequest',\n  'XMLHttpRequestEventTarget',\n  'XMLHttpRequestUpload',\n];\n\nconst INTEGRATION_NAME = 'BrowserApiErrors';\n\nconst _browserApiErrorsIntegration = ((options = {}) => {\n  const _options = {\n    XMLHttpRequest: true,\n    eventTarget: true,\n    requestAnimationFrame: true,\n    setInterval: true,\n    setTimeout: true,\n    ...options,\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    // TODO: This currently only works for the first client this is setup\n    // We may want to adjust this to check for client etc.\n    setupOnce() {\n      if (_options.setTimeout) {\n        fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n      }\n\n      if (_options.setInterval) {\n        fill(WINDOW, 'setInterval', _wrapTimeFunction);\n      }\n\n      if (_options.requestAnimationFrame) {\n        fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n      }\n\n      if (_options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n        fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n      }\n\n      const eventTargetOption = _options.eventTarget;\n      if (eventTargetOption) {\n        const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n        eventTarget.forEach(_wrapEventTarget);\n      }\n    },\n  };\n}) ;\n\n/**\n * Wrap timer functions and event targets to catch errors and provide better meta data.\n */\nconst browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);\n\nfunction _wrapTimeFunction(original) {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  return function ( ...args) {\n    const originalCallback = args[0];\n    args[0] = wrap(originalCallback, {\n      mechanism: {\n        data: { function: getFunctionName(original) },\n        handled: false,\n        type: 'instrument',\n      },\n    });\n    return original.apply(this, args);\n  };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _wrapRAF(original) {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  return function ( callback) {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    return original.apply(this, [\n      wrap(callback, {\n        mechanism: {\n          data: {\n            function: 'requestAnimationFrame',\n            handler: getFunctionName(original),\n          },\n          handled: false,\n          type: 'instrument',\n        },\n      }),\n    ]);\n  };\n}\n\nfunction _wrapXHR(originalSend) {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  return function ( ...args) {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const xhr = this;\n    const xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n    xmlHttpRequestProps.forEach(prop => {\n      if (prop in xhr && typeof xhr[prop] === 'function') {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        fill(xhr, prop, function (original) {\n          const wrapOptions = {\n            mechanism: {\n              data: {\n                function: prop,\n                handler: getFunctionName(original),\n              },\n              handled: false,\n              type: 'instrument',\n            },\n          };\n\n          // If Instrument integration has been called before BrowserApiErrors, get the name of original function\n          const originalFunction = getOriginalFunction(original);\n          if (originalFunction) {\n            wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n          }\n\n          // Otherwise wrap directly\n          return wrap(original, wrapOptions);\n        });\n      }\n    });\n\n    return originalSend.apply(this, args);\n  };\n}\n\nfunction _wrapEventTarget(target) {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const globalObject = WINDOW ;\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n  const proto = globalObject[target] && globalObject[target].prototype;\n\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n  if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n    return;\n  }\n\n  fill(proto, 'addEventListener', function (original,)\n\n {\n    return function (\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n      eventName,\n      fn,\n      options,\n    ) {\n      try {\n        if (typeof fn.handleEvent === 'function') {\n          // ESlint disable explanation:\n          //  First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n          //  introduce a bug here, because bind returns a new function that doesn't have our\n          //  flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n          //  Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n          // eslint-disable-next-line @typescript-eslint/unbound-method\n          fn.handleEvent = wrap(fn.handleEvent, {\n            mechanism: {\n              data: {\n                function: 'handleEvent',\n                handler: getFunctionName(fn),\n                target,\n              },\n              handled: false,\n              type: 'instrument',\n            },\n          });\n        }\n      } catch (err) {\n        // can sometimes get 'Permission denied to access property \"handle Event'\n      }\n\n      return original.apply(this, [\n        eventName,\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        wrap(fn , {\n          mechanism: {\n            data: {\n              function: 'addEventListener',\n              handler: getFunctionName(fn),\n              target,\n            },\n            handled: false,\n            type: 'instrument',\n          },\n        }),\n        options,\n      ]);\n    };\n  });\n\n  fill(\n    proto,\n    'removeEventListener',\n    function (\n      originalRemoveEventListener,\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    ) {\n      return function (\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n        eventName,\n        fn,\n        options,\n      ) {\n        /**\n         * There are 2 possible scenarios here:\n         *\n         * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n         * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n         * as a pass-through, and call original `removeEventListener` with it.\n         *\n         * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n         * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n         * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n         * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n         * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n         *\n         * When someone adds a handler prior to initialization, and then do it again, but after,\n         * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n         * to get rid of the initial handler and it'd stick there forever.\n         */\n        const wrappedEventHandler = fn ;\n        try {\n          const originalEventHandler = wrappedEventHandler && wrappedEventHandler.__sentry_wrapped__;\n          if (originalEventHandler) {\n            originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n          }\n        } catch (e) {\n          // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n        }\n        return originalRemoveEventListener.call(this, eventName, wrappedEventHandler, options);\n      };\n    },\n  );\n}\n\nexport { browserApiErrorsIntegration };\n//# sourceMappingURL=browserapierrors.js.map\n","import { defineIntegration, getClient, captureEvent } from '@sentry/core';\nimport { addGlobalErrorInstrumentationHandler, addGlobalUnhandledRejectionInstrumentationHandler, isPrimitive, isString, getLocationHref, UNKNOWN_FUNCTION, logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { eventFromUnknownInput } from '../eventbuilder.js';\nimport { shouldIgnoreOnError } from '../helpers.js';\n\nconst INTEGRATION_NAME = 'GlobalHandlers';\n\nconst _globalHandlersIntegration = ((options = {}) => {\n  const _options = {\n    onerror: true,\n    onunhandledrejection: true,\n    ...options,\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    setupOnce() {\n      Error.stackTraceLimit = 50;\n    },\n    setup(client) {\n      if (_options.onerror) {\n        _installGlobalOnErrorHandler(client);\n        globalHandlerLog('onerror');\n      }\n      if (_options.onunhandledrejection) {\n        _installGlobalOnUnhandledRejectionHandler(client);\n        globalHandlerLog('onunhandledrejection');\n      }\n    },\n  };\n}) ;\n\nconst globalHandlersIntegration = defineIntegration(_globalHandlersIntegration);\n\nfunction _installGlobalOnErrorHandler(client) {\n  addGlobalErrorInstrumentationHandler(data => {\n    const { stackParser, attachStacktrace } = getOptions();\n\n    if (getClient() !== client || shouldIgnoreOnError()) {\n      return;\n    }\n\n    const { msg, url, line, column, error } = data;\n\n    const event = _enhanceEventWithInitialFrame(\n      eventFromUnknownInput(stackParser, error || msg, undefined, attachStacktrace, false),\n      url,\n      line,\n      column,\n    );\n\n    event.level = 'error';\n\n    captureEvent(event, {\n      originalException: error,\n      mechanism: {\n        handled: false,\n        type: 'onerror',\n      },\n    });\n  });\n}\n\nfunction _installGlobalOnUnhandledRejectionHandler(client) {\n  addGlobalUnhandledRejectionInstrumentationHandler(e => {\n    const { stackParser, attachStacktrace } = getOptions();\n\n    if (getClient() !== client || shouldIgnoreOnError()) {\n      return;\n    }\n\n    const error = _getUnhandledRejectionError(e );\n\n    const event = isPrimitive(error)\n      ? _eventFromRejectionWithPrimitive(error)\n      : eventFromUnknownInput(stackParser, error, undefined, attachStacktrace, true);\n\n    event.level = 'error';\n\n    captureEvent(event, {\n      originalException: error,\n      mechanism: {\n        handled: false,\n        type: 'onunhandledrejection',\n      },\n    });\n  });\n}\n\nfunction _getUnhandledRejectionError(error) {\n  if (isPrimitive(error)) {\n    return error;\n  }\n\n  // dig the object of the rejection out of known event types\n  try {\n\n    // PromiseRejectionEvents store the object of the rejection under 'reason'\n    // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n    if ('reason' in (error )) {\n      return (error ).reason;\n    }\n\n    // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n    // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n    // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n    // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n    // https://github.com/getsentry/sentry-javascript/issues/2380\n    if ('detail' in (error ) && 'reason' in (error ).detail) {\n      return (error ).detail.reason;\n    }\n  } catch (e2) {} // eslint-disable-line no-empty\n\n  return error;\n}\n\n/**\n * Create an event from a promise rejection where the `reason` is a primitive.\n *\n * @param reason: The `reason` property of the promise rejection\n * @returns An Event object with an appropriate `exception` value\n */\nfunction _eventFromRejectionWithPrimitive(reason) {\n  return {\n    exception: {\n      values: [\n        {\n          type: 'UnhandledRejection',\n          // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n          value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n        },\n      ],\n    },\n  };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _enhanceEventWithInitialFrame(event, url, line, column) {\n  // event.exception\n  const e = (event.exception = event.exception || {});\n  // event.exception.values\n  const ev = (e.values = e.values || []);\n  // event.exception.values[0]\n  const ev0 = (ev[0] = ev[0] || {});\n  // event.exception.values[0].stacktrace\n  const ev0s = (ev0.stacktrace = ev0.stacktrace || {});\n  // event.exception.values[0].stacktrace.frames\n  const ev0sf = (ev0s.frames = ev0s.frames || []);\n\n  const colno = isNaN(parseInt(column, 10)) ? undefined : column;\n  const lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n  const filename = isString(url) && url.length > 0 ? url : getLocationHref();\n\n  // event.exception.values[0].stacktrace.frames\n  if (ev0sf.length === 0) {\n    ev0sf.push({\n      colno,\n      filename,\n      function: UNKNOWN_FUNCTION,\n      in_app: true,\n      lineno,\n    });\n  }\n\n  return event;\n}\n\nfunction globalHandlerLog(type) {\n  DEBUG_BUILD && logger.log(`Global Handler attached: ${type}`);\n}\n\nfunction getOptions() {\n  const client = getClient();\n  const options = (client && client.getOptions()) || {\n    stackParser: () => [],\n    attachStacktrace: false,\n  };\n  return options;\n}\n\nexport { globalHandlersIntegration };\n//# sourceMappingURL=globalhandlers.js.map\n","import { defineIntegration } from '@sentry/core';\nimport { WINDOW } from '../helpers.js';\n\n/**\n * Collects information about HTTP request headers and\n * attaches them to the event.\n */\nconst httpContextIntegration = defineIntegration(() => {\n  return {\n    name: 'HttpContext',\n    preprocessEvent(event) {\n      // if none of the information we want exists, don't bother\n      if (!WINDOW.navigator && !WINDOW.location && !WINDOW.document) {\n        return;\n      }\n\n      // grab as much info as exists and add it to the event\n      const url = (event.request && event.request.url) || (WINDOW.location && WINDOW.location.href);\n      const { referrer } = WINDOW.document || {};\n      const { userAgent } = WINDOW.navigator || {};\n\n      const headers = {\n        ...(event.request && event.request.headers),\n        ...(referrer && { Referer: referrer }),\n        ...(userAgent && { 'User-Agent': userAgent }),\n      };\n      const request = { ...event.request, ...(url && { url }), headers };\n\n      event.request = request;\n    },\n  };\n});\n\nexport { httpContextIntegration };\n//# sourceMappingURL=httpcontext.js.map\n","import { defineIntegration } from '@sentry/core';\nimport { applyAggregateErrorsToEvent } from '@sentry/utils';\nimport { exceptionFromError } from '../eventbuilder.js';\n\nconst DEFAULT_KEY = 'cause';\nconst DEFAULT_LIMIT = 5;\n\nconst INTEGRATION_NAME = 'LinkedErrors';\n\nconst _linkedErrorsIntegration = ((options = {}) => {\n  const limit = options.limit || DEFAULT_LIMIT;\n  const key = options.key || DEFAULT_KEY;\n\n  return {\n    name: INTEGRATION_NAME,\n    preprocessEvent(event, hint, client) {\n      const options = client.getOptions();\n\n      applyAggregateErrorsToEvent(\n        // This differs from the LinkedErrors integration in core by using a different exceptionFromError function\n        exceptionFromError,\n        options.stackParser,\n        options.maxValueLength,\n        key,\n        limit,\n        event,\n        hint,\n      );\n    },\n  };\n}) ;\n\n/**\n * Aggregrate linked errors in an event.\n */\nconst linkedErrorsIntegration = defineIntegration(_linkedErrorsIntegration);\n\nexport { linkedErrorsIntegration };\n//# sourceMappingURL=linkederrors.js.map\n","import { inboundFiltersIntegration, functionToStringIntegration, dedupeIntegration, getIntegrationsToSetup, initAndBind, getCurrentScope, lastEventId, getReportDialogEndpoint, startSession, captureSession, getClient } from '@sentry/core';\nimport { consoleSandbox, supportsFetch, logger, stackParserFromStackParserOptions } from '@sentry/utils';\nimport { addHistoryInstrumentationHandler } from '@sentry-internal/browser-utils';\nimport { BrowserClient } from './client.js';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { WINDOW } from './helpers.js';\nimport { breadcrumbsIntegration } from './integrations/breadcrumbs.js';\nimport { browserApiErrorsIntegration } from './integrations/browserapierrors.js';\nimport { globalHandlersIntegration } from './integrations/globalhandlers.js';\nimport { httpContextIntegration } from './integrations/httpcontext.js';\nimport { linkedErrorsIntegration } from './integrations/linkederrors.js';\nimport { defaultStackParser } from './stack-parsers.js';\nimport { makeFetchTransport } from './transports/fetch.js';\n\n/** Get the default integrations for the browser SDK. */\nfunction getDefaultIntegrations(_options) {\n  /**\n   * Note: Please make sure this stays in sync with Angular SDK, which re-exports\n   * `getDefaultIntegrations` but with an adjusted set of integrations.\n   */\n  return [\n    inboundFiltersIntegration(),\n    functionToStringIntegration(),\n    browserApiErrorsIntegration(),\n    breadcrumbsIntegration(),\n    globalHandlersIntegration(),\n    linkedErrorsIntegration(),\n    dedupeIntegration(),\n    httpContextIntegration(),\n  ];\n}\n\nfunction applyDefaultOptions(optionsArg = {}) {\n  const defaultOptions = {\n    defaultIntegrations: getDefaultIntegrations(),\n    release:\n      typeof __SENTRY_RELEASE__ === 'string' // This allows build tooling to find-and-replace __SENTRY_RELEASE__ to inject a release value\n        ? __SENTRY_RELEASE__\n        : WINDOW.SENTRY_RELEASE && WINDOW.SENTRY_RELEASE.id // This supports the variable that sentry-webpack-plugin injects\n          ? WINDOW.SENTRY_RELEASE.id\n          : undefined,\n    autoSessionTracking: true,\n    sendClientReports: true,\n  };\n\n  // TODO: Instead of dropping just `defaultIntegrations`, we should simply\n  // call `dropUndefinedKeys` on the entire `optionsArg`.\n  // However, for this to work we need to adjust the `hasTracingEnabled()` logic\n  // first as it differentiates between `undefined` and the key not being in the object.\n  if (optionsArg.defaultIntegrations == null) {\n    delete optionsArg.defaultIntegrations;\n  }\n\n  return { ...defaultOptions, ...optionsArg };\n}\n\nfunction shouldShowBrowserExtensionError() {\n  const windowWithMaybeExtension =\n    typeof WINDOW.window !== 'undefined' && (WINDOW );\n  if (!windowWithMaybeExtension) {\n    // No need to show the error if we're not in a browser window environment (e.g. service workers)\n    return false;\n  }\n\n  const extensionKey = windowWithMaybeExtension.chrome ? 'chrome' : 'browser';\n  const extensionObject = windowWithMaybeExtension[extensionKey];\n\n  const runtimeId = extensionObject && extensionObject.runtime && extensionObject.runtime.id;\n  const href = (WINDOW.location && WINDOW.location.href) || '';\n\n  const extensionProtocols = ['chrome-extension:', 'moz-extension:', 'ms-browser-extension:', 'safari-web-extension:'];\n\n  // Running the SDK in a dedicated extension page and calling Sentry.init is fine; no risk of data leakage\n  const isDedicatedExtensionPage =\n    !!runtimeId && WINDOW === WINDOW.top && extensionProtocols.some(protocol => href.startsWith(`${protocol}//`));\n\n  // Running the SDK in NW.js, which appears like a browser extension but isn't, is also fine\n  // see: https://github.com/getsentry/sentry-javascript/issues/12668\n  const isNWjs = typeof windowWithMaybeExtension.nw !== 'undefined';\n\n  return !!runtimeId && !isDedicatedExtensionPage && !isNWjs;\n}\n\n/**\n * A magic string that build tooling can leverage in order to inject a release value into the SDK.\n */\n\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n *   dsn: '__DSN__',\n *   // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n *   message: 'My Breadcrumb',\n *   // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n *   message: 'Manual',\n *   stacktrace: [\n *     // ...\n *   ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nfunction init(browserOptions = {}) {\n  const options = applyDefaultOptions(browserOptions);\n\n  if (shouldShowBrowserExtensionError()) {\n    consoleSandbox(() => {\n      // eslint-disable-next-line no-console\n      console.error(\n        '[Sentry] You cannot run Sentry this way in a browser extension, check: https://docs.sentry.io/platforms/javascript/best-practices/browser-extensions/',\n      );\n    });\n    return;\n  }\n\n  if (DEBUG_BUILD) {\n    if (!supportsFetch()) {\n      logger.warn(\n        'No Fetch API detected. The Sentry SDK requires a Fetch API compatible environment to send events. Please add a Fetch API polyfill.',\n      );\n    }\n  }\n  const clientOptions = {\n    ...options,\n    stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n    integrations: getIntegrationsToSetup(options),\n    transport: options.transport || makeFetchTransport,\n  };\n\n  const client = initAndBind(BrowserClient, clientOptions);\n\n  if (options.autoSessionTracking) {\n    startSessionTracking();\n  }\n\n  return client;\n}\n\n/**\n * All properties the report dialog supports\n */\n\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nfunction showReportDialog(options = {}) {\n  // doesn't work without a document (React Native)\n  if (!WINDOW.document) {\n    DEBUG_BUILD && logger.error('Global document not defined in showReportDialog call');\n    return;\n  }\n\n  const scope = getCurrentScope();\n  const client = scope.getClient();\n  const dsn = client && client.getDsn();\n\n  if (!dsn) {\n    DEBUG_BUILD && logger.error('DSN not configured for showReportDialog call');\n    return;\n  }\n\n  if (scope) {\n    options.user = {\n      ...scope.getUser(),\n      ...options.user,\n    };\n  }\n\n  if (!options.eventId) {\n    const eventId = lastEventId();\n    if (eventId) {\n      options.eventId = eventId;\n    }\n  }\n\n  const script = WINDOW.document.createElement('script');\n  script.async = true;\n  script.crossOrigin = 'anonymous';\n  script.src = getReportDialogEndpoint(dsn, options);\n\n  if (options.onLoad) {\n    script.onload = options.onLoad;\n  }\n\n  const { onClose } = options;\n  if (onClose) {\n    const reportDialogClosedMessageHandler = (event) => {\n      if (event.data === '__sentry_reportdialog_closed__') {\n        try {\n          onClose();\n        } finally {\n          WINDOW.removeEventListener('message', reportDialogClosedMessageHandler);\n        }\n      }\n    };\n    WINDOW.addEventListener('message', reportDialogClosedMessageHandler);\n  }\n\n  const injectionPoint = WINDOW.document.head || WINDOW.document.body;\n  if (injectionPoint) {\n    injectionPoint.appendChild(script);\n  } else {\n    DEBUG_BUILD && logger.error('Not injecting report dialog. No injection point found in HTML');\n  }\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nfunction forceLoad() {\n  // Noop\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nfunction onLoad(callback) {\n  callback();\n}\n\n/**\n * Enable automatic Session Tracking for the initial page load.\n */\nfunction startSessionTracking() {\n  if (typeof WINDOW.document === 'undefined') {\n    DEBUG_BUILD && logger.warn('Session tracking in non-browser environment with @sentry/browser is not supported.');\n    return;\n  }\n\n  // The session duration for browser sessions does not track a meaningful\n  // concept that can be used as a metric.\n  // Automatically captured sessions are akin to page views, and thus we\n  // discard their duration.\n  startSession({ ignoreDuration: true });\n  captureSession();\n\n  // We want to create a session for every navigation as well\n  addHistoryInstrumentationHandler(({ from, to }) => {\n    // Don't create an additional session for the initial route or if the location did not change\n    if (from !== undefined && from !== to) {\n      startSession({ ignoreDuration: true });\n      captureSession();\n    }\n  });\n}\n\n/**\n * Captures user feedback and sends it to Sentry.\n *\n * @deprecated Use `captureFeedback` instead.\n */\nfunction captureUserFeedback(feedback) {\n  const client = getClient();\n  if (client) {\n    // eslint-disable-next-line deprecation/deprecation\n    client.captureUserFeedback(feedback);\n  }\n}\n\nexport { captureUserFeedback, forceLoad, getDefaultIntegrations, init, onLoad, showReportDialog };\n//# sourceMappingURL=sdk.js.map\n","const DEFAULT_HOOKS = ['activate', 'mount', 'update'];\n\nexport { DEFAULT_HOOKS };\n//# sourceMappingURL=constants.js.map\n","/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nconst DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);\n\nexport { DEBUG_BUILD };\n//# sourceMappingURL=debug-build.js.map\n","// Vendored from https://github.com/vuejs/vue/blob/612fb89547711cacb030a3893a0065b785802860/src/core/util/debug.js\n// with types only changes.\n\n// The MIT License (MIT)\n\n// Copyright (c) 2013-present, Yuxi (Evan) You\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nconst classifyRE = /(?:^|[-_])(\\w)/g;\nconst classify = (str) => str.replace(classifyRE, c => c.toUpperCase()).replace(/[-_]/g, '');\n\nconst ROOT_COMPONENT_NAME = '<Root>';\nconst ANONYMOUS_COMPONENT_NAME = '<Anonymous>';\n\nconst repeat = (str, n) => {\n  return str.repeat(n);\n};\n\nconst formatComponentName = (vm, includeFile) => {\n  if (!vm) {\n    return ANONYMOUS_COMPONENT_NAME;\n  }\n\n  if (vm.$root === vm) {\n    return ROOT_COMPONENT_NAME;\n  }\n\n  // https://github.com/getsentry/sentry-javascript/issues/5204 $options can be undefined\n  if (!vm.$options) {\n    return ANONYMOUS_COMPONENT_NAME;\n  }\n\n  const options = vm.$options;\n\n  let name = options.name || options._componentTag || options.__name;\n  const file = options.__file;\n  if (!name && file) {\n    const match = file.match(/([^/\\\\]+)\\.vue$/);\n    if (match) {\n      name = match[1];\n    }\n  }\n\n  return (\n    (name ? `<${classify(name)}>` : ANONYMOUS_COMPONENT_NAME) + (file && includeFile !== false ? ` at ${file}` : '')\n  );\n};\n\nconst generateComponentTrace = (vm) => {\n  if (vm && (vm._isVue || vm.__isVue) && vm.$parent) {\n    const tree = [];\n    let currentRecursiveSequence = 0;\n    while (vm) {\n      if (tree.length > 0) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const last = tree[tree.length - 1] ;\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        if (last.constructor === vm.constructor) {\n          currentRecursiveSequence++;\n          vm = vm.$parent; // eslint-disable-line no-param-reassign\n          continue;\n        } else if (currentRecursiveSequence > 0) {\n          tree[tree.length - 1] = [last, currentRecursiveSequence];\n          currentRecursiveSequence = 0;\n        }\n      }\n      tree.push(vm);\n      vm = vm.$parent; // eslint-disable-line no-param-reassign\n    }\n\n    const formattedTree = tree\n      .map(\n        (vm, i) =>\n          `${\n            (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) +\n            (Array.isArray(vm)\n              ? `${formatComponentName(vm[0])}... (${vm[1]} recursive calls)`\n              : formatComponentName(vm))\n          }`,\n      )\n      .join('\\n');\n\n    return `\\n\\nfound in\\n\\n${formattedTree}`;\n  }\n\n  return `\\n\\n(found in ${formatComponentName(vm)})`;\n};\n\nexport { formatComponentName, generateComponentTrace };\n//# sourceMappingURL=components.js.map\n","import { captureException } from '@sentry/core';\nimport { consoleSandbox } from '@sentry/utils';\nimport { formatComponentName, generateComponentTrace } from './vendor/components.js';\n\nconst attachErrorHandler = (app, options) => {\n  const { errorHandler: originalErrorHandler, warnHandler, silent } = app.config;\n\n  app.config.errorHandler = (error, vm, lifecycleHook) => {\n    const componentName = formatComponentName(vm, false);\n    const trace = vm ? generateComponentTrace(vm) : '';\n    const metadata = {\n      componentName,\n      lifecycleHook,\n      trace,\n    };\n\n    if (options.attachProps && vm) {\n      // Vue2 - $options.propsData\n      // Vue3 - $props\n      if (vm.$options && vm.$options.propsData) {\n        metadata.propsData = vm.$options.propsData;\n      } else if (vm.$props) {\n        metadata.propsData = vm.$props;\n      }\n    }\n\n    // Capture exception in the next event loop, to make sure that all breadcrumbs are recorded in time.\n    setTimeout(() => {\n      captureException(error, {\n        captureContext: { contexts: { vue: metadata } },\n        mechanism: { handled: false },\n      });\n    });\n\n    // Check if the current `app.config.errorHandler` is explicitly set by the user before calling it.\n    if (typeof originalErrorHandler === 'function' && app.config.errorHandler) {\n      (originalErrorHandler ).call(app, error, vm, lifecycleHook);\n    }\n\n    if (options.logErrors) {\n      const hasConsole = typeof console !== 'undefined';\n      const message = `Error in ${lifecycleHook}: \"${error && error.toString()}\"`;\n\n      if (warnHandler) {\n        (warnHandler ).call(null, message, vm, trace);\n      } else if (hasConsole && !silent) {\n        consoleSandbox(() => {\n          // eslint-disable-next-line no-console\n          console.error(`[Vue warn]: ${message}${trace}`);\n        });\n      }\n    }\n  };\n};\n\nexport { attachErrorHandler };\n//# sourceMappingURL=errorhandler.js.map\n","import { getActiveSpan, startInactiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/browser';\nimport { logger, timestampInSeconds } from '@sentry/utils';\nimport { DEFAULT_HOOKS } from './constants.js';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { formatComponentName } from './vendor/components.js';\n\nconst VUE_OP = 'ui.vue';\n\n// Mappings from operation to corresponding lifecycle hook.\nconst HOOKS = {\n  activate: ['activated', 'deactivated'],\n  create: ['beforeCreate', 'created'],\n  // Vue 3\n  unmount: ['beforeUnmount', 'unmounted'],\n  // Vue 2\n  destroy: ['beforeDestroy', 'destroyed'],\n  mount: ['beforeMount', 'mounted'],\n  update: ['beforeUpdate', 'updated'],\n};\n\n/** Finish top-level span and activity with a debounce configured using `timeout` option */\nfunction finishRootSpan(vm, timestamp, timeout) {\n  if (vm.$_sentryRootSpanTimer) {\n    clearTimeout(vm.$_sentryRootSpanTimer);\n  }\n\n  vm.$_sentryRootSpanTimer = setTimeout(() => {\n    if (vm.$root && vm.$root.$_sentryRootSpan) {\n      vm.$root.$_sentryRootSpan.end(timestamp);\n      vm.$root.$_sentryRootSpan = undefined;\n    }\n  }, timeout);\n}\n\n/** Find if the current component exists in the provided `TracingOptions.trackComponents` array option. */\nfunction findTrackComponent(trackComponents, formattedName) {\n  function extractComponentName(name) {\n    return name.replace(/^<([^\\s]*)>(?: at [^\\s]*)?$/, '$1');\n  }\n\n  const isMatched = trackComponents.some(compo => {\n    return extractComponentName(formattedName) === extractComponentName(compo);\n  });\n\n  return isMatched;\n}\n\nconst createTracingMixins = (options) => {\n  const hooks = (options.hooks || [])\n    .concat(DEFAULT_HOOKS)\n    // Removing potential duplicates\n    .filter((value, index, self) => self.indexOf(value) === index);\n\n  const mixins = {};\n\n  for (const operation of hooks) {\n    // Retrieve corresponding hooks from Vue lifecycle.\n    // eg. mount => ['beforeMount', 'mounted']\n    const internalHooks = HOOKS[operation];\n    if (!internalHooks) {\n      DEBUG_BUILD && logger.warn(`Unknown hook: ${operation}`);\n      continue;\n    }\n\n    for (const internalHook of internalHooks) {\n      mixins[internalHook] = function () {\n        const isRoot = this.$root === this;\n\n        if (isRoot) {\n          const activeSpan = getActiveSpan();\n          if (activeSpan) {\n            this.$_sentryRootSpan =\n              this.$_sentryRootSpan ||\n              startInactiveSpan({\n                name: 'Application Render',\n                op: `${VUE_OP}.render`,\n                attributes: {\n                  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.vue',\n                },\n              });\n          }\n        }\n\n        // Skip components that we don't want to track to minimize the noise and give a more granular control to the user\n        const name = formatComponentName(this, false);\n\n        const shouldTrack = Array.isArray(options.trackComponents)\n          ? findTrackComponent(options.trackComponents, name)\n          : options.trackComponents;\n\n        // We always want to track root component\n        if (!isRoot && !shouldTrack) {\n          return;\n        }\n\n        this.$_sentrySpans = this.$_sentrySpans || {};\n\n        // Start a new span if current hook is a 'before' hook.\n        // Otherwise, retrieve the current span and finish it.\n        if (internalHook == internalHooks[0]) {\n          const activeSpan = (this.$root && this.$root.$_sentryRootSpan) || getActiveSpan();\n          if (activeSpan) {\n            // Cancel old span for this hook operation in case it didn't get cleaned up. We're not actually sure if it\n            // will ever be the case that cleanup hooks re not called, but we had users report that spans didn't get\n            // finished so we finish the span before starting a new one, just to be sure.\n            const oldSpan = this.$_sentrySpans[operation];\n            if (oldSpan) {\n              oldSpan.end();\n            }\n\n            this.$_sentrySpans[operation] = startInactiveSpan({\n              name: `Vue ${name}`,\n              op: `${VUE_OP}.${operation}`,\n              attributes: {\n                [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.vue',\n              },\n              // UI spans should only be created if there is an active root span (transaction)\n              onlyIfParent: true,\n            });\n          }\n        } else {\n          // The span should already be added via the first handler call (in the 'before' hook)\n          const span = this.$_sentrySpans[operation];\n          // The before hook did not start the tracking span, so the span was not added.\n          // This is probably because it happened before there is an active transaction\n          if (!span) return;\n          span.end();\n\n          finishRootSpan(this, timestampInSeconds(), options.timeout);\n        }\n      };\n    }\n  }\n\n  return mixins;\n};\n\nexport { createTracingMixins, findTrackComponent };\n//# sourceMappingURL=tracing.js.map\n","import { defineIntegration, hasTracingEnabled } from '@sentry/core';\nimport { GLOBAL_OBJ, consoleSandbox, arrayify } from '@sentry/utils';\nimport { DEFAULT_HOOKS } from './constants.js';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { attachErrorHandler } from './errorhandler.js';\nimport { createTracingMixins } from './tracing.js';\n\nconst globalWithVue = GLOBAL_OBJ ;\n\nconst DEFAULT_CONFIG = {\n  Vue: globalWithVue.Vue,\n  attachProps: true,\n  logErrors: true,\n  attachErrorHandler: true,\n  hooks: DEFAULT_HOOKS,\n  timeout: 2000,\n  trackComponents: false,\n};\n\nconst INTEGRATION_NAME = 'Vue';\n\nconst _vueIntegration = ((integrationOptions = {}) => {\n  return {\n    name: INTEGRATION_NAME,\n    setup(client) {\n      _setupIntegration(client, integrationOptions);\n    },\n  };\n}) ;\n\nconst vueIntegration = defineIntegration(_vueIntegration);\n\nfunction _setupIntegration(client, integrationOptions) {\n  const options = { ...DEFAULT_CONFIG, ...client.getOptions(), ...integrationOptions };\n  if (!options.Vue && !options.app) {\n    consoleSandbox(() => {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `[@sentry/vue]: Misconfigured SDK. Vue specific errors will not be captured.\nUpdate your \\`Sentry.init\\` call with an appropriate config option:\n\\`app\\` (Application Instance - Vue 3) or \\`Vue\\` (Vue Constructor - Vue 2).`,\n      );\n    });\n    return;\n  }\n\n  if (options.app) {\n    const apps = arrayify(options.app);\n    apps.forEach(app => vueInit(app, options));\n  } else if (options.Vue) {\n    vueInit(options.Vue, options);\n  }\n}\n\nconst vueInit = (app, options) => {\n  if (DEBUG_BUILD) {\n    // Check app is not mounted yet - should be mounted _after_ init()!\n    // This is _somewhat_ private, but in the case that this doesn't exist we simply ignore it\n    // See: https://github.com/vuejs/core/blob/eb2a83283caa9de0a45881d860a3cbd9d0bdd279/packages/runtime-core/src/component.ts#L394\n    const appWithInstance = app\n\n;\n\n    const isMounted = appWithInstance._instance && appWithInstance._instance.isMounted;\n    if (isMounted === true) {\n      consoleSandbox(() => {\n        // eslint-disable-next-line no-console\n        console.warn(\n          '[@sentry/vue]: Misconfigured SDK. Vue app is already mounted. Make sure to call `app.mount()` after `Sentry.init()`.',\n        );\n      });\n    }\n  }\n\n  if (options.attachErrorHandler) {\n    attachErrorHandler(app, options);\n  }\n\n  if (hasTracingEnabled(options)) {\n    app.mixin(\n      createTracingMixins({\n        ...options,\n        ...options.tracingOptions,\n      }),\n    );\n  }\n};\n\nexport { vueIntegration };\n//# sourceMappingURL=integration.js.map\n","import { SDK_VERSION, getDefaultIntegrations, init as init$1 } from '@sentry/browser';\nimport { vueIntegration } from './integration.js';\n\n/**\n * Inits the Vue SDK\n */\nfunction init(\n  config = {},\n) {\n  const options = {\n    _metadata: {\n      sdk: {\n        name: 'sentry.javascript.vue',\n        packages: [\n          {\n            name: 'npm:@sentry/vue',\n            version: SDK_VERSION,\n          },\n        ],\n        version: SDK_VERSION,\n      },\n    },\n    defaultIntegrations: [...getDefaultIntegrations(config), vueIntegration()],\n    ...config,\n  };\n\n  return init$1(options);\n}\n\nexport { init };\n//# sourceMappingURL=sdk.js.map\n","export default function () {\r\n  const style = document.createElement(\"style\");\r\n  document.head.insertAdjacentElement(\"beforeend\", style);\r\n\r\n  const updateVPStyles = () =>\r\n    (style.textContent = `\r\n    :root,\r\n    :root *,\r\n    :root *::before,\r\n    :root *::after {\r\n      --1vw: ${document.body.clientWidth / 100}px;\r\n      --100vw: calc(var(--1vw) * 100);\r\n      --1vh: ${document.documentElement.clientHeight / 100}px;\r\n      --100vh: calc(var(--1vh) * 100);\r\n    }\r\n  `);\r\n\r\n  const createResizeWatcher = () => {\r\n    let debounce;\r\n    const onResize = () => {\r\n      clearTimeout(debounce);\r\n      debounce = window.setTimeout(updateVPStyles, 250);\r\n    };\r\n    window.addEventListener(\"resize\", onResize);\r\n  };\r\n\r\n  const initialize = () => {\r\n    let limiter = 0;\r\n    let updateInterval = window.setInterval(() => {\r\n      updateVPStyles();\r\n      if (++limiter >= 10) {\r\n        window.clearInterval(updateInterval);\r\n      }\r\n    }, 100);\r\n\r\n    updateVPStyles();\r\n    createResizeWatcher();\r\n  };\r\n\r\n  initialize();\r\n}\r\n","import { createApp } from \"vue\";\r\nimport * as components from \"./components\";\r\nimport registerVuePlugins from \"./plugins\";\r\nimport CreateWebComponent from \"./util/vue/_createWebComponent\";\r\nimport { envrionmentTypes } from \"@/constants/envrionment\";\r\nimport * as Sentry from \"@sentry/vue\";\r\n\r\nimport \"./css/main.css\";\r\n\r\nimport viewportSizes from \"./util/viewportSizes\";\r\nwindow.addEventListener(\"DOMContentLoaded\", viewportSizes);\r\n\r\nfunction isKenticoPageBuilder() {\r\n  return document.documentElement.classList.contains(\"kentico-page-builder\");\r\n}\r\n\r\n/**\r\n * Special Vue initialization within Kentico page builder\r\n\r\n * Our standard Vue app setup doesn't work because page builder loads widgets asynchronously and injects them into the DOM after Vue is initialzed.\r\n * Here, we instead wrap each published Vue component in a custom element (of the same name) that initializes that component as a standalone app.\r\n * This might break some cross-component communication (e.g., via Pinia) since there is not global app instance, but that should be OK within\r\n * the Kentico page builder environment where the components need to be visually correct, but perhaps not functionally correct.\r\n */\r\nfunction initVueForKenticoPageBuilder() {\r\n  for (const componentName in components) {\r\n    new CreateWebComponent(componentName, components[componentName], (app) => registerVuePlugins(app));\r\n  }\r\n}\r\n\r\nfunction initlizeSentry(app) {\r\n  Sentry.init({\r\n    app,\r\n    dsn: \"https://ef27796c94554ec99403e424a76f6c6d@o163743.ingest.sentry.io/4505037021970432\",\r\n    environment: envrionmentTypes.getEnvrionment(window.location.hostname),\r\n    enabled: envrionmentTypes.getEnvrionment(window.location.hostname) === \"production\",\r\n    tracesSampleRate: 0.2\r\n  });\r\n}\r\n\r\n/**\r\n * Normal Vue initialization (single app instance)\r\n */\r\nfunction initVueForLiveSite() {\r\n  const app = createApp();\r\n  registerVuePlugins(app);\r\n  initlizeSentry(app);\r\n  for (const componentName in components) {\r\n    app.component(componentName, components[componentName]);\r\n  }\r\n  app.mount(\"#app\");\r\n}\r\n\r\n/**\r\n * Main entrypoint\r\n */\r\nif (isKenticoPageBuilder()) {\r\n  initVueForKenticoPageBuilder();\r\n} else {\r\n  initVueForLiveSite();\r\n}\r\n"],"names":["makeMap","str","expectsLowerCase","set","val","EMPTY_OBJ","EMPTY_ARR","NOOP","NO","isOn","key","isModelListener","extend","remove","arr","el","i","hasOwnProperty","hasOwn","isArray","isMap","toTypeString","isSet","isDate","isRegExp","isFunction","isString","isSymbol","isObject","isPromise","objectToString","value","toRawType","isPlainObject","isIntegerKey","isReservedProp","isBuiltInDirective","cacheStringFunction","fn","cache","camelizeRE","camelize","_","c","hyphenateRE","hyphenate","capitalize","toHandlerKey","hasChanged","oldValue","invokeArrayFns","fns","arg","def","obj","writable","looseToNumber","n","toNumber","_globalThis","getGlobalThis","GLOBALS_ALLOWED","isGloballyAllowed","normalizeStyle","res","item","normalized","parseStringStyle","listDelimiterRE","propertyDelimiterRE","styleCommentRE","cssText","ret","tmp","normalizeClass","name","normalizeProps","props","klass","style","HTML_TAGS","SVG_TAGS","MATH_TAGS","VOID_TAGS","isHTMLTag","isSVGTag","isMathMLTag","isVoidTag","specialBooleanAttrs","isSpecialBooleanAttr","includeBooleanAttr","looseCompareArrays","a","b","equal","looseEqual","aValidType","bValidType","aKeysCount","bKeysCount","aHasKey","bHasKey","looseIndexOf","toDisplayString","replacer","_key","entries","val2","stringifySymbol","v","_a","activeEffectScope","EffectScope","detached","currentEffectScope","fromParent","l","last","effectScope","recordEffectScope","effect","scope","getCurrentScope","onScopeDispose","activeEffect","ReactiveEffect","trigger","scheduler","pauseTracking","dep","triggerComputed","resetTracking","lastShouldTrack","shouldTrack","lastEffect","preCleanupEffect","postCleanupEffect","computed","effect2","cleanupDepEffect","trackId","options","_effect","runner","stop","pauseScheduleStack","trackStack","pauseScheduling","resetScheduling","queueEffectSchedulers","trackEffect","debuggerEventExtraInfo","oldDep","triggerEffects","dirtyLevel","tracking","createDep","cleanup","targetMap","ITERATE_KEY","MAP_KEY_ITERATE_KEY","track","target","type","depsMap","newValue","oldTarget","deps","newLength","key2","getDepFromReactive","object","isNonTrackableKeys","builtInSymbols","arrayInstrumentations","createArrayInstrumentations","instrumentations","args","toRaw","BaseReactiveHandler","_isReadonly","_isShallow","receiver","isReadonly2","isShallow2","shallowReadonlyMap","readonlyMap","shallowReactiveMap","reactiveMap","targetIsArray","isRef","readonly","reactive","MutableReactiveHandler","isOldValueReadonly","isReadonly","isShallow","hadKey","result","ReadonlyReactiveHandler","mutableHandlers","readonlyHandlers","shallowReactiveHandlers","shallowReadonlyHandlers","toShallow","getProto","get","rawTarget","rawKey","has2","wrap","toReadonly","toReactive","has","size","add","get2","deleteEntry","clear","hadItems","createForEach","callback","thisArg","observed","createIterableMethod","method","targetIsMap","isPair","isKeyOnly","innerIterator","done","createReadonlyMethod","createInstrumentations","mutableInstrumentations2","shallowInstrumentations2","readonlyInstrumentations2","shallowReadonlyInstrumentations2","mutableInstrumentations","readonlyInstrumentations","shallowInstrumentations","shallowReadonlyInstrumentations","createInstrumentationGetter","shallow","mutableCollectionHandlers","shallowCollectionHandlers","readonlyCollectionHandlers","shallowReadonlyCollectionHandlers","targetTypeMap","rawType","getTargetType","createReactiveObject","shallowReactive","shallowReadonly","baseHandlers","collectionHandlers","proxyMap","existingProxy","targetType","proxy","isReactive","isProxy","raw","markRaw","ComputedRefImpl","getter","_setter","isSSR","triggerRefValue","self","trackRefValue","getterOrOptions","debugOptions","setter","onlyGetter","ref2","newVal","r","ref","createRef","shallowRef","rawValue","RefImpl","__v_isShallow","useDirectValue","triggerRef","unref","toValue","source","shallowUnwrapHandlers","proxyRefs","objectWithRefs","CustomRefImpl","factory","customRef","toRefs","propertyToRef","ObjectRefImpl","_object","_defaultValue","GetterRefImpl","_getter","toRef","defaultValue","TrackOpTypes","TriggerOpTypes","assertNumber","ErrorCodes","ErrorTypeStrings$1","callWithErrorHandling","instance","err","handleError","callWithAsyncErrorHandling","values","throwInDev","contextVNode","cur","exposedInstance","errorInfo","errorCapturedHooks","appErrorHandler","logError","isFlushing","isFlushPending","queue","flushIndex","pendingPostFlushCbs","activePostFlushCbs","postFlushIndex","resolvedPromise","currentFlushPromise","nextTick","p","findInsertionIndex","id","start","end","middle","middleJob","middleJobId","getId","queueJob","job","queueFlush","flushJobs","invalidateJob","queuePostFlushCb","cb","flushPreFlushCbs","seen","flushPostFlushCbs","deduped","comparator","diff","check","devtools$1","buffer","setDevtoolsHook$1","hook","_b","event","newHook","emit","rawArgs","modelArg","modifiersKey","number","trim","handlerName","handler","onceHandler","normalizeEmitsOptions","comp","appContext","asMixin","cached","hasExtends","extendEmits","raw2","normalizedFromExtend","isEmitListener","currentRenderingInstance","currentScopeId","setCurrentRenderingInstance","prev","pushScopeId","popScopeId","withScopeId","_id","withCtx","ctx","isNonScopedSlot","renderFnWithContext","setBlockTracking","prevInstance","renderComponentRoot","Component","vnode","withProxy","propsOptions","slots","attrs","render","renderCache","data","setupState","inheritAttrs","fallthroughAttrs","proxyToUse","thisProxy","normalizeVNode","render2","getFunctionalFallthrough","blockStack","createVNode","Comment","root","keys","shapeFlag","filterModelListeners","cloneVNode","filterSingleRoot","children","recurse","singleRoot","child","isVNode","shouldUpdateComponent","prevVNode","nextVNode","optimized","prevProps","prevChildren","component","nextProps","nextChildren","patchFlag","emits","hasPropsChanged","dynamicProps","emitsOptions","nextKeys","updateHOCHostEl","parent","COMPONENTS","DIRECTIVES","resolveComponent","maybeSelfReference","resolveAsset","NULL_DYNAMIC_COMPONENT","resolveDynamicComponent","resolveDirective","warnMissing","currentInstance","selfName","getComponentName","resolve","registry","isSuspense","suspenseId","SuspenseImpl","n1","n2","container","anchor","parentComponent","parentSuspense","namespace","slotScopeIds","rendererInternals","mountSuspense","patchSuspense","hydrateSuspense","createSuspenseBoundary","normalizeSuspenseChildren","Suspense","triggerEvent","eventListener","patch","createElement","hiddenContainer","suspense","setActiveBranch","unmount","newBranch","newFallback","activeBranch","pendingBranch","isInFallback","isHydrating","isSameVNodeType","timeout","pendingId","move","next","parentNode","parentSuspenseId","isSuspensible","isVNodeSuspensible","initialAnchor","resume","sync","vnode2","effects","parentComponent2","container2","delayEnter","hasUnresolvedAncestor","fallbackVNode","namespace2","anchor2","mountFallback","setupRenderEffect","isInPendingSuspense","hydratedEl","asyncSetupResult","handleSetupResult","placeholder","parentSuspense2","doRemove","node","hydrateNode","isSlotChildren","normalizeSuspenseSlot","s","block","trackBlock","isBlockTreeEnabled","openBlock","currentBlock","closeBlock","queueEffectWithSuspense","branch","suspensible","ssrContextKey","useSSRContext","inject","watchEffect","doWatch","watchPostEffect","watchSyncEffect","INITIAL_WATCHER_VALUE","watch","immediate","deep","flush","once","onTrack","onTrigger","_cb","unwatch","reactiveGetter","source2","traverse","forceTrigger","isMultiSource","onCleanup","baseGetter","ssrCleanup","isInSSRComponentSetup","queuePostRenderEffect","instanceWatch","publicThis","createPathGetter","reset","setCurrentInstance","path","segments","depth","withDirectives","directives","getExposeProxy","bindings","dir","modifiers","invokeDirectiveHook","oldBindings","binding","leaveCbKey","enterCbKey","useTransitionState","state","onMounted","onBeforeUnmount","TransitionHookValidator","BaseTransitionPropsValidators","BaseTransitionImpl","getCurrentInstance","getTransitionRawChildren","rawProps","mode","emptyPlaceholder","innerChild","getKeepAliveChild","enterHooks","resolveTransitionHooks","setTransitionHooks","oldChild","oldInnerChild","leavingHooks","earlyRemove","delayedLeave","leavingVNodesCache","getLeavingNodesForType","BaseTransition","leavingVNodes","appear","persisted","onBeforeEnter","onEnter","onAfterEnter","onEnterCancelled","onBeforeLeave","onLeave","onAfterLeave","onLeaveCancelled","onBeforeAppear","onAppear","onAfterAppear","onAppearCancelled","callHook","callAsyncHook","hook2","hooks","leavingVNode","afterHook","cancelHook","called","cancelled","isKeepAlive","keepComment","parentKey","keyedFragmentCount","Fragment","defineComponent","extraOptions","isAsyncWrapper","defineAsyncComponent","loader","loadingComponent","errorComponent","delay","userOnError","pendingRequest","resolvedComp","retries","retry","load","thisRequest","reject","createInnerComp","onError","loaded","error","delayed","ce","KeepAliveImpl","sharedContext","current","_unmount","storageContainer","instance2","vnodeHook","invokeVNodeHook","resetShapeFlag","pruneCache","filter","pruneCacheEntry","include","exclude","matches","pendingCacheKey","cacheSubtree","getInnerChild","onUpdated","subTree","da","rawVNode","max","cachedVNode","KeepAlive","pattern","onActivated","registerKeepAliveHook","onDeactivated","wrappedHook","injectHook","injectToKeepAliveRoot","keepAliveRoot","injected","onUnmounted","prepend","createHook","lifecycle","onBeforeMount","onBeforeUpdate","onServerPrefetch","onRenderTriggered","onRenderTracked","onErrorCaptured","renderList","renderItem","index","createSlots","dynamicSlots","slot","j","renderSlot","fallback","noSlotted","validSlotContent","ensureValidVNode","rendered","createBlock","vnodes","toHandlers","preserveCaseIfNecessary","getPublicInstance","isStatefulComponent","publicPropertiesMap","resolveMergedOptions","hasSetupBinding","PublicInstanceProxyHandlers","accessCache","normalizedProps","shouldCacheAccess","publicGetter","cssModule","globalProperties","descriptor","RuntimeCompiledPublicInstanceProxyHandlers","defineProps","defineEmits","defineExpose","exposed","defineOptions","defineSlots","defineModel","withDefaults","defaults","useSlots","getContext","useAttrs","createSetupContext","normalizePropsOrEmits","mergeDefaults","opt","mergeModels","createPropsRestProxy","excludedKeys","withAsyncContext","getAwaitable","awaitable","unsetCurrentInstance","e","applyOptions","dataOptions","computedOptions","methods","watchOptions","provideOptions","injectOptions","created","beforeMount","mounted","beforeUpdate","updated","activated","deactivated","beforeDestroy","beforeUnmount","destroyed","unmounted","renderTracked","renderTriggered","errorCaptured","serverPrefetch","expose","components","filters","resolveInjections","methodHandler","createWatcher","provides","provide","registerLifecycleHook","register","_hook","checkDuplicateProperties","normalizeInject","h","base","mixins","extendsOptions","globalMixins","optionMergeStrategies","resolved","m","mergeOptions","to","from","strats","strat","internalOptionMergeStrats","mergeDataFn","mergeEmitsOrPropsOptions","mergeObjectOptions","mergeAsArray","mergeWatchOptions","mergeInject","merged","createAppContext","uid$1","createAppAPI","hydrate","rootComponent","rootProps","context","installedPlugins","isMounted","app","version","plugin","mixin","directive","rootContainer","isHydrate","lastApp","currentApp","parentProvides","treatDefaultAsFactory","hasInjectionContext","internalObjectProto","createInternalObject","isInternalObject","initProps","isStateful","setFullProps","updateProps","rawPrevProps","rawCurrentProps","hasAttrsChanged","propsToUpdate","camelizedKey","resolvePropValue","kebabKey","needCastKeys","rawCastValues","camelKey","castValues","isAbsent","hasDefault","propsDefaults","normalizePropsOptions","extendProps","normalizedKey","validatePropName","prop","booleanIndex","getTypeIndex","stringIndex","getType","ctor","isSameType","expectedTypes","t","isInternalKey","normalizeSlotValue","normalizeSlot","rawSlot","normalizeObjectSlots","rawSlots","normalizeVNodeSlots","initSlots","updateSlots","needDeletionCheck","deletionComparisonTarget","setRef","rawRef","oldRawRef","isUnmount","refValue","owner","oldRef","refs","_isString","_isRef","doSet","existing","hasMismatch","isSVGContainer","isMathMLContainer","getContainerType","isComment","createHydrationFunctions","mountComponent","patchProp","createText","nextSibling","insert","createComment","isFragmentStart","onMismatch","handleMismatch","domType","nextNode","Text","isTemplateNode","replaceNode","Static","needToAdoptContent","hydrateFragment","hydrateElement","locateClosingAnchor","createTextVNode","hydrateChildren","dirs","transition","forcePatch","needCallTransitionHooks","needTransition","content","vnodeHooks","parentVNode","fragmentSlotScopeIds","isFragment","next2","open","close","match","newNode","oldNode","parentNode2","createRenderer","baseCreateRenderer","createHydrationRenderer","createHydrationFns","hostInsert","hostRemove","hostPatchProp","hostCreateElement","hostCreateText","hostCreateComment","hostSetText","hostSetElementText","hostParentNode","hostNextSibling","hostSetScopeId","hostInsertStaticContent","getNextHostNode","processText","processCommentNode","mountStaticNode","processFragment","processElement","processComponent","internals","moveStaticNode","removeStaticNode","mountElement","patchElement","mountChildren","resolveChildrenNamespace","setScopeId","unmountChildren","scopeId","cloneIfMounted","dynamicChildren","oldProps","newProps","toggleRecurse","patchBlockChildren","patchChildren","patchProps","oldChildren","newChildren","fallbackContainer","oldVNode","newVNode","fragmentStartAnchor","fragmentEndAnchor","traverseStaticChildren","updateComponent","initialVNode","createComponentInstance","setupComponent","updateComponentPreRender","componentUpdateFn","bu","u","nonHydratedAsyncRoot","locateNonHydratedAsyncRoot","originNext","nextTree","prevTree","bm","isAsyncWrapperVNode","hydrateSubTree","scopedInitialVNode","update","c1","prevShapeFlag","c2","patchKeyedChildren","patchUnkeyedChildren","oldLength","commonLength","nextChild","parentAnchor","l2","e1","e2","nextPos","s1","s2","keyToNewIndexMap","patched","toBePatched","moved","maxNewIndexSoFar","newIndexToOldIndexMap","prevChild","newIndex","increasingNewIndexSequence","getSequence","nextIndex","moveType","leave","delayLeave","afterLeave","remove2","performLeave","shouldInvokeDirs","shouldInvokeVnodeHook","unmountComponent","removeFragment","performRemove","bum","um","currentNamespace","allowed","ch1","ch2","len","arrI","subComponent","isTeleport","isTeleportDisabled","isTargetSVG","isTargetMathML","resolveTarget","select","targetSelector","TeleportImpl","querySelector","disabled","mainAnchor","targetAnchor","mount","wasDisabled","currentContainer","currentAnchor","moveTeleport","nextTarget","updateCssVars","shouldRemove","hydrateTeleport","isReorder","targetNode","Teleport","disableTracking","setupBlock","createElementBlock","createBaseVNode","transformVNodeArgs","transformer","normalizeKey","normalizeRef","ref_key","ref_for","isBlockNode","needFullChildrenNormalization","normalizeChildren","_createVNode","cloned","isClassComponent","guardReactiveProps","extraProps","mergeRef","cloneTransition","mergedProps","mergeProps","text","flag","createStaticVNode","numberOfNodes","createCommentVNode","asBlock","slotFlag","toMerge","incoming","emptyAppContext","uid","internalSetCurrentInstance","setInSSRSetupState","g","registerGlobalSetter","setters","setupResult","setupStatefulComponent","setup","setupContext","resolvedResult","finishComponentSetup","compile","installWithProxy","registerRuntimeCompiler","_compile","isRuntimeOnly","skipOptions","template","isCustomElement","compilerOptions","delimiters","componentCompilerOptions","finalCompilerOptions","attrsProxyHandlers","includeInferred","computed$1","useModel","camelizedName","hyphenatedName","localValue","propValue","modifierKey","i2","propsOrChildren","initCustomFormatter","withMemo","memo","isMemoSame","warn","ErrorTypeStrings","devtools","setDevtoolsHook","_ssrUtils","ssrUtils","resolveFilter","compatUtils","DeprecationTypes","svgNS","mathmlNS","doc","templateContainer","nodeOps","tag","is","selector","before","wrapper","TRANSITION","ANIMATION","vtcKey","Transition","resolveTransitionProps","DOMTransitionPropsValidators","TransitionPropsValidators","h2","hasExplicitCallback","baseProps","duration","enterFromClass","enterActiveClass","enterToClass","appearFromClass","appearActiveClass","appearToClass","leaveFromClass","leaveActiveClass","leaveToClass","durations","normalizeDuration","enterDuration","leaveDuration","finishEnter","isAppear","removeTransitionClass","finishLeave","makeEnterHook","nextFrame","addTransitionClass","whenTransitionEnds","forceReflow","NumberOf","cls","_vtc","endId","expectedType","explicitTimeout","resolveIfNotStale","propCount","getTransitionInfo","endEvent","ended","onEnd","styles","getStyleProperties","transitionDelays","transitionDurations","transitionTimeout","getTimeout","animationDelays","animationDurations","animationTimeout","hasTransform","delays","d","toMs","patchClass","isSVG","transitionClasses","vShowOriginalDisplay","vShowHidden","vShow","setDisplay","initVShowForSSR","CSS_VAR_TEXT","useCssVars","updateTeleports","vars","setVarsOnNode","setVars","setVarsOnVNode","ob","displayRE","patchStyle","isCssString","hasControlledDisplay","prevStyle","setStyle","cssVarText","importantRE","prefixed","autoPrefix","prefixes","prefixCache","rawName","xlinkNS","patchAttr","isBoolean","patchDOMProp","needRemove","addEventListener","removeEventListener","veiKey","patchEvent","prevValue","nextValue","invokers","existingInvoker","parseName","invoker","createInvoker","optionsModifierRE","cachedNow","getNow","initialValue","patchStopImmediatePropagation","originalStop","isNativeOn","shouldSetAsProp","defineCustomElement","hydrate2","Comp","VueCustomElement","VueElement","initialProps","defineSSRCustomElement","BaseClass","_def","_props","mutations","isAsync","numberProps","camelize$1","asyncDef","declaredPropKeys","shouldReflect","shouldUpdate","dispatch","css","useCssModule","modules","mod","positionMap","newPositionMap","moveCbKey","TransitionGroupImpl","moveClass","hasCSSTransform","callPendingCbs","recordPosition","movedChildren","applyTranslation","cssTransitionProps","removeMode","TransitionGroup","oldPos","newPos","dx","dy","clone","getModelAssigner","onCompositionStart","onCompositionEnd","assignKey","vModelText","lazy","castToNumber","domValue","elValue","vModelCheckbox","modelValue","elementValue","getValue","checked","assign","found","filtered","getCheckboxValue","setChecked","vModelRadio","vModelSelect","isSetModel","selectedVal","o","setSelected","_binding","isMultiple","isArrayValue","option","optionValue","optionType","vModelDynamic","callModelHook","resolveDynamicModel","tagName","initVModelForSSR","modelToUse","systemModifiers","modifierGuards","withModifiers","cacheKey","guard","keyNames","withKeys","eventKey","k","rendererOptions","renderer","enabledHydration","ensureRenderer","ensureHydrationRenderer","createApp","containerOrSelector","normalizeContainer","resolveRootNamespace","createSSRApp","ssrDirectiveInitialized","initDirectivesForSSR","FRAGMENT","TELEPORT","SUSPENSE","KEEP_ALIVE","BASE_TRANSITION","OPEN_BLOCK","CREATE_BLOCK","CREATE_ELEMENT_BLOCK","CREATE_VNODE","CREATE_ELEMENT_VNODE","CREATE_COMMENT","CREATE_TEXT","CREATE_STATIC","RESOLVE_COMPONENT","RESOLVE_DYNAMIC_COMPONENT","RESOLVE_DIRECTIVE","RESOLVE_FILTER","WITH_DIRECTIVES","RENDER_LIST","RENDER_SLOT","CREATE_SLOTS","TO_DISPLAY_STRING","MERGE_PROPS","NORMALIZE_CLASS","NORMALIZE_STYLE","NORMALIZE_PROPS","GUARD_REACTIVE_PROPS","TO_HANDLERS","CAMELIZE","CAPITALIZE","TO_HANDLER_KEY","SET_BLOCK_TRACKING","PUSH_SCOPE_ID","POP_SCOPE_ID","WITH_CTX","UNREF","IS_REF","WITH_MEMO","IS_MEMO_SAME","helperNameMap","registerRuntimeHelpers","helpers","locStub","createRoot","createVNodeCall","isBlock","isComponent","loc","getVNodeBlockHelper","getVNodeHelper","createArrayExpression","elements","createObjectExpression","properties","createObjectProperty","createSimpleExpression","isStatic","constType","createCompoundExpression","createCallExpression","callee","createFunctionExpression","params","returns","newline","isSlot","createConditionalExpression","test","consequent","alternate","createCacheExpression","createBlockStatement","body","ssr","convertToBlock","helper","removeHelper","inSSR","defaultDelimitersOpen","defaultDelimitersClose","isTagStartChar","isWhitespace","isEndOfTagSection","toCharCodes","Sequences","Tokenizer","stack","cbs","line","column","newlineIndex","isEnd","endOfText","actualIndex","cc","sequence","offset","quote","input","endIndex","cp","consumed","getCompatValue","compatConfig","isCompatEnabled","checkCompatEnabled","defaultOnError","defaultOnWarn","msg","createCompilerError","code","messages","additionalMessage","isStaticExp","isCoreComponent","nonIdentifierRE","isSimpleIdentifier","validFirstIdentCharRE","validIdentCharRE","whitespaceRE","isMemberExpressionBrowser","stateStack","currentOpenBracketCount","currentOpenParensCount","currentStringType","char","isMemberExpression","findDir","allowEmpty","findProp","dynamicOnly","isStaticArgOf","hasDynamicKeyVBind","isText$1","isVSlot","isSlotOutlet","propsHelperSet","getUnnormalizedProps","callPath","injectProp","propsWithInjection","parentCall","first","hasProp","propKeyName","toValidAssetId","searchValue","replaceValue","getMemoedVNodeCall","forAliasRE","defaultParserOptions","currentOptions","currentRoot","currentInput","currentOpenTag","currentProp","currentAttrValue","currentAttrStartIndex","currentAttrEndIndex","inPre","inVPre","currentVPreBoundary","tokenizer","emitError","onText","getSlice","innerStart","innerEnd","exp","addNode","createExp","getLoc","endOpenTag","onCloseTag","backTrack","dirToAttr","setLocEnd","condense","expParseMode","parseForExpression","syncIndex","forIteratorRE","stripParensRE","inMatch","LHS","RHS","createAliasExpression","asParam","valueContent","trimmedOffset","iteratorMatch","keyContent","keyOffset","indexContent","ns","lastNode","isImplied","lookAhead","isFragmentTemplate","condenseWhitespace","inlineTemplateProp","specialTemplateDir","isUpperCase","windowsNewlineRE","nodes","shouldCondense","removedWhitespace","isAllWhitespace","hasNewlineChar","prevCharIsWhitespace","attr","parseMode","message","baseParse","hoistStatic","walk","isSingleElementRoot","doNotHoistNode","originalCount","hoistedCount","constantType","getConstantType","codegenNode","getPatchFlag","getGeneratedPropsConstantType","getNodeProps","hoisted","constantCache","returnType2","generatedPropsType","childType","expType","returnType","allowHoistedHelperSet","getConstantTypeOfHelperCall","keyType","valueType","createTransformContext","filename","prefixIdentifiers","hoistStatic2","hmr","cacheHandlers","nodeTransforms","directiveTransforms","transformHoist","isBuiltInComponent","expressionPlugins","slotted","ssrCssVars","bindingMetadata","inline","isTS","onWarn","nameMatch","count","currentCount","list","removalIndex","identifier","transform","traverseNode","createRootCodegen","traverseChildren","nodeRemoved","exitFns","onExit","createStructuralDirectiveTransform","PURE_ANNOTATION","aliasHelper","createCodegenContext","ast","sourceMap","optimizeImports","runtimeGlobalName","runtimeModuleName","ssrRuntimeModuleName","withoutNewLine","generate","push","indent","deindent","hasHelpers","useWithBlock","genFunctionPreamble","functionName","signature","genAssets","genNode","VueBinding","staticHelpers","genHoists","assets","resolver","hoists","genNodeListAsArray","multilines","genNodeList","comma","genText","genExpression","genInterpolation","genCompoundExpression","genComment","genVNodeCall","genCallExpression","genObjectExpression","genArrayExpression","genFunctionExpression","genConditionalExpression","genCacheExpression","pure","genExpressionAsPropertyKey","callHelper","genNullableArgs","needNewline","needsParens","isNested","transformIf","processIf","ifNode","isRoot","siblings","sibling","createCodegenNodeForBranch","parentCondition","getParentCondition","processCodegen","createIfBranch","isTemplateIf","keyIndex","createChildrenCodegenNode","keyProperty","firstChild","vnodeCall","transformFor","processFor","forNode","renderExp","isTemplate","keyProp","keyExp","isStableFragment","fragmentFlag","childBlock","needFragmentWrapper","slotOutlet","loop","createForLoopParams","parseResult","finalizeForParseResult","addIdentifiers","removeIdentifiers","scopes","memoArgs","createParamsList","defaultFallback","trackSlotScopes","vSlot","buildClientSlotFn","_vForExp","buildSlots","buildSlotFn","slotsProperties","hasDynamicSlots","onComponentSlot","hasTemplateSlots","hasNamedDefaultSlot","implicitDefaultChildren","seenSlotNames","conditionalBranchIndex","slotElement","slotDir","slotChildren","slotLoc","slotName","slotProps","dirLoc","staticSlotName","vFor","slotFunction","vIf","vElse","buildDynamicSlot","conditional","buildDefaultSlotProperty","children2","node2","isNonWhitespaceContent","hasForwardedSlots","directiveImportMap","transformElement","vnodeTag","resolveComponentType","isDynamicComponent","vnodeProps","vnodeChildren","vnodePatchFlag","vnodeDynamicProps","dynamicPropNames","vnodeDirectives","shouldUseBlock","propsBuildResult","buildProps","buildDirectiveArgs","hasDynamicTextChild","stringifyDynamicPropNames","isExplicitDynamic","isComponentTag","isProp","builtIn","elementLoc","mergeArgs","runtimeDirectives","hasChildren","hasRef","hasClassBinding","hasStyleBinding","hasHydrationEventBinding","hasDynamicKeys","hasVnodeHook","pushMergeArg","dedupeProperties","pushRefVForMarker","analyzePatchFlag","isEventHandler","nameLoc","isVBind","isVOn","directiveTransform","props2","needRuntime","propsExpression","classKeyIndex","styleKeyIndex","hasDynamicKey","classProp","styleProp","knownProps","dirArgs","runtime","trueExpression","modifier","propsNamesString","transformSlotOutlet","processSlotOutlet","slotArgs","expectedLen","nonNameProps","fnExpRE","transformOn","augmentor","eventName","eventString","shouldCache","isMemberExp","isInlineStatement","hasMultipleStatements","transformBind","_node","propName","injectPrefix","prefix","transformText","hasText","callArgs","seen$1","transformOnce","transformModel","createTransformProps","rawExp","expString","bindingType","maybeRef","assignmentExp","eventArg","validDivisionCharRE","transformFilter","rewriteFilter","parseFilter","inSingle","inDouble","inTemplateString","inRegex","curly","square","paren","lastFilterIndex","expression","pushFilter","wrapFilter","transformMemo","getBaseTransformPreset","baseCompile","isModuleMode","resolvedOptions","noopDirectiveTransform","V_MODEL_RADIO","V_MODEL_CHECKBOX","V_MODEL_TEXT","V_MODEL_SELECT","V_MODEL_DYNAMIC","V_ON_WITH_MODIFIERS","V_ON_WITH_KEYS","V_SHOW","TRANSITION_GROUP","decoder","decodeHtmlBrowser","asAttr","parserOptions","rootNamespace","transformStyle","parseInlineCSS","createDOMCompilerError","transformVHtml","transformVText","baseResult","transformModel$1","directiveToUse","isInvalidType","isEventOptionModifier","isNonKeyModifier","maybeKeyModifier","isKeyboardEvent","resolveModifiers","keyModifiers","nonKeyModifiers","eventOptionModifiers","transformClick","transformOn$1","handlerExp","modifierPostfix","transformShow","ignoreSideEffectTags","DOMNodeTransforms","DOMDirectiveTransforms","src","compileCache","getCache","compileToFunction","opts","runtimeDom","CreateWebComponent","initVueApp","vueComponentTagName","vueComponentTag","getDataRefs","__props","header","subheader","headerAlignment","headerSize","background","padding","margin","width","fontOptions","headerAlignmentClasses","headerFontSizeClass","backgroundClass","widthClass","fontClass","paddingClass","classString","appendClass","marginClass","__emit","element","control","animation","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_cache","_hoisted_4","_hoisted_7","_hoisted_5","_hoisted_8","_hoisted_6","icons","LeftArrow","RightArrow","UpArrow","DownArrow","DownLeftArrow","UpLeftArrow","UpRightArrow","DownRightArrow","DownChevron","UpChevron","LeftChevron","RightChevron","CornerDownLeft","CornerDownRight","CornerLeftDown","CornerLeftUp","CornerRightDown","CornerRightUp","CornerUpLeft","CornerUpRight","Play","ShoppingBag","ShoppingCart","Package","Image","SolidHeart","OutlineHeart","HeartPlus","Shipping","Lock","XIcon","Check","Search","Browse","LightningBolt","AlertCircle","InformationCircle","AlertTriangle","User","Menu","List","Gallery","Grid","PlusSign","MinusSign","Slash","PasswordReveal","HorizontalEllipse","VerticalEllipse","Share","Download","Filter","TextDocument","OverlappingSquare","IconPercentage","VideoPlay","VideoPause","Calender","Instagram","Pintrest","LinkedIn","_sfc_main","_createBlock","_resolveDynamicComponent","$options","IconChevronDown","isActive","anchorTitle","aText","windowHash","newHash","scrollToFaq","openAnimation","title","items","heading","repsTitle","reps","basedIn","medium","descriptionBio","missingBasedIn","missingBasedInAndMedium","_sfc_render","_ctx","isTextStyle","isButtonStyle","classObj","linkUrl","linkTarget","linkAltText","linkText","Logo$1","benefits","bind","toString","getPrototypeOf","kindOf","thing","kindOfTest","typeOfTest","isUndefined","isBuffer","isArrayBuffer","isArrayBufferView","isNumber","prototype","isFile","isBlob","isFileList","isStream","isFormData","kind","isURLSearchParams","forEach","allOwnKeys","findKey","_global","isContextDefined","merge","caseless","assignValue","targetKey","stripBOM","inherits","constructor","superConstructor","descriptors","toFlatObject","sourceObj","destObj","propFilter","endsWith","searchString","position","lastIndex","toArray","isTypedArray","TypedArray","forEachEntry","iterator","pair","matchAll","regExp","isHTMLForm","toCamelCase","p1","p2","reduceDescriptors","reducer","reducedDescriptors","freezeMethods","toObjectSet","arrayOrString","delimiter","define","noop","toFiniteNumber","ALPHA","DIGIT","ALPHABET","generateString","alphabet","length","isSpecCompliantForm","toJSONObject","visit","reducedValue","isAsyncFn","isThenable","utils$1","AxiosError","config","request","response","utils","customProps","axiosError","httpAdapter","isVisitable","removeBrackets","renderKey","dots","token","isFlatArray","predicates","toFormData","formData","metaTokens","visitor","defaultVisitor","indexes","useBlob","convertValue","exposedHelpers","build","encode","charMap","AxiosURLSearchParams","encoder","_encode","buildURL","url","serializeFn","serializedParams","hashmarkIndex","InterceptorManager","fulfilled","rejected","InterceptorManager$1","transitionalDefaults","URLSearchParams$1","FormData$1","Blob$1","platform$1","URLSearchParams","FormData","Blob","hasBrowserEnv","hasStandardBrowserEnv","product","hasStandardBrowserWebWorkerEnv","platform","toURLEncodedForm","parsePropPath","arrayToObject","formDataToJSON","buildPath","isNumericKey","isLast","stringifySafely","parser","headers","contentType","hasJSONContentType","isObjectPayload","_FormData","transitional","forcedJSONParsing","JSONRequested","strictJSONParsing","status","defaults$2","ignoreDuplicateOf","parseHeaders","rawHeaders","parsed","$internals","normalizeHeader","normalizeValue","parseTokens","tokens","tokensRE","isValidHeaderName","matchHeaderValue","isHeaderNameFilter","formatHeader","w","buildAccessors","accessorName","methodName","arg1","arg2","arg3","AxiosHeaders","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","setHeaders","matcher","deleted","deleteHeader","format","targets","asStrings","accessors","defineAccessor","mapped","headerValue","AxiosHeaders$1","transformData","isCancel","CanceledError","settle","validateStatus","cookies","expires","domain","secure","cookie","isAbsoluteURL","combineURLs","baseURL","relativeURL","buildFullPath","requestedURL","isURLSameOrigin","msie","urlParsingNode","originURL","resolveURL","href","requestURL","parseProtocol","speedometer","samplesCount","min","bytes","timestamps","head","tail","firstSampleTS","chunkLength","now","startedAt","bytesCount","passed","progressEventReducer","listener","isDownloadStream","bytesNotified","_speedometer","total","progressBytes","rate","inRange","isXHRAdapterSupported","xhrAdapter","requestData","requestHeaders","responseType","withXSRFToken","onCanceled","username","password","fullPath","onloadend","responseHeaders","timeoutErrorMessage","xsrfValue","cancel","protocol","knownAdapters","renderReason","reason","isResolvedHandle","adapter","adapters","nameOrAdapter","rejectedReasons","reasons","throwIfCancellationRequested","dispatchRequest","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","configValue","VERSION","validators","deprecatedWarnings","validator","formatMessage","desc","assertOptions","schema","allowUnknown","Axios","instanceConfig","configOrUrl","dummy","paramsSerializer","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","responseInterceptorChain","promise","chain","newConfig","onFulfilled","onRejected","generateHTTPMethod","isForm","Axios$1","CancelToken","executor","resolvePromise","onfulfilled","_resolve","CancelToken$1","spread","isAxiosError","payload","HttpStatusCode","HttpStatusCode$1","createInstance","defaultConfig","axios","promises","axios$1","BASE_URL","axiosClient","Subscribable","identity","isServer","functionalUpdate","updater","isValidTimeout","timeUntilStale","updatedAt","staleTime","parseQueryArgs","isQueryKey","parseFilterArgs","matchQuery","query","exact","fetchStatus","predicate","queryKey","stale","hashQueryKeyByOptions","partialMatchKey","matchMutation","mutation","fetching","mutationKey","hashQueryKey","partialDeepEqual","replaceEqualDeep","array","isPlainArray","aSize","bItems","bSize","copy","equalItems","shallowEqualObjects","hasObjectPrototype","prot","sleep","scheduleMicrotask","getAbortController","replaceData","prevData","FocusManager","onFocus","_this$cleanup","_this$cleanup2","focused","focusManager","onlineEvents","OnlineManager","onOnline","online","onlineManager","defaultRetryDelay","failureCount","canFetch","networkMode","CancelledError","isCancelledError","createRetryer","isRetryCancelled","isResolved","continueFn","promiseResolve","promiseReject","outerResolve","outerReject","cancelOptions","cancelRetry","continueRetry","shouldPause","pause","continueResolve","canContinue","run","promiseOrValue","_config$retry","_config$retryDelay","retryDelay","shouldRetry","defaultLogger","createNotifyManager","transactions","notifyFn","batchNotifyFn","batch","schedule","batchCalls","originalQueue","notifyManager","Removable","newCacheTime","Query","getDefaultState","newData","setStateOptions","_this$retryer","observer","_this$retryer2","x","_this$retryer3","fetchOptions","_this$options$behavio","_context$fetchOptions","_this$retryer4","abortController","queryFnContext","addSignalProperty","fetchFn","_context$fetchOptions2","_this$cache$config$on","_this$cache$config","_this$cache$config$on2","_this$cache$config2","_this$cache$config$on3","_this$cache$config3","_this$cache$config$on4","_this$cache$config4","action","_action$meta","_action$dataUpdatedAt","hasData","initialDataUpdatedAt","client","_options$queryHash","queryHash","queryInMap","Mutation","_this$retryer$continu","executeMutation","_this$options$retry","restored","_this$mutationCache$c3","_this$mutationCache$c4","_this$options$onSucce","_this$options2","_this$mutationCache$c5","_this$mutationCache$c6","_this$options$onSettl","_this$options3","_this$mutationCache$c","_this$mutationCache$c2","_this$options$onMutat","_this$options","_this$mutationCache$c7","_this$mutationCache$c8","_this$options$onError","_this$options4","_this$mutationCache$c9","_this$mutationCache$c10","_this$options$onSettl2","_this$options5","_this$resuming","pausedMutations","infiniteQueryBehavior","_context$fetchOptions3","_context$fetchOptions4","_context$state$data","_context$state$data2","refetchPage","fetchMore","pageParam","isFetchingNextPage","isFetchingPreviousPage","oldPages","oldPageParams","newPageParams","_context$signal","_context$signal2","queryFn","buildNewPages","pages","param","page","previous","fetchPage","manual","queryFnResult","getNextPageParam","getPreviousPageParam","hasNextPage","nextPageParam","hasPreviousPage","previousPageParam","QueryClient$1","QueryCache","MutationCache","_this$unsubscribeFocu","_this$unsubscribeOnli","_this$queryCache$find","parsedOptions","cachedData","queryKeyOrFilters","defaultedOptions","_this$queryCache$find2","queryCache","refetchFilters","_ref","_filters$refetchType","_options$cancelRefetc","firstMatchingDefaults","QueryObserver","shouldFetchOnMount","shouldFetchOn","notifyOptions","prevOptions","prevQuery","shouldFetchOptionally","nextRefetchInterval","shouldAssignObserverCurrentProperties","trackedResult","_fetchOptions$cancelR","_this$options$refetch","nextInterval","prevResult","prevResultState","prevResultOptions","queryChange","queryInitialState","prevQueryResult","dataUpdatedAt","errorUpdatedAt","isPreviousData","isPlaceholderData","fetchOnMount","fetchOptionally","selectError","placeholderData","isFetching","isLoading","isError","isStale","nextResult","defaultNotifyOptions","shouldNotifyListeners","notifyOnChangeProps","notifyOnChangePropsValue","includedProps","typedKey","shouldLoadOnMount","field","optimisticResult","InfiniteQueryObserver","_state$fetchMeta","_state$fetchMeta$fetc","_state$fetchMeta2","_state$fetchMeta2$fet","_state$data","_state$data2","isRefetching","_this$currentMutation","_this$currentMutation2","variables","_this$mutateOptions$o","_this$mutateOptions","_this$mutateOptions$o2","_this$mutateOptions2","_this$mutateOptions$o3","_this$mutateOptions3","_this$mutateOptions$o4","_this$mutateOptions4","VUE_QUERY_CLIENT","getClientKey","suffix","isMutationKey","updateState","cloneDeep","customizer","cloneDeepUnref","shouldThrowError","_useErrorBoundary","useQueryClient","queryClient","_getCurrentInstance","QueryCache$1","arg1Unreffed","arg2Unreffed","MutationCache$1","QueryClient","unreffedConfig","vueQueryConfig","unreffed","arg3Unreffed","VueQueryPlugin","clientKey","clientConfig","persisterUnmount","originalUnmount","useBaseQuery","Observer","_options$value$queryC","defaulted","unsubscribe","isRestoring","refetch","stopWatch","plainArg1","plainArg2","plainArg3","clondedOptions","useQuery","useInfiniteQuery","useMutation","parseMutationArgs","MutationObserver","mutate","mutateOptions","resultRefs","QUERY_KEY","selectCartData","cart","useCartQuery","useAddCartItemsMutation","useUpdateCartItemMutation","useRemoveCartItemMutation","QUERY_KEY_CART","useSaveForLaterQuery","saveForLaterResponse","useAddSaveForLaterItemsMutation","cartItem","saveForLaterItem","saveForLaterItems","useDeleteSaveForItemMutation","_data","saveForLaterId","saveForLaterItemsCache","sflItem","useAddToCartMutation","sfl_cartItem","queryPayload","sfl_items","isVue2","activePinia","setActivePinia","pinia","piniaSymbol","MutationType","createPinia","_p","toBeInstalled","addSubscription","subscriptions","removeSubscription","idx","triggerSubscriptions","fallbackRunWithContext","mergeReactiveObjects","patchToApply","subPatch","targetValue","skipHydrateSymbol","shouldHydrate","isComputed","createOptionsStore","hot","actions","getters","initialState","store","localState","computedGetters","createSetupStore","$id","isOptionsStore","optionsForPlugin","$subscribeOptions","isListening","isSyncListening","actionSubscriptions","debuggerEvents","activeListener","$patch","partialStateOrMutator","subscriptionMutation","myListenerId","$reset","newState","$state","$dispose","wrapAction","afterCallbackList","onErrorCallbackList","after","partialStore","stopWatcher","setupStore","actionValue","extender","defineStore","idOrOptions","setupOptions","isSetupStore","useStore","hasContext","useNotificationStore","notifications","notify","notificationSettings","notifySuccess","notifyError","dismiss","notification","tryOnScopeDispose","isClient","notNullish","isIOS","getIsIOS","directiveHooks","increaseWithUnit","delta","unit","getLifeCycleTarget","toRef$1","tryOnMounted","useIntervalFn","interval","immediateCallback","timer","clean","intervalValue","watchOnce","unrefElement","elRef","plain","defaultWindow","useMounted","useSupported","useRafFn","fpsLimit","window","intervalLimit","previousFrameTimestamp","rafId","timestamp","useMediaQuery","isSupported","mediaQuery","useBreakpoints","breakpoints","strategy","greaterOrEqual","smallerOrEqual","shortcutMethods","shortcuts","points","bps","useResizeObserver","observerOptions","els","_el","useElementSize","initialSize","box","height","stop1","entry","boxSize","$elem","formatBoxSize","acc","inlineSize","blockSize","ele","stop2","useNow","exposeControls","controls","DEFAULT_UNITS","DEFAULT_MESSAGES","past","DEFAULT_FORMATTER","date","useTimeAgo","time","updateInterval","timeAgo","formatTimeAgo","fullDateFormatter","units","showSecond","rounding","roundFn","absDiff","diff2","applyFormat","isPast","formatter","unitMax","CART","CHECKOUT","TRADEPROGRAM","HOWTOBUY","LOGIN","CONTACT_US","ACCOUNT","usePaginatedList","perPage","totalPages","sublist","screens","useViewportSizes","isLg","undefined","LARGE_ARRAY_SIZE","CORE_ERROR_TEXT","FUNC_ERROR_TEXT","INVALID_TEMPL_VAR_ERROR_TEXT","HASH_UNDEFINED","MAX_MEMOIZE_SIZE","PLACEHOLDER","CLONE_DEEP_FLAG","CLONE_FLAT_FLAG","CLONE_SYMBOLS_FLAG","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","WRAP_BIND_FLAG","WRAP_BIND_KEY_FLAG","WRAP_CURRY_BOUND_FLAG","WRAP_CURRY_FLAG","WRAP_CURRY_RIGHT_FLAG","WRAP_PARTIAL_FLAG","WRAP_PARTIAL_RIGHT_FLAG","WRAP_ARY_FLAG","WRAP_REARG_FLAG","WRAP_FLIP_FLAG","DEFAULT_TRUNC_LENGTH","DEFAULT_TRUNC_OMISSION","HOT_COUNT","HOT_SPAN","LAZY_FILTER_FLAG","LAZY_MAP_FLAG","LAZY_WHILE_FLAG","INFINITY","MAX_SAFE_INTEGER","MAX_INTEGER","NAN","MAX_ARRAY_LENGTH","MAX_ARRAY_INDEX","HALF_MAX_ARRAY_LENGTH","wrapFlags","argsTag","arrayTag","asyncTag","boolTag","dateTag","domExcTag","errorTag","funcTag","genTag","mapTag","numberTag","nullTag","objectTag","promiseTag","proxyTag","regexpTag","setTag","stringTag","symbolTag","undefinedTag","weakMapTag","weakSetTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrimStart","reWhitespace","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","reForbiddenIdentifierChars","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsAstralRange","rsComboMarksRange","reComboHalfMarksRange","rsComboSymbolsRange","rsComboRange","rsDingbatRange","rsLowerRange","rsMathOpRange","rsNonCharRange","rsPunctuationRange","rsSpaceRange","rsUpperRange","rsVarRange","rsBreakRange","rsApos","rsAstral","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsModifier","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsZWJ","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","reOptMod","rsOptVar","rsOptJoin","rsOrdLower","rsOrdUpper","rsSeq","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","deburredLetters","htmlEscapes","htmlUnescapes","stringEscapes","freeParseFloat","freeParseInt","freeGlobal","global","freeSelf","freeExports","exports","freeModule","module","moduleExports","freeProcess","nodeUtil","types","nodeIsArrayBuffer","nodeIsDate","nodeIsMap","nodeIsRegExp","nodeIsSet","nodeIsTypedArray","apply","func","arrayAggregator","iteratee","accumulator","arrayEach","arrayEachRight","arrayEvery","arrayFilter","resIndex","arrayIncludes","baseIndexOf","arrayIncludesWith","arrayMap","arrayPush","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","asciiToArray","string","asciiWords","baseFindKey","collection","eachFunc","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","basePropertyOf","baseReduce","baseSortBy","comparer","baseTimes","baseToPairs","baseTrim","trimmedEndIndex","baseUnary","baseValues","cacheHas","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","countHolders","deburrLetter","escapeHtmlChar","escapeStringChar","chr","hasUnicode","hasUnicodeWord","iteratorToArray","mapToArray","map","overArg","replaceHolders","setToArray","setToPairs","strictLastIndexOf","stringSize","unicodeSize","stringToArray","unicodeToArray","unescapeHtmlChar","unicodeWords","runInContext","Array","Date","Error","Function","Math","Object","RegExp","String","TypeError","arrayProto","funcProto","objectProto","coreJsData","funcToString","idCounter","maskSrcKey","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","Symbol","Uint8Array","allocUnsafe","getPrototype","objectCreate","propertyIsEnumerable","splice","spreadableSymbol","symIterator","symToStringTag","defineProperty","getNative","ctxClearTimeout","ctxNow","ctxSetTimeout","nativeCeil","nativeFloor","nativeGetSymbols","nativeIsBuffer","nativeIsFinite","nativeJoin","nativeKeys","nativeMax","nativeMin","nativeNow","nativeParseInt","nativeRandom","nativeReverse","DataView","Map","Promise","Set","WeakMap","nativeCreate","metaMap","realNames","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","symbolToString","lodash","isObjectLike","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","proto","baseLodash","chainAll","lazyClone","copyArray","lazyReverse","lazyValue","isArr","isRight","arrLength","view","getView","iteratees","iterLength","takeCount","baseWrapperValue","outer","iterIndex","Hash","hashClear","hashDelete","hashGet","hashHas","hashSet","ListCache","listCacheClear","listCacheDelete","assocIndexOf","listCacheGet","listCacheHas","listCacheSet","MapCache","mapCacheClear","mapCacheDelete","getMapData","mapCacheGet","mapCacheHas","mapCacheSet","SetCache","setCacheAdd","setCacheHas","Stack","stackClear","stackDelete","stackGet","stackHas","stackSet","pairs","arrayLikeKeys","inherited","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","arraySample","baseRandom","arraySampleSize","shuffleSelf","baseClamp","arrayShuffle","assignMergeValue","eq","baseAssignValue","objValue","baseAggregator","baseEach","baseAssign","copyObject","baseAssignIn","keysIn","baseAt","paths","skip","lower","upper","baseClone","bitmask","isDeep","isFlat","isFull","initCloneArray","getTag","isFunc","cloneBuffer","initCloneObject","copySymbolsIn","copySymbols","initCloneByTag","stacked","subValue","keysFunc","getAllKeysIn","getAllKeys","baseConforms","baseConformsTo","baseDelay","wait","setTimeout","baseDifference","includes","isCommon","valuesLength","valuesIndex","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","baseFill","toInteger","toLength","baseFilter","baseFlatten","isStrict","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","baseGet","castPath","toKey","baseGetAllKeys","symbolsFunc","baseGetTag","getRawTag","baseGt","other","baseHas","baseHasIn","baseInRange","baseIntersection","arrays","othLength","othIndex","caches","maxLength","baseInverter","baseInvoke","baseIsArguments","baseIsArrayBuffer","baseIsDate","baseIsEqual","baseIsEqualDeep","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","equalObjects","baseIsMap","baseIsMatch","matchData","noCustomizer","srcValue","baseIsNative","isMasked","baseIsRegExp","baseIsSet","baseIsTypedArray","isLength","baseIteratee","baseMatchesProperty","baseMatches","property","baseKeys","isPrototype","baseKeysIn","nativeKeysIn","isProto","baseLt","baseMap","isArrayLike","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","baseMergeDeep","safeGet","mergeFunc","isTyped","isArrayLikeObject","cloneTypedArray","toPlainObject","baseNth","baseOrderBy","orders","getIteratee","criteria","compareMultiple","basePick","basePickBy","baseSet","basePropertyDeep","basePullAll","indexOf","basePullAt","baseUnset","baseRange","step","baseRepeat","baseRest","setToString","overRest","baseSample","baseSampleSize","nested","baseSetData","baseSetToString","constant","baseShuffle","baseSlice","baseSome","baseSortedIndex","retHighest","low","high","mid","baseSortedIndexBy","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","baseSortedUniq","baseToNumber","baseToString","baseUniq","createSet","seenIndex","baseUpdate","baseWhile","isDrop","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castRest","castSlice","clearTimeout","cloneArrayBuffer","arrayBuffer","cloneDataView","dataView","cloneRegExp","regexp","cloneSymbol","symbol","typedArray","compareAscending","valIsDefined","valIsReflexive","objCriteria","othCriteria","ordersLength","order","composeArgs","partials","holders","isCurried","argsIndex","argsLength","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","getSymbols","getSymbolsIn","createAggregator","initializer","createAssigner","assigner","sources","isIterateeCall","iterable","createBind","isBind","Ctor","createCtor","createCaseFirst","trailing","createCompounder","words","deburr","thisBinding","createCurry","arity","getHolder","createRecurry","createHybrid","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","getFuncName","funcName","getData","isLaziable","partialsRight","holdersRight","argPos","ary","isAry","isBindKey","isFlip","holdersCount","newHolders","reorder","createInverter","toIteratee","createMathOperation","operator","createOver","arrayFunc","createPadding","chars","charsLength","createPartial","createRange","toFinite","createRelationalOperation","wrapFunc","isCurry","newHoldersRight","newPartials","newPartialsRight","setData","setWrapToString","createRound","precision","createToPairs","createWrap","mergeData","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","isPartial","arrStacked","othStacked","arrValue","othValue","compared","convert","objProps","objLength","othProps","objStacked","skipCtor","objCtor","othCtor","flatten","otherFunc","isKeyable","isOwn","unmasked","stubArray","ctorString","transforms","getWrapDetails","hasPath","hasFunc","insertWrapDetails","details","isMaskable","stubFalse","memoizeCapped","memoize","srcBitmask","newBitmask","isCombo","otherArgs","oldArray","shortOut","reference","updateWrapDetails","lastCalled","stamp","remaining","rand","subString","chunk","compact","concat","difference","differenceBy","differenceWith","drop","dropRight","dropRightWhile","dropWhile","fill","findIndex","findLastIndex","flattenDeep","flattenDepth","fromPairs","initial","intersection","intersectionBy","intersectionWith","join","separator","lastIndexOf","nth","pull","pullAll","pullAllBy","pullAllWith","pullAt","reverse","slice","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","sortedUniq","sortedUniqBy","take","takeRight","takeRightWhile","takeWhile","union","unionBy","unionWith","uniq","uniqBy","uniqWith","unzip","group","unzipWith","without","xor","xorBy","xorWith","zip","zipObject","zipObjectDeep","zipWith","tap","thru","wrapperAt","wrapperChain","wrapperCommit","wrapperNext","wrapperToIterator","wrapperPlant","wrapperReverse","wrapped","wrapperValue","countBy","every","find","findLast","flatMap","flatMapDeep","flatMapDepth","forEachRight","groupBy","invokeMap","keyBy","orderBy","partition","reduce","reduceRight","negate","sample","sampleSize","shuffle","some","sortBy","bindKey","curry","curryRight","debounce","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","timeWaiting","shouldInvoke","trailingEdge","debounced","isInvoking","defer","flip","memoized","overArgs","funcsLength","partial","partialRight","rearg","rest","throttle","unary","castArray","cloneWith","cloneDeepWith","conformsTo","gt","gte","isElement","isEmpty","isEqual","isEqualWith","isFinite","isInteger","isMatch","isMatchWith","isNaN","isNative","isNull","isNil","isSafeInteger","isWeakMap","isWeakSet","lt","lte","sign","remainder","isBinary","toSafeInteger","assignIn","assignInWith","assignWith","at","create","propsIndex","propsLength","defaultsDeep","mergeWith","findLastKey","forIn","forInRight","forOwn","forOwnRight","functions","functionsIn","invert","invertBy","invoke","mapKeys","mapValues","omit","omitBy","pickBy","pick","setWith","toPairs","toPairsIn","isArrLike","unset","updateWith","valuesIn","clamp","random","floating","temp","camelCase","word","upperFirst","escape","escapeRegExp","kebabCase","lowerCase","lowerFirst","pad","strLength","padEnd","padStart","parseInt","radix","repeat","replace","snakeCase","split","limit","startCase","startsWith","settings","imports","importsKeys","importsValues","isEscaping","isEvaluating","interpolate","reDelimiters","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","variable","attempt","toLower","toUpper","trimEnd","trimStart","truncate","omission","substring","newEnd","unescape","upperCase","bindAll","methodNames","cond","conforms","defaultTo","flow","flowRight","matchesProperty","methodOf","noConflict","nthArg","over","overEvery","overSome","propertyOf","range","rangeRight","stubObject","stubString","stubTrue","times","toPath","uniqueId","augend","addend","ceil","divide","dividend","divisor","floor","maxBy","mean","meanBy","minBy","multiply","multiplier","multiplicand","round","subtract","minuend","subtrahend","sum","sumBy","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","this","formatPrice","formattedPrice","MIN","MAX","tryUpdateValue","incomingValue","handleInput","handleBlur","isDecreasable","isIncreasable","decrement","increment","_quantity","isUnavailable","I","s$5","N","T","F","E","f","M","y","S","H","O","P","L","C","A","R","B","ue","$","z","J","Q","D","G","W","K","q","U","Te","Y","Ye","De","he","X","Ce","Z","me","ee","te","le","ae","oe","ye","re","Pe","de","ne","ve","se","ie","Se","ge","fe","be","V","Ge","Ve","pe","xe","Ie","Ee","_isOpen","bodySlotName","hasFooter","__expose","debounce$1","later","callNow","debounce_1","useEventListener","_unref","useClickAway","useContent","popperNode","hasContent","checkContent","getBoundingClientRect","includeScale","rect","scaleX","scaleY","getWindow","ownerDocument","getWindowScroll","win","scrollLeft","scrollTop","OwnElement","isHTMLElement","isShadowRoot","getHTMLElementScroll","getNodeScroll","getNodeName","getDocumentElement","getWindowScrollBarX","getComputedStyle","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","isElementScaled","getCompositeRect","elementOrVirtualElement","offsetParent","isFixed","isOffsetParentAnElement","documentElement","scroll","offsets","getLayoutRect","clientRect","getParentNode","getScrollParent","listScrollParents","_element$ownerDocumen","scrollParent","isBody","updatedList","isTableElement","getTrueOffsetParent","getContainingBlock","isFirefox","isIE","elementCss","currentNode","getOffsetParent","top","bottom","right","left","auto","basePlacements","clippingParents","viewport","popper","variationPlacements","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","visited","sort","requires","depModifier","orderModifiers","orderedModifiers","phase","pending","getBasePlacement","mergeByName","getViewportRect","html","visualViewport","getDocumentRect","winScroll","contains","rootNode","rectToClientRect","getInnerBoundingClientRect","getClientRectFromMixedType","clippingParent","getClippingParents","canEscapeClipping","clipperElement","getClippingRect","boundary","rootBoundary","mainClippingParents","firstClippingParent","clippingRect","accRect","getVariation","getMainAxisFromPlacement","computeOffsets","basePlacement","variation","commonX","commonY","mainAxis","getFreshSideObject","mergePaddingObject","paddingObject","expandToHashMap","hashMap","detectOverflow","_options","_options$placement","_options$boundary","_options$rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","popperRect","clippingClientRect","referenceClientRect","popperOffsets","popperClientRect","elementClientRect","overflowOffsets","offsetData","axis","DEFAULT_OPTIONS","areValidElements","_len","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","effectCleanupFns","isDestroyed","setOptionsAction","cleanupModifierEffects","runModifierEffects","_state$elements","_state$orderedModifie","_state$orderedModifie2","_ref3","_ref3$options","cleanupFn","noopFn","passive","effect$2","_options$scroll","_options$resize","resize","scrollParents","eventListeners","popperOffsets$1","unsetSides","roundOffsetsByDPR","dpr","mapToStyles","_ref2","_Object$assign2","gpuAcceleration","adaptive","roundOffsets","_ref3$x","_ref3$y","hasX","hasY","sideX","sideY","heightProp","widthProp","commonStyles","_Object$assign","computeStyles","_ref4","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","computeStyles$1","applyStyles","attributes","effect$1","initialStyles","styleProperties","attribute","applyStyles$1","createPopper","getAltAxis","within","min$1","max$1","preventOverflow","_options$mainAxis","checkMainAxis","_options$altAxis","checkAltAxis","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","altAxis","referenceRect","tetherOffsetValue","mainSide","altSide","additive","minLen","maxLen","arrowElement","arrowRect","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","arrowOffsetParent","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_mainSide","_altSide","_offset","_min","_max","_preventedOffset","preventOverflow$1","hash$1","getOppositePlacement","matched","hash","getOppositeVariationPlacement","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","placements$1","allowedPlacements","overflows","getExpandedFallbackPlacements","oppositePlacement","specifiedFallbackPlacements","_options$flipVariatio","preferredPlacement","fallbackPlacements","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","numberOfChecks","_loop","_i","fittingPlacement","_ret","flip$1","distanceAndSkiddingToXY","rects","invertDistance","skidding","distance","_options$offset","_data$state$placement","offset$1","toPaddingObject","arrow","_state$modifiersData$","minProp","maxProp","endDiff","startDiff","clientSize","centerToReference","center","axisProp","_options$element","arrow$1","toInt","usePopper","arrowPadding","locked","offsetDistance","offsetSkid","triggerNode","setPopperEventListeners","enabled","_state$popperInstance","enablePopperEventListeners","disablePopperEventListeners","isOpen","initializePopper","_state$popperInstance2","_hoisted_1$1","styleInject","insertAt","css_248z$1","script$1","Arrow","script","popperContainerNode","modifiedIsOpen","closeDelay","disableClickAway","interactive","openDelay","show","manualMode","invalid","shouldShowPopper","enableClickAway","interactiveStyle","openPopperDebounce","closePopperDebounce","openPopper","closePopper","togglePopper","$event","_refs","createElementVNode","css_248z","entry_esm","installable","isMobile","showTooltip","isPriceSet","price","getDisplayPrice","summaryLineItems","showBeforeShippingAndTaxNote","availabilityUpdatedTimeAgo","isDataLoaded","unavailableItems","cutoverSkus","isCheckoutDisabled","isResidentialShippingEligible","hasWallpaper","hasAmberLewis","isItemRemoveAnimationComplete","cartSummaryProps","removeUnavailable","checkout","currentPage","isOnFirstPage","isOnLastPage","paginationVisibility","tp","totalItem","hasError","itemsInCurrentPage","saveForLaterData","removeCartItemMutation","addCartItemsMutation","notificationStore","isLoadingState","notifyItemRemoveSuccess","notifyItemRemoveError","handleItemDelete","notifyAddToCartSuccess","notifyAddToCartError","handleMoveToCart","notifyAddAllToCartSuccess","notifyAddAllToCartError","handleMoveAllToCart","itemsToMoveMap","itemKeyTouches","getProductNameByItemId","itemId","generateItemKey","touches","totalItemsCount","totalItemsPrice","availabilityLastUpdatedDate","updateCartItemMutation","touchItemKey","handleItemQuantityUpdate","notifyItemQuantityUpdateSuccess","notifyItemQuantityUpdateError","undoItemRemove","notifyUndoSuccess","notifiyUndoError","shouldScrollToItem","productName","handleItemEnter","itemElement","SaveForLatersMutation","handleSaveForLater","itemToMove","headerClasses","bodyClasses","useCheckoutQuery","UPDATE_CHECKOUT_PATHS","useCreateCheckoutMutation","useUpdateCheckoutMutation","useSubmitOrderMutation","SUPPORT_PHONE_NUMBER","SUPPORT_HOURS_OF_OPERATION","CHECKOUT_STEPS","SHIPPING_DETAILS_FH_CARRIERS_SUB_STEPS","SHIPPING_OPTIONS","SHIPPING_OPTIONS_DEFINITION","FREIGHT_SERVICE_LEVEL","FREIGHT_SERVICE_LEVEL_DEFINITION","_map_category_ga","cateogryList","productObj","category","_mapProductDataToGA","products","productObject","_mapProductDetailsToGA","send_ecommerce_event","ecommObj","event_viewListItem","productData","categoryList","event_selectItem","event_viewItem","event_addItemToCart","event_beginCheckout","event_Purchase","purchaseData","event_Search","searchTerm","event_ShippingInfo","checkoutTotal","shipping_method","event_PaymentInfo","payment_method","event_AddToWishList","send_user_dimension","userData","sent_custom_event","_openBlock","_createElementBlock","COUNTRIES","MEASUREMENT_SYSTEM","MEASUREMENT_UNITS","MEASUREMENT_UNITS_DEFINITION","CREDIT_CARDS","ERROR_RESPONSE_MESSAGES","STRINGS.SUPPORT_PHONE_NUMBER","PRICING_LEVELS","PRICING_LEVELS_MARK_UP","markup","CAD_PRICING","paymentCardRef","handleRemoveClick","dateSlice","card_icon","card","AriaClickText","ownKeys","enumerableOnly","symbols","sym","_objectSpread2","_defineProperty","unwrapObj","ignoreKeys","stringPath","gatherBooleanGroupProperties","nestedResults","gatherArrayGroupProperties","all","fetchedProperty","callRule","rule","siblingState","normalizeValidatorResponse","createAsyncResult","model","$pending","$dirty","$response","$lazy","$rewardEarly","watchTargets","$lastInvalidState","$lastCommittedOn","$invalid","$pendingCounter","$unwatch","ruleResult","createSyncResult","returnValue","createValidatorResult","validatorName","propertyKey","propertyPath","$params","sortValidations","validationsRaw","validations","validationKeys","rules","nestedValidators","validationGroups","ROOT_PATH","createValidationResults","resultsCache","externalResults","ruleKeys","cachedResult","ruleKey","stringError","collectNestedValidationResults","nestedState","nestedExternalResults","nestedValidationKeys","results","nestedKey","setValidations","createMetaFields","childResults","allResults","allRes","$silentErrors","modelErrors","nestedErrors","errors","$errors","$anyDirty","$error","$touch","$commit","nr","globalConfig","mergedConfig","cachedExternalResults","$validationGroups","$model","external","$validate","$getResultsForChild","$clearExternalResults","ResultsStorage","storedRules","storedRulesKeys","newRulesKeys","paramKey","storedRuleResultPair","isValidCache","CollectFlag","VuelidateInjectChildResults","VuelidateRemoveChildResults","nestedValidations","$scope","childResultsRaw","childResultsKeys","injectChildResultsIntoParent","childScope","$stopPropagation","removeChildResultsFromParent","childKey","sendValidationResultsToParent","removeValidationResultsFromParent","ComputedProxyFactory","useVuelidate","$registerAs","$externalResults","currentVueInstance","componentOptions","validationResults","validationsWatchTarget","newValidationRules","normalizeValidatorObject","unwrapValidatorResponse","unwrapNormalizedValidator","withParams","$validator","validatorObj","withMessage","$message","withAsync","$watchTargets","others","collectionItem","collectionEntryResult","innerValidators","propertyResult","currentValidator","$valid","req","regex","expr","reg","common","emailRegex","email$1","email","maxLength$1","minLength$1","minLength","required$1","required","validate$1","requiredIf$1","propOrFunction","parentVM","requiredIf","sameAs$1","equalTo","sameAs","otherName","urlRegex","__default__","formControlId","noteId","hasNote","errorMessageId","hasVuelidateError","hasErrorMessage","formControlBindings","isPassword","passwordIsVisible","inputElement","inputType","parts","truncated","specialCharsValidation","vuelidate","modalIsOpen","updateCheckout","isSaving","save","checkoutSectionRef","cityStatePostalCode","countryDisplayName","holdDateString","showShippingAddress","forge","api","baseN","_reverseAlphabets","maxline","output","_encodeWithByteBuffer","digits","carry","table","require$$0","require$$1","util","callbacks","div","oldSetImmediate","_checkBitsParam","ByteStringBuffer","_MAX_CONSTRUCTED_STRING_LENGTH","rval","DataBuffer","amount","growSize","dst","encoding","s3","hex","_base64","_base64Idx","_base58","chr1","chr2","chr3","enc1","enc2","enc3","enc4","out","flg","_setStorageObject","_getStorageObject","_setItem","_getItem","_removeItem","empty","_clearItems","_callStorageFunction","location","exception","ex","part","argi","decimals","dec_point","thousands_sep","ip","num","blanks","zeros","zeroGroups","zeroMaxGroup","blobUrl","st","et","samples","numWorkers","avg","workers","worker","overlaps","r1","overlap","r2","algorithm","BlockCipher","modes","finish","transformIV","inputLength","partialBytes","inc32","iv","additionalData","ivLength","from64To32","lengths","z_i","v_i","x_i","lsb","ah","bits","perInt","shft","half","m_i","m_j","ints","blocks","cipher","_createCipher","init","initialize","inBlock","outBlock","_updateBlock","encryptOp","_expandKey","decrypt","registerAlgorithm","Nb","sbox","isbox","rcon","mix","imix","xtime","ei","e4","e8","sx","sx2","ime","iNk","Nk","Nr1","m0","m1","m2","m3","wnew","wi","Nr","sub","a2","b2","oids","_IN","_I_","asn1","tagClass","constructed","obj1","obj2","longForm","_checkBufferLength","_getValueLength","longFormBytes","byteCount","_fromDer","b1","bitStringContents","savedRead","savedRemaining","unused","subOptions","composed","used","tc","asn1Options","useBitStringContents","lenBytes","oid","valueBytes","utc","year","MM","DD","hh","mm","ss","hhoffset","mmoffset","gentime","YYYY","fff","isUTC","capture","_nonLatinRegex","level","indentation","subvalues","hmac","_md","_ipadding","_opadding","md","keylen","inner","md5","_initialized","_init","_state","_input","_w","int32s","_update","finalBlock","_padding","_g","_r","_k","pem","foldHeader","rMessage","rHeader","rCRLF","lines","li","nl","vi","ltrim","insertSpace","$1","candidate","_createKeys","spfunction1","spfunction2","spfunction3","spfunction4","spfunction5","spfunction6","spfunction7","spfunction8","pc2bytes0","pc2bytes1","pc2bytes2","pc2bytes3","pc2bytes4","pc2bytes5","pc2bytes6","pc2bytes7","pc2bytes8","pc2bytes9","pc2bytes10","pc2bytes11","pc2bytes12","pc2bytes13","iterations","shifts","lefttmp","righttmp","looping","endloop","loopinc","right1","right2","__viteBrowserExternal","pkcs5","crypto","require$$4","dkLen","hLen","prf","dk","u_c","u_c1","sha256","t1","t2","s0","ch","maj","_crypto","require$$2","prng","pools","formatKey","formatSeed","_reseed","_reseedSync","_seed","needed","_2powK","seedBytes","defaultSeedFile","getRandomValues","globalScope","entropy","hi","lo","seed","jQuery","prng_aes","_prng_aes_output","_prng_aes_buffer","spawnPrng","_navBytes","piTable","rol","ror","effKeyBits","T1","T8","TM","createCipher","encrypt","_finish","_output","_iv","mixRound","mashRound","runPlan","plan","ptr","ctr","dbits","BigInteger","nbi","am1","am2","xl","xh","am3","BI_FP","BI_RM","BI_RC","rr","vv","int2char","intAt","bnpCopyTo","bnpFromInt","nbv","bnpFromString","mi","sh","bnpClamp","bnToString","km","bnNegate","bnAbs","bnCompareTo","nbits","bnBitLength","bnpDLShiftTo","bnpDRShiftTo","bnpLShiftTo","bs","ds","bnpRShiftTo","bnpSubTo","bnpMultiplyTo","bnpSquareTo","bnpDivRemTo","pm","pt","ts","ms","nsh","ys","y0","yt","d1","d2","qd","bnMod","Classic","cConvert","cRevert","cReduce","cMulTo","cSqrTo","bnpInvDigit","Montgomery","montConvert","montRevert","montReduce","u0","montSqrTo","montMulTo","bnpIsEven","bnpExp","bnModPowInt","bnClone","bnIntValue","bnByteValue","bnShortValue","bnpChunkSize","bnSigNum","bnpToRadix","cs","bnpFromRadix","bnpFromNumber","op_or","bnToByteArray","bnEquals","bnMin","bnMax","bnpBitwiseTo","op","op_and","bnAnd","bnOr","op_xor","bnXor","op_andnot","bnAndNot","bnNot","bnShiftLeft","bnShiftRight","lbit","bnGetLowestSetBit","cbit","bnBitCount","bnTestBit","bnpChangeBit","bnSetBit","bnClearBit","bnFlipBit","bnpAddTo","bnAdd","bnSubtract","bnMultiply","bnDivide","bnRemainder","bnDivideAndRemainder","bnpDMultiply","bnpDAddOffset","NullExp","nNop","nMulTo","nSqrTo","bnPow","bnpMultiplyLowerTo","bnpMultiplyUpperTo","Barrett","barrettConvert","barrettRevert","barrettReduce","barrettSqrTo","barrettMulTo","bnModPow","k1","g2","is1","bnGCD","bnpModInt","bnModInverse","ac","lowprimes","lplim","bnIsProbablePrime","bnpMillerRabin","bnGetPrng","sha1","pkcs1","label","mgf1Md","keyLength","lHash","PS","PS_length","DB","dbMask","rsa_mgf1","maskedDB","seedMask","maskedSeed","em","db","lHashPrime","in_ps","is_0","error_mask","maskLength","prime","GCD_30_DELTA","THIRTY","rng","primeincFindPrime","primeincFindPrimeWithWorkers","primeincFindPrimeWithoutWorkers","generateRandom","deltaIdx","mrTests","getMillerRabinTests","maxBlockTime","_primeinc","workLoad","workerScript","cores","workerMessage","bits1","require$$8","pki","privateKeyValidator","rsaPrivateKeyValidator","rsaPublicKeyValidator","publicKeyValidator","digestInfoValidator","emsaPkcs1v15encode","oidBytes","digestInfo","digestAlgorithm","digest","_modPow","pub","xp","xq","bt","eb","_encodePkcs1_v1_5","yhex","ed","ml","xhex","_decodePkcs1_v1_5","_getMillerRabinTests","_detectNodeCrypto","priv","_detectSubtleCrypto","_intToUint8Array","pkcs8","privateKey","_detectSubtleMsCrypto","genOp","exportOp","keypair","_generateKeyPair","scheme","schemeOptions","dP","dQ","qInv","rsaKey","_bnToBytes","padNum","padByte","numZeros","padBytes","zero","getPrime","encryptedPrivateKeyValidator","PBES2AlgorithmsValidator","pkcs12PbeParamsValidator","salt","countBytes","encryptionAlgorithm","encryptedData","ivLen","encOid","cipherFn","prfAlgorithm","prfAlgorithmToMessageDigest","createPbkdf2Params","saltBytes","encrypted","epki","iter","passBuf","Slen","Plen","buf","Inew","prfOidToMessageDigest","dIvLen","digests","prfOid","p7v","contentInfoValidator","encryptedContentInfoValidator","signerValidator","mgf1","mgf","maskLen","pss","salt_","sLen","pssobj","modBits","emBits","emLen","mHash","m_","ps","mask","checkLen","h_","_shortNames","x509CertificateValidator","rsassaPssParameterValidator","certificationRequestInfoValidator","certificationRequestValidator","rdn","si","seq","_getAttribute","_readSignatureParameters","fillDefaults","_createSignatureDigest","_verifySignature","cert","computeHash","strict","csr","sn","_fillMissingFields","exts","_fillMissingExtensionFields","ext","algorithmOid","issuer","subject","tbsCertificate","iattr","sattr","ski","serial","validity","imd","ibytes","smd","sbytes","extseq","ev","b3","gn","altName","cri","_dnToAsn1","valueTagClass","keyIdentifier","authorityCertIssuer","serialNumber","subSeq","fullNameGeneralNames","_signatureParametersToAsn1","_CRIAttributesToAsn1","valueConstructed","jan_1_1950","jan_1_2050","_dateToAsn1","notBefore","notAfter","tbs","dn","certs","caStore","getBySubject","ensureSubjectHasHash","der1","der2","certList","validityCheckDate","selfSigned","parents","verified","bcExt","keyUsageExt","pathLen","vfd","p12","pfxValidator","safeBagValidator","attributeValidator","certBagValidator","_getBagsByAttribute","safeContents","attrName","attrValue","bagType","bag","pfx","localKeyId","friendlyName","_decodePkcs7Data","macKeyBytes","macAlgorithm","macSalt","macIterations","macKey","mac","macValue","_decodeAuthenticatedSafe","authSafe","contentInfo","_decryptSafeContents","_decodeSafeContents","encryptedContentAsn1","safeBag","_decodeBagAttributes","bagAsn1","certAsn1","decodedAttrs","bagAttrs","pairedCert","contents","certSafeBags","certBagAttrs","certSafeBag","certSafeContents","certCI","keyBag","pkAsn1","keySafeContents","keyCI","safe","macData","prf_TLS1","secret","slen","ai","md5itr","sha1itr","md5bytes","sha1bytes","hmac_sha1","seqNum","record","deflate","inflate","readVector","writeVector","tls","twoBytes","ignore","snl","snType","msgRandom","cRandom","sRandom","sessionId","SCC","SCE","session","CCC","CCE","CKE","SKE","SCR","sp","CCV","SHD","msgBytes","verify","SER","SFI","CFI","vd","vdl","SAD","CAD","alert","hsTable","SHE","CHE","__","R0","R1","R2","R3","R4","ctTable","H0","H1","H2","H3","H4","H5","H6","H7","H8","H9","tls10","createMode","cipherSuites","cSuites","compressionMethods","cMethods","extensions","serverName","snList","extLength","hint","der","certBuffer","certTypes","cAs","byteBuffer","payloadLength","plaintextLength","paddingLength","records","rec","_certErrorToAlertDesc","_alertDescToCertError","capacity","entity","sessionCache","cn","dpth","cts","fatal","clearFail","aligned","handlers","_readRecordHeader","compatibleVersion","_readRecord","initConnectionState","decrypt_aes_cbc_sha1","encrypt_aes_cbc_sha1","encrypt_aes_cbc_sha1_padding","decrypt_aes_cbc_sha1_padding","macLen","mac2","compareMacs","mac1","sha512","sha384","_states","_h","digestLength","hlen","t1_hi","t1_lo","t2_hi","t2_lo","s0_hi","s0_lo","s1_hi","s1_lo","ch_hi","ch_lo","maj_hi","maj_lo","a_hi","a_lo","b_hi","b_lo","c_hi","c_lo","d_hi","d_lo","e_hi","e_lo","f_hi","f_lo","g_hi","g_lo","h_hi","h_lo","w2","w7","w15","w16","asn1Validator","require$$5","ByteBuffer","NativeBuffer","ed25519","messageToNativeBuffer","pk","sk","crypto_sign_keypair","valid","ed25519Oid","privateKeyBytes","publicKeyBytes","keyPair","signedMsg","crypto_sign","sig","publicKey","sm","crypto_sign_open","gf0","gf","gf1","D2","msgLen","scalarbase","pack","smlen","modL","mlen","unpackneg","scalarmult","crypto_verify_32","cswap","sel25519","tx","ty","zi","inv25519","pack25519","par25519","car25519","chk","den","den2","den4","den6","set25519","unpack25519","pow2523","neq25519","xi","yi","vn","t0","t3","t4","t5","t6","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","b0","b4","b5","b6","b7","b8","b9","b10","b11","b12","b13","b14","b15","kdf","kem","byteLength","encapsulation","_createKDF","counterStart","sLevelInfo","sLoggers","sConsoleLogger","messageLevelIndex","logger","loggerLevelIndex","levels","logFunction","aValidLevel","lock","levelHandlers","p7","pemObj","_fromAsn1","crls","signedData","signer","authenticatedAttributes","messageDigest","mds","addDigestAlgorithmIds","addSignerInfos","crl","signingTime","attrsAsn1","_attributeToAsn1","_signersToAsn1","_decryptContent","_recipientsFromAsn1","_recipientsToAsn1","_encryptedContentToAsn1","sAttr","rAttr","recipient","privKey","keyLen","ciphFn","ciph","_recipientFromAsn1","_recipientToAsn1","infos","recipients","_signerToAsn1","signers","ec","ssh","passphrase","comment","ppk","pubbuffer","_addStringToBuffer","_addBigIntegerToBuffer","privbuffer","encLen","_sha1","aeskey","mackey","macbuffer","hexVal","sha","lib","PaytraceEncryption","public_key_pem","key_url","QUERY_KEY_BASE","encryptService","useCreditCardQuery","useCreateCreditCardMutation","creditCard","encryptedCardNumber","lastFour","expiration","updatedCCData","newCreditCard","isSingleUse","queryKeyFilter","existingCreditCards","useDeleteCreditCardMutation","deletedId","deletedCreditCardIndex","showDeleteModal","cardToRemove","cardsToShow","cardRef","deleteCardError","deleteCreditCardMutation","handleRemoveCC","removeCreditCard","handleDeleteError","newCards","oldCards","labelSizeClass","inputRef","placeholderSeal","isProd","initDigiCertSeal","cid","ls","definition","cardFromNumber","cardFromType","creditcardutils","defaultFormat","luhnCheck","replaceFullWidthChars","digit","odd","fullWidth","halfWidth","month","currentTime","expiry","cvc","groups","upperLength","mon","sep","modal","sameAsShipping","creditCardError","createCreditCardMutation","ALLOWED_BILLING_COUNTRIES","countryOptions","hasStateOptions","country","stateLabel","stateOptions","postalCodeLabel","postalCodeRegex","cardBrand","cardType","parseCardType","ACCEPTED_CARD_BRANDS","accepted_card_brands_label","validateCardNumber","parseCardExpiry","paddedMonth","validateCardExpiry","validateCardCVC","setSameAsShipping","handleSaveSuccess","handleSaveError","onCardNumberKeyUp","inputValue","formatCardNumber","formatCardExpiry","isChecked","scrollToTopOf","elem","_selectedId","isRemovingCreditCard","listElem","isListMode","isSelectMode","cards","selectedcard","handleCardCreate","newCard","updateCardSelected","isValid","complete","useShippingAddressesQuery","useCreateShippingAddressMutation","shippingAddress","newAddress","existingAddresses","useDeleteShippingAddressMutation","deletedAddressIndex","address","useVerifyShippingAddressMutation","updatedAddress","useShippingAddressStore","subheading","ALLOWED_SHIP_TO_COUNTRIES","createShippingAddressMutation","isAdding","PER_PAGE","shippingAddressesOrdered","shippingAddressesPage","rootElem","isManageMode","shippingAddresses","findFirstValidAddress","condition","firstAvailableId","selectedAddress","fallbackId","handleAddressCreate","deleteShippingAddressMutation","isDeletingAddressIds","handleCreate","handleDelete","shippingAddressListRef","shippingAddressFormSubHeading","isShippingAddressSelectionRequired","isVerifying","verifyShippingAddress","addressIdsConfirmedForFreight","isVerifyingNewAddress","showAddressVerificationModal","showAddressIneligibleModal","isAddressVerificationRequired","tryComplete","handleAddressVerificationSuccess","handleAddressVerificationError","shouldKeepSelectedAddress","clearSelectedAddressIfNeeded","isSm","useFreightQuery","isResShipEligValue","priceToBeQuoted","toggleCheckbox","isSelected","getFutureDateString","days","getHoldDateLimits","isNextStepAvailable","isOrderShippingLater","filteredFreightServiceLevels","isDateValid","maxDate","minDate","currentSubStep","goToNextStep","SUB_STEPS","characterLimit","stepComponent","FhCheckoutStepShippingDetails_FhCarriers","FhCheckoutStepShippingDetails_ThirdParty","FhCheckoutStepShippingDetails_PickUp","isFirstLoad","isCheckoutQueryError","refetchCheckout","handleCheckoutQueryError","handleCheckoutUnprovisioned","isCheckoutUnprovisioned","isProvisionCheckoutError","createCheckout","ensureCartIsEligibleForCheckoutOrRedirect","refetchCart","isUnrecoverableError","getPriceForSummary","_c","_d","_e","tooltipProps","getUpdateCheckoutPath","saveStep","completeStep","allowSubmitOrder","isSubmitting","submitOrderMutation","submitOrder","handleOrderSubmissionError","sectionRefs","nextStepValue","_f","_j","_m","_l","checkoutdata","residentialShippingModal","imageSm","imageMd","imageLg","isMd","generalInquiriesHeading","tollFreePhoneLabel","tollFreePhone","headquartersPhoneLabel","headquartersPhone","headquartersPhoneHours","addressLabel","mailingAddress1","mailingAddress2","cityStateZip","layout","description","ctaLink","ctaTarget","ctaText","ctaAltText","useSignUpMutation","useLoginMutation","useInitiatePasswordResetMutation","useResetPasswordMutation","useUpdatePasswordMutation","Logo","scrollContainer","updatedModel","SidebarImg","isGuestAccount","form","submit","signUpMutate","isSignUpMutationRunning","loginMutate","isLoginMutationRunning","isSignUpComplete","isLoginComplete","handleSubmit","login","videoPlayer","isPlaying","videoToggle","video","videoFrameLoaded","image","imageAltText","eyebrowText","gaTagging","ctas","departments","imageSrc","caption","linkAriaLabel","horizontalPositioning","verticalPositioning","aspect","aspectRatio","getImageAspect","tempImage","useUserStore","user","userObj","useFeaturesStore","features","featureName","featuresObj","userStore","featuresStore","stateObj","pricing_visibilities","pricing","selectedLevel","handleClickTriggers","click_type","guestAccounts","isguestAccountsDataEmpty","errorObject","editMode","emailValidation","isCreatingAccount","createAccount","useGuestAccountQuery","useDeleteGuestAccountMutation","existingGuestAccounts","deleteGuestAccountIndex","guestAccount","useCreateGuestAccountMutation","pricingVisibility","newGuestAccount","useUpdateGuestAccountMutation","updatedGuestAccount","useUpdateAccountPriceMarkup","markupObject","accountMarkupResponse","showAccountForm","guestAccountIdToDelete","isEditForm","guestAccountToModify","showPriceMarkup","showCADPricing","guestAccountsData","deleteMutationLoading","deleteAccountMutate","createMutationLoading","createAccountMutate","createAccountError","updateMutationLoading","updateAccountMutate","searchQuery","filteredItems","pageGuestAccounts","handleDeleteGuestAccount","guestAccountId","closeDeleteModal","accountModalTrigger","createGuestAccount","accountDetails","updateGuestAccount","updateClick","accountId","ctaAriaLabel","ctaURL","subContent","leftImages","leftImages_AriaLabel","rightImages","rightImages_AriaLabel","trackContainer","trackLeft","leftImagesLoadState","trackRight","rightImagesLoadState","allImagesLoaded","_backdoor","animationReady","animating","animationDuration","velocity","trackOffset","containerHeight","recalculateAnimation","mediaLg","mediaMd","imagePathMobile","imagePathTablet","imagePathDesktop","ssrDocument","getDocument","ssrWindow","classesToTokens","classes","deleteProps","getTranslate","matrix","curTransform","transformMatrix","curStyle","isNode","noExtend","nextSource","keysArray","nextKey","setCSSProperty","varName","varValue","animateCSSModeScroll","swiper","targetPosition","side","startPosition","startTime","isOutOfBound","animate","progress","easeProgress","currentPosition","elementChildren","showWarning","elementOffset","document","clientTop","clientLeft","elementPrevAll","prevEls","elementNextAll","nextEls","elementStyle","elementIndex","elementParents","elementTransitionEnd","fireCallBack","elementOuterSize","includeMargins","makeElementsArray","Keyboard","extendParams","on","handle","rtl","kc","pageUpDown","isPageUp","isPageDown","isArrowLeft","isArrowRight","isArrowUp","isArrowDown","inView","swiperWidth","swiperHeight","windowWidth","windowHeight","swiperOffset","swiperCoord","point","enable","disable","createElementIfNotDefined","originalParams","checkProps","Navigation","getEl","toggleEl","subEl","nextEl","prevEl","onPrevClick","onNextClick","initButton","destroy","destroyButton","_s","targetEl","isHidden","classesToSelector","Scrollbar","isTouched","dragTimeout","dragStartPos","dragSize","trackSize","divider","setTranslate","scrollbar","dragEl","newSize","setTransition","updateSize","getPointerPosition","setDragPosition","positionRatio","onDragStart","wrapperEl","onDragMove","onDragEnd","events","passiveListener","eventMethod","enableDraggable","disableDraggable","swiperEl","Thumb","initialized","swiperCreated","onThumbClick","thumbsSwiper","clickedIndex","clickedSlide","slideToIndex","thumbsParams","SwiperClass","thumbsSwiperParams","slidesPerView","thumbsToActivate","thumbActiveClass","slideEl","autoScrollOffset","useOffset","currentThumbsIndex","newThumbsIndex","direction","newThumbsSlide","thumbs","getThumbsElementAndInit","thumbsElement","onThumbsSwiper","watchForThumbsToAppear","freeMode","onTouchStart","translate","onTouchMove","onTouchEnd","currentPos","snapGrid","timeDiff","lastMoveEvent","velocityEvent","momentumDuration","momentumDistance","newPosition","doBounce","afterBouncePosition","bounceAmount","needsLoopFix","nextSlide","moveDistance","currentSlideSize","support","calcSupport","getSupport","deviceCached","calcDevice","_temp","userAgent","ua","device","screenWidth","screenHeight","android","ipad","ipod","iphone","windows","macos","iPadScreens","getDevice","overrides","browser","calcBrowser","needPerspectiveFix","isSafari","major","minor","isWebView","isSafariBrowser","need3dFix","getBrowser","Resize","animationFrame","resizeHandler","createObserver","newWidth","newHeight","contentBoxSize","contentRect","removeObserver","orientationChangeHandler","observers","attach","ObserverFunc","observerUpdate","containerParents","eventsEmitter","priority","eventHandler","_len2","_key2","updateSlides","getDirectionPropertyValue","slidesEl","swiperSize","wrongRTL","isVirtual","previousSlidesLength","slides","slidesLength","slidesGrid","slidesSizesGrid","offsetBefore","offsetAfter","previousSnapGridLength","previousSlidesGridLength","spaceBetween","slidePosition","prevSlideSize","gridEnabled","slideSize","shouldResetSlideSize","slide","slideStyles","currentTransform","currentWebKitTransform","paddingLeft","paddingRight","marginLeft","marginRight","boxSizing","clientWidth","offsetWidth","newSlidesGrid","slidesGridItem","groupSize","slideIndex","allSlidesSize","slideSizeValue","maxSnap","snap","offsetSize","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","backFaceHiddenClass","hasClassBackfaceClassAdded","updateAutoHeight","speed","activeSlides","getSlideByIndex","updateSlidesOffset","minusOffset","toggleSlideClasses$1","className","updateSlidesProgress","offsetCenter","slideOffset","slideProgress","originalSlideProgress","slideBefore","slideAfter","isFullyVisible","isVisible","updateProgress","translatesDiff","isBeginning","progressLoop","wasBeginning","wasEnd","isBeginningRounded","isEndRounded","firstSlideIndex","lastSlideIndex","firstSlideTranslate","lastSlideTranslate","translateMax","translateAbs","toggleSlideClasses","updateSlidesClasses","activeIndex","getFilteredSlide","activeSlide","prevSlide","processLazyPreloader","imageEl","slideSelector","lazyEl","unlazy","preload","activeColumn","preloadColumns","slideIndexLastInView","realIndex","getActiveIndexByTranslate","updateActiveIndex","newActiveIndex","previousIndex","previousRealIndex","previousSnapIndex","getVirtualRealIndex","aIndex","firstSlideInColumn","activeSlideIndex","updateClickedSlide","pathEl","slideFound","getSwiperTranslate","currentTranslate","byController","newProgress","minTranslate","maxTranslate","translateTo","runCallbacks","translateBounds","internal","newTranslate","isH","transitionEmit","transitionStart","transitionEnd","slideTo","normalizedTranslate","normalizedGrid","normalizedGridNext","slideToLoop","targetSlideIndex","cols","centeredSlides","needLoopFix","slideNext","perGroup","slidePrev","rtlTranslate","normalize","normalizedSnapGrid","prevSnap","prevSnapIndex","prevIndex","slideReset","slideToClosest","threshold","currentSnap","nextSnap","slideToClickedSlide","loopCreate","slideRealIndex","initSlides","slidesPerGroup","shouldFillGroup","shouldFillGrid","addBlankSlides","amountOfSlides","slidesToAdd","loopFix","byMousewheel","allowSlidePrev","allowSlideNext","loopedSlides","prependSlidesIndexes","appendSlidesIndexes","isNext","isPrev","slidesPrepended","slidesAppended","activeColIndexWithShift","colIndexToPrepend","currentSlideTranslate","shift","loopParams","loopDestroy","newSlidesOrder","setGrabCursor","moving","unsetGrabCursor","grabCursor","closestElement","__closestFrom","preventEdgeSwipe","startX","edgeSwipeDetection","edgeSwipeThreshold","swipingClassHasValue","eventPath","noSwipingSelector","isTargetShadow","startY","preventDefault","shouldPreventDefault","targetTouch","pageX","pageY","diffX","diffY","touchAngle","touchesDiff","prevTouchesDirection","isLoop","allowLoopFix","evt","loopFixed","disableParentSwiper","resistanceRatio","touchEndTime","pathTree","swipeToLast","stopIndex","rewindFirstIndex","rewindLastIndex","ratio","onResize","isVirtualLoop","onClick","onScroll","onLoad","onDocumentTouchStart","domMethod","swiperMethod","attachEvents","detachEvents","events$1","isGridEnabled","setBreakpoint","breakpoint","breakpointParams","wasMultiRow","isMultiRow","wasGrabCursor","isGrabCursor","wasEnabled","wasModuleEnabled","isModuleEnabled","directionChanged","needsReLoop","wasLoop","isEnabled","hasLoop","getBreakpoint","containerEl","currentHeight","minRatio","prepareClasses","resultClasses","classNames","addClasses","suffixes","removeClasses","checkOverflow","wasLocked","slidesOffsetBefore","lastSlideRightEdge","checkOverflow$1","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","prototypes","extendedDefaults","Swiper$1","Swiper","swipers","newParams","swiperParams","updates","spv","breakLoop","translateValue","translated","newDirection","needUpdate","currentDirection","getWrapperSelector","lazyElements","deleteInstance","cleanStyles","newDefaults","prototypeGroup","protoMethod","paramsList","needsNavigation","needsPagination","needsScrollbar","uniqueClasses","unique","wrapperClass","updateSwiper","passedParams","changedParams","scrollbarEl","paginationEl","updateParams","currentParams","pagination","navigation","virtual","needThumbsInit","needControllerInit","needPaginationInit","needScrollbarInit","needNavigationInit","loopNeedDestroy","loopNeedEnable","loopNeedReloop","destroyModule","getParams","splitEvents","allowedParams","plainObj","mountSwiper","getChangedParams","oldParams","getKey","addKey","oldChildrenKeys","childrenKeys","newKeys","oldKeys","newKey","oldKey","updateOnVirtualData","getChildren","originalSlots","slidesRef","oldSlidesRef","getSlidesFromElements","renderVirtual","swiperRef","virtualData","getSlideIndex","loopFrom","loopTo","slidesToRender","Tag","WrapperTag","containerClasses","breakpointChanged","initializedRef","swiperElRef","oldPassedParamsRef","nextElRef","prevElRef","paginationElRef","scrollbarElRef","onBeforeBreakpoint","passParams","extendWith","newPassedParams","renderSlides","SwiperSlide","eventAttached","slideElRef","slideClasses","lazyLoaded","updateClasses","slideData","windowSize","randId","numberOfSlides","numberOfMargins","wrapperSize","slidesWidth","calcSlide","displayArrows","arrows","calculateSlideDimensions","singleSlideItemSize","marginSize","toggleArrows","initDOM","isAuthenticated","customerNumber","customerStatus","customerDiscount","isFromSubPage","scrollPosition","hideBanner","toggleModal","carouselBreakpoints","expanderOpen","idBase","triggerId","regionId","triggerAriaAttributes","regionAriaAttributes","modalData","locations","modelTrimmed","isRedirecting","isAuthError","defaultErrorMsg","retryAfter","retryAfterMs","allowSubmit","passwordResetMutate","isResetError","PAGE_LOGIN","PAGE_FORGOT","PAGE_SENT","PAGE_RESET","focusFirstEmptyInput","userName","navigateTo","destination","_userName","useSubmitMailingListMutation","openModal","submitMailingListMutation","materials","orderHistoryUrl","iframe","orderDateFormatted","print","people","levelTotal","pricingProgressWidth","totalFromLevel","tableData","shippedTotal","shippedUpdated","reviewDate","pricingLevel","pricingLevelDiscount","nextPricingLevel","nextPricingLevelSpend","nextPricingLevelDiscount","productDescription","dimensions","material","retailPrice","quantity","newQuantity","productCategory","cat","addToCart","MEDIA_TYPES","setIndex","activeHiResImageUrl","mainSwiper","setMainSwiper","setThumbsSwiper","nextButton","destroySwiper","vidLoaded","vidContainer","imagesSwiper","setImagesSwiper","showLabel","isValueNumeric","valueAsNumber","shouldFormat","unitSystem","shouldConvert","displayUnit","valueAsNumberConverted","displayValue","nf","cleaningCodes","isCleaningCode","cleaningCodeValue","codeValue","_specs","spec","specsFlat","specGroup","_selectedValueId","selectedValue","isText","isSwatch","isExpanded","selectedValueId","selectedValueSkus","selectedSkusIntersection","handleChange","optionIndex","adjustSelectedValuesForAvailability","setOptionValuesEnabledState","selectedValueIndex","LazyProduct","sets","dm","fixedOptionIndex","fixedOption","combos","otherOptionsSelectedValueSkus","triggerSlots","contentSlots","tabList","handleTabChange","handleTabClick","isUnderlineVisible","alignment","productCareModalData","productCareModalIsOpen","toggleProductCareModal","showContainer","openFilterContainer","closeGuestAccountFilterModal","selectedIndex","selectedOption","toggleRadio","QUERY_KEY_DETAILS","useShoppingListQuery","shoppingListResponse","useShoppingListDetailQuery","guid","isPreview","shoppingListDetailResponse","useCreateShoppingListMutation","ShoppingListItems","updatedShoppingList","useUpdateShoppingListMutation","isDetailsPage","payLoadData","listIdToUpdate","updatedDetails","shopping_list","useDeleteShoppingListMutation","isDetailPage","shoppingList","useUpdateItemMutation","updatedShoppingListResponse","shoppingListCache","useDeleteShoppingItemMutation","itemToRemoveObject","shoppingDetailCache","shoppingDetail","updatedProducts","totalQuantity","totalPrice","shoppingListsCache","accum","currentList","listRemovedProductArray","totalItems","useAddAllToCartMutation","shoppingListData","shoppingLists","myList","guestAccountList","searchQueryGuest","detailTabsSelectedIndex","closeContainer","selectedGuestAccount","guestAccountOptions","account","filteredItemsMylist","filteredItemsGuest","searchQueryGuestValue","selectedUserName","titleMatch","userNameMatch","heartIconStates","newShoppingLists","toggleHeartIcon","currentState","shopping","updateCloseContainer","shouldSeePricingVisibility","isShoppingList","createShoppingList","calculate","label2","panelMeasurementSysemSign","wp_width","wp_length","reserveCheckbox","rollDimensions","baseValue","calculateArea","roundToNearest","bannerNumberRolls","panelNumberRolls","exededMaxAmount","singularPluralRoll","calculateTotalRollDimensions","totalDimensionsNeededBanner","totalDimensionsNeededPanel","updatePdpRoll","rows","focusInput","addRow","removeRow","checkIfExededAmount","amountOfRolls","rowElement","measurementSysemSign","toggleCheckboxValue","checkboxValue","rollQty","dimensionsWithUSFormatSystem","decimalPlaces","factor","MEDIA_PREVIEW_COUNT","addToMutationLoading","addToShoppingListMutation","removeItemToMutationLoading","removeItemToShoppingListMutation","createShoppingListMutationLoading","createSHoppingListMutation","showAddToShoppingListForm","showForm","shoppingListToModify","categoryItems","crumb","pdfTearSheetsEnabled","activeSkuNumber","activeSku","sku","noSkuTags","returnURL","encodedReturnURL","loginReturnURL","updateURL","mediaPreview","mediaAll","mediaGalleryActive","mediaGalleryInitialIndex","mediaHasVideo","media","openMediaGalleryToIndex","mainMediaContainer","scrollToMainMediaElem","canAddToCart","hideCtas","showPrice","showCutover","tearsheet","activeOverallDimensionsString","activeCoreSpecs","specs","activeFullSpecs","fullDetailsSection","boxCount","activeSingleBoxWeight","showFullDetails","fullSpecsContainer","fullSpecs","fullSpecsContainerHeight","fullSpecsHeight","doFullSpecsOverflow","areFullSpecsExpanded","showProductCare","showDownloads","qty","handle_Rolls","valor","hasWallpaperItems","hasSwatch","wallpaperDimensions","handle_AddToCart","skuInfo","skuAdded","handalClick","addtolistModal","addToShoppingList","shoppingListDetails","shoppinglist","handaleheartclickevent","handleheartfilledevent","shoppingListId","targetSkuNumber","matchingProduct","parentOptionRef","parentValue","nestedOptions","nestedOptionsValue","nestedOption","itemComponent","FhRadio","FhCheckbox","isInditerm","hasParent","showNestedOptions","optionChangeEvent","childrenRemoved","triggerNestedOptions","triggerInditerm","selectedOptions","facetCountValues","filterOptions","facetCount","buildFilterOptions","getFacetCounts","facet","counts","facetValues","filterOption","propsFactory","makeComponentProps","IN_BROWSER","SUPPORTS_TOUCH","getNestedValue","getObjectValueByPath","convertToUnit","keyCodes","keyValues","only","wrapInArray","getDecimals","trimmedStr","chunked","mergeDeep","arrayFn","sourceProperty","targetProperty","flattenFragments","toKebabCase","kebab","destructComputed","EventProp","mainTRC","Rco","Gco","Bco","normBG","normTXT","revTXT","revBG","blkThrs","blkClmp","deltaYmin","scaleBoW","scaleWoB","loConThresh","loConFactor","loConOffset","loClip","APCAcontrast","Rtxt","Gtxt","Btxt","Rbg","Gbg","Bbg","Ytxt","Ybg","outputContrast","SAPC","cielabForwardTransform","cielabReverseTransform","fromXYZ","xyz","transformedY","toXYZ","lab","Ln","srgbForwardMatrix","srgbForwardTransform","srgbReverseMatrix","srgbReverseTransform","rgb","isCssColor","color","isParsableColor","cssColorRe","mappers","HSLtoRGB","HSVtoRGB","parseColor","realValues","HexToRGB","HSLtoHSV","hsva","hsla","hsl","sprime","toHex","RGBtoHex","parseHex","lighten","CIELAB.fromXYZ","sRGB.toXYZ","sRGB.fromXYZ","CIELAB.toXYZ","darken","getLuma","getForeground","blackContrast","DefaultsSymbol","createDefaults","injectDefaults","propIsDefined","internalUseDefaults","vm","componentDefaults","_subcomponentDefaults","subComponents","provideSubDefaults","injectSelf","propKeys","setupBindings","genericComponent","exposeDefaults","_defineComponent","getCurrentInstanceName","_uid","_map","getUid","useRender","useToggleScope","active","useProxiedModel","transformIn","transformOut","kebabProp","isControlled","externalValue","internalValue","en","LANG_PREFIX","createTranslateFunction","shortKey","currentLocale","fallbackLocale","createNumberFunction","useProvided","provided","createProvideFunction","createVuetifyAdapter","LocaleSymbol","isLocaleInstance","createLocale","i18n","createRtl","useLocale","locale","genDefaults","isRtl","useRtl","ThemeSymbol","makeThemeProps","parseThemeOptions","themes","theme","defaultTheme","createTheme","computedThemes","original","onColor","colorVal","createCssClass","genCssVariables","themeName","bgLines","fgLines","colors","getHead","install","updateStyles","styleEl","themeClasses","provideTheme","newTheme","lightOverlay","darkOverlay","makeTagProps","makeTransitionProps","createCssTransition","origin","offsetTop","offsetLeft","offsetHeight","createJavascriptTransition","ExpandTransitionGenerator","expandedParentClass","sizeProperty","offsetProperty","initialStyle","resetStyles","VScaleTransition","VSlideYTransition","makeDimensionProps","useDimension","useColor","backgroundColor","textColor","useTextColor","textColorClasses","textColorStyles","useBackgroundColor","backgroundColorClasses","backgroundColorStyles","makeRoundedProps","useRounded","rounded","tile","MaybeTransition","makeElevationProps","useElevation","elevation","allowedDensities","makeDensityProps","useDensity","aliases","mdi","VClassIcon","IconValue","IconSymbol","makeIconProps","VComponentIcon","Icon","VSvgIcon","_mergeProps","createIcons","defaultSet","useIcon","iconAlias","icon","iconSetName","setName","iconName","predefinedSizes","makeSizeProps","useSize","sizeClasses","sizeStyles","makeVIconProps","VIcon","slotIcon","iconData","slotValue","hasClick","stopSymbol","DELAY_RIPPLE","isTouchEvent","localX","localY","radius","scale","centerX","centerY","ripples","isRippleEnabled","rippleShow","rippleStop","rippleHide","rippleCancelShow","keyboardRipple","keyboardRippleShow","keyboardRippleHide","focusRippleHide","updateRipple","removeListeners","Ripple","Ripple$1","makeVLabelProps","VLabel","useInputIcon","InputIcon","localeKey","makeVMessagesProps","VMessages","makeFocusProps","useFocus","isFocused","focusClasses","focus","blur","FormKey","useForm","makeValidationProps","useValidation","validationModel","internalErrorMessages","isPristine","isDirty","isDisabled","errorMessages","validateOn","isValidating","validationClasses","validate","resetValidation","silent","makeVInputProps","VInput","densityClasses","dimensionStyles","rtlClasses","messagesId","hasPrepend","hasAppend","hasMessages","hasDetails","DisplaySymbol","defaultDisplayOptions","parseDisplayOptions","getClientWidth","getClientHeight","getPlatform","ios","cordova","electron","chrome","edge","firefox","opera","linux","createDisplay","thresholds","mobileBreakpoint","xs","lg","xxl","breakpointValue","mobile","GoToSymbol","createGoTo","VSliderSymbol","getOffset","vertical","touch","getPosition","makeSliderProps","useSteps","roundValue","clamped","useSlider","steps","onSliderStart","onSliderMove","onSliderEnd","getActiveThumb","isReversed","indexFromEnd","thumbSize","tickSize","numTicks","thumbColor","trackColor","trackFillColor","mousePressed","startOffset","trackContainerRef","activeThumbRef","parseMouseMove","trackStart","trackLength","clickOffset","clickPos","handleStop","handleStart","moveListenerOptions","onMouseMove","onSliderMouseUp","onSliderTouchend","onSliderTouchstart","onSliderMousedown","percentage","showTicks","parsedTicks","hasLabels","makeVSliderThumbProps","VSliderThumb","slider","thumbLabel","elevationProps","elevationClasses","pageup","pagedown","home","down","up","relevantKeys","multipliers","parseKeydown","_step","onKeydown","positionPercentage","_withDirectives","_resolveDirective","_vShow","makeVSliderTrackProps","VSliderTrack","roundedClasses","trackFillColorClasses","trackFillColorStyles","trackColorClasses","trackColorStyles","startDir","endDir","backgroundStyles","trackFillWidth","trackFillStyles","computedTicks","tick","directionValue","firstDay","getWeekArray","weeks","currentWeek","firstDayOfMonth","startOfMonth","lastDayOfMonth","endOfMonth","firstDayWeekIndex","lastDayWeekIndex","adjacentDay","day","startOfWeek","endOfWeek","lastDay","parseLocalDate","_YYYMMDD","sundayJanuarySecond2000","getWeekdays","daysFromSunday","weekday","formatString","formats","newDate","customFormat","toISO","parseISO","addMinutes","addHours","addDays","addWeeks","addMonths","getYear","getMonth","getDate","getNextMonth","getPreviousMonth","getHours","getMinutes","startOfYear","endOfYear","isWithinRange","isAfter","isBefore","comparing","isAfterDay","startOfDay","isSameDay","isSameMonth","isSameYear","getDiff","setHours","setMinutes","setMonth","setDate","setYear","endOfDay","VuetifyDateAdapter","DateOptionsSymbol","DateAdapterSymbol","createDate","makeVRangeSliderProps","VRangeSlider","startThumbRef","stopThumbRef","stopOffset","trackStop","inputProps","_Fragment","selectedRangeValues","defaultRange","rangeSliderTextClass","updateValue","onSliderMoveEnd","HOVER_SHOW_DELAY","HOVER_HIDE_DELAY","isPanelOpenViaHover","isPanelOpenViaClick","isPanelOpen","is_fetching_products","filterFacetCounts","facetValue","rangeValues","rangeValue","rangeType","mouseEnterTimer","mouseLeaveTimer","handleButtonMouseEnter","handleContainerMouseEnter","handleContainerMouseLeave","handleButtonClick","buttonElement","panelElement","hasSelectedOptions","clearSelectedOptions","handleSliderMoveEnd","useUrlState","filterSearchURL","urlSearchParams","searchParams","searchParamsObj","queryParams","currentSortOrder","setURLParam","keysToDelete","searchParam","searchKey","useProductFiltersStore","urlState","filterNameMap","dyanmicFilters","createFilterValueMap","stopRecurr","updatedFilters","filterFacet","filterdFacet","filterMap","selectedOptionsList","rangeFiltersKey","removeFilter","filterValue","possibleRangeKey","rangeKey","newModel","sortRef","sortOptions","showSortOptions","sortModel","sortName","sortBlur","eventTarget","showFilterNav","handleOpenAllFilters","getFacetCountByKey","filterKey","clearAll","openAllFilters","productFilterStore","clearAllParams","deleteSearchParam","initFilterStore","updateFilterNameMap","facetCounts","projectEmberEnabled","updateSearchURL","activeFilters","activeFilter","modelToPublish","totalActiveFilterOptionCount","installedModules","__webpack_require__","moduleId","DEVICE_TYPES","BROWSER_TYPES","OS_TYPES","defaultData","UAParser","_require","_require2","checkType","broPayload","mobilePayload","wearPayload","consolePayload","stvPayload","getNavigatorInstance","isIOS13Check","UA","engine","os","CHROME","CHROMIUM","IE","INTERNET_EXPLORER","OPERA","FIREFOX","SAFARI","EDGE","YANDEX","MOBILE_SAFARI","MOBILE","TABLET","SMART_TV","BROWSER","WEARABLE","CONSOLE","ANDROID","WINDOWS_PHONE","IOS","WINDOWS","MAC_OS","isMobileType","isTabletType","isMobileAndTabletType","isEdgeChromiumType","isSmartTVType","isBrowserType","isWearableType","isConsoleType","isAndroidType","isWindowsType","isMacOsType","isWinPhoneType","isIOSType","isChromeType","isFirefoxType","isChromiumType","isEdgeType","isYandexType","isSafariType","isMobileSafariType","isOperaType","isIEType","isElectronType","nav","getIOS13","getIPad13","getIphone13","getIPod13","getBrowserFullVersion","getBrowserVersion","getOsVersion","getOsName","getBrowserName","getMobileVendor","getMobileModel","getEngineName","getEngineVersion","getUseragent","getDeviceType","isSmartTV","isConsole","isWearable","isMobileSafari","isChromium","isMobileOnly","isTablet","isBrowser","isAndroid","isWinPhone","isChrome","isOpera","osVersion","osName","fullBrowserVersion","browserVersion","browserName","mobileVendor","mobileModel","engineName","engineVersion","getUA","isEdge","isYandex","deviceType","isIOS13","isIPad13","isIPhone13","isIPod13","isElectron","isEdgeChromium","isLegacyEdge","isWindows","isMacOs","deviceDetect","__WEBPACK_AMD_DEFINE_RESULT__","LIBVERSION","EMPTY","UNKNOWN","FUNC_TYPE","UNDEF_TYPE","OBJ_TYPE","STR_TYPE","MAJOR","MODEL","NAME","TYPE","VENDOR","ARCHITECTURE","SMARTTV","EMBEDDED","regexes","margedRegexes","str1","str2","mapper","maps","uastring","rgxmap","cpu","__webpack_amd_options__","_extends","hoverSwatch","selectedSwatch","activeSwatch","activeDetailsObj","isImageHovered","hoverImage","tags","inStock","originalPrice","isDiscounted","buildPriceString","priceData","priceString","originalPriceString","showOriginalPrice","handleSwatchMouseEnter","swatch","handleSwatchMouseLeave","handleSwatchClick","isSwatchSelected","navigateToProduct","getSwatchName","getSwatchPrice","activesku","getSelectedProductObject","handleHeartClick","isImageHoveredFn","isHovered","productsContainer","createShoppingListMutation","showResults","showNoResults","handleaddtoshoppinglist","selectedProduct","toggleShoppingListFormValue","useInfiniteProductQuery","searchBody","sortOrder","lastPage","allPages","lastScrollPosition","filterKeysToFacet","resultSetContainer","isViewMore","headerElement","productFilterElement","infiniteScrollDefaults","scrollComponent","merchandisingSkus","baseQuery","baseFilterQuery","buildFiltersQuery","handleActiveFiltersChange","filterQueryTransform","updatedFilterQuery","queryObj","filterQuery","productListingsQueryData","fetchNextPage","productListings","listings","thresholdMeet","percantageComplete","resultSet","chipsBar","filterBar","handleSort","handleScroll","currentScrollPosition","fetchMoreProduct","scrollToTop","bgColorClass","_Transition","_withCtx","menuOpen","activePage","menuItems","menuStyles","isGuest","customerIdLabel","customerId","isModalOpen","serverErrorMessages","updatePasswordMutate","isUpdating","updatePassword","handleUpdatePasswordSuccess","handleUpdatePasswordError","shopplingListProducts","showPopup","togglePopup","closePopupOnClick","isEmptyAccount","shoppingListToDelete","createShoppingListMutate","updateShoppingListMutate","deleteShoppingListMutate","displayedShoppingLists","pageShoppingList","isShoppingListDataEmpty","isSelectedGuestAccount","isSearchQuery","shoppingListModalTrigger","updateShoppingList","handleDeleteShoppingList","removeShoppingList","copyLink","IconNewWindow","removeCartItemLoading","AddAllToCartLoading","addAllToCartMutation","AddToCartLoading","addToCartMutation","updateCartItemLoading","updateItemMutation","showSharedList","shoppingListSharedLink","shouldShowPricing","closePopup","sharedList","pathArray","viewAsClient","detailPageUrl","handleAddAllToCart","handleAddToCart","useSubmitContactSubscriptionMutation","submitContactSubscriptionMutation","createContact","currentYear","mainMenuItems","menuChildItems","menuStack","sectionHeadline","searchText","showAllLink","isNotCategoryLinks","menuItemClick","menuItemClicked","menuItemKey","nextMenuItem","childItem","showMenuContent","goBack","sectionToGoTo","onSearch","navPath","childItems","menuItem","MENU_HOVER_SHOW_DELAY","MENU_HOVER_HIDE_DELAY","MENU_ITEM_HOVER_DELAY","superCategoryHoverTimer","mainMenuIsOpen","mainMenuActiveSection","mainMenuActiveSuperCategory","mainMenuActiveCategory","isNavOpen","isAccountMenu","showSearchInput","searchInput","mobileMenuRef","searchInputElement","mainMenuDropdownHasSupercategories","mainNavItems","mobileNavItems","mainMenuMouseEnterTimer","mainMenuMouseLeaveTimer","marketingCTAs","setCtaProperties","handleMainNavItemMouseEnter","activateMainNavItem","handleMainNavItemMouseLeave","handleMainMenuMouseEnter","handleMainMenuMouseLeave","closeMainMenu","activateSuperCategory","activateCategory","isMainMenuItemActive","isSuperCategoryActive","isCategoryActive","accountMenuIsOpen","accountMenuMouseEnterTimer","accountMenuMouseLeaveTimer","handleAccountMenuMouseEnter","moreMenuIsOpen","handleAccountMenuMouseLeave","moreMenuMouseEnterTimer","moreMenuMouseLeaveTimer","handleMoreMenuMouseEnter","handleMoreMenuMouseLeave","pageOverlayIsActive","navMenuToggle","openAccountMenu","closeMenu","tirggerSearch","termsToSearch","searchInputToggle","dataGAValueForCategory","dataGaValueForSuperCat","handleSuperCategoryMouseEnter","handleSuperCategoryMouseLeave","NOTIFICATION_DURATION","NOTIFICATION_DURATION_LONG","timers","startTimer","cancelTimer","pageTitle","links","tearSheetProductSku","tearSheetImages","tearSheetProductSpec","testimonials","updateTab","downloadLabel","downloadUrl","downloadTarget","tipsCopy","convertedDate","ta","convertedLocation","convertedTitle","fields","useSubmitTradeApplicationMutation","barWidth","modelProperties","nextPage","pageValue","allowNext","primaryProjectTypeOtherRequired","prevPage","projectTypeOtherOtherRequired","oldVal","isRetail","isNotCommercialorResidential","isEcommerce","servicesOtherRequired","validatedState","revenue","numberStaff","services","isCountryUSorCA","phoneNumberValidation","phoneNumberLengthValidation","emailAddress","isComplete","previousPage","pageTransition","currentPageComponent","Page1","Page2","Page3","Page4","Page5","Page6","pageNumber","serviceOptions","primaryProjectTypeOptions","projectTypeOtherOptions","currentPageModel","_model","selectFirstInput","submitTradeApplication","videoURL","posterImage","isSaveButtonDisabled","updatingPriceModifer","updatePriceModiferMutation","isMaxMarkupError","isNegativeError","grandfatheredUserCurrentMarkup","updateSentence","roundedValue","triggerUpdatePriceModifer","updatePriceModiferResponse","subHeading","markupValue","handleMarkupUpdate","updatedMarkupValue","author","imageUrl","skusWhitelist","setActiveSku","totalItemCount","filteredBase","isTabletOrDesktop","listeners","cleanups","options2","optionsClone","useIntersectionObserver","rootMargin","_target","targets2","root2","resolveElement","vIntersectionObserver","checkOverflowScroll","rawEvent","elInitialOverflow","useScrollLock","isLocked","stopTouchMoveListener","unlock","onScrollLock","onInView","isIntersecting","onSlide","slideEvent","activeLetter","showLeftGradient","showRightGradient","onLetterClick","letter","hasArtistsForLetter","previousElement","currentElement","scrollToLetter","artist","artistsByLetter","groupedArtists","updateGradientVisibility","alphabetList","createVuetify","vuetify","blueprint","display","goTo","plugins","registerVuePlugins","envrionmentTypes","hostName","envrionment","wat","isInstanceOf","isBuiltin","isErrorEvent","isDOMError","isDOMException","isParameterizedString","isPrimitive","isEvent","isSyntheticEvent","isVueViewModel","safeJoin","isMatchingPattern","requireExactStringMatch","stringMatchesSomePattern","testString","patterns","applyAggregateErrorsToEvent","exceptionFromErrorImplementation","maxValueLimit","originalException","truncateAggregateExceptions","aggregateExceptionsFromError","prevExceptions","exceptionId","newExceptions","applyExceptionGroupFieldsForParentException","newException","newExceptionId","applyExceptionGroupFieldsForChildException","childError","parentId","exceptions","maxValueLength","getBreadcrumbLogLevelFromHttpStatusCode","statusCode","SDK_VERSION","GLOBAL_OBJ","getGlobalSingleton","creator","gbl","__SENTRY__","versionedCarrier","WINDOW","DEFAULT_MAX_STRING_LENGTH","htmlTreeAsString","currentElem","MAX_TRAVERSE_HEIGHT","sepLength","nextStr","keyAttrs","maxStringLength","_htmlElementAsString","keyAttrPairs","keyAttr","keyAttrPair","allowedAttrs","getLocationHref","DEBUG_BUILD","PREFIX","CONSOLE_LEVELS","originalConsoleMethods","consoleSandbox","console","wrappedFuncs","wrappedLevels","originalConsoleMethod","makeLogger","DSN_REGEX","isValidProtocol","dsnToString","dsn","withPassword","host","pass","port","projectId","dsnFromString","lastPath","projectMatch","dsnFromComponents","validateDsn","makeDsn","SentryError","logLevel","replacementFactory","markFunctionWrapped","addNonEnumerableProperty","getOriginalFunction","urlEncode","convertToPlainObject","getOwnProperties","newObj","serializeEventTarget","extractedProps","extractExceptionKeysForMessage","firstKey","includedKeys","serialized","dropUndefinedKeys","_dropUndefinedKeys","memoizationMap","isPojo","memoVal","STACKTRACE_FRAME_LIMIT","UNKNOWN_FUNCTION","WEBPACK_ERROR_REGEXP","STRIP_FRAME_REGEXP","createStackParser","parsers","sortedParsers","skipFirstLines","framesToPop","frames","cleanedLine","frame","stripSentryFramesAndReverse","stackParserFromStackParserOptions","stackParser","localStack","getLastStackFrame","defaultFunctionName","getFunctionName","getFramesFromEvent","instrumented","addHandler","maybeInstrument","instrumentFn","triggerHandlers","typeHandlers","addConsoleInstrumentationHandler","instrumentConsole","log","supportsFetch","isNativeFunction","supportsNativeFetch","sandbox","ONE_SECOND_IN_MS","dateTimestampInSeconds","createUnixTimestampInSecondsFunc","performance","approxStartingTimeOrigin","timeOrigin","timestampInSeconds","performanceNow","dateNow","timeOriginDelta","timeOriginIsReliable","navigationStart","navigationStartDelta","navigationStartIsReliable","addFetchInstrumentationHandler","skipNativeFetchCheck","instrumentFetch","onFetchResolved","originalFetch","parseFetchArgs","handlerData","virtualStackTrace","getUrlFromResource","resource","fetchArgs","_oldOnErrorHandler","addGlobalErrorInstrumentationHandler","instrumentError","_oldOnUnhandledRejectionHandler","addGlobalUnhandledRejectionInstrumentationHandler","instrumentUnhandledRejection","getSDKSource","memoBuilder","hasWeakSet","unmemoize","uuid4","getRandomByte","getFirstException","getEventDescription","eventId","firstException","addExceptionTypeValue","addExceptionMechanism","newMechanism","defaultMechanism","currentMechanism","mergedData","checkOrSetAlreadyCaught","arrayify","maybeArray","maxProperties","normalizeToSize","maxSize","jsonSize","stringified","stringifyValue","remainingDepth","valueWithToJSON","jsonValue","numAdded","visitable","visitKey","visitValue","objName","getConstructorName","utf8Length","States","RESOLVED","REJECTED","resolvedSyncPromise","SyncPromise","rejectedSyncPromise","onrejected","onfinally","isRejected","cachedHandlers","makePromiseBuffer","isReady","task","taskProducer","drain","counter","capturedSetTimeout","parseUrl","fragment","validSeverityLevels","severityLevelFromString","SENTRY_BAGGAGE_KEY_PREFIX","SENTRY_BAGGAGE_KEY_PREFIX_REGEX","baggageHeaderToDynamicSamplingContext","baggageHeader","baggageObject","parseBaggageHeader","dynamicSamplingContext","nonPrefixedKey","curr","currBaggageObject","baggageHeaderToObject","baggageEntry","keyOrValue","createEnvelope","addItemToEnvelope","envelope","newItem","forEachEnvelopeItem","envelopeItems","envelopeItem","envelopeItemType","encodeUTF8","serializeEnvelope","envHeaders","append","itemHeaders","stringifiedPayload","concatBuffers","buffers","totalLength","createSpanEnvelopeItem","spanJson","createAttachmentEnvelopeItem","attachment","ITEM_TYPE_TO_DATA_CATEGORY_MAP","envelopeItemTypeToDataCategory","getSdkMetadataForEnvelopeHeader","metadataOrEvent","createEventEnvelopeHeaders","sdkInfo","tunnel","createClientReportEnvelope","discarded_events","clientReportItem","DEFAULT_RETRY_AFTER","parseRetryAfterHeader","headerDelay","headerDate","disabledUntil","limits","dataCategory","isRateLimited","updateRateLimits","updatedRateLimits","rateLimitHeader","retryAfterHeader","categories","namespaces","generatePropagationContext","supportsHistory","chromeVar","isChromePackagedApp","hasHistoryApi","getMainCarrier","getSentryCarrier","carrier","makeSession","startingTime","sessionToJSON","updateSession","closeSession","SCOPE_SPAN_FIELD","_setSpanForScope","span","_getSpanForScope","DEFAULT_MAX_BREADCRUMBS","ScopeClass","newScope","lastEventId","requestSession","extras","extra","fingerprint","captureContext","scopeToMerge","scopeInstance","Scope","contexts","propagationContext","breadcrumb","maxBreadcrumbs","maxCrumbs","mergedBreadcrumb","breadcrumbs","syntheticException","getDefaultCurrentScope","getDefaultIsolationScope","AsyncContextStack","isolationScope","assignedScope","assignedIsolationScope","maybePromiseResult","getAsyncContextStack","sentry","withScope","withSetScope","withIsolationScope","getStackAsyncContextStrategy","_isolationScope","getAsyncContextStrategy","getIsolationScope","getGlobalScope","acs","getClient","METRICS_SPAN_FIELD","getMetricSummaryJsonForSpan","storage","exportKey","summary","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT","SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE","SEMANTIC_ATTRIBUTE_PROFILE_ID","SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME","SPAN_STATUS_UNSET","SPAN_STATUS_OK","TRACE_FLAG_NONE","TRACE_FLAG_SAMPLED","spanToTransactionTraceContext","span_id","trace_id","parent_span_id","spanToJSON","spanToTraceContext","spanTimeInputToSeconds","ensureTimestampInSeconds","spanIsSentrySpan","spanIsOpenTelemetrySdkTraceBaseSpan","endTime","parentSpanId","getStatusMessage","castSpan","spanIsSampled","traceFlags","CHILD_SPANS_FIELD","ROOT_SPAN_FIELD","addChildSpanToSpan","childSpan","rootSpan","getSpanDescendants","addSpanChildren","childSpans","getRootSpan","getActiveSpan","SCOPE_ON_START_SPAN_FIELD","ISOLATION_SCOPE_ON_START_SPAN_FIELD","setCapturedScopesOnSpan","getCapturedScopesOnSpan","hasTracingEnabled","maybeOptions","SentryNonRecordingSpan","spanContext","_timestamp","_values","_status","_name","_attributesOrStartTime","_startTime","_link","_links","_exception","_time","DEFAULT_ENVIRONMENT","FROZEN_DSC_FIELD","freezeDscOnSpan","dsc","getDynamicSamplingContextFromClient","public_key","getDynamicSamplingContextFromSpan","frozenDsc","traceState","traceStateDsc","dscOnTraceState","jsonSpan","maybeSampleRate","logSpanStart","spanId","sampled","isRootSpan","infoParts","logSpanEnd","parseSampleRate","sampleRate","sampleSpan","samplingContext","parsedSampleRate","enhanceEventWithSdkInfo","createSessionEnvelope","metadata","envelopeHeaders","createEventEnvelope","eventType","createSpanEnvelope","spans","dscHasRequiredProps","beforeSendSpan","convertToSpanJSON","timedEventsToMeasurements","measurements","MAX_SPAN_COUNT","SentrySpan","traceId","timeInput","endTimestamp","attributesOrStartTime","isSpanTimeInput","sendSpanEnvelope","transactionEvent","isFullFinishedSpan","capturedSpanScope","capturedSpanIsolationScope","isStandaloneSpan","transaction","spanItems","transport","SUPPRESS_TRACING_KEY","startInactiveSpan","getAcs","spanArguments","parseSentrySpanArguments","forceTransaction","customParentSpan","withActiveSpan","parentSpan","getParentSpan","createChildOrRootSpan","_startChildSpan","parentSampled","_startRootSpan","initialCtx","notifyEventProcessors","processors","processor","final","applyScopeDataToEvent","sdkProcessingMetadata","applyDataToEvent","applySpanToEvent","applyFingerprintToEvent","applyBreadcrumbsToEvent","applySdkMetadataToEvent","mergeScopeData","eventProcessors","attachments","transactionName","mergeAndOverwriteScopeData","mergeVal","cleanedExtra","cleanedTags","cleanedUser","cleanedContexts","mergedBreadcrumbs","prepareEvent","normalizeDepth","normalizeMaxBreadth","prepared","integrations","applyClientOptions","applyIntegrationsMetadata","applyDebugIds","finalScope","getFinalScope","clientEventProcessors","isolationData","finalScopeData","applyDebugMeta","normalizeEvent","environment","release","dist","debugIdStackParserCache","debugIdMap","debugIdStackFramesCache","cachedDebugIdStackFrameCache","filenameDebugIdMap","debugIdStackTrace","debugIdValue","parsedStack","cachedParsedStack","stackFrame","images","debug_id","integrationNames","maxBreadth","parseEventHintOrCaptureContext","hintIsScopeOrFunction","hintIsScopeContext","captureContextKeys","captureException","captureEvent","startSession","currentScope","currentSession","endSession","_sendSessionUpdate","captureSession","SENTRY_API_VERSION","getBaseApiEndpoint","_getIngestEndpoint","_encodedAuth","getEnvelopeEndpointWithUrlEncodedAuth","installedIntegrations","filterDuplicates","integrationsByName","existingInstance","getIntegrationsToSetup","defaultIntegrations","userIntegrations","integration","finalIntegrations","debugIndex","debugInstance","setupIntegrations","integrationIndex","setupIntegration","afterSetupIntegrations","ALREADY_SEEN_ERROR","BaseClient","hintWithEventId","eventMessage","promisedEvent","clientFinished","transportFlushed","eventProcessor","integrationName","isAlreadyInstalled","env","sendResponse","eventOrCount","cbIndex","crashed","errored","mechanism","sessionNonTerminal","ticked","finalEvent","sentryError","isTransaction","isTransactionEvent","beforeSendLabel","processBeforeSend","_validateBeforeSendResult","processedEvent","spanCount","spanCountBefore","spanCountAfter","droppedSpanCount","transactionInfo","outcomes","beforeSendResult","invalidValueError","beforeSend","beforeSendTransaction","processedSpans","processedSpan","initAndBind","clientClass","setCurrentClient","DEFAULT_TRANSPORT_BUFFER_SIZE","createTransport","makeRequest","rateLimits","send","filteredEnvelopeItems","getEventForEnvelopeItem","filteredEnvelope","recordEnvelopeLoss","requestTask","applySdkMetadata","names","DEFAULT_BREADCRUMBS","addBreadcrumb","beforeBreadcrumb","finalBreadcrumb","originalFunctionToString","INTEGRATION_NAME","SETUP_CLIENTS","_functionToStringIntegration","originalFunction","functionToStringIntegration","DEFAULT_IGNORE_ERRORS","_inboundFiltersIntegration","_hint","clientOptions","mergedOptions","_mergeOptions","_shouldDropEvent","inboundFiltersIntegration","internalOptions","_isSentryError","_isIgnoredError","_isUselessError","_isIgnoredTransaction","_isDeniedUrl","_getEventFilterUrl","_isAllowedUrl","ignoreErrors","_getPossibleEventMessages","ignoreTransactions","denyUrls","allowUrls","possibleMessages","lastException","_getLastValidUrl","_dedupeIntegration","previousEvent","currentEvent","dedupeIntegration","_isSameMessageEvent","_isSameExceptionEvent","currentMessage","previousMessage","_isSameFingerprint","_isSameStacktrace","previousException","_getExceptionFromEvent","currentException","currentFrames","previousFrames","frameA","frameB","currentFingerprint","previousFingerprint","ignoreOnError","shouldIgnoreOnError","ignoreNextOnError","sentryWrapped","wrappedArguments","exceptionFromError","parseStackFrames","extractType","extractMessage","eventFromPlainObject","isUnhandledRejection","errorFromProp","getErrorPropertyFromObject","getNonErrorObjectExceptionValue","eventFromError","stacktrace","skipLines","getSkipFirstStackStringLines","getPopFirstTopFrames","reactMinifiedRegexp","isWebAssemblyException","eventFromException","attachStacktrace","eventFromUnknownInput","eventFromMessage","eventFromString","domException","__sentry_template_string__","__sentry_template_values__","captureType","getObjectClassName","createUserFeedbackEnvelope","feedback","createUserFeedbackEnvelopeItem","BrowserClient","sdkSource","DEBOUNCE_DURATION","debounceTimerID","lastCapturedEventType","lastCapturedEventTargetId","addClickKeypressInstrumentationHandler","instrumentDOM","triggerDOMHandler","globalDOMEventHandler","makeDOMEventHandler","originalAddEventListener","handlerForType","originalRemoveEventListener","isSimilarToLastCapturedEvent","shouldSkipDOMEvent","globalListener","getEventTarget","lastHref","addHistoryInstrumentationHandler","instrumentHistory","oldOnPopState","historyReplacementFunction","originalHistoryFunction","cachedImplementations","getNativeImplementation","impl","contentWindow","clearCachedImplementation","SENTRY_XHR_DATA_KEY","addXhrInstrumentationHandler","instrumentXHR","xhrproto","originalOpen","xhrOpenThisArg","xhrOpenArgArray","startTimestamp","onreadystatechangeHandler","xhrInfo","originalOnreadystatechange","onreadystatechangeThisArg","onreadystatechangeArgArray","originalSetRequestHeader","setRequestHeaderThisArg","setRequestHeaderArgArray","originalSend","sendThisArg","sendArgArray","sentryXhrData","makeFetchTransport","nativeFetch","pendingBodySize","pendingCount","requestSize","requestOptions","CHROME_PRIORITY","GECKO_PRIORITY","createFrame","lineno","colno","chromeRegexNoFnName","chromeRegex","chromeEvalRegex","chromeStackParserFn","noFnParts","col","subMatch","extractSafariExtensionDetails","chromeStackLineParser","geckoREgex","geckoEvalRegex","gecko","geckoStackLineParser","defaultStackLineParsers","defaultStackParser","isSafariExtension","isSafariWebExtension","MAX_ALLOWED_STRING_LENGTH","_breadcrumbsIntegration","_getConsoleBreadcrumbHandler","_getDomBreadcrumbHandler","_getXhrBreadcrumbHandler","_getFetchBreadcrumbHandler","_getHistoryBreadcrumbHandler","_getSentryBreadcrumbHandler","breadcrumbsIntegration","dom","componentName","_isEvent","status_code","parsedLoc","parsedFrom","parsedTo","DEFAULT_EVENT_TARGET","_browserApiErrorsIntegration","_wrapTimeFunction","_wrapRAF","_wrapXHR","eventTargetOption","_wrapEventTarget","browserApiErrorsIntegration","originalCallback","xhr","wrapOptions","globalObject","wrappedEventHandler","originalEventHandler","_globalHandlersIntegration","_installGlobalOnErrorHandler","globalHandlerLog","_installGlobalOnUnhandledRejectionHandler","globalHandlersIntegration","getOptions","_enhanceEventWithInitialFrame","_getUnhandledRejectionError","_eventFromRejectionWithPrimitive","ev0","ev0s","ev0sf","httpContextIntegration","referrer","DEFAULT_KEY","DEFAULT_LIMIT","_linkedErrorsIntegration","linkedErrorsIntegration","getDefaultIntegrations","applyDefaultOptions","optionsArg","shouldShowBrowserExtensionError","windowWithMaybeExtension","extensionKey","extensionObject","runtimeId","extensionProtocols","isDedicatedExtensionPage","isNWjs","browserOptions","startSessionTracking","DEFAULT_HOOKS","classifyRE","classify","ROOT_COMPONENT_NAME","ANONYMOUS_COMPONENT_NAME","formatComponentName","includeFile","file","generateComponentTrace","tree","currentRecursiveSequence","attachErrorHandler","originalErrorHandler","warnHandler","lifecycleHook","trace","hasConsole","VUE_OP","HOOKS","finishRootSpan","findTrackComponent","trackComponents","formattedName","extractComponentName","compo","createTracingMixins","operation","internalHooks","internalHook","oldSpan","globalWithVue","DEFAULT_CONFIG","_vueIntegration","integrationOptions","_setupIntegration","vueIntegration","vueInit","appWithInstance","init$1","viewportSizes","updateVPStyles","createResizeWatcher","limiter","isKenticoPageBuilder","initVueForKenticoPageBuilder","initlizeSentry","Sentry.init","initVueForLiveSite"],"mappings":"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AAM,IAAM,GAAM,IAAM,GAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAC1F,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,GAAM,GAAM,GAAM,IAAM,IAAM,EAAM,IAAM,IAAM,GAC1F,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,GAAM,GAAM,IAAM,GAAM,IAC1F,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAAM,IAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAC1F,GAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAAM,IAAM,GAAM,IAAM,GAC1F,IAAM,IAAM,GAAM,IAAM,GAAM,IAAM,EAAM,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,EAC1F,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,EAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAC1F,EAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAC1F,IAAM,GAAM,IAAM,IAAM,GAAM,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,GAAM,EAAM,GAAM,IAAM,IAC1F,IAAM,IAAM,GAAM,IAAM,GAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAC1F,IAAM,IAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,EAAM,GAAM,GAAM,GAAM,GAAM,IAAM,GAC1F,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,EAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAC1F,IAAM,EAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,GAAM,EAAM,GAAM,GAAM,IAAM,IAAM,IAC1F,GAAM,GAAM,GAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,GAC1F,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAC5F,EAEI5y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AAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,SAAU,EACjD,CAAC,UAAY,UAAU,EAAG,CAAC,UAAY,UAAU,EACjD,CAAC,UAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,SAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,UAAY,UAAU,EAAG,CAAC,UAAY,SAAU,EACjD,CAAC,UAAY,UAAU,EAAG,CAAC,UAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,SAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,SAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,UAAY,SAAU,EACjD,CAAC,UAAY,UAAU,EAAG,CAAC,UAAY,UAAU,EACjD,CAAC,UAAY,UAAU,EAAG,CAAC,UAAY,UAAU,EACjD,CAAC,UAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,SAAU,EACjD,CAAC,WAAY,SAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,SAAU,EACjD,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EACjD,CAAC,UAAY,UAAU,EAAG,CAAC,UAAY,UAAU,EACjD,CAAC,UAAY,UAAU,EAAG,CAAC,UAAY,SAAU,EACjD,CAAC,UAAY,SAAU,EAAG,CAAC,UAAY,UAAU,EACjD,C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KAAM,QACN,QAAS,MACV,EACD,UAAW,CACT,KAAM,OACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,QACN,QAAS,MACV,EACD,sBAAuB,CACrB,KAAM,OACN,QAAS,kBACV,EACD,kBAAmB,CACjB,KAAM,OACN,QAAS,MACV,EACD,aAAc,CACZ,KAAM,OACN,QAAS,MACV,EACD,MAAO,CACL,KAAM,OACN,QAAS,MACV,EACD,QAAS,CACP,KAAM,QACN,QAAS,MACV,EACD,qBAAsB,CACpB,KAAM,QACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,QACN,QAAS,MACV,EACD,OAAQ,CACN,KAAM,QACN,QAAS,MACV,EACD,kBAAmB,CACjB,KAAM,OACN,QAAS,MACV,EACD,MAAO,CACL,KAAM,OACN,QAAS,MACV,EACD,OAAQ,CACN,KAAM,OACN,QAAS,MACV,EACD,+BAAgC,CAC9B,KAAM,QACN,QAAS,MACV,EACD,UAAW,CACT,KAAM,OACN,QAAS,MACV,EACD,IAAK,CACH,KAAM,OACN,QAAS,MACV,EACD,mBAAoB,CAClB,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,mBAAoB,CAClB,KAAM,OACN,QAAS,MACV,EACD,WAAY,CACV,KAAM,QACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,QACN,QAAS,MACV,EACD,iBAAkB,CAChB,KAAM,QACN,QAAS,MACV,EACD,OAAQ,CACN,KAAM,OACN,QAAS,MACV,EACD,YAAa,CACX,KAAM,OACN,QAAS,MACV,EACD,aAAc,CACZ,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,MACV,EACD,cAAe,CACb,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,MACV,EACD,wBAAyB,CACvB,KAAM,OACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,OACN,QAAS,MACV,EACD,mBAAoB,CAClB,KAAM,OACN,QAAS,MACV,EACD,mBAAoB,CAClB,KAAM,QACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,QACN,QAAS,MACV,EACD,qBAAsB,CACpB,KAAM,QACN,QAAS,MACV,EACD,mBAAoB,CAClB,KAAM,OACN,QAAS,MACV,EACD,kBAAmB,CACjB,KAAM,OACN,QAAS,MACV,EACD,oBAAqB,CACnB,KAAM,QACN,QAAS,MACV,EACD,yBAA0B,CACxB,KAAM,QACN,QAAS,MACV,EACD,cAAe,CACb,KAAM,QACN,QAAS,MACV,EACD,aAAc,CACZ,KAAM,QACN,QAAS,MACV,EACD,WAAY,CACV,KAAM,OACN,QAAS,MACV,EACD,WAAY,CACV,KAAM,OACN,QAAS,MACV,EACD,cAAe,CACb,KAAM,QACN,QAAS,MACV,EACD,YAAa,CACX,KAAM,QACN,QAAS,MACV,EACD,WAAY,CACV,KAAM,QACN,QAAS,MACV,EACD,gBAAiB,CACf,KAAM,OACN,QAAS,MACV,EACD,aAAc,CACZ,KAAM,OACN,QAAS,MACV,EACD,aAAc,CACZ,KAAM,QACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,QACN,QAAS,MACV,EACD,UAAW,CACT,KAAM,OACN,QAAS,MACV,EACD,yBAA0B,CACxB,KAAM,QACN,QAAS,MACV,EACD,yBAA0B,CACxB,KAAM,QACN,QAAS,MACV,EACD,8BAA+B,CAC7B,KAAM,QACN,QAAS,MACV,EACD,oBAAqB,CACnB,KAAM,QACN,QAAS,MACV,EACD,kBAAmB,CACjB,KAAM,QACN,QAAS,MACV,EACD,WAAY,CACV,KAAM,QACN,QAAS,MACV,EACD,gBAAiB,CACf,KAAM,OACN,QAAS,MACV,EACD,oBAAqB,CACnB,KAAM,QACN,QAAS,MACV,EACD,WAAY,CACV,KAAM,QACN,QAAS,MACV,EACD,cAAe,CACb,KAAM,QACN,QAAS,MACV,EACD,yBAA0B,CACxB,KAAM,QACN,QAAS,MACV,EACD,oBAAqB,CACnB,KAAM,QACN,QAAS,MACV,EACD,KAAM,CACJ,KAAM,QACN,QAAS,MACV,EACD,aAAc,CACZ,KAAM,OACN,QAAS,MACV,EACD,oBAAqB,CACnB,KAAM,QACN,QAAS,MACV,EACD,OAAQ,CACN,KAAM,QACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,QACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,QACN,QAAS,MACV,EACD,aAAc,CACZ,KAAM,QACN,QAAS,MACV,EACD,UAAW,CACT,KAAM,QACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,OACN,QAAS,MACV,EACD,kBAAmB,CACjB,KAAM,OACN,QAAS,MACV,EACD,iBAAkB,CAChB,KAAM,QACN,QAAS,MACV,EACD,uBAAwB,CACtB,KAAM,OACN,QAAS,MACV,EACD,WAAY,CACV,KAAM,OACN,QAAS,MACV,EACD,iBAAkB,CAChB,KAAM,OACN,QAAS,MACV,EACD,kBAAmB,CACjB,KAAM,OACN,QAAS,MACV,EACD,uBAAwB,CACtB,KAAM,OACN,QAAS,MACV,EACD,gBAAiB,CACf,KAAM,OACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,OACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,OACN,QAAS,MACV,EACD,aAAc,CACZ,KAAM,OACN,QAAS,MACV,EACD,mBAAoB,CAClB,KAAM,OACN,QAAS,MACV,EACD,oBAAqB,CACnB,KAAM,OACN,QAAS,MACV,EACD,mBAAoB,CAClB,KAAM,QACN,QAAS,MACV,EACD,SAAU,CACR,KAAM,QACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,QACN,QAAS,MACV,EACD,qBAAsB,CACpB,KAAM,QACN,QAAS,MACV,EACD,KAAM,CACJ,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,SAAU,CACR,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,WAAY,CACV,KAAM,OACN,QAAS,MACV,EACD,gBAAiB,CACf,KAAM,OACN,QAAS,MACV,EACD,WAAY,CACV,KAAM,OACN,QAAS,MACV,EACD,WAAY,CACV,KAAM,OACN,QAAS,MACV,EACD,WAAY,CACV,KAAM,OACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,OACN,QAAS,MACV,EACD,YAAa,CACX,KAAM,OACN,QAAS,MACV,EACD,eAAgB,CACd,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,QAAS,CACP,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,SAAU,CACR,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,WAAY,CACV,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,WAAY,CACV,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,WAAY,CACV,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,SAAU,CACR,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,UAAW,CACT,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,OAAQ,CACN,KAAM,OACN,QAAS,MACV,EACD,QAAS,CACP,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,KAAM,CACJ,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,KAAM,CACJ,KAAM,CAAC,MAAM,EACb,QAAS,MACV,EACD,SAAU,CACR,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,MACV,EACD,QAAS,CACP,KAAM,QACN,QAAS,MACV,CACF,EACD,MAAO,CAAC,oBAAqB,oBAAqB,cAAe,gBAAiB,UAAW,6BAA8B,oBAAqB,YAAa,WAAY,gBAAiB,eAAgB,gBAAiB,iBAAkB,mBAAoB,gBAAiB,aAAc,gBAAiB,eAAgB,yBAA0B,wBAAyB,aAAc,kBAAmB,kBAAmB,QAAS,UAAW,YAAa,cAAe,UAAW,SAAU,WAAY,aAAc,UAAW,OAAQ,WAAY,OAAQ,UAAW,iBAAkB,iBAAkB,iBAAkB,iBAAkB,iBAAkB,iBAAkB,oBAAqB,iBAAkB,mBAAoB,iBAAkB,mBAAoB,WAAY,iBAAkB,WAAY,kBAAmB,SAAU,SAAU,mBAAoB,oBAAqB,qBAAsB,gBAAiB,eAAgB,gBAAiB,cAAe,2BAA4B,6BAA8B,yBAA0B,2BAA4B,yBAA0B,2BAA4B,4BAA6B,0BAA2B,aAAc,kBAAmB,qBAAsB,yBAA0B,uBAAwB,kBAAmB,SAAU,MAAO,SAAU,WAAY,YAAa,oBAAqB,aAAc,gBAAiB,kBAAmB,SAAU,SAAU,gBAAiB,YAAY,EAC79C,MAAMhvM,EAAOq7E,EAAM,CACjB,GAAI,CACF,MAAOy3H,EACP,KAAAjhM,CACD,EAAGwpE,EACJ,KAAM,CACJ,IAAKo4H,EACL,WAAYC,CACb,EAAG1zM,EACE2zM,EAAmBnnM,EAAI,QAAQ,EAC/B4mM,EAAc5mM,EAAI,IAAI,EACtBonM,EAAoBpnM,EAAI,EAAK,EAC7BqnM,EAAiBrnM,EAAI,EAAK,EAC1BsnM,EAActnM,EAAI,IAAI,EACtB2mM,EAAY3mM,EAAI,IAAI,EACpBunM,EAAqBvnM,EAAI,IAAI,EAC7BumM,EAAY,CAChB,MAAO,CAAE,CACf,EACUC,EAAe,CACnB,MAAO,CAAE,CACf,EACUgB,EAAYxnM,EAAI,IAAI,EACpBynM,EAAYznM,EAAI,IAAI,EACpB0nM,EAAkB1nM,EAAI,IAAI,EAC1B2nM,EAAiB3nM,EAAI,IAAI,EACzB,CACJ,OAAQ2iM,EACR,aAAAwB,CACN,EAAQkB,GAAU7xM,EAAO,EAAK,EAC1B6yM,GAAYC,EAAeC,EAAWC,CAAY,EAClDe,EAAmB,MAAQpD,EAC3BqC,EAAa,MAAQD,EAAU,MAC/B,MAAMqB,EAAqB,IAAM,CAC/BvB,GAAYC,EAAeC,EAAWC,CAAY,EAClDY,EAAkB,MAAQ,EAChC,EACIzE,EAAa,MAAQ,SAAUx9L,EAAO,CACpC,QAASirH,EAAO,UAAU,OAAQx2H,EAAO,IAAI,MAAMw2H,EAAO,EAAIA,EAAO,EAAI,CAAC,EAAGh7H,EAAO,EAAGA,EAAOg7H,EAAMh7H,IAClGwE,EAAKxE,EAAO,CAAC,EAAI,UAAUA,CAAI,EAEjCiQ,EAAKF,EAAO,GAAGvL,CAAI,CACzB,EACI,OAAO,OAAO+oM,EAAa,GAAI,CAC7B,kBAAmBiF,EACnB,kBAAkBvhB,EAAQhB,EAAS,CACjC8hB,EAAiB,MAAQ9hB,CAC1B,CACP,CAAK,EAGD,MAAMwiB,EAAa,CACjB,GAAGlF,CACT,EAGI,GAFA,OAAOkF,EAAW,aAClBlB,EAAU,MAAQ,IAAIpE,GAASsF,CAAU,EACrClB,EAAU,MAAM,SAAWA,EAAU,MAAM,OAAO,QAAQ,QAAS,CACrEA,EAAU,MAAM,QAAQ,OAASJ,EAAU,MAC3C,MAAMuB,EAAa,CACjB,MAAO,GACP,OAAQvB,EAAU,MAClB,eAAgBx+L,GAAQ,CACtB6+L,EAAY,MAAQ7+L,CACrB,EACD,qBAAsB,EAC9B,EACMxY,GAAOo3M,EAAU,MAAM,OAAO,QAASmB,CAAU,EACjDv4M,GAAOo3M,EAAU,MAAM,eAAe,QAASmB,CAAU,CAC1D,CACDjvL,GAAU,IAAM,CAEV,CAACwuL,EAAe,OAASV,EAAU,QACrCA,EAAU,MAAM,oBAChBU,EAAe,MAAQ,IAGzB,KAAM,CACJ,aAAcU,CACtB,EAAU1C,GAAU7xM,EAAO,EAAK,EACpB4wM,EAAgBsB,IAAiBqC,EAAiBR,EAAmB,MAAOhB,EAAU,MAAOC,EAAa,MAAOl1M,GAAKA,EAAE,OAASA,EAAE,MAAM,GAAG,EAClJi2M,EAAmB,MAAQQ,GACtB3D,EAAc,QAAUgD,EAAkB,QAAUT,EAAU,OAAS,CAACA,EAAU,MAAM,WAC3FzC,IAAa,CACX,OAAQyC,EAAU,MAClB,OAAQJ,EAAU,MAClB,aAAcwB,EACd,cAAA3D,EACA,OAAQoD,EAAU,MAClB,OAAQC,EAAU,MAClB,YAAaE,EAAe,MAC5B,aAAcD,EAAgB,KACxC,CAAS,EAEHN,EAAkB,MAAQ,EAChC,CAAK,EACDznL,GAAQ,SAAUgnL,CAAS,EAG3Bl2L,GAAMm2L,EAAa,IAAM,CACvBtjM,GAAS,IAAM,CACb8iM,IAAoBO,EAAU,KAAK,CAC3C,CAAO,CACP,CAAK,EAGD1zL,GAAU,IAAM,CACTq0L,EAAY,QACjB7B,IAAY,CACV,GAAI6B,EAAY,MAChB,OAAQE,EAAU,MAClB,OAAQC,EAAU,MAClB,aAAcC,EAAgB,MAC9B,YAAaC,EAAe,MAC5B,OAAQhB,EAAU,KACnB,EAAEhE,CAAY,EACft9L,EAAK,SAAUshM,EAAU,KAAK,EACpC,CAAK,EACDzzL,GAAgB,IAAM,CAChByzL,EAAU,OAAS,CAACA,EAAU,MAAM,WACtCA,EAAU,MAAM,QAAQ,GAAM,EAAK,CAE3C,CAAK,EAGD,SAASqB,EAAarV,EAAQ,CAC5B,OAAIgQ,EAAa,QACR+D,IAAcC,EAAWhU,EAAQiU,EAAY,KAAK,GAE3DjU,EAAO,QAAQ,CAACc,EAAOh5K,IAAU,CAC1Bg5K,EAAM,QAAOA,EAAM,MAAQ,CAAA,GAChCA,EAAM,MAAM,UAAYkT,EACxBlT,EAAM,MAAM,iBAAmBh5K,CACvC,CAAO,EACMk4K,EACR,CACD,MAAO,IAAM,CACX,KAAM,CACJ,OAAAA,EACA,MAAAhrL,CACD,EAAG0+L,GAAYC,EAAeC,EAAWC,CAAY,EACtD,OAAOvmL,GAAEgnL,EAAK,CACZ,IAAKK,EACL,MAAOvD,GAAcoD,EAAiB,KAAK,CAC5C,EAAE,CAACx/L,EAAM,iBAAiB,EAAGsY,GAAEinL,EAAY,CAC1C,MAAOjD,IAAatB,EAAa,YAAY,CACrD,EAAS,CAACh7L,EAAM,eAAe,EAAGqgM,EAAarV,CAAM,EAAGhrL,EAAM,aAAa,CAAC,CAAC,EAAGi8L,GAAgBpwM,CAAK,GAAK,CAACysB,GAAE,MAAO,CAC5G,IAAKwnL,EACL,MAAO,oBACf,CAAO,EAAGxnL,GAAE,MAAO,CACX,IAAKunL,EACL,MAAO,oBACR,CAAA,CAAC,EAAG1D,GAAetwM,CAAK,GAAKysB,GAAE,MAAO,CACrC,IAAK0nL,EACL,MAAO,kBACR,CAAA,EAAG9D,GAAgBrwM,CAAK,GAAKysB,GAAE,MAAO,CACrC,IAAKynL,EACL,MAAO,mBACR,CAAA,EAAG//L,EAAM,eAAe,CAAC,CAAC,CACjC,CACG,CACH,EAEMsgM,GAAc,CAClB,KAAM,cACN,MAAO,CACL,IAAK,CACH,KAAM,OACN,QAAS,KACV,EACD,UAAW,CACT,KAAM,OACN,SAAU,EACX,EACD,iBAAkB,CAChB,KAAM,OACN,QAAS,OACT,SAAU,EACX,EACD,KAAM,CACJ,KAAM,QACN,QAAS,OACT,SAAU,EACX,EACD,KAAM,CACJ,KAAM,QACN,QAAS,GACT,SAAU,EACX,EACD,aAAc,CACZ,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,MACV,CACF,EACD,MAAMz0M,EAAOq7E,EAAM,CACjB,GAAI,CACF,MAAAlnE,CACD,EAAGknE,EACAq5H,EAAgB,GACpB,KAAM,CACJ,UAAAvB,CACD,EAAGnzM,EACE20M,EAAanoM,EAAI,IAAI,EACrBooM,EAAepoM,EAAI,cAAc,EACjCqoM,EAAaroM,EAAI,EAAK,EAC5B,SAASsoM,EAAcjiB,EAAQ32L,EAAI8xM,EAAY,CACzC9xM,IAAOy4M,EAAW,QACpBC,EAAa,MAAQ5G,EAExB,CACDvuL,GAAU,IAAM,CACV,CAAC0zL,GAAa,CAACA,EAAU,QAC7BA,EAAU,MAAM,GAAG,cAAe2B,CAAa,EAC/CJ,EAAgB,GACtB,CAAK,EACDhuL,GAAe,IAAM,CACfguL,GAAiB,CAACvB,GAAa,CAACA,EAAU,QAC9CA,EAAU,MAAM,GAAG,cAAe2B,CAAa,EAC/CJ,EAAgB,GACtB,CAAK,EACDrvL,GAAU,IAAM,CACV,CAACsvL,EAAW,OAAS,CAACxB,GAAa,CAACA,EAAU,QAC9C,OAAOnzM,EAAM,iBAAqB,MACpC20M,EAAW,MAAM,iBAAmB30M,EAAM,kBAExCmzM,EAAU,MAAM,WACdyB,EAAa,QAAU,iBACzBA,EAAa,MAAQ,gBAG/B,CAAK,EACDl1L,GAAgB,IAAM,CAChB,CAACyzL,GAAa,CAACA,EAAU,OAC7BA,EAAU,MAAM,IAAI,cAAe2B,CAAa,CACtD,CAAK,EACD,MAAMC,EAAYnxM,EAAS,KAAO,CAChC,SAAUgxM,EAAa,MAAM,QAAQ,qBAAqB,GAAK,EAC/D,UAAWA,EAAa,MAAM,QAAQ,sBAAsB,GAAK,EACjE,OAAQA,EAAa,MAAM,QAAQ,mBAAmB,GAAK,EAC3D,OAAQA,EAAa,MAAM,QAAQ,mBAAmB,GAAK,CAC5D,EAAC,EACFzoL,GAAQ,cAAe4oL,CAAS,EAChC,MAAM5I,EAAS,IAAM,CACnB0I,EAAW,MAAQ,EACzB,EACI,MAAO,IACEpoL,GAAEzsB,EAAM,IAAK,CAClB,MAAOuwM,GAAc,GAAGqE,EAAa,KAAK,EAAE,EAC5C,IAAKD,EACL,0BAA2B,OAAO30M,EAAM,aAAiB,KAAemzM,GAAaA,EAAU,OAASA,EAAU,MAAM,OAAO,KAAOnzM,EAAM,iBAAmBA,EAAM,aACrK,cAAemsM,CAChB,EAAEnsM,EAAM,KAAOysB,GAAE,MAAO,CACvB,MAAO,wBACP,mBAAoB,OAAOzsB,EAAM,MAAS,SAAWA,EAAM,KAAO,MACnE,EAAE,CAACmU,EAAM,SAAWA,EAAM,QAAQ4gM,EAAU,KAAK,EAAG/0M,EAAM,MAAQ,CAAC60M,EAAW,OAASpoL,GAAE,MAAO,CAC/F,MAAO,uBACf,CAAO,CAAC,CAAC,EAAI,CAACtY,EAAM,SAAWA,EAAM,QAAQ4gM,EAAU,KAAK,EAAG/0M,EAAM,MAAQ,CAAC60M,EAAW,OAASpoL,GAAE,MAAO,CACnG,MAAO,uBACR,CAAA,CAAC,CAAC,CAEN,CACH,wqBCpyBA,MAAMzsB,EAAQgzD,EA8CR,CAAE,OAAAmsI,EAAQ,UAAA7T,CAAW,EAAGv4H,GAAY/yD,EAAM,IAAI,EAE9Cg1M,EAAaxoM,EAAG,EAChByoM,EAAS,KAAK,IAAK,EAAG,KAAK,MAAM,KAAK,OAAQ,GAAI,IAAM,GAAK,CAAC,EAC9DC,EAAiB/V,EAAO,MAAM,OAC9BgW,EAAkBD,EAAiB,EACnCE,EAAc5oM,EAAG,EACjB6oM,EAAc7oM,EAAG,EACjB8oM,EAAY9oM,EAAG,EACf+oM,EAAgB/oM,EAAI,EAAI,EACxBgpM,EAAShpM,EAAI,CAAA,CAAE,EAEfipM,EAA2B,IAAM,CACrC,MAAMC,EAAsBL,EAAY,MAAM,CAAC,EAAE,gBACjD,IAAIM,EAAa,EAEbX,EAAW,MAAQ,GAAKA,EAAW,OAAS,OAC9CW,EAAa31M,EAAM,YAAY,GAAG,EAAE,cAElCg1M,EAAW,MAAQ,MAAQA,EAAW,OAAS,OACjDW,EAAa31M,EAAM,YAAY,IAAI,EAAE,cAEnCg1M,EAAW,OAAS,OACtBW,EAAa31M,EAAM,YAAY,IAAI,EAAE,cAEvCs1M,EAAU,MAAQI,EAAsBR,EAAiBS,EAAaR,EACtES,GACF,EAEMA,EAAe,IAAM,SACzB,KAAM,CAAC97H,EAAU7/D,CAAI,EAAIu7L,EAAO,MAChCD,EAAc,MAAQD,EAAU,MAAQF,EAAY,MAAM,CAAC,EAAE,YAE7D,MAAM9+H,EAASi/H,EAAc,MAAQ,SAAW,OAChDtzM,EAAA63E,EAAS,YAAT,MAAA73E,EAAqBq0E,GAAQ,yBAC7B5kE,EAAAuI,EAAK,YAAL,MAAAvI,EAAiB4kE,GAAQ,uBAC3B,EAEMu/H,EAAU,IAAM,CACpBT,EAAY,MAAQ,SAAS,iBAAiB,YAAYH,CAAM,kBAAkB,EAClFI,EAAY,MAAQ,SAAS,iBAAiB,YAAYJ,CAAM,gBAAgB,EAChFO,EAAO,MAAQ,CAAC,SAAS,cAAc,YAAYP,CAAM,sBAAsB,EAAG,SAAS,cAAc,YAAYA,CAAM,sBAAsB,CAAC,EAClJD,EAAW,MAAQ,OAAO,WAC1B,WAAWS,EAA0B,CAAC,CACxC,EAEA,OAAAh2L,GAAU,IAAM,CACdo2L,IACA,OAAO,iBAAiB,SAAU,IAAM,CACtCb,EAAW,MAAQ,OAAO,WAC1B,IAAIl7L,EAAU,WAAW,IAAM,CAC7B27L,IACA,aAAa37L,CAAO,CACrB,EAAE,GAAG,CACV,CAAG,CACH,CAAC,EAEDuM,GAAY,IAAM,CAChB,OAAO,oBAAoB,SAAUovL,CAAwB,CAC/D,CAAC,+gDC/GD,MAAMz1M,EAAQgzD,EAYR,CAAE,gBAAA8iJ,EAAiB,QAAAj8I,EAAS,eAAAk8I,EAAgB,eAAAC,EAAgB,iBAAAC,EAAkB,cAAAC,CAAa,EAAKnjJ,GAAY/yD,EAAM,IAAI,EACtHm2M,EAAiB3pM,EAAI,OAAO,OAAO,EAEnC,CAAE,KAAAu4K,EAAM,KAAA0D,GAASr6F,KACjBm7C,EAAW3lI,EAAS,IAAMmhL,EAAK,OAAS0D,EAAK,KAAK,EAElD2tB,EAAaxyM,EAAS,IAAM,CAChC,IAAIwyM,EAAa,GAEjB,OAAI7sE,EAAS,QACP2sE,EAAc,QAAOE,EAAa,IAClCD,EAAe,MAAQ,IACzBC,EAAa,KAIVA,CACT,CAAC,EAED,OAAA32L,GAAU,IAAM,CACd,OAAO,iBAAiB,SAAU,IAAO02L,EAAe,MAAQ,OAAO,OAAQ,CACjF,CAAC,EAED9vL,GAAY,IAAM,CAChB,OAAO,oBAAoB,SAAU,IAAO8vL,EAAe,MAAQ,OAAO,OAAQ,CACpF,CAAC,+mBCxBD,MAAM92B,EAAQ7yK,EAAI,IAAI,EAChB86H,EAAS96H,EAAI,EAAK,EAClB6pM,EAAc,IAAM,CACxB/uE,EAAO,MAAQ,CAACA,EAAO,KACzB,EAEMgvE,EAAsB1yM,EAAS,KAC5B,CACL,EAAG,CACD,cAAe,IACf,aAAc,EACf,EACD,IAAK,CACH,cAAe,IACf,aAAc,EACf,CACL,EACC,q6EC3BD,MAAM5D,EAAQgzD,EAMd,GAAI,CAAE,KAAA+xH,EAAM,KAAA0D,EAAM,KAAAp6F,CAAM,EAAGD,GAAgB,EAE3C,MAAMmoH,EAAe/pM,EAAI,EAAK,EACxBgqM,EAAShqM,EAAI,KAAK,MAAM,KAAK,SAAW,SAAS,KAAK,IAAK,CAAA,CAAC,CAAC,EAC7DiqM,EAAYjqM,EAAI,WAAWgqM,EAAO,KAAK,EAAE,EACzCE,EAAWlqM,EAAI,UAAUgqM,EAAO,KAAK,EAAE,EACvCG,EAAwB/yM,EAAS,IACjCmhL,EACK,CACL,GAAI0xB,EAAU,MACd,KAAM,SACN,gBAAiBC,EAAS,MAC1B,gBAAiBH,EAAa,MAAQ,OAAS,OACrD,EAES,EACR,EACKK,EAAuBhzM,EAAS,IAChCmhL,EACK,CACL,GAAI2xB,EAAS,MACb,KAAM,SACN,kBAAmBD,EAAU,KACnC,EAES,EACR,EAED,IAAII,EACJ,OAAI72M,EAAM,KAAK,QACb62M,EAAY,CACV,MAAO72M,EAAM,KAAK,MAAM,MACxB,KAAMA,EAAM,KAAK,MAAM,KACvB,KAAMA,EAAM,KAAK,MAAM,KACvB,aAAc,CACZ,MAAOA,EAAM,KAAK,MAAM,aAAa,MACrC,IAAKA,EAAM,KAAK,MAAM,aAAa,IACnC,UAAWA,EAAM,KAAK,MAAM,aAAa,UACzC,OAAQA,EAAM,KAAK,MAAM,aAAa,MACvC,EACD,OAAQ,CAAC,GAAGA,EAAM,KAAK,MAAM,MAAM,CACvC,kjGCnDA,MAAMA,EAAQgzD,EAYR,CAAE,UAAA8jJ,CAAS,EAAK/jJ,GAAY/yD,EAAM,IAAI,iiBCX5C,MAAM6R,EAAOsiD,wpBCIb,MAAMtiD,EAAOsiD,EAQPw+E,EAAQxrI,GAAS,CACrB,SARY6rD,EAQI,QAClB,CAAC,EAEK+jJ,EAAenzM,EAAS,KAAO,CACnC,SAAU+uI,EAAM,SAAS,KAAM,CACjC,EAAE,EAEIovC,EAAUn+K,EAAS,IAAM,OAAA,QAAA3B,EAAA0wI,EAAM,WAAN,YAAA1wI,EAAgB,QAAS,EAAC,EAEnD,CAAE,OAAQuoL,EAAa,UAAAntG,CAAW,EAAGusG,IAAgC,EACrEv+C,EAAoB3jD,GAAoB,EAE9C,SAAS2iG,GAAS,CACXtI,EAAQ,OACbyI,EAAYusB,EAAa,MAAO,CAC9B,UAAW,IAAM,CACfllM,EAAK,WAAY,MAAM,CACxB,EACD,QAAS,IAAM,CACbw5H,EAAkB,YAAY,sGAAsG,CACrI,CACL,CAAG,CACH,osCC/BA,MAAMrrI,EAAQgzD,EAWRnhD,EAAOsiD,EAEPw+E,EAAQxrI,GAAS,CACrB,SAAUnH,EAAM,SAChB,SAAU,EACZ,CAAC,EAEK+hL,EAAUn+K,EAAS,aAAM,QAAA3B,EAAA0wI,EAAM,WAAN,YAAA1wI,EAAgB,QAAS,KAAKyP,EAAAihI,EAAM,WAAN,YAAAjhI,EAAgB,QAAS,EAAC,EAEjF,CAAE,OAAQ84K,EAAa,UAAAntG,CAAW,EAAGssG,GAAgB,EACrDqtB,EAAgBxqM,EAAI,EAAK,EACzByqM,EAAczqM,EAAI,EAAK,EACvB6+H,EAAoB3jD,GAAoB,EAE9C,SAAS2iG,GAAS,CACXtI,EAAQ,OACbyI,EACE,CACE,SAAU73C,EAAM,SAAS,KAAM,EAC/B,SAAUA,EAAM,SAChB,gBAAiB3yI,EAAM,eACxB,EACD,CACE,UAAW,IAAM,CACfg3M,EAAc,MAAQ,GACtB,OAAO,SAAWh3M,EAAM,eACzB,EACD,QAAUgkB,GAAU,CAClB,MAAMkzL,EAAkB,6EACxB,GAAIlzL,EAAM,SAAS,SAAW,IAC5BizL,EAAY,MAAQ,WACXjzL,EAAM,SAAS,SAAW,IAAK,CACxC,MAAMmzL,EAAanzL,EAAM,SAAS,QAAQ,aAAa,GAAK,EAC5D,GAAImzL,EAAY,CACd,MAAMC,EAAe,SAASD,CAAU,EAAI,IAC5C,WAAW,IAAM,CACf9sB,GACD,EAAE+sB,CAAY,CAC3B,MACY/rE,EAAkB,YAAY6rE,CAAe,CAEzD,MACU7rE,EAAkB,YAAY6rE,CAAe,CAEhD,CACF,CACL,CACA,s+CC3DA,MAAMl3M,EAAQgzD,EAeRnhD,EAAOsiD,EAEPiW,EAAW59D,EAAI,EAAE,EAEjB6qM,EAAczzM,EAAS,IAAM,CAAC,CAACwmE,EAAS,KAAK,EAE7C,CAAE,OAAQktI,EAAqB,UAAAj6H,CAAW,EAAGwsG,IAAwB,EACrE0tB,EAAe/qM,EAAI,EAAK,EACxB6+H,EAAoB3jD,GAAoB,EAE9C,SAAS2iG,GAAS,CACXgtB,EAAY,OAEjBC,EACE,CACE,OAAQt3M,EAAM,OACd,MAAOA,EAAM,MACb,SAAUoqE,EAAS,KACpB,EACD,CACE,UAAY71D,GAAS,CACnB82H,EAAkB,cAAc,yEAAyE,EACzGx5H,EAAK,WAAY,QAAS0C,EAAK,QAAQ,CACxC,EACD,QAAUyP,GAAU,CACdA,EAAM,SAAS,SAAW,IAC5BuzL,EAAa,MAAQ,GAErBlsE,EAAkB,YAAY,sFAAsF,CAEvH,CACF,CACL,CACA,krCC/CMmsE,GAAa,QACbC,GAAc,SACdC,IAAY,OACZC,IAAa,gUAEnB,MAAM33M,EAAQgzD,EA4BRo2H,EAAS58K,EAAI,IAAI,EACjB49K,EAAO59K,EAAI,IAAI,EACfk+H,EAAcl+H,EAAIxM,EAAM,IAAI,EAE5B43M,EAAuB,IAAM,CACjC9nM,GAAS,IAAM,OAAA,OAAA7N,EAAAmoL,EAAK,MAAM,cAAc,yBAAyB,IAAlD,YAAAnoL,EAAqD,QAAO,CAC7E,EACAwd,GAAUm4L,CAAoB,EAC9B36L,GAAMytH,EAAaktE,CAAoB,EAEvC,MAAMC,EAAWrrM,EAAI,IAAI,EAEnBsrM,EAAa,CAACC,EAAaC,IAAc,CAC7CttE,EAAY,MAAQqtE,EACpBF,EAAS,MAAQG,GAAa,KAE1BD,IAAgBP,IAAY,QAAQ,aAAa,KAAM,KAAM5pH,EAAK,EAClEmqH,IAAgBN,IAAa,QAAQ,aAAa,KAAM,KAAM,GAAG7pH,EAAK,SAAS6pH,EAAW,EAAE,EAEhG3nM,GAAS,IAAMs5K,EAAO,MAAM,gBAAgB,SAAS,CAAE,IAAK,EAAG,SAAU,QAAQ,CAAE,CAAC,CACtF,06CCzDA,MAAMv3K,EAAOsiD,EACPn0D,EAAQgzD,EAeRpkD,EAAShL,EAAS,CACtB,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU,CACd2U,EAAK,oBAAqB3U,CAAK,CAChC,CACH,CAAC,EAEKmiL,EAAQ7yK,EAAI,IAAI,EAChB86H,EAAS1jI,EAAS,IAAM5D,EAAM,MAAM,EACpCq2M,EAAc,IAAM,CACxBxkM,EAAK,QAAQ,CACf,EAEMwlM,EAAczzM,EAAS,IACpB,OAAO,QAAQgL,EAAO,KAAK,EAAE,MAAM,CAAC,CAAC/S,EAAKqB,CAAK,IAChDrB,IAAQ,kBACRA,IAAQ,mBAA2B,GAChC,OAAOqB,CAAK,EAAE,KAAI,EAAG,MAC7B,CACF,EAEKmtL,EAAS,IAAM,CACnBx4K,EAAK,SAAUjD,EAAO,KAAK,CAC7B,4iCC1CO,SAASqpM,IAA6Bj0M,EAAS,CACpD,OAAO89E,GAAY,CACjB,GAAI99E,GAAW,CAAA,EACf,WAAauQ,GAASu6D,GAAY,KAAK,gBAAiBv6D,CAAI,CAChE,CAAG,CACH,iiBCGA,MAAMvU,EAAQgzD,EAQR6jJ,EAAY1vM,GAAS,CACzB,aAAc,GACd,eAAgB,GAChB,iBAAkB,EACpB,CAAC,EAEK+wM,EAAY1rM,EAAI,EAAK,EACrB6wE,EAAY7wE,EAAI,EAAK,EAErB6pM,EAAc,IAAM,CACxB6B,EAAU,MAAQ,CAACA,EAAU,KAC/B,EAEMj8D,EAAY/D,GAChB,CACE,aAAc,CACZ,SAAU5kG,GAAQ,YAAY,iCAAkCinG,EAAQ,EACxE,MAAOjnG,GAAQ,YAAY,sCAAuC4mG,EAAK,CACxE,CACF,EACD28D,CACF,EAEMxrE,EAAoB3jD,GAAoB,EAExCywH,EAA4BF,IAA4B,EAE9D,eAAe5tB,GAAS,CAEtB,GADAhtG,EAAU,MAAQ,GACd,MAAM4+D,EAAU,MAAM,YAAa,CACrC,IAAI1nI,EAAO,CAAE,GAAGsiM,GAChBsB,EAA0B,OAAO5jM,EAAM,CACrC,UAAWqsK,EACX,QAASC,EACT,UAAW,IAAM,CACfw1B,IACAh5H,EAAU,MAAQ,EACnB,CACP,CAAK,CACF,CACH,CAEA,SAASujG,GAAoB,CAC3Bi2B,EAAU,aAAe,GACzB56D,EAAU,MAAM,SAChB5Q,EAAkB,cAAc,+CAA+C,CACjF,CAEA,SAASw1C,GAAkB,CACzBx1C,EAAkB,YAAY,gDAAgD,CAChF,yrCCjEA,MAAMrrI,EAAQgzD,EAORs0E,EAAS96H,EAAI,EAAK,EAClB6pM,EAAc,IAAM,CACxB/uE,EAAO,MAAQ,CAACA,EAAO,KACzB,EACMuvE,EAAY1vM,GAAS,CACzB,QAAS,UACT,QAASnH,EAAM,SAAS,UACxB,KAAMA,EAAM,SAAS,SACrB,QAASA,EAAM,SAAS,QACxB,OAAQA,EAAM,SAAS,OACvB,UAAWA,EAAM,SAAS,UAC1B,aAAc,YAAcA,EAAM,SAAS,aAAe,cAC1D,YAAa,EACf,CAAC,quBCpBD,MAAMA,EAAQgzD,EAOR,CAAE,UAAAolJ,CAAS,EAAKrlJ,GAAY/yD,EAAM,IAAI,quCCatCgjL,GAAW,gIAdjB,MAAMhjL,EAAQgzD,EAYR,CAAE,KAAA1tD,EAAM,MAAAq0D,EAAO,MAAAC,EAAO,SAAAiB,EAAU,YAAAD,EAAa,WAAAD,EAAY,QAAAD,GAAY3H,GAAY/yD,EAAM,IAAI,EAG3F,CAAE,KAAA65E,EAAM,WAAAoU,EAAY,QAASy8C,CAAa,EAAG38C,GAAiBn0B,EAAOopH,EAAQ,EAE7EG,EAAW32K,EAAI,IAAI,quFCrBzB,MAAMxM,EAAQgzD,EAYR,CAAE,QAAA6G,EAAS,gBAAAw+I,CAAiB,EAAGtlJ,GAAY/yD,EAAM,IAAI,EAErDs4M,EAAS9rM,EAAI,IAAI,EAEvB,OAAAiT,GAAU,IAAM,CACd,OAAO,iBACL,UACA,SAAU4K,EAAG,CACX,IAAI4zB,EAAU5zB,EAAE,KAChBiuL,EAAO,MAAM,MAAM,OAASr6J,EAAU,IAEvC,EACD,EACJ,CACA,CAAC,4oFCpBD,MAAMj+C,EAAQgzD,EA4FR,CAAE,KAAA+xH,CAAI,EAAK32F,KAEXmqH,EAAqB30M,EAAS,IAAM,OACxC,OAAO3B,EAAA,IAAI,KAAKjC,EAAM,SAAS,IAAxB,YAAAiC,EAA2B,mBAAmB,UAAU,UAAY,QAAS,CAAE,UAAW,MAAQ,EAC3G,CAAC,EAEKy6I,EAAsB94I,EAAS,IAAM5D,EAAM,iBAAmBA,EAAM,iBAAmBmuI,GAAiB,OAAO,EAErH,SAASqqE,GAAQ,CACf,OAAO,MAAK,CACd,CAEA,OAAAhpE,IAAe,CACb,YAAaxvI,EAAM,YACnB,WAAYA,EAAM,WAClB,IAAKA,EAAM,cACX,cAAeA,EAAM,mBACrB,SAAUA,EAAM,KAClB,CAAC,46CCrHD,MAAMA,EAAQgzD,EAQRs0E,EAAS96H,EAAI,EAAK,EAClB6pM,EAAc,IAAM,CACxB/uE,EAAO,MAAQ,CAACA,EAAO,KACzB,o9BCZA,MAAMtnI,EAAQgzD,EAOd,IAAI6jJ,EAAY,CACd,UAAW72M,EAAM,OAAO,UACxB,SAAUA,EAAM,OAAO,SACvB,KAAMA,EAAM,OAAO,KACnB,QAASA,EAAM,OAAO,QACtB,YAAaA,EAAM,OAAO,WAC5B,i4BCZA,MAAMA,EAAQgzD,EAYR,CAAE,OAAAylJ,CAAM,EAAK1lJ,GAAY/yD,EAAM,IAAI,opDCMnCgjL,IAAW,gIAdjB,MAAMhjL,EAAQgzD,EAYR,CAAE,MAAA4G,CAAK,EAAK7G,GAAY/yD,EAAM,IAAI,EAGlC,CAAE,KAAA65E,EAAM,WAAAoU,EAAY,QAASy8C,CAAa,EAAG38C,GAAiBn0B,EAAOopH,GAAQ,EAE7EG,EAAW32K,EAAI,IAAI,0rCCvBzB,MAAMxM,EAAQgzD,EA2BR0lJ,EAAa90M,EAAS,IACnB5D,EAAM,WAAa,aAAe,IAAQ,GAClD,EAEK24M,EAAuB/0M,EAAS,IAAM,CAC1C,MAAMg1M,EAAiBF,EAAW,MAAQ14M,EAAM,kBAChD,MAAO,GAAG,KAAK,MAAO44M,EAAiBF,EAAW,MAAS,GAAG,CAAC,GACjE,CAAC,25BClCD,MAAM14M,EAAQgzD,EAOR6lJ,EAAYj1M,EAAS,IAAM,CAC/B,CACE,GAAI,EACJ,eAAgB,UAChB,aAAc,UACd,IAAK,WACL,SAAU,YACV,UAAW5D,EAAM,cAAgB,CAClC,EACD,CACE,GAAI,EACJ,eAAgB,SAChB,aAAc,SACd,IAAK,aACL,SAAU,UACV,UAAWA,EAAM,cAAgB,GAClC,EACD,CACE,GAAI,EACJ,eAAgB,OAChB,aAAc,OACd,IAAK,aACL,SAAU,UACV,UAAWA,EAAM,cAAgB,GAClC,EACD,CACE,GAAI,EACJ,eAAgB,WAChB,aAAc,WACd,IAAK,aACL,SAAU,UACV,UAAWA,EAAM,cAAgB,GAClC,EACD,CACE,GAAI,EACJ,eAAgB,UAChB,aAAc,UACd,IAAK,aACL,SAAU,UACV,UAAWA,EAAM,cAAgB,GAClC,EACD,CACE,GAAI,EACJ,eAAgB,aAChB,aAAc,aACd,IAAK,YACL,SAAU,UACV,UAAWA,EAAM,cAAgB,GAClC,CACH,CAAC,qnFCjDD,MAAMA,EAAQgzD,EAWR6lJ,EAAYj1M,EAAS,IAAM,CAC/B,CACE,GAAI,EACJ,eAAgB,UAChB,aAAc,SACf,EACD,CACE,GAAI,EACJ,eAAgB,SAChB,aAAc,QACf,EACD,CACE,GAAI,EACJ,eAAgB,OAChB,aAAc,MACf,EACD,CACE,GAAI,EACJ,eAAgB,WAChB,aAAc,UACf,EACD,CACE,GAAI,EACJ,eAAgB,UAChB,aAAc,SACf,EACD,CACE,GAAI,EACJ,eAAgB,aAChB,aAAc,YACf,CACH,CAAC,EAEK,CAAE,aAAAk1M,EAAc,eAAAC,EAAgB,WAAAC,EAAY,aAAAC,EAAc,qBAAAC,EAAsB,iBAAAC,EAAkB,sBAAAC,EAAuB,yBAAAC,CAA0B,EACvJtmJ,GAAY/yD,EAAM,IAAI,EAElBsnI,EAAS96H,EAAI,EAAK,EAClB,CAAE,KAAAu4K,CAAI,EAAK32F,KAEjB,OAAAnxE,GAAM8nK,EAAM,IAAOz9C,EAAO,MAAQ,EAAM,60ECtDxC,MAAMtnI,EAAQgzD,EAYR,CACJ,SAAAy4H,EACA,aAAAL,EACA,YAAAl+C,EACA,mBAAAosE,EAAqB9sM,EAAI,EAAK,EAC9B,WAAA+sM,EAAa/sM,EAAI,EAAK,EACtB,SAAAgtM,EAAWhtM,EAAI,EAAK,EACpB,YAAAitM,EAAcjtM,EAAI,EAAK,CACzB,EAAIumD,GAAY/yD,EAAM,IAAI,onCCjB1B,MAAMA,EAAQgzD,EAyBRnhD,EAAOsiD,EAEPulJ,EAAW91M,EAAS,CACxB,KAAM,CACJ,OAAO5D,EAAM,UAAY,CAC1B,EACD,IAAI25M,EAAa,CACf9nM,EAAK,kBAAmB8nM,CAAW,CACpC,CACH,CAAC,EACKvuE,EAAuB5oD,GAAuB,EAE9CugG,EAAWn/K,EAAS,IAAMwnI,EAAqB,UAAU,KAAK,EAC9DwuE,EAAkBh2M,EAAS,IAAM5D,EAAM,SAAS,IAAK65M,GAAQA,EAAI,IAAI,EAAE,KAAK,GAAG,CAAC,EAEhFxuE,EAAoB3jD,GAAoB,EAE9C,SAASI,EAAcxF,EAAM,CAC3B,IAAI4qD,EAAc5qD,EAAK,MAAM,KAAMljF,GAASA,EAAK,IAAI,YAAcY,EAAM,SAAS,EAAE,IAAI,YACxFqrI,EAAkB,cAAc,GAAG6B,CAAW,UAAW,CAAE,SAAU,YAAa,QAAS1/C,EAAM,CAAA,EACjG37E,EAAK,mBAAoB,CAAE,IAAK7R,EAAM,UAAW,IAAK05M,EAAS,KAAK,CAAE,CACxE,CAEA,SAAS3xH,GAAc,CACrBsjD,EAAkB,YAAY,4FAA4F,CAC5H,CAEA,SAASyuE,GAAY,CACnB,MAAMlgJ,EAAQ,CAAC,CAAE,UAAW55D,EAAM,UAAW,SAAU05M,EAAS,MAAO,SAAUE,EAAgB,KAAO,CAAA,EACxGxuE,EAAqB,OAAOxxE,EAAO,CAAE,UAAWkuB,EAAe,QAASC,CAAW,CAAE,CACvF,6aChEagyH,GAAc,CACzB,MAAO,QACP,MAAO,OACT,k4BCWA,MAAM/5M,EAAQgzD,EA2BRnhD,EAAOsiD,EAEPswI,EAAYj4L,EAAI,CAAC,EAEvB,SAASwtM,EAASnnB,EAAQ,CACxB4R,EAAU,MAAQ5R,EAAO,SAC3B,CAEA,MAAMonB,EAAsBr2M,EAAS,IAC/B5D,EAAM,MAAMykM,EAAU,KAAK,EAAE,OAASsV,GAAY,MAC7C/5M,EAAM,MAAMykM,EAAU,KAAK,EAAE,SAG/BzkM,EAAM,MAAMykM,EAAU,KAAK,EAAE,eACrC,EAEKyV,EAAa1tM,EAAI,IAAI,EACrBwsL,EAAexsL,EAAI,IAAI,EAEvB2tM,EAAiBtnB,GAAYqnB,EAAW,MAAQrnB,EAChDunB,EAAmBvnB,GAAYmG,EAAa,MAAQnG,EAEpDwnB,EAAa7tM,EAAI,IAAI,EAErBy6L,EAAY,IAAM,OAAA,OAAAhlM,EAAAi4M,EAAW,QAAX,YAAAj4M,EAAkB,aACpC8kM,EAAY,IAAM,OAAA,OAAA9kM,EAAAi4M,EAAW,QAAX,YAAAj4M,EAAkB,aAEpCq4M,EAAiBnH,GAAc,CAC/BA,EAAU,QAAU,OACxBA,EAAU,MAAM,QAAQ,GAAM,EAAK,EACnCA,EAAU,MAAQ,KACpB,EAEMoH,EAAatvB,GAAU,CAE3B,MAAMuvB,EAAe,SAAS,cAAc,gBAAgB,GACxDvvB,GAAA,YAAAA,EAAO,aAAc,EAAGuvB,EAAa,MAAM,SAAW,GAAGvvB,EAAM,WAAW,KACzEA,EAAM,MAAM,MAAQ,MAC3B,EAEA,OAAAhuK,GACE,IAAMjd,EAAM,SACXzE,GAAQ,CACHA,IACJ++M,EAAcJ,CAAU,EACxBI,EAActhB,CAAY,EAC3B,CACH,soHC3EA,MAAMh5L,EAAQgzD,EAOR,CAAE,KAAA+xH,CAAI,EAAK32F,KAEXqsH,EAAejuM,EAAI,IAAI,EACvBwsL,EAAexsL,EAAI,IAAI,EAEvBkuM,EAAmB7nB,GAAY4nB,EAAa,MAAQ5nB,EACpDunB,EAAmBvnB,GAAYmG,EAAa,MAAQnG,EAEpDynB,EAAiBnH,GAAc,CAC/BA,EAAU,QAAU,OACxBA,EAAU,MAAM,QAAQ,GAAM,EAAK,EACnCA,EAAU,MAAQ,KACpB,EAEA,OAAAl2L,GAAM8nK,EAAOxpL,GAAQ,CACfA,IACJ++M,EAAcG,CAAY,EAC1BH,EAActhB,CAAY,EAC5B,CAAC,u2DCjCD,MAAMh5L,EAAQgzD,EAyCR2nJ,EAAY/2M,EAAS,IAAM5D,EAAM,QAAU,MAAQ,OAAOA,EAAM,MAAU,GAAW,EAErF46M,EAAiBh3M,EAAS,IAAM,OAAO5D,EAAM,OAAU,UAAY,CAAC,MAAM,OAAO,WAAWA,EAAM,KAAK,CAAC,CAAC,EACzG66M,EAAgBj3M,EAAS,IAAOg3M,EAAe,MAAQ,OAAO,WAAW56M,EAAM,KAAK,EAAI,GAAI,EAC5F86M,EAAel3M,EAAS,IAAM5D,EAAM,MAAQ46M,EAAe,KAAK,EAChEG,EAAan3M,EAAS,IAAO5D,EAAM,KAAO0wI,GAA6B1wI,EAAM,IAAI,EAAE,OAAS,IAAK,EACjGg7M,EAAgBp3M,EAAS,IAAMm3M,EAAW,OAASA,EAAW,QAAU/6M,EAAM,aAAa,EAC3Fi7M,EAAcr3M,EAAS,IAAOo3M,EAAc,MAAQtqE,GAA6B1wI,EAAM,IAAI,EAAE,WAAaA,EAAM,IAAK,EACrHk7M,EAAyBt3M,EAAS,IACtCo3M,EAAc,MAAQH,EAAc,MAAQnqE,GAA6B1wI,EAAM,IAAI,EAAE,gBAAkB66M,EAAc,KACvH,EAEMM,EAAev3M,EAAS,IAAM,CAClC,GAAI,CAACk3M,EAAa,MAAO,OAAO96M,EAAM,MAAM,WAG5C,GACEi7M,EAAY,QAAUxqE,GAAkB,YACxCwqE,EAAY,QAAUxqE,GAAkB,aACxCwqE,EAAY,QAAUxqE,GAAkB,KACxC,CACA,IAAI2qE,EAAK,IAAI,KAAK,aAAa,QAAS,CAAE,sBAAuB,EAAG,sBAAuB,CAAC,CAAE,EAAE,OAAOF,EAAuB,KAAK,EACnI,GAAID,EAAY,QAAUxqE,GAAkB,WAC1C,OAAOzwI,EAAM,cAAgB,OAAS,GAAGo7M,CAAE,cAAgBp7M,EAAM,cAAgB,SAAW,GAAGo7M,CAAE,MAAQ,GAAGA,CAAE,SACzG,GAAIH,EAAY,QAAUxqE,GAAkB,YACjD,OAAOzwI,EAAM,cAAgB,OAAS,GAAGo7M,CAAE,gBAAkBp7M,EAAM,cAAgB,SAAW,GAAGo7M,CAAE,KAAO,GAAGA,CAAE,QAC1G,GAAIH,EAAY,QAAUxqE,GAAkB,KACjD,MAAO,GAAG2qE,CAAE,GAEf,CAED,OAAO,IAAI,KAAK,aAAa,QAAS,CACpC,MAAO,OACP,KAAM1qE,GAA6BuqE,EAAY,KAAK,EAAE,SACtD,YAAaj7M,EAAM,YACnB,sBAAuB,EACvB,sBAAuB,CACxB,CAAA,EAAE,OAAOk7M,EAAuB,KAAK,CACxC,CAAC,EAEKG,EAAgB,CACpB,EAAG,yFACH,GAAI,wFACJ,GAAI,wFACJ,EAAG,6GACH,EAAG,qHACH,GAAI,qBACN,EAEMC,EAAiB13M,EAAS,IACvB5D,EAAM,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,EAAE,YAAa,IAAK,cAC1D,EACKu7M,EAAoB33M,EAAS,IAAM,CACvC,GAAI,OAAO5D,EAAM,OAAU,SAAU,CACnC,MAAMw7M,EAAYx7M,EAAM,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,cAE5C,GADgB,CAAC,IAAK,KAAM,KAAM,IAAK,IAAK,IAAI,EACpC,SAASw7M,CAAS,EAC5B,OAAOA,CAEV,CACD,OAAO,IACT,CAAC,g0BCrGD,MAAMx7M,EAAQgzD,EAmBRyoJ,EAAS73M,EAAS,IAAM,CAG5B,GAAI,CAFU,MAAM,QAAQ5D,EAAM,MAAM,CAAC,CAAC,EAGxC,OAAOA,EAAM,MAAM,IAAK07M,IAAU,CAAE,GAAGA,EAAM,MAAOA,EAAK,OAAS,EAAE,EAAG,EAGzE,IAAIC,EAAY,CAAA,EAChB,QAASx/M,EAAI,EAAGA,EAAI6D,EAAM,MAAM,OAAQ7D,IAAK,CAC3C,IAAIy/M,EAAY57M,EAAM,MAAM7D,CAAC,EAC7B,GAAI,CAAC,MAAM,QAAQy/M,CAAS,EAC1B,MAAM,IAAI,MAAM,yDAAyD,EAE3E,QAASv0L,EAAI,EAAGA,EAAIu0L,EAAU,OAAQv0L,IACpCs0L,EAAU,KAAK,CACb,GAAGC,EAAUv0L,CAAC,EACd,MAAOu0L,EAAUv0L,CAAC,EAAE,OAAS,GAC7B,cAAelrB,EAAI6D,EAAM,MAAM,OAAS,GAAKqnB,IAAMu0L,EAAU,OAAS,CAC9E,CAAO,CAEJ,CACD,OAAOD,CACT,CAAC,EAEK,CAAE,KAAA52B,CAAI,EAAK32F,2kCC5CjB,MAAMpuF,EAAQgzD,EAwBRnhD,EAAOsiD,EAEP0nJ,EAAmBj4M,EAAS,CAChC,IAAK,IAAM5D,EAAM,gBACjB,IAAMzE,GAAQ,CACZsW,EAAK,yBAA0BtW,CAAG,EAClCsW,EAAK,QAAQ,CACd,CACH,CAAC,EAEKiqM,EAAgBl4M,EAAS,IAAM5D,EAAM,OAAO,KAAMzE,GAAQA,EAAI,KAAOyE,EAAM,eAAe,CAAC,EAE3FiQ,EAAK,KAAO,KAAK,OAAQ,EAAC,SAAS,EAAE,EAAE,MAAM,CAAC,EAE9C8rM,EAASn4M,EAAS,IAAM5D,EAAM,OAAS,SAAS,EAChDg8M,EAAWp4M,EAAS,IAAM5D,EAAM,OAAS,QAAQ,EAEjDi8M,EAAazvM,EAAIxM,EAAM,UAAU,EACvC,OAAAid,GAAMg/L,EAAa1gN,GAAQsW,EAAK,oBAAqBtW,CAAG,CAAC,EACzD0hB,GACE,IAAMjd,EAAM,WACXzE,GAAS0gN,EAAW,MAAQ1gN,CAC/B,y9DC9CA,MAAMyE,EAAQgzD,EAWRnhD,EAAOsiD,EAEPonE,EAAWv7H,EAAM,QAAQ,IAAK+uC,GAAW,OAC7C,IAAImtK,EAAkB1vM,GAAIvK,EAAA8sC,EAAO,OAAO,KAAM7xC,GAAUA,EAAM,KAAK,SAAS8C,EAAM,SAAS,CAAC,IAAlE,YAAAiC,EAAqE,EAAE,EACjG,GAAIi6M,EAAgB,QAAU,OAC5B,MAAM,IAAI,MAAM,kCAAkCl8M,EAAM,SAAS,EAAE,EAErE,IAAI87M,EAAgBl4M,EAAS,IAAMmrC,EAAO,OAAO,KAAMxzC,GAAQA,EAAI,KAAO2gN,EAAgB,KAAK,CAAC,EAC5FC,EAAoBv4M,EAAS,IAAMk4M,EAAc,MAAM,IAAI,EAE/D,MAAO,CACL,KAAM/sK,EAAO,KACb,KAAMA,EAAO,KACb,OAAQA,EAAO,OAAO,IAAK7xC,GAClBiK,GAAS,CACd,GAAGjK,EACH,SAAU,EAClB,CAAO,CACF,EACD,gBAAiBg/M,EACjB,kBAAmBC,CACvB,CACA,CAAC,EAEKC,EAA2Bx4M,EAAS,IAAMu5G,GAAY,aAAC,GAAGoe,EAAS,IAAKxsF,GAAWA,EAAO,kBAAkB,KAAK,CAAC,CAAC,EAEzH,SAASstK,EAAaC,EAAa,CAE7BF,EAAyB,MAAM,SAAW,GAC5CG,EAAoCD,CAAW,EAEjDE,IACA,IAAIC,EAAqBlhF,EAAS+gF,CAAW,EAAE,OAAO,UAAW/gN,GAAQA,EAAI,KAAOggI,EAAS+gF,CAAW,EAAE,gBAAgB,KAAK,EAC/H,SAAS,MAAQ/gF,EAAS+gF,CAAW,EAAE,OAAOG,CAAkB,EAAE,UAClE5qM,EAAK,mBAAoBuqM,EAAyB,MAAM,CAAC,CAAC,CAC5D,CAEA,SAASM,EAAYC,EAAM,CACzB,QAASC,EAAK,CAAA,EAAIltF,EAAI,EAAGntH,EAAGpG,EAAIwgN,EAAK,OAAQxgN,IAAKuzH,GAAKntH,EACrDq6M,EAAGzgN,CAAC,EAAI,CAACuzH,EAAIntH,EAAIo6M,EAAKxgN,CAAC,EAAE,QAE3B,KAAK,OAASuzH,EACd,KAAK,KAAO,SAAU9wH,EAAG,CACvB,QAASd,EAAI,GAAI3B,EAAIwgN,EAAK,OAAQxgN,KAAO2B,EAAE3B,CAAC,EAAIwgN,EAAKxgN,CAAC,GAAIyC,EAAIg+M,EAAGzgN,CAAC,EAAE,CAAC,GAAM,GAAKygN,EAAGzgN,CAAC,EAAE,CAAC,CAAC,EACxF,OAAO2B,CACX,CACA,CAEA,SAASy+M,EAAoCM,EAAkB,CAC7D,IAAIC,EAAcvhF,EAASshF,CAAgB,EAEvCF,EAAOphF,EAAS,IAAI,CAACxsF,EAAQ5yC,IAAM,CACrC,IAAIyS,EAASmgC,EAAO,OAChB0tK,EAAqB7tM,EAAO,UAAWrT,GAAQA,EAAI,KAAOwzC,EAAO,gBAAgB,KAAK,EAG1F,MAFmB,CAACngC,EAAO6tM,CAAkB,EAAG,GAAG7tM,EAAO,MAAM,EAAG6tM,CAAkB,EAAG,GAAG7tM,EAAO,MAAM6tM,EAAqB,CAAC,CAAC,EAE3G,IAAKv/M,IAChB,CACL,YAAaf,EACb,QAASe,EAAM,GACf,UAAWA,EAAM,IACzB,EACK,CACL,CAAG,EAEDy/M,EAAOA,EAAK,MAAM,EAAGE,CAAgB,EAAE,OAAOF,EAAK,MAAME,EAAmB,CAAC,CAAC,EAE9E,IAAIE,EAAS,IAAIL,EAAYC,CAAI,EACjC,QAASxgN,EAAI,EAAGA,EAAI4gN,EAAO,OAAQ5gN,IAEjC,GADiBghH,GAAAA,aAAa,GAAG4/F,EAAO,KAAK5gN,CAAC,EAAE,IAAK,GAAM,EAAE,SAAS,EAAG2gN,EAAY,kBAAkB,KAAK,EAAE,OAAS,EACvG,CACdC,EAAO,KAAK5gN,CAAC,EAAE,QAASiD,GAAUm8H,EAASn8H,EAAK,WAAW,EAAE,gBAAgB,MAAQA,EAAK,OAAQ,EAClG,KACD,CAEL,CAEA,SAASo9M,GAA8B,CACrCjhF,EAAS,QAAQ,CAACxsF,EAAQ5yC,IAAM,CAE9B,IAAI6gN,EADezhF,EAAS,MAAM,EAAGp/H,CAAC,EAAE,OAAOo/H,EAAS,MAAMp/H,EAAI,CAAC,CAAC,EACnB,IAAK4yC,GAAWA,EAAO,kBAAkB,KAAK,EAC/FA,EAAO,OAAO,QAAS7xC,GAAU,CAC/B,IAAIggC,EAAWigF,GAAY,aAAC,GAAG6/F,EAA+B9/M,EAAM,IAAI,EAAE,SAAW,EACrFA,EAAM,SAAWggC,CACvB,CAAK,CACL,CAAG,CACH,CAEA,OAAAs/K,oxCClGA,MAAMx8M,EAAQgzD,EA0CRnhD,EAAOsiD,EAEPhgD,EAAQoV,GAAQ,EAChB0zL,EAAer5M,EAAS,IAAM,OAAO,KAAKuQ,CAAK,EAAE,OAAQtY,GAAQA,EAAI,WAAW,UAAU,CAAC,CAAC,EAC5FqhN,EAAet5M,EAAS,IAAM,OAAO,KAAKuQ,CAAK,EAAE,OAAQtY,GAAQA,EAAI,WAAW,UAAU,CAAC,CAAC,EAE5FshN,EAAU3wM,EAAI,IAAI,EAExB,SAAS4wM,EAAgBn2L,EAAO,CAE9B,IAAIswG,EADM4lF,EAAQ,MAAM,IAAI,SAASl2L,CAAK,EAC3B,YAAcA,IAAU,EAAI,EAAI,IAC/Ck2L,EAAQ,MAAM,IAAI,SAAS,CACzB,KAAA5lF,EACA,SAAU,QACd,CAAG,EAED1lH,EAAK,SAAUoV,CAAK,CACtB,CAOA,SAASo2L,GAAiB,CACxB,sBAAsB,IAAM,CACtB,SAAS,yBAAyB,aACpC,SAAS,cAAc,MAE7B,CAAG,CACH,CAEA,KAAM,CAAE,KAAAt4B,CAAI,EAAK32F,KAEXkvH,EAAqB15M,EAAS,IAAMmhL,EAAK,OAAS/kL,EAAM,SAAS,EAEjEu9M,EAAY35M,EAAS,IACrB,MAAM,QAAQ5D,EAAM,KAAK,EAAU,CAAE,KAAMA,EAAM,MAAM,CAAC,EAAG,QAASA,EAAM,MAAM,CAAC,GAC9E,CAAE,KAAMA,EAAM,MAAO,QAASA,EAAM,MAC5C,ouCCjFD,MAAMA,EAAQgzD,EAWRwqJ,EAAuBr2M,GAAS,CACpC,QAAS,UACT,QAAS,GACT,KAAM,GACN,QAAS,sBACT,OAAQ,GACR,aAAc,sBACd,YAAa,EACf,CAAC,EAEKs2M,EAAyBjxM,EAAI,EAAK,EAClCkxM,EAA0Bt+M,GAAS,CACvCo+M,EAAqB,QAAUp+M,EAAK,UACpCo+M,EAAqB,KAAOp+M,EAAK,gBACjCo+M,EAAqB,OAASp+M,EAAK,UACnCo+M,EAAqB,aAAe,YAAcp+M,EAAK,aAAe,cAEtEq+M,EAAuB,MAAQ,CAACA,EAAuB,KACzD,8cC7BA,MAAMz9M,EAAQgzD,yiBCHd,MAAMhzD,EAAQgzD,EAwCRnhD,EAAOsiD,EAEPj3D,EAAQ0G,EAAS,CACrB,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU2U,EAAK,oBAAqB3U,CAAK,CACjD,CAAC,EAEKygL,EAAiB/5K,EAAS,IAC1B5D,EAAM,OAAS,KAAa,iBAC5BA,EAAM,OAAS,KAAa,eACzB,gBACR,k/BC1BKoyI,GAAM,iRApBZ,MAAMpyI,EAAQgzD,EAkBRnhD,EAAOsiD,EACPwpJ,EAAgBnxM,EAAI,EAAK,EAEzB2iL,EAAc3iL,EAAI,EAAE,EAEpB,CAAE,KAAAu4K,EAAM,KAAA0D,GAASr6F,KACjBm7C,EAAW3lI,EAAS,IAAMmhL,EAAK,OAAS0D,EAAK,KAAK,EAElDvrL,EAAQ0G,EAAS,CACrB,IAAK,IACE5D,EAAM,WAGJA,EAAM,WAFJoyI,GAIX,IAAMl1I,GAAU,CACd2U,EAAK,oBAAqB3U,CAAK,EAC/BygN,EAAc,MAAQ,EACvB,CACH,CAAC,EACKC,EAAsB,IAAM,CAChCzuB,EAAY,MAAQ,GACpBwuB,EAAc,MAAQ,CAACA,EAAc,KACvC,EACME,EAA+B,IAAM,CACzCF,EAAc,MAAQ,EACxB,EAEMvuB,EAAgBxrL,EAAS,IAAM,CACnC,MAAMuqC,EAAWnuC,EAAM,QAAQ,OAAQ+uC,GAC9BA,EAAO,KAAK,YAAa,EAAC,SAASogJ,EAAY,MAAM,YAAW,CAAE,CAC1E,EAEK2uB,EAAgB3vK,EAAS,UAAWY,GAAWA,EAAO,OAAS7xC,EAAM,KAAK,EAEhF,GAAI4gN,IAAkB,GAAI,CAExB,MAAMC,EAAiB5vK,EAAS,OAAO2vK,EAAe,CAAC,EAAE,CAAC,EAC1D3vK,EAAS,QAAQ4vK,CAAc,CAChC,CACD,OAAO5vK,CACT,CAAC,EAEK6vK,EAAcp6M,EAAS,IACpB,IAAM,CACX1G,EAAM,MAAQ,IAClB,CACC,EAED,OAAA+f,GACE,IAAMjd,EAAM,eACZ,IAAM,CACJ29M,EAAc,MAAQ,EACvB,CACH,o5DC7EMv7H,GAAY,CAAC,eAAe,EAC5B67H,GAAoB,CAAC,uBAAuB,EAC5Ct7H,GAAiB,CAAC,MAAM,EAGjBu7H,GAAuB,CAACl6M,EAAU,OACtC49E,GAAS,CACd,GAAI59E,GAAW,CAAA,EACf,SAAUo+E,GACV,QAAS,IAAMtT,GAAY,IAAI,eAAe,EAC9C,OAASqvI,GACAA,EAAqB,aAE9B,qBAAsB,EAC1B,CAAG,EAIUC,IAA6B,CAACC,EAAMC,EAAWt6M,IACnD49E,GAAS,CACd,GAAI59E,GAAW,CAAA,EACf,SAAUi6M,GACV,QAAS,IAAMnvI,GAAY,IAAI,iBAAiBuvI,CAAI,IAAIC,CAAS,EAAE,EACnE,OAASC,GAA+BA,EAA2B,aAAa,CAAC,EACjF,qBAAsB,EAC1B,CAAG,EAII,SAASC,GAA8Bx6M,EAAS,CACrD,MAAMg8E,EAAcD,KACpB,OAAO+B,GAAY,CACjB,GAAI99E,GAAW,CAAA,EACf,WAAY,CAAC,CAAE,GAAAiM,EAAI,MAAA0pD,EAAO,YAAA0vH,EAAa,kBAAAyE,EAAmB,kBAAA2wB,CAAmB,IAC3E3vI,GAAY,KAAK,gBAAiB,CAAE,GAAA7+D,EAAI,MAAA0pD,EAAO,YAAA0vH,EAAa,kBAAAyE,EAAmB,kBAAA2wB,EAAmB,EACpG,UAAYC,GAAwB,CAClC,MAAM/hC,EAAiBv6F,GACvBpC,EAAY,aAAa,CAAE,SAAU28F,CAAgB,EAAE+hC,CAAmB,CAC3E,CACL,CAAG,CACH,CAGO,SAASC,GAA8B36M,EAAS46M,EAAgB,GAAO,CAC5E,MAAM5+H,EAAcD,KACpB,OAAO+B,GAAY,CACjB,GAAI99E,GAAW,CAAA,EACf,WAAY,CAAC,CAAE,GAAAiM,EAAI,MAAA0pD,EAAO,YAAA0vH,EAAa,kBAAAyE,CAAmB,IACxDh/G,GAAY,KAAK,gBAAiB,CAChC,GAAA7+D,EACA,MAAA0pD,EACA,YAAA0vH,EACA,kBAAAyE,CACR,CAAO,EACH,UAAW,CAAC4wB,EAAqBG,IAAgB,CAC/C,GAAID,EAAe,CACjB,KAAM,CAAE,GAAIE,CAAgB,EAAGD,EAEzBE,EADgBL,EAAoB,aACL,KAAMM,GAAkBA,EAAc,IAAMF,CAAc,EAC/F9+H,EAAY,aAAa,CAAE,SAAUi+H,EAAiB,EAAI,CAAE,aAAc,CAACc,CAAc,CAAC,CAAE,CACpG,KAAa,CACL,MAAMpiC,EAAiBv6F,GACvBpC,EAAY,aAAa,CAAE,SAAU28F,CAAgB,EAAE+hC,CAAmB,CAC3E,CACF,CACL,CAAG,CACH,CAGO,SAASO,GAA8Bj7M,EAASk7M,EAAe,GAAO,CAC3E,MAAMl/H,EAAcD,KACpB,OAAO+B,GAAY,CACjB,GAAI99E,GAAW,CAAA,EACf,WAAaiM,GAAO6+D,GAAY,OAAO,iBAAiB7+D,CAAE,EAAE,EAC5D,UAAW,CAACkzE,EAAO25F,IAAc,CAC/B,GAAIoiC,EAAc,OAClB,MAAMviC,EAAiBv6F,GACvBpC,EAAY,aAAa28F,EAAgB,CAAC,CAAE,aAAAwiC,CAAY,KAE/C,CAAE,aADmBA,EAAa,OAAQ//M,GAASA,EAAK,KAAO09K,CAAS,GAEhF,CACF,CACL,CAAG,CACH,CAGO,SAASsiC,GAAsBp7M,EAASk7M,EAAe,GAAO,CACnE,MAAMl/H,EAAcD,KACpB,OAAO+B,GAAY,CACjB,GAAI99E,GAAW,CAAA,EACf,WAAa5E,GAAS0vE,GAAY,KAAK,qBAAsB1vE,CAAI,EACjE,UAAYigN,GAAgC,CAC1C,KAAM,CAAE,aAAcX,CAAqB,EAAGW,EAC1CH,EAEFl/H,EAAY,aAAai+H,GAAmBoB,CAA2B,EAEvEr/H,EAAY,aAAaoC,GAAYk9H,IAE5B,CAAE,aADWA,EAAkB,aAAa,IAAKx+J,GAAUA,EAAK,IAAM49J,EAAoB,CAAC,EAAE,GAAKA,EAAoB,CAAC,EAAI59J,CAAK,GAExI,CAEJ,CACL,CAAG,CACH,CAGO,SAASy+J,GAA8Bv7M,EAASk7M,EAAe,GAAO,CAC3E,MAAMl/H,EAAcD,KACpB,OAAO+B,GAAY,CACjB,GAAI99E,GAAW,CAAA,EACf,WAAa5E,GAAS0vE,GAAY,OAAO,iBAAiB1vE,EAAK,cAAc,SAASA,EAAK,EAAE,EAAE,EAC/F,UAAW,CAAC+jF,EAAOq8H,IAAuB,CACpCN,EACFl/H,EAAY,aAAai+H,GAAoBwB,GAAwB,CACnE,MAAMC,EAAiBD,EAAoB,aAAa,CAAC,EACnDE,EAAkBD,EAAe,SAAS,OAAQtgN,GAASA,EAAK,KAAOogN,EAAmB,EAAE,EAClG,IAAII,EAAgB,EAChBC,EAAa,EACjB,OAAAF,EAAgB,QAASvgN,GAAS,CAChCwgN,GAAiBxgN,EAAK,SACtBygN,GAAczgN,EAAK,UAC/B,CAAW,EACM,CACL,aAAc,CACZ,CACE,GAAGsgN,EACH,SAAUC,EACV,WAAYC,EACZ,WAAYC,CACb,CACF,CACb,CACA,CAAS,EAED7/H,EAAY,aAAaoC,GAAY09H,IAY5B,CAAE,aAXWA,EAAmB,aAAa,OAAO,CAACC,EAAOC,IAAgB,CACjF,GAAIA,EAAY,IAAMR,EAAmB,eAAgB,CACvD,MAAMS,EAA0BD,EAAY,SAAS,OAAQl9I,GAAYA,EAAQ,IAAM08I,EAAmB,EAAE,EACtGU,EAAa,KAAK,IAAI,EAAGF,EAAY,WAAaR,EAAmB,QAAQ,EACnFO,EAAM,KAAK,CAAE,GAAGC,EAAa,SAAUC,EAAyB,WAAAC,CAAU,CAAE,CAC1F,MACcH,EAAM,KAAKC,CAAW,EAExB,OAAOD,CACR,EAAE,CAAE,CAAA,GAGN,CAEJ,CACL,CAAG,CACH,CAGO,SAASI,IAAwBn8M,EAAS,CAC/C,MAAMg8E,EAAcD,KACpB,OAAO+B,GAAY,CACjB,GAAI99E,GAAW,CAAA,EACf,WAAaq6M,GAASvvI,GAAY,KAAK,8BAA8BuvI,CAAI,EAAE,EAC3E,UAAYr+I,GAAa,CACvBggB,EAAY,aAAa2C,GAAgB3iB,CAAQ,CAClD,CACL,CAAG,CACH,CAGO,SAASujB,IAAqBv/E,EAAS,CAC5C,MAAMg8E,EAAcD,KACpB,OAAO+B,GAAY,CACjB,GAAI99E,GAAW,CAAA,EACf,WAAa5E,GAAS0vE,GAAY,KAAK,0BAA2B1vE,CAAI,EACtE,UAAYmV,GAAS,CACnByrE,EAAY,aAAa2C,GAAgBpuE,CAAI,CAC9C,CACL,CAAG,CACH,shECrKA,MAAMiC,EAAQ29C,EAERn0D,EAAQgzD,EAuBR6N,EAAW15D,GAAS,CAAE,GAAGnH,EAAM,eAAiB,CAAA,EACtD,GAAI,CAAE,UAAAq9E,EAAW,KAAM+iI,CAAkB,EAAGlC,GAAoB,EAE5D,CAAE,KAAMvvB,GAAsBnB,KAElC,MAAM6yB,EAAgBz8M,EAAS,IAAOy5E,EAAU,MAAQ,CAAA,EAAK+iI,EAAiB,KAAM,EAC9EE,EAAS18M,EAAS,IAAMy8M,EAAc,MAAM,OAAQjhN,GAASA,EAAK,sBAAwB,EAAI,CAAC,EAC/FmhN,EAAmB38M,EAAS,IAAMy8M,EAAc,MAAM,OAAQjhN,GAASA,EAAK,sBAAwB,EAAK,CAAC,EAC1G+vL,EAAc3iL,EAAI,EAAE,EACpBg0M,EAAmBh0M,EAAI,EAAE,EACzBi0M,EAA0Bj0M,EAAI,CAAC,EAC/Bk0M,EAAiBl0M,EAAI,EAAK,EAC1Bm0M,EAAuBn0M,EAAI,IAAI,EAE/Bo0M,EAAsBh9M,EAAS,IAC5B+qL,EAAkB,MAAM,IAAKkyB,IAAa,CAC/C,KAAMA,EAAQ,KACd,MAAOA,EAAQ,IAChB,EAAC,CACH,EACK12B,EAAiBvmL,EAAS,IAAMg9M,EAAoB,MAAM,OAAS,CAAC,EACpExxB,EAAgBxrL,EAAS,IACtBy8M,EAAc,MAAM,OAAQjhN,GAC1BA,EAAK,MAAM,YAAa,EAAC,SAAS+vL,EAAY,MAAM,YAAW,CAAE,CACzE,CACF,EAEK2xB,EAAsBl9M,EAAS,IAC5B08M,EAAO,MAAM,OAAQlhN,GACnBA,EAAK,MAAM,YAAa,EAAC,SAAS+vL,EAAY,MAAM,YAAW,CAAE,CACzE,CACF,EAEK4xB,EAAqBn9M,EAAS,IAAM,CACxC,MAAMo9M,EAAwBR,EAAiB,MAAM,YAAW,EAC1DS,EAAmBN,EAAqB,MAAQA,EAAqB,MAAM,YAAa,EAAG,KACjG,OAAOJ,EAAiB,MAAM,OAAQnhN,GAAS,CAC7C,MAAM8hN,EAAa9hN,EAAK,MAAM,YAAW,EAAG,SAAS4hN,CAAqB,EACpEG,EAAgBF,EAAmB7hN,EAAK,SAAS,YAAW,EAAG,SAAS6hN,CAAgB,EAAI,GAElG,OAAIA,IAAqB,KAChBC,EAEAA,GAAcC,CAE3B,CAAG,CACH,CAAC,EAEKC,EAAkBj6M,GAAS,IAAI,GAAK,EAE1C8V,GACEojM,EACCgB,GAAqB,CACpB,OAAO,OAAOA,CAAgB,EAAE,QAASjiN,GAAS,CAChDA,EAAK,SAAS,QAAS0jE,GAAY,CAC7BA,EAAQ,YAAcjC,EAAS,WACjCugJ,EAAgB,IAAIhiN,EAAM,EAAI,CAExC,CAAO,CACP,CAAK,CACF,EACD,CAAE,UAAW,EAAM,CACrB,EAEA,MAAMkiN,EAAmBliN,GAAS,CAChC,MAAMmiN,EAAeH,EAAgB,IAAIhiN,CAAI,EACvCoiN,EAAWnB,EAAc,MAC3BkB,EACF/qM,EAAM,oBAAqB,CAAE,KAAApX,EAAM,SAAAyhE,EAAU,SAAA2gJ,CAAU,CAAA,EAEvDhrM,EAAM,qBAAsB,CAAE,KAAApX,EAAM,SAAAyhE,EAAU,SAAA2gJ,CAAU,CAAA,EAE1DJ,EAAgB,IAAIhiN,EAAM,CAACmiN,CAAY,CACzC,EAEME,EAAuB,IAAM,CACjCf,EAAe,MAAQ,CAACA,EAAe,KACzC,+jLChHA,MAAM1gN,EAAQgzD,EAkDRnhD,EAAOsiD,EAEPj3D,EAAQ0G,EAAS,CACrB,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU2U,EAAK,oBAAqB3U,CAAK,CACjD,CAAC,2tDC9CD,MAAM8C,EAAQgzD,EAmDRx8C,EAAQ29C,EAERkxB,EAAe,CACnB,MAAO,KACP,YAAa,KACb,kBAAmB,KACnB,cAAapjF,EAAAjC,EAAM,kBAAN,YAAAiC,EAAuB,OAAQ,KAC5C,YAAWyP,EAAA1R,EAAM,kBAAN,YAAA0R,EAAuB,YAAa,KAC/C,WAAUw1K,EAAAlnL,EAAM,kBAAN,YAAAknL,EAAuB,WAAY,KAC7C,QAAOC,EAAAnnL,EAAM,kBAAN,YAAAmnL,EAAuB,QAAS,KACvC,OAAMC,EAAApnL,EAAM,kBAAN,YAAAonL,EAAuB,UAAW,IAC1C,EAEMvmH,EAAW15D,GAAS,CAAE,GAAGk+E,EAAc,GAAGrlF,EAAM,eAAe,CAAE,EACjEotL,EAAWxpL,EAAS,IAAM5D,EAAM,QAAQ,EACxCgxI,EAASptI,EAAS,IAAO5D,EAAM,QAAU,KAAOA,EAAM,OAAS,CAAE,EACjEi8I,EAAY/D,GAChB,CACE,MAAO,CAAE,SAAU5kG,GAAQ,YAAY,yCAA0CinG,EAAQ,CAAG,EAC5F,kBAAmB,CACjB,SAAUjnG,GAAQ,YAAY,uDAAwDsnG,GAAW56I,EAAM,OAAO,CAAC,CAChH,CACF,EACD6gE,CACF,EAEM6gJ,EAA6B99M,EAAS,IACtC5D,EAAM,SACDA,EAAM,QAENA,EAAM,SAAWA,EAAM,mBAEjC,EAKK4sL,EAAuBhpL,EAAS,IAChC5D,EAAM,iBAAmBA,EAAM,eAC1B,CAAC,GAAG+wI,GAAuBC,EAAO,KAAK,EAAG,GAAGC,EAAW,EACtDjxI,EAAM,iBAAmB,CAACA,EAAM,eAClC+wI,GAAuBC,EAAO,KAAK,EACjC,CAAChxI,EAAM,iBAAmBA,EAAM,eAClC,CAAC,GAAG8wI,GAAgB,GAAGG,EAAW,EAElCH,EAEV,EAEK6wE,EAAiB/9M,EAAS,IAAM5D,EAAM,UAAU,EAEhD4hN,EAAqB,IAAM,CAC3Bx0B,EAAS,MACX52K,EAAM,SAAUqqD,CAAQ,EAExBrqD,EAAM,SAAUqqD,CAAQ,CAE5B,EAEMtiD,EAAQ,IAAM,CAClB09H,EAAU,MAAM,SAChBp7E,EAAS,MAAQ,KACjBA,EAAS,YAAc,KACvBA,EAAS,kBAAoB,IAC/B,6wFC1HA,MAAM7gE,EAAQgzD,EAWRnhD,EAAOsiD,EAEP++D,EAAU1mH,EAAIxM,EAAM,MAAM,EAEhCid,GAAMjd,EAAM,OAASzE,GAAQ,CAC3B23H,EAAQ,MAAQ33H,EAChBsW,EAAK,gBAAiBtW,CAAG,CAC3B,CAAC,EAED0hB,GAAMi2G,EAAU33H,GAAQ,CACtBsW,EAAK,gBAAiBtW,CAAG,EACzBsW,EAAKtW,EAAM,OAAS,OAAO,CAC7B,CAAC,EAED,MAAM4Y,EAAQoV,GAAQ,EAChB4pG,EAAevvH,EAAS,IAAOuQ,EAAM,KAAO,OAAS,SAAU,EAC/Di/G,EAAYxvH,EAAS,IAAM5D,EAAM,KAAK,SAAWmU,EAAM,MAAM,EAEnE,SAAS+gB,GAAO,CACdg+F,EAAQ,MAAQ,EAClB,CAEA,SAAS/9F,GAAQ,CACf+9F,EAAQ,MAAQ,EAClB,CAEA,OAAAG,EAAa,CAAE,KAAAn+F,EAAM,MAAAC,CAAK,CAAE,6lFCjC5B,MAAMn1B,EAAQgzD,EA2CdvzC,GAAU,IAAMoiM,EAAS,CAAE,EAC3B,MAAMhwM,EAAOsiD,EAEPukG,EAAQ90J,EAAS,IAAO5D,EAAM,gBAAkB,WAAa,KAAO,GAAI,EACxE8hN,EAASl+M,EAAS,IAAO5D,EAAM,gBAAkB,WAAa,KAAO,IAAK,EAC1E+hN,EAA4Bn+M,EAAS,IAAO5D,EAAM,gBAAkB,WAAa,IAAM,IAAK,EAC5Fu5M,EAAa31M,EAAS,IAAO5D,EAAM,gBAAkBwwI,GAAmB,SAAWxwI,EAAM,mBAAqBA,EAAM,gBAAiB,EACrIgiN,EAAWp+M,EAAS,IAAM21M,EAAW,MAAM,OAAS,CAAC,EACrD0I,EAAYr+M,EAAS,IAAM21M,EAAW,MAAM,QAAU,CAAC,EAE7Dt8L,GACE,IAAM,CAAC+kM,EAAS,MAAOC,EAAU,KAAK,EACtC,IAAMJ,EAAW,CACnB,EACA,MAAM9hE,EAAWvzI,EAAI,CAAC,EAChB01M,EAAkB11M,EAAIxM,EAAM,oBAAoB,EAEhDmiN,EAAiBv+M,EAAS,IAAM,CACpC,MAAM21M,GAAav5M,EAAM,gBAAkBwwI,GAAmB,SAAWxwI,EAAM,mBAAqBA,EAAM,iBACpGm1E,EAAIykC,EAAQ2/F,GAAW,KAAK,EAC5B3pF,GAAIhW,EAAQ2/F,GAAW,MAAM,EAC7B6I,GAAYC,EAAcltI,EAAGy6C,EAAC,EACpC,OAAO0yF,GAAeF,GAAWriE,EAAS,KAAK,CACjD,CAAC,EAEKwiE,EAAoB/1M,EAAIxM,EAAM,UAAY,CAAC,EAC3CwiN,EAAmBh2M,EAAI,CAAC,EACxBi2M,EAAkBj2M,EAAI,EAAK,EAE3Bk2M,EAAqB,CAAChJ,GAAW,IAC9BA,GAAW,EAAI,QAAU,OAGlCz8L,GACE,IAAMjd,EAAM,SACZ,IAAM,CACJuiN,EAAkB,MAAQviN,EAAM,SAChC2iN,GACD,CACH,EACA,MAAMC,EAA8Bh/M,EAAS,IAAM++M,EAA6BJ,EAAkB,KAAK,CAAC,EAClGM,EAA6Br2M,EAAI,CAAC,EAClCs2M,EAAgB,IAAM,CAC1BP,EAAkB,MAAQC,EAAiB,MAC3C3wM,EAAK,qBAAsB2wM,EAAiB,KAAK,CACnD,EAEMO,EAAOv2M,EAAI,CACf,CACE,MAAO,CACL,cAAe,EACf,eAAgB,EAChB,aAAc,CACf,EACD,OAAQ,CACN,cAAe,EACf,eAAgB,EAChB,aAAc,CACf,CACF,CACH,CAAC,EAEDyQ,GACE,IAAM8lM,EAAK,MAAM,OACjB,IAAMlB,EAAW,CACnB,EACA,MAAMmB,EAAcrxM,IAAU,CAC5BA,GAAM,OAAO,QACf,EAEAsL,GACE,IAAMilM,EAAgB,MACtB,IAAML,EAAW,CACnB,EAEA,MAAMoB,EAAS,IAAM,CACnBF,EAAK,MAAM,KAAK,CACd,MAAO,CAAE,cAAe,EAAG,eAAgB,EAAG,aAAc,CAAG,EAC/D,OAAQ,CAAE,cAAe,EAAG,eAAgB,EAAG,aAAc,CAAG,CACpE,CAAG,CACH,EAEMG,EAAaj8L,IAAU,CACvBA,GAAQ,GACV87L,EAAK,MAAM,OAAO97L,GAAO,CAAC,CAE9B,EACMk8L,EAAuBC,KAC3BX,EAAgB,MAAQ,GACpBW,GAAgB,MAClBX,EAAgB,MAAQ,IAEnBW,IAGHvB,EAAY,IAAM,CACtBgB,EAA2B,MAAQ,EAEnCE,EAAK,MAAM,QAASM,GAAe,CACjC,GAAI,CACFA,EAAW,MAAM,aAAeA,EAAW,MAAM,cAAgBzpG,EAAQypG,EAAW,MAAM,cAAc,EACxGA,EAAW,OAAO,aAAeA,EAAW,OAAO,cAAgBzpG,EAAQypG,EAAW,OAAO,cAAc,CAC5G,OAAQr/L,GAAO,CACd,QAAQ,MAAM,0BAA2BA,EAAK,CAC/C,CACL,CAAG,EAED++L,EAAK,MAAM,QAASM,GAAe,CACjC,GAAI,CACEA,EAAW,MAAM,cAAgB,GAAKA,EAAW,OAAO,cAAgB,IAC1ER,EAA2B,MAAQA,EAA2B,MAAQR,EAAcgB,EAAW,MAAM,aAAcA,EAAW,OAAO,YAAY,EAEpJ,OAAQr/L,GAAO,CACd,QAAQ,MAAM,uCAAwCA,EAAK,CAC5D,CACL,CAAG,EAEGk+L,EAAgB,QAAU,KAC5BW,EAA2B,OAAS,EAAI7iN,EAAM,QAAU,KAE1D,MAAMojN,GAAgB,KAAK,KAAKP,EAA2B,MAAQV,EAAe,KAAK,EAEvFK,EAAiB,MAAQW,EAAoBC,EAAa,CAC5D,EAEME,EAAuB1/M,EAAS,IAAO5D,EAAM,gBAAkBwwI,GAAmB,SAAW,UAAY,IAAK,EAE9G+yE,EAAsB,CAACC,GAAgBtB,EAAgB,QAAU,CACrEA,EAAgB,MAAQsB,EAC1B,EAEMb,EAA+B,CAACc,GAAU,IAAM,CACpD,IAAIrB,EAAYqB,GAAUtB,EAAe,MACzC,OAAOG,GAAeF,EAAWriE,EAAS,KAAK,CACjD,EAEM2jE,GAAgCxmN,IAK7B,GAJgB,IAAI,KAAK,aAAa,QAAS,CACpD,sBAAuB,EACvB,sBAAuB6iJ,EAAS,KACpC,CAAG,EAAE,OAAO7iJ,EAAK,CACS,GAGpB08G,EAAU,CAAC18G,GAAQ,IAAM,CAC7B,GAAI,MAAMA,EAAK,EAAG,MAAO,GAEzB,GAAI8C,EAAM,eAAiBwwI,GAAmB,SAE5C,OADkBtzI,GAAQ,GAI5B,GAAI8C,EAAM,eAAiBwwI,GAAmB,OAE5C,OADmBtzI,GAAQ,GAG/B,EAEMmlN,EAAgB,CAAC7uJ,GAAO6L,IACrBijJ,GAAe9uJ,GAAQ6L,EAAQ0gF,EAAS,KAAK,EAGhDuiE,GAAiB,CAACniE,GAAKwjE,IAAkB,CAC7C,MAAMC,GAAS,KAAK,IAAI,GAAID,CAAa,EACzC,OAAO,KAAK,MAAMxjE,GAAMyjE,EAAM,EAAIA,EACpC,g2NC/FMC,IAAsB,mhBA7F5B,KAAM,CAAE,UAAWC,EAAsB,OAAQC,CAA2B,EAAG3E,GAAqB,EAC9F,CAAE,UAAW4E,EAA6B,OAAQC,CAAkC,EAAG1E,GAA6B,EACpH,CAAE,UAAW2E,EAAmC,OAAQC,CAA4B,EAAG3F,GAA6B,EAEpHnzE,EAAoB3jD,GAAoB,EACxC1nF,EAAQgzD,EAmDR,CAAE,KAAA+xH,CAAI,EAAK32F,KACXg2H,EAA4B53M,EAAI,EAAK,EACrC63M,EAAW73M,EAAI,EAAK,EACpB83M,EAAuB93M,EAAI,IAAI,EAG/B+3M,EAAgB3gN,EAAS,IAAM,QACnC,OAAO3B,GAAAjC,EAAM,aAAN,YAAAiC,GAAkB,OAAO,IAAKuiN,KAAW,CAC9C,KAAMA,GAAM,KACZ,IAAKA,GAAM,GACZ,GACH,CAAC,EAEK93B,EAAgBL,GAAgB,EAChCo4B,EAAuB7gN,EAAS,IAAM8oL,EAAc,gBAAgB,sBAAsB,CAAC,EAE3Fg4B,EAAkBl4M,EAAIxM,EAAM,WAAaA,EAAM,QAAQ,KAAK,CAAC,EAAE,SAAS,EACxE2kN,EAAY/gN,EAAS,IAAQ5D,EAAM,cAA4F,KAA5EA,EAAM,QAAQ,KAAK,KAAM4kN,IAAQA,GAAI,YAAcF,EAAgB,KAAK,CAAS,EAEpI1zE,EAASxkI,GAAIvK,GAAAjC,EAAM,cAAN,YAAAiC,GAAmB,MAAM,EACtCwsL,EAAkBjiL,IAAIkF,GAAA1R,EAAM,cAAN,YAAA0R,GAAmB,kBAAmB,EAAK,EACjEg9K,EAAiBliL,IAAI06K,GAAAlnL,EAAM,cAAN,YAAAknL,GAAmB,iBAAkB,EAAK,EAC/D29B,EAAYjhN,EAAS,IACjB+gN,EAAU,MAAM,MAAQ,CAACA,EAAU,MAAM,KAAK,QAAW,CAACA,EAAU,MAAM,IACnF,EAGKG,EAAYlhN,EAAS,IAAM,YAAc8gN,EAAgB,KAAK,EAC9DK,EAAmBnhN,EAAS,IAAM,mBAAmBkhN,EAAU,KAAK,CAAC,EAErEE,EAAiBphN,EAAS,IAAMgqF,GAAQ,cAAgBm3H,EAAiB,KAAK,EAGpF,SAASE,GAAY,CACnB,OAAO,QAAQ,aAAa,KAAM,KAAMH,EAAU,KAAK,CACzD,CAGA,MAAMI,EAAethN,EAAS,IAAM+gN,EAAU,MAAM,MAAM,MAAM,EAAGd,GAAmB,CAAC,EACjFsB,EAAWvhN,EAAS,IAAM+gN,EAAU,MAAM,KAAK,EAC/CS,EAAqB54M,EAAI,EAAK,EAC9B64M,GAA2B74M,EAAI,CAAC,EAChC84M,EAAgB1hN,EAAS,IAAA,QAAM,OAAA3B,GAAA0iN,GAAA,YAAAA,EAAW,QAAX,YAAA1iN,GAAkB,MAAM,KAAMsjN,IAAUA,GAAM,OAASxL,GAAY,OAAM,EAC9G,SAASyL,EAAwBv+L,GAAO,CACtCo+L,GAAyB,MAAQp+L,IAAS,EAC1Cm+L,EAAmB,MAAQ,EAC7B,CAEA,MAAMK,GAAqBj5M,EAAI,CAAA,CAAE,EACjC,SAASk5M,GAAsBz+L,GAAO,CACpC,IAAIm6J,GAAOqkC,GAAmB,MAAM,SAASx+L,EAAK,EAC9Cm6J,IAAQA,cAAgB,aAC1BA,GAAK,eAAe,CAAE,MAAO,QAAS,SAAU,QAAQ,CAAE,CAE9D,CAEA,MAAMukC,EAAe/hN,EAAS,IAAM5D,EAAM,iBAAmBA,EAAM,YAAY,EAEzE4lN,GAAWhiN,EAAS,IAAM5D,EAAM,iBAAmBA,EAAM,QAAQ,EAEjEmvH,GAAgBvrH,EAAS,IAAM5D,EAAM,aAAa,EAElD6lN,GAAYjiN,EAAS,IAAM+gN,EAAU,MAAM,OAAS3kN,EAAM,eAAe,EAEzE8pI,GAA6Bt9C,GAAW,IAAMm4H,EAAU,MAAM,2BAA2B,EAEzFmB,GAAcliN,EAAS,IAAM,CAAC,CAAC+gN,EAAU,MAAM,kBAAkB,EAEjEoB,GAAYniN,EAAS,IAAM,QAAA,QAAA3B,GAAA0iN,EAAU,QAAV,YAAA1iN,GAAiB,eAAgB,KAAI,EAGhE+jN,GAAgCpiN,EAAS,IAAM+gN,EAAU,MAAM,kBAAkB,EAEjFsB,GAAkBriN,EAAS,IAAM,CACrC,IAAIghN,GAAMD,EAAU,MAChBuB,GAAQ,CAAA,EACZ,OAAItB,GAAI,oBAAoBsB,GAAM,KAAK,CAAE,MAAO,qBAAsB,MAAOtB,GAAI,kBAAoB,CAAA,EACjGA,GAAI,WAAWsB,GAAM,KAAK,CAAE,MAAO,cAAe,MAAOtB,GAAI,SAAW,CAAA,EACxEA,GAAI,YAAYsB,GAAM,KAAK,CAAE,MAAO,aAAc,MAAOtB,GAAI,UAAY,CAAA,EACzEA,GAAI,QAAQsB,GAAM,KAAK,CAAE,MAAO,SAAU,MAAOtB,GAAI,MAAQ,CAAA,EAC7DA,GAAI,WAAWsB,GAAM,KAAK,CAAE,MAAO,YAAa,MAAOtB,GAAI,SAAW,CAAA,EACtEA,GAAI,sBAAsBsB,GAAM,KAAK,CAAE,MAAO,SAAU,MAAO,aAAa,CAAE,EAC9EtB,GAAI,cAAcsB,GAAM,KAAK,CAAE,MAAO,SAAU,MAAOtB,GAAI,aAAc,KAAMn0E,GAAkB,KAAO,CAAA,EACxGm0E,GAAI,iBAAiBsB,GAAM,KAAK,CAAE,MAAO,SAAU,MAAOtB,GAAI,gBAAiB,KAAMn0E,GAAkB,UAAY,CAAA,EAChHy1E,EACT,CAAC,EAEKC,GAAkBviN,EAAS,IAAM,CACrC,IAAIsiN,GAAQ,CAAA,EACZ,OAAID,GAAgB,MAAM,QAAQC,GAAM,KAAKD,GAAgB,KAAK,EAC9DtB,EAAU,MAAM,OAASA,EAAU,MAAM,MAAM,QAAQuB,GAAM,KAAK,GAAGvB,EAAU,MAAM,KAAK,EACvFuB,EACT,CAAC,EAEKE,GAAqB55M,EAAI,IAAI,EAC7Bi0M,GAA0Bj0M,EAAI,CAAC,EAG/B65M,GAAWziN,EAAS,IACpB+gN,EAAU,MAAM,MACXA,EAAU,MAAM,MAAM,OAEtB,IAEV,EAEK2B,GAAwB1iN,EAAS,IAAM,CAC3C,IAAIsiN,GAAQ,CAAA,EACZ,OAAIvB,EAAU,MAAM,OAASA,EAAU,MAAM,MAAM,SAAW,GAC5DuB,GAAM,KAAK,CACT,CACE,MAAO,iBACP,MAAOvB,EAAU,MAAM,MAAM,CAAC,EAAE,YAAc,SAAWA,EAAU,MAAM,MAAM,CAAC,EAAE,YAAc,SAAWA,EAAU,MAAM,MAAM,CAAC,EAAE,aAAe,KACpJ,EACD,CAAE,MAAO,aAAc,MAAOA,EAAU,MAAM,MAAM,CAAC,EAAE,aAAc,KAAMl0E,GAAkB,KAAO,CAC1G,CAAK,EACIy1E,EACT,CAAC,EAID,SAASK,IAAkB,CACrBH,GAAmB,OAASA,GAAmB,iBAAiB,YAClEA,GAAmB,MAAM,eAAe,CAAE,MAAO,QAAS,SAAU,QAAQ,CAAE,EAE9E3F,GAAwB,MAAQ,CAEpC,CAGA,MAAM+F,GAAqBh6M,EAAI,IAAI,EAC7Bi6M,GAAYj6M,EAAI,IAAI,EACpB,CAAE,OAAQk6M,EAAwB,EAAKx7H,GAAes7H,EAAkB,EACxE,CAAE,OAAQG,EAAe,EAAKz7H,GAAeu7H,EAAS,EACtDG,GAAsBhjN,EAAS,IAAM8iN,GAAyB,MAAQC,GAAgB,KAAK,EAC3FE,GAAuBr6M,EAAI,EAAK,EACtCyQ,GAAM0nM,EAAW,IAAM,CACrBkC,GAAqB,MAAQ,GAC7B5B,GACF,CAAC,EAED,MAAM6B,GAAkBljN,EAAS,IAAM+gN,EAAU,MAAM,0BAA4B,IAAI,EACjFoC,GAAgBnjN,EAAS,IAAM+gN,EAAU,MAAM,UAAU,OAAS,CAAC,EAGnEqC,GAAMx6M,EAAI,CAAC,EACXy6M,GAAgBC,IAAU,CAC9B,GAAIA,KAAU,EAAG,OAAQF,GAAI,MAAQ,EACrCA,GAAI,MAAQE,EACd,EAEMC,GAAoBvjN,EAAS,IAAM,WACvC,QAAO8N,IAAAzP,GAAAjC,EAAM,UAAN,YAAAiC,GAAe,WAAf,YAAAyP,GAAyB,KAAK,cAAc,SAAS,eAAgB,EAC9E,CAAC,EAEK01M,GAAYxjN,EAAS,IAAM,6BAC/B,OACEujN,GAAkB,QAAU,MAC5BhgC,IAAAD,IAAAx1K,IAAAzP,GAAA0iN,EAAU,QAAV,YAAA1iN,GAAiB,sBAAjB,YAAAyP,GAAuC,KAAvC,YAAAw1K,GAA2C,qBAA3C,YAAAC,GAA+D,SAAU,MACzE5X,IAAArmB,IAAA8+B,IAAAZ,GAAAu9B,EAAU,QAAV,YAAAv9B,GAAiB,sBAAjB,YAAAY,GAAuC,KAAvC,YAAA9+B,GAA2C,qBAA3C,YAAAqmB,GAA+D,UAAW,CAK9E,CAAC,EACK83C,GAAsBzjN,EAAS,IAAA,WAAM,QAAA8N,IAAAzP,GAAA0iN,EAAU,QAAV,YAAA1iN,GAAiB,sBAAjB,YAAAyP,GAAuC,KAAM,CAAA,EAAE,EAGpF41M,GAAoBC,IAAY,CACpC,MAAMC,GAAWxnN,EAAM,QAAQ,KAAK,KAAM4kN,IAAQA,GAAI,YAAc2C,GAAQ,GAAG,EAC/Ej4E,IAAoB,CAAE,GAAGk4E,GAAU,SAAUD,GAAQ,IAAK,KAAMvnN,EAAM,QAAQ,KAAM,UAAWslN,EAAc,KAAK,EAAIf,EAAc,KAAK,CAC3I,EAEAl1E,IAAe,CAAE,GAAGs1E,EAAU,MAAO,KAAM3kN,EAAM,QAAQ,KAAM,UAAWslN,EAAc,KAAO,EAAEf,EAAc,KAAK,EAEpH,SAASkD,GAAYlsN,GAAK,CACxB+oN,EAAqB,MAAQ,CAC3B,KAAMtkN,EAAM,QAAQ,KACpB,UAAW2kN,EAAU,MAAM,UAC3B,SAAUA,EAAU,MAAM,MAAM,CAAC,EAAE,SACnC,MAAOA,EAAU,MAAM,MACvB,QAASA,EAAU,MAAM,IAC7B,EACEP,EAA0B,MAAQ7oN,EACpC,CAEA,SAASmsN,GAAensN,GAAK,CAC3B+oN,EAAqB,MAAQ,CAC3B,KAAMtkN,EAAM,QAAQ,KACpB,UAAW2kN,EAAU,MAAM,UAC3B,SAAUA,EAAU,MAAM,MAAM,CAAC,EAAE,SACnC,MAAOA,EAAU,MAAM,MACvB,QAASA,EAAU,MAAM,IAC7B,EACMppN,IAAO,IACT6oN,EAA0B,MAAQ,GAClCC,EAAS,MAAQ9oN,KAEjB6oN,EAA0B,MAAQ,GAClCC,EAAS,MAAQ,IAEnBA,EAAS,MAAQ9oN,EACnB,CACA,MAAMosN,GAAqBC,IAAwB,CACjD,MAAMC,GAAe,CACnB,MAAOD,GAAoB,MAC3B,YAAaA,GAAoB,YACjC,kBAAmBA,GAAoB,kBACvC,kBAAmB,CAAC,CAAE,UAAWA,GAAoB,UAAW,SAAU,EAAG,CACjF,EACEzD,EAA2B0D,GAAc,CACvC,UAAW,IAAMx8E,EAAkB,cAAc,sCAAsC,EACvF,QAAS,IAAMA,EAAkB,YAAY,yEAAyE,EACtH,UAAW,IAAM,CACfg5E,EAAS,MAAQ,EAClB,CACL,CAAG,CACH,EAEMyD,GAA0B1oN,IAAS,CACvC,MAAMmV,GAAO,CACX,UAAWnV,GAAK,SAAS,UACzB,SAAU,EACV,eAAgBA,GAAK,KAAK,EAC9B,EACE2kN,EAA0BxvM,GAAM,CAC9B,UAAW,IAAM82H,EAAkB,cAAc,8BAA8B,EAC/E,QAAS,IAAMA,EAAkB,YAAY,yEAAyE,CAC1H,CAAG,CACH,EACM08E,GAA0B3oN,IAAS,CACvC,MAAMmV,GAAO,CACX,UAAWnV,GAAK,SAAS,UACzB,eAAgBA,GAAK,KAAK,EAC9B,EACQ4oN,GAAiBzzM,GAAK,eACtB0zM,GAAkB1zM,GAAK,UAEvB2zM,GADqB9oN,GAAK,SAAS,KAAMA,IAASA,GAAK,KAAO4oN,EAAc,EACvC,SAAS,KAAMllJ,IAAYA,GAAQ,YAAcmlJ,EAAe,EACrGnlJ,GAAU,CAAE,eAAgB1jE,GAAK,KAAK,GAAI,GAAI8oN,GAAgB,GAAI,SAAUA,GAAgB,QAAQ,EAC1GjE,EAAiCnhJ,GAAS,CACxC,UAAW,IAAMuoE,EAAkB,cAAc,kCAAkC,EACnF,QAAS,IAAMA,EAAkB,YAAY,8EAA8E,CAC/H,CAAG,CACH,y/YCpUA,MAAMrrI,EAAQgzD,EAoCRnhD,EAAOsiD,EAEPg0J,EAAkB37M,EAAI,IAAI,EAE1B47M,EAAcxkN,EAAS,IAAM5D,EAAM,OAAO,KAAK,EAC/CqoN,EAAgBzkN,EAAS,IAAM,OAAA,QAAA3B,EAAAjC,EAAM,SAAN,YAAAiC,EAAc,UAAW,CAAA,EAAE,EAC1DqmN,EAAqB1kN,EAAS,IAC3BykN,EAAc,MAAM,IAAKE,GAAiBA,EAAa,KAAK,CACpE,EAEKrrN,EAAQ0G,EAAS,CACrB,IAAK,IAAM5D,EAAM,WACjB,IAAM87M,GAAkB,CAGlBuM,EAAc,MAAM,SAAW,GACjCx2M,EAAK,oBAAqBiqM,CAAa,CAE1C,CACH,CAAC,EAEK0M,EAAgB5kN,EAAS,IAAM,CACnC,OAAQ5D,EAAM,KAAI,CAChB,IAAK,QACH,OAAOyoN,GACT,IAAK,WACH,OAAOC,GACT,QACE,MAAM,IAAI,MAAM,qBAAqB1oN,EAAM,IAAI,EAAE,CACpD,CACH,CAAC,EAEK2oN,EAAa/kN,EAAS,IAAM,CAChC,MAAMglN,EAAY1rN,EAAM,MAAM,SAASkrN,EAAY,KAAK,EAExD,MAAI,GADkBlrN,EAAM,MAAM,KAAM3B,GAAQ+sN,EAAmB,MAAM,SAAS/sN,CAAG,CAAC,GACjE,CAACqtN,EAExB,CAAC,EAEKC,EAAoBr8M,EAAItP,EAAM,MAAM,KAAM3B,GAAQ+sN,EAAmB,MAAM,SAAS/sN,CAAG,CAAC,GAAK2B,EAAM,MAAM,SAASkrN,EAAY,KAAK,CAAC,EAEpIU,EAAqBn3M,GAAU,CAGnC,GAFI3R,EAAM,WAAWA,EAAM,UAAU,OAAM,EAEvCsoN,EAAmB,MAAM,SAAW,EAExC,IAAIK,EAAW,MAAO,CACpB,MAAMI,EAAkB,OAAO,OAAO7rN,EAAM,KAAK,EAAE,OAAQ3B,GAAQ,CAAC+sN,EAAmB,MAAM,SAAS/sN,CAAG,CAAC,EAC1GsW,EAAK,oBAAqBk3M,CAAe,EACzC,MACD,CAED,GAAIp3M,EAAM,OAAO,QACfE,EAAK,oBAAqB,CAAC,GAAG3U,EAAM,MAAO,GAAGorN,EAAmB,MAAO32M,EAAM,OAAO,KAAK,CAAC,EAC3Fk3M,EAAkB,MAAQ,OACrB,CACL,MAAME,EAAkB,OAAO,OAAO7rN,EAAM,KAAK,EAAE,OAAQ3B,GAAQ,CAAC+sN,EAAmB,MAAM,SAAS/sN,CAAG,GAAKA,GAAO6sN,EAAY,KAAK,EACtIv2M,EAAK,oBAAqBk3M,CAAe,CAC1C,EACH,EAEMC,EAAuB,IAAM,CACjCH,EAAkB,MAAQ,CAACA,EAAkB,KAC/C,EAEMI,EAAmBt3M,GAAU,CACjC,MAAMmqM,EAAgBnqM,EAAM,OAAO,MACnC,GAAIA,EAAM,OAAO,QAEfE,EAAK,oBAAqB,CAAC,GAAG3U,EAAM,MAAO4+M,CAAa,CAAC,MACpD,CAEL,MAAM7xB,EAAe/sL,EAAM,MAAM,OAAQ3B,GAAQA,GAAOugN,GAAiBvgN,GAAO6sN,EAAY,KAAK,EACjGv2M,EAAK,oBAAqBo4K,CAAY,CACvC,CACH,8jEChHA,MAAMjqL,EAAQgzD,EAoDRnhD,EAAOsiD,EAEPj3D,EAAQ0G,EAAS,CACrB,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU,CACd2U,EAAK,oBAAqB3U,CAAK,CAChC,CACH,CAAC,EAEKiX,EAAQoV,GAAQ,EAEhB+xH,EAAiB/qI,GAAK,EACtBgrI,EAAoB33I,EAAS,IAAM,OAAA,OAAC,GAAC3B,EAAAjC,EAAM,YAAN,MAAAiC,EAAiB,QAAM,EAC5D+oI,EAAWpnI,EAAS,IAAM5D,EAAM,OAASu7I,EAAkB,KAAK,EAChEC,EAAkB53I,EAAS,IAAO5D,EAAM,QAAUA,EAAM,cAAgBmU,EAAM,eAAkBonI,EAAkB,KAAK,mtCCnE7H,MAAMv7I,EAAQgzD,EAeRnhD,EAAOsiD,EAEP+0J,EAAkBtlN,EAAS,CAC/B,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU2U,EAAK,oBAAqB3U,CAAK,CACjD,CAAC,EAEKisN,EAAmBvlN,EAAS,IAAM5D,EAAM,YAAY,MAAM,EAE1DopN,EAAgBxlN,EAAS,IACtB5D,EAAM,QACV,OAAQ6pB,GAEes/L,EAAiB,MAAM,KAAME,GAAeA,EAAW,MAAQx/L,EAAI,KAAK,GACtE,CAACA,EAAI,aAC9B,EACA,IAAIy/L,CAAkB,CAC1B,EAEKC,EAAkBC,GAAU,CAChC,MAAMC,EAASN,EAAiB,MAAM,KAAMO,GAAgBA,EAAY,MAAQF,CAAK,EACrF,OAAOC,GAAA,YAAAA,EAAQ,KACjB,EAEMH,EAAsBK,IACnB,CACL,MAAOA,EAAa,MACpB,MAAOA,EAAa,MACpB,SAAUT,EAAgB,MAAM,SAASS,EAAa,KAAK,EAC3D,MAAOJ,EAAeI,EAAa,KAAK,GAAK,EAC7C,SAAU,CAACJ,EAAeI,EAAa,KAAK,EAC5C,QAASA,GAAA,MAAAA,EAAc,QAAUA,GAAA,YAAAA,EAAc,QAAQ,IAAIL,GAAsB,CAAE,CACvF,6KCtBO,SAASM,GAAa5pN,EAAOkN,EAAQ,CAC1C,OAAOoc,GACE,OAAO,KAAKtpB,CAAK,EAAE,OAAO,CAACvB,EAAKmyB,IAAS,CAE9C,MAAMstJ,EADqB,OAAOl+K,EAAM4wB,CAAI,GAAM,UAAY5wB,EAAM4wB,CAAI,GAAK,MAAQ,CAAC,MAAM,QAAQ5wB,EAAM4wB,CAAI,CAAC,EACvE5wB,EAAM4wB,CAAI,EAAI,CACpD,KAAM5wB,EAAM4wB,CAAI,CACxB,EACM,OAAItH,GAAYsH,KAAQtH,EACtB7qB,EAAImyB,CAAI,EAAI,CACV,GAAGstJ,EACH,QAAS50J,EAASsH,CAAI,CAChC,EAEQnyB,EAAImyB,CAAI,EAAIstJ,EAEVhxK,GAAU,CAACzO,EAAImyB,CAAI,EAAE,SACvBnyB,EAAImyB,CAAI,EAAE,OAAS1jB,GAEdzO,CACR,EAAE,CAAE,CAAA,CAET,CC/CO,MAAMorN,GAAqBD,GAAa,CAC7C,MAAO,CAAC,OAAQ,MAAO,MAAM,EAC7B,MAAO,CACL,KAAM,CAAC,OAAQ,MAAO,MAAM,EAC5B,QAAS,IACV,CACH,EAAG,WAAW,ECTDE,GAAa,OAAO,OAAW,IAE/BC,IAAiBD,KAAe,iBAAkB,QAAU,OAAO,UAAU,eAAiB,GCMpG,SAASE,IAAevrN,EAAKggB,EAAM8I,EAAU,CAClD,MAAM/kB,EAAOic,EAAK,OAAS,EAC3B,GAAIjc,EAAO,EAAG,OAAO/D,IAAQ,OAAY8oB,EAAW9oB,EACpD,QAAStC,EAAI,EAAGA,EAAIqG,EAAMrG,IAAK,CAC7B,GAAIsC,GAAO,KACT,OAAO8oB,EAET9oB,EAAMA,EAAIggB,EAAKtiB,CAAC,CAAC,CAClB,CACD,OAAIsC,GAAO,MACJA,EAAIggB,EAAKjc,CAAI,CAAC,IAAM,OADH+kB,EAC0B9oB,EAAIggB,EAAKjc,CAAI,CAAC,CAClE,CAkBO,SAASynN,GAAqBxrN,EAAKggB,EAAM8I,EAAU,CAExD,OAAI9oB,GAAO,MAAQ,CAACggB,GAAQ,OAAOA,GAAS,SAAiB8I,EACzD9oB,EAAIggB,CAAI,IAAM,OAAkBhgB,EAAIggB,CAAI,GAC5CA,EAAOA,EAAK,QAAQ,aAAc,KAAK,EACvCA,EAAOA,EAAK,QAAQ,MAAO,EAAE,EACtBurM,IAAevrN,EAAKggB,EAAK,MAAM,GAAG,EAAG8I,CAAQ,EACtD,CAeO,SAAS6wF,GAAY/4C,EAAQ,CAClC,IAAInvD,EAAQ,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,EAChF,OAAO,MAAM,KAAK,CAChB,OAAAmvD,CACD,EAAE,CAACr9D,EAAGguC,IAAM9/B,EAAQ8/B,CAAC,CACxB,CAOO,SAASk6K,GAAc9uN,EAAK,CACjC,IAAIstF,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,KAC/E,GAAI,EAAAttF,GAAO,MAAQA,IAAQ,IAEpB,OAAI,MAAM,CAACA,CAAG,EACZ,OAAOA,CAAG,EACP,SAAS,CAACA,CAAG,EAGhB,GAAG,OAAOA,CAAG,CAAC,GAAGstF,CAAI,GAF5B,MAIJ,CACO,SAAS3rF,GAAS0B,EAAK,CAC5B,OAAOA,IAAQ,MAAQ,OAAOA,GAAQ,UAAY,CAAC,MAAM,QAAQA,CAAG,CACtE,CAcO,MAAM0rN,GAAW,OAAO,OAAO,CACpC,MAAO,GACP,IAAK,EACL,OAAQ,GACR,IAAK,GACL,MAAO,GACP,GAAI,GACJ,KAAM,GACN,KAAM,GACN,MAAO,GACP,IAAK,GACL,KAAM,GACN,IAAK,GACL,UAAW,EACX,OAAQ,GACR,OAAQ,GACR,SAAU,GACV,MAAO,EACT,CAAC,EACYC,IAAY,OAAO,OAAO,CACrC,MAAO,QACP,IAAK,MACL,OAAQ,SACR,IAAK,SACL,MAAO,QACP,GAAI,UACJ,KAAM,YACN,KAAM,YACN,MAAO,aACP,IAAK,MACL,KAAM,OACN,IAAK,SACL,UAAW,YACX,OAAQ,SACR,OAAQ,SACR,SAAU,WACV,MAAO,OACT,CAAC,EAIM,SAAS5hN,GAAI/J,EAAK5C,EAAK,CAC5B,OAAOA,EAAI,MAAMm0C,GAAKvxC,EAAI,eAAeuxC,CAAC,CAAC,CAC7C,CAEO,SAASm3E,IAAK1oH,EAAKwoG,EAAO,CAC/B,MAAM/4D,EAAQ,CAAA,EACR94B,EAAO,IAAI,IAAI,OAAO,KAAK3W,CAAG,CAAC,EACrC,UAAWggB,KAAQwoF,EACb7xF,EAAK,IAAIqJ,CAAI,IACfyvB,EAAMzvB,CAAI,EAAIhgB,EAAIggB,CAAI,GAG1B,OAAOyvB,CACT,CAyBO,SAASm8K,IAAK5rN,EAAKsmB,EAAS,CACjC,MAAMmoB,EAAQ,CAAA,EACd,OAAAnoB,EAAQ,QAAQ6L,GAAQsc,EAAMtc,CAAI,EAAInyB,EAAImyB,CAAI,CAAC,EACxCsc,CACT,CAiCO,SAASo9K,GAAYtoN,EAAG,CAC7B,OAAOA,GAAK,KAAO,CAAA,EAAK,MAAM,QAAQA,CAAC,EAAIA,EAAI,CAACA,CAAC,CACnD,CA6BO,SAAS2lH,GAAMzqH,EAAO,CAC3B,IAAIsrE,EAAM,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,EAC1E/iD,EAAM,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,EAC9E,OAAO,KAAK,IAAI+iD,EAAK,KAAK,IAAI/iD,EAAKvoB,CAAK,CAAC,CAC3C,CACO,SAASqtN,GAAYrtN,EAAO,CACjC,MAAMstN,EAAattN,EAAM,SAAU,EAAC,KAAI,EACxC,OAAOstN,EAAW,SAAS,GAAG,EAAIA,EAAW,OAASA,EAAW,QAAQ,GAAG,EAAI,EAAI,CACtF,CACO,SAAS/hG,GAAOrtH,EAAKikE,EAAQ,CAClC,IAAI3mB,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,IAC/E,OAAOt9C,EAAMs9C,EAAK,OAAO,KAAK,IAAI,EAAG2mB,EAASjkE,EAAI,MAAM,CAAC,CAC3D,CACO,SAASstH,GAASttH,EAAKikE,EAAQ,CAEpC,OADW,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,KACnE,OAAO,KAAK,IAAI,EAAGA,EAASjkE,EAAI,MAAM,CAAC,EAAIA,CACzD,CACO,SAAS8gH,IAAM9gH,EAAK,CACzB,IAAIqN,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,EAC/E,MAAMgiN,EAAU,CAAA,EAChB,IAAIxjM,EAAQ,EACZ,KAAOA,EAAQ7rB,EAAI,QACjBqvN,EAAQ,KAAKrvN,EAAI,OAAO6rB,EAAOxe,CAAI,CAAC,EACpCwe,GAASxe,EAEX,OAAOgiN,CACT,CAoBO,SAASC,IAAY,CAC1B,IAAIx9M,EAAS,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC7E7H,EAAS,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC7EslN,EAAU,UAAU,OAAS,EAAI,UAAU,CAAC,EAAI,OACpD,MAAM3rE,EAAM,CAAA,EACZ,UAAWnjJ,KAAOqR,EAChB8xI,EAAInjJ,CAAG,EAAIqR,EAAOrR,CAAG,EAEvB,UAAWA,KAAOwJ,EAAQ,CACxB,MAAMulN,EAAiB19M,EAAOrR,CAAG,EAC3BgvN,EAAiBxlN,EAAOxJ,CAAG,EAIjC,GAAIkB,GAAS6tN,CAAc,GAAK7tN,GAAS8tN,CAAc,EAAG,CACxD7rE,EAAInjJ,CAAG,EAAI6uN,GAAUE,EAAgBC,EAAgBF,CAAO,EAC5D,QACD,CACD,GAAI,MAAM,QAAQC,CAAc,GAAK,MAAM,QAAQC,CAAc,GAAKF,EAAS,CAC7E3rE,EAAInjJ,CAAG,EAAI8uN,EAAQC,EAAgBC,CAAc,EACjD,QACD,CACD7rE,EAAInjJ,CAAG,EAAIgvN,CACZ,CACD,OAAO7rE,CACT,CACO,SAAS8rE,GAAiBrtK,EAAO,CACtC,OAAOA,EAAM,IAAI9hC,GACXA,EAAK,OAASiH,GACTkoM,GAAiBnvM,EAAK,QAAQ,EAE9BA,CAEV,EAAE,KAAI,CACT,CACO,SAASovM,IAAc,CAC5B,IAAI3vN,EAAM,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,GAC9E,GAAI2vN,GAAY,MAAM,IAAI3vN,CAAG,EAAG,OAAO2vN,GAAY,MAAM,IAAI3vN,CAAG,EAChE,MAAM4vN,EAAQ5vN,EAAI,QAAQ,WAAY,GAAG,EAAE,QAAQ,aAAc,KAAK,EAAE,YAAW,EACnF,OAAA2vN,GAAY,MAAM,IAAI3vN,EAAK4vN,CAAK,EACzBA,CACT,CACAD,GAAY,MAAQ,IAAI,IAoDjB,SAASE,GAAiBt/M,EAAQ,CACvC,MAAM4mB,EAAOprB,GAAS,CAAA,CAAE,EAClBulB,EAAO9oB,EAAS+H,CAAM,EAC5B,OAAAiR,GAAY,IAAM,CAChB,UAAW/gB,KAAO6wB,EAAK,MACrB6F,EAAK12B,CAAG,EAAI6wB,EAAK,MAAM7wB,CAAG,CAEhC,EAAK,CACD,MAAO,MACX,CAAG,EACM4R,GAAO8kB,CAAI,CACpB,CAGO,SAASs2E,IAAS5sG,EAAKV,EAAK,CACjC,OAAOU,EAAI,SAASV,CAAG,CACzB,CAIO,MAAM2vN,GAAY,IAAM,CAAC,SAAU,KAAK,ECvYzCC,GAAU,IACVC,GAAM,SACNC,GAAM,SACNC,GAAM,QAONC,IAAS,IACTC,IAAU,IACVC,IAAS,IACTC,IAAQ,IAIRC,GAAU,IACVC,GAAU,KACVC,IAAY,KACZC,IAAW,KACXC,IAAW,KACXC,GAAc,KACdC,GAAc,kBACdC,GAAc,IACdC,GAAS,KAER,SAASC,GAAa7sL,EAAM8zB,EAAY,CAE7C,MAAMg5J,GAAQ9sL,EAAK,EAAI,MAAQ4rL,GACzBmB,GAAQ/sL,EAAK,EAAI,MAAQ4rL,GACzBoB,GAAQhtL,EAAK,EAAI,MAAQ4rL,GACzBqB,GAAOn5J,EAAW,EAAI,MAAQ83J,GAC9BsB,GAAOp5J,EAAW,EAAI,MAAQ83J,GAC9BuB,GAAOr5J,EAAW,EAAI,MAAQ83J,GAGpC,IAAIwB,EAAON,EAAOjB,GAAMkB,EAAOjB,GAAMkB,EAAOjB,GACxCsB,EAAMJ,EAAMpB,GAAMqB,EAAMpB,GAAMqB,EAAMpB,GAQxC,GAJIqB,GAAQhB,KAASgB,IAAShB,GAAUgB,IAASf,IAC7CgB,GAAOjB,KAASiB,IAAQjB,GAAUiB,IAAQhB,IAG1C,KAAK,IAAIgB,EAAMD,CAAI,EAAId,IAAW,MAAO,GAI7C,IAAIgB,EACJ,GAAID,EAAMD,EAAM,CAId,MAAMG,GAAQF,GAAOrB,IAASoB,GAAQnB,KAAWM,IAOjDe,EAAiBC,EAAOX,GAAS,EAAMW,EAAOd,GAAcc,EAAOA,EAAOb,GAAcC,GAAcY,EAAOZ,EACjH,KAAS,CAIL,MAAMY,GAAQF,GAAOlB,IAAQiB,GAAQlB,KAAUM,IAC/Cc,EAAiBC,EAAO,CAACX,GAAS,EAAMW,EAAO,CAACd,GAAcc,EAAOA,EAAOb,GAAcC,GAAcY,EAAOZ,EAChH,CACD,OAAOW,EAAiB,GAC1B,CCpFA,MAAMpkI,GAAQ,mBAERskI,IAAyB37L,GAAKA,EAAIq3D,IAAS,EAAI,KAAK,KAAKr3D,CAAC,EAAIA,GAAK,EAAIq3D,IAAS,GAAK,EAAI,GACzFukI,IAAyB57L,GAAKA,EAAIq3D,GAAQr3D,GAAK,EAAI,EAAIq3D,IAAS,GAAKr3D,EAAI,EAAI,IAC5E,SAAS67L,GAAQC,EAAK,CAC3B,MAAMjsK,EAAY8rK,IACZI,EAAelsK,EAAUisK,EAAI,CAAC,CAAC,EACrC,MAAO,CAAC,IAAMC,EAAe,GAAI,KAAOlsK,EAAUisK,EAAI,CAAC,EAAI,MAAO,EAAIC,GAAe,KAAOA,EAAelsK,EAAUisK,EAAI,CAAC,EAAI,OAAO,EAAE,CACzI,CACO,SAASE,GAAMC,EAAK,CACzB,MAAMpsK,EAAY+rK,IACZM,GAAMD,EAAI,CAAC,EAAI,IAAM,IAC3B,MAAO,CAACpsK,EAAUqsK,EAAKD,EAAI,CAAC,EAAI,GAAG,EAAI,OAASpsK,EAAUqsK,CAAE,EAAGrsK,EAAUqsK,EAAKD,EAAI,CAAC,EAAI,GAAG,EAAI,OAAO,CACvG,CCZA,MAAME,IAAoB,CAAC,CAAC,OAAQ,QAAS,MAAO,EAAG,CAAC,OAAS,OAAQ,KAAM,EAAG,CAAC,MAAQ,MAAS,KAAM,CAAC,EAGrGC,IAAuBt9F,GAAKA,GAAK,SAAYA,EAAI,MAAQ,MAAQA,IAAM,EAAI,KAAO,KAGlFu9F,IAAoB,CAAC,CAAC,MAAQ,MAAQ,KAAM,EAAG,CAAC,MAAQ,MAAQ,KAAM,EAAG,CAAC,MAAQ,MAAQ,KAAM,CAAC,EAGjGC,IAAuBx9F,GAAKA,GAAK,OAAUA,EAAI,QAAUA,EAAI,MAAS,QAAU,IAC/E,SAAS+8F,GAAQC,EAAK,CAC3B,MAAMS,EAAM,MAAM,CAAC,EACb1sK,EAAYusK,IACZx7B,EAASu7B,IAGf,QAASpxN,EAAI,EAAGA,EAAI,EAAG,EAAEA,EAEvBwxN,EAAIxxN,CAAC,EAAI,KAAK,MAAMwrH,GAAM1mE,EAAU+wI,EAAO71L,CAAC,EAAE,CAAC,EAAI+wN,EAAI,CAAC,EAAIl7B,EAAO71L,CAAC,EAAE,CAAC,EAAI+wN,EAAI,CAAC,EAAIl7B,EAAO71L,CAAC,EAAE,CAAC,EAAI+wN,EAAI,CAAC,CAAC,CAAC,EAAI,GAAG,EAEnH,MAAO,CACL,EAAGS,EAAI,CAAC,EACR,EAAGA,EAAI,CAAC,EACR,EAAGA,EAAI,CAAC,CACZ,CACA,CACO,SAASP,GAAM/xI,EAAM,CAC1B,GAAI,CACF,EAAA9uE,EACA,EAAA6zB,EACA,EAAAp/B,CACD,EAAGq6E,EACJ,MAAM6xI,EAAM,CAAC,EAAG,EAAG,CAAC,EACdjsK,EAAYysK,IACZ17B,EAASy7B,IAGflhN,EAAI00C,EAAU10C,EAAI,GAAG,EACrB6zB,EAAI6gB,EAAU7gB,EAAI,GAAG,EACrBp/B,EAAIigD,EAAUjgD,EAAI,GAAG,EAGrB,QAAS7E,EAAI,EAAGA,EAAI,EAAG,EAAEA,EACvB+wN,EAAI/wN,CAAC,EAAI61L,EAAO71L,CAAC,EAAE,CAAC,EAAIoQ,EAAIylL,EAAO71L,CAAC,EAAE,CAAC,EAAIikC,EAAI4xJ,EAAO71L,CAAC,EAAE,CAAC,EAAI6E,EAEhE,OAAOksN,CACT,CC3CO,SAASU,GAAWC,EAAO,CAChC,MAAO,CAAC,CAACA,GAAS,6BAA6B,KAAKA,CAAK,CAC3D,CACO,SAASC,IAAgBD,EAAO,CACrC,OAAOD,GAAWC,CAAK,GAAK,CAAC,2BAA2B,KAAKA,CAAK,CACpE,CACA,MAAME,GAAa,yCACbC,IAAU,CACd,IAAK,CAACzhN,EAAG6zB,EAAGp/B,EAAGD,KAAO,CACpB,EAAAwL,EACA,EAAA6zB,EACA,EAAAp/B,EACA,EAAAD,CACJ,GACE,KAAM,CAACwL,EAAG6zB,EAAGp/B,EAAGD,KAAO,CACrB,EAAAwL,EACA,EAAA6zB,EACA,EAAAp/B,EACA,EAAAD,CACJ,GACE,IAAK,CAAC0rB,EAAG1Q,EAAGxZ,EAAGxB,IAAMktN,GAAS,CAC5B,EAAAxhM,EACA,EAAA1Q,EACA,EAAAxZ,EACA,EAAAxB,CACJ,CAAG,EACD,KAAM,CAAC0rB,EAAG1Q,EAAGxZ,EAAGxB,IAAMktN,GAAS,CAC7B,EAAAxhM,EACA,EAAA1Q,EACA,EAAAxZ,EACA,EAAAxB,CACJ,CAAG,EACD,IAAK,CAAC0rB,EAAG1Q,EAAG/Z,EAAGjB,IAAMmtN,GAAS,CAC5B,EAAAzhM,EACA,EAAA1Q,EACA,EAAA/Z,EACA,EAAAjB,CACJ,CAAG,EACD,KAAM,CAAC0rB,EAAG1Q,EAAG/Z,EAAGjB,IAAMmtN,GAAS,CAC7B,EAAAzhM,EACA,EAAA1Q,EACA,EAAA/Z,EACA,EAAAjB,CACJ,CAAG,CACH,EACO,SAASotN,GAAWN,EAAO,CAChC,GAAI,OAAOA,GAAU,SAKnB,MAAO,CACL,GAAIA,EAAQ,WAAa,GACzB,GAAIA,EAAQ,QAAW,EACvB,EAAGA,EAAQ,GACjB,EACS,GAAI,OAAOA,GAAU,UAAYE,GAAW,KAAKF,CAAK,EAAG,CAC9D,KAAM,CACJ,OAAA5uC,CACN,EAAQ4uC,EAAM,MAAME,EAAU,EACpB,CACJ,GAAAtwN,EACA,OAAAmR,CACD,EAAGqwK,EACEmvC,EAAax/M,EAAO,MAAM,MAAM,EAAE,IAAI5M,GACtCA,EAAE,SAAS,GAAG,GAAK,CAAC,MAAO,OAAQ,MAAO,MAAM,EAAE,SAASvE,CAAE,EACxD,WAAWuE,CAAC,EAAI,IAEhB,WAAWA,CAAC,CAEtB,EACD,OAAOgsN,IAAQvwN,CAAE,EAAE,GAAG2wN,CAAU,CACpC,SAAa,OAAOP,GAAU,SAAU,CACpC,IAAIxvE,EAAMwvE,EAAM,WAAW,GAAG,EAAIA,EAAM,MAAM,CAAC,EAAIA,EACnD,MAAI,CAAC,EAAG,CAAC,EAAE,SAASxvE,EAAI,MAAM,EAC5BA,EAAMA,EAAI,MAAM,EAAE,EAAE,IAAI3lG,GAAQA,EAAOA,CAAI,EAAE,KAAK,EAAE,EAC1C,CAAC,EAAG,CAAC,EAAE,SAAS2lG,EAAI,MAAM,EAO/BgwE,IAAShwE,CAAG,CACvB,SAAa,OAAOwvE,GAAU,SAAU,CACpC,GAAIrlN,GAAIqlN,EAAO,CAAC,IAAK,IAAK,GAAG,CAAC,EAC5B,OAAOA,EACF,GAAIrlN,GAAIqlN,EAAO,CAAC,IAAK,IAAK,GAAG,CAAC,EACnC,OAAOK,GAASI,GAAST,CAAK,CAAC,EAC1B,GAAIrlN,GAAIqlN,EAAO,CAAC,IAAK,IAAK,GAAG,CAAC,EACnC,OAAOK,GAASL,CAAK,CAExB,CACD,MAAM,IAAI,UAAU,kBAAkBA,GAAS,KAAOA,EAAQ,OAAOA,CAAK,GAAKA,EAAM,YAAY,IAAI;AAAA,qEAAwE,CAC/K,CAoBO,SAASK,GAASK,EAAM,CAC7B,KAAM,CACJ,EAAA9hM,EACA,EAAA1Q,EACA,EAAA/Z,EACA,EAAAjB,CACD,EAAGwtN,EACE7+F,EAAI9wH,GAAK,CACb,MAAMoxC,GAAKpxC,EAAI6tB,EAAI,IAAM,EACzB,OAAOzqB,EAAIA,EAAI+Z,EAAI,KAAK,IAAI,KAAK,IAAIi0B,EAAG,EAAIA,EAAG,CAAC,EAAG,CAAC,CACxD,EACQ29K,EAAM,CAACj+F,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAAE,IAAI1tH,GAAK,KAAK,MAAMA,EAAI,GAAG,CAAC,EAC3D,MAAO,CACL,EAAG2rN,EAAI,CAAC,EACR,EAAGA,EAAI,CAAC,EACR,EAAGA,EAAI,CAAC,EACR,EAAA5sN,CACJ,CACA,CACO,SAASktN,GAASO,EAAM,CAC7B,OAAON,GAASI,GAASE,CAAI,CAAC,CAChC,CAmDO,SAASF,GAASG,EAAK,CAC5B,KAAM,CACJ,EAAAhiM,EACA,EAAA1Q,EACA,EAAAxZ,EACA,EAAAxB,CACD,EAAG0tN,EACEzsN,EAAIO,EAAIwZ,EAAI,KAAK,IAAIxZ,EAAG,EAAIA,CAAC,EAC7BmsN,EAAS1sN,IAAM,EAAI,EAAI,EAAI,EAAIO,EAAIP,EACzC,MAAO,CACL,EAAAyqB,EACA,EAAGiiM,EACH,EAAA1sN,EACA,EAAAjB,CACJ,CACA,CAaA,SAAS4tN,GAAM3sN,EAAG,CAChB,MAAMyqB,EAAI,KAAK,MAAMzqB,CAAC,EAAE,SAAS,EAAE,EACnC,OAAQ,KAAK,OAAO,EAAG,EAAIyqB,EAAE,MAAM,EAAIA,GAAG,aAC5C,CACO,SAASmiM,IAAShwF,EAAO,CAC9B,GAAI,CACF,EAAAryH,EACA,EAAA6zB,EACA,EAAAp/B,EACA,EAAAD,CACD,EAAG69H,EACJ,MAAO,IAAI,CAAC+vF,GAAMpiN,CAAC,EAAGoiN,GAAMvuL,CAAC,EAAGuuL,GAAM3tN,CAAC,EAAGD,IAAM,OAAY4tN,GAAM,KAAK,MAAM5tN,EAAI,GAAG,CAAC,EAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EACvG,CACO,SAASstN,IAAShwE,EAAK,CAC5BA,EAAMwwE,IAASxwE,CAAG,EAClB,GAAI,CAAC9xI,EAAG6zB,EAAGp/B,EAAGD,CAAC,EAAIm7G,IAAMmiC,EAAK,CAAC,EAAE,IAAIvgJ,GAAK,SAASA,EAAG,EAAE,CAAC,EACzD,OAAAiD,EAAIA,IAAM,OAAYA,EAAIA,EAAI,IACvB,CACL,EAAAwL,EACA,EAAA6zB,EACA,EAAAp/B,EACA,EAAAD,CACJ,CACA,CAQO,SAAS8tN,IAASxwE,EAAK,CAC5B,OAAIA,EAAI,WAAW,GAAG,IACpBA,EAAMA,EAAI,MAAM,CAAC,GAEnBA,EAAMA,EAAI,QAAQ,gBAAiB,GAAG,GAClCA,EAAI,SAAW,GAAKA,EAAI,SAAW,KACrCA,EAAMA,EAAI,MAAM,EAAE,EAAE,IAAIlpE,GAAKA,EAAIA,CAAC,EAAE,KAAK,EAAE,GAEzCkpE,EAAI,SAAW,IACjBA,EAAM51B,GAAOA,GAAO41B,EAAK,CAAC,EAAG,EAAG,GAAG,GAE9BA,CACT,CAQO,SAASywE,IAAQ5xN,EAAO8gJ,EAAQ,CACrC,MAAMqvE,EAAM0B,GAAeC,GAAW9xN,CAAK,CAAC,EAC5C,OAAAmwN,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAIrvE,EAAS,GACpBixE,GAAaC,GAAa7B,CAAG,CAAC,CACvC,CACO,SAAS8B,IAAOjyN,EAAO8gJ,EAAQ,CACpC,MAAMqvE,EAAM0B,GAAeC,GAAW9xN,CAAK,CAAC,EAC5C,OAAAmwN,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAIrvE,EAAS,GACpBixE,GAAaC,GAAa7B,CAAG,CAAC,CACvC,CAMO,SAAS+B,IAAQvB,EAAO,CAC7B,MAAMF,EAAMQ,GAAWN,CAAK,EAC5B,OAAOmB,GAAWrB,CAAG,EAAE,CAAC,CAC1B,CAaO,SAAS0B,GAAcxB,EAAO,CACnC,MAAMyB,EAAgB,KAAK,IAAIlD,GAAa+B,GAAW,CAAC,EAAGA,GAAWN,CAAK,CAAC,CAAC,EAa7E,OAZsB,KAAK,IAAIzB,GAAa+B,GAAW,QAAQ,EAAGA,GAAWN,CAAK,CAAC,CAAC,EAY7D,KAAK,IAAIyB,EAAe,EAAE,EAAI,OAAS,MAChE,CC1TO,MAAMC,GAAiB,OAAO,IAAI,kBAAkB,EACpD,SAASC,IAAexrN,EAAS,CACtC,OAAOwI,EAAIxI,CAAO,CACpB,CACO,SAASyrN,IAAiB,CAC/B,MAAMnmM,EAAW3M,GAAO4yM,EAAc,EACtC,GAAI,CAACjmM,EAAU,MAAM,IAAI,MAAM,4CAA4C,EAC3E,OAAOA,CACT,CAmCA,SAASomM,IAAc17M,EAAO4c,EAAM,SAClC,OAAO,QAAO3uB,EAAA+R,EAAM,QAAN,YAAA/R,EAAc2uB,IAAU,KAAe,QAAOlf,EAAAsC,EAAM,QAAN,YAAAtC,EAAcq5M,GAAYn6L,CAAI,IAAO,GACnG,CACO,SAAS++L,KAAsB,CACpC,IAAI3vN,EAAQ,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC5EF,EAAO,UAAU,OAAS,EAAI,UAAU,CAAC,EAAI,OAC7CwpB,EAAW,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAImmM,GAAc,EACjG,MAAMG,EAAK9vM,GAAmB,aAAa,EAE3C,GADAhgB,EAAOA,GAAQ8vN,EAAG,KAAK,MAAQA,EAAG,KAAK,OACnC,CAAC9vN,EACH,MAAM,IAAI,MAAM,8CAA8C,EAEhE,MAAM+vN,EAAoBjsN,EAAS,WAAM,OAAA3B,EAAAqnB,EAAS,QAAT,YAAArnB,EAAiBjC,EAAM,KAAOF,GAAK,EACtEqrC,EAAS,IAAI,MAAMnrC,EAAO,CAC9B,IAAIqF,EAAQurB,EAAM,aAChB,MAAMoR,EAAY,QAAQ,IAAI38B,EAAQurB,CAAI,EAC1C,OAAIA,IAAS,SAAWA,IAAS,QACxB,EAAC3uB,EAAA4tN,EAAkB,QAAlB,YAAA5tN,EAA0B2uB,GAAOoR,CAAS,EAAE,OAAOhgC,GAAKA,GAAK,IAAI,EAChE,OAAO4uB,GAAS,UAAY,CAAC8+L,IAAcE,EAAG,MAAOh/L,CAAI,IAC3Dlf,EAAAm+M,EAAkB,QAAlB,YAAAn+M,EAA0Bkf,OAASu2J,GAAAD,EAAA59J,EAAS,QAAT,YAAA49J,EAAgB,SAAhB,YAAAC,EAAyBv2J,KAASoR,EAEvEA,CACR,CACL,CAAG,EACK8tL,EAAwBpjN,KAC9BkQ,GAAY,IAAM,CAChB,GAAIizM,EAAkB,MAAO,CAC3B,MAAME,EAAgB,OAAO,QAAQF,EAAkB,KAAK,EAAE,OAAOx0I,GAAQ,CAC3E,GAAI,CAACx/E,CAAG,EAAIw/E,EACZ,OAAOx/E,EAAI,WAAWA,EAAI,CAAC,EAAE,YAAW,CAAE,CAClD,CAAO,EACDi0N,EAAsB,MAAQC,EAAc,OAAS,OAAO,YAAYA,CAAa,EAAI,MAC/F,MACMD,EAAsB,MAAQ,MAEpC,CAAG,EACD,SAASE,GAAqB,CAC5B,MAAM5pM,EAAW6pM,IAAWV,GAAgBK,CAAE,EAC9CzjM,GAAQojM,GAAgB3rN,EAAS,IACxBksN,EAAsB,MAAQpF,IAAUtkM,GAAA,YAAAA,EAAU,QAAS,CAAE,EAAE0pM,EAAsB,KAAK,EAAI1pM,GAAA,YAAAA,EAAU,KAChH,CAAC,CACH,CACD,MAAO,CACL,MAAO+kB,EACP,mBAAA6kL,CACJ,CACA,CClFO,SAASntM,GAAgB7e,EAAS,CAEvC,GADAA,EAAQ,OAASA,EAAQ,QAAUA,EAAQ,MACvC,CAACA,EAAQ,KAEX,OAAOA,EAET,GAAIA,EAAQ,OAAQ,CAClBA,EAAQ,MAAQ4lN,GAAa5lN,EAAQ,OAAS,GAAIA,EAAQ,IAAI,IAC9D,MAAMksN,EAAW,OAAO,KAAKlsN,EAAQ,KAAK,EAAE,OAAOnI,GAAOA,IAAQ,SAAWA,IAAQ,OAAO,EAC5FmI,EAAQ,YAAc,SAAqBhE,EAAO,CAChD,OAAOmnH,IAAKnnH,EAAOkwN,CAAQ,CACjC,EACIlsN,EAAQ,MAAM,IAAM,OACpBA,EAAQ,MAAQ,SAAehE,EAAOyT,EAAK,CACzC,MAAM6V,EAAWmmM,KAGjB,GAAI,CAACnmM,EAAS,MAAO,OAAOtlB,EAAQ,OAAOhE,EAAOyT,CAAG,EACrD,KAAM,CACJ,MAAO03B,EACP,mBAAA6kL,CACR,EAAUL,IAAoB3vN,EAAOA,EAAM,KAAOgE,EAAQ,KAAMslB,CAAQ,EAC5D6mM,EAAgBnsN,EAAQ,OAAOmnC,EAAQ13B,CAAG,EAChD,OAAAu8M,IACOG,CACb,CACG,CACD,OAAOnsN,CACT,CASO,SAASosN,IAAmB,CACjC,IAAIC,EAAiB,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,GACzF,OAAOrsN,IAAYqsN,EAAiBxtM,GAAkBytM,IAAkBtsN,CAAO,CACjF,CC/CO,SAAS8b,GAAmBhgB,EAAMm+C,EAAS,CAChD,MAAM2xK,EAAK3vI,KACX,GAAI,CAAC2vI,EACH,MAAM,IAAI,MAAM,aAAa9vN,CAAI,IAAIm+C,GAAW,6CAA6C,EAAE,EAEjG,OAAO2xK,CACT,CACO,SAASW,IAAyB,CACvC,IAAIzwN,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,cAC/E,MAAM8vN,EAAK9vM,GAAmBhgB,CAAI,EAAE,KACpC,OAAOirN,IAAY6E,GAAA,YAAAA,EAAI,aAAaA,GAAA,YAAAA,EAAI,KAAI,CAC9C,CACA,IAAIY,GAAO,EACPC,GAAO,IAAI,QACR,SAASC,IAAS,CACvB,MAAMd,EAAK9vM,GAAmB,QAAQ,EACtC,GAAI2wM,GAAK,IAAIb,CAAE,EAAG,OAAOa,GAAK,IAAIb,CAAE,EAAO,CACzC,MAAM3vL,EAAMuwL,KACZ,OAAAC,GAAK,IAAIb,EAAI3vL,CAAG,EACTA,CACR,CACH,CACAywL,GAAO,MAAQ,IAAM,CACnBF,GAAO,EACPC,GAAO,IAAI,OACb,EC1BO,SAASR,IAAWp0N,EAAK,CAC9B,IAAI+zN,EAAK,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI9vM,GAAmB,YAAY,EAC5G,KAAM,CACJ,SAAAoM,CACD,EAAG0jM,EACJ,GAAI1jM,GAAYrwB,KAAOqwB,EAErB,OAAOA,EAASrwB,CAAG,CAGvB,CCVO,SAAS80N,GAAUt8M,EAAQ,CAChC,MAAMu7M,EAAK9vM,GAAmB,WAAW,EACzC8vM,EAAG,OAASv7M,CACd,CCAO,SAASu8M,GAAe1jN,EAAQzP,EAAI,CACzC,IAAImF,EACJ,SAASsN,GAAQ,CACftN,EAAQH,GAAW,EACnBG,EAAM,IAAI,IAAMnF,EAAG,OAASA,EAAG,IAAM,CACnCmF,GAAA,MAAAA,EAAO,OACPsN,GACN,CAAK,EAAIzS,EAAE,CAAE,CACV,CACDwf,GAAM/P,EAAQ2jN,GAAU,CAClBA,GAAU,CAACjuN,EACbsN,IACU2gN,IACVjuN,GAAA,MAAAA,EAAO,OACPA,EAAQ,OAEd,EAAK,CACD,UAAW,EACf,CAAG,EACDE,GAAe,IAAM,CACnBF,GAAA,MAAAA,EAAO,MACX,CAAG,CACH,CCtBO,SAASkuN,GAAgB9wN,EAAO4wB,EAAM3iB,EAAc,CACzD,IAAI8iN,EAAc,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI/uN,GAAKA,EACvFgvN,EAAe,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIhvN,GAAKA,EAC5F,MAAM4tN,EAAK9vM,GAAmB,iBAAiB,EACzCkmL,EAAWx5L,EAAIxM,EAAM4wB,CAAI,IAAM,OAAY5wB,EAAM4wB,CAAI,EAAI3iB,CAAY,EACrEgjN,EAAYlG,GAAYn6L,CAAI,EAE5BsgM,EAA4BttN,EADfqtN,IAAcrgM,EACU,IAAM,aAC/C,OAAK5wB,EAAM4wB,CAAI,EACR,CAAC,IAAG3uB,EAAA2tN,EAAG,MAAM,QAAT,MAAA3tN,EAAgB,eAAe2uB,KAASlf,EAAAk+M,EAAG,MAAM,QAAT,MAAAl+M,EAAgB,eAAeu/M,OAAgB/pC,EAAA0oC,EAAG,MAAM,QAAT,MAAA1oC,EAAgB,eAAe,YAAYt2J,CAAI,MAAOu2J,EAAAyoC,EAAG,MAAM,QAAT,MAAAzoC,EAAgB,eAAe,YAAY8pC,CAAS,KAChN,EAAgB,IAAM,SAClB,OAAKjxN,EAAM4wB,CAAI,EACR,CAAC,GAAE3uB,EAAA2tN,EAAG,MAAM,QAAT,MAAA3tN,EAAgB,eAAe2uB,MAASlf,EAAAk+M,EAAG,MAAM,QAAT,MAAAl+M,EAAgB,eAAe,YAAYkf,CAAI,KACrG,CAHG,EAIDggM,GAAe,IAAM,CAACM,EAAa,MAAO,IAAM,CAC9Cj0M,GAAM,IAAMjd,EAAM4wB,CAAI,EAAGr1B,GAAO,CAC9ByqM,EAAS,MAAQzqM,CACvB,CAAK,CACL,CAAG,EACD,MAAMo3I,EAAQ/uI,EAAS,CACrB,KAAM,CACJ,MAAMutN,EAAgBnxN,EAAM4wB,CAAI,EAChC,OAAOmgM,EAAYG,EAAa,MAAQC,EAAgBnrB,EAAS,KAAK,CACvE,EACD,IAAIorB,EAAe,CACjB,MAAM5rN,EAAWwrN,EAAaI,CAAa,EACrCl0N,EAAQmJ,GAAM6qN,EAAa,MAAQlxN,EAAM4wB,CAAI,EAAIo1K,EAAS,KAAK,EACjE9oM,IAAUsI,GAAYurN,EAAY7zN,CAAK,IAAMk0N,IAGjDprB,EAAS,MAAQxgM,EACjBoqN,GAAA,MAAAA,EAAI,KAAK,UAAUh/L,CAAI,GAAIprB,GAC5B,CACL,CAAG,EACD,cAAO,eAAemtI,EAAO,gBAAiB,CAC5C,IAAK,IAAMu+E,EAAa,MAAQlxN,EAAM4wB,CAAI,EAAIo1K,EAAS,KAC3D,CAAG,EACMrzD,CACT,CC3CA,MAAe0+E,IAAA,CACb,MAAO,QACP,KAAM,OACN,MAAO,QACP,QAAS,UACT,YAAa,CACX,GAAI,KACJ,OAAQ,QACT,EACD,aAAc,CACZ,cAAe,4BACf,YAAa,kBACd,EACD,UAAW,CACT,iBAAkB,iBAClB,UAAW,CACT,eAAgB,qBAChB,cAAe,oBACf,SAAU,cACV,aAAc,8BACd,mBAAoB,+BACpB,kBAAmB,6BACpB,EACD,OAAQ,SACT,EACD,WAAY,CACV,iBAAkB,kBAClB,gBAAiB,MACjB,SAAU,YACV,SAAU,gBACV,UAAW,aACX,SAAU,YACV,SAAU,gBACX,EACD,eAAgB,CACd,QAAS,IACV,EACD,WAAY,CACV,cAAe,eACf,MAAO,CACL,MAAO,eACP,OAAQ,aACT,EACD,MAAO,cACP,OAAQ,aACR,MAAO,CACL,YAAa,YACd,CACF,EACD,WAAY,oBACZ,SAAU,CACR,KAAM,kBACN,KAAM,cACN,UAAW,CACT,UAAW,2BACZ,CACF,EACD,SAAU,CACR,WAAY,WACZ,MAAO,OACR,EACD,MAAO,CACL,MAAO,YACP,cAAe,uBACf,aAAc,sBACd,IAAK,gCACN,EACD,UAAW,CACT,QAAS,YACT,YAAa,0BACd,EACD,WAAY,CACV,GAAI,KACJ,GAAI,KACJ,MAAO,aACR,EACD,WAAY,CACV,UAAW,CACT,KAAM,wBACN,KAAM,YACN,SAAU,gBACV,KAAM,iBACN,YAAa,yBACb,MAAO,aACP,KAAM,WACP,CACF,EACD,QAAS,CACP,KAAM,OACN,KAAM,UACP,EACD,OAAQ,CACN,UAAW,CACT,KAAM,mBACP,CACF,EACD,QAAS,aACT,eAAgB,CACd,SAAU,YACV,MAAO,SACR,CACH,EChGMC,GAAc,YACdxoG,GAAU,CAAC1tH,EAAKu5C,IACbv5C,EAAI,QAAQ,aAAc,CAACg6B,EAAOnO,IAChC,OAAO0tB,EAAO,CAAC1tB,CAAK,CAAC,CAC7B,EAEGsqM,GAA0B,CAACltM,EAASkD,EAAUqwB,IAC3C,SAAU/7C,EAAK,CACpB,QAAS+gI,EAAO,UAAU,OAAQjoF,EAAS,IAAI,MAAMioF,EAAO,EAAIA,EAAO,EAAI,CAAC,EAAGh7H,EAAO,EAAGA,EAAOg7H,EAAMh7H,IACpG+yC,EAAO/yC,EAAO,CAAC,EAAI,UAAUA,CAAI,EAEnC,GAAI,CAAC/F,EAAI,WAAWy1N,EAAW,EAC7B,OAAOxoG,GAAQjtH,EAAK84C,CAAM,EAE5B,MAAM68K,EAAW31N,EAAI,QAAQy1N,GAAa,EAAE,EACtCG,EAAgBptM,EAAQ,OAASuzB,EAAS,MAAMvzB,EAAQ,KAAK,EAC7DqtM,EAAiBnqM,EAAS,OAASqwB,EAAS,MAAMrwB,EAAS,KAAK,EACtE,IAAInsB,EAAM6uN,GAAqBwH,EAAeD,EAAU,IAAI,EAC5D,OAAKp2N,IAC6B,GAAAS,IAAsBwoB,EAAQ,QAC9DjpB,EAAM6uN,GAAqByH,EAAgBF,EAAU,IAAI,GAEtDp2N,IAEHA,EAAMS,GAEJ,OAAOT,GAAQ,WAEjBA,EAAMS,GAEDitH,GAAQ1tH,EAAKu5C,CAAM,CAC9B,EAEA,SAASg9K,GAAqBttM,EAASkD,EAAU,CAC/C,MAAO,CAACrqB,EAAO8G,IACQ,IAAI,KAAK,aAAa,CAACqgB,EAAQ,MAAOkD,EAAS,KAAK,EAAGvjB,CAAO,EAC/D,OAAO9G,CAAK,CAEpC,CACA,SAAS00N,GAAY5xN,EAAO4wB,EAAMihM,EAAU,CAC1C,MAAM7rB,EAAW8qB,GAAgB9wN,EAAO4wB,EAAM5wB,EAAM4wB,CAAI,GAAKihM,EAAS,KAAK,EAG3E,OAAA7rB,EAAS,MAAQhmM,EAAM4wB,CAAI,GAAKihM,EAAS,MACzC50M,GAAM40M,EAAU7vN,GAAK,CACfhC,EAAM4wB,CAAI,GAAK,OACjBo1K,EAAS,MAAQ6rB,EAAS,MAEhC,CAAG,EACM7rB,CACT,CACA,SAAS8rB,GAAsBtyM,EAAO,CACpC,OAAOxf,GAAS,CACd,MAAMqkB,EAAUutM,GAAY5xN,EAAO,SAAUwf,EAAM,OAAO,EACpD+H,EAAWqqM,GAAY5xN,EAAO,WAAYwf,EAAM,QAAQ,EACxDo4B,EAAWg6K,GAAY5xN,EAAO,WAAYwf,EAAM,QAAQ,EAC9D,MAAO,CACL,KAAM,UACN,QAAA6E,EACA,SAAAkD,EACA,SAAAqwB,EACA,EAAG25K,GAAwBltM,EAASkD,EAAUqwB,CAAQ,EACtD,EAAG+5K,GAAqBttM,EAASkD,CAAQ,EACzC,QAASuqM,GAAsB,CAC7B,QAAAztM,EACA,SAAAkD,EACA,SAAAqwB,CACR,CAAO,CACP,CACA,CACA,CACO,SAASm6K,IAAqB/tN,EAAS,CAC5C,MAAMqgB,EAAU3X,IAAW1I,GAAA,YAAAA,EAAS,SAAU,IAAI,EAC5CujB,EAAW7a,IAAW1I,GAAA,YAAAA,EAAS,WAAY,IAAI,EAC/C4zC,EAAWprC,EAAI,CACnB,GAAA6kN,IACA,GAAGrtN,GAAA,YAAAA,EAAS,QAChB,CAAG,EACD,MAAO,CACL,KAAM,UACN,QAAAqgB,EACA,SAAAkD,EACA,SAAAqwB,EACA,EAAG25K,GAAwBltM,EAASkD,EAAUqwB,CAAQ,EACtD,EAAG+5K,GAAqBttM,EAASkD,CAAQ,EACzC,QAASuqM,GAAsB,CAC7B,QAAAztM,EACA,SAAAkD,EACA,SAAAqwB,CACN,CAAK,CACL,CACA,CC7FO,MAAMo6K,GAAe,OAAO,IAAI,gBAAgB,EACvD,SAASC,IAAiBxzN,EAAK,CAC7B,OAAOA,EAAI,MAAQ,IACrB,CACO,SAASyzN,IAAaluN,EAAS,CACpC,MAAMmuN,EAAOnuN,GAAA,MAAAA,EAAS,SAAWiuN,IAAiBjuN,GAAA,YAAAA,EAAS,OAAO,EAAIA,GAAA,YAAAA,EAAS,QAAU+tN,IAAqB/tN,CAAO,EAC/G6wL,EAAMu9B,IAAUD,EAAMnuN,CAAO,EACnC,MAAO,CACL,GAAGmuN,EACH,GAAGt9B,CACP,CACA,CACO,SAASw9B,KAAY,CAC1B,MAAMC,EAAS31M,GAAOq1M,EAAY,EAClC,GAAI,CAACM,EAAQ,MAAM,IAAI,MAAM,mDAAmD,EAChF,OAAOA,CACT,CAiBA,SAASC,KAAc,CACrB,MAAO,CACL,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,IAAK,GACL,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,OAAQ,GACR,OAAQ,GACR,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,OAAQ,GACR,OAAQ,EACZ,CACA,CACO,SAASH,IAAUD,EAAMnuN,EAAS,CACvC,MAAM6wL,EAAMroL,GAAIxI,GAAA,YAAAA,EAAS,MAAOuuN,IAAa,CAAA,EACvCC,EAAQ5uN,EAAS,IAAMixL,EAAI,MAAMs9B,EAAK,QAAQ,KAAK,GAAK,EAAK,EACnE,MAAO,CACL,MAAAK,EACA,IAAA39B,EACA,WAAYjxL,EAAS,IAAM,gBAAgB4uN,EAAM,MAAQ,MAAQ,KAAK,EAAE,CAC5E,CACA,CASO,SAASC,IAAS,CACvB,MAAMH,EAAS31M,GAAOq1M,EAAY,EAClC,GAAI,CAACM,EAAQ,MAAM,IAAI,MAAM,gDAAgD,EAC7E,MAAO,CACL,MAAOA,EAAO,MACd,WAAYA,EAAO,UACvB,CACA,CCvGO,MAAMI,GAAc,OAAO,IAAI,eAAe,EACxCC,GAAiB/I,GAAa,CACzC,MAAO,MACT,EAAG,OAAO,EACV,SAAS2I,IAAc,CACrB,MAAO,CACL,aAAc,QACd,WAAY,CACV,OAAQ,CAAE,EACV,QAAS,EACT,OAAQ,CACT,EACD,OAAQ,CACN,MAAO,CACL,KAAM,GACN,OAAQ,CACN,WAAY,UACZ,QAAS,UACT,iBAAkB,UAClB,gBAAiB,UACjB,kBAAmB,UACnB,qBAAsB,UACtB,QAAS,UACT,mBAAoB,UACpB,UAAW,UACX,qBAAsB,UACtB,MAAO,UACP,KAAM,UACN,QAAS,UACT,QAAS,SACV,EACD,UAAW,CACT,eAAgB,UAChB,iBAAkB,IAClB,wBAAyB,IACzB,0BAA2B,GAC3B,mBAAoB,IACpB,eAAgB,IAChB,gBAAiB,IACjB,gBAAiB,IACjB,mBAAoB,IACpB,oBAAqB,IACrB,kBAAmB,IACnB,kBAAmB,IACnB,YAAa,UACb,eAAgB,UAChB,aAAc,UACd,gBAAiB,SAClB,CACF,EACD,KAAM,CACJ,KAAM,GACN,OAAQ,CACN,WAAY,UACZ,QAAS,UACT,iBAAkB,UAClB,gBAAiB,UACjB,kBAAmB,UACnB,qBAAsB,UACtB,QAAS,UACT,mBAAoB,UACpB,UAAW,UACX,qBAAsB,UACtB,MAAO,UACP,KAAM,UACN,QAAS,UACT,QAAS,SACV,EACD,UAAW,CACT,eAAgB,UAChB,iBAAkB,IAClB,wBAAyB,EACzB,0BAA2B,GAC3B,mBAAoB,GACpB,eAAgB,GAChB,gBAAiB,IACjB,gBAAiB,IACjB,mBAAoB,IACpB,oBAAqB,IACrB,kBAAmB,IACnB,kBAAmB,IACnB,YAAa,UACb,eAAgB,UAChB,aAAc,UACd,gBAAiB,SAClB,CACF,CACF,CACL,CACA,CACA,SAASK,KAAoB,SAC3B,IAAI5uN,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIuuN,GAAW,EAC7F,MAAMjpM,EAAWipM,KACjB,GAAI,CAACvuN,EAAS,MAAO,CACnB,GAAGslB,EACH,WAAY,EAChB,EACE,MAAMupM,EAAS,CAAA,EACf,SAAW,CAACh3N,EAAKi3N,CAAK,IAAK,OAAO,QAAQ9uN,EAAQ,QAAU,CAAA,CAAE,EAAG,CAC/D,MAAM+uN,EAAeD,EAAM,MAAQj3N,IAAQ,QAASoG,EAAAqnB,EAAS,SAAT,YAAArnB,EAAiB,MAAOyP,EAAA4X,EAAS,SAAT,YAAA5X,EAAiB,MAC7FmhN,EAAOh3N,CAAG,EAAI6uN,GAAUqI,EAAcD,CAAK,CAC5C,CACD,OAAOpI,GAAUphM,EAAU,CACzB,GAAGtlB,EACH,OAAA6uN,CACJ,CAAG,CACH,CAGO,SAASG,IAAYhvN,EAAS,CACnC,MAAM82E,EAAgB83I,IAAkB5uN,CAAO,EACzClE,EAAO0M,EAAIsuE,EAAc,YAAY,EACrC+3I,EAASrmN,EAAIsuE,EAAc,MAAM,EACjCm4I,EAAiBrvN,EAAS,IAAM,CACpC,MAAM+nF,EAAM,CAAA,EACZ,SAAW,CAAC7rF,EAAMozN,CAAQ,IAAK,OAAO,QAAQL,EAAO,KAAK,EAAG,CAC3D,MAAMC,EAAQnnI,EAAI7rF,CAAI,EAAI,CACxB,GAAGozN,EACH,OAAQ,CACN,GAAGA,EAAS,MACb,CACT,EACM,GAAIp4I,EAAc,WAChB,UAAWh7E,KAAQg7E,EAAc,WAAW,OAAQ,CAClD,MAAM+yI,EAAQiF,EAAM,OAAOhzN,CAAI,EAC/B,GAAK+tN,EACL,UAAWhzF,IAAa,CAAC,UAAW,QAAQ,EAAG,CAC7C,MAAMp9H,EAAKo9H,IAAc,UAAYi0F,IAAUK,IAC/C,UAAWnxE,KAAU5lC,GAAYt9B,EAAc,WAAW+/C,CAAS,EAAG,CAAC,EACrEi4F,EAAM,OAAO,GAAGhzN,CAAI,IAAI+6H,CAAS,IAAImjB,CAAM,EAAE,EAAI4wE,IAASnxN,EAAG0wN,GAAWN,CAAK,EAAG7vE,CAAM,CAAC,CAE1F,CACF,CAEH,UAAW6vE,KAAS,OAAO,KAAKiF,EAAM,MAAM,EAAG,CAC7C,GAAI,YAAY,KAAKjF,CAAK,GAAKiF,EAAM,OAAO,MAAMjF,CAAK,EAAE,EAAG,SAC5D,MAAMsF,EAAU,MAAMtF,CAAK,GACrBuF,EAAWjF,GAAW2E,EAAM,OAAOjF,CAAK,CAAC,EAC/CiF,EAAM,OAAOK,CAAO,EAAI9D,GAAc+D,CAAQ,CAC/C,CACF,CACD,OAAOznI,CACX,CAAG,EACKtnE,EAAUzgB,EAAS,IAAMqvN,EAAe,MAAMnzN,EAAK,KAAK,CAAC,EACzD0mC,EAAS5iC,EAAS,IAAM,OAC5B,MAAM8lJ,EAAQ,CAAA,GACVznJ,EAAAoiB,EAAQ,QAAR,MAAApiB,EAAe,MACjBoxN,GAAe3pE,EAAO,QAAS,CAAC,oBAAoB,CAAC,EAEvD2pE,GAAe3pE,EAAO,QAAS4pE,GAAgBjvM,EAAQ,KAAK,CAAC,EAC7D,SAAW,CAACkvM,EAAWT,CAAK,IAAK,OAAO,QAAQG,EAAe,KAAK,EAClEI,GAAe3pE,EAAO,aAAa6pE,CAAS,GAAI,CAAC,iBAAiBT,EAAM,KAAO,OAAS,QAAQ,GAAI,GAAGQ,GAAgBR,CAAK,CAAC,CAAC,EAEhI,MAAMU,EAAU,CAAA,EACVC,EAAU,CAAA,EACVC,EAAS,IAAI,IAAI,OAAO,OAAOT,EAAe,KAAK,EAAE,QAAQH,GAAS,OAAO,KAAKA,EAAM,MAAM,CAAC,CAAC,EACtG,UAAWj3N,KAAO63N,EACZ,YAAY,KAAK73N,CAAG,EACtBw3N,GAAeI,EAAS,IAAI53N,CAAG,GAAI,CAAC,4BAA4BA,CAAG,eAAe,CAAC,GAEnFw3N,GAAeG,EAAS,OAAO33N,CAAG,GAAI,CAAC,+CAA+CA,CAAG,uBAAwB,uCAAuCA,CAAG,gBAAiB,+BAA+BA,CAAG,eAAe,CAAC,EAC9Nw3N,GAAeI,EAAS,SAAS53N,CAAG,GAAI,CAAC,4BAA4BA,CAAG,eAAe,CAAC,EACxFw3N,GAAeI,EAAS,WAAW53N,CAAG,GAAI,CAAC,mCAAmCA,CAAG,GAAG,CAAC,GAGzF,OAAA6tJ,EAAM,KAAK,GAAG8pE,EAAS,GAAGC,CAAO,EAC1B/pE,EAAM,IAAI,CAACtuJ,EAAKe,IAAMA,IAAM,EAAIf,EAAM,OAAOA,CAAG,EAAE,EAAE,KAAK,EAAE,CACtE,CAAG,EACD,SAASu4N,GAAU,CACjB,MAAO,CACL,MAAO,CAAC,CACN,SAAUntL,EAAO,MACjB,GAAI,2BACJ,MAAOs0C,EAAc,UAAY,EACzC,CAAO,CACP,CACG,CACD,SAAS84I,EAAQrlM,EAAK,CACpB,GAAIusD,EAAc,WAAY,OAC9B,MAAMnS,EAAOp6C,EAAI,SAAS,SAAS,QACnC,GAAIo6C,EACF,GAAIA,EAAK,KAAM,CACb,MAAM4iB,EAAQ5iB,EAAK,KAAKgrJ,CAAO,EAC3B7J,IACF7sM,GAAMupB,EAAQ,IAAM,CAClB+kD,EAAM,MAAMooI,CAAO,CAC/B,CAAW,CAEX,MACY7J,IACFnhJ,EAAK,YAAY/kE,EAAS+vN,CAAO,CAAC,EAClC/2M,GAAY,IAAM+rD,EAAK,UAAS,CAAE,GAElCA,EAAK,YAAYgrJ,EAAO,CAAE,MAGzB,CASL,IAASE,EAAT,UAAwB,CACtB,GAAI,OAAO,SAAa,KAAe,CAACC,EAAS,CAC/C,MAAM53N,EAAK,SAAS,cAAc,OAAO,EACzCA,EAAG,KAAO,WACVA,EAAG,GAAK,2BACJ4+E,EAAc,UAAU5+E,EAAG,aAAa,QAAS4+E,EAAc,QAAQ,EAC3Eg5I,EAAU53N,EACV,SAAS,KAAK,YAAY43N,CAAO,CAClC,CACGA,IAASA,EAAQ,UAAYttL,EAAO,MACzC,EAVQ,IAAAqtL,IART,IAAIC,EAAUhK,GAAa,SAAS,eAAe,0BAA0B,EAAI,KAC7EA,GACF7sM,GAAMupB,EAAQqtL,EAAc,CAC1B,UAAW,EACrB,CAAS,EAEDA,GAaH,CACF,CACD,MAAME,EAAenwN,EAAS,IAAMk3E,EAAc,WAAa,OAAY,YAAYh7E,EAAK,KAAK,EAAE,EACnG,MAAO,CACL,QAAA8zN,EACA,WAAY94I,EAAc,WAC1B,KAAAh7E,EACA,OAAA+yN,EACA,QAAAxuM,EACA,eAAA4uM,EACA,aAAAc,EACA,OAAAvtL,EACA,OAAQ,CACN,KAAA1mC,EACA,QAAAukB,CACD,CACL,CACA,CACO,SAAS2vM,GAAah0N,EAAO,CAClC8f,GAAmB,cAAc,EACjC,MAAMgzM,EAAQn2M,GAAO+1M,GAAa,IAAI,EACtC,GAAI,CAACI,EAAO,MAAM,IAAI,MAAM,wCAAwC,EACpE,MAAMhzN,EAAO8D,EAAS,IACb5D,EAAM,OAAS8yN,EAAM,KAAK,KAClC,EACKzuM,EAAUzgB,EAAS,IAAMkvN,EAAM,OAAO,MAAMhzN,EAAK,KAAK,CAAC,EACvDi0N,EAAenwN,EAAS,IAAMkvN,EAAM,WAAa,OAAY,YAAYhzN,EAAK,KAAK,EAAE,EACrFm0N,EAAW,CACf,GAAGnB,EACH,KAAAhzN,EACA,QAAAukB,EACA,aAAA0vM,CACJ,EACE,OAAA5nM,GAAQumM,GAAauB,CAAQ,EACtBA,CACT,CAOA,SAASZ,GAAe3pE,EAAOlmH,EAAU5O,EAAS,CAChD80H,EAAM,KAAK,GAAGlmH,CAAQ;AAAA,EAAQ,GAAG5O,EAAQ,IAAIyhB,GAAQ,KAAKA,CAAI;AAAA,CAAK,EAAG;AAAA,CAAK,CAC7E,CACA,SAASi9K,GAAgBR,EAAO,CAC9B,MAAMoB,EAAepB,EAAM,KAAO,EAAI,EAChCqB,EAAcrB,EAAM,KAAO,EAAI,EAC/Bl0I,EAAY,CAAA,EAClB,SAAW,CAAC/iF,EAAKqB,CAAK,IAAK,OAAO,QAAQ41N,EAAM,MAAM,EAAG,CACvD,MAAMnF,EAAMQ,GAAWjxN,CAAK,EAC5B0hF,EAAU,KAAK,aAAa/iF,CAAG,KAAK8xN,EAAI,CAAC,IAAIA,EAAI,CAAC,IAAIA,EAAI,CAAC,EAAE,EACxD9xN,EAAI,WAAW,KAAK,GACvB+iF,EAAU,KAAK,aAAa/iF,CAAG,wBAAwBuzN,IAAQlyN,CAAK,EAAI,IAAOg3N,EAAeC,CAAW,EAAE,CAE9G,CACD,SAAW,CAACt4N,EAAKqB,CAAK,IAAK,OAAO,QAAQ41N,EAAM,SAAS,EAAG,CAC1D,MAAMjF,EAAQ,OAAO3wN,GAAU,UAAYA,EAAM,WAAW,GAAG,EAAIixN,GAAWjxN,CAAK,EAAI,OACjFywN,EAAME,EAAQ,GAAGA,EAAM,CAAC,KAAKA,EAAM,CAAC,KAAKA,EAAM,CAAC,GAAK,OAC3DjvI,EAAU,KAAK,OAAO/iF,CAAG,KAAK8xN,GAAOzwN,CAAK,EAAE,CAC7C,CACD,OAAO0hF,CACT,CCtRO,MAAMw1I,IAAexK,GAAa,CACvC,IAAK,CACH,KAAM,OACN,QAAS,KACV,CACH,EAAG,KAAK,ECLKyK,IAAsBzK,GAAa,CAC9C,SAAU,QACV,MAAO,QACP,YAAa,QACb,cAAe,QACf,KAAM,OACN,OAAQ,MACV,EAAG,YAAY,EACR,SAAS0K,GAAoBx0N,EAAMy0N,EAAQt0M,EAAM,CACtD,OAAOmwM,GAAgB,EAAG,CACxB,KAAAtwN,EACA,MAAOu0N,IAAoB,CACzB,KAAAp0M,EACA,OAAAs0M,CACN,CAAK,EACD,MAAMv0N,EAAOq7E,EAAM,CACjB,GAAI,CACF,MAAAlnE,CACD,EAAGknE,EACJ,MAAMorC,EAAY,CAChB,cAAcvqH,EAAI,CACZ8D,EAAM,SACR9D,EAAG,MAAM,gBAAkB8D,EAAM,OAEpC,EACD,QAAQ9D,EAAI,CACV,GAAI8D,EAAM,cAAe,CACvB,KAAM,CACJ,UAAAw0N,EACA,WAAAC,EACA,YAAA9zB,EACA,aAAA+zB,CACD,EAAGx4N,EACJA,EAAG,yBAA2B,CAC5B,SAAUA,EAAG,MAAM,SACnB,IAAKA,EAAG,MAAM,IACd,KAAMA,EAAG,MAAM,KACf,MAAOA,EAAG,MAAM,MAChB,OAAQA,EAAG,MAAM,MAC/B,EACYA,EAAG,MAAM,SAAW,WACpBA,EAAG,MAAM,IAAM,GAAGs4N,CAAS,KAC3Bt4N,EAAG,MAAM,KAAO,GAAGu4N,CAAU,KAC7Bv4N,EAAG,MAAM,MAAQ,GAAGykM,CAAW,KAC/BzkM,EAAG,MAAM,OAAS,GAAGw4N,CAAY,IAClC,CACG10N,EAAM,aACR9D,EAAG,MAAM,YAAY,UAAW,OAAQ,WAAW,CAEtD,EACD,aAAaA,EAAI,CACf,GAAI8D,EAAM,gBAAiB9D,GAAA,MAAAA,EAAI,0BAA0B,CACvD,KAAM,CACJ,SAAAshE,EACA,IAAA45D,EACA,KAAAG,EACA,MAAA/jE,EACA,OAAA63B,CACd,EAAgBnvF,EAAG,yBACP,OAAOA,EAAG,yBACVA,EAAG,MAAM,SAAWshE,GAAY,GAChCthE,EAAG,MAAM,IAAMk7H,GAAO,GACtBl7H,EAAG,MAAM,KAAOq7H,GAAQ,GACxBr7H,EAAG,MAAM,MAAQs3D,GAAS,GAC1Bt3D,EAAG,MAAM,OAASmvF,GAAU,EAC7B,CACF,CACT,EACM,MAAO,IAAM,CACX,MAAM/nD,EAAMtjC,EAAM,MAAQ6sC,GAAkB/I,GAC5C,OAAOrX,GAAE6W,EAAK,CACZ,KAAMtjC,EAAM,SAAW,GAAKF,EAC5B,IAAK,CAACE,EAAM,SACZ,GAAIA,EAAM,MAAQ,OAAY,CAC5B,KAAMA,EAAM,IACxB,EACU,GAAIA,EAAM,SAAW,CAAE,EAAGymH,CACpC,EAAWtyG,EAAM,OAAO,CACxB,CACK,CACL,CAAG,CACH,CACO,SAASwgN,GAA2B70N,EAAM2mH,EAAW,CAC1D,IAAIxmG,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,SAC/E,OAAOmwM,GAAgB,EAAG,CACxB,KAAAtwN,EACA,MAAO,CACL,KAAM,CACJ,KAAM,OACN,QAASmgB,CACV,EACD,SAAU,QACV,MAAO,OACR,EACD,MAAMjgB,EAAO4+H,EAAO,CAClB,GAAI,CACF,MAAAzqH,CACD,EAAGyqH,EACJ,MAAMt7F,EAAMtjC,EAAM,MAAQ6sC,GAAkB/I,GAC5C,MAAO,IACErX,GAAE6W,EAAK,CACZ,KAAMtjC,EAAM,SAAW,GAAKF,EAC5B,IAAK,CAACE,EAAM,SAEZ,GAAIA,EAAM,SAAW,CAAE,EAAGymH,CACpC,EAAWtyG,EAAM,OAAO,CAEnB,CACL,CAAG,CACH,CC9Ge,SAAAygN,IAAY,CACzB,IAAIC,EAAsB,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,GAE9F,MAAMC,GADE,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,IACnD,QAAU,SAC7BC,EAAiBn3N,GAAS,UAAUk3N,CAAY,EAAE,EACxD,MAAO,CACL,cAAc54N,EAAI,CAChBA,EAAG,QAAUA,EAAG,WAChBA,EAAG,cAAgB,CACjB,WAAYA,EAAG,MAAM,WACrB,SAAUA,EAAG,MAAM,SACnB,CAAC44N,CAAY,EAAG54N,EAAG,MAAM44N,CAAY,CAC7C,CACK,EACD,QAAQ54N,EAAI,CACV,MAAM84N,EAAe94N,EAAG,cACxBA,EAAG,MAAM,YAAY,aAAc,OAAQ,WAAW,EAEtDA,EAAG,MAAM,SAAW,SACpB,MAAM26C,EAAS,GAAG36C,EAAG64N,CAAc,CAAC,KACpC74N,EAAG,MAAM44N,CAAY,EAAI,IACpB54N,EAAG,aAERA,EAAG,MAAM,WAAa84N,EAAa,WAC/BH,GAAuB34N,EAAG,SAC5BA,EAAG,QAAQ,UAAU,IAAI24N,CAAmB,EAE9C,sBAAsB,IAAM,CAC1B34N,EAAG,MAAM44N,CAAY,EAAIj+K,CACjC,CAAO,CACF,EACD,aAAco+K,EACd,iBAAkBA,EAClB,QAAQ/4N,EAAI,CACVA,EAAG,cAAgB,CACjB,WAAY,GACZ,SAAUA,EAAG,MAAM,SACnB,CAAC44N,CAAY,EAAG54N,EAAG,MAAM44N,CAAY,CAC7C,EACM54N,EAAG,MAAM,SAAW,SACpBA,EAAG,MAAM44N,CAAY,EAAI,GAAG54N,EAAG64N,CAAc,CAAC,KACzC74N,EAAG,aAER,sBAAsB,IAAMA,EAAG,MAAM44N,CAAY,EAAI,GAAG,CACzD,EACD,aAAArzM,EACA,iBAAkBA,CACtB,EACE,SAASA,EAAavlB,EAAI,CACpB24N,GAAuB34N,EAAG,SAC5BA,EAAG,QAAQ,UAAU,OAAO24N,CAAmB,EAEjDI,EAAY/4N,CAAE,CACf,CACD,SAAS+4N,EAAY/4N,EAAI,CACvB,MAAMuM,EAAOvM,EAAG,cAAc44N,CAAY,EAC1C54N,EAAG,MAAM,SAAWA,EAAG,cAAc,SACjCuM,GAAQ,OAAMvM,EAAG,MAAM44N,CAAY,EAAIrsN,GAC3C,OAAOvM,EAAG,aACX,CACH,CC5D8Bo4N,GAAoB,iBAAkB,gBAAiB,QAAQ,EAGtDA,GAAoB,0BAA0B,EACjDA,GAAoB,uBAAuB,EAChDA,GAAoB,iBAAiB,EAC7D,MAAMY,IAAmBZ,GAAoB,kBAAkB,EACpCA,GAAoB,qBAAqB,EAClCA,GAAoB,6BAA6B,EACxDA,GAAoB,qBAAqB,EAClCA,GAAoB,6BAA6B,EACzDA,GAAoB,oBAAoB,EACjCA,GAAoB,4BAA4B,EACjF,MAAMa,IAAoBb,GAAoB,oBAAoB,EACjCA,GAAoB,4BAA4B,EAGvDK,GAA2B,oBAAqBC,IAA2B,EAC1ED,GAA2B,sBAAuBC,GAA0B,GAAI,EAAI,CAAC,EChBhH,MAAMQ,IAAqBxL,GAAa,CAC7C,OAAQ,CAAC,OAAQ,MAAM,EACvB,UAAW,CAAC,OAAQ,MAAM,EAC1B,SAAU,CAAC,OAAQ,MAAM,EACzB,UAAW,CAAC,OAAQ,MAAM,EAC1B,SAAU,CAAC,OAAQ,MAAM,EACzB,MAAO,CAAC,OAAQ,MAAM,CACxB,EAAG,WAAW,EACP,SAASyL,IAAar1N,EAAO,CASlC,MAAO,CACL,gBATsB4D,EAAS,KAAO,CACtC,OAAQsmN,GAAclqN,EAAM,MAAM,EAClC,UAAWkqN,GAAclqN,EAAM,SAAS,EACxC,SAAUkqN,GAAclqN,EAAM,QAAQ,EACtC,UAAWkqN,GAAclqN,EAAM,SAAS,EACxC,SAAUkqN,GAAclqN,EAAM,QAAQ,EACtC,MAAOkqN,GAAclqN,EAAM,KAAK,CACjC,EAAC,CAGJ,CACA,CCpBO,SAASs1N,GAAS5B,EAAQ,CAC/B,OAAOzI,GAAiB,IAAM,CAC5B,MAAMp5B,EAAU,CAAA,EACVrrJ,EAAS,CAAA,EACf,GAAIktL,EAAO,MAAM,WACf,GAAI9F,GAAW8F,EAAO,MAAM,UAAU,GAEpC,GADAltL,EAAO,gBAAkBktL,EAAO,MAAM,WAClC,CAACA,EAAO,MAAM,MAAQ5F,IAAgB4F,EAAO,MAAM,UAAU,EAAG,CAClE,MAAM6B,EAAkBpH,GAAWuF,EAAO,MAAM,UAAU,EAC1D,GAAI6B,EAAgB,GAAK,MAAQA,EAAgB,IAAM,EAAG,CACxD,MAAMC,EAAYnG,GAAckG,CAAe,EAC/C/uL,EAAO,MAAQgvL,EACfhvL,EAAO,WAAagvL,CACrB,CACF,OAED3jC,EAAQ,KAAK,MAAM6hC,EAAO,MAAM,UAAU,EAAE,EAGhD,OAAIA,EAAO,MAAM,OACX9F,GAAW8F,EAAO,MAAM,IAAI,GAC9BltL,EAAO,MAAQktL,EAAO,MAAM,KAC5BltL,EAAO,WAAaktL,EAAO,MAAM,MAEjC7hC,EAAQ,KAAK,QAAQ6hC,EAAO,MAAM,IAAI,EAAE,GAGrC,CACL,aAAc7hC,EACd,YAAarrJ,CACnB,CACA,CAAG,CACH,CACO,SAASivL,GAAaz1N,EAAOF,EAAM,CACxC,MAAM4zN,EAAS9vN,EAAS,KAAO,CAC7B,KAAMqD,GAAMjH,CAAK,EAAIA,EAAM,MAAQF,EAAOE,EAAMF,CAAI,EAAI,IACzD,EAAC,EACI,CACJ,aAAc41N,EACd,YAAaC,CACjB,EAAML,GAAS5B,CAAM,EACnB,MAAO,CACL,iBAAAgC,EACA,gBAAAC,CACJ,CACA,CACO,SAASC,GAAmB51N,EAAOF,EAAM,CAC9C,MAAM4zN,EAAS9vN,EAAS,KAAO,CAC7B,WAAYqD,GAAMjH,CAAK,EAAIA,EAAM,MAAQF,EAAOE,EAAMF,CAAI,EAAI,IAC/D,EAAC,EACI,CACJ,aAAc+1N,EACd,YAAaC,CACjB,EAAMR,GAAS5B,CAAM,EACnB,MAAO,CACL,uBAAAmC,EACA,sBAAAC,CACJ,CACA,CC1DO,MAAMC,IAAmBnM,GAAa,CAC3C,QAAS,CACP,KAAM,CAAC,QAAS,OAAQ,MAAM,EAC9B,QAAS,MACV,EACD,KAAM,OACR,EAAG,SAAS,EACL,SAASoM,IAAWh2N,EAAO,CAChC,IAAIF,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIywN,GAAsB,EAgBrG,MAAO,CACL,eAhBqB3sN,EAAS,IAAM,CACpC,MAAMqyN,EAAUhvN,GAAMjH,CAAK,EAAIA,EAAM,MAAQA,EAAM,QAC7Ck2N,EAAOjvN,GAAMjH,CAAK,EAAIA,EAAM,MAAQA,EAAM,KAC1C6xL,EAAU,CAAA,EAChB,GAAIokC,IAAY,IAAQA,IAAY,GAClCpkC,EAAQ,KAAK,GAAG/xL,CAAI,WAAW,UACtB,OAAOm2N,GAAY,UAAYA,IAAY,EACpD,UAAW/4N,KAAS,OAAO+4N,CAAO,EAAE,MAAM,GAAG,EAC3CpkC,EAAQ,KAAK,WAAW30L,CAAK,EAAE,OAExBg5N,GAAQD,IAAY,KAC7BpkC,EAAQ,KAAK,WAAW,EAE1B,OAAOA,CACX,CAAG,CAGH,CACA,CC5BO,MAAMwiC,IAAsBzK,GAAa,CAC9C,WAAY,CACV,KAAM,CAAC,QAAS,OAAQ,MAAM,EAC9B,QAAS,kBACT,UAAWruN,GAAOA,IAAQ,EAC3B,CACH,EAAG,YAAY,EACF46N,IAAkB,CAACn2N,EAAOq7E,IAAS,CAC9C,GAAI,CACF,MAAAlnE,CACD,EAAGknE,EACJ,KAAM,CACJ,WAAA7mD,EACA,SAAA0I,EACA,MAAAkiF,EACA,GAAGyE,CACJ,EAAG7jH,EACE,CACJ,UAAAoW,EAAYgpG,EAAQvyE,GAAkB/I,GACtC,GAAGo8B,CACJ,EAAG,OAAO1rC,GAAe,SAAWA,EAAa,CAAA,EAClD,OAAO/H,GAAErW,EAAWkpB,GAAW,OAAO9K,GAAe,SAAW,CAC9D,KAAM0I,EAAW,GAAK1I,CAC1B,EAAM0rC,EAAa,OAAO1rC,GAAe,SAAW,CAAE,EAAG,OAAO,YAAY,OAAO,QAAQ,CACvF,SAAA0I,EACA,MAAAkiF,CACJ,CAAG,EAAE,OAAOwf,GAAS,CACjB,GAAI,CAAC/gI,EAAGmE,CAAC,EAAI48H,EACb,OAAO58H,IAAM,MACd,CAAA,CAAC,EAAG6hH,CAAI,EAAG1vG,CAAK,CACnB,EC7BaiiN,IAAqBxM,GAAa,CAC7C,UAAW,CACT,KAAM,CAAC,OAAQ,MAAM,EACrB,UAAU5nN,EAAG,CACX,MAAM9E,EAAQ,SAAS8E,CAAC,EACxB,MAAO,CAAC,MAAM9E,CAAK,GAAKA,GAAS,GAGjCA,GAAS,EACV,CACF,CACH,EAAG,WAAW,EACP,SAASm5N,IAAar2N,EAAO,CAQlC,MAAO,CACL,iBARuB4D,EAAS,IAAM,CACtC,MAAM0yN,EAAYrvN,GAAMjH,CAAK,EAAIA,EAAM,MAAQA,EAAM,UAC/C6xL,EAAU,CAAA,EAChB,OAAIykC,GAAa,MACjBzkC,EAAQ,KAAK,aAAaykC,CAAS,EAAE,EAC9BzkC,CACX,CAAG,CAGH,CACA,CCxBA,MAAM0kC,IAAmB,CAAC,KAAM,UAAW,cAAe,SAAS,EAMtDC,IAAmB5M,GAAa,CAC3C,QAAS,CACP,KAAM,OACN,QAAS,UACT,UAAW5nN,GAAKu0N,IAAiB,SAASv0N,CAAC,CAC5C,CACH,EAAG,SAAS,EACL,SAASy0N,IAAWz2N,EAAO,CAChC,IAAIF,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIywN,GAAsB,EAIrG,MAAO,CACL,eAJqB3sN,EAAS,IACvB,GAAG9D,CAAI,aAAaE,EAAM,OAAO,EACzC,CAGH,CACA,CClBA,MAAM02N,IAAU,CACd,SAAU,iBACV,SAAU,YACV,OAAQ,mBACR,MAAO,YACP,OAAQ,mBAER,MAAO,mBACP,QAAS,mBACT,KAAM,kBACN,QAAS,mBACT,MAAO,mBACP,KAAM,mBACN,KAAM,oBACN,WAAY,sBACZ,YAAa,6BACb,sBAAuB,gBACvB,UAAW,aAEX,QAAS,eACT,SAAU,iBACV,OAAQ,mBACR,KAAM,WACN,SAAU,gBACV,SAAU,gBACV,QAAS,sBACT,SAAU,qBACV,KAAM,aACN,YAAa,mBACb,WAAY,WACZ,WAAY,qBACZ,QAAS,aACT,MAAO,iBACP,KAAM,gBACN,OAAQ,6BACR,KAAM,gBACN,KAAM,WACN,MAAO,YACP,SAAU,eACV,iBAAkB,gBAClB,eAAgB,iBAChB,WAAY,gBACd,EACMC,IAAM,CAEV,UAAW32N,GAASysB,GAAEmqM,GAAY,CAChC,GAAG52N,EACH,MAAO,KACX,CAAG,CACH,EClDa62N,GAAY,CAAC,OAAQ,SAAU,OAAQ,KAAK,EAC5CC,GAAa,OAAO,IAAI,eAAe,EACvCC,GAAgBnN,GAAa,CACxC,KAAM,CACJ,KAAMiN,EACP,EAED,IAAK,CACH,KAAM,OACN,SAAU,EACX,CACH,EAAG,MAAM,EACIG,GAAiB5G,GAAgB,EAAG,CAC/C,KAAM,iBACN,MAAO2G,GAAe,EACtB,MAAM/2N,EAAOq7E,EAAM,CACjB,GAAI,CACF,MAAAlnE,CACD,EAAGknE,EACJ,MAAO,IAAM,CACX,MAAM47I,EAAOj3N,EAAM,KACnB,OAAO8+B,EAAa9+B,EAAM,IAAK,KAAM,CACnC,QAAS,IAAM,OAAA,OAACA,EAAM,KAAO8+B,EAAam4L,EAAM,KAAM,IAAI,GAAIh1N,EAAAkS,EAAM,UAAN,YAAAlS,EAAA,KAAAkS,EAAiB,EACvF,CAAO,CACP,CACG,CACH,CAAC,EACY+iN,GAAWr0M,GAAgB,CACtC,KAAM,WACN,aAAc,GACd,MAAOk0M,GAAe,EACtB,MAAM/2N,EAAO4+H,EAAO,CAClB,GAAI,CACF,MAAAxqH,CACD,EAAGwqH,EACJ,MAAO,IACE9/F,EAAa9+B,EAAM,IAAKm3N,GAAY/iN,EAAO,CAChD,MAAS,IACjB,CAAO,EAAG,CACF,QAAS,IAAM,CAAC0qB,EAAa,MAAO,CAClC,MAAS,cACT,MAAS,6BACT,QAAW,YACX,KAAQ,MACR,cAAe,MACzB,EAAW,CAAC,MAAM,QAAQ9+B,EAAM,IAAI,EAAIA,EAAM,KAAK,IAAIye,GAAQ,MAAM,QAAQA,CAAI,EAAIqgB,EAAa,OAAQ,CAChG,EAAKrgB,EAAK,CAAC,EACX,eAAgBA,EAAK,CAAC,CAChC,EAAW,IAAI,EAAIqgB,EAAa,OAAQ,CAC9B,EAAKrgB,CACN,EAAE,IAAI,CAAC,EAAIqgB,EAAa,OAAQ,CAC/B,EAAK9+B,EAAM,IACrB,EAAW,IAAI,CAAC,CAAC,CAAC,CAClB,CAAO,CAEJ,CACH,CAAC,EAC4B6iB,GAAgB,CAC3C,KAAM,gBACN,MAAOk0M,GAAe,EACtB,MAAM/2N,EAAO,CACX,MAAO,IACE8+B,EAAa9+B,EAAM,IAAK,KAAM,CACnC,QAAS,IAAM,CAACA,EAAM,IAAI,CAClC,CAAO,CAEJ,CACH,CAAC,EACM,MAAM42N,GAAa/zM,GAAgB,CACxC,KAAM,aACN,MAAOk0M,GAAe,EACtB,MAAM/2N,EAAO,CACX,MAAO,IACE8+B,EAAa9+B,EAAM,IAAK,CAC7B,MAASA,EAAM,IAChB,EAAE,IAAI,CAEV,CACH,CAAC,EACD,SAASuyN,KAAc,CACrB,MAAO,CACL,IAAK,CACH,UAAW2E,EACZ,EACD,MAAO,CACL,UAAWN,EACZ,CACL,CACA,CAGO,SAASQ,IAAYpzN,EAAS,CACnC,MAAM24M,EAAO4V,MACP8E,GAAarzN,GAAA,YAAAA,EAAS,aAAc,MAC1C,OAAIqzN,IAAe,OAAS,CAAC1a,EAAK,MAChCA,EAAK,IAAMga,KAENjM,GAAU,CACf,WAAA2M,EACA,KAAA1a,EACA,QAAS,CACP,GAAG+Z,IAEH,QAAS,CAAC,qDAAsD,CAAC,yFAA0F,EAAG,CAAC,EAC/J,kBAAmB,gJACnB,eAAgB,CAAC,uYAAwY,CAAC,qdAAsd,EAAG,CAAC,CAEr3B,CACF,EAAE1yN,CAAO,CACZ,CACO,MAAMszN,IAAUt3N,GAAS,CAC9B,MAAMi1D,EAAQt4C,GAAOm6M,EAAU,EAC/B,GAAI,CAAC7hK,EAAO,MAAM,IAAI,MAAM,gCAAgC,EAiC5D,MAAO,CACL,SAjCerxD,EAAS,IAAM,OAC9B,MAAM2zN,EAAYvqN,EAAMhN,CAAK,EAC7B,GAAI,CAACu3N,EAAW,MAAO,CACrB,UAAWP,EACjB,EACI,IAAIQ,EAAOD,EAQX,GAPI,OAAOC,GAAS,WAClBA,EAAOA,EAAK,OACRA,EAAK,WAAW,GAAG,IACrBA,GAAOv1N,EAAAgzD,EAAM,UAAN,YAAAhzD,EAAgBu1N,EAAK,MAAM,CAAC,KAInC,MAAM,QAAQA,CAAI,EACpB,MAAO,CACL,UAAWN,GACX,KAAAM,CACR,EACW,GAAI,OAAOA,GAAS,SACzB,MAAO,CACL,UAAWR,GACX,KAAAQ,CACR,EAEI,MAAMC,EAAc,OAAO,KAAKxiK,EAAM,IAAI,EAAE,KAAKyiK,GAAW,OAAOF,GAAS,UAAYA,EAAK,WAAW,GAAGE,CAAO,GAAG,CAAC,EAChHC,EAAWF,EAAcD,EAAK,MAAMC,EAAY,OAAS,CAAC,EAAID,EAEpE,MAAO,CACL,UAFcviK,EAAM,KAAKwiK,GAAexiK,EAAM,UAAU,EAErC,UACnB,KAAM0iK,CACZ,CACA,CAAG,CAGH,CACA,ECvJMC,IAAkB,CAAC,UAAW,QAAS,UAAW,QAAS,SAAS,EAE7DC,IAAgBjO,GAAa,CACxC,KAAM,CACJ,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,SACV,CACH,EAAG,MAAM,EACF,SAASkO,IAAQ93N,EAAO,CAC7B,IAAIF,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIywN,GAAsB,EACrG,OAAOtF,GAAiB,IAAM,CAC5B,IAAI8M,EACAC,EACJ,OAAInvH,IAAS+uH,IAAiB53N,EAAM,IAAI,EACtC+3N,EAAc,GAAGj4N,CAAI,UAAUE,EAAM,IAAI,GAChCA,EAAM,OACfg4N,EAAa,CACX,MAAO9N,GAAclqN,EAAM,IAAI,EAC/B,OAAQkqN,GAAclqN,EAAM,IAAI,CACxC,GAEW,CACL,YAAA+3N,EACA,WAAAC,CACN,CACA,CAAG,CACH,CCfO,MAAMC,IAAiBrO,GAAa,CACzC,MAAO,OACP,SAAU,QACV,MAAO,QACP,IAAK,QACL,KAAMiN,GACN,GAAGhN,GAAoB,EACvB,GAAGgO,IAAe,EAClB,GAAGzD,IAAa,CACd,IAAK,GACT,CAAG,EACD,GAAGzB,GAAgB,CACrB,EAAG,OAAO,EACGuF,IAAQ9H,GAAgB,EAAG,CACtC,KAAM,QACN,MAAO6H,IAAgB,EACvB,MAAMj4N,EAAOq7E,EAAM,CACjB,GAAI,CACF,MAAAjnE,EACA,MAAAD,CACD,EAAGknE,EACJ,MAAM88I,EAAW3rN,IACX,CACJ,aAAAunN,CACN,EAAQC,GAAah0N,CAAK,EAChB,CACJ,SAAAo4N,CACN,EAAQd,IAAQ1zN,EAAS,IAAMu0N,EAAS,OAASn4N,EAAM,IAAI,CAAC,EAClD,CACJ,YAAA+3N,CACN,EAAQD,IAAQ93N,CAAK,EACX,CACJ,iBAAA01N,EACA,gBAAAC,CACD,EAAGF,GAAaznN,GAAMhO,EAAO,OAAO,CAAC,EACtC,OAAA2wN,GAAU,IAAM,SACd,MAAM0H,GAAYp2N,EAAAkS,EAAM,UAAN,YAAAlS,EAAA,KAAAkS,GACdkkN,IACFF,EAAS,OAAQzmN,EAAAo5M,GAAiBuN,CAAS,EAAE,OAAO18M,GAAQA,EAAK,OAASkY,IAAQlY,EAAK,UAAY,OAAOA,EAAK,UAAa,QAAQ,EAAE,CAAC,IAAtH,YAAAjK,EAAyH,UAE5I,MAAM4mN,EAAW,CAAC,EAAElkN,EAAM,SAAWA,EAAM,aAC3C,OAAO0qB,EAAas5L,EAAS,MAAM,UAAW,CAC5C,IAAOp4N,EAAM,IACb,KAAQo4N,EAAS,MAAM,KACvB,MAAS,CAAC,SAAU,cAAerE,EAAa,MAAOgE,EAAY,MAAOrC,EAAiB,MAAO,CAChG,oBAAqB4C,EACrB,mBAAoBt4N,EAAM,SAC1B,gBAAiBA,EAAM,MACvB,cAAeA,EAAM,GAC/B,EAAWA,EAAM,KAAK,EACd,MAAS,CAAE+3N,EAAY,MAInB,OAJ2B,CAC7B,SAAU7N,GAAclqN,EAAM,IAAI,EAClC,OAAQkqN,GAAclqN,EAAM,IAAI,EAChC,MAAOkqN,GAAclqN,EAAM,IAAI,CAChC,EAAc21N,EAAgB,MAAO31N,EAAM,KAAK,EACjD,KAAQs4N,EAAW,SAAW,OAC9B,cAAe,CAACA,EAChB,SAAYA,EAAWt4N,EAAM,SAAW,GAAK,EAAI,MACzD,EAAS,CACD,QAAS,IAAM,CAACq4N,CAAS,CACjC,CAAO,CACP,CAAK,EACM,EACR,CACH,CAAC,ECxED,MAAME,GAAa,OAAO,YAAY,EAChCC,IAAe,GACrB,SAASv3K,GAAU/kD,EAAIgB,EAAO,CAC5BhB,EAAG,MAAM,UAAYgB,EACrBhB,EAAG,MAAM,gBAAkBgB,CAC7B,CACA,SAASu7N,GAAa,EAAG,CACvB,OAAO,EAAE,YAAY,OAAS,YAChC,CACA,SAASjnK,GAAgB,EAAG,CAC1B,OAAO,EAAE,YAAY,OAAS,eAChC,CACA,MAAMqwJ,IAAY,SAAU,EAAG3lN,EAAI,OACjC,IAAIgB,EAAQ,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC5Ew7N,EAAS,EACTC,EAAS,EACb,GAAI,CAACnnK,GAAgB,CAAC,EAAG,CACvB,MAAM3a,EAAS36C,EAAG,wBACZmJ,EAASozN,GAAa,CAAC,EAAI,EAAE,QAAQ,EAAE,QAAQ,OAAS,CAAC,EAAI,EACnEC,EAASrzN,EAAO,QAAUwxC,EAAO,KACjC8hL,EAAStzN,EAAO,QAAUwxC,EAAO,GAClC,CACD,IAAI+hL,EAAS,EACTC,EAAQ,IACR52N,EAAA/F,EAAG,UAAH,MAAA+F,EAAY,QACd42N,EAAQ,IACRD,EAAS18N,EAAG,YAAc,EAC1B08N,EAAS17N,EAAM,OAAS07N,EAASA,EAAS,KAAK,MAAMF,EAASE,IAAW,GAAKD,EAASC,IAAW,CAAC,EAAI,GAEvGA,EAAS,KAAK,KAAK18N,EAAG,aAAe,EAAIA,EAAG,cAAgB,CAAC,EAAI,EAEnE,MAAM48N,EAAU,IAAI58N,EAAG,YAAc08N,EAAS,GAAK,CAAC,KAC9CG,EAAU,IAAI78N,EAAG,aAAe08N,EAAS,GAAK,CAAC,KAC/CzjJ,EAAIj4E,EAAM,OAAS47N,EAAU,GAAGJ,EAASE,CAAM,KAC/ChpG,EAAI1yH,EAAM,OAAS67N,EAAU,GAAGJ,EAASC,CAAM,KACrD,MAAO,CACL,OAAAA,EACA,MAAAC,EACA,EAAA1jJ,EACA,EAAAy6C,EACA,QAAAkpG,EACA,QAAAC,CACJ,CACA,EACMC,GAAU,CAEd,KAAK,EAAG98N,EAAI,OACV,IAAIgB,EAAQ,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAChF,GAAI,GAAC+E,EAAA/F,GAAA,YAAAA,EAAI,UAAJ,MAAA+F,EAAa,SAChB,OAEF,MAAMiW,EAAY,SAAS,cAAc,MAAM,EACzCo8C,EAAY,SAAS,cAAc,MAAM,EAC/Cp8C,EAAU,YAAYo8C,CAAS,EAC/Bp8C,EAAU,UAAY,sBAClBhb,EAAM,QACRgb,EAAU,WAAa,IAAIhb,EAAM,KAAK,IAExC,KAAM,CACJ,OAAA07N,EACA,MAAAC,EACA,EAAA1jJ,EACA,EAAAy6C,EACA,QAAAkpG,EACA,QAAAC,CACD,EAAGlX,IAAU,EAAG3lN,EAAIgB,CAAK,EACpBuL,EAAO,GAAGmwN,EAAS,CAAC,KAC1BtkK,EAAU,UAAY,sBACtBA,EAAU,MAAM,MAAQ7rD,EACxB6rD,EAAU,MAAM,OAAS7rD,EACzBvM,EAAG,YAAYgc,CAAS,EACxB,MAAMtU,EAAW,OAAO,iBAAiB1H,CAAE,EACvC0H,GAAYA,EAAS,WAAa,WACpC1H,EAAG,MAAM,SAAW,WACpBA,EAAG,QAAQ,iBAAmB,UAEhCo4D,EAAU,UAAU,IAAI,4BAA4B,EACpDA,EAAU,UAAU,IAAI,8BAA8B,EACtDrT,GAAUqT,EAAW,aAAa6gB,CAAC,KAAKy6C,CAAC,aAAaipG,CAAK,IAAIA,CAAK,IAAIA,CAAK,GAAG,EAChFvkK,EAAU,QAAQ,UAAY,OAAO,YAAY,IAAG,CAAE,EACtD,WAAW,IAAM,CACfA,EAAU,UAAU,OAAO,4BAA4B,EACvDA,EAAU,UAAU,IAAI,yBAAyB,EACjDrT,GAAUqT,EAAW,aAAawkK,CAAO,KAAKC,CAAO,kBAAkB,CACxE,EAAE,CAAC,CACL,EACD,KAAK78N,EAAI,OACP,GAAI,GAAC+F,EAAA/F,GAAA,YAAAA,EAAI,UAAJ,MAAA+F,EAAa,SAAS,OAC3B,MAAM+2N,EAAU98N,EAAG,uBAAuB,qBAAqB,EAC/D,GAAI88N,EAAQ,SAAW,EAAG,OAC1B,MAAM1kK,EAAY0kK,EAAQA,EAAQ,OAAS,CAAC,EAC5C,GAAI1kK,EAAU,QAAQ,SAAU,OAAYA,EAAU,QAAQ,SAAW,OACzE,MAAMljD,EAAO,YAAY,IAAK,EAAG,OAAOkjD,EAAU,QAAQ,SAAS,EAC7DlxC,EAAQ,KAAK,IAAI,IAAMhS,EAAM,CAAC,EACpC,WAAW,IAAM,CACfkjD,EAAU,UAAU,OAAO,yBAAyB,EACpDA,EAAU,UAAU,IAAI,0BAA0B,EAClD,WAAW,IAAM,OACCp4D,EAAG,uBAAuB,qBAAqB,EACnD,SAAW,GAAKA,EAAG,QAAQ,mBACrCA,EAAG,MAAM,SAAWA,EAAG,QAAQ,iBAC/B,OAAOA,EAAG,QAAQ,oBAEhB+F,EAAAqyD,EAAU,aAAV,YAAAryD,EAAsB,cAAe/F,GAAIA,EAAG,YAAYo4D,EAAU,UAAU,CACjF,EAAE,GAAG,CACP,EAAElxC,CAAK,CACT,CACH,EACA,SAAS61M,GAAgB/7N,EAAO,CAC9B,OAAO,OAAOA,EAAU,KAAe,CAAC,CAACA,CAC3C,CACA,SAASg8N,GAAW,EAAG,CACrB,MAAMh8N,EAAQ,CAAA,EACRk3D,EAAU,EAAE,cAClB,GAAI,IAACA,GAAA,MAAAA,EAAS,UAAWA,EAAQ,QAAQ,SAAW,EAAEmkK,EAAU,GAIhE,IADA,EAAEA,EAAU,EAAI,GACZE,GAAa,CAAC,EAChBrkK,EAAQ,QAAQ,QAAU,GAC1BA,EAAQ,QAAQ,QAAU,WAMtBA,EAAQ,QAAQ,QAAS,OAM/B,GAJAl3D,EAAM,OAASk3D,EAAQ,QAAQ,UAAY5C,GAAgB,CAAC,EACxD4C,EAAQ,QAAQ,QAClBl3D,EAAM,MAAQk3D,EAAQ,QAAQ,OAE5BqkK,GAAa,CAAC,EAAG,CAEnB,GAAIrkK,EAAQ,QAAQ,gBAAiB,OACrCA,EAAQ,QAAQ,gBAAkB,IAAM,CACtC4kK,GAAQ,KAAK,EAAG5kK,EAASl3D,CAAK,CACpC,EACIk3D,EAAQ,QAAQ,UAAY,OAAO,WAAW,IAAM,QAC9CnyD,EAAAmyD,GAAA,YAAAA,EAAS,UAAT,MAAAnyD,EAAkB,kBACpBmyD,EAAQ,QAAQ,kBAChBA,EAAQ,QAAQ,gBAAkB,KAErC,EAAEokK,GAAY,CACnB,MACIQ,GAAQ,KAAK,EAAG5kK,EAASl3D,CAAK,EAElC,CACA,SAASi8N,GAAW,EAAG,CACrB,EAAEZ,EAAU,EAAI,EAClB,CACA,SAASa,GAAW,EAAG,CACrB,MAAMhlK,EAAU,EAAE,cAClB,GAAKA,GAAA,MAAAA,EAAS,QAKd,IAJA,OAAO,aAAaA,EAAQ,QAAQ,SAAS,EAIzC,EAAE,OAAS,YAAcA,EAAQ,QAAQ,gBAAiB,CAC5DA,EAAQ,QAAQ,kBAChBA,EAAQ,QAAQ,gBAAkB,KAGlCA,EAAQ,QAAQ,UAAY,OAAO,WAAW,IAAM,CAClDglK,GAAW,CAAC,CAClB,CAAK,EACD,MACD,CACD,OAAO,WAAW,IAAM,CAClBhlK,EAAQ,UACVA,EAAQ,QAAQ,QAAU,GAEhC,CAAG,EACD4kK,GAAQ,KAAK5kK,CAAO,EACtB,CACA,SAASilK,GAAiB,EAAG,CAC3B,MAAMjlK,EAAU,EAAE,cACbA,GAAA,MAAAA,EAAS,UACVA,EAAQ,QAAQ,kBAClBA,EAAQ,QAAQ,gBAAkB,MAEpC,OAAO,aAAaA,EAAQ,QAAQ,SAAS,EAC/C,CACA,IAAIklK,GAAiB,GACrB,SAASC,GAAmB,EAAG,CACzB,CAACD,KAAmB,EAAE,UAAYnP,GAAS,OAAS,EAAE,UAAYA,GAAS,SAC7EmP,GAAiB,GACjBJ,GAAW,CAAC,EAEhB,CACA,SAASM,GAAmB,EAAG,CAC7BF,GAAiB,GACjBF,GAAW,CAAC,CACd,CACA,SAASK,GAAgB,EAAG,CACtBH,KACFA,GAAiB,GACjBF,GAAW,CAAC,EAEhB,CACA,SAASM,GAAax9N,EAAIkjB,EAAS8tL,EAAY,CAC7C,KAAM,CACJ,MAAAhwM,EACA,UAAA+hB,CACD,EAAGG,EACE8nH,EAAU+xF,GAAgB/7N,CAAK,EAWrC,GAVKgqI,GACH8xF,GAAQ,KAAK98N,CAAE,EAEjBA,EAAG,QAAUA,EAAG,SAAW,CAAA,EAC3BA,EAAG,QAAQ,QAAUgrI,EACrBhrI,EAAG,QAAQ,SAAW+iB,EAAU,OAChC/iB,EAAG,QAAQ,OAAS+iB,EAAU,OAC1BliB,GAASG,CAAK,GAAKA,EAAM,QAC3BhB,EAAG,QAAQ,MAAQgB,EAAM,OAEvBgqI,GAAW,CAACgmE,EAAY,CAC1B,GAAIjuL,EAAU,KAAM,CAClB/iB,EAAG,iBAAiB,aAAci9N,GAAY,CAC5C,QAAS,EACjB,CAAO,EACDj9N,EAAG,iBAAiB,YAAai9N,EAAU,EAC3C,MACD,CACDj9N,EAAG,iBAAiB,aAAcg9N,GAAY,CAC5C,QAAS,EACf,CAAK,EACDh9N,EAAG,iBAAiB,WAAYk9N,GAAY,CAC1C,QAAS,EACf,CAAK,EACDl9N,EAAG,iBAAiB,YAAam9N,GAAkB,CACjD,QAAS,EACf,CAAK,EACDn9N,EAAG,iBAAiB,cAAek9N,EAAU,EAC7Cl9N,EAAG,iBAAiB,YAAag9N,EAAU,EAC3Ch9N,EAAG,iBAAiB,UAAWk9N,EAAU,EACzCl9N,EAAG,iBAAiB,aAAck9N,EAAU,EAC5Cl9N,EAAG,iBAAiB,UAAWq9N,EAAkB,EACjDr9N,EAAG,iBAAiB,QAASs9N,EAAkB,EAC/Ct9N,EAAG,iBAAiB,OAAQu9N,EAAe,EAG3Cv9N,EAAG,iBAAiB,YAAak9N,GAAY,CAC3C,QAAS,EACf,CAAK,CACL,KAAa,CAAClyF,GAAWgmE,GACrBysB,GAAgBz9N,CAAE,CAEtB,CACA,SAASy9N,GAAgBz9N,EAAI,CAC3BA,EAAG,oBAAoB,YAAag9N,EAAU,EAC9Ch9N,EAAG,oBAAoB,aAAcg9N,EAAU,EAC/Ch9N,EAAG,oBAAoB,WAAYk9N,EAAU,EAC7Cl9N,EAAG,oBAAoB,YAAam9N,EAAgB,EACpDn9N,EAAG,oBAAoB,cAAek9N,EAAU,EAChDl9N,EAAG,oBAAoB,UAAWk9N,EAAU,EAC5Cl9N,EAAG,oBAAoB,aAAck9N,EAAU,EAC/Cl9N,EAAG,oBAAoB,UAAWq9N,EAAkB,EACpDr9N,EAAG,oBAAoB,QAASs9N,EAAkB,EAClDt9N,EAAG,oBAAoB,YAAak9N,EAAU,EAC9Cl9N,EAAG,oBAAoB,OAAQu9N,EAAe,CAChD,CACA,SAAS1uM,IAAQ7uB,EAAIkjB,EAAS,CAC5Bs6M,GAAax9N,EAAIkjB,EAAS,EAAK,CACjC,CACA,SAASmM,IAAUrvB,EAAI,CACrB,OAAOA,EAAG,QACVy9N,GAAgBz9N,CAAE,CACpB,CACA,SAAS+uB,IAAQ/uB,EAAIkjB,EAAS,CAC5B,GAAIA,EAAQ,QAAUA,EAAQ,SAC5B,OAEF,MAAM8tL,EAAa+rB,GAAgB75M,EAAQ,QAAQ,EACnDs6M,GAAax9N,EAAIkjB,EAAS8tL,CAAU,CACtC,CACO,MAAM0sB,IAAS,CACpB,QAAA7uM,IACA,UAAAQ,IACA,QAAAN,GACF,EACA4uM,IAAeD,ICtRR,MAAME,IAAkBlQ,GAAa,CAC1C,KAAM,OACN,QAASsB,GAAW,EACpB,GAAGrB,GAAoB,EACvB,GAAG8I,GAAgB,CACrB,EAAG,QAAQ,EACEoH,IAAS3J,GAAgB,EAAG,CACvC,KAAM,SACN,MAAO0J,IAAiB,EACxB,MAAM95N,EAAOq7E,EAAM,CACjB,GAAI,CACF,MAAAlnE,CACD,EAAGknE,EACJ,OAAAs1I,GAAU,IAAA,OAAM7xL,OAAAA,EAAa,QAAS,CACpC,MAAS,CAAC,UAAW,CACnB,qBAAsB,CAAC,CAAC9+B,EAAM,OACtC,EAASA,EAAM,KAAK,EACd,MAASA,EAAM,MACf,QAAWA,EAAM,OACvB,EAAO,CAACA,EAAM,MAAMiC,EAAAkS,EAAM,UAAN,YAAAlS,EAAA,KAAAkS,EAAiB,CAAC,EAAC,EAC5B,EACR,CACH,CAAC,EC1BM,SAAS6lN,IAAah6N,EAAO,CAClC,KAAM,CACJ,CACD,EAAGqyN,IAAS,EACb,SAAS4H,EAAU5+I,EAAM,CACvB,GAAI,CACF,KAAAv7E,CACD,EAAGu7E,EACJ,MAAM6+I,EAAY,CAChB,QAAS,gBACT,aAAc,gBACd,OAAQ,eACR,YAAa,eACb,MAAO,OACR,EAACp6N,CAAI,EACAspE,EAAWppE,EAAM,WAAWF,CAAI,EAAE,EAClC44J,EAAQtvF,GAAY8wJ,EAAY,EAAE,kBAAkBA,CAAS,GAAIl6N,EAAM,OAAS,EAAE,EAAI,OAC5F,OAAO8+B,EAAao5L,IAAO,CACzB,KAAQl4N,EAAM,GAAGF,CAAI,MAAM,EAC3B,aAAc44J,EACd,QAAWtvF,CACZ,EAAE,IAAI,CACR,CACD,MAAO,CACL,UAAA6wJ,CACJ,CACA,CCnBO,MAAME,IAAqBvQ,GAAa,CAC7C,OAAQ,QACR,MAAO,OACP,SAAU,CACR,KAAM,CAAC,MAAO,MAAM,EACpB,QAAS,IAAM,CAAE,CAClB,EACD,GAAGC,GAAoB,EACvB,GAAGwK,IAAoB,CACrB,WAAY,CACV,UAAWc,IACX,cAAe,GACf,MAAO,EACR,CACL,CAAG,CACH,EAAG,WAAW,EACDiF,IAAYhK,GAAgB,EAAG,CAC1C,KAAM,YACN,MAAO+J,IAAoB,EAC3B,MAAMn6N,EAAOq7E,EAAM,CACjB,GAAI,CACF,MAAAlnE,CACD,EAAGknE,EACJ,MAAMzjC,EAAWh0C,EAAS,IAAM0mN,GAAYtqN,EAAM,QAAQ,CAAC,EACrD,CACJ,iBAAA01N,EACA,gBAAAC,CACD,EAAGF,GAAa7xN,EAAS,IAAM5D,EAAM,KAAK,CAAC,EAC5C,OAAA2wN,GAAU,IAAM7xL,EAAaq3L,IAAiB,CAC5C,WAAcn2N,EAAM,WACpB,IAAO,MACP,MAAS,CAAC,aAAc01N,EAAiB,MAAO11N,EAAM,KAAK,EAC3D,MAAS,CAAC21N,EAAgB,MAAO31N,EAAM,KAAK,EAC5C,KAAQ,QACR,YAAa,QACnB,EAAO,CACD,QAAS,IAAM,CAACA,EAAM,QAAU43C,EAAS,MAAM,IAAI,CAACqG,EAAS9hD,IAAM2iC,EAAa,MAAO,CACrF,MAAS,sBACT,IAAO,GAAG3iC,CAAC,IAAIy7C,EAAS,KAAK,EAC9B,EAAE,CAACzjC,EAAM,QAAUA,EAAM,QAAQ,CAChC,QAAA8pC,CACR,CAAO,EAAIA,CAAO,CAAC,CAAC,CAAC,CAChB,CAAA,CAAC,EACK,EACR,CACH,CAAC,ECnDYo8K,GAAiBzQ,GAAa,CACzC,QAAS,QACT,mBAAoBsB,GAAW,CACjC,EAAG,OAAO,EACH,SAASoP,IAASt6N,EAAO,CAC9B,IAAIF,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIywN,GAAsB,EACrG,MAAMgK,EAAYzJ,GAAgB9wN,EAAO,SAAS,EAC5Cw6N,EAAe52N,EAAS,KACrB,CACL,CAAC,GAAG9D,CAAI,WAAW,EAAGy6N,EAAU,KACtC,EACG,EACD,SAASE,GAAQ,CACfF,EAAU,MAAQ,EACnB,CACD,SAASG,GAAO,CACdH,EAAU,MAAQ,EACnB,CACD,MAAO,CACL,aAAAC,EACA,UAAAD,EACA,MAAAE,EACA,KAAAC,CACJ,CACA,CCzBO,MAAMC,IAAU,OAAO,IAAI,cAAc,EAyHzC,SAASC,KAAU,CACxB,OAAOj+M,GAAOg+M,IAAS,IAAI,CAC7B,CCxHO,MAAME,IAAsBjR,GAAa,CAC9C,SAAU,CACR,KAAM,QACN,QAAS,IACV,EACD,MAAO,QACP,cAAe,CACb,KAAM,CAAC,MAAO,MAAM,EACpB,QAAS,IAAM,CAAE,CAClB,EACD,UAAW,CACT,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,CACV,EACD,KAAM,OACN,MAAO,OACP,SAAU,CACR,KAAM,QACN,QAAS,IACV,EACD,MAAO,CACL,KAAM,MACN,QAAS,IAAM,CAAE,CAClB,EACD,WAAY,KACZ,WAAY,OACZ,gBAAiB,KACjB,GAAGyQ,GAAgB,CACrB,EAAG,YAAY,EACR,SAASS,IAAc96N,EAAO,CACnC,IAAIF,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIywN,GAAsB,EACjGtgN,EAAK,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIygN,GAAM,EACnF,MAAM/9E,EAAQm+E,GAAgB9wN,EAAO,YAAY,EAC3C+6N,EAAkBn3N,EAAS,IAAM5D,EAAM,kBAAoB,OAAY2yI,EAAM,MAAQ3yI,EAAM,eAAe,EAC1GoqL,EAAOwwC,MACPI,EAAwBxuN,EAAI,CAAA,CAAE,EAC9ByuN,EAAavuN,GAAW,EAAI,EAC5BwuN,EAAUt3N,EAAS,IAAM,CAAC,EAAE0mN,GAAY33E,EAAM,QAAU,GAAK,KAAOA,EAAM,KAAK,EAAE,QAAU23E,GAAYyQ,EAAgB,QAAU,GAAK,KAAOA,EAAgB,KAAK,EAAE,OAAO,EAC3KI,EAAav3N,EAAS,IAAM,CAAC,EAAE5D,EAAM,WAAYoqL,GAAA,YAAAA,EAAM,WAAW,OAAM,EACxE9iL,EAAa1D,EAAS,IAAM,CAAC,EAAE5D,EAAM,WAAYoqL,GAAA,YAAAA,EAAM,WAAW,OAAM,EACxEgxC,EAAgBx3N,EAAS,IAAM,OACnC,OAAO3B,EAAAjC,EAAM,gBAAN,MAAAiC,EAAqB,OAASqoN,GAAYtqN,EAAM,aAAa,EAAE,OAAOg7N,EAAsB,KAAK,EAAE,MAAM,EAAG,KAAK,IAAI,EAAG,CAACh7N,EAAM,SAAS,CAAC,EAAIg7N,EAAsB,KAC9K,CAAG,EACKK,EAAaz3N,EAAS,IAAM,CAChC,IAAI1G,GAAS8C,EAAM,aAAcoqL,GAAA,YAAAA,EAAM,WAAW,SAAU,QACxDltL,IAAU,SAAQA,EAAQ,cAC9B,MAAM5B,EAAM,IAAI,KAAI4B,GAAA,YAAAA,EAAO,MAAM,OAAQ,CAAA,CAAE,EAC3C,MAAO,CACL,KAAM5B,EAAI,IAAI,MAAM,GAAKA,EAAI,IAAI,OAAO,EACxC,MAAOA,EAAI,IAAI,OAAO,EACtB,OAAQA,EAAI,IAAI,QAAQ,EACxB,KAAMA,EAAI,IAAI,MAAM,CAC1B,CACA,CAAG,EACKymL,EAAUn+K,EAAS,IAAM,OAC7B,OAAI5D,EAAM,QAASiC,EAAAjC,EAAM,gBAAN,MAAAiC,EAAqB,OAAe,GAClDjC,EAAM,MAAM,OACbi7N,EAAW,MACND,EAAsB,MAAM,QAAUK,EAAW,MAAM,KAAO,KAAO,GAErE,CAACL,EAAsB,MAAM,OAJN,EAMpC,CAAG,EACKM,EAAe5uN,GAAW,EAAK,EAC/B6uN,EAAoB33N,EAAS,KAC1B,CACL,CAAC,GAAG9D,CAAI,SAAS,EAAGiiL,EAAQ,QAAU,GACtC,CAAC,GAAGjiL,CAAI,SAAS,EAAGo7N,EAAQ,MAC5B,CAAC,GAAGp7N,CAAI,YAAY,EAAGq7N,EAAW,MAClC,CAAC,GAAGr7N,CAAI,YAAY,EAAGwH,EAAW,KACxC,EACG,EACKsoN,EAAK9vM,GAAmB,YAAY,EACpCmgB,EAAMr8B,EAAS,IAAM5D,EAAM,MAAQgN,EAAMiD,CAAE,CAAC,EAClDwW,GAAc,IAAM,CAClB2jK,GAAA,MAAAA,EAAM,SAAS,CACb,GAAInqJ,EAAI,MACR,GAAA2vL,EACA,SAAA4L,EACA,MAAAj9M,EACA,gBAAAk9M,CACN,EACA,CAAG,EACD/7M,GAAgB,IAAM,CACpB0qK,GAAA,MAAAA,EAAM,WAAWnqJ,EAAI,MACzB,CAAG,EACDxgB,GAAU,SAAY,CACf47M,EAAW,MAAM,MACpB,MAAMG,EAAS,EAAI,EAErBpxC,GAAA,MAAAA,EAAM,OAAOnqJ,EAAI,MAAO8hJ,EAAQ,MAAOq5C,EAAc,MACzD,CAAG,EACDxK,GAAe,IAAMyK,EAAW,MAAM,MAAO,IAAM,CACjDp+M,GAAM89M,EAAiB,IAAM,CAC3B,GAAIA,EAAgB,OAAS,KAC3BS,YACSx7N,EAAM,QAAS,CACxB,MAAMyd,EAAUR,GAAM,IAAMjd,EAAM,QAASzE,GAAO,CAC3CA,GAAKigO,IACV/9M,GACV,CAAS,CACF,CACP,CAAK,CACL,CAAG,EACDmzM,GAAe,IAAMyK,EAAW,MAAM,KAAM,IAAM,CAChDp+M,GAAM,IAAMjd,EAAM,QAASzE,GAAO,CAC3BA,GAAKigO,GAChB,CAAK,CACL,CAAG,EACDv+M,GAAM,CAAC8kK,EAASq5C,CAAa,EAAG,IAAM,CACpChxC,GAAA,MAAAA,EAAM,OAAOnqJ,EAAI,MAAO8hJ,EAAQ,MAAOq5C,EAAc,MACzD,CAAG,EACD,eAAe78M,GAAQ,CACrBo0H,EAAM,MAAQ,KACd,MAAM7iI,GAAQ,EACd,MAAM2rN,EAAe,CACtB,CACD,eAAeA,GAAkB,CAC/BR,EAAW,MAAQ,GACdI,EAAW,MAAM,KAGpBL,EAAsB,MAAQ,GAF9B,MAAMQ,EAAS,EAAI,CAItB,CACD,eAAeA,GAAW,CACxB,IAAIE,EAAS,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,GACjF,MAAMxmF,EAAU,CAAA,EAChBomF,EAAa,MAAQ,GACrB,UAAW/oF,KAAQvyI,EAAM,MAAO,CAC9B,GAAIk1I,EAAQ,QAAU,EAAEl1I,EAAM,WAAa,GACzC,MAGF,MAAMyH,EAAS,MADC,OAAO8qI,GAAS,WAAaA,EAAO,IAAMA,GAC7BwoF,EAAgB,KAAK,EAClD,GAAItzN,IAAW,GACf,IAAIA,IAAW,IAAS,OAAOA,GAAW,SAAU,CAElD,QAAQ,KAAK,GAAGA,CAAM,6EAA6E,EACnG,QACD,CACDytI,EAAQ,KAAKztI,GAAU,EAAE,EAC1B,CACD,OAAAuzN,EAAsB,MAAQ9lF,EAC9BomF,EAAa,MAAQ,GACrBL,EAAW,MAAQS,EACZV,EAAsB,KAC9B,CACD,MAAO,CACL,cAAAI,EACA,QAAAF,EACA,WAAAC,EACA,WAAA7zN,EACA,WAAA2zN,EACA,QAAAl5C,EACA,aAAAu5C,EACA,MAAA/8M,EACA,gBAAAk9M,EACA,SAAAD,EACA,kBAAAD,CACJ,CACA,CCxJO,MAAMI,GAAkB/R,GAAa,CAC1C,GAAI,OACJ,WAAYiN,GACZ,YAAa,CACX,KAAM,QACN,QAAS,EACV,EACD,YAAaA,GACb,YAAa,CAAC,QAAS,MAAM,EAC7B,gBAAiB,QACjB,KAAM,OACN,eAAgB,QAChB,SAAU,CACR,KAAM,CAAC,MAAO,MAAM,EACpB,QAAS,IAAM,CAAE,CAClB,EACD,UAAW,CACT,KAAM,OACN,QAAS,aACT,UAAW70N,GAAK,CAAC,aAAc,UAAU,EAAE,SAASA,CAAC,CACtD,EACD,kBAAmBkpN,GAAW,EAC9B,iBAAkBA,GAAW,EAC7B,GAAGrB,GAAoB,EACvB,GAAG2M,IAAkB,EACrB,GAAGnM,IAAK+K,IAAoB,EAAE,CAAC,WAAY,WAAY,OAAO,CAAC,EAC/D,GAAGzC,GAAgB,EACnB,GAAGkI,IAAqB,CAC1B,EAAG,QAAQ,EACEe,GAASxL,GAAgB,EAAG,CACvC,KAAM,SACN,MAAO,CACL,GAAGuL,GAAiB,CACrB,EACD,MAAO,CACL,oBAAqBz+N,GAAS,EAC/B,EACD,MAAM8C,EAAOq7E,EAAM,CACjB,GAAI,CACF,MAAAjnE,EACA,MAAAD,EACA,KAAAtC,CACD,EAAGwpE,EACJ,KAAM,CACJ,eAAAwgJ,CACN,EAAQpF,IAAWz2N,CAAK,EACd,CACJ,gBAAA87N,CACN,EAAQzG,IAAar1N,CAAK,EAChB,CACJ,aAAA+zN,CACN,EAAQC,GAAah0N,CAAK,EAChB,CACJ,WAAA+7N,CACD,EAAGtJ,GAAM,EACJ,CACJ,UAAAwH,CACN,EAAQD,IAAah6N,CAAK,EAChBigC,EAAMywL,KACNzgN,EAAKrM,EAAS,IAAM5D,EAAM,IAAM,SAASigC,CAAG,EAAE,EAC9C+7L,EAAap4N,EAAS,IAAM,GAAGqM,EAAG,KAAK,WAAW,EAClD,CACJ,cAAAmrN,EACA,QAAAF,EACA,WAAAC,EACA,WAAA7zN,EACA,WAAA2zN,EACA,QAAAl5C,EACA,aAAAu5C,EACA,MAAA/8M,EACA,gBAAAk9M,EACA,SAAAD,EACA,kBAAAD,CACD,EAAGT,IAAc96N,EAAO,UAAWiQ,CAAE,EAChCo4C,EAAYzkD,EAAS,KAAO,CAChC,GAAAqM,EACA,WAAA+rN,EACA,QAAAd,EACA,WAAAC,EACA,WAAA7zN,EACA,WAAA2zN,EACA,QAAAl5C,EACA,aAAAu5C,EACA,MAAA/8M,EACA,gBAAAk9M,EACA,SAAAD,CACD,EAAC,EACI5jL,EAAWh0C,EAAS,IAAM,OAC9B,OAAI3B,EAAAjC,EAAM,gBAAN,MAAAiC,EAAqB,QAAU,CAACg5N,EAAW,OAASG,EAAc,MAAM,OACnEA,EAAc,MACZp7N,EAAM,OAASA,EAAM,gBAAkBA,EAAM,SAC/CA,EAAM,KAENA,EAAM,QAErB,CAAK,EACD,OAAA2wN,GAAU,IAAM,eACd,MAAMsL,EAAa,CAAC,EAAE9nN,EAAM,SAAWnU,EAAM,aACvCk8N,EAAY,CAAC,EAAE/nN,EAAM,QAAUnU,EAAM,YACrCm8N,EAAcvkL,EAAS,MAAM,OAAS,EACtCwkL,GAAa,CAACp8N,EAAM,aAAeA,EAAM,cAAgB,SAAWm8N,GAAe,CAAC,CAAChoN,EAAM,SACjG,OAAO2qB,EAAa,MAAO,CACzB,MAAS,CAAC,UAAW,YAAY9+B,EAAM,SAAS,GAAI,CAClD,wBAAyBA,EAAM,YAC/B,6BAA8BA,EAAM,eACrC,EAAE67N,EAAe,MAAO9H,EAAa,MAAOgI,EAAW,MAAOR,EAAkB,MAAOv7N,EAAM,KAAK,EACnG,MAAS,CAAC87N,EAAgB,MAAO97N,EAAM,KAAK,CACpD,EAAS,CAACi8N,GAAcn9L,EAAa,MAAO,CACpC,IAAO,UACP,MAAS,kBACjB,EAAS,EAAC78B,EAAAkS,EAAM,UAAN,YAAAlS,EAAA,KAAAkS,EAAgBk0C,EAAU,OAAQroD,EAAM,aAAe8+B,EAAam7L,EAAW,CACjF,IAAO,eACP,KAAQ,SAChB,EAAS,IAAI,CAAC,CAAC,EAAG9lN,EAAM,SAAW2qB,EAAa,MAAO,CAC/C,MAAS,kBACjB,EAAS,EAACptB,EAAAyC,EAAM,UAAN,YAAAzC,EAAA,KAAAyC,EAAgBk0C,EAAU,MAAM,CAAC,EAAG6zK,GAAap9L,EAAa,MAAO,CACvE,IAAO,SACP,MAAS,iBACV,EAAE,CAAC9+B,EAAM,YAAc8+B,EAAam7L,EAAW,CAC9C,IAAO,cACP,KAAQ,QACT,EAAE,IAAI,GAAG/yC,GAAA/yK,EAAM,SAAN,YAAA+yK,GAAA,KAAA/yK,EAAek0C,EAAU,MAAM,CAAC,EAAG+zK,IAAct9L,EAAa,MAAO,CAC7E,MAAS,kBACjB,EAAS,CAACA,EAAas7L,IAAW,CAC1B,GAAM4B,EAAW,MACjB,OAAUG,EACV,SAAYvkL,EAAS,KAC7B,EAAS,CACD,QAASzjC,EAAM,OACvB,CAAO,GAAGgzK,GAAAhzK,EAAM,UAAN,YAAAgzK,GAAA,KAAAhzK,EAAgBk0C,EAAU,MAAM,CAAC,CAAC,CAAC,CAC7C,CAAK,EACM,CACL,MAAA9pC,EACA,gBAAAk9M,EACA,SAAAD,EACA,QAAAz5C,EACA,cAAAq5C,CACN,CACG,CACH,CAAC,ECrJYiB,GAAgB,OAAO,IAAI,iBAAiB,EACnDC,GAAwB,CAC5B,iBAAkB,KAClB,WAAY,CACV,GAAI,EACJ,GAAI,IACJ,GAAI,IACJ,GAAI,KACJ,GAAI,KACJ,IAAK,IACN,CACH,EACMC,IAAsB,UAAY,CACtC,IAAIv4N,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIs4N,GAClF,OAAO5R,GAAU4R,GAAuBt4N,CAAO,CACjD,EACA,SAASw4N,GAAelnL,EAAK,CAC3B,OAAOw0K,IAAc,CAACx0K,EAAM,OAAO,WAAa,OAAOA,GAAQ,UAAYA,EAAI,aAAe,CAChG,CACA,SAASmnL,GAAgBnnL,EAAK,CAC5B,OAAOw0K,IAAc,CAACx0K,EAAM,OAAO,YAAc,OAAOA,GAAQ,UAAYA,EAAI,cAAgB,CAClG,CACA,SAASonL,GAAYpnL,EAAK,CACxB,MAAM0mJ,EAAY8tB,IAAc,CAACx0K,EAAM,OAAO,UAAU,UAAY,MACpE,SAASlgB,EAAM+9E,EAAQ,CACrB,MAAO,EAAQ6oF,EAAU,MAAM7oF,CAAM,CACtC,CACD,MAAMkpF,EAAUjnK,EAAM,UAAU,EAC1BunM,EAAMvnM,EAAM,mBAAmB,EAC/BwnM,EAAUxnM,EAAM,UAAU,EAC1BynM,EAAWznM,EAAM,WAAW,EAC5B0nM,EAAS1nM,EAAM,SAAS,EACxB2nM,EAAO3nM,EAAM,OAAO,EACpB4nM,EAAU5nM,EAAM,UAAU,EAC1B6nM,EAAQ7nM,EAAM,QAAQ,EACtBq/F,EAAMr/F,EAAM,MAAM,EAClBuxI,EAAMvxI,EAAM,MAAM,EAClB8nM,EAAQ9nM,EAAM,QAAQ,EAC5B,MAAO,CACL,QAAAinK,EACA,IAAAsgC,EACA,QAAAC,EACA,SAAAC,EACA,OAAAC,EACA,KAAAC,EACA,QAAAC,EACA,MAAAC,EACA,IAAAxoG,EACA,IAAAkyC,EACA,MAAAu2D,EACA,MAAOnT,IACP,IAAK/tB,IAAc,KACvB,CACA,CACO,SAASmhC,IAAcn5N,EAASsxC,EAAK,CAC1C,KAAM,CACJ,WAAA8nL,EACA,iBAAAC,CACJ,EAAMd,IAAoBv4N,CAAO,EACzBqnF,EAAS3+E,GAAW+vN,GAAgBnnL,CAAG,CAAC,EACxC0tB,EAAWt2D,GAAWgwN,GAAYpnL,CAAG,CAAC,EACtC91B,EAAQrY,GAAS,CAAA,CAAE,EACnBqsD,EAAQ9mD,GAAW8vN,GAAelnL,CAAG,CAAC,EAC5C,SAASwiJ,GAAa,CACpBzsG,EAAO,MAAQoxI,KACfjpK,EAAM,MAAQgpK,IACf,CACD,SAAS9iM,GAAS,CAChBo+J,IACA90H,EAAS,MAAQ05J,IAClB,CAGD,OAAA9/M,GAAY,IAAM,CAChB,MAAM0gN,EAAK9pK,EAAM,MAAQ4pK,EAAW,GAC9BxqD,EAAKp/G,EAAM,MAAQ4pK,EAAW,IAAM,CAACE,EACrCj1E,EAAK70F,EAAM,MAAQ4pK,EAAW,IAAM,EAAExqD,GAAM0qD,GAC5CC,EAAK/pK,EAAM,MAAQ4pK,EAAW,IAAM,EAAE/0E,GAAMuqB,GAAM0qD,GAClDptE,EAAK18F,EAAM,MAAQ4pK,EAAW,KAAO,EAAEG,GAAMl1E,GAAMuqB,GAAM0qD,GACzDE,EAAMhqK,EAAM,OAAS4pK,EAAW,IAChCt9N,EAAOw9N,EAAK,KAAO1qD,EAAK,KAAOvqB,EAAK,KAAOk1E,EAAK,KAAOrtE,EAAK,KAAO,MACnEutE,EAAkB,OAAOJ,GAAqB,SAAWA,EAAmBD,EAAWC,CAAgB,EACvGK,EAASlqK,EAAM,MAAQiqK,EAC7Bj+M,EAAM,GAAK89M,EACX99M,EAAM,GAAKozJ,EACXpzJ,EAAM,GAAK6oI,EACX7oI,EAAM,GAAK+9M,EACX/9M,EAAM,GAAK0wI,EACX1wI,EAAM,IAAMg+M,EACZh+M,EAAM,QAAU,CAAC89M,EACjB99M,EAAM,QAAU,EAAE89M,GAAM1qD,GACxBpzJ,EAAM,QAAU,EAAE89M,GAAM1qD,GAAMvqB,GAC9B7oI,EAAM,QAAU,EAAE89M,GAAM1qD,GAAMvqB,GAAMk1E,GACpC/9M,EAAM,UAAY,EAAE6oI,GAAMk1E,GAAMrtE,GAAMstE,GACtCh+M,EAAM,UAAY,EAAE+9M,GAAMrtE,GAAMstE,GAChCh+M,EAAM,UAAY,EAAE0wI,GAAMstE,GAC1Bh+M,EAAM,UAAY,CAACg+M,EACnBh+M,EAAM,KAAO1f,EACb0f,EAAM,OAAS6rE,EAAO,MACtB7rE,EAAM,MAAQg0C,EAAM,MACpBh0C,EAAM,OAASk+M,EACfl+M,EAAM,iBAAmB69M,EACzB79M,EAAM,SAAWwjD,EAAS,MAC1BxjD,EAAM,WAAa49M,CACvB,CAAG,EACGtT,IACF,OAAO,iBAAiB,SAAUhyB,EAAY,CAC5C,QAAS,EACf,CAAK,EAEI,CACL,GAAGrqL,GAAO+R,CAAK,EACf,OAAAka,EACA,IAAK,CAAC,CAAC4b,CACX,CACA,CCrHO,MAAMqoL,IAAa,OAAO,IAAI,cAAc,EACnD,SAASpL,KAAc,CACrB,MAAO,CACL,UAAW,OACX,SAAU,IACV,OAAQ,GACR,OAAQ,EACR,OAAQ,iBACR,SAAU,CACR,OAAQnhM,GAAKA,EACb,WAAYA,GAAKA,GAAK,EACtB,YAAaA,GAAKA,GAAK,EAAIA,GAC3B,cAAeA,GAAKA,EAAI,GAAM,EAAIA,GAAK,EAAI,IAAM,EAAI,EAAIA,GAAKA,EAC9D,YAAaA,GAAKA,GAAK,EACvB,aAAcA,GAAK,EAAEA,GAAK,EAAI,EAC9B,eAAgBA,GAAKA,EAAI,GAAM,EAAIA,GAAK,GAAKA,EAAI,IAAM,EAAIA,EAAI,IAAM,EAAIA,EAAI,GAAK,EAClF,YAAaA,GAAKA,GAAK,EACvB,aAAcA,GAAK,GAAI,EAAEA,GAAK,EAC9B,eAAgBA,GAAKA,EAAI,GAAM,EAAIA,GAAK,EAAI,EAAI,EAAI,EAAEA,GAAK,EAC3D,YAAaA,GAAKA,GAAK,EACvB,aAAcA,GAAK,EAAI,EAAEA,GAAK,EAC9B,eAAgBA,GAAKA,EAAI,GAAM,GAAKA,GAAK,EAAI,EAAI,GAAK,EAAEA,GAAK,CAC9D,CACL,CACA,CAiBO,SAASwsM,IAAW55N,EAASsuN,EAAQ,CAC1C,MAAO,CACL,IAAKA,EAAO,MACZ,QAAS5H,GAAU6H,IAAa,EAAEvuN,CAAO,CAC7C,CACA,CC3CO,MAAM65N,GAAgB,OAAO,IAAI,kBAAkB,EACnD,SAASC,GAAU,EAAG5hO,EAAI69L,EAAW,CAC1C,MAAMgkC,EAAWhkC,IAAc,WACzB5lE,EAAOj4H,EAAG,wBACV8hO,EAAQ,YAAa,EAAI,EAAE,QAAQ,CAAC,EAAI,EAC9C,OAAOD,EAAWC,EAAM,SAAW7pG,EAAK,IAAMA,EAAK,OAAS,GAAK6pG,EAAM,SAAW7pG,EAAK,KAAOA,EAAK,MAAQ,EAC7G,CACA,SAAS8pG,IAAY,EAAGzgK,EAAU,CAChC,MAAI,YAAa,GAAK,EAAE,QAAQ,OAAe,EAAE,QAAQ,CAAC,EAAEA,CAAQ,EAAW,mBAAoB,GAAK,EAAE,eAAe,OAAe,EAAE,eAAe,CAAC,EAAEA,CAAQ,EAAc,EAAEA,CAAQ,CAC9L,CACO,MAAM0gK,IAAkBtU,GAAa,CAC1C,SAAU,CACR,KAAM,QACN,QAAS,IACV,EACD,MAAO,QACP,SAAU,CACR,KAAM,QACN,QAAS,IACV,EACD,IAAK,CACH,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,GACV,EACD,IAAK,CACH,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,CACV,EACD,KAAM,CACJ,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,CACV,EACD,WAAY,OACZ,WAAY,CACV,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,OACT,UAAW5nN,GAAK,OAAOA,GAAM,WAAaA,IAAM,QACjD,EACD,UAAW,CACT,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,EACV,EACD,UAAW,CACT,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,GACT,UAAWA,GAAK,OAAOA,GAAM,WAAaA,IAAM,QACjD,EACD,MAAO,CACL,KAAM,CAAC,MAAO,MAAM,CACrB,EACD,SAAU,CACR,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,CACV,EACD,MAAO,OACP,WAAY,OACZ,eAAgB,OAChB,UAAW,CACT,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,CACV,EACD,UAAW,CACT,KAAM,OACN,QAAS,aACT,UAAWA,GAAK,CAAC,WAAY,YAAY,EAAE,SAASA,CAAC,CACtD,EACD,QAAS,QACT,GAAG+zN,IAAkB,EACrB,GAAGK,IAAmB,CACpB,UAAW,CACf,CAAG,EACD,OAAQ,CACN,KAAM,QACN,QAAS,EACV,CACH,EAAG,QAAQ,EACE+H,IAAWn+N,GAAS,CAC/B,MAAMwoE,EAAM5kE,EAAS,IAAM,WAAW5D,EAAM,GAAG,CAAC,EAC1CylB,EAAM7hB,EAAS,IAAM,WAAW5D,EAAM,GAAG,CAAC,EAC1C8vG,EAAOlsG,EAAS,IAAM,CAAC5D,EAAM,KAAO,EAAI,WAAWA,EAAM,IAAI,EAAI,CAAC,EAClE+/I,EAAWn8I,EAAS,IAAM,KAAK,IAAI2mN,GAAYz6G,EAAK,KAAK,EAAGy6G,GAAY/hJ,EAAI,KAAK,CAAC,CAAC,EACzF,SAAS41J,EAAWlhO,EAAO,CAEzB,GADAA,EAAQ,WAAWA,CAAK,EACpB4yG,EAAK,OAAS,EAAG,OAAO5yG,EAC5B,MAAMmhO,EAAU12G,GAAMzqH,EAAOsrE,EAAI,MAAO/iD,EAAI,KAAK,EAC3CoxB,EAAS2xB,EAAI,MAAQsnC,EAAK,MAC1BtqG,EAAW,KAAK,OAAO64N,EAAUxnL,GAAUi5D,EAAK,KAAK,EAAIA,EAAK,MAAQj5D,EAC5E,OAAO,WAAW,KAAK,IAAIrxC,EAAUigB,EAAI,KAAK,EAAE,QAAQs6H,EAAS,KAAK,CAAC,CACxE,CACD,MAAO,CACL,IAAAv3E,EACA,IAAA/iD,EACA,KAAAqqF,EACA,SAAAiwC,EACA,WAAAq+E,CACJ,CACA,EACaE,IAAYjjJ,GAAQ,CAC/B,GAAI,CACF,MAAAr7E,EACA,MAAAu+N,EACA,cAAAC,EACA,aAAAC,EACA,YAAAC,EACA,eAAAC,CACD,EAAGtjJ,EACJ,KAAM,CACJ,MAAAm3I,CACD,EAAGC,GAAM,EACJmM,EAAa5wN,GAAMhO,EAAO,SAAS,EACnC+9N,EAAWn6N,EAAS,IAAM5D,EAAM,YAAc,UAAU,EACxD6+N,EAAej7N,EAAS,IAAMm6N,EAAS,QAAUa,EAAW,KAAK,EACjE,CACJ,IAAAp2J,EACA,IAAA/iD,EACA,KAAAqqF,EACA,SAAAiwC,EACA,WAAAq+E,CACD,EAAGG,EACEO,EAAYl7N,EAAS,IAAM,SAAS5D,EAAM,UAAW,EAAE,CAAC,EACxD++N,EAAWn7N,EAAS,IAAM,SAAS5D,EAAM,SAAU,EAAE,CAAC,EACtDu3L,EAAY3zL,EAAS,IAAM,SAAS5D,EAAM,UAAW,EAAE,CAAC,EACxDg/N,EAAWp7N,EAAS,KAAO6hB,EAAI,MAAQ+iD,EAAI,OAASsnC,EAAK,KAAK,EAC9D5yE,EAAWlvB,GAAMhO,EAAO,UAAU,EAClCi/N,EAAar7N,EAAS,IAAM5D,EAAM,OAASA,EAAM,SAAW,OAAYA,EAAM,YAAcA,EAAM,KAAK,EACvGk/N,EAAat7N,EAAS,IAAM5D,EAAM,OAASA,EAAM,SAAW,OAAYA,EAAM,YAAcA,EAAM,KAAK,EACvGm/N,EAAiBv7N,EAAS,IAAM5D,EAAM,OAASA,EAAM,SAAW,OAAYA,EAAM,gBAAkBA,EAAM,KAAK,EAC/Go/N,EAAe1yN,GAAW,EAAK,EAC/B2yN,EAAc3yN,GAAW,CAAC,EAC1B4yN,EAAoB9yN,IACpB+yN,EAAiB/yN,IACvB,SAASgzN,EAAen1M,GAAG,QACzB,MAAM0zM,GAAW/9N,EAAM,YAAc,WAC/BkQ,GAAQ6tN,GAAW,MAAQ,OAC3B1+J,GAAS0+J,GAAW,SAAW,QAC/BvgK,GAAWugK,GAAW,UAAY,UAClC,CACJ,CAAC7tN,EAAK,EAAGuvN,GACT,CAACpgK,EAAM,EAAGqgK,EACX,GAAGz9N,GAAAq9N,EAAkB,QAAlB,YAAAr9N,GAAyB,IAAI,wBAC3B09N,GAAc1B,IAAY5zM,GAAGmzC,EAAQ,EAG3C,IAAIoiK,GAAW,KAAK,IAAI,KAAK,KAAKD,GAAcF,GAAaJ,EAAY,OAASK,GAAa,CAAC,EAAG,CAAC,GAAK,EACzG,OAAI3B,GAAWc,EAAa,MAAQA,EAAa,QAAUrM,EAAM,SAAOoN,GAAW,EAAIA,IAChFxB,EAAW51J,EAAI,MAAQo3J,IAAYn6M,EAAI,MAAQ+iD,EAAI,MAAM,CACjE,CACD,MAAMq3J,GAAax1M,IAAK,CACtBq0M,EAAY,CACV,MAAOc,EAAen1M,EAAC,CAC7B,CAAK,EACD+0M,EAAa,MAAQ,GACrBC,EAAY,MAAQ,CACxB,EACQS,EAAcz1M,IAAK,CACvBk1M,EAAe,MAAQZ,EAAet0M,EAAC,EAClCk1M,EAAe,QACpBA,EAAe,MAAM,QACrBH,EAAa,MAAQ,GACjBG,EAAe,MAAM,SAASl1M,GAAE,MAAM,EACxCg1M,EAAY,MAAQvB,GAAUzzM,GAAGk1M,EAAe,MAAOv/N,EAAM,SAAS,GAEtEq/N,EAAY,MAAQ,EACpBZ,EAAa,CACX,MAAOe,EAAen1M,EAAC,CAC/B,CAAO,GAEHm0M,EAAc,CACZ,MAAOgB,EAAen1M,EAAC,CAC7B,CAAK,EACL,EACQ01M,EAAsB,CAC1B,QAAS,GACT,QAAS,EACb,EACE,SAASC,GAAY31M,GAAG,CACtBo0M,EAAa,CACX,MAAOe,EAAen1M,EAAC,CAC7B,CAAK,CACF,CACD,SAAS41M,GAAgB51M,GAAG,CAC1BA,GAAE,gBAAe,EACjBA,GAAE,eAAc,EAChBw1M,GAAWx1M,EAAC,EACZ,OAAO,oBAAoB,YAAa21M,GAAaD,CAAmB,EACxE,OAAO,oBAAoB,UAAWE,EAAe,CACtD,CACD,SAASC,EAAiB71M,GAAG,QAC3Bw1M,GAAWx1M,EAAC,EACZ,OAAO,oBAAoB,YAAa21M,GAAaD,CAAmB,GACxE99N,GAAAooB,GAAE,SAAF,MAAApoB,GAAU,oBAAoB,WAAYi+N,EAC3C,CACD,SAASC,GAAmB91M,GAAG,QAC7By1M,EAAYz1M,EAAC,EACb,OAAO,iBAAiB,YAAa21M,GAAaD,CAAmB,GACrE99N,GAAAooB,GAAE,SAAF,MAAApoB,GAAU,iBAAiB,WAAYi+N,EAAkB,CACvD,QAAS,EACf,EACG,CACD,SAASE,GAAkB/1M,GAAG,CAC5BA,GAAE,eAAc,EAChBy1M,EAAYz1M,EAAC,EACb,OAAO,iBAAiB,YAAa21M,GAAaD,CAAmB,EACrE,OAAO,iBAAiB,UAAWE,GAAiB,CAClD,QAAS,EACf,CAAK,CACF,CACD,MAAMziK,GAAWjiE,IAAO,CACtB,MAAM8kO,IAAc9kO,GAAMitE,EAAI,QAAU/iD,EAAI,MAAQ+iD,EAAI,OAAS,IACjE,OAAOm/C,GAAM,MAAM04G,EAAU,EAAI,EAAIA,GAAY,EAAG,GAAG,CAC3D,EACQC,GAAYtyN,GAAMhO,EAAO,WAAW,EACpCugO,GAAc38N,EAAS,IACtB08N,GAAU,MACVtgO,EAAM,MASP,MAAM,QAAQA,EAAM,KAAK,EAAUA,EAAM,MAAM,IAAIoxB,KAAM,CAC3D,MAAOA,GACP,SAAUosC,GAASpsC,EAAC,EACpB,MAAOA,GAAE,SAAU,CACpB,EAAC,EACK,OAAO,KAAKpxB,EAAM,KAAK,EAAE,IAAInE,KAAQ,CAC1C,MAAO,WAAWA,EAAG,EACrB,SAAU2hE,GAAS,WAAW3hE,EAAG,CAAC,EAClC,MAAOmE,EAAM,MAAMnE,EAAG,CACvB,EAAC,EAjBOmjO,EAAS,QAAU,IAAW5mH,GAAY4mH,EAAS,MAAQ,CAAC,EAAE,IAAI5tM,IAAK,CAC5E,MAAMl0B,GAAQsrE,EAAI,MAAQp3C,GAAI0+E,EAAK,MACnC,MAAO,CACL,MAAA5yG,GACA,SAAUsgE,GAAStgE,EAAK,CAClC,CACO,CAAA,EAAI,CAAA,EARsB,EAoB9B,EACKsjO,GAAY58N,EAAS,IAAM28N,GAAY,MAAM,KAAK3hG,IAAS,CAC/D,GAAI,CACF,MAAA85B,EACD,EAAG95B,GACJ,MAAO,CAAC,CAAC85B,EACV,CAAA,CAAC,EACInkJ,GAAO,CACX,eAAAgrN,EACA,MAAOvxN,GAAMhO,EAAO,OAAO,EAC3B,SAAA+/I,EACA,SAAA7iH,EACA,UAAWlvB,GAAMhO,EAAO,WAAW,EACnC,UAAWgO,GAAMhO,EAAO,WAAW,EACnC,UAAAwgO,GACA,WAAA5B,EACA,aAAAC,EACA,IAAAr2J,EACA,IAAA/iD,EACA,aAAA25M,EACA,SAAAJ,EACA,kBAAAoB,GACA,mBAAAD,GACA,YAAAI,GACA,eAAAf,EACA,SAAAhiK,GACA,SAAUxvD,GAAMhO,EAAO,UAAU,EACjC,QAASgO,GAAMhO,EAAO,SAAS,EAC/B,WAAAo+N,EACA,UAAAkC,GACA,YAAAjB,EACA,KAAAvvH,EACA,UAAAgvH,EACA,WAAAG,EACA,WAAYjxN,GAAMhO,EAAO,YAAY,EACrC,MAAOgO,GAAMhO,EAAO,OAAO,EAC3B,SAAA++N,EACA,WAAAG,EACA,kBAAAI,EACA,eAAAH,EACA,UAAA5nC,EACA,SAAAwmC,CACJ,EACE,OAAA5xM,GAAQ0xM,GAAetpN,EAAI,EACpBA,EACT,EC/QaksN,IAAwB7W,GAAa,CAChD,QAAS,QACT,IAAK,CACH,KAAM,OACN,SAAU,EACX,EACD,IAAK,CACH,KAAM,OACN,SAAU,EACX,EACD,WAAY,CACV,KAAM,OACN,SAAU,EACX,EACD,SAAU,CACR,KAAM,OACN,SAAU,EACX,EACD,OAAQ,CACN,KAAM,CAAC,QAAS,MAAM,EACtB,QAAS,EACV,EACD,GAAGC,GAAoB,CACzB,EAAG,cAAc,EACJ6W,GAAetQ,GAAgB,EAAG,CAC7C,KAAM,eACN,WAAY,CACd,OAAIwJ,GACD,EACD,MAAO6G,IAAuB,EAC9B,MAAO,CACL,oBAAqBz+N,GAAK,EAC3B,EACD,MAAMhC,EAAOq7E,EAAM,CACjB,GAAI,CACF,MAAAlnE,EACA,KAAAtC,CACD,EAAGwpE,EACJ,MAAMslJ,EAAShkN,GAAOkhN,EAAa,EAC7B,CACJ,MAAArL,EACA,WAAAuJ,CACD,EAAGtJ,GAAM,EACV,GAAI,CAACkO,EAAQ,MAAM,IAAI,MAAM,yEAAyE,EACtG,KAAM,CACJ,WAAA1B,EACA,KAAAnvH,EACA,SAAA5yE,EACA,UAAA4hM,EACA,WAAA8B,EACA,UAAA7mC,EACA,WAAA6kC,EACA,SAAAb,EACA,SAAA72N,EACA,UAAAovN,EACA,aAAA8I,EACA,SAAAr/E,EACA,aAAA8+E,CACD,EAAG8B,EACEE,EAAiBj9N,EAAS,IAAOs5B,EAAS,MAA0B,OAAlBo5L,EAAU,KAAiB,EAC7E,CACJ,iBAAAwK,CACN,EAAQzK,IAAawK,CAAc,EACzB,CACJ,iBAAAnL,EACA,gBAAAC,CACN,EAAQF,GAAawJ,CAAU,EACrB,CACJ,OAAA8B,EACA,SAAAC,EACA,IAAA7wN,EACA,KAAA8wN,EACA,KAAA1pG,EACA,MAAAD,GACA,KAAA4pG,EACA,GAAAC,CACD,EAAG/W,IACEgX,GAAe,CAACL,EAAQC,EAAU7wN,EAAK8wN,EAAM1pG,EAAMD,GAAO4pG,EAAMC,CAAE,EAClEE,GAAcz9N,EAAS,IACvBksG,EAAK,MAAc,CAAC,EAAG,EAAG,CAAC,EAAc,CAAC,EAAG,EAAG,EAAE,CACvD,EACD,SAASwxH,EAAaj3M,GAAGntB,GAAO,CAC9B,GAAI,CAACkkO,GAAa,SAAS/2M,GAAE,GAAG,EAAG,OACnCA,GAAE,eAAc,EAChB,MAAMk3M,GAAQzxH,EAAK,OAAS,GACtByuH,IAASv+N,EAAM,IAAMA,EAAM,KAAOuhO,GACxC,GAAI,CAAChqG,EAAMD,GAAO4pG,EAAMC,CAAE,EAAE,SAAS92M,GAAE,GAAG,EAAG,CAE3C,MAAM0vK,IADWgkC,EAAS,MAAQ,CAACvL,EAAM,MAAQj7F,EAAOD,GAAOsnG,EAAW,MAAQsC,EAAOC,CAAE,EAAItC,EAAa,QAAUrM,EAAM,MAAQ,CAACj7F,EAAM4pG,CAAE,EAAI,CAAC7pG,GAAO6pG,CAAE,GAChI,SAAS92M,GAAE,GAAG,EAAI,EAAI,GAC3C2iG,GAAa3iG,GAAE,SAAW,EAAIA,GAAE,QAAU,EAAI,EACpDntB,GAAQA,GAAQ68L,GAAYwnC,GAAQF,GAAY,MAAMr0G,EAAU,CACxE,SAAiB3iG,GAAE,MAAQ42M,EACnB/jO,GAAQ8C,EAAM,YACLqqB,GAAE,MAAQla,EACnBjT,GAAQ8C,EAAM,QACT,CACL,MAAM+5L,GAAY1vK,GAAE,MAAQ22M,EAAW,EAAI,GAC3C9jO,GAAQA,GAAQ68L,GAAYwnC,IAAShD,GAAQ,IAAMA,GAAQ,GAAK,GACjE,CACD,OAAO,KAAK,IAAIv+N,EAAM,IAAK,KAAK,IAAIA,EAAM,IAAK9C,EAAK,CAAC,CACtD,CACD,SAASskO,GAAUn3M,GAAG,CACpB,MAAM7kB,GAAW87N,EAAaj3M,GAAGrqB,EAAM,UAAU,EACjDwF,IAAY,MAAQqM,EAAK,oBAAqBrM,EAAQ,CACvD,CACD,OAAAmrN,GAAU,IAAM,CACd,MAAM8Q,GAAqBvX,GAAc2U,EAAa,MAAQ,IAAM7+N,EAAM,SAAWA,EAAM,SAAU,GAAG,EACxG,OAAO8+B,EAAa,MAAO,CACzB,MAAS,CAAC,iBAAkB,CAC1B,0BAA2B9+B,EAAM,QACjC,0BAA2BA,EAAM,SAAWo/N,EAAa,KAC1D,EAAEp/N,EAAM,MAAO+7N,EAAW,KAAK,EAChC,MAAS,CAAC,CACR,4BAA6B0F,GAC7B,wBAAyBvX,GAAc4U,EAAU,KAAK,CAChE,EAAW9+N,EAAM,KAAK,EACd,KAAQ,SACR,SAAYk9B,EAAS,MAAQ,GAAK,EAClC,gBAAiBl9B,EAAM,IACvB,gBAAiBA,EAAM,IACvB,gBAAiBA,EAAM,WACvB,gBAAiB,CAAC,CAACkH,EAAS,MAC5B,mBAAoB6yL,EAAU,MAC9B,UAAc7yL,EAAS,MAAoB,OAAZs6N,EACvC,EAAS,CAAC1iM,EAAa,MAAO,CACtB,MAAS,CAAC,0BAA2B42L,EAAiB,MAAOoL,EAAiB,KAAK,EACnF,MAAS,CACP,GAAGnL,EAAgB,KACpB,CACF,EAAE,IAAI,EAAG+L,GAAgB5iM,EAAa,MAAO,CAC5C,MAAS,CAAC,yBAA0B42L,EAAiB,KAAK,EAC1D,MAASC,EAAgB,KACjC,EAAS,IAAI,EAAG,CAAC,CAACgM,GAAkB,QAAQ,EAAG3hO,EAAM,OAAQ,KAAM,CAC3D,OAAQ,GACR,OAAQ,EAChB,CAAO,CAAC,CAAC,EAAG8+B,EAAao2L,IAAkB,CACnC,OAAU,eAClB,EAAS,CACD,QAAS,IAAM,QAAA,OAACwM,GAAgB5iM,EAAa,MAAO,CAClD,MAAS,iCACnB,EAAW,CAACA,EAAa,MAAO,CACtB,MAAS,CAAC,uBAAuB,CAC3C,EAAW,CAACA,EAAa,MAAO,KAAM,GAAC78B,GAAAkS,EAAM,iBAAN,YAAAlS,GAAA,KAAAkS,EAAuB,CACpD,WAAYnU,EAAM,UACnB,KAAKA,EAAM,WAAW,QAAQ8vG,EAAK,MAAQiwC,EAAS,MAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAG,CAAC,CAAC6hF,GAAQhB,EAAW,OAAS5gO,EAAM,SAAW4gO,EAAW,QAAU,QAAQ,CAAC,CAAC,CAAC,EACvJ,CAAA,CAAC,CAAC,CACT,CAAK,EACM,EACR,CACH,CAAC,ECxJM,MAAMiB,IAAwBjY,GAAa,CAChD,MAAO,CACL,KAAM,OACN,SAAU,EACX,EACD,KAAM,CACJ,KAAM,OACN,SAAU,EACX,EACD,GAAGC,GAAoB,CACzB,EAAG,cAAc,EACJiY,IAAe1R,GAAgB,EAAG,CAC7C,KAAM,eACN,MAAOyR,IAAuB,EAC9B,MAAO,CAAE,EACT,MAAM7hO,EAAOq7E,EAAM,CACjB,GAAI,CACF,MAAAlnE,CACD,EAAGknE,EACJ,MAAMslJ,EAAShkN,GAAOkhN,EAAa,EACnC,GAAI,CAAC8C,EAAQ,MAAM,IAAI,MAAM,oEAAoE,EACjG,KAAM,CACJ,MAAA9S,EACA,YAAA0S,EACA,QAAAtK,EACA,UAAAqK,EACA,SAAAvB,EACA,WAAAG,EACA,eAAAC,EACA,UAAA5nC,EACA,SAAAwmC,EACA,IAAAv1J,EACA,IAAA/iD,EACA,aAAAo5M,CACD,EAAG8B,EACE,CACJ,eAAAoB,CACN,EAAQ/L,IAAWC,CAAO,EAChB,CACJ,uBAAwB+L,EACxB,sBAAuBC,CAC7B,EAAQrM,GAAmBuJ,CAAc,EAC/B,CACJ,uBAAwB+C,EACxB,sBAAuBC,CAC7B,EAAQvM,GAAmBsJ,CAAU,EAC3BkD,EAAWx+N,EAAS,IAAM,SAASm6N,EAAS,MAAQ,QAAU,QAAQ,IAAIc,EAAa,MAAQ,MAAQ,OAAO,EAAE,EAChHwD,EAASz+N,EAAS,IAAMm6N,EAAS,MAAQ,SAAW,OAAO,EAC3DuE,EAAmB1+N,EAAS,KACzB,CACL,CAACw+N,EAAS,KAAK,EAAG,KAClB,CAACC,EAAO,KAAK,EAAG,MACxB,EACK,EACKE,EAAiB3+N,EAAS,IAAM5D,EAAM,KAAOA,EAAM,KAAK,EACxDwiO,EAAkB5+N,EAAS,KACxB,CACL,CAACw+N,EAAS,KAAK,EAAGlY,GAAclqN,EAAM,MAAO,GAAG,EAChD,CAACqiO,EAAO,KAAK,EAAGnY,GAAcqY,EAAe,MAAO,GAAG,CAC/D,EACK,EACKE,EAAgB7+N,EAAS,IACxB08N,EAAU,OACDvC,EAAS,MAAQwC,EAAY,MAAM,MAAK,EAAG,QAAO,EAAKA,EAAY,OACpE,IAAI,CAACmC,EAAMz7M,KAAU,OAChC,MAAM07M,EAAiBD,EAAK,QAAUl6J,EAAI,OAASk6J,EAAK,QAAUj9M,EAAI,MAAQykM,GAAcwY,EAAK,SAAU,GAAG,EAAI,OAClH,OAAO5jM,EAAa,MAAO,CACzB,IAAO4jM,EAAK,MACZ,MAAS,CAAC,uBAAwB,CAChC,+BAAgCA,EAAK,UAAY1iO,EAAM,OAAS0iO,EAAK,UAAY1iO,EAAM,KACvF,8BAA+B0iO,EAAK,QAAUl6J,EAAI,MAClD,6BAA8Bk6J,EAAK,QAAUj9M,EAAI,KAC7D,CAAW,EACD,MAAS,CACP,CAAC28M,EAAS,KAAK,EAAGO,CACnB,CACX,EAAW,EAAED,EAAK,OAASvuN,EAAM,YAAY,IAAM2qB,EAAa,MAAO,CAC7D,MAAS,4BACnB,EAAW,GAAC78B,EAAAkS,EAAM,gBAAN,YAAAlS,EAAA,KAAAkS,EAAsB,CACxB,KAAAuuN,EACA,MAAAz7M,EACD,KAAKy7M,EAAK,KAAK,CAAC,CAAC,CAAC,CAC3B,CAAO,EApB4B,EAqB9B,EACD,OAAA/R,GAAU,IACD7xL,EAAa,MAAO,CACzB,MAAS,CAAC,iBAAkBijM,EAAe,MAAO/hO,EAAM,KAAK,EAC7D,MAAS,CAAC,CACR,wBAAyBkqN,GAAc3yB,EAAU,KAAK,EACtD,uBAAwB2yB,GAAc6U,EAAS,KAAK,CAC9D,EAAW/+N,EAAM,KAAK,CACtB,EAAS,CAAC8+B,EAAa,MAAO,CACtB,MAAS,CAAC,6BAA8BojM,EAAkB,MAAO,CAC/D,sCAAuC,CAAC,CAACrU,EAAM,OAAS,CAACsR,EAAe,KAClF,CAAS,EACD,MAAS,CACP,GAAGmD,EAAiB,MACpB,GAAGH,EAAiB,KACrB,CACT,EAAS,IAAI,EAAGrjM,EAAa,MAAO,CAC5B,MAAS,CAAC,uBAAwBkjM,EAAsB,KAAK,EAC7D,MAAS,CACP,GAAGQ,EAAgB,MACnB,GAAGP,EAAqB,KACzB,CACF,EAAE,IAAI,EAAG3B,EAAU,OAASxhM,EAAa,MAAO,CAC/C,MAAS,CAAC,wBAAyB,CACjC,qCAAsCwhM,EAAU,QAAU,QACpE,CAAS,CACF,EAAE,CAACmC,EAAc,KAAK,CAAC,CAAC,CAAC,CAC3B,EACM,EACR,CACH,CAAC,EC1HKG,GAAW,CACf,MAAO,EACP,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,iBAAkB,EAClB,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,CACN,EACA,SAASC,IAAat2I,EAAM+lI,EAAQ,CAClC,MAAMwQ,EAAQ,CAAA,EACd,IAAIC,EAAc,CAAA,EAClB,MAAMC,EAAkBC,GAAa12I,CAAI,EACnC22I,EAAiBC,GAAW52I,CAAI,EAChC62I,GAAqBJ,EAAgB,OAAQ,EAAGJ,GAAStQ,EAAO,MAAM,EAAE,EAAE,YAAa,CAAA,EAAI,GAAK,EAChG+Q,GAAoBH,EAAe,OAAQ,EAAGN,GAAStQ,EAAO,MAAM,EAAE,EAAE,YAAa,CAAA,EAAI,GAAK,EACpG,QAASn2N,EAAI,EAAGA,EAAIinO,EAAmBjnO,IAAK,CAC1C,MAAMmnO,EAAc,IAAI,KAAKN,CAAe,EAC5CM,EAAY,QAAQA,EAAY,QAAS,GAAIF,EAAoBjnO,EAAE,EACnE4mO,EAAY,KAAKO,CAAW,CAC7B,CACD,QAASnnO,EAAI,EAAGA,GAAK+mO,EAAe,QAAO,EAAI/mO,IAAK,CAClD,MAAMonO,EAAM,IAAI,KAAKh3I,EAAK,YAAa,EAAEA,EAAK,WAAYpwF,CAAC,EAG3D4mO,EAAY,KAAKQ,CAAG,EAGhBR,EAAY,SAAW,IACzBD,EAAM,KAAKC,CAAW,EACtBA,EAAc,CAAA,EAEjB,CACD,QAAS5mO,EAAI,EAAGA,EAAI,EAAIknO,EAAkBlnO,IAAK,CAC7C,MAAMmnO,EAAc,IAAI,KAAKJ,CAAc,EAC3CI,EAAY,QAAQA,EAAY,QAAS,EAAGnnO,CAAC,EAC7C4mO,EAAY,KAAKO,CAAW,CAC7B,CACD,OAAIP,EAAY,OAAS,GACvBD,EAAM,KAAKC,CAAW,EAEjBD,CACT,CACA,SAASU,IAAYj3I,EAAM+lI,EAAQ,CACjC,MAAMnrL,EAAI,IAAI,KAAKolD,CAAI,EACvB,KAAOplD,EAAE,YAAcy7L,GAAStQ,EAAO,MAAM,EAAE,EAAE,aAAa,GAAK,IACjEnrL,EAAE,QAAQA,EAAE,QAAS,EAAG,CAAC,EAE3B,OAAOA,CACT,CACA,SAASs8L,IAAUl3I,EAAM+lI,EAAQ,CAC/B,MAAMnrL,EAAI,IAAI,KAAKolD,CAAI,EACjBm3I,IAAYd,GAAStQ,EAAO,MAAM,EAAE,EAAE,YAAW,CAAE,GAAK,GAAK,GAAK,EACxE,KAAOnrL,EAAE,OAAQ,IAAKu8L,GACpBv8L,EAAE,QAAQA,EAAE,QAAS,EAAG,CAAC,EAE3B,OAAOA,CACT,CACA,SAAS87L,GAAa12I,EAAM,CAC1B,OAAO,IAAI,KAAKA,EAAK,YAAW,EAAIA,EAAK,SAAQ,EAAI,CAAC,CACxD,CACA,SAAS42I,GAAW52I,EAAM,CACxB,OAAO,IAAI,KAAKA,EAAK,YAAa,EAAEA,EAAK,SAAU,EAAG,EAAG,CAAC,CAC5D,CACA,SAASo3I,IAAezmO,EAAO,CAC7B,MAAM4+I,EAAQ5+I,EAAM,MAAM,GAAG,EAAE,IAAI,MAAM,EAGzC,OAAO,IAAI,KAAK4+I,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAI,EAAGA,EAAM,CAAC,CAAC,CAClD,CACA,MAAM8nF,IAAW,kEACjB,SAASr3I,GAAKrvF,EAAO,CACnB,GAAIA,GAAS,KAAM,OAAO,IAAI,KAC9B,GAAIA,aAAiB,KAAM,OAAOA,EAClC,GAAI,OAAOA,GAAU,SAAU,CAC7B,IAAIsnE,EACJ,GAAIo/J,IAAS,KAAK1mO,CAAK,EACrB,OAAOymO,IAAezmO,CAAK,EAI7B,GAFEsnE,EAAS,KAAK,MAAMtnE,CAAK,EAEvB,CAAC,MAAMsnE,CAAM,EAAG,OAAO,IAAI,KAAKA,CAAM,CAC3C,CACD,OAAO,IACT,CACA,MAAMq/J,GAA0B,IAAI,KAAK,IAAM,EAAG,CAAC,EACnD,SAASC,IAAYxR,EAAQ,CAC3B,MAAMyR,EAAiBnB,GAAStQ,EAAO,MAAM,EAAE,EAAE,YAAW,CAAE,EAC9D,OAAOl6G,GAAY,CAAC,EAAE,IAAIj8G,GAAK,CAC7B,MAAM6nO,EAAU,IAAI,KAAKH,EAAuB,EAChD,OAAAG,EAAQ,QAAQH,GAAwB,QAAO,EAAKE,EAAiB5nO,CAAC,EAC/D,IAAI,KAAK,eAAem2N,EAAQ,CACrC,QAAS,QACf,CAAK,EAAE,OAAO0R,CAAO,CACrB,CAAG,CACH,CACA,SAAS19J,IAAOppE,EAAO+mO,EAAc3R,EAAQ4R,EAAS,CACpD,MAAMC,EAAU53I,GAAKrvF,CAAK,GAAK,IAAI,KAC7BknO,EAAeF,GAAA,YAAAA,EAAUD,GAC/B,GAAI,OAAOG,GAAiB,WAC1B,OAAOA,EAAaD,EAASF,EAAc3R,CAAM,EAEnD,IAAItuN,EAAU,CAAA,EACd,OAAQigO,EAAY,CAClB,IAAK,WACHjgO,EAAU,CACR,KAAM,UACN,MAAO,OACP,IAAK,SACb,EACM,MACF,IAAK,sBACHA,EAAU,CACR,QAAS,OACT,KAAM,UACN,MAAO,OACP,IAAK,SACb,EACM,MACF,IAAK,aACH,MAAMu/N,EAAMY,EAAQ,UACdtlD,EAAQ,IAAI,KAAK,eAAeyzC,EAAQ,CAC5C,MAAO,MACf,CAAO,EAAE,OAAO6R,CAAO,EACjB,MAAO,GAAGZ,CAAG,IAAI1kD,CAAK,GACxB,IAAK,wBACH76K,EAAU,CACR,QAAS,QACT,IAAK,UACL,MAAO,OACf,EACM,MACF,IAAK,YACHA,EAAU,CACR,MAAO,QACP,IAAK,SACb,EACM,MACF,IAAK,OACHA,EAAU,CACR,KAAM,SACd,EACM,MACF,IAAK,QACHA,EAAU,CACR,MAAO,MACf,EACM,MACF,IAAK,aACHA,EAAU,CACR,MAAO,OACf,EACM,MACF,IAAK,eACHA,EAAU,CACR,MAAO,OACP,KAAM,SACd,EACM,MACF,IAAK,eACHA,EAAU,CACR,MAAO,OACP,IAAK,SACb,EACM,MACF,IAAK,UACHA,EAAU,CACR,QAAS,MACjB,EACM,MACF,IAAK,eACHA,EAAU,CACR,QAAS,OACjB,EACM,MACF,IAAK,aACH,OAAO,IAAI,KAAK,aAAasuN,CAAM,EAAE,OAAO6R,EAAQ,QAAO,CAAE,EAC/D,IAAK,WACHngO,EAAU,CACR,KAAM,UACN,OAAQ,EAChB,EACM,MACF,IAAK,WACHA,EAAU,CACR,KAAM,UACN,OAAQ,EAChB,EACM,MACF,IAAK,UACHA,EAAU,CACR,OAAQ,SAChB,EACM,MACF,IAAK,UACHA,EAAU,CACR,OAAQ,SAChB,EACM,MACF,IAAK,WACHA,EAAU,CACR,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,OAAQ,EAChB,EACM,MACF,IAAK,cACHA,EAAU,CACR,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,OAAQ,EAChB,EACM,MACF,IAAK,cACHA,EAAU,CACR,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,OAAQ,EAChB,EACM,MACF,IAAK,eACHA,EAAU,CACR,KAAM,UACN,MAAO,OACP,IAAK,UACL,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,OAAQ,EAChB,EACM,MACF,IAAK,kBACHA,EAAU,CACR,KAAM,UACN,MAAO,OACP,IAAK,UACL,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,OAAQ,EAChB,EACM,MACF,IAAK,kBACHA,EAAU,CACR,KAAM,UACN,MAAO,OACP,IAAK,UACL,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,OAAQ,EAChB,EACM,MACF,IAAK,eACHA,EAAU,CACR,KAAM,UACN,MAAO,UACP,IAAK,SACb,EACM,MACF,IAAK,mBACHA,EAAU,CACR,KAAM,UACN,MAAO,UACP,IAAK,UACL,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,OAAQ,EAChB,EACM,MACF,IAAK,sBACHA,EAAU,CACR,KAAM,UACN,MAAO,UACP,IAAK,UACL,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,OAAQ,EAChB,EACM,MACF,IAAK,sBACHA,EAAU,CACR,KAAM,UACN,MAAO,UACP,IAAK,UACL,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,OAAQ,EAChB,EACM,MACF,QACEA,EAAUogO,GAAgB,CACxB,SAAU,MACV,aAAc,OACtB,CACG,CACD,OAAO,IAAI,KAAK,eAAe9R,EAAQtuN,CAAO,EAAE,OAAOmgO,CAAO,CAChE,CACA,SAASE,IAAMr5J,EAAS9tE,EAAO,CAC7B,MAAMqvF,EAAOvhB,EAAQ,SAAS9tE,CAAK,EAC7B8pJ,EAAOz6D,EAAK,cACZsyF,EAAQn2D,GAAS,OAAOn8B,EAAK,SAAU,EAAG,CAAC,EAAG,EAAG,GAAG,EACpDg3I,EAAM76G,GAAS,OAAOn8B,EAAK,SAAS,EAAG,EAAG,GAAG,EACnD,MAAO,GAAGy6D,CAAI,IAAI63B,CAAK,IAAI0kD,CAAG,EAChC,CACA,SAASe,IAASpnO,EAAO,CACvB,KAAM,CAAC8pJ,EAAM63B,EAAO0kD,CAAG,EAAIrmO,EAAM,MAAM,GAAG,EAAE,IAAI,MAAM,EACtD,OAAO,IAAI,KAAK8pJ,EAAM63B,EAAQ,EAAG0kD,CAAG,CACtC,CACA,SAASgB,IAAWh4I,EAAMyxD,EAAQ,CAChC,MAAM72G,EAAI,IAAI,KAAKolD,CAAI,EACvB,OAAAplD,EAAE,WAAWA,EAAE,WAAY,EAAG62G,CAAM,EAC7B72G,CACT,CACA,SAASq9L,IAASj4I,EAAMyxD,EAAQ,CAC9B,MAAM72G,EAAI,IAAI,KAAKolD,CAAI,EACvB,OAAAplD,EAAE,SAASA,EAAE,SAAU,EAAG62G,CAAM,EACzB72G,CACT,CACA,SAASs9L,IAAQl4I,EAAMyxD,EAAQ,CAC7B,MAAM72G,EAAI,IAAI,KAAKolD,CAAI,EACvB,OAAAplD,EAAE,QAAQA,EAAE,QAAS,EAAG62G,CAAM,EACvB72G,CACT,CACA,SAASu9L,IAASn4I,EAAMyxD,EAAQ,CAC9B,MAAM72G,EAAI,IAAI,KAAKolD,CAAI,EACvB,OAAAplD,EAAE,QAAQA,EAAE,QAAO,EAAK62G,EAAS,CAAC,EAC3B72G,CACT,CACA,SAASw9L,IAAUp4I,EAAMyxD,EAAQ,CAC/B,MAAM72G,EAAI,IAAI,KAAKolD,CAAI,EACvB,OAAAplD,EAAE,QAAQ,CAAC,EACXA,EAAE,SAASA,EAAE,SAAU,EAAG62G,CAAM,EACzB72G,CACT,CACA,SAASy9L,IAAQr4I,EAAM,CACrB,OAAOA,EAAK,aACd,CACA,SAASs4I,IAASt4I,EAAM,CACtB,OAAOA,EAAK,UACd,CACA,SAASu4I,IAAQv4I,EAAM,CACrB,OAAOA,EAAK,SACd,CACA,SAASw4I,IAAax4I,EAAM,CAC1B,OAAO,IAAI,KAAKA,EAAK,YAAa,EAAEA,EAAK,SAAU,EAAG,EAAG,CAAC,CAC5D,CACA,SAASy4I,IAAiBz4I,EAAM,CAC9B,OAAO,IAAI,KAAKA,EAAK,YAAa,EAAEA,EAAK,SAAU,EAAG,EAAG,CAAC,CAC5D,CACA,SAAS04I,IAAS14I,EAAM,CACtB,OAAOA,EAAK,UACd,CACA,SAAS24I,IAAW34I,EAAM,CACxB,OAAOA,EAAK,YACd,CACA,SAAS44I,IAAY54I,EAAM,CACzB,OAAO,IAAI,KAAKA,EAAK,YAAW,EAAI,EAAG,CAAC,CAC1C,CACA,SAAS64I,IAAU74I,EAAM,CACvB,OAAO,IAAI,KAAKA,EAAK,YAAW,EAAI,GAAI,EAAE,CAC5C,CACA,SAAS84I,IAAc94I,EAAMq/B,EAAO,CAClC,OAAO05G,GAAQ/4I,EAAMq/B,EAAM,CAAC,CAAC,GAAK25G,IAASh5I,EAAMq/B,EAAM,CAAC,CAAC,CAC3D,CACA,SAASm2D,IAAQx1F,EAAM,CACrB,MAAMplD,EAAI,IAAI,KAAKolD,CAAI,EACvB,OAAOplD,aAAa,MAAQ,CAAC,MAAMA,EAAE,QAAO,CAAE,CAChD,CACA,SAASm+L,GAAQ/4I,EAAMi5I,EAAW,CAChC,OAAOj5I,EAAK,QAAO,EAAKi5I,EAAU,QAAO,CAC3C,CACA,SAASC,IAAWl5I,EAAMi5I,EAAW,CACnC,OAAOF,GAAQI,GAAWn5I,CAAI,EAAGm5I,GAAWF,CAAS,CAAC,CACxD,CACA,SAASD,IAASh5I,EAAMi5I,EAAW,CACjC,OAAOj5I,EAAK,QAAO,EAAKi5I,EAAU,QAAO,CAC3C,CACA,SAAShhH,GAAQj4B,EAAMi5I,EAAW,CAChC,OAAOj5I,EAAK,QAAO,IAAOi5I,EAAU,QAAO,CAC7C,CACA,SAASG,IAAUp5I,EAAMi5I,EAAW,CAClC,OAAOj5I,EAAK,QAAS,IAAKi5I,EAAU,QAAO,GAAMj5I,EAAK,SAAQ,IAAOi5I,EAAU,SAAU,GAAIj5I,EAAK,YAAW,IAAOi5I,EAAU,aAChI,CACA,SAASI,IAAYr5I,EAAMi5I,EAAW,CACpC,OAAOj5I,EAAK,aAAei5I,EAAU,SAAQ,GAAMj5I,EAAK,YAAa,IAAKi5I,EAAU,aACtF,CACA,SAASK,IAAWt5I,EAAMi5I,EAAW,CACnC,OAAOj5I,EAAK,YAAW,IAAOi5I,EAAU,YAAW,CACrD,CACA,SAASM,IAAQv5I,EAAMi5I,EAAW98I,EAAM,CACtC,MAAMvhD,EAAI,IAAI,KAAKolD,CAAI,EACjBzuF,EAAI,IAAI,KAAK0nO,CAAS,EAC5B,OAAQ98I,EAAI,CACV,IAAK,QACH,OAAOvhD,EAAE,YAAW,EAAKrpC,EAAE,YAAW,EACxC,IAAK,WACH,OAAO,KAAK,OAAOqpC,EAAE,SAAQ,EAAKrpC,EAAE,SAAQ,GAAMqpC,EAAE,YAAW,EAAKrpC,EAAE,YAAW,GAAM,IAAM,CAAC,EAChG,IAAK,SACH,OAAOqpC,EAAE,WAAarpC,EAAE,SAAU,GAAIqpC,EAAE,YAAW,EAAKrpC,EAAE,YAAW,GAAM,GAC7E,IAAK,QACH,OAAO,KAAK,OAAOqpC,EAAE,QAAS,EAAGrpC,EAAE,QAAO,IAAO,IAAO,GAAK,GAAK,GAAK,EAAE,EAC3E,IAAK,OACH,OAAO,KAAK,OAAOqpC,EAAE,QAAO,EAAKrpC,EAAE,QAAO,IAAO,IAAO,GAAK,GAAK,GAAG,EACvE,IAAK,QACH,OAAO,KAAK,OAAOqpC,EAAE,QAAS,EAAGrpC,EAAE,QAAS,IAAK,IAAO,GAAK,GAAG,EAClE,IAAK,UACH,OAAO,KAAK,OAAOqpC,EAAE,QAAO,EAAKrpC,EAAE,QAAS,IAAK,IAAO,GAAG,EAC7D,IAAK,UACH,OAAO,KAAK,OAAOqpC,EAAE,QAAS,EAAGrpC,EAAE,WAAa,GAAI,EACtD,QAEI,OAAOqpC,EAAE,QAAO,EAAKrpC,EAAE,QAAO,CAEnC,CACH,CACA,SAASioO,IAASx5I,EAAM3rC,EAAO,CAC7B,MAAMzZ,EAAI,IAAI,KAAKolD,CAAI,EACvB,OAAAplD,EAAE,SAASyZ,CAAK,EACTzZ,CACT,CACA,SAAS6+L,IAAWz5I,EAAM3rC,EAAO,CAC/B,MAAMzZ,EAAI,IAAI,KAAKolD,CAAI,EACvB,OAAAplD,EAAE,WAAWyZ,CAAK,EACXzZ,CACT,CACA,SAAS8+L,IAAS15I,EAAM3rC,EAAO,CAC7B,MAAMzZ,EAAI,IAAI,KAAKolD,CAAI,EACvB,OAAAplD,EAAE,SAASyZ,CAAK,EACTzZ,CACT,CACA,SAAS++L,IAAQ35I,EAAMg3I,EAAK,CAC1B,MAAMp8L,EAAI,IAAI,KAAKolD,CAAI,EACvB,OAAAplD,EAAE,QAAQo8L,CAAG,EACNp8L,CACT,CACA,SAASg/L,IAAQ55I,EAAMy6D,EAAM,CAC3B,MAAM7/G,EAAI,IAAI,KAAKolD,CAAI,EACvB,OAAAplD,EAAE,YAAY6/G,CAAI,EACX7/G,CACT,CACA,SAASu+L,GAAWn5I,EAAM,CACxB,OAAO,IAAI,KAAKA,EAAK,YAAa,EAAEA,EAAK,SAAQ,EAAIA,EAAK,QAAS,EAAE,EAAG,EAAG,EAAG,CAAC,CACjF,CACA,SAAS65I,IAAS75I,EAAM,CACtB,OAAO,IAAI,KAAKA,EAAK,YAAa,EAAEA,EAAK,SAAQ,EAAIA,EAAK,QAAS,EAAE,GAAI,GAAI,GAAI,GAAG,CACtF,CACO,MAAM85I,GAAmB,CAC9B,YAAYriO,EAAS,CACnB,KAAK,OAASA,EAAQ,OACtB,KAAK,QAAUA,EAAQ,OACxB,CACD,KAAK9G,EAAO,CACV,OAAOqvF,GAAKrvF,CAAK,CAClB,CACD,SAASqvF,EAAM,CACb,OAAOA,CACR,CACD,MAAMA,EAAM,CACV,OAAO83I,IAAM,KAAM93I,CAAI,CACxB,CACD,SAASA,EAAM,CACb,OAAO+3I,IAAS/3I,CAAI,CACrB,CACD,WAAWA,EAAMyxD,EAAQ,CACvB,OAAOumF,IAAWh4I,EAAMyxD,CAAM,CAC/B,CACD,SAASzxD,EAAMyxD,EAAQ,CACrB,OAAOwmF,IAASj4I,EAAMyxD,CAAM,CAC7B,CACD,QAAQzxD,EAAMyxD,EAAQ,CACpB,OAAOymF,IAAQl4I,EAAMyxD,CAAM,CAC5B,CACD,SAASzxD,EAAMyxD,EAAQ,CACrB,OAAO0mF,IAASn4I,EAAMyxD,CAAM,CAC7B,CACD,UAAUzxD,EAAMyxD,EAAQ,CACtB,OAAO2mF,IAAUp4I,EAAMyxD,CAAM,CAC9B,CACD,aAAazxD,EAAM,CACjB,OAAOs2I,IAAat2I,EAAM,KAAK,MAAM,CACtC,CACD,YAAYA,EAAM,CAChB,OAAOi3I,IAAYj3I,EAAM,KAAK,MAAM,CACrC,CACD,UAAUA,EAAM,CACd,OAAOk3I,IAAUl3I,EAAM,KAAK,MAAM,CACnC,CACD,aAAaA,EAAM,CACjB,OAAO02I,GAAa12I,CAAI,CACzB,CACD,WAAWA,EAAM,CACf,OAAO42I,GAAW52I,CAAI,CACvB,CACD,OAAOA,EAAM03I,EAAc,CACzB,OAAO39J,IAAOimB,EAAM03I,EAAc,KAAK,OAAQ,KAAK,OAAO,CAC5D,CACD,QAAQ13I,EAAMi5I,EAAW,CACvB,OAAOhhH,GAAQj4B,EAAMi5I,CAAS,CAC/B,CACD,QAAQj5I,EAAM,CACZ,OAAOw1F,IAAQx1F,CAAI,CACpB,CACD,cAAcA,EAAMq/B,EAAO,CACzB,OAAOy5G,IAAc94I,EAAMq/B,CAAK,CACjC,CACD,QAAQr/B,EAAMi5I,EAAW,CACvB,OAAOF,GAAQ/4I,EAAMi5I,CAAS,CAC/B,CACD,WAAWj5I,EAAMi5I,EAAW,CAC1B,OAAOC,IAAWl5I,EAAMi5I,CAAS,CAClC,CACD,SAASj5I,EAAMi5I,EAAW,CACxB,MAAO,CAACF,GAAQ/4I,EAAMi5I,CAAS,GAAK,CAAChhH,GAAQj4B,EAAMi5I,CAAS,CAC7D,CACD,UAAUj5I,EAAMi5I,EAAW,CACzB,OAAOG,IAAUp5I,EAAMi5I,CAAS,CACjC,CACD,YAAYj5I,EAAMi5I,EAAW,CAC3B,OAAOI,IAAYr5I,EAAMi5I,CAAS,CACnC,CACD,WAAWj5I,EAAMi5I,EAAW,CAC1B,OAAOK,IAAWt5I,EAAMi5I,CAAS,CAClC,CACD,WAAWj5I,EAAM3rC,EAAO,CACtB,OAAOolL,IAAWz5I,EAAM3rC,CAAK,CAC9B,CACD,SAAS2rC,EAAM3rC,EAAO,CACpB,OAAOmlL,IAASx5I,EAAM3rC,CAAK,CAC5B,CACD,SAAS2rC,EAAM3rC,EAAO,CACpB,OAAOqlL,IAAS15I,EAAM3rC,CAAK,CAC5B,CACD,QAAQ2rC,EAAMg3I,EAAK,CACjB,OAAO2C,IAAQ35I,EAAMg3I,CAAG,CACzB,CACD,QAAQh3I,EAAMy6D,EAAM,CAClB,OAAOm/E,IAAQ55I,EAAMy6D,CAAI,CAC1B,CACD,QAAQz6D,EAAMi5I,EAAW98I,EAAM,CAC7B,OAAOo9I,IAAQv5I,EAAMi5I,EAAW98I,CAAI,CACrC,CACD,aAAc,CACZ,OAAOo7I,IAAY,KAAK,MAAM,CAC/B,CACD,QAAQv3I,EAAM,CACZ,OAAOq4I,IAAQr4I,CAAI,CACpB,CACD,SAASA,EAAM,CACb,OAAOs4I,IAASt4I,CAAI,CACrB,CACD,QAAQA,EAAM,CACZ,OAAOu4I,IAAQv4I,CAAI,CACpB,CACD,aAAaA,EAAM,CACjB,OAAOw4I,IAAax4I,CAAI,CACzB,CACD,iBAAiBA,EAAM,CACrB,OAAOy4I,IAAiBz4I,CAAI,CAC7B,CACD,SAASA,EAAM,CACb,OAAO04I,IAAS14I,CAAI,CACrB,CACD,WAAWA,EAAM,CACf,OAAO24I,IAAW34I,CAAI,CACvB,CACD,WAAWA,EAAM,CACf,OAAOm5I,GAAWn5I,CAAI,CACvB,CACD,SAASA,EAAM,CACb,OAAO65I,IAAS75I,CAAI,CACrB,CACD,YAAYA,EAAM,CAChB,OAAO44I,IAAY54I,CAAI,CACxB,CACD,UAAUA,EAAM,CACd,OAAO64I,IAAU74I,CAAI,CACtB,CACH,CCltBO,MAAM+5I,IAAoB,OAAO,IAAI,sBAAsB,EACrDC,GAAoB,OAAO,IAAI,sBAAsB,EAC3D,SAASC,IAAWxiO,EAASsuN,EAAQ,CAC1C,MAAM/2F,EAAWmvF,GAAU,CACzB,QAAS2b,IACT,OAAQ,CACN,GAAI,QAEJ,GAAI,QACJ,GAAI,QACJ,IAAK,GACL,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QAEJ,GAAI,QACJ,GAAI,QACJ,GAAI,QAEJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,OAAQ,QACR,OAAQ,QACR,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,OAAQ,QACR,OAAQ,OACT,CACF,EAAEriO,CAAO,EACV,MAAO,CACL,QAASu3H,EACT,SAAU/sD,IAAe+sD,EAAU+2F,CAAM,CAC7C,CACA,CACA,SAAS9jJ,IAAexqE,EAASsuN,EAAQ,CACvC,MAAM9jN,EAAWrH,GAAS,OAAOnD,EAAQ,SAAY,WAEnD,IAAIA,EAAQ,QAAQ,CACpB,OAAQA,EAAQ,OAAOsuN,EAAO,QAAQ,KAAK,GAAKA,EAAO,QAAQ,MAC/D,QAAStuN,EAAQ,OACrB,CAAG,EAAIA,EAAQ,OAAO,EACpB,OAAAiZ,GAAMq1M,EAAO,QAASp1N,GAAS,CAC7BsR,EAAS,OAASxK,EAAQ,OAAO9G,CAAK,GAAKA,GAASsR,EAAS,MACjE,CAAG,EACMA,CACT,CC1DO,MAAMi4N,IAAwB7c,GAAa,CAChD,GAAGyQ,GAAgB,EACnB,GAAGsB,GAAiB,EACpB,GAAGuC,IAAiB,EACpB,OAAQ,QACR,WAAY,CACV,KAAM,MACN,QAAS,IAAM,CAAC,EAAG,CAAC,CACrB,CACH,EAAG,cAAc,EACJwI,IAAetW,GAAgB,EAAG,CAC7C,KAAM,eACN,MAAOqW,IAAuB,EAC9B,MAAO,CACL,iBAAkBvpO,GAAS,GAC3B,oBAAqBA,GAAS,GAC9B,IAAKA,GAAS,GACd,MAAOA,GAAS,EACjB,EACD,MAAM8C,EAAOq7E,EAAM,CACjB,GAAI,CACF,MAAAlnE,EACA,KAAAtC,CACD,EAAGwpE,EACJ,MAAMsrJ,EAAgBn6N,IAChBo6N,EAAep6N,IACfoxK,EAAWpxK,IACX,CACJ,WAAAuvN,CACD,EAAGtJ,GAAM,EACV,SAASkM,EAAet0M,EAAG,CACzB,GAAI,CAACs8M,EAAc,OAAS,CAACC,EAAa,MAAO,OACjD,MAAMvH,EAAcvB,GAAUzzM,EAAGs8M,EAAc,MAAM,IAAK3mO,EAAM,SAAS,EACnE6mO,EAAa/I,GAAUzzM,EAAGu8M,EAAa,MAAM,IAAK5mO,EAAM,SAAS,EACjEe,GAAI,KAAK,IAAIs+N,CAAW,EACxBr+N,EAAI,KAAK,IAAI6lO,CAAU,EAC7B,OAAO9lO,GAAIC,GAAKD,KAAMC,GAAKq+N,EAAc,EAAIsH,EAAc,MAAM,IAAMC,EAAa,MAAM,GAC3F,CACD,MAAMrI,EAAQJ,IAASn+N,CAAK,EACtB2yI,EAAQm+E,GAAgB9wN,EAAO,aAAc,OAAW/D,GACvDA,GAAA,MAAAA,EAAK,OACHA,EAAI,IAAIiB,GAASqhO,EAAM,WAAWrhO,CAAK,CAAC,EADtB,CAAC,EAAG,CAAC,CAE/B,EACK,CACJ,eAAAqiO,EACA,UAAAiB,EACA,IAAA/6M,EACA,IAAA+iD,EACA,aAAA42J,EACA,kBAAAgB,EACA,mBAAAD,EACA,SAAA3iK,EACA,kBAAA8hK,EACA,SAAAp4N,CACD,EAAGo3N,IAAU,CACZ,MAAAt+N,EACA,MAAAu+N,EACA,cAAe,IAAM,CACnB1sN,EAAK,QAAS8gI,EAAM,KAAK,CAC1B,EACD,YAAa/T,GAAS,QACpB,GAAI,CACF,MAAA1hI,CACD,EAAG0hI,EACJ,MAAMp5H,EAAW+5N,EAAe,UAAUt9N,GAAA0kO,EAAc,QAAd,YAAA1kO,GAAqB,KAAM,CAAC/E,EAAOy1I,EAAM,MAAM,CAAC,CAAC,EAAI,CAACA,EAAM,MAAM,CAAC,EAAGz1I,CAAK,EACjH,CAAC8C,EAAM,QAAUwF,EAAS,CAAC,EAAIA,EAAS,CAAC,IAC3CmtI,EAAM,MAAQntI,GAEhBqM,EAAK,MAAO8gI,EAAM,KAAK,CACxB,EACD,aAAc/U,GAAS,eACrB,GAAI,CACF,MAAA1gI,CACD,EAAG0gI,EACJ,KAAM,CAAC1tH,EAAO/L,EAAI,EAAIwuI,EAAM,MACxB,CAAC3yI,EAAM,QAAUkQ,IAAU/L,IAAQ+L,IAAUs4D,EAAI,QACnD+2J,EAAe,MAAQriO,EAAQgT,GAAQjO,EAAA2kO,EAAa,QAAb,YAAA3kO,EAAoB,KAAMyP,EAAAi1N,EAAc,QAAd,YAAAj1N,EAAqB,KACtFw1K,GAAAq4C,EAAe,QAAf,MAAAr4C,GAAsB,SAEpBq4C,EAAe,UAAUp4C,GAAAw/C,EAAc,QAAd,YAAAx/C,GAAqB,KAChDx0C,EAAM,MAAQ,CAAC,KAAK,IAAIz1I,EAAOiH,EAAI,EAAGA,EAAI,EAE1CwuI,EAAM,MAAQ,CAACziI,EAAO,KAAK,IAAIA,EAAOhT,CAAK,CAAC,CAE/C,EACD,eAAAyhO,CACN,CAAK,EACK,CACJ,UAAApE,EACA,MAAAE,EACA,KAAAC,CACN,EAAQJ,IAASt6N,CAAK,EACZy/N,EAAa77N,EAAS,IAAM45D,EAASm1E,EAAM,MAAM,CAAC,CAAC,CAAC,EACpDm0F,EAAYljO,EAAS,IAAM45D,EAASm1E,EAAM,MAAM,CAAC,CAAC,CAAC,EACzD,OAAAg+E,GAAU,IAAM,CACd,MAAMoW,EAAanL,GAAO,YAAY57N,CAAK,EACrCi8N,EAAa,CAAC,EAAEj8N,EAAM,OAASmU,EAAM,OAASA,EAAM,SAC1D,OAAO2qB,EAAa88L,GAAQzE,GAAY,CACtC,MAAS,CAAC,WAAY,iBAAkB,CACtC,uBAAwB,CAAC,CAAChjN,EAAM,YAAY,GAAKqsN,EAAU,MAC3D,oBAAqBjG,EAAU,MAC/B,oBAAqB6E,EAAa,MAClC,qBAAsBp/N,EAAM,QAC7B,EAAE+7N,EAAW,MAAO/7N,EAAM,KAAK,EAChC,MAASA,EAAM,MACf,IAAO49K,CACR,EAAEmpD,EAAY,CACb,QAAWxM,EAAU,KAC7B,CAAO,EAAG,CACF,GAAGpmN,EACH,QAAS8nN,EAAa5zK,GAAavpB,UAAAA,OAAAA,EAAakoM,GAAW,KAAM,GAAC/kO,GAAAkS,EAAM,QAAN,YAAAlS,GAAA,KAAAkS,EAAck0C,MAAeroD,EAAM,MAAQ8+B,EAAai7L,IAAQ,CAChI,MAAS,kBACT,KAAQ/5N,EAAM,KACxB,EAAW,IAAI,EAAI,SAAY0R,EAAAyC,EAAM,UAAN,YAAAzC,EAAA,KAAAyC,EAAgBk0C,EAAU,CAAC,GAAI,OACtD,QAASu3E,GAAS,UAChB,GAAI,CACF,GAAA3vH,GACA,WAAA+rN,CACD,EAAGp8F,EACJ,OAAO9gG,EAAa,MAAO,CACzB,MAAS,sBACT,YAAgB53B,EAAS,MAA4B,OAApBk5N,EACjC,oBAAwBl5N,EAAS,MAA6B,OAArBi5N,CACrD,EAAa,CAACrhM,EAAa,QAAS,CACxB,GAAM,GAAG7uB,GAAG,KAAK,SACjB,KAAQjQ,EAAM,MAAQiQ,GAAG,MACzB,SAAY,CAAC,CAACjQ,EAAM,SACpB,SAAY,CAAC,CAACA,EAAM,SACpB,SAAY,KACZ,MAAS2yI,EAAM,MAAM,CAAC,CAClC,EAAa,IAAI,EAAG7zG,EAAa,QAAS,CAC9B,GAAM,GAAG7uB,GAAG,KAAK,QACjB,KAAQjQ,EAAM,MAAQiQ,GAAG,MACzB,SAAY,CAAC,CAACjQ,EAAM,SACpB,SAAY,CAAC,CAACA,EAAM,SACpB,SAAY,KACZ,MAAS2yI,EAAM,MAAM,CAAC,CAClC,EAAa,IAAI,EAAG7zG,EAAagjM,IAAc,CACnC,IAAOxC,EACP,MAASG,EAAW,MACpB,KAAQqH,EAAU,KAC9B,EAAa,CACD,aAAc3yN,EAAM,YAAY,CAC5C,CAAW,EAAG2qB,EAAa4hM,GAAc,CAC7B,IAAOiG,EACP,mBAAoB3K,EAAW,MAC/B,QAAWzB,GAAagF,EAAe,UAAUt9N,EAAA0kO,EAAc,QAAd,YAAA1kO,EAAqB,KACtE,WAAc0wI,EAAM,MAAM,CAAC,EAC3B,sBAAuB3wI,IAAK2wI,EAAM,MAAQ,CAAC3wI,GAAG2wI,EAAM,MAAM,CAAC,CAAC,EAC5D,QAAWtoH,IAAK,gBACdowM,IACA8E,EAAe,OAAQt9N,EAAA0kO,EAAc,QAAd,YAAA1kO,EAAqB,IAMxC0wI,EAAM,MAAM,CAAC,IAAMA,EAAM,MAAM,CAAC,GAAKA,EAAM,MAAM,CAAC,IAAMnqE,EAAI,OAASn+C,GAAE,kBAAkB3Y,GAAAk1N,EAAa,QAAb,YAAAl1N,GAAoB,QAC/Gw1K,GAAAy/C,EAAc,QAAd,MAAAz/C,GAAqB,IAAI,QACzBC,GAAAy/C,EAAa,QAAb,MAAAz/C,GAAoB,IAAI,QAE3B,EACD,OAAU,IAAM,CACduzC,IACA6E,EAAe,MAAQ,MACxB,EACD,IAAO/2J,EAAI,MACX,IAAOmqE,EAAM,MAAM,CAAC,EACpB,SAAY8sF,EAAW,MACvB,OAAUz/N,EAAM,MAC5B,EAAa,CACD,cAAemU,EAAM,aAAa,CAC9C,CAAW,EAAG2qB,EAAa4hM,GAAc,CAC7B,IAAOkG,EACP,mBAAoB5K,EAAW,MAC/B,QAAWzB,GAAagF,EAAe,UAAU7tN,GAAAk1N,EAAa,QAAb,YAAAl1N,GAAoB,KACrE,WAAcihI,EAAM,MAAM,CAAC,EAC3B,sBAAuB3wI,IAAK2wI,EAAM,MAAQ,CAACA,EAAM,MAAM,CAAC,EAAG3wI,EAAC,EAC5D,QAAWqoB,IAAK,gBACdowM,IACA8E,EAAe,OAAQt9N,EAAA2kO,EAAa,QAAb,YAAA3kO,EAAoB,IAMvC0wI,EAAM,MAAM,CAAC,IAAMA,EAAM,MAAM,CAAC,GAAKA,EAAM,MAAM,CAAC,IAAMltH,EAAI,OAAS4E,GAAE,kBAAkB3Y,GAAAi1N,EAAc,QAAd,YAAAj1N,GAAqB,QAChHw1K,GAAA0/C,EAAa,QAAb,MAAA1/C,GAAoB,IAAI,QACxBC,GAAAw/C,EAAc,QAAd,MAAAx/C,GAAqB,IAAI,QAE5B,EACD,OAAU,IAAM,CACduzC,IACA6E,EAAe,MAAQ,MACxB,EACD,IAAO5sF,EAAM,MAAM,CAAC,EACpB,IAAOltH,EAAI,MACX,SAAYqhN,EAAU,MACtB,OAAU9mO,EAAM,MAC5B,EAAa,CACD,cAAemU,EAAM,aAAa,CACnC,CAAA,CAAC,CAAC,CACJ,CACT,CAAO,CACP,CAAK,EACM,EACR,CACH,CAAC,qfCzND,MAAMnU,EAAQgzD,EAkCRnhD,EAAOsiD,EACPy3D,EAAQp/G,EAAIxM,EAAM,UAAU,EAE5BinO,EAAsBrjO,EAAS,IAAM5D,EAAM,eAAe,EAC1DknO,EAAetjO,EAAS,IAAM5D,EAAM,UAAU,EAE9CmnO,EAAuBvjO,EAAS,KAC7B,CACL,qBAAsB,GACtB,uBAAwB5D,EAAM,WAAa,QAC/C,EACC,EAEKonO,EAAe7rO,GAAQ,CAC3BsW,EAAK,oBAAqBtW,CAAG,CAC/B,EACM8rO,EAAmBnqO,GAAU,CACjC2U,EAAK,uBAAwB3U,CAAK,CACpC,EACA,OAAA+f,GAAMgqN,EAAsB36N,GAAW,CACjCA,EAAO,SAAW,IACpBs/G,EAAM,MAAQ5rH,EAAM,WAExB,CAAC,EAEDid,GAAMiqN,EAAe56N,GAAW,CAC9Bs/G,EAAM,MAAQt/G,CAChB,CAAC,4nBCKKg7N,IAAmB,EACnBC,IAAmB,oRAjEzB,MAAMvnO,EAAQgzD,EAuBRnhD,EAAOsiD,EAEPqzK,EAAsBh7N,EAAI,EAAK,EAC/Bi7N,EAAsBj7N,EAAIxM,EAAM,UAAU,EAC1C0nO,EAAc9jO,EAAS,IAAM4jO,EAAoB,OAASC,EAAoB,KAAK,EACnFE,EAAuBhrN,GAAO,mBAAmB,EAEjDirN,EAAoBhkO,EAAS,IAC1B5D,EAAM,WACd,EAEKopN,EAAgBxlN,EAAS,IAAM,SACnC,OAAQgkO,EAAkB,MAAM,KAAI,CAClC,IAAK,SACH,OAAI5nO,EAAM,QAAQ,SAAW,GAAK4nO,EAAkB,MAAM,OAAO,SAAW,EACnEA,EAAkB,MAAM,OAAO,IAAKC,IAAgB,CAAE,MAAOA,EAAW,IAAK,MAAOA,EAAW,GAAG,EAAG,EAEvG7nO,EAAM,QACf,IAAK,QAAS,CACZ,MAAM8nO,EAAcF,EAAkB,MAAM,OACtCp/J,IAAMvmE,EAAA6lO,EAAY,KAAMC,IAAeA,GAAW,MAAQ,KAAK,IAAzD,YAAA9lO,EAA4D,QAAS,EAC3EwjB,IAAM/T,EAAAo2N,EAAY,KAAMC,IAAeA,GAAW,MAAQ,KAAK,IAAzD,YAAAr2N,EAA4D,QAAS,EACjF,MAAO,CAAC82D,EAAK/iD,CAAG,CACjB,CACD,QACE,OAAOzlB,EAAM,SAAW,EAC3B,CACH,CAAC,EAEK8nO,EAAclkO,EAAS,IACvBgkO,EAAkB,MAAM,OAAS,SAAW5nO,EAAM,WAAW,OAAS,EACjEA,EAAM,WAGRopN,EAAc,KACtB,EAEK4e,EAAYpkO,EAAS,IAClB5D,EAAM,MAAQ,SAAWA,EAAM,MAAQ,SAAW,SAAW,EACrE,EAID,IAAIioO,EAAiBC,EAErB,SAASC,GAAyB,CAC5BnoO,EAAM,aACV,aAAakoO,CAAe,EAC5BD,EAAkB,WAAW,IAAOT,EAAoB,MAAQ,GAAOF,GAAgB,EACzF,CAEA,SAASc,GAA4B,CAC/BpoO,EAAM,YACV,aAAakoO,CAAe,CAC9B,CAEA,SAASG,GAA4B,CAC/BroO,EAAM,aACV,aAAaioO,CAAe,EAC5BC,EAAkB,WAAW,IAAOV,EAAoB,MAAQ,GAAQD,GAAgB,EAC1F,CAEA,SAASe,GAAoB,CACtBtoO,EAAM,aACNwnO,EAAoB,QACvBC,EAAoB,MAAQ,CAACA,EAAoB,OAErD,CAEA,MAAMc,EAAgB/7N,EAAI,IAAI,EACxBg8N,EAAeh8N,EAAI,IAAI,EAEvB08M,EAAkBtlN,EAAS,CAC/B,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU2U,EAAK,oBAAqB3U,CAAK,CACjD,CAAC,EAEKurO,EAAqB7kO,EAAS,IAAM,CAAC,CAACslN,EAAgB,MAAM,MAAM,EAExE,SAASwf,GAAuB,CAC9Bxf,EAAgB,MAAQ,GACxBse,EAAoB,MAAQ,EAC9B,CAEA,MAAMmB,EAAuB/5N,GAAW,CACtCs6M,EAAgB,MAAQt6M,CAC1B,i7CClHag6N,IAAc,IAAM,CAC/B,MAAMC,EAAkBjlO,EAAS,IAAM,IAAI,IAAI,OAAO,QAAQ,CAAC,EACzDklO,EAAkBt8N,EAAI,IAAI,gBAAgBq8N,EAAgB,MAAM,YAAY,CAAC,EAE7EE,EAAenlO,EAAS,IAAM,CAClC,MAAMolO,EAAkB,CAAA,EAClBC,EAAcH,EAAgB,MAAM,QAAO,EACjD,SAAW,CAACjtO,EAAKqB,CAAK,IAAK+rO,EACpB,CAAC,OAAQ,MAAM,EAAE,SAASptO,CAAG,GAChCmtO,EAAgB,KAAK,CACnB,IAAKntO,EACL,OAAQqB,EAAM,MAAM,GAAG,CACjC,CAAS,EAGL,OAAO8rO,CACX,CAAG,EAEKE,EAAmBtlO,EAAS,IACzBklO,EAAgB,MAAM,IAAI,MAAM,EAAIA,EAAgB,MAAM,IAAI,MAAM,EAAI,IAChF,EAEKp+F,EAAc9mI,EAAS,IACpBklO,EAAgB,MAAM,IAAI,MAAM,EAAI,SAASA,EAAgB,MAAM,IAAI,MAAM,CAAC,EAAI,EAAI,CAC9F,EAEKK,EAAc,CAACttO,EAAKqB,IAAU,CAClC2rO,EAAgB,MAAM,aAAa,IAAIhtO,EAAKqB,CAAK,CACrD,EAEQ+nN,EAAY,IAAM,CACtB,OAAO,QAAQ,aAAa,CAAA,EAAI,GAAI4jB,EAAgB,KAAK,CAC7D,EAkBE,MAAO,CACL,YAAAM,EACA,UAAAlkB,EACA,eAnBqB,IAAM,CAC3B,MAAM8jB,EAAeF,EAAgB,MAAM,aACrCO,EAAe,CAAA,EACrBL,EAAa,QAAQ,CAAC7rO,EAAOrB,IAAQ,CAC/BA,GAAO,SAASutO,EAAa,KAAKvtO,CAAG,CAC/C,CAAK,EACDutO,EAAa,QAASC,GAAgB,CACpCN,EAAa,OAAOM,CAAW,CACrC,CAAK,EACDpkB,GACJ,EAUI,kBARyBqkB,GAAc,CACvCT,EAAgB,MAAM,aAAa,OAAOS,CAAS,CACvD,EAOI,aAAAP,EACA,YAAAr+F,EACA,iBAAAw+F,CACJ,CACA,ECvDaK,GAAyBniJ,GAAY,iBAAkB,IAAM,CACxE,MAAMoiJ,EAAWZ,MACXa,EAAgBj9N,EAAI,IAAI,GAAK,EAC7Bk9N,EAAiBl9N,EAAI,CAAA,CAAE,EAEvBm9N,EAAuB,CAACvgB,EAAewgB,IAAe,CAC1DxgB,GACEA,EAAc,QAASO,GAAiB,CAClCA,GAAA,MAAAA,EAAc,SAAW,CAACigB,EAAYD,EAAqBhgB,GAAA,YAAAA,EAAc,QAAS,EAAI,EACrF8f,EAAc,MAAM,IAAI9f,EAAa,MAAOA,EAAa,KAAK,CAC3E,CAAO,CACP,EAqBE,MAAO,CACL,SAAA6f,EACA,KArBY19M,GAAY,CAExBA,EAAQ,QAASjH,GAAW,QACtB,EAACA,GAAA,MAAAA,EAAQ,YAAW5iB,EAAA4iB,GAAA,YAAAA,EAAQ,UAAR,YAAA5iB,EAAiB,SAAU,IAAGynO,EAAe,MAAM,KAAK7kN,EAAO,GAAG,EAC1F8kN,EAAqB9kN,GAAA,YAAAA,EAAQ,QAAS,EAAK,CACjD,CAAK,CACL,EAgBI,oBAd2BglN,GAAmB,CAC9C,OAAO,OAAOA,CAAc,EACzB,OAAQC,GACAJ,EAAe,MAAM,SAASI,EAAY,GAAG,CACrD,EACA,QAASC,GAAiB,CACzB,MAAMC,EAAYD,EAAa,OAAO,IAAKlC,IAAgB,CAAE,MAAOA,EAAW,IAAK,MAAOA,EAAW,GAAG,EAAG,EAC5G8B,EAAqBK,CAAS,CACtC,CAAO,CACP,EAMI,cAAAP,CACJ,CACA,CAAC,ycCvCD,MAAMzpO,EAAQgzD,EAgBRx8C,EAAQ29C,EAERw+E,EAAQ/uI,EAAS,CACrB,IAAK,IAAM5D,EAAM,YACjB,IAAMzE,GAAQib,EAAM,oBAAqBjb,CAAG,CAC9C,CAAC,EAEK,CAAE,cAAAkuO,CAAa,EAAKF,KAEpBU,EAAsBrmO,EAAS,IAAM,CACzC,MAAMsmO,EAAkBlqO,EAAM,QAAQ,OAAQ6kB,GAAWA,EAAO,MAAQ,OAAO,EAAE,IAAKA,GAAWA,EAAO,GAAG,EAE3G,OAAO,OAAO,QAAQ7kB,EAAM,WAAW,EACpC,IAAI,CAAC,CAACnE,EAAKqB,CAAK,IACXA,EAAM,SAAW,EAAUA,EAG3BgtO,EAAgB,SAASruO,CAAG,IAAMA,GAAO,SAAWA,GAAO,UACtD,CAAC,GAAGA,CAAG,KAAKqB,EAAM,CAAC,CAAC,OAAOA,EAAM,CAAC,CAAC,GAAG,EACpCgtO,EAAgB,SAASruO,CAAG,EAC9B,CAAC,GAAGA,CAAG,KAAKqB,EAAM,CAAC,CAAC,MAAMA,EAAM,CAAC,CAAC,EAAE,EAC/BA,CACf,EACA,MACL,CAAC,EAEKitO,EAAe,CAACx4N,EAAOy4N,IAAgB,CAM3C,GALAz4N,GAAA,MAAAA,EAAO,iBAKH,YAAY,KAAKy4N,CAAW,EAAG,CACjC,MAAMC,EAAmBD,EAAY,MAAM,GAAG,EAAE,CAAC,EAC3CE,EAAWtqO,EAAM,QAAQ,KAAM6kB,GAAWA,EAAO,KAAOwlN,EAAiB,cAAc,KAAM,CAAA,EACnG,GAAIC,GAAYA,EAAS,MAAQ,QAAS,CACxC33F,EAAM,MAAQ,CAAE,GAAGA,EAAM,MAAO,CAAC23F,EAAS,GAAG,EAAG,CAAA,GAChD,MACD,CACF,CACD,MAAMC,EAAW,CAAA,EACjB,OAAO,KAAKvqO,EAAM,WAAW,EAAE,QAAS6kB,GAAW,CACjD0lN,EAAS1lN,CAAM,EAAI7kB,EAAM,YAAY6kB,CAAM,EAAE,OAAQgpB,GAAeA,GAAcu8L,CAAW,CACjG,CAAG,EACDz3F,EAAM,MAAQ,CAAE,GAAGA,EAAM,MAAO,GAAG43F,EACrC,w0BC9DA,MAAMvqO,EAAQgzD,EAqBRnhD,EAAOsiD,EACPq2K,EAAUh+N,EAAI,IAAI,EAElBi+N,EAAc7mO,EAAS,IAAM5D,EAAM,WAAW,EAC9C0qO,EAAkBl+N,EAAIxM,EAAM,UAAU,EAEtC2qO,EAAY/mO,EAAS,CACzB,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU,CACd2U,EAAK,oBAAqB3U,CAAK,CAChC,CACH,CAAC,EAEK0tO,EAAWhnO,EAAS,IAAM6mO,EAAY,MAAM,KAAM17L,GAAWA,EAAO,KAAO47L,EAAU,KAAK,CAAC,EAE3FE,EAAYl5N,GAAU,CAC1B,MAAMm5N,EAAcn5N,EAAM,cACtBm5N,GAAeJ,EAAgB,QACjCC,EAAU,MAAQG,EAAY,OAE3B9qO,EAAM,eAAc0qO,EAAgB,MAAQ,GACnD,whECrCA,MAAM1qO,EAAQgzD,EAoCRx8C,EAAQ29C,EAER42K,EAAgBnnO,EAAS,CAC7B,IAAK,IAAM5D,EAAM,cACjB,IAAMzE,GAAQib,EAAM,oBAAqBjb,CAAG,CAC9C,CAAC,EAEKo3I,EAAQ/uI,EAAS,CACrB,IAAK,IAAM5D,EAAM,YACjB,IAAMzE,GAAQib,EAAM,oBAAqBjb,CAAG,CAC9C,CAAC,EAEKovO,EAAY/mO,EAAS,CACzB,IAAK,IAAM5D,EAAM,UACjB,IAAMzE,GAAQib,EAAM,mBAAoBjb,CAAG,CAC7C,CAAC,EAEKyvO,EAAwBr5N,GAAU,CAClCA,GAAOA,EAAM,iBACjBo5N,EAAc,MAAQ,CAACA,EAAc,KACvC,EAEME,EAAsBC,GACZ,OAAO,OAAOlrO,EAAM,WAAW,EAAE,KAAMwpN,GAAUA,EAAM,MAAQ0hB,CAAS,EAKlFC,EAAW,IAAM,CACrB30N,EAAM,UAAU,CAClB,quGC/DA,MAAMxW,EAAQgzD,EA4BRnhD,EAAOsiD,EAEP,CAAE,KAAA4wH,EAAM,KAAA0D,GAASr6F,KACjBg9I,EAAiB5+N,EAAI,EAAK,EAC1B6+N,EAAqB9B,GAAsB,EAC3C,CAAE,YAAAJ,EAAa,UAAAlkB,EAAW,eAAAqmB,EAAgB,kBAAAC,CAAmB,EAAGF,EAAmB,SACnF,CAAE,KAAMG,EAAiB,oBAAAC,CAAmB,EAAKJ,EACjDK,EAAc9nO,EAAS,IAAM5D,EAAM,WAAW,EAE9C2qO,EAAYn+N,EAAIxM,EAAM,SAAS,EAE/B0sL,EAAgBL,GAAgB,EAChCs/C,EAAsB/nO,EAAS,IAAM8oL,EAAc,gBAAgB,qBAAqB,CAAC,EAE/F8+C,EAAgBxrO,EAAM,OAAO,EAE7B,MAAM4rO,EAAmBj5F,GAAU,CACjC,OAAO,QAAQA,CAAK,EAAE,QAAQ,CAAC,CAAC92I,EAAKqB,CAAK,IAAM,CAC1CA,EAAM,OAAS,EACjBisO,EAAYttO,EAAKqB,EAAM,KAAK,GAAG,CAAC,EAEhCquO,EAAkB1vO,CAAG,CAE3B,CAAG,EACD0vO,EAAkB,MAAM,EACxBtmB,GACF,EAgBMtyE,EAAQ/uI,EAAS,CACrB,IAAK,IACI5D,EAAM,QAAQ,OAAO,CAACvB,EAAKomB,IAAW,OAC3C,MAAMgnN,GAAgB5pO,EAAAjC,EAAM,aAAN,YAAAiC,EAAkB,KAAM6pO,GAAiBA,EAAa,MAAQjnN,EAAO,KAC3F,OAAApmB,EAAIomB,EAAO,GAAG,EAAIgnN,EAAgBA,EAAc,OAAS,GAClDptO,CACR,EAAE,CAAE,CAAA,EAEP,IAAM8rO,GAAa,CACjB,IAAIwB,EAAiB,OAAO,KAAKxB,CAAQ,EACtC,OAAQ1uO,GAAQ0uO,EAAS1uO,CAAG,EAAE,OAAS,CAAC,EACxC,OAAO,CAAC4C,EAAK5C,KAAS,CAAE,GAAG4C,EAAK,CAAC5C,CAAG,EAAG0uO,EAAS1uO,CAAG,IAAM,CAAE,CAAA,EAC9D+vO,EAAgBrB,CAAQ,EACxB14N,EAAK,oBAAqBk6N,CAAc,CACzC,CACH,CAAC,EAEKC,EAA+BpoO,EAAS,IACrC,OAAO,KAAK+uI,EAAM,KAAK,EAAE,OAAO,CAAC/xF,EAAO/kD,IAC9B,OAAO,OAAOmE,EAAM,OAAO,EAAE,KAAM6kB,GAAWA,EAAO,MAAQhpB,CAAG,EACpE,OAAS,SAAW82I,EAAM,MAAM92I,CAAG,EAAE,OAAS,EAChD+kD,EAAQ,EAEVA,EAAQ+xF,EAAM,MAAM92I,CAAG,EAAE,OAC/B,CAAC,CACL,EAEKsvO,EAAW,IAAM,CACrBx4F,EAAM,MAAQ,OAAO,KAAKA,EAAM,KAAK,EAAE,OAAO,CAACl0I,EAAK5C,KAAS,CAAE,GAAG4C,EAAK,CAAC5C,CAAG,EAAG,EAAI,GAAG,CAAA,CAAE,EACvFyvO,GACF,EAEMN,EAAwBr5N,GAAU,CAClCA,GAAOA,EAAM,iBACjBy5N,EAAe,MAAQ,CAACA,EAAe,KACzC,EAEMH,EAAsBC,GACZ,OAAO,OAAOlrO,EAAM,WAAW,EAAE,KAAMwpN,GAAUA,EAAM,MAAQ0hB,CAAS,EAKxF,OAAAjuN,GAAMyuN,EAAa,IAAM,CACvBD,EAAoBC,EAAY,KAAK,CACvC,CAAC,EACDzuN,GAAM0tN,EAAYnlO,GAAa,CAC7BqM,EAAK,mBAAoBrM,CAAQ,CACnC,CAAC,6kEClIDqzF,EAAA,QACU,SAAS9sD,EAAS,CAElB,IAAIkgM,EAAmB,CAAA,EAGvB,SAASC,EAAoBC,EAAU,CAGtC,GAAGF,EAAiBE,CAAQ,EAC3B,OAAOF,EAAiBE,CAAQ,EAAE,QAGnC,IAAItzI,EAASozI,EAAiBE,CAAQ,EAAI,CACzC,EAAGA,EACH,EAAG,GACH,QAAS,CAAE,CACvB,EAGW,OAAApgM,EAAQogM,CAAQ,EAAE,KAAKtzI,EAAO,QAASA,EAAQA,EAAO,QAASqzI,CAAmB,EAGlFrzI,EAAO,EAAI,GAGJA,EAAO,OACd,CAID,OAAAqzI,EAAoB,EAAIngM,EAGxBmgM,EAAoB,EAAID,EAGxBC,EAAoB,EAAI,SAASvzI,EAAS74F,EAAM6L,EAAQ,CACnDugO,EAAoB,EAAEvzI,EAAS74F,CAAI,GACtC,OAAO,eAAe64F,EAAS74F,EAAM,CACpC,aAAc,GACd,WAAY,GACZ,IAAK6L,CAClB,CAAa,CAEb,EAGUugO,EAAoB,EAAI,SAASrzI,EAAQ,CACxC,IAAIltF,EAASktF,GAAUA,EAAO,WAC7B,UAAsB,CAAE,OAAOA,EAAO,OAAa,EACnD,UAA4B,CAAE,OAAOA,GACtC,OAAAqzI,EAAoB,EAAEvgO,EAAQ,IAAKA,CAAM,EAClCA,CAClB,EAGUugO,EAAoB,EAAI,SAASpmO,EAAQ0nG,EAAU,CAAE,OAAO,OAAO,UAAU,eAAe,KAAK1nG,EAAQ0nG,CAAQ,CAAE,EAGnH0+H,EAAoB,EAAI,GAGjBA,EAAoBA,EAAoB,EAAI,CAAC,CACpD,EAEA,CAEH,SAASrzI,EAAQF,EAASuzI,EAAqB,CAKtD,IAAIE,EAAe,CACjB,OAAQ,SACR,OAAQ,SACR,SAAU,UACV,QAAS,UACT,SAAU,WACV,QAAS,MACX,EAEIC,EAAgB,CAClB,OAAQ,SACR,QAAS,UACT,MAAO,QACP,OAAQ,SACR,OAAQ,SACR,kBAAmB,oBACnB,KAAM,OACN,SAAU,WACV,GAAI,KACJ,cAAe,gBACf,cAAe,eACjB,EAEIC,EAAW,CACb,IAAK,MACL,QAAS,UACT,cAAe,gBACf,QAAS,UACT,OAAQ,QACV,EAEIC,EAAc,CAChB,SAAU,GACV,SAAU,GACV,UAAW,GACX,UAAW,GACX,UAAW,GACX,WAAY,EACd,EAEA1zI,EAAO,QAAU,CAAE,cAAewzI,EAAe,aAAcD,EAAc,SAAUE,EAAU,YAAaC,CAAW,CAElH,EAEA,SAAS1zI,EAAQF,EAASuzI,EAAqB,CAKtD,IAAIM,EAAWN,EAAoB,CAAC,EAEhCO,EAAWP,EAAoB,CAAC,EAChCG,EAAgBI,EAAS,cACzBH,EAAWG,EAAS,SACpBL,EAAeK,EAAS,aAExBC,EAAYR,EAAoB,CAAC,EACjCS,EAAYD,EAAU,UACtBE,EAAaF,EAAU,WACvBG,EAAgBH,EAAU,cAC1BI,EAAcJ,EAAU,YACxBK,EAAiBL,EAAU,eAC3BM,EAAaN,EAAU,WACvBO,EAAuBP,EAAU,qBACjCQ,EAAeR,EAAU,aAEzBS,EAAK,IAAIX,EAET1vC,EAAUqwC,EAAG,aACbjxC,EAASixC,EAAG,YACZC,EAASD,EAAG,YACZE,EAAKF,EAAG,QACRlxC,EAAKkxC,EAAG,QAERG,EAASjB,EAAc,OACvBkB,EAAWlB,EAAc,SACzBmB,EAAKnB,EAAc,GACnBoB,EAAoBpB,EAAc,kBAClCqB,EAAQrB,EAAc,MACtBsB,GAAUtB,EAAc,QACxBuB,EAASvB,EAAc,OACvBwB,EAAOxB,EAAc,KACrByB,GAASzB,EAAc,OACvB0B,GAAgB1B,EAAc,cAC9B2B,EAAS5B,EAAa,OACtB6B,GAAS7B,EAAa,OACtB8B,GAAW9B,EAAa,SACxB+B,GAAU/B,EAAa,QACvBgC,GAAWhC,EAAa,SACxBiC,GAAUjC,EAAa,QACvBkC,GAAUhC,EAAS,QACnBiC,GAAgBjC,EAAS,cACzBkC,GAAMlC,EAAS,IACfmC,GAAUnC,EAAS,QACnBoC,GAASpC,EAAS,OAGlBqC,GAAe,UAAwB,CACzC,OAAOzyC,EAAO,OAAS8xC,CACzB,EACIY,GAAe,UAAwB,CACzC,OAAO1yC,EAAO,OAAS+xC,EACzB,EAEIY,GAAwB,UAAiC,CAC3D,OAAQ3yC,EAAO,KAAI,CACjB,KAAK8xC,EACL,KAAKC,GACH,MAAO,GACT,QACE,MAAO,EACV,CACH,EAEIa,GAAqB,UAA8B,CACrD,OAAIzB,EAAG,OAASf,EAAS,SAAWe,EAAG,UAAY,KAC1C,OAAOpxC,GAAO,UAAYA,EAAG,QAAQ,MAAM,IAAM,GAGnD,EACT,EAEI8yC,GAAgB,UAAyB,CAC3C,OAAO7yC,EAAO,OAASgyC,EACzB,EACIc,GAAgB,UAAyB,CAC3C,OAAO9yC,EAAO,OAASiyC,EACzB,EACIc,GAAiB,UAA0B,CAC7C,OAAO/yC,EAAO,OAASkyC,EACzB,EACIc,GAAgB,UAAyB,CAC3C,OAAOhzC,EAAO,OAASmyC,EACzB,EACIc,GAAgB,UAAyB,CAC3C,OAAO9B,EAAG,OAASiB,EACrB,EACIc,GAAgB,UAAyB,CAC3C,OAAO/B,EAAG,OAASoB,EACrB,EACIY,GAAc,UAAuB,CACvC,OAAOhC,EAAG,OAASqB,EACrB,EACIY,GAAiB,UAA0B,CAC7C,OAAOjC,EAAG,OAASkB,EACrB,EACIgB,GAAY,UAAqB,CACnC,OAAOlC,EAAG,OAASmB,EACrB,EACIgB,GAAe,UAAwB,CACzC,OAAO1yC,EAAQ,OAASwwC,CAC1B,EACImC,GAAgB,UAAyB,CAC3C,OAAO3yC,EAAQ,OAAS6wC,EAC1B,EACI+B,GAAiB,UAA0B,CAC7C,OAAO5yC,EAAQ,OAASywC,CAC1B,EACIoC,GAAa,UAAsB,CACrC,OAAO7yC,EAAQ,OAAS+wC,CAC1B,EACI+B,GAAe,UAAwB,CACzC,OAAO9yC,EAAQ,OAASgxC,EAC1B,EACI+B,GAAe,UAAwB,CACzC,OAAO/yC,EAAQ,OAAS8wC,GAAU9wC,EAAQ,OAASixC,EACrD,EAEI+B,GAAqB,UAA8B,CACrD,OAAOhzC,EAAQ,OAASixC,EAC1B,EACIgC,GAAc,UAAuB,CACvC,OAAOjzC,EAAQ,OAAS4wC,CAC1B,EACIsC,GAAW,UAAoB,CACjC,OAAOlzC,EAAQ,OAAS2wC,GAAqB3wC,EAAQ,OAAS0wC,CAChE,EAEIyC,GAAiB,UAA0B,CAC7C,IAAIC,GAAMjD,IACNhxC,GAAKi0C,IAAOA,GAAI,UAAU,YAAW,EAEzC,OAAO,OAAOj0C,IAAO,SAAW,WAAW,KAAKA,EAAE,EAAI,EACxD,EAEIk0C,GAAW,UAAoB,CACjC,IAAID,GAAMjD,IACV,OAAOiD,KAAQ,mBAAmB,KAAKA,GAAI,QAAQ,GAAKA,GAAI,WAAa,YAAcA,GAAI,eAAiB,IAAM,CAAC,OAAO,QAC5H,EAEIE,GAAY,UAAqB,CACnC,OAAOlD,EAAa,MAAM,CAC5B,EACImD,GAAc,UAAuB,CACvC,OAAOnD,EAAa,QAAQ,CAC9B,EACIoD,GAAY,UAAqB,CACnC,OAAOpD,EAAa,MAAM,CAC5B,EAEIqD,GAAwB,UAAiC,CAC3D,OAAOzzC,EAAQ,KACjB,EACI0zC,GAAoB,UAA6B,CACnD,OAAO1zC,EAAQ,OACjB,EACI2zC,GAAe,UAAwB,CACzC,OAAOpD,EAAG,QAAUA,EAAG,QAAU,MACnC,EACIqD,GAAY,UAAqB,CACnC,OAAOrD,EAAG,KAAOA,EAAG,KAAO,MAC7B,EACIsD,GAAiB,UAA0B,CAC7C,OAAO7zC,EAAQ,IACjB,EACI8zC,GAAkB,UAA2B,CAC/C,OAAO10C,EAAO,OAASA,EAAO,OAAS,MACzC,EACI20C,GAAiB,UAA0B,CAC7C,OAAO30C,EAAO,MAAQA,EAAO,MAAQ,MACvC,EACI40C,GAAgB,UAAyB,CAC3C,OAAO1D,EAAO,IAChB,EACI2D,GAAmB,UAA4B,CACjD,OAAO3D,EAAO,OAChB,EACI4D,GAAe,UAAwB,CACzC,OAAO/0C,CACT,EACIg1C,GAAgB,UAAyB,CAC3C,OAAO/0C,EAAO,IAChB,EAEIg1C,GAAYnC,KACZoC,GAAYjC,KACZkC,GAAanC,KACboC,GAAiBvB,MAAwBM,KACzCkB,GAAa5B,KACbnmG,GAAWslG,MAA2BuB,KACtCmB,GAAe5C,KACf6C,GAAW5C,MAAkBwB,KAC7BqB,GAAYzC,KACZ0C,GAAYvC,KACZwC,GAAarC,KACbjnJ,GAAQknJ,MAAea,KACvBwB,GAAWpC,KACXz4G,GAAY04G,KACZxyC,GAAW4yC,KACXgC,GAAU9B,KACV/4G,GAAOg5G,KACP8B,GAAYrB,KACZsB,GAASrB,KACTsB,GAAqBzB,KACrB0B,GAAiBzB,KACjB0B,GAAcvB,KACdwB,GAAevB,KACfwB,GAAcvB,KACdwB,GAAavB,KACbwB,GAAgBvB,KAChBwB,GAAQvB,KACRwB,GAAS7C,MAAgBb,KACzB2D,GAAW7C,KACX8C,GAAazB,KACb0B,GAAUxC,KACVyC,GAAWxC,KACXyC,GAAaxC,KACbyC,GAAWxC,KACXyC,GAAa9C,KACb+C,GAAiBlE,KACjBmE,GAAetD,KACfuD,GAAY9D,KACZ+D,GAAU9D,KAEV/pO,GAAOqnO,EAAUzwC,EAAO,IAAI,EAEhC,SAASk3C,IAAe,CACtB,IAAI3B,GAAYnsO,GAAK,UACjBikI,GAAWjkI,GAAK,SAChBksO,GAAWlsO,GAAK,SAChB4rO,GAAY5rO,GAAK,UACjB6rO,GAAY7rO,GAAK,UACjB8rO,GAAa9rO,GAAK,WAEtB,GAAImsO,GACF,OAAO7E,EAAW6E,GAAW30C,EAASswC,EAAQC,EAAIpxC,CAAE,EAGtD,GAAIi1C,GACF,OAAOlE,EAAWkE,GAAW9D,EAAQC,EAAIpxC,CAAE,EAG7C,GAAIk1C,GACF,OAAOpE,EAAeoE,GAAW/D,EAAQC,EAAIpxC,CAAE,EAOjD,GAJI1yD,IAIAioG,GACF,OAAO3E,EAAcvnO,GAAM42L,EAAQmxC,EAAIpxC,CAAE,EAG3C,GAAIm1C,GACF,OAAOtE,EAAYsE,GAAYhE,EAAQC,EAAIpxC,CAAE,CAGjD,CACApjG,EAAO,QAAU,CACf,aAAcu6I,GACd,UAAWlC,GACX,UAAWC,GACX,WAAYC,GACZ,eAAgBC,GAChB,WAAYC,GACZ,SAAU/nG,GACV,aAAcgoG,GACd,SAAUC,GACV,UAAWC,GACX,UAAWC,GACX,WAAYC,GACZ,MAAOtpJ,GACP,SAAUupJ,GACV,UAAW76G,GACX,SAAUkmE,GACV,QAAS40C,GACT,KAAM76G,GACN,UAAW86G,GACX,OAAQC,GACR,mBAAoBC,GACpB,eAAgBC,GAChB,YAAaC,GACb,aAAcC,GACd,YAAaC,GACb,WAAYC,GACZ,cAAeC,GACf,MAAOC,GACP,OAAQC,GACR,SAAUC,GACV,WAAYC,GACZ,QAASC,GACT,SAAUC,GACV,WAAYC,GACZ,SAAUC,GACV,WAAYC,GACZ,eAAgBC,GAChB,aAAcC,GACd,UAAWC,GACX,QAASC,EACX,CAEO,EAEA,SAASt6I,EAAQF,EAASuzI,EAAqB,CAEtD,IAAImH,EAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQjC,SAASxpJ,EAAOyE,EAAU,CAAc,IAAIglJ,EAAW,SAASC,EAAM,GAAGC,EAAQ,IAAIC,EAAU,WAAWC,EAAW,YAAYC,EAAS,SAASC,EAAS,SAASC,EAAM,QAAQC,EAAM,QAAQC,EAAK,OAAOC,EAAK,OAAOC,EAAO,SAAS/nK,EAAQ,UAAUgoK,EAAa,eAAe7F,EAAQ,UAAUL,EAAO,SAASC,EAAO,SAASkG,EAAQ,UAAU/F,EAAS,WAAWgG,EAAS,WAAe72F,EAAK,CAAC,OAAO,SAAS82F,EAAQxnE,GAAW,CAAC,IAAIynE,GAAc,CAAE,EAAC,QAAQn4O,MAAKk4O,EAAYxnE,GAAW1wK,EAAC,GAAG0wK,GAAW1wK,EAAC,EAAE,OAAO,IAAI,EAAGm4O,GAAcn4O,EAAC,EAAE0wK,GAAW1wK,EAAC,EAAE,OAAOk4O,EAAQl4O,EAAC,CAAC,EAAOm4O,GAAcn4O,EAAC,EAAEk4O,EAAQl4O,EAAC,EAAG,OAAOm4O,EAAa,EAAE,IAAI,SAASC,EAAKC,GAAK,CAAC,OAAG,OAAOD,GAAO,SAAiBC,GAAK,YAAa,EAAC,QAAQD,EAAK,YAAW,CAAE,IAAI,GAAe,EAAM,EAAE,SAAS,SAASn5O,EAAI,CAAC,OAAOA,EAAI,YAAa,CAAA,EAAE,MAAM,SAASozB,EAAQ,CAAC,OAAO,OAAOA,IAAUolN,EAASplN,EAAQ,QAAQ,WAAW,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE8/D,CAAS,EAAE,KAAK,SAASlzF,EAAI,CAAC,OAAOA,EAAI,QAAQ,qCAAqC,EAAE,CAAC,CAAC,EAAMq5O,EAAO,CAAC,IAAI,SAASx4C,EAAGlxF,GAAO,CAA+B,QAA1B5uG,GAAE,EAAEkrB,GAAE2oB,GAAEjgC,GAAEghH,GAAE9rG,GAAQmQ,GAAYj5B,GAAE4uG,GAAO,QAAQ,CAAC9lF,IAAQ,CAAC,IAAI20H,GAAM7uC,GAAO5uG,EAAC,EAAE6D,GAAM+qG,GAAO5uG,GAAE,CAAC,EAAQ,IAANkrB,GAAE2oB,GAAE,EAAQ3oB,GAAEuyH,GAAM,QAAQ,CAAC30H,IAAqC,GAA5BA,GAAQ20H,GAAMvyH,IAAG,EAAE,KAAK40K,CAAE,EAAOh3K,GAAS,IAAIlV,GAAE,EAAEA,GAAE/P,GAAM,OAAO+P,KAAKqlB,GAAMnQ,GAAQ,EAAE+qB,EAAC,EAAE+gF,GAAE/wH,GAAM+P,EAAC,EAAK,OAAOghH,KAAI4iH,GAAU5iH,GAAE,OAAO,EAAMA,GAAE,QAAQ,EAAM,OAAOA,GAAE,CAAC,GAAG0iH,EAAW,KAAK1iH,GAAE,CAAC,CAAC,EAAEA,GAAE,CAAC,EAAE,KAAK,KAAK37F,EAAK,EAAO,KAAK27F,GAAE,CAAC,CAAC,EAAEA,GAAE,CAAC,EAAWA,GAAE,QAAQ,EAAM,OAAOA,GAAE,CAAC,IAAI0iH,GAAW,EAAE1iH,GAAE,CAAC,EAAE,MAAMA,GAAE,CAAC,EAAE,MAAO,KAAKA,GAAE,CAAC,CAAC,EAAE37F,GAAM27F,GAAE,CAAC,EAAE,KAAK,KAAK37F,GAAM27F,GAAE,CAAC,CAAC,EAAEziC,EAAe,KAAKyiC,GAAE,CAAC,CAAC,EAAE37F,GAAMA,GAAM,QAAQ27F,GAAE,CAAC,EAAEA,GAAE,CAAC,CAAC,EAAEziC,EAAmByiC,GAAE,QAAQ,IAAG,KAAKA,GAAE,CAAC,CAAC,EAAE37F,GAAM27F,GAAE,CAAC,EAAE,KAAK,KAAK37F,GAAM,QAAQ27F,GAAE,CAAC,EAAEA,GAAE,CAAC,CAAC,CAAC,EAAEziC,GAAgB,KAAKyiC,EAAC,EAAE37F,IAAYk5D,EAAanyF,IAAG,CAAC,CAAC,EAAE,IAAI,SAASf,EAAI+hG,GAAI,CAAC,QAAQhhG,MAAKghG,GAAK,GAAG,OAAOA,GAAIhhG,EAAC,IAAIw3O,GAAUx2I,GAAIhhG,EAAC,EAAE,OAAO,GAAG,QAAQkrB,GAAE,EAAEA,GAAE81E,GAAIhhG,EAAC,EAAE,OAAOkrB,KAAK,GAAGk2H,EAAK,IAAIpgD,GAAIhhG,EAAC,EAAEkrB,EAAC,EAAEjsB,CAAG,EAAG,OAAOe,KAAIq3O,EAAQllJ,EAAUnyF,WAAYohJ,EAAK,IAAIpgD,GAAIhhG,EAAC,EAAEf,CAAG,EAAG,OAAOe,KAAIq3O,EAAQllJ,EAAUnyF,GAAG,OAAOf,CAAG,CAAC,EAAMs5O,GAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,OAAO,QAAQ,OAAO,QAAQ,OAAO,QAAQ,OAAO,IAAI,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,OAAO,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,UAAU,SAAS,SAAS,QAAQ,IAAK,SAAS,GAAG,CAAC,SAAS,QAAQ,EAAE,MAAM,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,SAAS,GAAG,CAAC,SAAS,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAML,EAAQ,CAAC,QAAQ,CAAC,CAAC,6BAA6B,8CAA8C,+BAA+B,0BAA0B,EAAE,CAACN,EAAK7nK,CAAO,EAAE,CAAC,0BAA0B,EAAE,CAAC,CAAC6nK,EAAK,YAAY,EAAE7nK,CAAO,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC6nK,EAAK,OAAO,EAAE7nK,CAAO,EAAE,CAAC,uBAAuB,+DAA+D,6DAA6D,4BAA4B,uBAAuB,iIAAiI,EAAE,CAAC6nK,EAAK7nK,CAAO,EAAE,CAAC,2CAA2C,EAAE,CAAC,CAAC6nK,EAAK,IAAI,EAAE7nK,CAAO,EAAE,CAAC,uCAAuC,EAAE,CAAC,CAAC6nK,EAAK,MAAM,EAAE7nK,CAAO,EAAE,CAAC,yBAAyB,EAAE,CAAC,CAAC6nK,EAAK,QAAQ,EAAE7nK,CAAO,EAAE,CAAC,sBAAsB,EAAE,CAAC,CAAC6nK,EAAK,QAAQ,EAAE7nK,CAAO,EAAE,CAAC,2DAA2D,EAAE,CAAC,CAAC6nK,EAAK,WAAW,EAAE7nK,CAAO,EAAE,CAAC,6BAA6B,EAAE,CAAC,CAAC6nK,EAAK,KAAK,GAAG,EAAE7nK,CAAO,EAAE,CAAC,8BAA8B,EAAE,CAAC,CAAC6nK,EAAK,QAAQ,EAAE7nK,CAAO,EAAE,CAAC,6BAA6B,EAAE,CAAC6nK,EAAK7nK,CAAO,EAAE,CAAC,kBAAkB,EAAE,CAAC6nK,EAAK7nK,CAAO,EAAE,CAAC,gCAAgC,EAAE,CAAC6nK,EAAK7nK,CAAO,EAAE,CAAC,gCAAgC,EAAE,CAAC6nK,EAAK7nK,CAAO,EAAE,CAAC,iCAAiC,EAAE,CAAC6nK,EAAK7nK,CAAO,EAAE,CAAC,2BAA2B,EAAE,CAAC6nK,CAAI,EAAE,CAAC,cAAc,EAAE,CAACA,CAAI,EAAE,CAAC,iCAAiC,EAAE,CAAC7nK,EAAQ,CAAC6nK,EAAK,cAAc,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC7nK,EAAQ,CAAC6nK,EAAK,UAAU,CAAC,EAAE,CAAC,mCAAmC,EAAE,CAAC7nK,EAAQ,CAAC6nK,EAAK,iBAAiB,CAAC,EAAE,CAAC,8BAA8B,EAAE,CAAC,CAACA,EAAK,OAAO,YAAY,EAAE7nK,CAAO,EAAE,CAAC,yCAAyC,EAAE,CAAC,CAAC6nK,EAAK,mBAAmB,OAAO,EAAE7nK,CAAO,EAAE,CAAC,4DAA4D,EAAE,CAACA,EAAQ,CAAC6nK,EAAK,iBAAiB,CAAC,EAAE,CAAC,8DAA8D,EAAE,CAACA,EAAK7nK,CAAO,EAAE,CAAC,sBAAsB,EAAE,CAAC,CAAC6nK,EAAK,SAAS,EAAE7nK,CAAO,EAAE,CAAC,uCAAuC,EAAE,CAAC,CAAC6nK,EAAK,QAAQ,EAAE7nK,CAAO,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC6nK,EAAK,aAAa,EAAE7nK,CAAO,EAAE,CAAC,oBAAoB,EAAE,CAACA,EAAQ,CAAC6nK,EAAK,SAAS,CAAC,EAAE,CAAC,6CAA6C,EAAE,CAAC7nK,EAAQ,CAAC6nK,EAAK,eAAe,CAAC,EAAE,CAAC,gDAAgD,EAAE,CAAC7nK,EAAQ6nK,CAAI,EAAE,CAAC,kEAAkE,EAAE,CAAC,CAACA,EAAK,KAAK,EAAE7nK,CAAO,EAAE,CAAC,+CAA+C,EAAE,CAAC6nK,EAAK,CAAC7nK,EAAQuoK,EAAO,IAAIC,GAAK,QAAQ,UAAU,OAAO,CAAC,EAAE,CAAC,0BAA0B,4BAA4B,EAAE,CAACX,EAAK7nK,CAAO,EAAE,CAAC,mCAAmC,EAAE,CAAC,CAAC6nK,EAAK,UAAU,EAAE7nK,CAAO,EAAE,CAAC,cAAc,gGAAgG,uGAAuG,0CAA0C,8EAA8E,wBAAwB,2BAA2B,iCAAiC,0BAA0B,EAAE,CAAC6nK,EAAK7nK,CAAO,CAAC,EAAE,IAAI,CAAC,CAAC,+CAA+C,EAAE,CAAC,CAACgoK,EAAa,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAACA,EAAa32F,EAAK,QAAQ,CAAC,EAAE,CAAC,wBAAwB,EAAE,CAAC,CAAC22F,EAAa,MAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE,CAAC,CAACA,EAAa,KAAK,CAAC,EAAE,CAAC,yCAAyC,EAAE,CAAC,CAACA,EAAa,OAAO,GAAG32F,EAAK,QAAQ,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC22F,EAAa,OAAO,CAAC,EAAE,CAAC,6GAA6G,EAAE,CAAC,CAACA,EAAa32F,EAAK,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,2CAA2C,EAAE,CAACu2F,EAAMG,EAAO,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,kCAAkC,EAAE,CAAC6F,EAAM,CAACG,EAAO,OAAO,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC6F,EAAM,UAAU,EAAE,CAACG,EAAO,OAAO,CAAC,EAAE,CAAC,yBAAyB,oBAAoB,kBAAkB,uBAAuB,+BAA+B,kCAAkC,EAAE,CAACA,EAAOH,EAAM,CAACE,EAAK/F,CAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE,CAAC6F,EAAM,CAACG,EAAO,QAAQ,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,2CAA2C,EAAE,CAAC,CAAC6F,EAAMW,EAAO,IAAIC,GAAK,OAAO,OAAO,KAAK,EAAE,CAACT,EAAO,QAAQ,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,iCAAiC,EAAE,CAAC8F,EAAMG,EAAO,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,CAAC8F,EAAM,CAACG,EAAO,OAAO,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,2BAA2B,mGAAmG,qBAAqB,gBAAgB,EAAE,CAACiG,EAAOH,EAAM,CAACE,EAAKhG,CAAM,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC8F,EAAM,CAACG,EAAO,YAAY,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,2EAA2E,EAAE,CAAC8F,EAAM,CAACG,EAAO,MAAM,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,mCAAmC,4BAA4B,EAAE,CAAC,CAACgG,EAAO,MAAM,EAAE,CAACH,EAAM,eAAe,EAAE,CAACE,EAAK/F,CAAM,CAAC,EAAE,CAAC,6CAA6C,EAAE,CAAC6F,EAAM,CAACG,EAAO,MAAM,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,cAAc,0BAA0B,EAAE,CAACiG,EAAOH,EAAM,CAACE,EAAK3F,CAAO,CAAC,EAAE,CAAC,8BAA8B,EAAE,CAACyF,EAAM,CAACG,EAAO,QAAQ,EAAE,CAACD,EAAK3F,CAAO,CAAC,EAAE,CAAC,iCAAiC,EAAE,CAACyF,EAAM,CAACG,EAAO,MAAM,EAAE,CAACD,EAAK3F,CAAO,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC4F,EAAOQ,EAAO,IAAIC,GAAK,OAAO,OAAO,MAAM,EAAE,CAACZ,EAAMW,EAAO,IAAIC,GAAK,OAAO,OAAO,KAAK,EAAE,CAACV,EAAKhG,CAAM,CAAC,EAAE,CAAC,2CAA2C,EAAE,CAACiG,EAAOH,EAAM,CAACE,EAAK/F,CAAM,CAAC,EAAE,CAAC,qCAAqC,eAAe,0EAA0E,EAAE,CAACgG,EAAO,CAACH,EAAM,KAAK,GAAG,EAAE,CAACE,EAAKhG,CAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC8F,EAAM,CAACG,EAAO,KAAK,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,4BAA4B,cAAc,EAAE,CAAC6F,EAAM,CAACG,EAAO,QAAQ,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,+BAA+B,EAAE,CAACiG,EAAOH,EAAM,CAACE,EAAKhG,CAAM,CAAC,EAAE,CAAC,iCAAiC,EAAE,CAAC8F,EAAM,CAACG,EAAO,WAAW,EAAE,CAACD,EAAK3F,CAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAACyF,EAAM,MAAM,GAAG,EAAE,CAACG,EAAO,WAAW,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,kFAAkF,kBAAkB,uBAAuB,aAAa,EAAE,CAAC8F,EAAM,CAACG,EAAO,UAAU,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,8CAA8C,EAAE,CAAC8F,EAAM,CAACG,EAAO,UAAU,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,wDAAwD,EAAE,CAAC,CAACgG,EAAO12F,EAAK,IAAI,EAAE,CAACu2F,EAAMv2F,EAAK,IAAI,EAAE,CAACy2F,EAAKG,CAAO,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAACL,EAAM,IAAI,SAAS,EAAE,CAACG,EAAO,SAAS,EAAE,CAACD,EAAKG,CAAO,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAACL,EAAM,CAACG,EAAO,OAAO,EAAE,CAACD,EAAKG,CAAO,CAAC,EAAE,CAAC,8EAA8E,cAAc,EAAE,CAAC,CAACF,EAAO,SAAS,EAAEH,EAAM,CAACE,EAAK/F,CAAM,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAACgG,EAAO,CAACD,EAAKG,CAAO,EAAEL,CAAK,EAAE,CAAC,qDAAqD,mCAAmC,iBAAiB,EAAE,CAAC,CAACG,EAAO,SAAS,EAAEH,EAAM,CAACE,EAAKhG,CAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC8F,EAAM,CAACG,EAAO,SAAS,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,oCAAoC,yBAAyB,EAAE,CAAC,CAACiG,EAAO,OAAO,EAAEH,EAAM,CAACE,EAAKhG,CAAM,CAAC,EAAE,CAAC,mCAAmC,EAAE,CAAC8F,EAAM,CAACG,EAAO,MAAM,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,mCAAmC,EAAE,CAAC6F,EAAM,CAACG,EAAO,IAAI,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,+CAA+C,EAAE,CAAC,CAACgG,EAAO,IAAI,EAAEH,EAAM,CAACE,EAAK/F,CAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAACgG,EAAOH,EAAM,CAACE,EAAKG,CAAO,CAAC,EAAE,CAAC,iBAAiB,qBAAqB,kCAAkC,EAAE,CAACL,EAAM,CAACG,EAAO,IAAI,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,kCAAkC,EAAE,CAAC8F,EAAM,CAACG,EAAO,QAAQ,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAACgG,EAAOH,EAAM,CAACE,EAAKhG,CAAM,CAAC,EAAE,CAAC,2BAA2B,EAAE,CAACiG,EAAOH,EAAM,CAACE,EAAK5F,CAAQ,CAAC,EAAE,CAAC,wCAAwC,EAAE,CAAC6F,EAAOH,EAAM,CAACE,EAAKhG,CAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC8F,EAAM,YAAY,EAAE,CAACG,EAAO,QAAQ,CAAC,EAAE,CAAC,0BAA0B,EAAE,CAACH,EAAM,CAACG,EAAO,QAAQ,EAAE,CAACD,EAAK5F,CAAQ,CAAC,EAAE,CAAC,0BAA0B,EAAE,CAAC0F,EAAM,CAACG,EAAO,QAAQ,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,iCAAiC,EAAE,CAAC6F,EAAM,CAACG,EAAO,QAAQ,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,mCAAmC,qDAAqD,8FAA8F,6DAA6D,EAAE,CAAC,CAAC8F,EAAM,KAAK,GAAG,EAAE,CAACG,EAAO,QAAQ,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,wDAAwD,EAAE,CAAC,CAAC8F,EAAM,KAAK,GAAG,EAAE,CAACG,EAAO,QAAQ,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,oCAAoC,EAAE,CAAC6F,EAAM,CAACG,EAAO,OAAO,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,4BAA4B,qCAAqC,EAAE,CAAC6F,EAAM,CAACG,EAAO,SAAS,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,wCAAwC,EAAE,CAAC8F,EAAM,CAACG,EAAO,KAAK,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,8CAA8C,EAAE,CAAC6F,EAAM,CAACG,EAAO,MAAM,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,2CAA2C,EAAE,CAAC6F,EAAM,CAACG,EAAO,SAAS,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,+DAA+D,EAAE,CAAC,CAACgG,EAAO,gBAAgB,EAAEH,EAAM,CAACE,EAAK/F,CAAM,CAAC,EAAE,CAAC,yCAAyC,EAAE,CAAC6F,EAAM,CAACG,EAAO,UAAU,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,2BAA2B,EAAE,CAAC6F,EAAM,CAACG,EAAO,KAAK,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,2CAA2C,EAAE,CAAC6F,EAAM,CAACG,EAAO,OAAO,EAAE,CAACD,EAAKhG,CAAM,CAAC,EAAE,CAAC,sCAAsC,EAAE,CAAC8F,EAAM,CAACG,EAAO,OAAO,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,2CAA2C,EAAE,CAAC6F,EAAM,CAACG,EAAO,MAAM,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,0CAA0C,4DAA4D,EAAE,CAAC,CAACgG,EAAO,cAAc,EAAEH,EAAM,CAACE,EAAK/F,CAAM,CAAC,EAAE,CAAC,wCAAwC,EAAE,CAAC6F,EAAM,CAACG,EAAO,UAAU,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,gDAAgD,EAAE,CAAC6F,EAAM,CAACG,EAAO,UAAU,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,2EAA2E,EAAE,CAAC,CAACgG,EAAO,OAAO,EAAEH,EAAM,CAACE,EAAKhG,CAAM,CAAC,EAAE,CAAC,8CAA8C,EAAE,CAAC,CAACiG,EAAO,OAAO,EAAEH,EAAM,CAACE,EAAKhG,CAAM,CAAC,EAAE,CAAC,0DAA0D,EAAE,CAAC8F,EAAM,CAACG,EAAO,SAAS,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,0DAA0D,EAAE,CAACgG,EAAOH,EAAM,CAACE,EAAK/F,CAAM,CAAC,EAAE,CAAC,2CAA2C,EAAE,CAAC6F,EAAM,CAACG,EAAO,WAAW,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,oDAAoD,EAAE,CAACgG,EAAOH,EAAM,CAACE,EAAK/F,CAAM,CAAC,EAAE,CAAC,qCAAqC,EAAE,CAAC6F,EAAM,CAACG,EAAO,OAAO,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,4BAA4B,EAAE,CAAC6F,EAAM,CAACG,EAAO,QAAQ,EAAE,CAACD,EAAK/F,CAAM,CAAC,EAAE,CAAC,8CAA8C,EAAE,CAACgG,EAAOH,EAAM,CAACE,EAAK/F,CAAM,CAAC,EAAE,CAAC,uBAAuB,+BAA+B,EAAE,CAAC,CAAC+F,EAAKz2F,EAAK,QAAQ,EAAE02F,EAAOH,CAAK,EAAE,CAAC,mCAAmC,EAAE,CAACA,EAAM,CAACG,EAAO,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,6BAA6B,EAAE,CAAC/nK,EAAQ,CAAC6nK,EAAK,UAAU,CAAC,EAAE,CAAC,uBAAuB,+DAA+D,0CAA0C,8BAA8B,EAAE,CAACA,EAAK7nK,CAAO,EAAE,CAAC,6BAA6B,EAAE,CAACA,EAAQ6nK,CAAI,CAAC,EAAE,GAAG,CAAC,CAAC,mCAAmC,EAAE,CAACA,EAAK7nK,CAAO,EAAE,CAAC,+BAA+B,iDAAiD,oDAAoD,EAAE,CAAC6nK,EAAK,CAAC7nK,EAAQuoK,EAAO,IAAIC,GAAK,GAAG,QAAQ,OAAO,CAAC,EAAE,CAAC,sCAAsC,EAAE,CAAC,CAACX,EAAK,SAAS,EAAE,CAAC7nK,EAAQuoK,EAAO,IAAIC,GAAK,GAAG,QAAQ,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAACX,EAAK,YAAY,EAAE7nK,CAAO,EAAE,CAAC,+BAA+B,0BAA0B,oFAAoF,sBAAsB,EAAE,CAAC6nK,EAAK7nK,CAAO,EAAE,CAAC,kDAAkD,EAAE,CAAC,CAAC6nK,EAAK,SAAS,EAAE7nK,CAAO,EAAE,CAAC,gBAAgB,EAAE,CAAC6nK,CAAI,EAAE,CAAC,qCAAqC,EAAE,CAAC,CAACA,EAAK,YAAY,EAAE7nK,CAAO,EAAE,CAAC,iDAAiD,wBAAwB,6BAA6B,2JAA2J,4BAA4B,oBAAoB,EAAE,CAAC6nK,EAAK7nK,CAAO,EAAE,CAAC,6BAA6B,EAAE,CAAC,CAAC6nK,EAAK,aAAa,EAAE7nK,CAAO,EAAE,CAAC,wBAAwB,EAAE,CAAC,CAAC6nK,EAAK,SAAS,EAAE7nK,CAAO,EAAE,CAAC,gDAAgD,EAAE,CAAC6nK,EAAK7nK,CAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC6nK,EAAK7nK,CAAO,EAAE,CAAC,uBAAuB,uDAAuD,EAAE,CAAC,CAACA,EAAQ,KAAK,GAAG,EAAE,CAAC6nK,EAAK,KAAK,CAAC,EAAE,CAAC,8BAA8B,gCAAgC,EAAE,CAAC,CAACA,EAAK,QAAQ,EAAE,CAAC7nK,EAAQ,KAAK,GAAG,CAAC,EAAE,CAAC,uCAAuC,oCAAoC,+DAA+D,qBAAqB,EAAE,CAAC6nK,EAAK7nK,CAAO,CAAC,CAAC,EAAMsgK,EAAS,SAASmI,EAAS9nE,GAAW,CAAuE,GAAnE,OAAO8nE,GAAW,WAAU9nE,GAAW8nE,EAASA,EAASrmJ,GAAa,EAAE,gBAAgBk+I,GAAW,OAAO,IAAIA,EAASmI,EAAS9nE,EAAU,EAAE,UAAS,EAAG,IAAIovB,GAAG04C,IAAW9qJ,GAAQA,EAAO,WAAWA,EAAO,UAAU,UAAUA,EAAO,UAAU,UAAU0pJ,GAAWqB,GAAO/nE,GAAWtvB,EAAK,OAAO82F,EAAQxnE,EAAU,EAAEwnE,EAAQ,YAAK,WAAW,UAAU,CAAC,IAAIv3C,GAAQ,CAAC,KAAKxuG,EAAU,QAAQA,CAAS,EAAE,OAAAmmJ,EAAO,IAAI,KAAK33C,GAAQb,GAAG24C,GAAO,OAAO,EAAE93C,GAAQ,MAAMv/C,EAAK,MAAMu/C,GAAQ,OAAO,EAASA,EAAO,EAAE,KAAK,OAAO,UAAU,CAAC,IAAI+3C,GAAI,CAAC,aAAavmJ,CAAS,EAAE,OAAAmmJ,EAAO,IAAI,KAAKI,GAAI54C,GAAG24C,GAAO,GAAG,EAASC,EAAG,EAAE,KAAK,UAAU,UAAU,CAAC,IAAI34C,GAAO,CAAC,OAAO5tG,EAAU,MAAMA,EAAU,KAAKA,CAAS,EAAE,OAAAmmJ,EAAO,IAAI,KAAKv4C,GAAOD,GAAG24C,GAAO,MAAM,EAAS14C,EAAM,EAAE,KAAK,UAAU,UAAU,CAAC,IAAIkxC,GAAO,CAAC,KAAK9+I,EAAU,QAAQA,CAAS,EAAE,OAAAmmJ,EAAO,IAAI,KAAKrH,GAAOnxC,GAAG24C,GAAO,MAAM,EAASxH,EAAM,EAAE,KAAK,MAAM,UAAU,CAAC,IAAIC,GAAG,CAAC,KAAK/+I,EAAU,QAAQA,CAAS,EAAE,OAAAmmJ,EAAO,IAAI,KAAKpH,GAAGpxC,GAAG24C,GAAO,EAAE,EAASvH,EAAE,EAAE,KAAK,UAAU,UAAU,CAAC,MAAM,CAAC,GAAG,KAAK,MAAK,EAAG,QAAQ,KAAK,aAAa,OAAO,KAAK,UAAW,EAAC,GAAG,KAAK,MAAK,EAAG,OAAO,KAAK,UAAS,EAAG,IAAI,KAAK,OAAQ,CAAA,CAAC,EAAE,KAAK,MAAM,UAAU,CAAC,OAAOpxC,EAAE,EAAE,KAAK,MAAM,SAAS04C,GAAS,CAAC,OAAA14C,GAAG04C,GAAgB,IAAI,EAAS,IAAI,EAAEnI,EAAS,QAAQ8G,EAAW9G,EAAS,QAAQ,CAAC,KAAKuH,EAAK,MAAMF,EAAM,QAAQ3nK,CAAO,EAAEsgK,EAAS,IAAI,CAAC,aAAa0H,CAAY,EAAE1H,EAAS,OAAO,CAAC,MAAMsH,EAAM,OAAOG,EAAO,KAAKD,EAAK,QAAQ3F,EAAQ,OAAOL,EAAO,QAAQmG,EAAQ,OAAOlG,EAAO,SAASG,EAAS,SAASgG,CAAQ,EAAE5H,EAAS,OAAO,CAAC,KAAKuH,EAAK,QAAQ7nK,CAAO,EAAEsgK,EAAS,GAAG,CAAC,KAAKuH,EAAK,QAAQ7nK,CAAO,EAAK,OAAOysB,IAAU+6I,GAAe,OAAO76I,IAAS66I,GAAY76I,EAAO,UAASF,EAAQE,EAAO,QAAQ2zI,GAAS7zI,EAAQ,SAAS6zI,GAAyCN,EAAoB,CAAC,GAAKmH,GAAiC,UAAU,CAAC,OAAO7G,CAAQ,GAAG,KAAK7zI,EAASuzI,EAAqBvzI,EAASE,CAAM,EACt7gBw6I,IAAkC/kJ,IAAcuK,EAAO,QAAUw6I,IAAwCxpJ,IAAQA,EAAO,SAAS2iJ,GAAU,IAAIj8G,GAAE1mC,IAASA,EAAO,QAAQA,EAAO,OAAO,GAAG,OAAO0mC,KAAImjH,EAAW,CAAC,IAAIjwK,GAAO,IAAI+oK,EAASj8G,GAAE,GAAG9sD,GAAO,UAAS,EAAG8sD,GAAE,GAAG,IAAI,UAAU,CAAC,OAAO9sD,GAAO,MAAO,CAAA,EAAE8sD,GAAE,GAAG,IAAI,SAASokH,EAAS,CAAClxK,GAAO,MAAMkxK,CAAQ,EAAE,IAAIltO,GAAOg8D,GAAO,UAAW,EAAC,QAAQ7yC,MAAQnpB,GAAQ8oH,GAAE,GAAG3/F,EAAI,EAAEnpB,GAAOmpB,EAAI,CAAE,CAAC,CAAC,GAAG,OAAO,QAAS,SAAS,OAAO,IAAI,CAEnd,EAEA,SAASioE,EAAQF,EAAS,EAEL,SAASm8I,EAAyB,CAC9Dj8I,EAAO,QAAUi8I,CAEjB,GAA6B,KAAKn8I,EAAS,CAAA,CAAE,CAEtC,EAEA,SAASE,EAAQF,EAASuzI,EAAqB,CAKtD,OAAO,eAAevzI,EAAS,aAAc,CACzC,MAAO,EACX,CAAC,EAED,IAAIo8I,EAAW,OAAO,QAAU,SAAU1vO,EAAQ,CAAE,QAASlJ,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CAAE,IAAI+Q,EAAS,UAAU/Q,CAAC,EAAG,QAASN,KAAOqR,EAAc,OAAO,UAAU,eAAe,KAAKA,EAAQrR,CAAG,IAAKwJ,EAAOxJ,CAAG,EAAIqR,EAAOrR,CAAG,GAAS,OAAOwJ,GAEnPonO,EAAWP,EAAoB,CAAC,EAChCE,EAAeK,EAAS,aACxBF,EAAcE,EAAS,YAEvBE,EAAY,SAAmBrnO,EAAM,CACrC,OAAQA,EAAI,CACR,KAAK8mO,EAAa,OACd,MAAO,CAAE,SAAU,IACvB,KAAKA,EAAa,OACd,MAAO,CAAE,SAAU,IACvB,KAAKA,EAAa,SACd,MAAO,CAAE,UAAW,IACxB,KAAKA,EAAa,QACd,MAAO,CAAE,UAAW,IACxB,KAAKA,EAAa,SACd,MAAO,CAAE,WAAY,IACzB,KAAKA,EAAa,QACd,MAAO,CAAE,UAAW,IACxB,QACI,OAAOG,CACd,CACL,EAEIK,EAAa,SAAoB6E,EAAW30C,EAASswC,EAAQC,EAAIpxC,EAAI,CACrE,MAAO,CACH,UAAWw1C,EACX,oBAAqB30C,EAAQ,MAC7B,mBAAoBA,EAAQ,QAC5B,YAAaA,EAAQ,KACrB,WAAYswC,EAAO,MAAQ,GAC3B,cAAeA,EAAO,QACtB,OAAQC,EAAG,KACX,UAAWA,EAAG,QACd,UAAWpxC,CACnB,CACA,EAEI4wC,EAAgB,SAAuBvnO,EAAM42L,EAAQmxC,EAAIpxC,EAAI,CAC7D,OAAO84C,EAAS,CAAE,EAAEzvO,EAAM,CACtB,OAAQ42L,EAAO,OACf,MAAOA,EAAO,MACd,GAAImxC,EAAG,KACP,UAAWA,EAAG,QACd,GAAIpxC,CACZ,CAAK,CACL,EAEI+wC,EAAa,SAAoBkE,EAAW9D,EAAQC,EAAIpxC,EAAI,CAC5D,MAAO,CACH,UAAWi1C,EACX,WAAY9D,EAAO,KACnB,cAAeA,EAAO,QACtB,OAAQC,EAAG,KACX,UAAWA,EAAG,QACd,UAAWpxC,CACnB,CACA,EAEI8wC,EAAiB,SAAwBoE,EAAW/D,EAAQC,EAAIpxC,EAAI,CACpE,MAAO,CACH,UAAWk1C,EACX,WAAY/D,EAAO,KACnB,cAAeA,EAAO,QACtB,OAAQC,EAAG,KACX,UAAWA,EAAG,QACd,UAAWpxC,CACnB,CACA,EAEI6wC,EAAc,SAAqBsE,EAAYhE,EAAQC,EAAIpxC,EAAI,CAC/D,MAAO,CACH,WAAYm1C,EACZ,WAAYhE,EAAO,KACnB,cAAeA,EAAO,QACtB,OAAQC,EAAG,KACX,UAAWA,EAAG,QACd,UAAWpxC,CACnB,CACA,EAEIgxC,EAAuBt0I,EAAQ,qBAAuB,UAAgC,CACtF,OAAI,OAAO,OAAW,MACd,OAAO,WAAa,WACb,OAAO,WAAa,UAI5B,EACX,EAEIu0I,EAAev0I,EAAQ,aAAe,SAAsBrzF,EAAM,CAClE,IAAI4qO,EAAMjD,IACV,OAAOiD,GAAOA,EAAI,WAAaA,EAAI,SAAS,QAAQ5qO,CAAI,IAAM,IAAM4qO,EAAI,WAAa,YAAcA,EAAI,eAAiB,GAAK,CAAC,OAAO,SACzI,EAEAr3I,EAAO,QAAU,CACb,UAAW8zI,EACX,WAAYC,EACZ,cAAeC,EACf,WAAYG,EACZ,eAAgBD,EAChB,YAAaD,EACb,qBAAsBG,EACtB,aAAcC,CAClB,CAEO,CACP,CAAU,ypDC7iBV,MAAMltO,EAAQgzD,EAmCRgiL,EAAcxoO,EAAI,IAAI,EACtByoO,EAAiBzoO,EAAI,IAAI,EACzB0oO,EAAetxO,EAAS,IAAMoxO,EAAY,OAASC,EAAe,KAAK,EACvEE,EAAmBvxO,EAAS,IAAMsxO,EAAa,OAASl1O,EAAM,OAAO,EAErEo1O,EAAiB5oO,EAAI,EAAK,EAC1B2+K,EAAQvnL,EAAS,IAAM,OAAA,OAAA3B,EAAAkzO,EAAiB,MAAM,SAAvB,YAAAlzO,EAA+B,QAAO,EAC7DozO,EAAazxO,EAAS,IAAM,OAAA,OAAA3B,EAAAkzO,EAAiB,MAAM,SAAvB,YAAAlzO,EAA+B,MAAK,EAChEwpL,EAAW7nL,EAAS,IAAOwxO,EAAe,OAASC,EAAW,MAAQA,EAAW,MAAQlqD,EAAM,KAAM,EAErGvpH,EAAMh+D,EAAS,IAAMuxO,EAAiB,MAAM,GAAG,EAC/CG,EAAO1xO,EAAS,IAAMuxO,EAAiB,MAAM,IAAI,EACjDI,EAAU3xO,EAAS,IAAMuxO,EAAiB,MAAM,OAAO,EAEvDzrG,EAAQ9lI,EAAS,IAAMuxO,EAAiB,MAAM,KAAK,EACnDK,EAAgB5xO,EAAS,IAAMuxO,EAAiB,MAAM,aAAa,EACnEM,EAAe7xO,EAAS,IAAMuxO,EAAiB,MAAM,YAAY,EAEjEO,EAAoBC,GACpB,OAAOA,GAAc,UAAYA,IAAc,MAAQ,CAAC,OAAO,MAAM,OAAOA,EAAU,GAAG,CAAC,GAAK,CAAC,OAAO,MAAM,OAAOA,EAAU,GAAG,CAAC,EAC/H31O,EAAM,YAAcA,EAAM,iBAAqBA,EAAM,YAAc,CAACA,EAAM,SAAaA,EAAM,YAAcA,EAAM,SAAWA,EAAM,UAC9H,MAAMsuH,GAAY,OAAOqnH,EAAU,GAAG,CAAC,CAAC,SAASrnH,GAAY,OAAOqnH,EAAU,GAAG,CAAC,CAAC,GAEnF,GAAGrnH,GAAY,OAAOqnH,EAAU,GAAG,CAAC,CAAC,MAAMrnH,GAAY,OAAOqnH,EAAU,GAAG,CAAC,CAAC,GAE7EA,IAAc,MAAQA,IAAc,IAAM,CAAC,OAAO,MAAM,OAAOA,CAAS,CAAC,EAC7E31O,EAAM,YAAcA,EAAM,iBAAqBA,EAAM,YAAc,CAACA,EAAM,SAAaA,EAAM,YAAcA,EAAM,SAAWA,EAAM,UAC9H,MAAMsuH,GAAY,OAAOqnH,CAAS,CAAC,CAAC,GAEpCrnH,GAAY,OAAOqnH,CAAS,CAAC,EAGtC,OAIEC,EAAchyO,EAAS,IAAM8xO,EAAiBhsG,EAAM,KAAK,CAAC,EAC1DmsG,EAAsBjyO,EAAS,IAAM8xO,EAAiBF,EAAc,KAAK,CAAC,EAK1EM,EAAoBlyO,EAAS,IAAM6xO,EAAa,OAASG,EAAY,MAAM,QAAQ,GAAG,IAAM,IAAMlsG,EAAM,QAAU8rG,EAAc,KAAK,EAErIO,EAA0BC,GAAYhB,EAAY,MAAQgB,EAC1DC,EAAyB,IAAOjB,EAAY,MAAQ,KACpDkB,EAAqBF,GAAYf,EAAe,MAAQe,EACxDG,EAAoBH,GAAWf,EAAe,OAASA,EAAe,MAAM,aAAee,EAAO,WAClG7mG,EAAexyH,GAAO,uBAAuB,EAE7Cy5N,EAAqBzkO,GAAU,CAC/B3R,EAAM,gBAAkB2R,EAAM,WAAW,YAAc,MACzD,OAAO,SAAW3R,EAAM,QAAQ,IACvBA,EAAM,QAAQ,KAAO,CAACA,EAAM,iBACrCovI,IAAiB,CAACpvI,EAAM,OAAO,EAAGmvI,CAAY,EAC9C,OAAO,SAAWvtE,EAAI,MAE1B,EACM/vD,EAAOsiD,EAEP+6D,EAAYtrH,EAAS,CACzB,IAAK,IAAM5D,EAAM,QAAQ,SACzB,IAAKiiH,GAAAA,SAAU1mH,GAAQ,CACjBA,GAAOA,IAAQyE,EAAM,QAAQ,UAC/B6R,EAAK,kBAAmBtW,CAAG,CAE9B,EAAE,GAAG,CACR,CAAC,EAEK86O,GAAgB,IAAM,mBAC1B,OAAKp0O,EAAAkzO,EAAiB,QAAjB,MAAAlzO,EAAwB,SAEzBizO,EAAa,MAAcA,EAAa,MAAM,YAE3C9tD,IAAAD,GAAAguD,EAAiB,QAAjB,YAAAhuD,GAAwB,SAAS,KAAjC,YAAAC,GAAqC,aAJE11K,GAAAyjO,EAAiB,QAAjB,YAAAzjO,GAAwB,YAAWw1K,GAAAiuD,EAAiB,QAAjB,YAAAjuD,GAAwB,WAK3G,EACMovD,EAAiB,IAAM,gBAC3B,IAAIr0O,EAAAkzO,EAAiB,QAAjB,MAAAlzO,EAAwB,SAAU,CACpC,MAAMs0O,KAAY7kO,GAAAyjO,EAAiB,QAAjB,YAAAzjO,GAAwB,QAAOw1K,GAAAiuD,EAAiB,QAAjB,YAAAjuD,GAAwB,WAEzE,QADeC,GAAAguD,EAAiB,QAAjB,YAAAhuD,GAAwB,SAAS,KAAMy9B,IAAQA,GAAI,YAAc2xB,KAClE,SAAS,KACxB,KAAM,QAAIpB,EAAiB,MAAM,UAAY,KACrCA,EAAiB,MAAM,SAAS,MAEhCA,EAAiB,MAAM,KAElC,EAEMqB,EAA2B,IAAM,UACrC,MAAO,CACL,KAAMx2O,EAAM,QAAQ,KACpB,UAAWk1O,EAAa,MAAQA,EAAa,MAAM,WAAYjzO,EAAAkzO,EAAiB,QAAjB,YAAAlzO,EAAwB,IACvF,SAAUkpL,EAAM,OAASnrL,EAAM,QAAQ,OAAO,QAC9C,MAAOs2O,EAAgB,EACvB,QAASD,GAAe,EACxB,aAAAlnG,EACA,OAAOz9H,GAAA1R,EAAM,UAAN,YAAA0R,GAAe,MACtB,QAAS6jO,EAAQ,KACrB,CACA,EAEMkB,GAAmB,IAAM,CAC7B5kO,EAAK,oBAAqB2kO,EAAwB,CAAE,CACtD,EACME,GAAoBC,GAAc,CACjCptG,IAAAA,WACH6rG,EAAe,MAAQuB,EAE3B,m8MCvJA,MAAM32O,EAAQgzD,EAkBRx8C,EAAQ29C,EACRyiL,EAAoBpqO,EAAI,IAAI,EAC5BoiI,EAAWhrI,EAAS,IACjB5D,EAAM,SAAS,IAAI,CAAC8iE,EAAS77C,KAC3B,CACL,GAAG67C,EACH,MAAA77C,CACN,EACG,CACF,4wCCpBD,MAAMokH,EAAoB3jD,GAAoB,EAExC,CAAE,UAAWo8H,EAAsB,OAAQC,CAA2B,EAAG3E,GAAqB,EAC9F,CAAE,UAAW4E,EAA6B,OAAQC,CAAkC,EAAG1E,GAA6B,EACpH,CAAE,UAAW2E,EAAmC,OAAQ2yB,CAA4B,EAAGr4B,GAA6B,EAEpHx+M,EAAQgzD,EA8DRnhD,EAAOsiD,EAEPiwJ,EAA4B53M,EAAI,EAAK,EACrC83M,EAAuB93M,EAAI,IAAI,EAC/B63M,EAAW73M,EAAI,EAAK,EAEpBsqO,EAAclzO,EAAS,IAAM5D,EAAM,cAAgB,CAAC,EACpD+2O,EAAgBnzO,EAAS,IAAM,CAAC5D,EAAM,UAAaA,EAAM,eAAiB,GAAM,CAACA,EAAM,QAAQ,EAC/F42O,EAAoBpqO,EAAI,IAAI,EAC5BwkI,EAASxkI,IAAIvK,EAAAjC,EAAM,cAAN,YAAAiC,EAAmB,SAAU,CAAC,EAC3CwsL,EAAkBjiL,IAAIkF,EAAA1R,EAAM,cAAN,YAAA0R,EAAmB,kBAAmB,EAAK,EACjEg9K,EAAiBliL,IAAI06K,GAAAlnL,EAAM,cAAN,YAAAknL,GAAmB,iBAAkB,EAAK,EACrE7zD,EAAa,CACX,kBAAAujH,CACF,CAAC,EACD,SAASI,EAAwBC,EAAiB,CAChD3yB,EAAqB,MAAQ2yB,EAC7B7yB,EAA0B,MAAQ,EACpC,CAEA,MAAM8yB,EAA8B,IAAM,CACxC9yB,EAA0B,MAAQ,EACpC,EAEM0D,EAA0B1oN,GAAS,CACvC,MAAMmV,EAAO,CACX,UAAWnV,EAAK,SAAS,UACzB,SAAU,EACV,eAAgBA,EAAK,KAAK,EAC9B,EACE2kN,EAA0BxvM,EAAM,CAC9B,UAAW,IAAM,WACf82H,EAAkB,cAAc,8BAA8B,EAC9D4E,GAAoB,CAClB,GAAG7wI,EAAK,SACR,OAAO6C,GAAA7C,EAAK,OAAL,YAAA6C,GAAW,MAClB,QAAQyP,GAAAtS,EAAK,OAAL,YAAAsS,GAAW,IAC3B,CAAO,CACF,EACD,QAAS,IAAM25H,EAAkB,YAAY,yEAAyE,CAC1H,CAAG,CACH,EACM08E,EAA0B3oN,GAAS,CACvC,MAAMmV,EAAO,CACX,UAAWnV,EAAK,SAAS,UACzB,eAAgBA,EAAK,KAAK,EAC9B,EACQ4oN,GAAiBzzM,EAAK,eACtB0zM,GAAkB1zM,EAAK,UAEvB2zM,GADqB9oN,EAAK,SAAS,KAAMA,IAASA,GAAK,KAAO4oN,EAAc,EACvC,SAAS,KAAMllJ,IAAYA,GAAQ,YAAcmlJ,EAAe,EACrGnlJ,GAAU,CAAE,eAAgB1jE,EAAK,KAAK,GAAI,GAAI8oN,GAAgB,GAAI,SAAU,CAAC,EACnFjE,EAAiCnhJ,GAAS,CACxC,UAAW,IAAMuoE,EAAkB,cAAc,kCAAkC,EACnF,QAAS,IAAMA,EAAkB,YAAY,yEAAyE,CAC1H,CAAG,CACH,EAEA,SAASq8E,EAAensN,EAAK,CACvBA,GAAO,IACT6oN,EAA0B,MAAQ,GAClCC,EAAS,MAAQ9oN,IAEjB6oN,EAA0B,MAAQ,GAClCC,EAAS,MAAQ,IAEnBA,EAAS,MAAQ9oN,CACnB,CACA,MAAMqmN,EAAsBgG,GAAwB,CAClD,MAAMC,EAAe,CACnB,MAAOD,EAAoB,MAC3B,YAAaA,EAAoB,YACjC,kBAAmBA,EAAoB,kBACvC,kBAAmB,CAAC,CAAE,UAAWA,EAAoB,UAAW,SAAU,EAAG,CACjF,EACEivB,EAA2BhvB,EAAc,CACvC,UAAW,IAAMx8E,EAAkB,cAAc,sCAAsC,EACvF,QAAS,IAAMA,EAAkB,YAAY,yEAAyE,EACtH,UAAW,IAAM,CACfg5E,EAAS,MAAQ,GACjBD,EAA0B,MAAQ,GAClCn0E,GAAoB23E,CAAmB,CACxC,CACL,CAAG,CACH,8vDChKM5rC,IAAiB,WAmBVm7D,IAA0B,CAACC,EAAYvL,EAAewL,IAC1Dx1J,GAAiB,CACtB,SAAU,CAACm6F,IAAgB6vD,EAAewL,CAAS,EACnD,QAAS,CAAC,CAAE,UAAAp+J,KACHnK,GAAY,KAAK,sBAAuB,CAAE,GAAGsoK,EAAY,UAAWn+J,CAAS,CAAE,EAExF,iBAAkB,CAACq+J,EAAUC,IACvBA,EAAS,QAAU,EAAU,EACbA,EAAS,OAAO,CAAC39I,EAAa/f,IAAS+f,EAAc/f,EAAK,SAAU,CAAC,EACrEy9J,EAAS,MAAcA,EAAS,UAAY,EACzD,KAET,qBAAsB,GACtB,OAAQ,CACZ,CAAG,yyBC1BH,MAAMt3O,EAAQgzD,EA+CRq4K,EAAqB9B,GAAsB,EAC3C,CAAE,aAAAR,EAAc,YAAAI,EAAa,UAAAlkB,EAAW,YAAAv6E,EAAa,iBAAAw+F,CAAkB,EAAGmC,EAAmB,SAE7F,CAAE,KAAAtmD,EAAM,KAAA0D,GAASr6F,KAEjBopJ,EAAqBhrO,EAAI,CAAC,EAC1BirO,EAAoBz3O,EAAM,QAAQ,IAAK6kB,IAAWA,GAAO,GAAG,EAC5DyhK,EAAc95K,EAAI,EAAI,EACtBkrO,EAAqBlrO,EAAI,IAAI,EAC7BmrO,EAAanrO,EAAI,EAAK,EAEtBorO,EAAgBprO,EAAI,IAAI,EACxBqrO,EAAuBrrO,EAAI,IAAI,EAE/BsrO,EAAyB3wO,GAAS,CACtC,gBAAiB,GACjB,eAAgB,GAChB,iBAAkBvD,EAAS,IAAOmhL,EAAK,OAAS0D,EAAK,MAAQ,IAAM,GAAI,CACzE,CAAC,EAEKgiD,EAAc7mO,EAAS,IACtB5D,EAAM,YACJA,EAAM,YADkB,EAEhC,EACKq3O,EAAY7qO,EAAI08N,KAAoBjnO,GAAAwoO,EAAY,MAAM,CAAC,IAAnB,YAAAxoO,GAAsB,IAAG,EAC7D81O,EAAkBvrO,EAAI,IAAI,EAE1BwrO,EAAoBp0O,EAAS,IAC5B5D,EAAM,oCACJA,EAAM,oCAAoC,kBADM,EAExD,EAEKi4O,EAAYr0O,EAAS,IACpB5D,EAAM,UACJA,EAAM,UADgB,EAE9B,EAEKk4O,EAAkBC,EAAkBF,EAAU,MAAOlP,CAAY,EAEjEqO,EAAa5qO,EAAI,CACrB,SAAUsrO,EAAuB,gBACjC,UAAWptG,EACX,UAAW2sG,EACX,OAAQ,EACR,QAASa,EACT,kBAAmBT,EACnB,WAAYz3O,EAAM,WAClB,UAAW,GACX,kBAAmBg4O,CACrB,CAAC,EAEKnM,EAAgBr/N,EAAIu8N,CAAY,EAEtC,SAASqP,EAA0BtsN,GAAS,CAC1C,MAAMusN,GAAuB,OAAO,QAAQvsN,EAAO,EAAE,IAAI,CAAC,CAACjwB,GAAKqB,EAAK,KAC5D,CACL,IAAKrB,GACL,OAAQqB,EACd,EACG,EAEDk6O,EAAW,MAAM,UAAY,EAC7BA,EAAW,MAAM,OAAS,EAC1BA,EAAW,MAAM,SAAWU,EAAuB,gBACnDjM,EAAc,MAAQwM,GACtBV,EAAW,MAAQ,GAEnBP,EAAW,MAAM,QAAUe,EAAkBF,EAAU,MAAOI,EAAoB,CACpF,CAEA,SAASF,EAAkBD,GAAiBI,GAAoB,CAK9D,MAAO,CAAC,GAJkBJ,GAAgB,OAAQK,IACzC,CAACD,GAAmB,KAAME,IAAgBA,GAAY,MAAQD,GAAS,GAAG,CAClF,EAE6B,GAAGD,EAAkB,CACrD,CAEA,KAAM,CACJ,KAAMG,EACN,cAAAC,GACA,YAAAt+J,EACA,WAAAgD,EACA,mBAAAlE,GACA,QAAAoE,EACF,EAAI65J,IAAwBC,EAAW,MAAOvL,EAAewL,CAAS,EAEhEsB,EAAkBxxO,GAAS,CAC/B,MAAOvD,EAAS,IAAA,QAAM,QAAA3B,GAAAw2O,EAAyB,QAAzB,YAAAx2O,GAAgC,MAAM,GAAG,QAAS,EAAC,EACzE,OAAQ2B,EAAS,IAAA,QAAM,QAAA3B,GAAAw2O,EAAyB,QAAzB,YAAAx2O,GAAgC,MAAM,GAAG,SAAU,GAAE,EAC5E,SAAU2B,EAAS,IAAM,QACvB,OAAO3B,GAAAw2O,EAAyB,QAAzB,YAAAx2O,GAAgC,MAAM,IAAK22O,IAAaA,GAAS,UAAU,MACtF,CAAG,CACH,CAAC,EAEKC,GAAgBj1O,EAAS,IACzB+0O,EAAgB,SAEhBA,EAAgB,SAAS,QAAUb,EAAuB,kBAC1Da,EAAgB,OAASb,EAAuB,iBAC/C,CAAC19J,EAAY,OAASu+J,EAAgB,SAAS,QAAUb,EAAuB,iBAI9E,EACR,EAEKgB,GAAqBl1O,EAAS,IAC9B+0O,EAAgB,SACVA,EAAgB,SAAS,OAASA,EAAgB,MAAS,IAE9D,CACR,EAEDxsN,GAAQ,oBAAqBixD,CAAU,EACvCjxD,GAAQ,wBAAyBnsB,EAAM,YAAY,EAGnDid,GAAM07N,EAAiB,IAAM,CAQ3B,GAPI,QAAQ,OAASryD,EAAY,OAC/Bx2K,GAAS,IAAM,QACb,OAAO,SAAS,GAAG7N,GAAA,QAAQ,QAAR,YAAAA,GAAe,eAAe,EACjD,QAAQ,aAAa,KAAM,EAAE,CACnC,CAAK,EAGC,CAACqkL,EAAY,OAAS,CAACqxD,EAAW,MAAO,CAC3C,MAAMoB,GAAYrB,EAAmB,MAAM,kBACrCsB,GAAW,SAAS,cAAc,sBAAsB,EACxDC,GAAY,SAAS,cAAc,qBAAqB,EACxDzkB,GAAYwkB,GAAWA,GAAS,UAAYD,GAAU,UAC5DjpO,GAAS,IAAM,CACb,OAAO,SAAS,CACd,IAAK0kN,GAAYykB,GAAU,aAC3B,KAAM,EACN,SAAU,QAClB,CAAO,CACP,CAAK,CACL,MACIhqG,IAAmB0pG,EAAgB,SAAU34O,EAAM,YAAY,EAGjEsmL,EAAY,MAAQ,EACtB,CAAC,EAED,MAAM4yD,GAAch8O,IAAU,CAC5BisO,EAAY,OAAQjsO,EAAK,EACzB+nN,IACAmyB,EAAW,MAAM,UAAY,EAC7BA,EAAW,MAAM,OAAS,EAC1BA,EAAW,MAAM,SAAWU,EAAuB,gBACnDT,EAAU,MAAQn6O,EACpB,EAEAuiB,GAAU,IAAM,CACd,OAAO,iBAAiB,SAAU05N,EAAY,EAC9C,OAAO,iBAAiB,eAAgB5tN,EAAS,EACjDqsN,EAAc,MAAQ,SAAS,cAAc,QAAQ,EACrDC,EAAqB,MAAQ,SAAS,cAAc,qBAAqB,EACrED,EAAc,OAChB9nO,GAAS,IAAM,SAAS,gBAAgB,MAAM,YAAY,kBAAmB,GAAG8nO,EAAc,MAAM,YAAY,IAAI,CAAC,CAEzH,CAAC,EAED,MAAMrsN,GAAY,IAAM,CACtB,QAAQ,aACN,CACE,gBAAiB,SAAS,gBAAgB,UAC1C,gBAAiBotN,EAAgB,SAAS,MAC3C,EACD,EACJ,CACA,EAEMQ,GAAe,IAAM,CACzB,MAAMC,GAAwB,SAAS,gBAAgB,UAOvD,GALsBrB,EAAgB,MACpB,sBAAuB,EAAC,OAAS,IAAM,OAAO,aAC9DsB,KAGED,IAAyBxB,EAAc,MAAM,aAAc,CACzDA,EAAc,MAAM,UAAU,SAAS,aAAa,IACtDA,EAAc,MAAM,UAAU,OAAO,aAAa,EAClDA,EAAc,MAAM,UAAU,OAAO,sBAAsB,EAC3DC,EAAqB,MAAM,UAAU,OAAO,4BAA4B,GAG1E,MACD,CAEGuB,GAAwB5B,EAAmB,MACxCI,EAAc,MAAM,UAAU,SAAS,aAAa,EAI9CA,EAAc,MAAM,UAAU,SAAS,aAAa,GAAKA,EAAc,MAAM,UAAU,SAAS,4BAA4B,IACrIA,EAAc,MAAM,UAAU,OAAO,4BAA4B,EACjEC,EAAqB,MAAM,UAAU,OAAO,kCAAkC,EAC9ED,EAAc,MAAM,UAAU,IAAI,sBAAsB,EACxDC,EAAqB,MAAM,UAAU,IAAI,4BAA4B,IAPrED,EAAc,MAAM,UAAU,IAAI,aAAa,EAC/CA,EAAc,MAAM,UAAU,IAAI,sBAAsB,EACxDC,EAAqB,MAAM,UAAU,IAAI,4BAA4B,GAQnED,EAAc,MAAM,UAAU,SAAS,aAAa,IACtDA,EAAc,MAAM,UAAU,OAAO,sBAAsB,EAC3DC,EAAqB,MAAM,UAAU,OAAO,4BAA4B,EACxED,EAAc,MAAM,UAAU,IAAI,4BAA4B,EAC9DC,EAAqB,MAAM,UAAU,IAAI,kCAAkC,GAI/EL,EAAmB,MAAQ4B,EAC7B,EAEMC,GAAmB,IAAM,CACzB,CAACngK,GAAmB,OAASkB,EAAY,OAAS,CAACy+J,GAAc,QACnEzB,EAAW,MAAM,SAAWU,EAAuB,eACnDH,EAAW,MAAQ,GACnBe,KAEJ,EAEMY,GAAc,IAAM,CACxB,OAAO,SAAS,CAAE,IAAK,EAAG,KAAM,EAAG,SAAU,QAAQ,CAAE,CACzD,muDCrRA,MAAMt5O,EAAQgzD,EAYR,CAAE,KAAAge,CAAI,EAAKje,GAAY/yD,EAAM,IAAI,isBCdvC,MAAMA,EAAQgzD,EA+BRumL,EAAe31O,EAAS,IAAM,CAClC,OAAQ5D,EAAM,gBAAe,CAC3B,IAAK,YACH,MAAO,eACT,IAAK,QACH,MAAO,WACT,IAAK,QACH,MAAO,WACT,IAAK,OACH,MAAO,UACT,QACE,MAAO,cACV,CACH,CAAC,EAEK6R,EAAOsiD,21CC3Cb,MAAMn0D,EAAQgzD,EAYR,CAAE,QAAA6G,EAAS,MAAA6nH,CAAO,EAAG3uH,GAAY/yD,EAAM,IAAI,6XCbjD,MAAMA,EAAQgzD,EAYR,CAAE,QAAAp+B,EAAS,UAAA02J,CAAW,EAAGv4H,GAAY/yD,EAAM,IAAI,2VCdnD,SAAAq6D,IAAAC,EAAA3F,EAAA,QAGe07E,EAAA,EAAAC,EAAA,MAAA/7E,IAAA,CAFDz1B,EAAW06M,GAAA,CAAC,KAAK,oBAJjC,EAAA,SAKmBC,EAAA,IAAA,qCALnB,ijBCSA,MAAMz5O,EAAQgzD,EAYR,CAAE,MAAA4G,CAAK,EAAK7G,GAAY/yD,EAAM,IAAI,EAElCw2M,EAAShqM,EAAI,KAAK,MAAM,KAAK,SAAW,SAAS,KAAK,IAAK,CAAA,CAAC,CAAC,EAC7DiqM,EAAYjqM,EAAI,WAAWgqM,EAAO,KAAK,EAAE,EACzCE,EAAWlqM,EAAI,UAAUgqM,EAAO,KAAK,EAAE,EACvCG,EAAwB/yM,EAAS,IACjCmhL,EACK,CACL,GAAI0xB,EAAU,MACd,KAAM,SACN,gBAAiBC,EAAS,MAC1B,gBAAiBgjC,EAAS,MAAQ,OAAS,OACjD,EAES,EACR,EACK9iC,EAAuBhzM,EAAS,IAChCmhL,EACK,CACL,GAAI2xB,EAAS,MACb,KAAM,SACN,kBAAmBD,EAAU,KACnC,EAES,EACR,EAEKijC,EAAWltO,EAAI,EAAK,EACpBmtO,EAAa/1O,EAAS,IACnBg2D,EAAM,MAAM,KAAMx6D,GAASA,EAAK,QAAQ,CAChD,EAEK,CAAE,KAAA2lL,CAAI,EAAK32F,KAEXwrJ,EAAYh2O,EAAS,IACrBmhL,EAAK,MACArlG,GAAS,UAAC9lB,EAAM,KAAK,EAAE,OAAQx6D,GAAS,CAACA,EAAK,QAAQ,EAExDw6D,EAAM,KACd,EAEKigL,EAAaj2O,EAAS,IACtBmhL,EAAK,MACA,uEAEF,2CACR,2nFCpDD,MAAM/kL,EAAQgzD,EAgBR8mL,EAAUl2O,EAAS,IAAM5D,EAAM,UAAY,eAAe,EAE1D,CAAE,QAAA65D,EAAS,gBAAAkgL,EAAiB,WAAAC,CAAU,EAAKjnL,GAAY/yD,EAAM,IAAI,EAEjEi6O,EAAcztO,EAAI,EAAK,EAEvBmmI,EAAQxrI,GAAS,CACrB,gBAAiB,GACjB,YAAa,EACf,CAAC,EAEKixI,EAAmB5rI,EAAI,CAAA,CAAE,EAEzByvI,EAAY/D,GAChB,CACE,gBAAiB,CACf,SAAU5kG,GAAQ,YAAY,sCAAuCinG,EAAQ,CAC9E,CACF,EACD5H,EACA,CAAE,iBAAAyF,CAAkB,CACtB,EAEM8hG,EAAsB1tO,EAAI,CAAA,CAAE,EAE5B,CAAE,OAAQ2tO,EAAsB,UAAWC,CAAY,EAAGtwD,IAAyB,EACnFz+C,EAAoB3jD,GAAoB,EAE9C,eAAe2yJ,GAAiB,CAC1B,MAAMp+F,EAAU,MAAM,cACxBi+F,EAAoB,MAAQ,GAC5BC,EAAqBxnG,EAAO,CAC1B,UAAW2nG,EACX,QAASC,CACf,CAAK,EAEL,CAEA,SAASD,GAA8B,CACrCL,EAAY,MAAQ,GACpB5uG,EAAkB,cAAc,mBAAmB,CACrD,CAEA,SAASkvG,EAA0Bv2N,EAAO,OACxC,KAAM,CAAE,KAAAzP,EAAM,OAAA4vD,GAAWngD,EAAM,SAC3BmgD,IAAW,OAAOliE,EAAAsS,GAAA,YAAAA,EAAM,SAAN,MAAAtS,EAAc,QAClCsS,EAAK,OAAO,QAAS9F,GAAQ,CACvBA,EAAI,OAAS,mBACf2pI,EAAiB,MAAQ,CAAE,gBAAiB,qBAAqB,EAEjE8hG,EAAoB,MAAM,KAAKzrO,EAAI,WAAW,CAEtD,CAAK,EAED48H,EAAkB,YAAY,sFAAsF,CAExH,CAEA,SAAS9sH,GAAQ,CACfo0H,EAAM,gBAAkB,GACxBA,EAAM,YAAc,GACpBsJ,EAAU,MAAM,QAClB,qtFCvFA,MAAMj8I,EAAQgzD,EA+CRx8C,EAAQ29C,EACRqmL,EAAwBhuO,EAAIxM,EAAM,QAAQ,EAC1C8pI,EAA6Bt9C,GAAW,IAAMxsF,EAAM,SAAS,EAE7Dy6O,EAAYjuO,EAAI,EAAK,EACrBkuO,EAAc,IAAM,CACxBD,EAAU,MAAQ,CAACA,EAAU,KAC/B,EAEM1tD,EAAuBC,GAAe,CAC1C,OAAQA,EAAU,CAChB,IAAK,SAAU,CACbx2K,EAAM,SAAUxW,EAAM,EAAE,EACxB,KACD,CACD,IAAK,SAAU,CACbwW,EAAM,SAAUxW,EAAM,EAAE,EACxB,KACD,CACF,CACDy6O,EAAU,MAAQ,EACpB,EAEME,EAAqBhpO,GAAU,CAC7BA,EAAM,OAAO,QAAQ,gBAAgB,IAAM,OAC/C8oO,EAAU,MAAQ,GAEtB,EAEA,OAAAh7N,GAAU,IAAM,CACd,OAAO,iBAAiB,QAASk7N,CAAiB,CACpD,CAAC,EAEDj7N,GAAgB,IAAM,CACpB,OAAO,oBAAoB,QAASi7N,CAAiB,CACvD,CAAC,ohHCnFD,MAAM36O,EAAQgzD,EAsCRx8C,EAAQ29C,EACRksJ,EAAgBz8M,EAAS,IAAM5D,EAAM,UAAU,EAC/C46O,EAAiBh3O,EAAS,IAAMy8M,EAAc,MAAM,QAAU,CAAC,8/EC3BrE,MAAMrgN,EAAQgzD,EA2BRgqH,EAAkBxwK,EAAI,EAAK,EAC3B63M,EAAW73M,EAAI,EAAK,EACpB+hL,EAAa/hL,EAAI,EAAK,EACtB83M,EAAuB93M,EAAI,IAAI,EAC/B22K,EAAW32K,EAAI,IAAI,EACnBiuO,EAAYjuO,EAAI,EAAK,EACrBquO,EAAuBruO,EAAI,IAAI,EAE/B,CAAE,UAAWsiL,EAAuB,OAAQgsD,CAA0B,EAAGt8B,GAA6B,EACtG,CAAE,UAAWvvB,EAAuB,OAAQ8rD,CAA0B,EAAGp8B,GAA6B,EACtG,CAAE,UAAW/vB,EAAuB,OAAQosD,CAA0B,EAAG/7B,GAA6B,EACtG5zE,EAAoB3jD,GAAoB,EAExCs7F,EAAWx2K,EAAIxM,EAAM,OAAO,EAClC,GAAI,CAAE,UAAAq9E,EAAW,QAAAC,EAAS,KAAM8iI,CAAkB,EAAGlC,GAAoB,EAErE,CAAE,KAAMvvB,GAAsBnB,KAElC,MAAMmzB,EAAuBn0M,EAAI,IAAI,EAE/Bo0M,EAAsBh9M,EAAS,IAC/B+qL,EAAkB,MACbA,EAAkB,MAAM,IAAKkyB,KAAa,CAC/C,KAAMA,GAAQ,KACd,MAAOA,GAAQ,IAChB,EAAC,EAEK,EAEV,EAEKR,EAAgBz8M,EAAS,IACzBy5E,EAAU,OAASC,EAAQ,MAAc,CAAA,EAEtC8iI,EAAiB,MAAM,OAAQjB,IAAiBA,GAAa,qBAAuBn/M,EAAM,mBAAmB,CACrH,EACK+qI,EAAYnnI,EAAS,IAAMy8M,EAAc,MAAM,MAAM,EACrDrvE,EAASxkI,GAAIvK,GAAAjC,EAAM,cAAN,YAAAiC,GAAmB,MAAM,EACtCwsL,EAAkBjiL,IAAIkF,GAAA1R,EAAM,cAAN,YAAA0R,GAAmB,kBAAmB,EAAK,EACjEg9K,EAAiBliL,IAAI06K,GAAAlnL,EAAM,cAAN,YAAAknL,GAAmB,iBAAkB,EAAK,EAC/DiI,EAAc3iL,EAAI,EAAE,EAEpB4iL,GAAgBxrL,EAAS,IAAM,CACnC,MAAMgsE,GAAQu/G,EAAY,MAAM,YAAa,EAAC,KAAI,EAClD,OAAKv/G,GAGEywI,EAAc,MAAM,OAAQjhN,IAC1BA,GAAK,MAAM,YAAa,EAAC,SAASwwE,EAAK,CAC/C,EAJQywI,EAAc,KAKzB,CAAC,EAEKU,EAAqBn9M,EAAS,IAAM,CACxC,MAAMo9M,GAAwB7xB,EAAY,MAAM,YAAW,EACrD8xB,GAAmBN,EAAqB,MAAQA,EAAqB,MAAM,YAAa,EAAG,KAEjG,OAAON,EAAc,MAAM,OAAQjhN,IAAS,CAC1C,MAAM8hN,GAAa9hN,GAAK,MAAM,YAAW,EAAG,SAAS4hN,EAAqB,EACpEG,GAAgBF,GAAmB7hN,GAAK,SAAS,YAAW,EAAG,SAAS6hN,EAAgB,EAAI,GAClG,OAAIA,KAAqB,KAChBC,GAEAA,IAAcC,EAE3B,CAAG,CACH,CAAC,EAEK85B,EAAyBj7O,EAAM,QAAU+gN,EAAqB3xB,GAEpE,GAAI,CAAE,KAAAv1G,GAAM,WAAAoU,GAAY,QAASitJ,CAAgB,EAAKntJ,GAAiBktJ,EAAwBj4D,EAAS,KAAK,EAE7G/lK,GAAM,CAACkyK,EAAawxB,CAAoB,EAAG,IAAM,EAC9C,CAAE,KAAA9mI,GAAM,WAAAoU,GAAY,QAASitJ,GAAqBntJ,GAAiBktJ,EAAwBj4D,EAAS,KAAK,EAC5G,CAAC,EACD,MAAMm4D,GAA0Bv3O,EAAS,IAAMw8M,EAAiB,MAAM,SAAW,CAAC,EAC5Ej2B,GAAiBvmL,EAAS,IAAMg9M,EAAoB,MAAM,OAAS,CAAC,EACpEw6B,GAAyBx3O,EAAS,IAAM5D,EAAM,SAAW,CAACA,EAAM,qBAAuB2gN,EAAqB,QAAU,IAAI,EAC1H06B,GAAgBz3O,EAAS,IAAMurL,EAAY,MAAM,KAAI,IAAO,EAAE,EAE9DmsD,GAA4B//O,IAAQ,CACxC8oN,EAAS,MAAQ9oN,GACjB+oN,EAAqB,MAAQ,KAC7B/1B,EAAW,MAAQ,EACrB,EACMqzB,GAAsBgG,IAAwB,CAClDkzB,EAAyBlzB,GAAqB,CAC5C,UAAW,IAAMv8E,EAAkB,cAAc,sCAAsC,EACvF,QAAS,IAAMA,EAAkB,YAAY,yEAAyE,EACtH,UAAW,IAAM,CACfiwG,GAAyB,EAAK,EAC1BzhK,GAAK,QAAU,IACjBA,GAAK,MAAQ,GAEfspG,EAAS,MAAM,eAAe,EAAI,CACnC,CACL,CAAG,CACH,EAEMo4D,GAAsB3zB,IAAwB,CAClDmzB,EAAyBnzB,GAAqB,CAC5C,UAAW,IAAMv8E,EAAkB,cAAc,wBAAwB,EACzE,QAAS,IAAMA,EAAkB,YAAY,yEAAyE,EACtH,UAAW,IAAM,CACfiwG,GAAyB,EAAK,EAC9Bh3B,EAAqB,MAAQ,KAC7B/1B,EAAW,MAAQ,GACnBksD,EAAU,MAAQ,EACnB,CACL,CAAG,CACH,EAEM5qD,GAAem4B,IAAmB,CACtC1D,EAAqB,MAAQlE,EAAiB,MAAM,KAAMjB,IAAiBA,GAAa,IAAM6I,EAAc,EAC5Gz5B,EAAW,MAAQ,GACnB81B,EAAS,MAAQ,EACnB,EAEMm3B,GAA4BxzB,IAAmB,CACnD6yB,EAAqB,MAAQ7yB,GAC7BhrC,EAAgB,MAAQ,EAC1B,EAEMwS,GAAmB,IAAM,CAC7BxS,EAAgB,MAAQ,GACxB69D,EAAqB,MAAQ,IAC/B,EAEMY,GAAqB,IAAM,CAC/BT,EAAyBH,EAAqB,MAAO,CACnD,UAAW,IAAMxvG,EAAkB,cAAc,uBAAuB,EACxE,QAAS,IAAMA,EAAkB,YAAY,yEAAyE,EACtH,UAAW,IAAM,CACfmkD,IACD,CACL,CAAG,CACH,snIC/KA,MAAMxvL,EAAQgzD,EAsCR47E,EAAWhrI,EAAS,IAAM5D,EAAM,QAAQ,EACxCukH,EAAU3gH,EAAS,IAAMgrI,EAAS,MAAM,SAAW,CAAC,EACpD5D,EAAWpnI,EAAS,IAAM5D,EAAM,QAAQ,EACxC6R,EAAOsiD,sqCCzCb,MAAMk3E,EAAoB3jD,GAAoB,EAExC1nF,EAAQgzD,EAcR6N,EAAW15D,GAAS,CAAE,GAJP,CACnB,QAAS,EACX,EAE6C,QAASnH,EAAM,OAAO,CAAE,EAC/D07O,EAAW,IAAM,CACrB,UAAU,UAAU,UAAU76K,EAAS,OAAO,EAC9CwqE,EAAkB,cAAc,aAAa,CAC/C,6dCzBeswG,IAAA,2wECqBf,KAAM,CAAE,UAAW1sD,EAAuB,OAAQ8rD,CAA0B,EAAGp8B,GAA8B,KAAM,EAAI,EACjH,CAAE,UAAW/vB,EAAuB,OAAQosD,CAA0B,EAAG/7B,GAA8B,KAAM,EAAI,EACjH,CAAE,UAAW28B,EAAuB,OAAQzwG,CAAwB,EAAGo0E,GAA8B,KAAM,EAAI,EAC/G,CAAE,UAAWs8B,EAAqB,OAAQC,CAAsB,EAAG37B,IAAuB,EAC1F,CAAE,UAAW47B,EAAkB,OAAQC,CAAmB,EAAGz4J,IAAoB,EACjF,CAAE,UAAW04J,EAAuB,OAAQC,CAAoB,EAAG98B,GAAsB,KAAM,EAAI,EAEnGp/M,EAAQgzD,EA+Cd,GAAI,CAAE,UAAAqqB,EAAW,KAAM+iI,GAAqBhC,IAA2Bp+M,EAAM,KAAMA,EAAM,SAAS,EAElG,MAAMqrI,EAAoB3jD,GAAoB,EACxC24H,EAAgBz8M,EAAS,IAAOy5E,EAAU,MAAQ,CAAA,EAAK+iI,EAAiB,KAAM,EAC9E4H,EAAiBpkN,EAAS,IAAM,QAAA,QAAA3B,GAAAm+M,EAAiB,QAAjB,YAAAn+M,GAAwB,KAAM,KAAI,EAClE+uI,EAASxkI,IAAIvK,GAAAjC,EAAM,cAAN,YAAAiC,GAAmB,SAAU,CAAC,EAC3CwsL,EAAkBjiL,IAAIkF,GAAA1R,EAAM,cAAN,YAAA0R,GAAmB,kBAAmB,EAAK,EACjEg9K,EAAiBliL,IAAI06K,GAAAlnL,EAAM,cAAN,YAAAknL,GAAmB,iBAAkB,EAAK,EAC/Dz7C,EAAoBrsI,IAAS,CACjC,MAAMmV,GAAO,CAAE,eAAgB8rM,EAAc,MAAM,GAAI,GAAIjhN,GAAK,IAChE+rI,EAAuB52H,GAAM,CAC3B,UAAW,IAAM,CACf82H,EAAkB,cAAc,eAAe,CAChD,EACD,QAAS,IAAMA,EAAkB,YAAY,yEAAyE,CAC1H,CAAG,CACH,EACM2xC,EAAkBxwK,EAAI,EAAK,EAC3B63M,EAAW73M,EAAI,EAAK,EACpB+hL,EAAa/hL,EAAI,EAAK,EACtB83M,EAAuB93M,EAAI,IAAI,EAC/BiuO,EAAYjuO,EAAI,EAAK,EACrB2vO,EAAiB3vO,EAAI,EAAK,EAC1B4vO,GAAyB5vO,EAAI,IAAI,EACjC6vO,EAAoBz4O,EAAS,IAC7By8M,EAAc,MAAM,QAAU,EAAU,GACxCA,EAAc,MAAM,aAAe,CAExC,EAEKm7B,EAA2B,IAAM,CACrCx+D,EAAgB,MAAQ,EAC1B,EACMwS,GAAmB,IAAM,CAC7BxS,EAAgB,MAAQ,EAC1B,EACM09D,GAAc,IAAM,CACxBD,EAAU,MAAQ,CAACA,EAAU,KAC/B,EAEMgB,EAAqB,IAAM,CAC/BT,EAAyBhzB,EAAe,MAAO,CAC7C,UAAW,IAAM38E,EAAkB,cAAc,wBAAwB,EACzE,QAAS,IAAMA,EAAkB,YAAY,yEAAyE,EACtH,UAAW,IAAM,CACfmkD,KACA,OAAO,SAAS,KAAO,iBACxB,CACL,CAAG,CACH,EAEMK,GAAc,IAAM,CACxBy0B,EAAqB,MAAQjE,EAAc,MAC3C9xB,EAAW,MAAQ,GACnB81B,EAAS,MAAQ,EACnB,EAEMi3B,GAA4B//O,IAAQ,CACxC8oN,EAAS,MAAQ9oN,GACjB+oN,EAAqB,MAAQ,KAC7B/1B,EAAW,MAAQ,EACrB,EAEMgtD,GAAsB3zB,IAAwB,CAClDmzB,EAAyBnzB,GAAqB,CAC5C,UAAW,IAAMv8E,EAAkB,cAAc,wBAAwB,EACzE,QAAS,IAAMA,EAAkB,YAAY,yEAAyE,EACtH,UAAW,IAAM,CACfiwG,GAAyB,EAAK,EAC9Bh3B,EAAqB,MAAQ,KAC7B/1B,EAAW,MAAQ,GACnBksD,EAAU,MAAQ,EACnB,CACL,CAAG,CACH,EACM1tD,GAAuBC,IAAe,CAC1C,OAAQA,GAAU,CAChB,IAAK,SAAU,CACb6C,KACA,KACD,CACD,IAAK,SAAU,CACb2rD,IACA,KACD,CACF,CACH,EAEMvvG,GAAiBz/H,EAAI,CAAA,CAAE,EAE7B,SAASkgI,GAAaP,GAAQ,CAC5BF,GAAe,MAAQ,CACrB,GAAGA,GAAe,MAClB,CAACE,EAAM,GAAIF,GAAe,MAAME,EAAM,GAAK,GAAK,CACpD,CACA,CACA,SAASQ,GAAyBvtI,GAAM,CACtC,MAAMmV,GAAO,CAAE,eAAgB8rM,EAAc,MAAM,GAAI,UAAWjhN,GAAK,UAAW,SAAUA,GAAK,QAAQ,EACzG88O,EAAmB3nO,GAAM,CACvB,UAAW,IAAM,CACfq4H,IACD,EACD,QAAS,IAAM,CACbF,GAAattI,GAAK,EAAE,EACpBytI,IACD,CACL,CAAG,CACH,CACA,SAASD,IAAkC,CACzCvB,EAAkB,cAAc,oBAAoB,CACtD,CAEA,SAASwB,IAAgC,CACvCxB,EAAkB,YAAY,wFAAwF,CACxH,CAEA,MAAMixG,GAAa,IAAM,CACvB7B,EAAU,MAAQ,EACpB,EACM8B,GAAchhP,IAAQ,CAC1B4gP,EAAe,MAAQ5gP,GACvB,MAAMihP,GAAY,OAAO,SAAS,KAClCJ,GAAuB,MAAQI,EACjC,EAEA,SAASC,IAAe,CACtB,MAAM76K,GAAM,OAAO,SAAS,KAEtB86K,GAAgB,GADL96K,GAAI,UAAU,EAAGA,GAAI,YAAY,GAAG,EAAI,CAAC,CACzB,WAAW5hE,EAAM,IAAI,GACtD,OAAO,KAAK08O,GAAe,QAAQ,CACrC,CAEA,SAAS7wG,IAA4B,CACnCR,EAAkB,cAAc,uCAAuC,CACzE,CAEA,SAASS,IAA0B,CACjCT,EAAkB,YAAY,gFAAgF,CAChH,CACA,SAASsxG,IAAqB,CAC5Bb,EAAqB97O,EAAM,KAAM,CAC/B,UAAW,IAAM,CACf6rI,IACD,EACD,QAAS,IAAM,CACbC,IACD,CACL,CAAG,CACH,CACA,MAAM8wG,GAAmBx9O,IAAS,CAChC,MAAMmV,GAAO,CAAE,UAAWnV,GAAK,UAAW,SAAUA,GAAK,UACzD48O,EAAkBznO,GAAM,CACtB,UAAW,IAAM,CACf82H,EAAkB,cAAc,mCAAmC,CACpE,EACD,QAAS,IAAMA,EAAkB,YAAY,4EAA4E,CAC7H,CAAG,CACH,EAEMsvG,GAAqBhpO,IAAU,CAC7BA,GAAM,OAAO,QAAQ,gBAAgB,IAAM,OAC/C8oO,EAAU,MAAQ,GAEtB,EAEA,OAAAh7N,GAAU,IAAM,CACd,OAAO,iBAAiB,QAASk7N,EAAiB,CACpD,CAAC,EAEDj7N,GAAgB,IAAM,CACpB,OAAO,oBAAoB,QAASi7N,EAAiB,CACvD,CAAC,+5MCjPD,MAAM36O,EAAQgzD,EAYR,CAAE,QAAA6G,EAAS,MAAA6nH,CAAO,EAAG3uH,GAAY/yD,EAAM,IAAI,maCd1C,SAAS68O,IAAqC74O,EAAS,CAC5D,OAAO89E,GAAY,CACjB,GAAI99E,GAAW,CAAA,EACf,WAAauQ,GAASu6D,GAAY,KAAK,wBAAyBv6D,CAAI,CACxE,CAAG,CACH,2VCEA,MAAMvU,EAAQgzD,EAORqyB,EAAe,CACnB,UAAW,KACX,SAAU,KACV,MAAO,KACP,MAAO,EACT,EAEMg6F,EAAQ7yK,EAAI,IAAI,EAEhB6pM,EAAc,IAAM,CACxBh3B,EAAM,MAAM,OACd,EAEMx+G,EAAW15D,GAAS,CAAE,GAAGk+E,EAAc,GAAGrlF,EAAM,cAAc,CAAE,EAEhEi8I,EAAY/D,GAChB,CACE,UAAW,CACT,SAAU5kG,GAAQ,YAAY,6BAA8BinG,EAAQ,EACpE,UAAWjnG,GAAQ,YAAY,wDAAyD63D,GAAU,EAAE,CAAC,CACtG,EACD,SAAU,CACR,SAAU73D,GAAQ,YAAY,2BAA4BinG,EAAQ,EAClE,UAAWjnG,GAAQ,YAAY,wDAAyD63D,GAAU,EAAE,CAAC,CACtG,EACD,MAAO,CACL,SAAU73D,GAAQ,YAAY,iCAAkCinG,EAAQ,EACxE,MAAOjnG,GAAQ,YAAY,sCAAuC4mG,EAAK,CACxE,EACD,MAAO,CAAE,OAAQa,GAAO,EAAI,CAAG,CAChC,EACDl6E,CACF,EAEMwqE,EAAoB3jD,GAAoB,EAExC,CAAE,OAAQo1J,EAAmC,UAAAz/J,CAAW,EAAGw/J,IAAoC,EAErG,eAAeE,GAAgB,CAC7B,GAAI,MAAM9gG,EAAU,MAAM,YAAa,CACrC,IAAI1nI,EAAO,CAAE,GAAGssD,GAChBi8K,EAAkCvoO,EAAM,CACtC,UAAWqsK,EACX,QAASC,EACT,UAAW,IAAM,CACfw1B,GACD,CACP,CAAK,CACF,CACH,CAEA,SAASz1B,GAAoB,CAC3B3kC,EAAU,MAAM,SAChB5Q,EAAkB,cAAc,4BAA6B,CAC3D,SAAU,yBACV,QAAS,+CACT,WAAY,QAChB,CAAG,CACH,CAEA,SAASw1C,GAAkB,CACzBx1C,EAAkB,YAAY,gDAAgD,CAChF,CAEA,MAAM9sH,EAAQ,IAAM,CAClB09H,EAAU,MAAM,SAChBp7E,EAAS,UAAY,KACrBA,EAAS,SAAW,KACpBA,EAAS,MAAQ,KACjBA,EAAS,MAAQ,EACnB,2yFC/DA,MAAMm8K,EAAc,IAAI,OAAO,ymECnB/B,MAAMh9O,EAAQgzD,EAYRuxD,EAAU3gH,EAAS,IAAM5D,EAAM,kBAAoB,CAAC,EACpD25D,EAAQ/1D,EAAS,IAAO2gH,EAAQ,MAAQ,OAAS,SAASvkH,EAAM,eAAe,IAAIA,EAAM,kBAAoB,EAAI,OAAS,OAAO,EAAG,ykBCb1I,MAAMA,EAAQgzD,EAOR,CAAE,KAAMsvB,GAASC,KAEjB+pD,EAAkB1oI,EAAS,IAAM,OAAA,QAAA3B,EAAAqgF,EAAK,QAAL,YAAArgF,EAAY,kBAAmB,EAAC,6JCbhEsyD,IAAW,CAAC,YAAY,YAAqB,QAAW,aAAC,gDAEu+ZC,IAAAC,EAAA,OAAA,CACjia,EAAA,yjaACAC,IAAA,qBACEC,EAAA,q7DCCR,MAAM30D,EAAQgzD,EAeRx8C,EAAQ29C,EAER8oL,EAAgBr5O,EAAS,IAAO,OAAA,OACpC,SAAU5D,EAAM,SAAS,SACzB,SAAUA,EAAM,SAAS,SACzB,aAAaiC,EAAAjC,EAAM,SAAS,cAAf,YAAAiC,EAA4B,UAC3C,EAAE,EACIi7O,EAAiB1wO,EAAI,IAAI,EACzB2wO,EAAYh2O,GAAS,CAAA,CAAE,EACvBi2O,EAAkB5wO,EAAI,IAAI,EAC1B6wO,EAAa7wO,EAAI,EAAE,EACnB8wO,EAAc9wO,EAAI,EAAK,EACvB+wO,EAAqB/wO,EAAI,EAAK,EAE9BgxO,EAAgB,CAAC7rO,EAAO8rO,IAAoB,WAChD9rO,EAAM,eAAc,EACpB,MAAM+rO,EAAcD,EACpB,IAAIE,EAAe,KACfT,EAAe,MACjBS,GAAe17O,EAAAi7O,GAAA,YAAAA,EAAgB,QAAhB,YAAAj7O,EAAuB,WAAWy7O,GAEjDC,GAAejsO,EAAAurO,GAAA,YAAAA,EAAe,QAAf,YAAAvrO,EAAsB,SAASgsO,GAG5CC,GAAA,MAAAA,EAAc,YAChBR,EAAU,KAAKQ,CAAY,EAI7B,MAAMhzL,GAAcu8H,EAAAy2D,GAAA,YAAAA,EAAc,aAAd,YAAAz2D,EAA0B,OAAQ02D,GAAc,CAClE,GAAIA,GAAA,MAAAA,EAAW,WAAY,MAAO,EACtC,GAEMT,EAAU,CAAC,EAAE,KAAK,YAAW,IAAO,YAAcA,EAAU,CAAC,EAAE,KAAK,YAAW,IAAO,WACxFI,EAAmB,MAAQ,GAE3BA,EAAmB,MAAQ,IAGzB5yL,GAAA,YAAAA,EAAa,UAAW,GAAK,CAAC4yL,EAAmB,MACnDD,EAAY,MAAQ,GAEpBA,EAAY,MAAQ,GAEtBO,EAAgBF,CAAY,CAC9B,EAEMG,EAAUnsO,GAAU,CACxBA,EAAM,eAAc,EACpBwrO,EAAU,IAAG,EACb,MAAMY,EAAgBZ,EAAUA,EAAU,OAAS,CAAC,EAChDY,EACFF,EAAgBE,CAAa,GAE7Bb,EAAe,MAAQ,KACvBE,EAAgB,MAAQ,MAI1BE,EAAY,MAAQ,EACtB,EAEMU,EAAW,IAAM,CACrBxnO,EAAM,SAAU6mO,EAAW,KAAK,CAClC,EAEMloN,EAASxjB,GAAU,CACvBA,EAAM,eAAc,EACpB6E,EAAM,OAAO,CACf,EAEMqnO,EAAmBjpN,GAAY,OACnC,GAAIA,GAAA,MAAAA,EAAS,WACXsoN,EAAe,MAAQtoN,EACvBwoN,EAAgB,OAAQn7O,EAAAi7O,GAAA,YAAAA,EAAgB,QAAhB,YAAAj7O,EAAuB,SAE/C,QAAQ2yB,EAAQ,OAAM,CACpB,IAAK,QACH,OAAO,SAAS,KAAOA,EAAQ,IAC/B,MACF,IAAK,SACH,OAAO,KAAKA,EAAQ,GAAG,EACvB,MACF,QACE,OAAO,SAAS,KAAOA,EAAQ,GAClC,CAEL,EAEMqpN,EAAWC,GACXA,GAAA,MAAAA,EAAY,WAAmB,GAE5Bf,EAAU,IAAKgB,GAAaA,EAAS,IAAI,EAAE,KAAK,GAAG,koOC5BtDC,GAAwB,IACxBC,GAAwB,IACxBC,GAAwB,iQA5E9B,MAAMt+O,EAAQgzD,EAwBd,GAAI,CAAE,KAAA+xH,EAAM,KAAA0D,EAAM,KAAAp6F,CAAM,EAAGD,GAAgB,EACvCmwJ,EAEJ,MAAMC,EAAiBhyO,EAAI,EAAK,EAC1BiyO,EAAwBjyO,EAAI,IAAI,EAChCkyO,EAA8BlyO,EAAI,IAAI,EACtCmyO,EAAyBnyO,EAAI,IAAI,EACjCoyO,EAAYpyO,EAAI,EAAK,EACrBqyO,EAAgBryO,EAAI,EAAK,EACzB6wO,EAAa7wO,EAAI,IAAI,EACrBsyO,EAAkBtyO,EAAI,EAAK,EAC3BuyO,EAAcvyO,EAAI,IAAI,EACtBwyO,EAAgBxyO,EAAI,IAAI,EACxByyO,EAAqBzyO,EAAI,IAAI,EAC7B8wO,EAAc9wO,EAAI,EAAI,EAE5ByQ,GAAM+hO,EAAe,SAAY,CAC3BA,EAAc,OAASF,EAAgB,QACzCA,EAAgB,MAAQ,GACxBC,EAAY,MAAQ,KAExB,CAAC,EAED,MAAMG,EAAqCt7O,EAAS,IAC3C66O,EAAsB,QAAU,MAAQA,EAAsB,MAAM,kBAC5E,EAEKU,EAAev7O,EAAS,IACxB5D,EAAM,gBACD,CACL,CAAE,GAAGA,EAAM,SAAS,SAAU,mBAAoB,GAAM,IAAK,UAAY,EACzE,CAAE,GAAGA,EAAM,SAAS,MAAO,mBAAoB,GAAO,IAAK,OAAS,EACpE,CAAE,GAAGA,EAAM,SAAS,SAAU,mBAAoB,GAAO,IAAK,UAAY,EAC1E,CAAE,GAAGA,EAAM,SAAS,QAAS,mBAAoB,GAAO,IAAK,SAAW,EACxE,CAAE,GAAGA,EAAM,SAAS,UAAW,mBAAoB,GAAO,IAAK,WAAa,EAC5E,CAAE,GAAGA,EAAM,SAAS,UAAW,mBAAoB,GAAO,IAAK,WAAa,CAClF,EAGS,CAAC,CAAE,GAAGA,EAAM,SAAS,QAAS,mBAAoB,GAAO,IAAK,SAAS,CAAE,CACjF,EAEKo/O,EAAiBx7O,EAAS,KACvB,CACL,SAAU5D,EAAM,SAChB,SAAUA,EAAM,SAChB,YAAaA,EAAM,WACvB,EACC,EAKD,IAAIq/O,EAAyBC,EAE7B,MAAMC,EAAgBp4O,GAAS,CAAE,WAAYqF,EAAI,CAAA,CAAE,EAAG,aAAcA,EAAI,EAAE,CAAC,CAAE,EAE7E,SAASgzO,EAAiBpgP,GAAM,CAC9BmgP,EAAc,WAAangP,GAAK,YAAc,KAC9CmgP,EAAc,aAAengP,GAAK,WAAa,IACjD,CAEA,SAASqgP,EAA4BrgP,GAAM,CACzC,aAAakgP,CAAuB,EACpCD,EAA0B,WAAW,IAAM,CACzCb,EAAe,MAAQ,GACvBkB,GAAoBtgP,EAAI,CACzB,EAAEk/O,EAAqB,CAC1B,CAEA,SAASqB,GAA8B,CACrC,aAAaN,CAAuB,CACtC,CAEA,SAASO,GAA2B,CAClC,aAAaN,CAAuB,CACtC,CAEA,SAASO,GAA2B,CAClC,aAAaR,CAAuB,EACpCC,EAA0B,WAAW,IAAMQ,GAAe,EAAEzB,EAAqB,CACnF,CAEA,SAASqB,GAAoBtgP,GAAM,CACjCq/O,EAAsB,MAAQr/O,GAC1B8/O,EAAmC,MACrCa,EAAsB3gP,GAAK,WAAW,CAAC,CAAC,EAExC2gP,EAAsB3gP,EAAI,CAE9B,CAEA,SAAS2gP,EAAsB3gP,GAAM,CACnCogP,EAAiBpgP,EAAI,EACrBs/O,EAA4B,MAAQt/O,GAChC,CAAC8/O,EAAmC,QAAS9/O,IAAA,MAAAA,GAAM,YACrD4gP,EAAiB5gP,GAAK,WAAW,CAAC,CAAC,EAEnCu/O,EAAuB,MAAQ,IAEnC,CAEA,SAASqB,EAAiB5gP,GAAM,CAC1Bq/O,EAAsB,MAAM,MAAQ,YAAcA,EAAsB,MAAM,MAAQ,WACxFe,EAAiBpgP,EAAI,EACrBk+O,EAAY,MAAQ,IACX4B,EAAmC,OAC5CM,EAAiBd,EAA4B,KAAK,EAClDpB,EAAY,MAAQ,KAEpBkC,EAAiBpgP,EAAI,EACrBk+O,EAAY,MAAQ,IAEtBqB,EAAuB,MAAQv/O,EACjC,CAEA,SAAS6gP,GAAqB7gP,GAAM,CAClC,OAAOq/O,EAAsB,QAAU,MAAQA,EAAsB,MAAM,OAASr/O,GAAK,IAC3F,CAEA,SAAS8gP,GAAsB9gP,GAAM,CACnC,OAAOs/O,EAA4B,QAAU,MAAQA,EAA4B,MAAM,MAAQt/O,GAAK,IACtG,CAEA,SAAS+gP,EAAiB/gP,GAAM,CAC9B,OAAOu/O,EAAuB,OAAS,MAAQA,EAAuB,MAAM,MAAQv/O,GAAK,IAC3F,CAEA,SAAS0gP,IAAgB,CACvBtB,EAAe,MAAQ,GACvBC,EAAsB,MAAQ,KAC9BC,EAA4B,MAAQ,KACpCC,EAAuB,MAAQ,IACjC,CAGA,MAAMyB,GAAoB5zO,EAAI,EAAK,EACnC,IAAI6zO,GAA4BC,GAEhC,SAASC,IAA8B,CACrC,GAAIx7D,EAAK,OAAS0D,EAAK,MAAO,MAAO,GACjC+3D,GAAe,OACjBJ,GAAkB,MAAQ,GAC1BtwO,GAAS,IAAO0wO,GAAe,MAAQ,EAAM,IAE7C,aAAaF,EAA0B,EACvCD,GAA6B,WAAW,IAAOD,GAAkB,MAAQ,GAAOhC,EAAqB,EAEzG,CAEA,SAASqC,IAA8B,CACrC,GAAI17D,EAAK,OAAS0D,EAAK,MAAO,MAAO,GACrC,aAAa43D,EAA0B,EACvCC,GAA6B,WAAW,IAAOF,GAAkB,MAAQ,GAAQ/B,EAAqB,CACxG,CAGA,MAAMmC,GAAiBh0O,EAAI,EAAK,EAChC,IAAIk0O,GAAyBC,GAE7B,SAASC,IAA2B,CAC9BR,GAAkB,OACpBI,GAAe,MAAQ,GACvB1wO,GAAS,IAAOswO,GAAkB,MAAQ,EAAM,IAEhD,aAAaO,EAAuB,EACpCD,GAA0B,WAAW,IAAOF,GAAe,MAAQ,GAAOpC,EAAqB,EAEnG,CAEA,SAASyC,IAA2B,CAClC,aAAaH,EAAuB,EACpCC,GAA0B,WAAW,IAAOH,GAAe,MAAQ,GAAQnC,EAAqB,CAClG,CAEA,MAAMyC,GAAsBl9O,EAAS,IAAM46O,EAAe,OAASgC,GAAe,OAASJ,GAAkB,KAAK,EAE5GW,GAAgB,CAACpvO,GAAOqvO,GAAkB,KAAU,CAExD,GADArvO,IAAA,MAAAA,GAAO,iBACH08E,EAAK,OAAS2yJ,GAChB,cAAO,SAAWlzJ,GACX,GAET8wJ,EAAU,MAAQ,CAACA,EAAU,MAC7BC,EAAc,MAAQmC,EACxB,EAEMC,GAAY,IAAM,CACtBrC,EAAU,MAAQ,CAACA,EAAU,MACzBC,EAAc,QAChBA,EAAc,MAAQ,CAACA,EAAc,MAEzC,EACMqC,GAAgB,CAACnnM,GAAc,OAAS,CAC5C,IAAIonM,GAAgB9D,EAAW,MAC3B,OAAOtjM,IAAgB,WACzBonM,GAAgBpnM,IAElB21F,IAAayxG,EAAa,EAC1B,OAAO,SAAW,iBAAiB,mBAAmBA,IAAiB,EAAE,CAAC,EAC5E,EACMC,GAAoB,IAAM,CAC9BtC,EAAgB,MAAQ,CAACA,EAAgB,MACzCzB,EAAW,MAAQ,KACfyB,EAAgB,OAAOhvO,GAAS,IAAMmvO,EAAmB,MAAM,aAAa,MAAK,CAAE,CACzF,EAEMhiD,GAAW,iCAAiC,KAAK,UAAU,SAAS,EAEpEokD,GAAyBz9O,EAAS,IAAM,oBAC5C,OAAK66O,EAAsB,MACvBS,EAAmC,MAC9B,IAAGj9O,GAAAw8O,EAAsB,QAAtB,YAAAx8O,GAA6B,IAAI,KAAIyP,GAAAgtO,EAA4B,QAA5B,YAAAhtO,GAAmC,IAAI,KAAIw1K,GAAAy3D,EAAuB,QAAvB,YAAAz3D,GAA8B,IAAI,GAGvH,IAAGC,GAAAs3D,EAAsB,QAAtB,YAAAt3D,GAA6B,IAAI,KAAIC,GAAAu3D,EAAuB,QAAvB,YAAAv3D,GAA8B,IAAI,GALxC,IAM3C,CAAC,EAEKk6D,GAAyB19O,EAAS,IAAM,cAC5C,OAAK66O,EAAsB,MACvBS,EAAmC,MAC9B,IAAGj9O,GAAAw8O,EAAsB,QAAtB,YAAAx8O,GAA6B,IAAI,KAAIyP,GAAAgtO,EAA4B,QAA5B,YAAAhtO,GAAmC,IAAI,IAGjFw1K,GAAAu3D,EAAsB,QAAtB,YAAAv3D,GAA6B,KALK,IAM3C,CAAC,EAGD,SAASq6D,GAA8BniP,GAAM,CAC3C,aAAam/O,CAAuB,EACpCA,EAA0B,WAAW,IAAMwB,EAAsB3gP,EAAI,EAAGk/O,EAAqB,CAC/F,CAEA,SAASkD,IAAgC,CACvC,aAAajD,CAAuB,CACtC,24RC1QA,MAAMv+O,EAAQgzD,EA+BRnhD,EAAOsiD,EAEPwjK,EAAW/zN,EAAS,IACpB5D,EAAM,OAAS,UAAkB,QACjCA,EAAM,OAAS,QAAgB,cAC5B,IACR,wvBCrCKyhP,IAAwB,IACxBC,IAA6B,+CAEnC,MAAMr2G,EAAoB3jD,GAAoB,EACxCC,EAAgB/jF,EAAS,IAAMynI,EAAkB,aAAa,EAE9Ds2G,EAAS,CAAA,EAEf,SAASC,EAAW35J,EAAc,CAChC,GAAI,CAAC05J,EAAO15J,EAAa,EAAE,EAAG,CAE5B,MAAMwE,EAAOxE,EAAa,OAAS,QAAUy5J,IAA6BD,IAC1EE,EAAO15J,EAAa,EAAE,EAAI,WAAW,IAAMD,EAAQC,CAAY,EAAGwE,CAAI,CACvE,CACH,CAEA,SAASo1J,EAAY55J,EAAc,CAC7B05J,EAAO15J,EAAa,EAAE,IACxB,aAAa05J,EAAO15J,EAAa,EAAE,CAAC,EACpC,OAAO05J,EAAO15J,EAAa,EAAE,EAEjC,CAEA,SAASD,EAAQC,EAAc,CAC7BojD,EAAkB,QAAQpjD,EAAa,EAAE,CAC3C,uwECzBA,MAAMjoF,EAAQgzD,EAgBR,CAAE,UAAA8uL,EAAW,MAAAC,CAAO,EAAGhvL,GAAY/yD,EAAM,IAAI,0pECfnD,MAAMA,EAAQgzD,EAwBRgvL,EAAsBx1O,GAAIvK,EAAAjC,EAAM,UAAN,YAAAiC,EAAe,GAAG,EAC5C4jN,EAAYjiN,EAAS,IAAMo+O,EAAoB,MAAM,OAAShiP,EAAM,eAAe,EACnF8pI,EAA6B,IAAI,OAAO,qBACxCm4G,EAAkBr+O,EAAS,IAAM,OAAA,QAAA3B,EAAA+/O,EAAoB,QAApB,YAAA//O,EAA2B,iBAAkB,CAAA,EAAE,EAEhFigP,EAAuBt+O,EAAS,IAAM,CAC1C,IAAIghN,EAAMo9B,EAAoB,MAC1B97B,EAAQ,CAAA,EACZ,OAAItB,GAAA,MAAAA,EAAK,oBAAoBsB,EAAM,KAAK,CAAE,MAAO,qBAAsB,MAAOtB,EAAI,kBAAoB,CAAA,EAClGA,GAAA,MAAAA,EAAK,QAAQsB,EAAM,KAAK,CAAE,MAAO,SAAU,MAAOtB,EAAI,MAAQ,CAAA,EAC9DA,GAAA,MAAAA,EAAK,WAAWsB,EAAM,KAAK,CAAE,MAAO,YAAa,MAAOtB,EAAI,SAAW,CAAA,EACvEA,GAAA,MAAAA,EAAK,sBAAsBsB,EAAM,KAAK,CAAE,MAAO,SAAU,MAAO,aAAa,CAAE,EAC/EtB,GAAA,MAAAA,EAAK,cAAcsB,EAAM,KAAK,CAAE,MAAO,SAAU,MAAOtB,EAAI,aAAc,KAAMn0E,GAAkB,KAAO,CAAA,EACzGm0E,GAAA,MAAAA,EAAK,iBAAiBsB,EAAM,KAAK,CAAE,MAAO,SAAU,MAAOtB,EAAI,gBAAiB,KAAMn0E,GAAkB,UAAY,CAAA,EACjHy1E,CACT,CAAC,EAED,OAAAzmM,GAAU,IAAM,CACd,OACF,CAAC,0sEC7CD,MAAMzf,EAAQgzD,EAOR,CAAE,KAAA5zD,CAAI,EAAK2zD,GAAY/yD,EAAM,IAAI,+uBCJvC,MAAMA,EAAQgzD,EAOR,CAAE,aAAAmvL,CAAY,EAAKpvL,GAAY/yD,EAAM,IAAI,EAC/C,GAAI,CAAE,KAAA+kL,CAAI,EAAK32F,KACf,MAAM0vH,EAAgBtxM,EAAI,CAAC,EACrB41O,EAAan7N,GAAW62L,EAAc,MAAQ72L,o3BCZpD,MAAMjnB,EAAQgzD,EAYR,CAAE,QAAA6G,EAAS,cAAAwoL,EAAe,YAAAC,EAAa,eAAAC,EAAgB,SAAAC,CAAQ,EAAKzvL,GAAY/yD,EAAM,IAAI,myBCZhG,MAAMA,EAAQgzD,EAYR,CAAE,KAAAu5B,EAAM,SAAAmzD,EAAU,MAAA/lF,CAAK,EAAK5G,GAAY/yD,EAAM,IAAI,EAElDyiP,EAAgB7+O,EAAS,IAAM,CAEnC,GAAI,CAAC2oF,EAAK,MAAO,MAAO,GACxB,MAAMm2J,EAAK,SAAS,cAAc,UAAU,EAC5C,OAAAA,EAAG,UAAYn2J,EAAK,MACbm2J,EAAG,WACZ,CAAC,EACKC,EAAoB/+O,EAAS,IAAM,CAGvC,GAAI,CAAC87I,EAAS,MAAO,MAAO,GAC5B,MAAMgjG,EAAK,SAAS,cAAc,UAAU,EAC5C,OAAAA,EAAG,UAAYhjG,EAAS,MACjBgjG,EAAG,WACZ,CAAC,EACKE,EAAiBh/O,EAAS,IAAM,CAEpC,MAAM8+O,EAAK,SAAS,cAAc,UAAU,EAC5C,OAAAA,EAAG,UAAY/oL,EAAM,MACd+oL,EAAG,WACZ,CAAC,qmCClCD,MAAM1iP,EAAQgzD,EAiBR,CAAE,QAAA6G,EAAS,OAAAgpL,CAAQ,EAAG9vL,GAAY/yD,EAAM,IAAI,6WCnB3C,SAAS8iP,IAAkC9+O,EAAS,CACzD,OAAO89E,GAAY,CACjB,GAAI99E,GAAW,CAAA,EACf,WAAauQ,GAASu6D,GAAY,KAAK,qBAAsBv6D,CAAI,CACrE,CAAG,CACH,wWCLA,MAAMvU,EAAQgzD,EAWR+vL,EAAWn/O,EAAS,IACjB,GAAI5D,EAAM,KAAOA,EAAM,MAAS,GAAG,GAC3C,EAEK+qB,EAAUve,EAAI,EAAK,EACzB,OAAAiT,GAAU,IAAM,CACd,WAAW,IAAOsL,EAAQ,MAAQ,GAAO,GAAG,CAC9C,CAAC,qqBCfD,MAAMlZ,EAAOsiD,EACPn0D,EAAQgzD,EAgBR91D,EAAQ0G,EAAS,CACrB,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU2U,EAAK,oBAAqB3U,CAAK,CACjD,CAAC,EAEK8lP,EAAkBp/O,EAAS,IAAM5D,EAAM,KAAK,EAE5CijP,EAAW,IAAM,CACrB,IAAIC,EAAY,EAEZhmP,EAAM,QAAU,oBAClBgmP,EAAY,EACHhmP,EAAM,QAAU,sBACzB8lP,EAAgB,MAAM,eAAe,mBAAqB,qBAC1DE,EAAY,GACHhmP,EAAM,QAAU,eACzB8lP,EAAgB,MAAM,gBAAgB,OAAO,QAAQ,SAAW,IAGlEnxO,EAAK,WAAYqxO,CAAS,CAC5B,EAEAzjO,GAAU,IAAM,CACVujO,EAAgB,MAAM,eAAe,qBAAuB,OAC9DA,EAAgB,MAAM,eAAe,mBAAqB,KAC1DA,EAAgB,MAAM,eAAe,wBAA0B,IAG7DA,EAAgB,MAAM,YAAY,iBAAiB,OAAS,IAC9DA,EAAgB,MAAM,YAAY,iBAAmB,CAAA,EACrDA,EAAgB,MAAM,YAAY,sBAAwB,GAE9D,CAAC,EAED,MAAMG,EAAYv/O,EAAS,IAAM,CAAC,CAAC1G,EAAM,KAAK,w9BC9C9C,MAAM2U,EAAOsiD,EACPn0D,EAAQgzD,EAeR91D,EAAQ0G,EAAS,CACrB,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU2U,EAAK,oBAAqB3U,CAAK,CACjD,CAAC,EAEK8lP,EAAkBp/O,EAAS,IAAM5D,EAAM,KAAK,EAE5CojP,EAAkCx/O,EAAS,IACxC1G,EAAM,MAAM,qBAAuB,sBAC3C,EAED+f,GAAMmmO,EAAkC7nP,GAAQ,CAC1CA,IACJ2B,EAAM,MAAM,wBAA0B,GACxC,CAAC,EAED,MAAM++I,EAAY/D,GAChB,CACE,mBAAoB,CAClB,SAAU5kG,GAAQ,YAChB,6BACAsnG,GAAW,IAAM19I,EAAM,MAAM,oBAAsB,IAAI,CACxD,CACF,EACD,wBAAyB,CACvB,WAAYo2C,GAAQ,YAAY,sDAAuDsnG,GAAWwoG,CAA+B,CAAC,EAClI,UAAW9vM,GAAQ,YAAY,uDAAwD63D,GAAU,GAAG,CAAC,CACtG,CACF,EACDjuG,CACF,EAEAuiB,GAAU,IAAM,CACVujO,EAAgB,MAAM,YAAY,iBAAiB,OAAS,IAC9DA,EAAgB,MAAM,YAAY,iBAAmB,CAAA,EACrDA,EAAgB,MAAM,YAAY,sBAAwB,GAE9D,CAAC,EAED,KAAM,CAAE,KAAAj+D,CAAI,EAAK32F,q8CCvDjB,MAAMv8E,EAAOsiD,EACPn0D,EAAQgzD,EAeR91D,EAAQ0G,EAAS,CACrB,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU2U,EAAK,oBAAqB3U,CAAK,CACjD,CAAC,EAGKmmP,EAAWz/O,EAAS,IAAO5D,EAAM,MAAM,iBAAmB,oBAAsB,EAAI,CAAE,EAEtFsjP,EAAgC1/O,EAAS,IACtC1G,EAAM,MAAM,iBAAiB,SAAS,sBAAsB,CACpE,EAED+f,GAAMqmO,EAAgC/nP,GAAQ,CACxCA,IACJ2B,EAAM,MAAM,sBAAwB,GACtC,CAAC,EAED,MAAM++I,EAAY/D,GAChB,CACE,sBAAuB,CACrB,WAAY5kG,GAAQ,YAAY,sDAAuDsnG,GAAW0oG,CAA6B,CAAC,EAChI,UAAWhwM,GAAQ,YAAY,uDAAwD63D,GAAU,GAAG,CAAC,CACtG,CACF,EACDjuG,CACF,EAEM,CAAE,KAAA6nL,CAAI,EAAK32F,u9CC3CjB,MAAMpuF,EAAQgzD,EAYRqwL,EAAWz/O,EAAS,IAAO5D,EAAM,MAAM,iBAAmB,qBAAuBA,EAAM,MAAM,iBAAmB,qBAAuB,EAAI,CAAE,EAE7I6R,EAAOsiD,EAEPj3D,EAAQ0G,EAAS,CACrB,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU2U,EAAK,oBAAqB3U,CAAK,CACjD,CAAC,EAEKwiL,EAAiB,OAAO,KAAKnvC,EAAS,EAAE,IAAK10I,IAAS,CAAE,MAAOA,EAAK,KAAM00I,GAAU10I,CAAG,EAAE,IAAM,EAAC,EAEhG8jL,EAAkB/7K,EAAS,IACxB1G,EAAM,MAAM,qBAAuB,MAAQA,EAAM,MAAM,qBAAuB,IACtF,EACK0iL,EAAUh8K,EAAS,IAAM2sI,GAAUrzI,EAAM,MAAM,kBAAkB,CAAC,EAClE2iL,EAAaj8K,EAAS,IAAMg8K,EAAQ,MAAM,WAAa,uBAAuB,EAC9EE,EAAel8K,EAAS,IAC5Bg8K,EAAQ,MAAM,OAAS,OAAO,KAAKA,EAAQ,MAAM,MAAM,EAAE,IAAK/jL,IAAS,CAAE,MAAOA,EAAK,KAAM+jL,EAAQ,MAAM,OAAO/jL,CAAG,GAAI,EAAI,CAAE,CAC/H,EACMkkL,EAAkBn8K,EAAS,IAAMg8K,EAAQ,MAAM,gBAAkB,aAAa,EAC9EI,EAAkBp8K,EAAS,IAAMg8K,EAAQ,MAAM,eAAe,EAE9D3jC,EAAY/D,GAChB,CACE,KAAM,CACJ,SAAU5kG,GAAQ,YAAY,gCAAiCinG,EAAQ,EACvE,UAAWjnG,GAAQ,YAAY,wDAAyD63D,GAAU,EAAE,CAAC,CACtG,EACD,mBAAoB,CAAE,SAAU73D,GAAQ,YAAY,2BAA4BinG,EAAQ,CAAG,EAC3F,SAAU,CACR,SAAUjnG,GAAQ,YAAY,2BAA4BinG,EAAQ,EAClE,UAAWjnG,GAAQ,YAAY,wDAAyD63D,GAAU,EAAE,CAAC,CACtG,EACD,SAAU,CACR,UAAW73D,GAAQ,YAAY,wDAAyD63D,GAAU,EAAE,CAAC,CACtG,EACD,KAAM,CACJ,SAAU73D,GAAQ,YAAY,uBAAwBinG,EAAQ,EAC9D,UAAWjnG,GAAQ,YAAY,wDAAyD63D,GAAU,EAAE,CAAC,CACtG,EACD,MAAO,CACL,SAAU73D,GAAQ,YAChB,IAAOqsI,EAAgB,MAAQ,mBAAmBE,EAAW,MAAM,YAAa,CAAA,IAAM,kBAAkBA,EAAW,MAAM,YAAW,CAAE,IACtItlC,EACD,CACF,EACD,IAAK,CACH,SAAUjnG,GAAQ,YAAY,IAAM,kBAAkBysI,EAAgB,MAAM,YAAW,CAAE,IAAKxlC,EAAQ,EACtG,gBAAiBjnG,GAAQ,YACvB,IAAM,wBAAwBysI,EAAgB,MAAM,YAAW,CAAE,IAChE7iL,GAAU,CAACo2C,GAAQ,IAAIp2C,CAAK,GAAK,CAAC8iL,EAAgB,OAASA,EAAgB,MAAM,KAAK9iL,CAAK,CAC7F,CACF,CACF,EACDA,CACF,EAEA+f,GACE,IAAM/f,EAAM,MAAM,mBAClB,CAACoP,EAAQi3O,IAAW,CACdj3O,IAAWi3O,IAEbrmP,EAAM,MAAM,MAAQ,GAGpB++I,EAAU,MAAM,SAEnB,CACH,EAEA,KAAM,CAAE,KAAA8oC,CAAI,EAAK32F,qiGC9EjB,MAAMpuF,EAAQgzD,EAWRnhD,EAAOsiD,EAEPj3D,EAAQ0G,EAAS,CACrB,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU2U,EAAK,oBAAqB3U,CAAK,CACjD,CAAC,EAEKsmP,EAAW5/O,EAAS,IACjB5D,EAAM,MAAM,kBAAoB,UACxC,EAEKyjP,EAA+B7/O,EAAS,IACrC5D,EAAM,MAAM,kBAAoB,YAAcA,EAAM,MAAM,gBAAgB,SAAS,YAAY,CACvG,EAEK0jP,EAAc9/O,EAAS,IACpB5D,EAAM,MAAM,kBAAoB,YACxC,EAEK2jP,EAAwB//O,EAAS,IAC9B1G,EAAM,MAAM,SAAS,SAAS,yBAAyB,CAC/D,EAED+f,GAAM0mO,EAAwBpoP,GAAQ,CAChCA,IACJ2B,EAAM,MAAM,cAAgB,GAC9B,CAAC,EAEDuiB,GAAU,IAAM,CACTgkO,EAA6B,QAChCvmP,EAAM,MAAM,SAAW,GACvBA,EAAM,MAAM,cAAgB,GAC5BA,EAAM,MAAM,OAAS,IAGlBsmP,EAAS,QACZtmP,EAAM,MAAM,UAAY,IAGrBymP,EAAsB,QACzBzmP,EAAM,MAAM,cAAgB,IAGzBA,EAAM,MAAM,OAAO,QAAQ,WAC9BA,EAAM,MAAM,oBAAsB,MAGhCwmP,EAAY,QACdxmP,EAAM,MAAM,oBAAsB,GAEtC,CAAC,EAED,MAAM0mP,EAAiBhgP,EAAS,KACvB,CACL,GAAG1G,EAAM,MACT,2BAA4B0G,EAAS,IAAM,OAAO,OAAO1G,EAAM,MAAM,MAAM,EAAE,KAAMkC,GAASA,EAAK,QAAQ,CAAC,CAC9G,EACC,EAEK68I,EAAY/D,GAChB,CACE,UAAW,CAAE,WAAY5kG,GAAQ,YAAY,uCAAwCsnG,GAAW4oG,CAAQ,CAAC,CAAG,EAC5G,QAAS,CAAE,SAAUlwM,GAAQ,YAAY,qCAAsCinG,EAAQ,CAAG,EAC1F,MAAO,CAAE,SAAUjnG,GAAQ,YAAY,+EAAgFinG,EAAQ,CAAG,EAClI,cAAe,CACb,WAAYjnG,GAAQ,YAAY,uCAAwCsnG,GAAW+oG,CAAqB,CAAC,EACzG,UAAWrwM,GAAQ,YAAY,uDAAwD63D,GAAU,KAAK,CAAC,CACxG,EACD,YAAa,CACX,SAAU73D,GAAQ,YAAY,gDAAiDinG,EAAQ,EACvF,UAAWjnG,GAAQ,YAAY,uDAAwD63D,GAAU,KAAK,CAAC,CACxG,EACD,OAAQ,CACN,WAAY73D,GAAQ,YAAY,qCAAsCsnG,GAAW6oG,CAA4B,CAAC,EAC9G,UAAWnwM,GAAQ,YAAY,uDAAwD63D,GAAU,KAAK,CAAC,CACxG,EACD,OAAQ,CACN,QAAS,CACP,KAAM,CACJ,WAAY73D,GAAQ,YAClB,8BACAsnG,GAAW,IAAM19I,EAAM,MAAM,OAAO,QAAQ,QAAQ,CACrD,EACD,UAAWo2C,GAAQ,YAAY,uDAAwD63D,GAAU,GAAG,CAAC,EACrG,aAAc73D,GAAQ,YACpB,oCACAA,GAAQ,MACN,2KACD,CACF,CACF,CACF,EACD,UAAW,CACT,KAAM,CACJ,WAAYA,GAAQ,YAClB,iCACAsnG,GAAW,IAAM19I,EAAM,MAAM,OAAO,UAAU,QAAQ,CACvD,EACD,UAAWo2C,GAAQ,YAAY,uDAAwD63D,GAAU,GAAG,CAAC,CACtG,CACF,EACD,SAAU,CACR,KAAM,CACJ,WAAY73D,GAAQ,YAClB,8BACAsnG,GAAW,IAAM19I,EAAM,MAAM,OAAO,SAAS,QAAQ,CACtD,EACD,UAAWo2C,GAAQ,YAAY,uDAAwD63D,GAAU,GAAG,CAAC,CACtG,CACF,EACD,UAAW,CACT,KAAM,CACJ,WAAY73D,GAAQ,YAClB,iCACAsnG,GAAW,IAAM19I,EAAM,MAAM,OAAO,UAAU,QAAQ,CACvD,EACD,UAAWo2C,GAAQ,YAAY,uDAAwD63D,GAAU,GAAG,CAAC,CACtG,CACF,EACD,MAAO,CACL,QAAS,CACP,WAAY73D,GAAQ,YAClB,sCACAsnG,GAAW,IAAM19I,EAAM,MAAM,OAAO,MAAM,QAAQ,CACnD,EACD,UAAWo2C,GAAQ,YAAY,uDAAwD63D,GAAU,EAAE,CAAC,CACrG,EACD,KAAM,CACJ,WAAY73D,GAAQ,YAClB,6CACAsnG,GAAW,IAAM19I,EAAM,MAAM,OAAO,MAAM,QAAQ,CACnD,EACD,UAAWo2C,GAAQ,YAAY,uDAAwD63D,GAAU,GAAG,CAAC,CACtG,CACF,CACF,EACD,2BAA4B,CAC1B,SAAU73D,GAAQ,YAAY,6CAA+C/3C,GAAQA,IAAQ,EAAI,CAClG,EACD,oBAAqB,CACnB,WAAY+3C,GAAQ,YAClB,2BACAsnG,GAAW,IAAM19I,EAAM,MAAM,OAAO,QAAQ,UAAY,CAACwmP,EAAY,KAAK,CAC3E,CACF,CACF,EACDE,CACF,EAEM9sC,EAAY,CAChB,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,KAAK,EACb,CAAC,KAAM,IAAI,CACb,EAEM+sC,EAAU,CACd,CAAC,UAAW,QAAQ,EACpB,CAAC,YAAa,WAAW,EACzB,CAAC,UAAW,SAAS,EACrB,CAAC,WAAY,UAAU,EACvB,CAAC,QAAS,OAAO,CACnB,EAEMC,EAAc,CAClB,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,KAAK,EACb,CAAC,OAAQ,MAAM,EACf,CAAC,MAAO,KAAK,CACf,EAEMC,EAAW,CACf,CACE,MAAO,0BACP,MAAO,iBACR,EACD,CACE,MAAO,gBACP,MAAO,eACR,EACD,CACE,MAAO,0BACP,MAAO,OACR,CACH,EAEM,CAAE,KAAAh/D,CAAI,EAAK32F,mkNCvMjB,MAAMpuF,EAAQgzD,EAeRnhD,EAAOsiD,EAEPj3D,EAAQ0G,EAAS,CACrB,IAAK,IAAM5D,EAAM,WACjB,IAAM9C,GAAU2U,EAAK,oBAAqB3U,CAAK,CACjD,CAAC,EAEK8mP,EAAkBpgP,EAAS,IACxB5D,EAAM,MAAM,gBAAgB,qBAAuB,MAAQA,EAAM,MAAM,gBAAgB,qBAAuB,IACtH,EAEKikP,EAAyB/mP,GACzB8mP,EAAgB,MACX1wM,GAAQ,MAAM,kCAAkC,EAAEp2C,CAAK,EAEzD,GAGHgnP,EAA+BhnP,GAC9B8mP,EAAgB,MAId,GAHe9mP,EAAM,QACJ,GAKpBinP,EAAevgP,EAAS,IACrB1G,EAAM,MAAM,KACpB,EAEK++I,EAAY/D,GAChB,CACE,UAAW,CACT,SAAU5kG,GAAQ,YAAY,6BAA8BinG,EAAQ,EACpE,UAAWjnG,GAAQ,YAAY,wDAAyD63D,GAAU,EAAE,CAAC,CACtG,EACD,SAAU,CACR,SAAU73D,GAAQ,YAAY,2BAA4BinG,EAAQ,EAClE,UAAWjnG,GAAQ,YAAY,wDAAyD63D,GAAU,EAAE,CAAC,CACtG,EACD,MAAO,CAAE,UAAW73D,GAAQ,YAAY,wDAAyD63D,GAAU,EAAE,CAAC,CAAG,EACjH,MAAO,CACL,SAAU73D,GAAQ,YAAY,iCAAkCinG,EAAQ,EACxE,MAAOjnG,GAAQ,YAAY,sCAAuC4mG,EAAK,CACxE,EACD,aAAc,CACZ,SAAU5mG,GAAQ,YAAY,qCAAsCinG,EAAQ,EAC5E,OAAQjnG,GAAQ,YAAY,gCAAiCynG,GAAOopG,CAAY,CAAC,CAClF,EACD,MAAO,CAAE,OAAQppG,GAAO,EAAI,CAAG,EAC/B,MAAO,CACL,SAAUznG,GAAQ,YAAY,+BAAgCinG,EAAQ,EACtE,WAAYjnG,GAAQ,YAAY,qCAAsC2wM,CAAqB,EAC3F,iBAAkB3wM,GAAQ,YAAY,wDAAyD4wM,CAA2B,CAC3H,CACF,EACDhnP,CACF,EAEM,CAAE,KAAA6nL,CAAI,EAAK32F,mmFCtEjB,MAAMg2J,EAAa53O,EAAI,EAAK,EAEtBk+H,EAAcl+H,EAAI,CAAC,EACnB63O,EAAe73O,EAAI,CAAC,EAEpB48K,EAAS58K,EAAI,IAAI,EAEjB83O,EAAiB1gP,EAAS,IAC1B8mI,EAAY,MAAQ25G,EAAa,MAAc,YACvC,WACb,EAEKE,EAAuB3gP,EAAS,IAAM,CAC1C,OAAQ8mI,EAAY,MAAK,CACvB,IAAK,GACH,OAAO85G,IACT,IAAK,GACH,OAAOC,IACT,IAAK,GACH,OAAOC,IACT,IAAK,GACH,OAAOC,IACT,IAAK,GACH,OAAOC,IACT,IAAK,GACH,OAAOC,GACV,CACD,MAAO,KACT,CAAC,EAEK/sC,EAAcgtC,GAAe,CACjC17D,EAAO,MAAM,gBAAgB,SAAS,CAAE,IAAK,CAAC,CAAE,EAChDi7D,EAAa,MAAQ35G,EAAY,MAC7Bo6G,IAAe,GACjB,OAAO,QAAQ,UAAU,CAAE,KAAM,EAAEp6G,EAAY,KAAO,EAAE,GAAI,EAAE,GAE9D,OAAO,QAAQ,UAAU,CAAE,KAAMo6G,GAAc,GAAI,EAAE,EACrDp6G,EAAY,MAAQo6G,EAExB,EAEArlO,GAAU,IAAM,CACd,OAAO,QAAQ,aAAa,CAAE,KAAMirH,EAAY,KAAO,EAAE,GAAI,EAAE,EAC/D,OAAO,WAAcrgH,GAAM,CACzBg6N,EAAa,MAAQ35G,EAAY,MACjCA,EAAY,MAAQrgH,EAAE,MAAM,IAChC,CACA,CAAC,EAED,MAAM06N,EAAiB59O,GAAS,CAC9B,CACE,MAAO,WACP,MAAO,oDACR,EACD,CACE,MAAO,qBACP,MAAO,qEACR,EACD,CACE,MAAO,oBACP,MAAO,sEACR,EACD,CACE,MAAO,aACP,MAAO,+CACR,CACH,CAAC,EAEK69O,EAA4B79O,GAAS,CACzC,CACE,MAAO,6BACP,MAAO,mDACR,EACD,CACE,MAAO,2BACP,MAAO,0BACR,EACD,CACE,MAAO,0BACP,MAAO,2BACR,EACD,CACE,MAAO,yBACP,MAAO,6DACR,EACD,CACE,MAAO,iCACP,MAAO,+BACR,EACD,CACE,MAAO,uBACP,MAAO,yBACR,CACH,CAAC,EAEK89O,EAA0B99O,GAAS,CACvC,CACE,MAAO,qBACP,MAAO,mBACR,EACD,CACE,MAAO,6BACP,MAAO,mDACR,EACD,CACE,MAAO,2BACP,MAAO,0BACR,EACD,CACE,MAAO,0BACP,MAAO,2BACR,EACD,CACE,MAAO,yBACP,MAAO,6DACR,EACD,CACE,MAAO,iCACP,MAAO,+BACR,EACD,CACE,MAAO,uBACP,MAAO,yBACR,CACH,CAAC,EAEKnD,EAAUJ,EAAS,IAAM,CAC7B,OAAQ8mI,EAAY,MAAK,CACvB,IAAK,GACH,OAAOq6G,EACT,IAAK,GACH,OAAOC,EACT,IAAK,GACH,OAAIryG,EAAM,MAAM,kBAAoB,qBAC3BsyG,EAAwB,OAAQv2M,GAAM,CAACA,EAAE,MAAM,SAASikG,EAAM,MAAM,eAAe,CAAC,EAEzFA,EAAM,MAAM,gBAAkBA,EAAM,MAAM,eAAe,mBACpDsyG,EAAwB,OAAQv2M,GAAM,CAACA,EAAE,MAAM,SAASikG,EAAM,MAAM,eAAe,kBAAkB,CAAC,EAExGsyG,CACV,CACD,MAAO,EACT,CAAC,EAEKtyG,EAAQnmI,EAAI,CAChB,gBAAiB,KACjB,eAAgB,CACd,mBAAoB,KACpB,wBAAyB,EAC1B,EACD,YAAa,CACX,iBAAkB,CAAE,EACpB,sBAAuB,EACxB,EACD,gBAAiB,CACf,KAAM,GACN,mBAAoB,KACpB,SAAU,GACV,SAAU,GACV,KAAM,GACN,MAAO,GACP,IAAK,EACN,EACD,gBAAiB,CACf,UAAW,GACX,QAAS,GACT,MAAO,GACP,SAAU,CAAE,EACZ,cAAe,GACf,YAAa,GACb,OAAQ,GACR,oBAAqB,GACrB,OAAQ,CACN,QAAS,CACP,SAAU,GACV,KAAM,EACP,EACD,UAAW,CACT,SAAU,GACV,KAAM,EACP,EACD,SAAU,CACR,SAAU,GACV,KAAM,EACP,EACD,UAAW,CACT,SAAU,GACV,KAAM,EACP,EACD,MAAO,CACL,SAAU,GACV,QAAS,GACT,KAAM,EACP,CACF,CACF,EACD,QAAS,CACP,UAAW,GACX,SAAU,GACV,MAAO,GACP,MAAO,GACP,aAAc,GACd,MAAO,GACP,MAAO,EACR,CACH,CAAC,EAEK04O,EAAmBthP,EAAS,CAChC,KAAM,CACJ,OAAQ8mI,EAAY,MAAK,CACvB,IAAK,GACH,OAAOiI,EAAM,MAAM,gBACrB,IAAK,GACH,OAAOA,EAAM,MAAM,eACrB,IAAK,GACH,OAAOA,EAAM,MAAM,YACrB,IAAK,GACH,OAAOA,EAAM,MAAM,gBACrB,IAAK,GACH,OAAOA,EAAM,MAAM,gBACrB,IAAK,GACH,OAAOA,EAAM,MAAM,OACtB,CACD,MAAO,EACR,EACD,IAAIz1I,EAAO,CACT,MAAMioP,EAASzlK,GAAAA,UAAUizD,EAAM,KAAK,EACpC,OAAQjI,EAAY,MAAK,CACvB,IAAK,GACHy6G,EAAO,gBAAkBjoP,EACzB,MACF,IAAK,GACHioP,EAAO,eAAiBjoP,EACxB,MACF,IAAK,GACHioP,EAAO,YAAcjoP,EACrB,MACF,IAAK,GACHioP,EAAO,gBAAkBjoP,EACzB,MACF,IAAK,GACHioP,EAAO,gBAAkBjoP,EACzB,MACF,IAAK,GACHioP,EAAO,QAAUjoP,EACjB,KACH,CACDy1I,EAAM,MAAQwyG,CACf,CACH,CAAC,EAEK/6D,EAAO59K,EAAI,IAAI,EACf44O,EAAmB,IAAM,CAC7Bt1O,GAAS,IAAM,OAAA,OAAA7N,EAAAmoL,EAAK,MAAM,cAAc,yBAAyB,IAAlD,YAAAnoL,EAAqD,QAAO,CAC7E,EACAwd,GAAU2lO,CAAgB,EAC1BnoO,GAAMytH,EAAa06G,CAAgB,EAEnC,KAAM,CAAE,OAAQC,EAAwB,UAAW39D,CAAc,EAAGo7D,IAAiC,EAErG,SAASz4D,GAAS,CAChBg7D,EAAuB1yG,EAAM,MAAO,CAClC,UAAW,IAAM,CACfyxG,EAAW,MAAQ,EACpB,EACD,QAAS,IAAM,CACb18J,GAAsB,EAAC,YAAY,yFAAyF,CAC7H,CACL,CAAG,CACH,q1CCzRA,MAAM1nF,EAAQgzD,EAYR,CAAE,MAAA4G,CAAK,EAAK7G,GAAY/yD,EAAM,IAAI,6sBCZxC,MAAMA,EAAQgzD,EAORqsH,EAAQ7yK,EAAI,IAAI,EAChB86H,EAAS96H,EAAI,EAAK,EAClB6pM,EAAc,IAAM,CACxB/uE,EAAO,MAAQ,CAACA,EAAO,KACzB,EAEMg+G,EAAW1hP,EAAS,IACpB5D,EAAM,UAAU,UAAU,SAAS,GAAG,EAAU,GAAGA,EAAM,UAAU,SAAS,cACzE,GAAGA,EAAM,UAAU,SAAS,aACpC,0xBCbD,MAAMA,EAAQgzD,EAYR,CAAE,YAAAuyL,EAAa,QAAA75D,EAAS,UAAAJ,CAAS,EAAKv4H,GAAY/yD,EAAM,IAAI,EAElE,IAAI62M,EAAY,CACd,UAAW72M,EAAM,KAAK,UACtB,QAASA,EAAM,KAAK,OACtB,uyFCfA,MAAMA,EAAQgzD,EAORx8C,EAAQ29C,EACRqxL,EAAuBh5O,EAAI,EAAK,EAChCq0D,EAAW15D,GAAS,CAAE,OAAQnH,EAAM,WAAa,CAAA,EACjDq/K,EAAQ7yK,EAAI,IAAI,EAChB6+H,EAAoB3jD,GAAoB,EACxC,CAAE,UAAW+9J,EAAsB,OAAQC,CAA4B,EAAGx3D,IAA2B,EACrGy3D,EAAmBn5O,EAAI,EAAK,EAC5Bo5O,EAAkBp5O,EAAI,EAAK,EAE3Bq5O,EAAiCjiP,EAAS,IAAM,CACpD,MAAM1G,EAAQ8C,EAAM,YACpB,OAAO,KAAK,MAAM9C,EAAQ,CAAC,EAAI,IAAMA,CACvC,CAAC,EAED,SAAS4oP,GAAiB,CACxB,MAAM5oP,EAAQ,WAAW2jE,EAAS,MAAM,EACxC,GAAIglL,EAA+B,OAAS3oP,IAAU8C,EAAM,YAC1D,OAAAwlP,EAAqB,MAAQ,GAC7BG,EAAiB,MAAQ,GACzBC,EAAgB,MAAQ,GACjB,iGAAiG1oP,CAAK;AAAA;AAAA,gBAEjGA,CAAK,sDAAsD,IAAQA,EAAQ,IAAO,KAAM,QAAQ,CAAC,CAAC;AAAA;AAAA,MAGzG,GAAI,KAAK,MAAMA,EAAQ,CAAC,EAAI,IAAMA,GAAS,CAAC,MAAMA,CAAK,EAC5D,OAAAsoP,EAAqB,MAAQ,GAC7BG,EAAiB,MAAQ,GACzBC,EAAgB,MAAQ,GACjB,kEACF,GAAI1oP,IAAU,MAAQA,EAAQ,EACnC,OAAAsoP,EAAqB,MAAQ,GAC7BG,EAAiB,MAAQ,GACzBC,EAAgB,MAAQ,GACjB,wCACF,GAAI1oP,IAAU,EACnB,OAAAsoP,EAAqB,MAAQ,GAC7BG,EAAiB,MAAQ,GACzBC,EAAgB,MAAQ,GACjB,mDACF,GAAI,CAAC,MAAM1oP,CAAK,GAAKA,EAAQ,GAAKA,GAAS,IAAO,CACvD,MAAM6oP,EAAe,WAAW7oP,EAAM,QAAQ,CAAC,CAAC,EAChD,OAAA2jE,EAAS,OAASklL,EAClBP,EAAqB,MAAQ,GAC7BG,EAAiB,MAAQ,GACzBC,EAAgB,MAAQ,GACjB,aAAa1oP,CAAK,sDAAsD,IAAQA,EAAQ,IAAO,KAAM,QAAQ,CAAC,CAAC,GAC1H,KAAS,QAAIA,EAAQ,KACjBsoP,EAAqB,MAAQ,GAC7BG,EAAiB,MAAQ,GACzBC,EAAgB,MAAQ,GACjB,sCAEPJ,EAAqB,MAAQ,GAC7BG,EAAiB,MAAQ,GACzBC,EAAgB,MAAQ,GACjB,mDAEX,CAEA,MAAMI,EAA4B,IAAM,CACtCnlL,EAAS,OAASA,EAAS,QAAU,GAAK,EAAIA,EAAS,OACvD6kL,EAA2B7kL,EAAU,CACnC,UAAYolL,GAA+B,CACzC56G,EAAkB,cAAc,qCAAqC,EACrE70H,EAAM,SAAUyvO,EAA2B,MAAM,EACjD5mE,EAAM,MAAM,OACb,EACD,QAAS,IAAM,CACbh0C,EAAkB,cAAc,wEAAwE,CACzG,CACL,CAAG,CACH,EAEM9sH,EAAQ,IAAM,CAClBsiD,EAAS,OAAS7gE,EAAM,WAC1B,66CCpFA,MAAMA,EAAQgzD,EAOR,CAAE,QAAA6G,EAAS,WAAAqsL,EAAY,OAAAl1G,CAAM,EAAKj+E,GAAY/yD,EAAM,IAAI,EAExDmmP,EAAc35O,EAAIwkI,EAAO,OAAS,KAAO,EAAIA,CAAM,EAEnDo1G,EAAsBC,GAAuB,CACjDF,EAAY,MAAQE,CACtB,o8BChBA,MAAMrmP,EAAQgzD,w9DCDd,MAAMhzD,EAAQgzD,EAYR,CAAE,QAAA6G,EAAS,MAAA/iB,EAAO,OAAAwvM,EAAQ,SAAAC,EAAU,cAAAC,CAAa,EAAKzzL,GAAY/yD,EAAM,IAAI,EAC5E2kN,EAAYn4M,EAAI,IAAI,EAC1B,SAASi6O,EAAa7hC,EAAK,CACzBD,EAAU,MAAQC,EAAI,SACxB,CACA,OAAAvxF,EAAa,CAAE,aAAAozH,CAAY,CAAE,y6DCb7B,MAAMzmP,EAAQgzD,EAYR,CAAE,KAAA+xH,EAAM,KAAA0D,GAASr6F,KACjBm7C,EAAW3lI,EAAS,IAAMmhL,EAAK,OAAS0D,EAAK,KAAK,EAElD,CAAE,MAAA7uH,EAAO,cAAA4sL,CAAe,EAAGzzL,GAAY/yD,EAAM,IAAI,EACjD0mP,EAAiB9iP,EAAS,IAAMg2D,EAAM,MAAM,MAAM,EAElD+sL,EAAe/iP,EAAS,IAAM,CAClC,MAAM8oB,EAAO,CAAE,GAAG1sB,EAAM,MAAM,IAAI,EAClC,OAAI0mP,EAAe,MAAQ,GAAKA,EAAe,MAAQ,GACrD,OAAOh6N,EAAK,WAEPA,CACT,CAAC,EAEKi4L,EAAYn4M,EAAI,IAAI,EAC1B,SAASi6O,EAAa7hC,EAAK,CACzBD,EAAU,MAAQC,EAAI,SACxB,CACA,OAAAvxF,EAAa,CAAE,aAAAozH,CAAY,CAAE,omCC9B7B,MAAMzmP,EAAQgzD,EAeR,CAAE,KAAA+xH,EAAM,KAAA0D,EAAM,KAAAp6F,CAAM,EAAGD,GAAgB,EACvCw4J,EAAoBhjP,EAAS,IAAM6kL,EAAK,OAASp6F,EAAK,KAAK,EAC3Dk7C,EAAW3lI,EAAS,IAAMmhL,EAAK,KAAK,EAEpC,CAAE,OAAAqE,EAAQ,MAAA+B,EAAO,aAAAC,EAAc,QAAAvxH,EAAS,YAAAwxH,EAAa,YAAAhC,EAAa,SAAAxuH,EAAU,QAAAH,EAAS,YAAAE,EAAa,WAAAD,EAAY,UAAA2wH,EAAW,cAAAk7D,CAAe,EAAGzzL,GAC/I/yD,EAAM,IACR,EACM2kN,EAAYn4M,EAAI,IAAI,EAC1B,SAASi6O,EAAa7hC,EAAK,CACzBD,EAAU,MAAQC,EAAI,SACxB,CACA,OAAAvxF,EAAa,CAAE,aAAAozH,CAAY,CAAE,mwEC7B7B,MAAMzmP,EAAQgzD,EAYR,CAAE,MAAA2G,EAAO,YAAA0vH,EAAa,cAAAm9D,CAAa,EAAKzzL,GAAY/yD,EAAM,IAAI,EAC9D2kN,EAAYn4M,EAAI,IAAI,EAC1B,SAASi6O,EAAa7hC,EAAK,CACzBD,EAAU,MAAQC,EAAI,SACxB,CACA,OAAAvxF,EAAa,CAAE,aAAAozH,CAAY,CAAE,w6DCF7B,SAASp9J,GAAaC,EAAO,CAC3B,IAAIrnF,EACJ,MAAMsnF,EAAQt8E,GAAQq8E,CAAK,EAC3B,OAAQrnF,EAAKsnF,GAAS,KAAO,OAASA,EAAM,MAAQ,KAAOtnF,EAAKsnF,CAClE,CAEA,MAAMC,GAAgBrB,GAAW,OAAS,OAE1C,SAASurC,OAAoBttH,EAAM,CACjC,IAAIf,EACAizL,EACAuuD,EACA7iP,EAOJ,GANI,OAAOoC,EAAK,CAAC,GAAM,UAAY,MAAM,QAAQA,EAAK,CAAC,CAAC,GACtD,CAACkyL,EAAQuuD,EAAW7iP,CAAO,EAAIoC,EAC/Bf,EAASmkF,IAET,CAACnkF,EAAQizL,EAAQuuD,EAAW7iP,CAAO,EAAIoC,EAErC,CAACf,EACH,OAAOy5D,GACJ,MAAM,QAAQw5H,CAAM,IACvBA,EAAS,CAACA,CAAM,GACb,MAAM,QAAQuuD,CAAS,IAC1BA,EAAY,CAACA,CAAS,GACxB,MAAMC,EAAW,CAAA,EACX9hP,EAAU,IAAM,CACpB8hP,EAAS,QAASrpP,GAAOA,EAAI,CAAA,EAC7BqpP,EAAS,OAAS,CACtB,EACQz6N,EAAW,CAACnwB,EAAIyV,EAAOy3D,EAAU29K,KACrC7qP,EAAG,iBAAiByV,EAAOy3D,EAAU29K,CAAQ,EACtC,IAAM7qP,EAAG,oBAAoByV,EAAOy3D,EAAU29K,CAAQ,GAEzDxlK,EAAYtkE,GAChB,IAAM,CAACosE,GAAahkF,CAAM,EAAG4H,GAAQjJ,CAAO,CAAC,EAC7C,CAAC,CAAC9H,EAAI6qP,CAAQ,IAAM,CAElB,GADA/hP,IACI,CAAC9I,EACH,OACF,MAAM8qP,EAAejqP,GAASgqP,CAAQ,EAAI,CAAE,GAAGA,CAAU,EAAGA,EAC5DD,EAAS,KACP,GAAGxuD,EAAO,QAAS3mL,GACVk1O,EAAU,IAAKz9K,GAAa/8C,EAASnwB,EAAIyV,EAAOy3D,EAAU49K,CAAY,CAAC,CAC/E,CACT,CACK,EACD,CAAE,UAAW,GAAM,MAAO,MAAQ,CACtC,EACQ7iP,EAAO,IAAM,CACjBo9E,IACAv8E,GACJ,EACE,OAAAkjF,GAAkB/jF,CAAI,EACfA,CACT,CAkcA,SAASslF,KAAa,CACpB,MAAMn7D,EAAY9hB,EAAI,EAAK,EACrBgC,EAAWsR,KACjB,OAAItR,GACFiR,GAAU,IAAM,CACd6O,EAAU,MAAQ,EACnB,EAAkB9f,CAAQ,EAEtB8f,CACT,CAEA,SAASo7D,IAAa1gF,EAAU,CAC9B,MAAMslB,EAAYm7D,MAClB,OAAO7lF,EAAS,KACd0qB,EAAU,MACH,EAAQtlB,EAAQ,EACxB,CACH,CA4bA,SAASi+O,GAAwB5hP,EAAQ2D,EAAUhF,EAAU,CAAA,EAAI,CAC/D,KAAM,CACJ,KAAAmR,EACA,WAAA+xO,EAAa,MACb,UAAAx/C,EAAY,GACZ,OAAA79G,EAASL,GACT,UAAAtsE,EAAY,EACb,EAAGlZ,EACEmmF,EAAcT,IAAa,IAAMG,GAAU,yBAA0BA,CAAM,EAC3EtjB,EAAU3iE,EAAS,IAAM,CAC7B,MAAMujP,EAAUl6O,GAAQ5H,CAAM,EAC9B,OAAQ,MAAM,QAAQ8hP,CAAO,EAAIA,EAAU,CAACA,CAAO,GAAG,IAAI99J,EAAY,EAAE,OAAOjB,EAAU,CAC7F,CAAG,EACD,IAAIpjF,EAAU85D,GACd,MAAM1F,EAAW5sD,EAAI0Q,CAAS,EACxBqkE,EAAY4I,EAAY,MAAQltE,GACpC,IAAM,CAACspD,EAAQ,MAAO8iB,GAAal0E,CAAI,EAAGikD,EAAS,KAAK,EACxD,CAAC,CAACguL,EAAUC,CAAK,IAAM,CAIrB,GAHAriP,IACI,CAACo0D,EAAS,OAEV,CAACguL,EAAS,OACZ,OACF,MAAMnyK,EAAW,IAAI,qBACnBjsE,EACA,CACE,KAAMqgF,GAAag+J,CAAK,EACxB,WAAAH,EACA,UAAAx/C,CACD,CACT,EACM0/C,EAAS,QAASlrP,GAAOA,GAAM+4E,EAAS,QAAQ/4E,CAAE,CAAC,EACnD8I,EAAU,IAAM,CACdiwE,EAAS,WAAU,EACnBjwE,EAAU85D,EAClB,CACK,EACD,CAAE,UAAA5hD,EAAW,MAAO,MAAQ,CAC7B,EAAG4hD,GACE36D,EAAO,IAAM,CACjBa,IACAu8E,IACAnoB,EAAS,MAAQ,EACrB,EACE,OAAA8uB,GAAkB/jF,CAAI,EACf,CACL,YAAAgmF,EACA,SAAA/wB,EACA,OAAQ,CACNp0D,IACAo0D,EAAS,MAAQ,EAClB,EACD,QAAS,CACPA,EAAS,MAAQ,EAClB,EACD,KAAAj1D,CACJ,CACA,CAwXA,SAASmjP,GAAeprP,EAAI,CAC1B,OAAI,OAAO,OAAW,KAAeA,aAAc,OAC1CA,EAAG,SAAS,gBACjB,OAAO,SAAa,KAAeA,aAAc,SAC5CA,EAAG,gBACLA,CACT,CA8DA,MAAMqrP,IAAwB,CAC5B,CAACh/J,GAAe,OAAO,EAAErsF,EAAIkjB,EAAS,CAChC,OAAOA,EAAQ,OAAU,WAC3B6nO,GAAwB/qP,EAAIkjB,EAAQ,KAAK,EAEzC6nO,GAAwB/qP,EAAI,GAAGkjB,EAAQ,KAAK,CAC/C,CACH,EA0aA,SAASooO,GAAoB17J,EAAK,CAChC,MAAM5rF,EAAQ,OAAO,iBAAiB4rF,CAAG,EACzC,GAAI5rF,EAAM,YAAc,UAAYA,EAAM,YAAc,UAAYA,EAAM,YAAc,QAAU4rF,EAAI,YAAcA,EAAI,aAAe5rF,EAAM,YAAc,QAAU4rF,EAAI,aAAeA,EAAI,aAC1L,MAAO,GACF,CACL,MAAMh1E,EAASg1E,EAAI,WACnB,MAAI,CAACh1E,GAAUA,EAAO,UAAY,OACzB,GACF0wO,GAAoB1wO,CAAM,CAClC,CACH,CACA,SAAS0zL,IAAei9C,EAAU,CAChC,MAAMp9N,EAAIo9N,GAAY,OAAO,MACvBN,EAAU98N,EAAE,OAClB,OAAIm9N,GAAoBL,CAAO,EACtB,GACL98N,EAAE,QAAQ,OAAS,EACd,IACLA,EAAE,gBACJA,EAAE,eAAc,EACX,GACT,CACA,MAAMq9N,GAAoC,IAAI,QAC9C,SAASC,IAAcvzL,EAASixB,EAAe,GAAO,CACpD,MAAMuiK,EAAWp7O,EAAI64E,CAAY,EACjC,IAAIwiK,EAAwB,KAC5B5qO,GAAMjP,GAAMomD,CAAO,EAAIl4D,GAAO,CAC5B,MAAMmJ,EAASiiP,GAAer6O,GAAQ/Q,CAAE,CAAC,EACzC,GAAImJ,EAAQ,CACV,MAAMymF,EAAMzmF,EACPqiP,GAAkB,IAAI57J,CAAG,GAC5B47J,GAAkB,IAAI57J,EAAKA,EAAI,MAAM,QAAQ,EAC3C87J,EAAS,QACX97J,EAAI,MAAM,SAAW,SACxB,CACL,EAAK,CACD,UAAW,EACf,CAAG,EACD,MAAM2sF,EAAO,IAAM,CACjB,MAAMv8K,EAAKorP,GAAer6O,GAAQmnD,CAAO,CAAC,EACtC,CAACl4D,GAAM0rP,EAAS,QAEhBv/J,KACFw/J,EAAwBn0H,IACtBx3H,EACA,YACCmuB,GAAM,CACLmgL,IAAengL,CAAC,CACjB,EACD,CAAE,QAAS,EAAO,CAC1B,GAEInuB,EAAG,MAAM,SAAW,SACpB0rP,EAAS,MAAQ,GACrB,EACQE,EAAS,IAAM,CACnB,IAAI7lP,EACJ,MAAM/F,EAAKorP,GAAer6O,GAAQmnD,CAAO,CAAC,EACtC,CAACl4D,GAAM,CAAC0rP,EAAS,QAErBv/J,KAAUw/J,GAAyB,MAAgBA,EAAuB,GAC1E3rP,EAAG,MAAM,UAAY+F,EAAKylP,GAAkB,IAAIxrP,CAAE,IAAM,KAAO+F,EAAK,GACpEylP,GAAkB,OAAOxrP,CAAE,EAC3B0rP,EAAS,MAAQ,GACrB,EACE,OAAA1/J,GAAkB4/J,CAAM,EACjBlkP,EAAS,CACd,KAAM,CACJ,OAAOgkP,EAAS,KACjB,EACD,IAAI5lP,EAAG,CACDA,EACFy2K,IAEAqvE,GACH,CACL,CAAG,CACH,CAEA,SAASC,KAAe,CACtB,IAAIz5N,EAAY,GAChB,MAAM9O,EAAQhT,EAAI,EAAK,EACvB,MAAO,CAACtQ,EAAIkjB,IAAY,CAEtB,GADAI,EAAM,MAAQJ,EAAQ,MAClBkP,EACF,OACFA,EAAY,GACZ,MAAMs5N,EAAWD,IAAczrP,EAAIkjB,EAAQ,KAAK,EAChDnC,GAAMuC,EAAQxd,GAAM4lP,EAAS,MAAQ5lP,CAAC,CAC1C,CACA,CACoB+lP,IAAY,8KC58DhC,MAAM/nP,EAAQgzD,EAaR,CAAE,OAAAmsI,CAAM,EAAKpsI,GAAY/yD,EAAM,IAAI,EAEnCgoP,EAAW,CAAC,CAAC,CAAE,eAAAC,CAAc,CAAE,IAAM,CACrCA,GACF73G,GAAkB,eAAgB,CAAE,MAAO,CAAG,CAAA,CAElD,EACM83G,EAAWC,GAAe,CAC9B,KAAM,CAAE,YAAAvkD,CAAa,EAAGukD,EACxB/3G,GAAkB,mBAAoB,CAAE,MAAOwzD,EAAc,CAAG,CAAA,CAClE,whECnCA,MAAM5jM,EAAQgzD,EAORoM,EAAW,6BAA6B,MAAM,EAAE,EAChDgpL,EAAe57O,EAAI,EAAE,EACrB67O,EAAmB77O,EAAI,EAAK,EAC5B87O,EAAoB97O,EAAI,EAAK,EAE7B+7O,EAAiBC,GAAW,CAEhC,GAAI,CAACC,EAAoBD,CAAM,EAC7B,OAIF,GAAIJ,EAAa,MAAO,CACtB,MAAMM,EAAkB,SAAS,eAAe,UAAUN,EAAa,KAAK,EAAE,EAC1EM,GACFA,EAAgB,UAAU,OAAO,QAAQ,CAE5C,CAGDN,EAAa,MAAQI,EAGrB,MAAMG,EAAiB,SAAS,eAAe,UAAUH,CAAM,EAAE,EAC7DG,GACFA,EAAe,UAAU,IAAI,QAAQ,EAGvCC,EAAeJ,CAAM,EACrB,QAAQ,IAAI,iBAAkBA,CAAM,CACtC,EAEMC,EAAuBD,GACpBxoP,EAAM,QAAQ,KAAM6oP,GAAWA,EAAO,SAAWL,CAAM,EAG1DI,EAAkBJ,GAAW,CACjC,MAAMp0L,EAAU,SAAS,eAAeo0L,CAAM,EAC1Cp0L,GACFA,EAAQ,eAAe,CAAE,SAAU,QAAU,CAAA,CAEjD,EAEM00L,EAAkBllP,EAAS,IAAM,CACrC,MAAMmlP,EAAiB,CAAA,EACvB,UAAWF,KAAU7oP,EAAM,QACpB+oP,EAAeF,EAAO,MAAM,IAC/BE,EAAeF,EAAO,MAAM,EAAI,IAElCE,EAAeF,EAAO,MAAM,EAAE,KAAKA,CAAM,EAE3C,OAAOE,CACT,CAAC,EAEKC,EAA4Br3O,GAAU,CAC1C,MAAMtM,EAASsM,EAAM,OAErB02O,EAAiB,MAAQhjP,EAAO,WAAa,EAC7CijP,EAAkB,MAAQjjP,EAAO,YAAcA,EAAO,YAAcA,EAAO,UAC7E,EAEA,OAAAoa,GAAU,IAAM,CACd,MAAMwpO,EAAe,SAAS,cAAc,gBAAgB,EAExDA,IACFA,EAAa,iBAAiB,SAAUD,CAAwB,EAEhEA,EAAyB,CAAE,OAAQC,CAAY,CAAE,EAErD,CAAC,8uECpEM,SAASC,IAAgB,CAC9B,IAAIC,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAClF,KAAM,CACJ,UAAAC,EACA,GAAGvlI,CACJ,EAAGslI,EACEnlP,EAAU0mN,GAAU0+B,EAAWvlI,CAAI,EACnC,CACJ,QAAA6yG,EAAU,CAAE,EACZ,WAAA7qM,EAAa,CAAE,EACf,WAAAhN,EAAa,CAAE,CAChB,EAAG7a,EACEslB,EAAWkmM,IAAexrN,EAAQ,QAAQ,EAC1CqlP,EAAUlsB,IAAcn5N,EAAQ,QAASA,EAAQ,GAAG,EACpD8uN,EAAQE,IAAYhvN,EAAQ,KAAK,EACjCixD,EAAQmiK,IAAYpzN,EAAQ,KAAK,EACjCsuN,EAASJ,IAAaluN,EAAQ,MAAM,EACpCuoF,EAAOi6I,IAAWxiO,EAAQ,KAAMsuN,CAAM,EACtCg3B,EAAO1rB,IAAW55N,EAAQ,KAAMsuN,CAAM,EA2D5C,MAAO,CACL,QA3Dc/jM,GAAO,CACrB,UAAW1yB,KAAOgjB,EAChB0P,EAAI,UAAU1yB,EAAKgjB,EAAWhjB,CAAG,CAAC,EAEpC,UAAWA,KAAOgwB,EAChB0C,EAAI,UAAU1yB,EAAKgwB,EAAWhwB,CAAG,CAAC,EAEpC,UAAWA,KAAO66N,EAChBnoM,EAAI,UAAU1yB,EAAKgnB,GAAgB,CACjC,GAAG6zM,EAAQ76N,CAAG,EACd,KAAMA,EACN,UAAW66N,EAAQ76N,CAAG,EAAE,IACzB,CAAA,CAAC,EAWJ,GATAi3N,EAAM,QAAQvkM,CAAG,EACjBA,EAAI,QAAQghM,GAAgBjmM,CAAQ,EACpCiF,EAAI,QAAQ8tM,GAAegtB,CAAO,EAClC96N,EAAI,QAAQmkM,GAAaI,CAAK,EAC9BvkM,EAAI,QAAQuoM,GAAY7hK,CAAK,EAC7B1mC,EAAI,QAAQyjM,GAAcM,CAAM,EAChC/jM,EAAI,QAAQ+3M,IAAmB/5I,EAAK,OAAO,EAC3Ch+D,EAAI,QAAQg4M,GAAmBh6I,EAAK,QAAQ,EAC5Ch+D,EAAI,QAAQovM,IAAY2rB,CAAI,EACxBx/B,IAAc9lN,EAAQ,IACxB,GAAIuqB,EAAI,MACNA,EAAI,MAAM,KAAK,uBAAwB,IAAM,CAC3C86N,EAAQ,OAAM,CACxB,CAAS,MACI,CACL,KAAM,CACJ,MAAAhsN,CACD,EAAG9O,EACJA,EAAI,MAAQ,UAAY,CACtB,MAAMqhM,EAAKvyL,EAAM,GAAG,SAAS,EAC7BvtB,OAAAA,GAAS,IAAMu5O,EAAQ,OAAM,CAAE,EAC/B96N,EAAI,MAAQ8O,EACLuyL,CACjB,CACO,CAEHc,GAAO,MAAK,EAEVniM,EAAI,MAAM,CACR,SAAU,CACR,UAAW,CACT,OAAOpnB,GAAS,CACd,SAAUwV,GAAO,KAAK,KAAM4yM,EAAc,EAC1C,QAAS5yM,GAAO,KAAK,KAAM0/M,EAAa,EACxC,MAAO1/M,GAAO,KAAK,KAAM+1M,EAAW,EACpC,MAAO/1M,GAAO,KAAK,KAAMm6M,EAAU,EACnC,OAAQn6M,GAAO,KAAK,KAAMq1M,EAAY,EACtC,KAAMr1M,GAAO,KAAK,KAAM4pN,EAAiB,CACvD,CAAa,CACF,CACF,CACT,CAAO,CAEP,EAGI,SAAAj9M,EACA,QAAA+/N,EACA,MAAAv2B,EACA,MAAA79J,EACA,OAAAq9J,EACA,KAAA/lI,EACA,KAAA+8J,CACJ,CACA,CACO,MAAM96N,IAAU,QACvB06N,GAAc,QAAU16N,IAGxB,SAAS7R,GAAO9gB,EAAK,SACnB,MAAM+zN,EAAK,KAAK,EACV1jM,IAAWjqB,EAAA2tN,EAAG,SAAH,YAAA3tN,EAAW,aAAYyP,EAAAk+M,EAAG,MAAM,aAAT,YAAAl+M,EAAqB,UAC7D,GAAIwa,GAAYrwB,KAAOqwB,EACrB,OAAOA,EAASrwB,CAAG,CAEvB,CCzGA,MAAM0tP,GAAU,CACd,MAAQh7N,GAAQ,CACd,MAAMu1D,EAAQG,KACd11D,EAAI,IAAIu1D,CAAK,CACd,EACD,SAAWv1D,GAAQ,CACjBA,EAAI,IAAIoyD,GAAgB,CACtB,kBAAmB,CACjB,eAAgB,CACd,QAAS,CACP,WAAY,CAACrO,EAActuD,IACH,YACJ,KAAKA,EAAM,SAAS,MAAM,EAAU,GAC/CsuD,EAAe,CAEzB,CACF,CACF,CACP,CAAK,CACF,EACD,QAAU/jD,GAAQ,CAChB,MAAM46N,EAAUD,KAChB36N,EAAI,IAAI46N,CAAO,CAChB,CACH,EAEe,SAASK,GAAmBj7N,EAAK,CAC9C,OAAO,KAAKg7N,EAAO,EAAE,QAAS96N,GAAW86N,GAAQ96N,CAAM,EAAEF,CAAG,CAAC,CAC/D,CChCO,MAAMk7N,GAAmB,CAC9B,QAAS,cACT,aAAc,CACZ,MAAO,CAAC,WAAW,EACnB,KAAM,CAAC,wCAAwC,EAC/C,YAAa,CAAC,uCAAuC,EACrD,QAAS,CAAC,2CAA2C,EACrD,WAAY,CAAC,yCAA0C,eAAe,CACvE,EACD,eAAgB,SAAUC,EAAU,CAClC,GAAI,CAACA,EAAU,OAAO,KAAK,QAC3B,MAAMC,EAAc,OAAO,QAAQ,KAAK,YAAY,EAAE,KAAK,CAAC,CAAC9rP,EAAGX,CAAK,IAAM,CACzE,GAAIA,EAAM,SAASwsP,CAAQ,EAAG,MAAO,EAC3C,CAAK,EACD,OAAOC,GAAA,YAAAA,EAAc,KAAM,KAAK,OACjC,CACH,ECfM1sP,GAAiB,OAAO,UAAU,SASxC,SAASqgF,GAAQssK,EAAK,CACpB,OAAQ3sP,GAAe,KAAK2sP,CAAG,EAAC,CAC9B,IAAK,iBACL,IAAK,qBACL,IAAK,wBACL,IAAK,iCACH,MAAO,GACT,QACE,OAAOC,GAAaD,EAAK,KAAK,CACjC,CACH,CAQA,SAASE,GAAUF,EAAK1nD,EAAW,CACjC,OAAOjlM,GAAe,KAAK2sP,CAAG,IAAM,WAAW1nD,CAAS,GAC1D,CASA,SAAS6nD,GAAaH,EAAK,CACzB,OAAOE,GAAUF,EAAK,YAAY,CACpC,CASA,SAASI,GAAWJ,EAAK,CACvB,OAAOE,GAAUF,EAAK,UAAU,CAClC,CASA,SAASK,IAAeL,EAAK,CAC3B,OAAOE,GAAUF,EAAK,cAAc,CACtC,CASA,SAAS/sP,GAAS+sP,EAAK,CACrB,OAAOE,GAAUF,EAAK,QAAQ,CAChC,CASA,SAASM,GAAsBN,EAAK,CAClC,OACE,OAAOA,GAAQ,UACfA,IAAQ,MACR,+BAAgCA,GAChC,+BAAgCA,CAEpC,CASA,SAASO,GAAYP,EAAK,CACxB,OAAOA,IAAQ,MAAQM,GAAsBN,CAAG,GAAM,OAAOA,GAAQ,UAAY,OAAOA,GAAQ,UAClG,CASA,SAASxsP,GAAcwsP,EAAK,CAC1B,OAAOE,GAAUF,EAAK,QAAQ,CAChC,CASA,SAASQ,GAAQR,EAAK,CACpB,OAAO,OAAO,MAAU,KAAeC,GAAaD,EAAK,KAAK,CAChE,CASA,SAAStlI,IAAUslI,EAAK,CACtB,OAAO,OAAO,QAAY,KAAeC,GAAaD,EAAK,OAAO,CACpE,CASA,SAASjtP,IAASitP,EAAK,CACrB,OAAOE,GAAUF,EAAK,QAAQ,CAChC,CAMA,SAASjqL,GAAWiqL,EAAK,CAEvB,MAAO,GAAQA,GAAOA,EAAI,MAAQ,OAAOA,EAAI,MAAS,WACxD,CASA,SAASS,IAAiBT,EAAK,CAC7B,OAAOxsP,GAAcwsP,CAAG,GAAK,gBAAiBA,GAAO,mBAAoBA,GAAO,oBAAqBA,CACvG,CAUA,SAASC,GAAaD,EAAKl9N,EAAM,CAC/B,GAAI,CACF,OAAOk9N,aAAel9N,CACvB,MAAY,CACX,MAAO,EACR,CACH,CAQA,SAAS49N,GAAeV,EAAK,CAE3B,MAAO,CAAC,EAAE,OAAOA,GAAQ,UAAYA,IAAQ,OAAUA,EAAM,SAAYA,EAAM,QACjF,CCvLA,SAASr/H,GAASnvH,EAAKqqB,EAAM,EAAG,CAC9B,OAAI,OAAOrqB,GAAQ,UAAYqqB,IAAQ,GAGhCrqB,EAAI,QAAUqqB,EAFZrqB,EAEwB,GAAGA,EAAI,MAAM,EAAGqqB,CAAG,CAAC,KACvD,CAoDA,SAAS8kO,GAASxzM,EAAO6nB,EAAW,CAClC,GAAI,CAAC,MAAM,QAAQ7nB,CAAK,EACtB,MAAO,GAGT,MAAMimG,EAAS,CAAA,EAEf,QAAS7gJ,EAAI,EAAGA,EAAI46C,EAAM,OAAQ56C,IAAK,CACrC,MAAMe,EAAQ65C,EAAM56C,CAAC,EACrB,GAAI,CAMEmuP,GAAeptP,CAAK,EACtB8/I,EAAO,KAAK,gBAAgB,EAE5BA,EAAO,KAAK,OAAO9/I,CAAK,CAAC,CAE5B,MAAW,CACV8/I,EAAO,KAAK,8BAA8B,CAC3C,CACF,CAED,OAAOA,EAAO,KAAKp+E,CAAS,CAC9B,CAUA,SAAS4rL,IACPttP,EACA0oB,EACA6kO,EAA0B,GAC1B,CACA,OAAK5tP,GAASK,CAAK,EAIfP,IAASipB,CAAO,EACXA,EAAQ,KAAK1oB,CAAK,EAEvBL,GAAS+oB,CAAO,EACX6kO,EAA0BvtP,IAAU0oB,EAAU1oB,EAAM,SAAS0oB,CAAO,EAGtE,GAVE,EAWX,CAYA,SAAS8kO,GACPC,EACAC,EAAW,CAAE,EACbH,EAA0B,GAC1B,CACA,OAAOG,EAAS,KAAKhlO,GAAW4kO,IAAkBG,EAAY/kO,EAAS6kO,CAAuB,CAAC,CACjG,CCnIA,SAASI,IACPC,EACArnL,EACAsnL,EAAgB,IAChBlvP,EACAotH,EACAt3G,EACAs7J,EACA,CACA,GAAI,CAACt7J,EAAM,WAAa,CAACA,EAAM,UAAU,QAAU,CAACs7J,GAAQ,CAAC48E,GAAa58E,EAAK,kBAAmB,KAAK,EACrG,OAIF,MAAM+9E,EACJr5O,EAAM,UAAU,OAAO,OAAS,EAAIA,EAAM,UAAU,OAAOA,EAAM,UAAU,OAAO,OAAS,CAAC,EAAI,OAG9Fq5O,IACFr5O,EAAM,UAAU,OAASs5O,IACvBC,GACEJ,EACArnL,EACAwlD,EACAgkD,EAAK,kBACLpxK,EACA8V,EAAM,UAAU,OAChBq5O,EACA,CACD,EACDD,CACN,EAEA,CAEA,SAASG,GACPJ,EACArnL,EACAwlD,EACAjlG,EACAnoB,EACAsvP,EACAxrG,EACAyrG,EACA,CACA,GAAID,EAAe,QAAUliI,EAAQ,EACnC,OAAOkiI,EAGT,IAAIE,EAAgB,CAAC,GAAGF,CAAc,EAGtC,GAAItB,GAAa7lO,EAAMnoB,CAAG,EAAG,KAAK,EAAG,CACnCyvP,GAA4C3rG,EAAWyrG,CAAW,EAClE,MAAMG,EAAeT,EAAiCrnL,EAAQz/C,EAAMnoB,CAAG,CAAC,EAClE2vP,EAAiBH,EAAc,OACrCI,GAA2CF,EAAc1vP,EAAK2vP,EAAgBJ,CAAW,EACzFC,EAAgBH,GACdJ,EACArnL,EACAwlD,EACAjlG,EAAMnoB,CAAG,EACTA,EACA,CAAC0vP,EAAc,GAAGF,CAAa,EAC/BE,EACAC,CACN,CACG,CAID,OAAI,MAAM,QAAQxnO,EAAM,MAAM,GAC5BA,EAAM,OAAO,QAAQ,CAAC0nO,EAAYvvP,IAAM,CACtC,GAAI0tP,GAAa6B,EAAY,KAAK,EAAG,CACnCJ,GAA4C3rG,EAAWyrG,CAAW,EAClE,MAAMG,EAAeT,EAAiCrnL,EAAQioL,CAAU,EAClEF,EAAiBH,EAAc,OACrCI,GAA2CF,EAAc,UAAUpvP,CAAC,IAAKqvP,EAAgBJ,CAAW,EACpGC,EAAgBH,GACdJ,EACArnL,EACAwlD,EACAyiI,EACA7vP,EACA,CAAC0vP,EAAc,GAAGF,CAAa,EAC/BE,EACAC,CACV,CACO,CACP,CAAK,EAGIH,CACT,CAEA,SAASC,GAA4C3rG,EAAWyrG,EAAa,CAE3EzrG,EAAU,UAAYA,EAAU,WAAa,CAAE,KAAM,UAAW,QAAS,IAEzEA,EAAU,UAAY,CACpB,GAAGA,EAAU,UACb,GAAIA,EAAU,OAAS,kBAAoB,CAAE,mBAAoB,EAAI,EACrE,aAAcyrG,CAClB,CACA,CAEA,SAASK,GACP9rG,EACAzyI,EACAk+O,EACAO,EACA,CAEAhsG,EAAU,UAAYA,EAAU,WAAa,CAAE,KAAM,UAAW,QAAS,IAEzEA,EAAU,UAAY,CACpB,GAAGA,EAAU,UACb,KAAM,UACN,OAAAzyI,EACA,aAAck+O,EACd,UAAWO,CACf,CACA,CAOA,SAASV,IAA4BW,EAAYC,EAAgB,CAC/D,OAAOD,EAAW,IAAIjsG,IAChBA,EAAU,QACZA,EAAU,MAAQp1B,GAASo1B,EAAU,MAAOksG,CAAc,GAErDlsG,EACR,CACH,CC3IA,SAASmsG,GAAwCC,EAAY,CAE3D,GAAIA,IAAe,OAEZ,OAAIA,GAAc,KAAOA,EAAa,IACpC,UACEA,GAAc,IAChB,QAEP,MAEJ,CCdA,MAAMC,GAAc,SCGdC,GAAa,WAanB,SAASC,GAAmBpsP,EAAMqsP,EAAS1tP,EAAK,CAC9C,MAAM2tP,EAAO3tP,GAAOwtP,GACdI,EAAcD,EAAI,WAAaA,EAAI,YAAc,CAAA,EACjDE,EAAoBD,EAAWL,EAAW,EAAIK,EAAWL,EAAW,GAAK,CAAA,EAC/E,OAAOM,EAAiBxsP,CAAI,IAAMwsP,EAAiBxsP,CAAI,EAAIqsP,EAAO,EACpE,CClBA,MAAMI,GAASN,GAETO,IAA4B,GAQlC,SAASC,GACPrrE,EACAp9K,EAAU,CAAE,EACZ,CACA,GAAI,CAACo9K,EACH,MAAO,YAOT,GAAI,CACF,IAAIsrE,EAActrE,EAClB,MAAMurE,EAAsB,EACtB3tG,EAAM,CAAA,EACZ,IAAI3zD,EAAS,EACT/uD,EAAM,EACV,MAAMihF,EAAY,MACZqvI,EAAYrvI,EAAU,OAC5B,IAAIsvI,EACJ,MAAMC,EAAW,MAAM,QAAQ9oP,CAAO,EAAIA,EAAUA,EAAQ,SACtD+oP,EAAmB,CAAC,MAAM,QAAQ/oP,CAAO,GAAKA,EAAQ,iBAAoBwoP,IAEhF,KAAOE,GAAerhK,IAAWshK,IAC/BE,EAAUG,IAAqBN,EAAaI,CAAQ,EAKhD,EAAAD,IAAY,QAAWxhK,EAAS,GAAK/uD,EAAM0iH,EAAI,OAAS4tG,EAAYC,EAAQ,QAAUE,KAI1F/tG,EAAI,KAAK6tG,CAAO,EAEhBvwN,GAAOuwN,EAAQ,OACfH,EAAcA,EAAY,WAG5B,OAAO1tG,EAAI,QAAO,EAAG,KAAKzhC,CAAS,CACpC,MAAa,CACZ,MAAO,WACR,CACH,CAOA,SAASyvI,IAAqB9wP,EAAI4wP,EAAU,CAC1C,MAAM1rE,EAAOllL,EAIP8iJ,EAAM,CAAA,EAEZ,GAAI,CAACoiC,GAAQ,CAACA,EAAK,QACjB,MAAO,GAIT,GAAImrE,GAAO,aAELnrE,aAAgB,aAAeA,EAAK,QAAS,CAC/C,GAAIA,EAAK,QAAQ,gBACf,OAAOA,EAAK,QAAQ,gBAEtB,GAAIA,EAAK,QAAQ,cACf,OAAOA,EAAK,QAAQ,aAEvB,CAGHpiC,EAAI,KAAKoiC,EAAK,QAAQ,YAAa,CAAA,EAGnC,MAAM6rE,EACJH,GAAYA,EAAS,OACjBA,EAAS,OAAOI,GAAW9rE,EAAK,aAAa8rE,CAAO,CAAC,EAAE,IAAIA,GAAW,CAACA,EAAS9rE,EAAK,aAAa8rE,CAAO,CAAC,CAAC,EAC3G,KAEN,GAAID,GAAgBA,EAAa,OAC/BA,EAAa,QAAQE,GAAe,CAClCnuG,EAAI,KAAK,IAAImuG,EAAY,CAAC,CAAC,KAAKA,EAAY,CAAC,CAAC,IAAI,CACxD,CAAK,MACI,CACD/rE,EAAK,IACPpiC,EAAI,KAAK,IAAIoiC,EAAK,EAAE,EAAE,EAGxB,MAAM8gB,EAAY9gB,EAAK,UACvB,GAAI8gB,GAAarlM,GAASqlM,CAAS,EAAG,CACpC,MAAMrQ,EAAUqQ,EAAU,MAAM,KAAK,EACrC,UAAWpkM,KAAK+zL,EACd7yC,EAAI,KAAK,IAAIlhJ,CAAC,EAAE,CAEnB,CACF,CACD,MAAMsvP,EAAe,CAAC,aAAc,OAAQ,OAAQ,QAAS,KAAK,EAClE,UAAWp9M,KAAKo9M,EAAc,CAC5B,MAAMrvM,EAAOqjI,EAAK,aAAapxI,CAAC,EAC5B+N,GACFihG,EAAI,KAAK,IAAIhvG,CAAC,KAAK+N,CAAI,IAAI,CAE9B,CAED,OAAOihG,EAAI,KAAK,EAAE,CACpB,CAKA,SAASquG,KAAkB,CACzB,GAAI,CACF,OAAOd,GAAO,SAAS,SAAS,IACjC,MAAY,CACX,MAAO,EACR,CACH,CAiCA,SAAS70O,IAAiB0pK,EAAM,CAE9B,GAAI,CAACmrE,GAAO,YACV,OAAO,KAGT,IAAIG,EAActrE,EAClB,MAAMurE,EAAsB,EAC5B,QAASxwP,EAAI,EAAGA,EAAIwwP,EAAqBxwP,IAAK,CAC5C,GAAI,CAACuwP,EACH,OAAO,KAGT,GAAIA,aAAuB,YAAa,CACtC,GAAIA,EAAY,QAAQ,gBACtB,OAAOA,EAAY,QAAQ,gBAE7B,GAAIA,EAAY,QAAQ,cACtB,OAAOA,EAAY,QAAQ,aAE9B,CAEDA,EAAcA,EAAY,UAC3B,CAED,OAAO,IACT,CC3LA,MAAMY,GAAe,OAAO,iBAAqB,KAAe,iBCD1DC,IAAS,iBAETC,GAAiB,CACrB,QACA,OACA,OACA,QACA,MACA,SACA,OACF,EAGMC,GAEH,GAUH,SAASC,GAAe1kP,EAAU,CAChC,GAAI,EAAE,YAAaijP,IACjB,OAAOjjP,EAAQ,EAGjB,MAAM2kP,EAAU1B,GAAW,QACrB2B,EAAe,CAAA,EAEfC,EAAgB,OAAO,KAAKJ,EAAsB,EAGxDI,EAAc,QAAQ/lG,GAAS,CAC7B,MAAMgmG,EAAwBL,GAAuB3lG,CAAK,EAC1D8lG,EAAa9lG,CAAK,EAAI6lG,EAAQ7lG,CAAK,EACnC6lG,EAAQ7lG,CAAK,EAAIgmG,CACrB,CAAG,EAED,GAAI,CACF,OAAO9kP,EAAQ,CACnB,QAAY,CAER6kP,EAAc,QAAQ/lG,GAAS,CAC7B6lG,EAAQ7lG,CAAK,EAAI8lG,EAAa9lG,CAAK,CACzC,CAAK,CACF,CACH,CAEA,SAASimG,KAAa,CACpB,IAAI7mH,EAAU,GACd,MAAMkxC,EAAS,CACb,OAAQ,IAAM,CACZlxC,EAAU,EACX,EACD,QAAS,IAAM,CACbA,EAAU,EACX,EACD,UAAW,IAAMA,CACrB,EAEE,OAAIomH,GACFE,GAAe,QAAQ1tP,GAAQ,CAE7Bs4K,EAAOt4K,CAAI,EAAI,IAAIsG,IAAS,CACtB8gI,GACFwmH,GAAe,IAAM,CACnBzB,GAAW,QAAQnsP,CAAI,EAAE,GAAGytP,GAAM,IAAIztP,CAAI,KAAM,GAAGsG,CAAI,CACnE,CAAW,CAEX,CACA,CAAK,EAEDonP,GAAe,QAAQ1tP,GAAQ,CAC7Bs4K,EAAOt4K,CAAI,EAAI,IAAA,EACrB,CAAK,EAGIs4K,CACT,CAMA,MAAMA,GAAS8zE,GAAmB,SAAU6B,GAAU,ECxFhDC,IAAY,kEAElB,SAASC,IAAgBtjL,EAAU,CACjC,OAAOA,IAAa,QAAUA,IAAa,OAC7C,CAWA,SAASujL,GAAYC,EAAKC,EAAe,GAAO,CAC9C,KAAM,CAAE,KAAAC,EAAM,KAAA5vO,EAAM,KAAA6vO,EAAM,KAAAC,EAAM,UAAAC,EAAW,SAAA7jL,EAAU,UAAAgoG,CAAW,EAAGw7E,EACnE,MACE,GAAGxjL,CAAQ,MAAMgoG,CAAS,GAAGy7E,GAAgBE,EAAO,IAAIA,CAAI,GAAK,EAAE,IAC/DD,CAAI,GAAGE,EAAO,IAAIA,CAAI,GAAK,EAAE,IAAI9vO,GAAO,GAAGA,CAAI,GAAU,GAAG+vO,CAAS,EAE7E,CAQA,SAASC,IAAcrzP,EAAK,CAC1B,MAAMg6B,EAAQ44N,IAAU,KAAK5yP,CAAG,EAEhC,GAAI,CAACg6B,EAAO,CAEVs4N,GAAe,IAAM,CAEnB,QAAQ,MAAM,uBAAuBtyP,CAAG,EAAE,CAChD,CAAK,EACD,MACD,CAED,KAAM,CAACuvE,EAAUgoG,EAAW27E,EAAO,GAAID,EAAO,GAAIE,EAAO,GAAIG,EAAW,EAAE,EAAIt5N,EAAM,MAAM,CAAC,EAC3F,IAAI3W,EAAO,GACP+vO,EAAYE,EAEhB,MAAM1lI,EAAQwlI,EAAU,MAAM,GAAG,EAMjC,GALIxlI,EAAM,OAAS,IACjBvqG,EAAOuqG,EAAM,MAAM,EAAG,EAAE,EAAE,KAAK,GAAG,EAClCwlI,EAAYxlI,EAAM,OAGhBwlI,EAAW,CACb,MAAMG,EAAeH,EAAU,MAAM,MAAM,EACvCG,IACFH,EAAYG,EAAa,CAAC,EAE7B,CAED,OAAOC,GAAkB,CAAE,KAAAP,EAAM,KAAAC,EAAM,KAAA7vO,EAAM,UAAA+vO,EAAW,KAAAD,EAAM,SAAU5jL,EAAW,UAAAgoG,CAAW,CAAA,CAChG,CAEA,SAASi8E,GAAkB/iO,EAAY,CACrC,MAAO,CACL,SAAUA,EAAW,SACrB,UAAWA,EAAW,WAAa,GACnC,KAAMA,EAAW,MAAQ,GACzB,KAAMA,EAAW,KACjB,KAAMA,EAAW,MAAQ,GACzB,KAAMA,EAAW,MAAQ,GACzB,UAAWA,EAAW,SAC1B,CACA,CAEA,SAASgjO,IAAYV,EAAK,CACxB,GAAI,CAACb,GACH,MAAO,GAGT,KAAM,CAAE,KAAAiB,EAAM,UAAAC,EAAW,SAAA7jL,CAAQ,EAAKwjL,EAWtC,MAT2B,CAAC,WAAY,YAAa,OAAQ,WAAW,EACjB,KAAK/3O,GACrD+3O,EAAI/3O,CAAS,EAIX,IAHLgiK,GAAO,MAAM,uBAAuBhiK,CAAS,UAAU,EAChD,GAGV,EAGQ,GAGJo4O,EAAU,MAAM,OAAO,EAKvBP,IAAgBtjL,CAAQ,EAKzB4jL,GAAQ,MAAM,SAASA,EAAM,EAAE,CAAC,GAClCn2E,GAAO,MAAM,oCAAoCm2E,CAAI,EAAE,EAChD,IAGF,IATLn2E,GAAO,MAAM,wCAAwCztG,CAAQ,EAAE,EACxD,KANPytG,GAAO,MAAM,yCAAyCo2E,CAAS,EAAE,EAC1D,GAcX,CAMA,SAASM,IAAQ3hO,EAAM,CACrB,MAAMtB,EAAa,OAAOsB,GAAS,SAAWshO,IAActhO,CAAI,EAAIyhO,GAAkBzhO,CAAI,EAC1F,GAAI,GAACtB,GAAc,CAACgjO,IAAYhjO,CAAU,GAG1C,OAAOA,CACT,CC5HA,MAAMkjO,WAAoB,KAAM,CAG7B,YAAa9wM,EAAS+wM,EAAW,OAAQ,CACxC,MAAM/wM,CAAO,EAAE,KAAK,QAAUA,EAC9B,KAAK,KAAO,WAAW,UAAU,YAAY,KAI7C,OAAO,eAAe,KAAM,WAAW,SAAS,EAChD,KAAK,SAAW+wM,CACjB,CACH,CCIA,SAASpyI,GAAK1vG,EAAQpN,EAAMmvP,EAAoB,CAC9C,GAAI,EAAEnvP,KAAQoN,GACZ,OAGF,MAAMgmN,EAAWhmN,EAAOpN,CAAI,EACtBygH,EAAU0uI,EAAmB/7B,CAAQ,EAIvC,OAAO3yG,GAAY,YACrB2uI,GAAoB3uI,EAAS2yG,CAAQ,EAGvChmN,EAAOpN,CAAI,EAAIygH,CACjB,CASA,SAAS4uI,GAAyB1wP,EAAKqB,EAAM5C,EAAO,CAClD,GAAI,CACF,OAAO,eAAeuB,EAAKqB,EAAM,CAE/B,MAAO5C,EACP,SAAU,GACV,aAAc,EACpB,CAAK,CACF,MAAa,CACZowP,IAAel1E,GAAO,IAAI,0CAA0Ct4K,CAAI,cAAerB,CAAG,CAC3F,CACH,CASA,SAASywP,GAAoB3uI,EAAS2yG,EAAU,CAC9C,GAAI,CACF,MAAM1wH,EAAQ0wH,EAAS,WAAa,GACpC3yG,EAAQ,UAAY2yG,EAAS,UAAY1wH,EACzC2sJ,GAAyB5uI,EAAS,sBAAuB2yG,CAAQ,CACrE,MAAgB,CAAE,CAClB,CASA,SAASk8B,GAAoB31J,EAAM,CACjC,OAAOA,EAAK,mBACd,CAQA,SAAS41J,IAAUvpP,EAAQ,CACzB,OAAO,OAAO,KAAKA,CAAM,EACtB,IAAIjK,GAAO,GAAG,mBAAmBA,CAAG,CAAC,IAAI,mBAAmBiK,EAAOjK,CAAG,CAAC,CAAC,EAAE,EAC1E,KAAK,GAAG,CACb,CAUA,SAASyzP,GACPpyP,EAGD,CACC,GAAIogF,GAAQpgF,CAAK,EACf,MAAO,CACL,QAASA,EAAM,QACf,KAAMA,EAAM,KACZ,MAAOA,EAAM,MACb,GAAGqyP,GAAiBryP,CAAK,CAC/B,EACS,GAAIktP,GAAQltP,CAAK,EAAG,CACzB,MAAMsyP,EAEP,CACG,KAAMtyP,EAAM,KACZ,OAAQuyP,GAAqBvyP,EAAM,MAAM,EACzC,cAAeuyP,GAAqBvyP,EAAM,aAAa,EACvD,GAAGqyP,GAAiBryP,CAAK,CAC/B,EAEI,OAAI,OAAO,YAAgB,KAAe2sP,GAAa3sP,EAAO,WAAW,IACvEsyP,EAAO,OAAStyP,EAAM,QAGjBsyP,CACX,KACI,QAAOtyP,CAEX,CAGA,SAASuyP,GAAqBpqP,EAAQ,CACpC,GAAI,CACF,OAAOi/G,IAAUj/G,CAAM,EAAIonP,GAAiBpnP,CAAM,EAAI,OAAO,UAAU,SAAS,KAAKA,CAAM,CAC5F,MAAa,CACZ,MAAO,WACR,CACH,CAGA,SAASkqP,GAAiB9wP,EAAK,CAC7B,GAAI,OAAOA,GAAQ,UAAYA,IAAQ,KAAM,CAC3C,MAAMixP,EAAiB,CAAA,EACvB,UAAWliJ,KAAY/uG,EACjB,OAAO,UAAU,eAAe,KAAKA,EAAK+uG,CAAQ,IACpDkiJ,EAAeliJ,CAAQ,EAAK/uG,EAAM+uG,CAAQ,GAG9C,OAAOkiJ,CACX,KACI,OAAO,EAEX,CAOA,SAASC,IAA+BhwG,EAAWx0C,EAAY,GAAI,CACjE,MAAM/1F,EAAO,OAAO,KAAKk6O,GAAqB3vG,CAAS,CAAC,EACxDvqI,EAAK,KAAI,EAET,MAAMw6O,EAAWx6O,EAAK,CAAC,EAEvB,GAAI,CAACw6O,EACH,MAAO,uBAGT,GAAIA,EAAS,QAAUzkJ,EACrB,OAAOof,GAASqlI,EAAUzkJ,CAAS,EAGrC,QAAS0kJ,EAAez6O,EAAK,OAAQy6O,EAAe,EAAGA,IAAgB,CACrE,MAAMC,EAAa16O,EAAK,MAAM,EAAGy6O,CAAY,EAAE,KAAK,IAAI,EACxD,GAAI,EAAAC,EAAW,OAAS3kJ,GAGxB,OAAI0kJ,IAAiBz6O,EAAK,OACjB06O,EAEFvlI,GAASulI,EAAY3kJ,CAAS,CACtC,CAED,MAAO,EACT,CAQA,SAAS4kJ,GAAkBhvE,EAAY,CAOrC,OAAOivE,GAAmBjvE,EAHH,IAAI,GAGyB,CACtD,CAEA,SAASivE,GAAmBjvE,EAAYkvE,EAAgB,CACtD,GAAIC,IAAOnvE,CAAU,EAAG,CAEtB,MAAMovE,EAAUF,EAAe,IAAIlvE,CAAU,EAC7C,GAAIovE,IAAY,OACd,OAAOA,EAGT,MAAM18G,EAAc,CAAA,EAEpBw8G,EAAe,IAAIlvE,EAAYttC,CAAW,EAE1C,UAAW53I,KAAO,OAAO,oBAAoBklL,CAAU,EACjD,OAAOA,EAAWllL,CAAG,EAAM,MAC7B43I,EAAY53I,CAAG,EAAIm0P,GAAmBjvE,EAAWllL,CAAG,EAAGo0P,CAAc,GAIzE,OAAOx8G,CACR,CAED,GAAI,MAAM,QAAQstC,CAAU,EAAG,CAE7B,MAAMovE,EAAUF,EAAe,IAAIlvE,CAAU,EAC7C,GAAIovE,IAAY,OACd,OAAOA,EAGT,MAAM18G,EAAc,CAAA,EAEpB,OAAAw8G,EAAe,IAAIlvE,EAAYttC,CAAW,EAE1CstC,EAAW,QAAS3hL,GAAS,CAC3Bq0I,EAAY,KAAKu8G,GAAmB5wP,EAAM6wP,CAAc,CAAC,CAC/D,CAAK,EAEMx8G,CACR,CAED,OAAOstC,CACT,CAEA,SAASmvE,IAAOn5M,EAAO,CACrB,GAAI,CAAC35C,GAAc25C,CAAK,EACtB,MAAO,GAGT,GAAI,CACF,MAAMj3C,EAAQ,OAAO,eAAei3C,CAAK,EAAI,YAAY,KACzD,MAAO,CAACj3C,GAAQA,IAAS,QAC1B,MAAW,CACV,MAAO,EACR,CACH,CClQA,MAAMswP,GAAyB,GACzBC,GAAmB,IAEnBC,GAAuB,kBACvBC,GAAqB,kCAS3B,SAASC,MAAqBC,EAAS,CACrC,MAAMC,EAAgBD,EAAQ,KAAK,CAAC1vP,EAAGC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,EAAE,IAAI+O,GAAKA,EAAE,CAAC,CAAC,EAEvE,MAAO,CAAComC,EAAOw6M,EAAiB,EAAGC,EAAc,IAAM,CACrD,MAAMC,EAAS,CAAA,EACTnnG,EAAQvzG,EAAM,MAAM;AAAA,CAAI,EAE9B,QAASh6C,EAAIw0P,EAAgBx0P,EAAIutJ,EAAM,OAAQvtJ,IAAK,CAClD,MAAMk6C,EAAOqzG,EAAMvtJ,CAAC,EAKpB,GAAIk6C,EAAK,OAAS,KAChB,SAKF,MAAMy6M,EAAcR,GAAqB,KAAKj6M,CAAI,EAAIA,EAAK,QAAQi6M,GAAsB,IAAI,EAAIj6M,EAIjG,GAAI,CAAAy6M,EAAY,MAAM,YAAY,EAIlC,WAAWrtL,KAAUitL,EAAe,CAClC,MAAMK,EAAQttL,EAAOqtL,CAAW,EAEhC,GAAIC,EAAO,CACTF,EAAO,KAAKE,CAAK,EACjB,KACD,CACF,CAED,GAAIF,EAAO,QAAUT,GAAyBQ,EAC5C,MAEH,CAED,OAAOI,IAA4BH,EAAO,MAAMD,CAAW,CAAC,CAChE,CACA,CAQA,SAASK,IAAkCC,EAAa,CACtD,OAAI,MAAM,QAAQA,CAAW,EACpBV,GAAkB,GAAGU,CAAW,EAElCA,CACT,CAQA,SAASF,IAA4B76M,EAAO,CAC1C,GAAI,CAACA,EAAM,OACT,MAAO,GAGT,MAAMg7M,EAAa,MAAM,KAAKh7M,CAAK,EAGnC,MAAI,gBAAgB,KAAKi7M,GAAkBD,CAAU,EAAE,UAAY,EAAE,GACnEA,EAAW,IAAG,EAIhBA,EAAW,QAAO,EAGdZ,GAAmB,KAAKa,GAAkBD,CAAU,EAAE,UAAY,EAAE,IACtEA,EAAW,IAAG,EAUVZ,GAAmB,KAAKa,GAAkBD,CAAU,EAAE,UAAY,EAAE,GACtEA,EAAW,IAAG,GAIXA,EAAW,MAAM,EAAGf,EAAsB,EAAE,IAAIW,IAAU,CAC/D,GAAGA,EACH,SAAUA,EAAM,UAAYK,GAAkBD,CAAU,EAAE,SAC1D,SAAUJ,EAAM,UAAYV,EAC7B,EAAC,CACJ,CAEA,SAASe,GAAkBn1P,EAAK,CAC9B,OAAOA,EAAIA,EAAI,OAAS,CAAC,GAAK,CAAA,CAChC,CAEA,MAAMo1P,GAAsB,cAK5B,SAASC,GAAgB7zP,EAAI,CAC3B,GAAI,CACF,MAAI,CAACA,GAAM,OAAOA,GAAO,WAChB4zP,GAEF5zP,EAAG,MAAQ4zP,EACnB,MAAW,CAGV,OAAOA,EACR,CACH,CAKA,SAASE,GAAmB5/O,EAAO,CACjC,MAAMguI,EAAYhuI,EAAM,UAExB,GAAIguI,EAAW,CACb,MAAMkxG,EAAS,CAAA,EACf,GAAI,CAEF,OAAAlxG,EAAU,OAAO,QAAQziJ,GAAS,CAE5BA,EAAM,WAAW,QAEnB2zP,EAAO,KAAK,GAAG3zP,EAAM,WAAW,MAAM,CAEhD,CAAO,EACM2zP,CACR,MAAa,CACZ,MACD,CACF,CAEH,CC5JA,MAAMtiF,GAAW,CAAA,EACXijF,GAAe,CAAA,EAGrB,SAASC,GAAWnsP,EAAM8M,EAAS,CACjCm8J,GAASjpK,CAAI,EAAIipK,GAASjpK,CAAI,GAAK,CAAA,EAClCipK,GAASjpK,CAAI,EAAI,KAAK8M,CAAO,CAChC,CAaA,SAASs/O,GAAgBpsP,EAAMqsP,EAAc,CACtCH,GAAalsP,CAAI,IACpBqsP,IACAH,GAAalsP,CAAI,EAAI,GAEzB,CAGA,SAASssP,GAAgBtsP,EAAMiP,EAAM,CACnC,MAAMs9O,EAAevsP,GAAQipK,GAASjpK,CAAI,EAC1C,GAAKusP,EAIL,UAAWz/O,KAAWy/O,EACpB,GAAI,CACFz/O,EAAQmC,CAAI,CACb,OAAQ8V,EAAG,CACVijO,IACEl1E,GAAO,MACL;AAAA,QAA0D9yK,CAAI;AAAA,QAAWgsP,GAAgBl/O,CAAO,CAAC;AAAA,QACjGiY,CACV,CACK,CAEL,CCvCA,SAASynO,IAAiC1/O,EAAS,CACjD,MAAM9M,EAAO,UACbmsP,GAAWnsP,EAAM8M,CAAO,EACxBs/O,GAAgBpsP,EAAMysP,GAAiB,CACzC,CAEA,SAASA,KAAoB,CACrB,YAAa9F,IAInBuB,GAAe,QAAQ,SAAU1lG,EAAO,CAChCA,KAASmkG,GAAW,SAI1BrvI,GAAKqvI,GAAW,QAASnkG,EAAO,SAAUgmG,EAAuB,CAC/D,OAAAL,GAAuB3lG,CAAK,EAAIgmG,EAEzB,YAAa1nP,EAAM,CAExBwrP,GAAgB,UADI,CAAE,KAAAxrP,EAAM,MAAA0hJ,EACU,EAEtC,MAAMkqG,EAAMvE,GAAuB3lG,CAAK,EACxCkqG,GAAOA,EAAI,MAAM/F,GAAW,QAAS7lP,CAAI,CACjD,CACA,CAAK,CACL,CAAG,CACH,CCnCA,MAAMmmP,GAASN,GAwDf,SAASgG,IAAgB,CACvB,GAAI,EAAE,UAAW1F,IACf,MAAO,GAGT,GAAI,CACF,WAAI,QACJ,IAAI,QAAQ,wBAAwB,EACpC,IAAI,SACG,EACR,MAAW,CACV,MAAO,EACR,CACH,CAMA,SAAS2F,GAAiBz4J,EAAM,CAC9B,OAAOA,GAAQ,mDAAmD,KAAKA,EAAK,SAAU,CAAA,CACxF,CAQA,SAAS04J,KAAsB,CAC7B,GAAI,OAAO,aAAgB,SACzB,MAAO,GAGT,GAAI,CAACF,GAAa,EAChB,MAAO,GAKT,GAAIC,GAAiB3F,GAAO,KAAK,EAC/B,MAAO,GAKT,IAAI9kP,EAAS,GACb,MAAM07B,EAAMopN,GAAO,SAEnB,GAAIppN,GAAO,OAAQA,EAAI,eAAoB,WACzC,GAAI,CACF,MAAMivN,EAAUjvN,EAAI,cAAc,QAAQ,EAC1CivN,EAAQ,OAAS,GACjBjvN,EAAI,KAAK,YAAYivN,CAAO,EACxBA,EAAQ,eAAiBA,EAAQ,cAAc,QAEjD3qP,EAASyqP,GAAiBE,EAAQ,cAAc,KAAK,GAEvDjvN,EAAI,KAAK,YAAYivN,CAAO,CAC7B,OAAQ3jP,EAAK,CACZ6+O,IACEl1E,GAAO,KAAK,kFAAmF3pK,CAAG,CACrG,CAGH,OAAOhH,CACT,CC5HA,MAAM4qP,GAAmB,IAYzB,SAASC,IAAyB,CAChC,OAAO,KAAK,IAAK,EAAGD,EACtB,CAQA,SAASE,KAAmC,CAC1C,KAAM,CAAE,YAAAC,CAAa,EAAGvG,GACxB,GAAI,CAACuG,GAAe,CAACA,EAAY,IAC/B,OAAOF,GAKT,MAAMG,EAA2B,KAAK,IAAK,EAAGD,EAAY,IAAG,EACvDE,EAAaF,EAAY,YAAc,KAAYC,EAA2BD,EAAY,WAWhG,MAAO,KACGE,EAAaF,EAAY,IAAG,GAAMH,EAE9C,CAWA,MAAMM,GAAqBJ,IAAgC,GAWrB,IAAM,CAK1C,KAAM,CAAE,YAAAC,CAAa,EAAGvG,GACxB,GAAI,CAACuG,GAAe,CAACA,EAAY,IAE/B,OAGF,MAAM9qD,EAAY,KAAO,IACnBkrD,EAAiBJ,EAAY,MAC7BK,EAAU,KAAK,MAGfC,EAAkBN,EAAY,WAChC,KAAK,IAAIA,EAAY,WAAaI,EAAiBC,CAAO,EAC1DnrD,EACEqrD,EAAuBD,EAAkBprD,EAQzCsrD,EAAkBR,EAAY,QAAUA,EAAY,OAAO,gBAG3DS,EAFqB,OAAOD,GAAoB,SAEJ,KAAK,IAAIA,EAAkBJ,EAAiBC,CAAO,EAAInrD,EACnGwrD,EAA4BD,EAAuBvrD,EAEzD,OAAIqrD,GAAwBG,EAEtBJ,GAAmBG,EAEdT,EAAY,WAGZQ,EAMJH,CACT,GAAC,ECrGD,SAASM,IACP/gP,EACAghP,EACA,CACA,MAAM9tP,EAAO,QACbmsP,GAAWnsP,EAAM8M,CAAO,EACxBs/O,GAAgBpsP,EAAM,IAAM+tP,IAAgB,OAAWD,CAAoB,CAAC,CAC9E,CAgBA,SAASC,IAAgBC,EAAiBF,EAAuB,GAAO,CAClEA,GAAwB,CAACjB,OAI7Bv1I,GAAKqvI,GAAY,QAAS,SAAUsH,EAAe,CACjD,OAAO,YAAantP,EAAM,CACxB,KAAM,CAAE,OAAAgD,EAAQ,IAAAw4D,CAAK,EAAG4xL,IAAeptP,CAAI,EACrCqtP,EAAc,CAClB,KAAArtP,EACA,UAAW,CACT,OAAAgD,EACA,IAAAw4D,CACD,EACD,eAAgB+wL,GAAkB,EAAK,GAC/C,EAGWW,GACH1B,GAAgB,QAAS,CACvB,GAAG6B,CACb,CAAS,EAUH,MAAMC,EAAoB,IAAI,MAAO,EAAC,MAGtC,OAAOH,EAAc,MAAMtH,GAAY7lP,CAAI,EAAE,KAC3C,MAAO45D,IACDszL,EACFA,EAAgBtzL,CAAQ,EAExB4xL,GAAgB,QAAS,CACvB,GAAG6B,EACH,aAAcd,GAAkB,EAAK,IACrC,SAAA3yL,CACd,CAAa,EAGIA,GAERh8C,GAAU,CACT,MAAA4tO,GAAgB,QAAS,CACvB,GAAG6B,EACH,aAAcd,GAAkB,EAAK,IACrC,MAAA3uO,CACZ,CAAW,EAEGs5D,GAAQt5D,CAAK,GAAKA,EAAM,QAAU,SAKpCA,EAAM,MAAQ0vO,EACdvE,GAAyBnrO,EAAO,cAAe,CAAC,GAM5CA,CACP,CACT,CACA,CACA,CAAG,CACH,CAuEA,SAAS41B,GAAQn7C,EAAKmyB,EAAM,CAC1B,MAAO,CAAC,CAACnyB,GAAO,OAAOA,GAAQ,UAAY,CAAC,CAAEA,EAAMmyB,CAAI,CAC1D,CAEA,SAAS+iO,GAAmBC,EAAU,CACpC,OAAI,OAAOA,GAAa,SACfA,EAGJA,EAIDh6M,GAAQg6M,EAAU,KAAK,EAClBA,EAAS,IAGdA,EAAS,SACJA,EAAS,WAGX,GAXE,EAYX,CAMA,SAASJ,IAAeK,EAAW,CACjC,GAAIA,EAAU,SAAW,EACvB,MAAO,CAAE,OAAQ,MAAO,IAAK,EAAE,EAGjC,GAAIA,EAAU,SAAW,EAAG,CAC1B,KAAM,CAACjyL,EAAK59D,CAAO,EAAI6vP,EAEvB,MAAO,CACL,IAAKF,GAAmB/xL,CAAG,EAC3B,OAAQhoB,GAAQ51C,EAAS,QAAQ,EAAI,OAAOA,EAAQ,MAAM,EAAE,YAAW,EAAK,KAClF,CACG,CAED,MAAMzF,EAAMs1P,EAAU,CAAC,EACvB,MAAO,CACL,IAAKF,GAAmBp1P,CAAK,EAC7B,OAAQq7C,GAAQr7C,EAAK,QAAQ,EAAI,OAAOA,EAAI,MAAM,EAAE,YAAW,EAAK,KACxE,CACA,CCjOA,IAAIu1P,GAAqB,KAQzB,SAASC,IAAqC3hP,EAAS,CACrD,MAAM9M,EAAO,QACbmsP,GAAWnsP,EAAM8M,CAAO,EACxBs/O,GAAgBpsP,EAAM0uP,GAAe,CACvC,CAEA,SAASA,KAAkB,CACzBF,GAAqB7H,GAAW,QAEhCA,GAAW,QAAU,SACnBx0M,EACAmqB,EACAvrB,EACAC,EACAtyB,EACA,CAUA,OAFA4tO,GAAgB,QAPI,CAClB,OAAAt7M,EACA,MAAAtyB,EACA,KAAAqyB,EACA,IAAAoB,EACA,IAAAmqB,CACN,CACwC,EAEhCkyL,IAAsB,CAACA,GAAmB,kBAErCA,GAAmB,MAAM,KAAM,SAAS,EAG1C,EACX,EAEE7H,GAAW,QAAQ,wBAA0B,EAC/C,CC1CA,IAAIgI,GAAkC,KAQtC,SAASC,IACP9hP,EACA,CACA,MAAM9M,EAAO,qBACbmsP,GAAWnsP,EAAM8M,CAAO,EACxBs/O,GAAgBpsP,EAAM6uP,GAA4B,CACpD,CAEA,SAASA,KAA+B,CACtCF,GAAkChI,GAAW,qBAE7CA,GAAW,qBAAuB,SAAU,EAAG,CAI7C,OAFA2F,GAAgB,qBADI,CAC6B,EAE7CqC,IAAmC,CAACA,GAAgC,kBAE/DA,GAAgC,MAAM,KAAM,SAAS,EAGvD,EACX,EAEEhI,GAAW,qBAAqB,wBAA0B,EAC5D,CCRA,SAASmI,KAAe,CAEM,MAAO,KACrC,CCxBA,SAASC,KAAc,CACrB,MAAMC,EAAa,OAAO,SAAY,WAChC/rG,EAAQ+rG,EAAa,IAAI,QAAY,CAAA,EAC3C,SAASl5I,EAAQ38G,EAAK,CACpB,GAAI61P,EACF,OAAI/rG,EAAM,IAAI9pJ,CAAG,EACR,IAET8pJ,EAAM,IAAI9pJ,CAAG,EACN,IAGT,QAAS,EAAI,EAAG,EAAI8pJ,EAAM,OAAQ,IAEhC,GADcA,EAAM,CAAC,IACP9pJ,EACZ,MAAO,GAGX,OAAA8pJ,EAAM,KAAK9pJ,CAAG,EACP,EACR,CAED,SAAS81P,EAAU91P,EAAK,CACtB,GAAI61P,EACF/rG,EAAM,OAAO9pJ,CAAG,MAEhB,SAAS,EAAI,EAAG,EAAI8pJ,EAAM,OAAQ,IAChC,GAAIA,EAAM,CAAC,IAAM9pJ,EAAK,CACpB8pJ,EAAM,OAAO,EAAG,CAAC,EACjB,KACD,CAGN,CACD,MAAO,CAACntC,EAASm5I,CAAS,CAC5B,CChCA,SAASC,IAAQ,CACf,MAAMpI,EAAMH,GACN7/F,EAASggG,EAAI,QAAUA,EAAI,SAEjC,IAAIqI,EAAgB,IAAM,KAAK,OAAM,EAAK,GAC1C,GAAI,CACF,GAAIroG,GAAUA,EAAO,WACnB,OAAOA,EAAO,WAAY,EAAC,QAAQ,KAAM,EAAE,EAEzCA,GAAUA,EAAO,kBACnBqoG,EAAgB,IAAM,CAKpB,MAAMnhJ,EAAa,IAAI,WAAW,CAAC,EACnC,OAAA84C,EAAO,gBAAgB94C,CAAU,EAE1BA,EAAW,CAAC,CAC3B,EAEG,MAAW,CAGX,CAID,OAAS,CAAC,GAAG,EAAM,IAAM,IAAM,IAAM,MAAM,QAAQ,SAAUx1G,IAEzDA,GAAQ22P,EAAa,EAAK,KAAS32P,EAAM,GAAK,SAAS,EAAE,CAC/D,CACA,CAEA,SAAS42P,GAAkB/iP,EAAO,CAChC,OAAOA,EAAM,WAAaA,EAAM,UAAU,OAASA,EAAM,UAAU,OAAO,CAAC,EAAI,MACjF,CAMA,SAASgjP,GAAoBhjP,EAAO,CAClC,KAAM,CAAE,QAAAssC,EAAS,SAAU22M,CAAO,EAAKjjP,EACvC,GAAIssC,EACF,OAAOA,EAGT,MAAM42M,EAAiBH,GAAkB/iP,CAAK,EAC9C,OAAIkjP,EACEA,EAAe,MAAQA,EAAe,MACjC,GAAGA,EAAe,IAAI,KAAKA,EAAe,KAAK,GAEjDA,EAAe,MAAQA,EAAe,OAASD,GAAW,YAE5DA,GAAW,WACpB,CASA,SAASE,GAAsBnjP,EAAOzU,EAAOoI,EAAM,CACjD,MAAMq6I,EAAahuI,EAAM,UAAYA,EAAM,WAAa,CAAA,EAClD/C,EAAU+wI,EAAU,OAASA,EAAU,QAAU,CAAA,EACjDk1G,EAAkBjmP,EAAO,CAAC,EAAIA,EAAO,CAAC,GAAK,CAAA,EAC5CimP,EAAe,QAClBA,EAAe,MAAQ33P,GAAS,IAE7B23P,EAAe,OAClBA,EAAe,KAAOvvP,GAAQ,QAElC,CASA,SAASyvP,GAAsBpjP,EAAOqjP,EAAc,CAClD,MAAMH,EAAiBH,GAAkB/iP,CAAK,EAC9C,GAAI,CAACkjP,EACH,OAGF,MAAMI,EAAmB,CAAE,KAAM,UAAW,QAAS,EAAI,EACnDC,EAAmBL,EAAe,UAGxC,GAFAA,EAAe,UAAY,CAAE,GAAGI,EAAkB,GAAGC,EAAkB,GAAGF,GAEtEA,GAAgB,SAAUA,EAAc,CAC1C,MAAMG,EAAa,CAAE,GAAID,GAAoBA,EAAiB,KAAO,GAAGF,EAAa,MACrFH,EAAe,UAAU,KAAOM,CACjC,CACH,CAoFA,SAASC,GAAwBz1G,EAAW,CAE1C,GAAIA,GAAcA,EAAY,oBAC5B,MAAO,GAGT,GAAI,CAGFwvG,GAAyBxvG,EAAY,sBAAuB,EAAI,CACjE,MAAa,CAEb,CAED,MAAO,EACT,CAQA,SAAS01G,GAASC,EAAY,CAC5B,OAAO,MAAM,QAAQA,CAAU,EAAIA,EAAa,CAACA,CAAU,CAC7D,CC/LA,SAASnuD,GAAUpwJ,EAAOp4B,EAAQ,IAAK42O,EAAgB,IAAW,CAChE,GAAI,CAEF,OAAO/1L,GAAM,GAAIzoB,EAAOp4B,EAAO42O,CAAa,CAC7C,OAAQ9mP,EAAK,CACZ,MAAO,CAAE,MAAO,yBAAyBA,CAAG,GAAG,CAChD,CACH,CAGA,SAAS+mP,GAEP1vP,EAEA6Y,EAAQ,EAER82O,EAAU,IAAM,KAChB,CACA,MAAMp2P,EAAa8nM,GAAUrhM,EAAQ6Y,CAAK,EAE1C,OAAI+2O,IAASr2P,CAAU,EAAIo2P,EAClBD,GAAgB1vP,EAAQ6Y,EAAQ,EAAG82O,CAAO,EAG5Cp2P,CACT,CAWA,SAASmgE,GACP3jE,EACAqB,EACAyhB,EAAQ,IACR42O,EAAgB,IAChBjzN,EAAO+xN,IAAa,EACpB,CACA,KAAM,CAACj5I,EAASm5I,CAAS,EAAIjyN,EAG7B,GACEplC,GAAS,MACT,CAAC,UAAW,QAAQ,EAAE,SAAS,OAAOA,CAAK,GAC1C,OAAOA,GAAU,UAAY,OAAO,SAASA,CAAK,EAEnD,OAAOA,EAGT,MAAMy4P,EAAcC,IAAe/5P,EAAKqB,CAAK,EAI7C,GAAI,CAACy4P,EAAY,WAAW,UAAU,EACpC,OAAOA,EAQT,GAAKz4P,EAAQ,8BACX,OAAOA,EAMT,MAAM24P,EACJ,OAAQ34P,EAAQ,yCAA+C,SACzDA,EAAQ,wCACVyhB,EAGN,GAAIk3O,IAAmB,EAErB,OAAOF,EAAY,QAAQ,UAAW,EAAE,EAI1C,GAAIv6I,EAAQl+G,CAAK,EACf,MAAO,eAIT,MAAM44P,EAAkB54P,EACxB,GAAI44P,GAAmB,OAAOA,EAAgB,QAAW,WACvD,GAAI,CACF,MAAMC,EAAYD,EAAgB,SAElC,OAAOt2L,GAAM,GAAIu2L,EAAWF,EAAiB,EAAGN,EAAejzN,CAAI,CACpE,MAAa,CAEb,CAMH,MAAMjjC,EAAc,MAAM,QAAQnC,CAAK,EAAI,CAAA,EAAK,CAAA,EAChD,IAAI84P,EAAW,EAIf,MAAMC,EAAY3G,GAAqBpyP,GAEvC,UAAWg5P,KAAYD,EAAW,CAEhC,GAAI,CAAC,OAAO,UAAU,eAAe,KAAKA,EAAWC,CAAQ,EAC3D,SAGF,GAAIF,GAAYT,EAAe,CAC7Bl2P,EAAW62P,CAAQ,EAAI,oBACvB,KACD,CAGD,MAAMC,EAAaF,EAAUC,CAAQ,EACrC72P,EAAW62P,CAAQ,EAAI12L,GAAM02L,EAAUC,EAAYN,EAAiB,EAAGN,EAAejzN,CAAI,EAE1F0zN,GACD,CAGD,OAAAzB,EAAUr3P,CAAK,EAGRmC,CACT,CAYA,SAASu2P,IACP/5P,EAGAqB,EACA,CACA,GAAI,CACF,GAAIrB,IAAQ,UAAYqB,GAAS,OAAOA,GAAU,UAAaA,EAAQ,QACrE,MAAO,WAGT,GAAIrB,IAAQ,gBACV,MAAO,kBAMT,GAAI,OAAO,OAAW,KAAeqB,IAAU,OAC7C,MAAO,WAIT,GAAI,OAAO,OAAW,KAAeA,IAAU,OAC7C,MAAO,WAIT,GAAI,OAAO,SAAa,KAAeA,IAAU,SAC/C,MAAO,aAGT,GAAIotP,GAAeptP,CAAK,EACtB,MAAO,iBAIT,GAAImtP,IAAiBntP,CAAK,EACxB,MAAO,mBAGT,GAAI,OAAOA,GAAU,UAAY,CAAC,OAAO,SAASA,CAAK,EACrD,MAAO,IAAIA,CAAK,IAGlB,GAAI,OAAOA,GAAU,WACnB,MAAO,cAAco0P,GAAgBp0P,CAAK,CAAC,IAG7C,GAAI,OAAOA,GAAU,SACnB,MAAO,IAAI,OAAOA,CAAK,CAAC,IAI1B,GAAI,OAAOA,GAAU,SACnB,MAAO,YAAY,OAAOA,CAAK,CAAC,IAOlC,MAAMk5P,EAAUC,IAAmBn5P,CAAK,EAGxC,MAAI,qBAAqB,KAAKk5P,CAAO,EAC5B,iBAAiBA,CAAO,IAG1B,WAAWA,CAAO,GAC1B,OAAQ3nP,EAAK,CACZ,MAAO,yBAAyBA,CAAG,GACpC,CACH,CAGA,SAAS4nP,IAAmBn5P,EAAO,CACjC,MAAM0+D,EAAY,OAAO,eAAe1+D,CAAK,EAE7C,OAAO0+D,EAAYA,EAAU,YAAY,KAAO,gBAClD,CAGA,SAAS06L,IAAWp5P,EAAO,CAEzB,MAAO,CAAC,CAAC,UAAUA,CAAK,EAAE,MAAM,OAAO,EAAE,MAC3C,CAIA,SAASw4P,IAASx4P,EAAO,CACvB,OAAOo5P,IAAW,KAAK,UAAUp5P,CAAK,CAAC,CACzC,CClQA,IAAIq5P,IAAS,SAAUA,EAAQ,CAEVA,EAAOA,EAAO,QAAa,CAAO,EAAI,UAEzD,MAAMC,EAAW,EAAGD,EAAOA,EAAO,SAAcC,CAAQ,EAAI,WAE5D,MAAMC,EAAW,EAAGF,EAAOA,EAAO,SAAcE,CAAQ,EAAI,UAC9D,GAAGF,KAAWA,GAAS,CAAE,EAAC,EAU1B,SAASG,GAAoBx5P,EAAO,CAClC,OAAO,IAAIy5P,GAAYh/O,GAAW,CAChCA,EAAQza,CAAK,CACjB,CAAG,CACH,CAQA,SAAS05P,GAAoB9rL,EAAQ,CACnC,OAAO,IAAI6rL,GAAY,CAAC94P,EAAG+lB,IAAW,CACpCA,EAAOknD,CAAM,CACjB,CAAG,CACH,CAMA,MAAM6rL,EAAY,CAEf,YACC7oL,EACA,CAAC6oL,GAAY,UAAU,OAAO,KAAK,IAAI,EAAEA,GAAY,UAAU,QAAQ,KAAK,IAAI,EAAEA,GAAY,UAAU,QAAQ,KAAK,IAAI,EAAEA,GAAY,UAAU,QAAQ,KAAK,IAAI,EAClK,KAAK,OAASJ,GAAO,QACrB,KAAK,UAAY,GAEjB,GAAI,CACFzoL,EAAS,KAAK,SAAU,KAAK,OAAO,CACrC,OAAQzjD,EAAG,CACV,KAAK,QAAQA,CAAC,CACf,CACF,CAGA,KACC2jD,EACA6oL,EACA,CACA,OAAO,IAAIF,GAAY,CAACh/O,EAASiM,IAAW,CAC1C,KAAK,UAAU,KAAK,CAClB,GACAnc,GAAU,CACR,GAAI,CAACumE,EAGHr2D,EAAQlQ,CAAM,MAEd,IAAI,CACFkQ,EAAQq2D,EAAYvmE,CAAM,CAAC,CAC5B,OAAQ4iB,EAAG,CACVzG,EAAOyG,CAAC,CACT,CAEJ,EACDygD,GAAU,CACR,GAAI,CAAC+rL,EACHjzO,EAAOknD,CAAM,MAEb,IAAI,CACFnzD,EAAQk/O,EAAW/rL,CAAM,CAAC,CAC3B,OAAQzgD,EAAG,CACVzG,EAAOyG,CAAC,CACT,CAEJ,CACT,CAAO,EACD,KAAK,iBAAgB,CAC3B,CAAK,CACF,CAGA,MACCwsO,EACA,CACA,OAAO,KAAK,KAAKt7P,GAAOA,EAAKs7P,CAAU,CACxC,CAGA,QAAQC,EAAW,CAClB,OAAO,IAAIH,GAAY,CAACh/O,EAASiM,IAAW,CAC1C,IAAIroB,EACAw7P,EAEJ,OAAO,KAAK,KACV75P,GAAS,CACP65P,EAAa,GACbx7P,EAAM2B,EACF45P,GACFA,GAEH,EACDhsL,GAAU,CACRisL,EAAa,GACbx7P,EAAMuvE,EACFgsL,GACFA,GAEH,CACF,EAAC,KAAK,IAAM,CACX,GAAIC,EAAY,CACdnzO,EAAOroB,CAAG,EACV,MACD,CAEDoc,EAAQpc,CAAG,CACnB,CAAO,CACP,CAAK,CACF,CAGC,QAAS,CAAC,KAAK,SAAY2B,GAAU,CACrC,KAAK,WAAWq5P,GAAO,SAAUr5P,CAAK,CAC1C,CAAI,CAGA,SAAU,CAAC,KAAK,QAAW4tE,GAAW,CACtC,KAAK,WAAWyrL,GAAO,SAAUzrL,CAAM,CAC3C,CAAI,CAGA,SAAU,CAAC,KAAK,WAAa,CAACtrD,EAAOtiB,IAAU,CAC/C,GAAI,KAAK,SAAWq5P,GAAO,QAI3B,IAAI52L,GAAWziE,CAAK,EAAG,CACfA,EAAQ,KAAK,KAAK,SAAU,KAAK,OAAO,EAC9C,MACD,CAED,KAAK,OAASsiB,EACd,KAAK,OAAStiB,EAEd,KAAK,iBAAgB,EACzB,CAAI,CAGA,SAAU,CAAC,KAAK,iBAAmB,IAAM,CACzC,GAAI,KAAK,SAAWq5P,GAAO,QACzB,OAGF,MAAMS,EAAiB,KAAK,UAAU,MAAK,EAC3C,KAAK,UAAY,GAEjBA,EAAe,QAAQ5kP,GAAW,CAC5BA,EAAQ,CAAC,IAIT,KAAK,SAAWmkP,GAAO,UACzBnkP,EAAQ,CAAC,EAAE,KAAK,MAAM,EAGpB,KAAK,SAAWmkP,GAAO,UACzBnkP,EAAQ,CAAC,EAAE,KAAK,MAAM,EAGxBA,EAAQ,CAAC,EAAI,GACnB,CAAK,CACL,CAAI,CACJ,CCrLA,SAAS6kP,IAAkBhuI,EAAO,CAChC,MAAM13G,EAAS,CAAA,EAEf,SAAS2lP,GAAU,CACjB,OAAOjuI,IAAU,QAAa13G,EAAO,OAAS03G,CAC/C,CAQD,SAASjtH,EAAOm7P,EAAM,CACpB,OAAO5lP,EAAO,OAAOA,EAAO,QAAQ4lP,CAAI,EAAG,CAAC,EAAE,CAAC,GAAK,QAAQ,QAAQ,MAAS,CAC9E,CAYD,SAASzuP,EAAI0uP,EAAc,CACzB,GAAI,CAACF,EAAO,EACV,OAAON,GAAoB,IAAI7H,GAAY,sDAAsD,CAAC,EAIpG,MAAMoI,EAAOC,IACb,OAAI7lP,EAAO,QAAQ4lP,CAAI,IAAM,IAC3B5lP,EAAO,KAAK4lP,CAAI,EAEbA,EACF,KAAK,IAAMn7P,EAAOm7P,CAAI,CAAC,EAIvB,KAAK,KAAM,IACVn7P,EAAOm7P,CAAI,EAAE,KAAK,KAAM,IAAM,CAEtC,CAAS,CACT,EACWA,CACR,CAWD,SAASE,EAAMv9O,EAAS,CACtB,OAAO,IAAI68O,GAAY,CAACh/O,EAASiM,IAAW,CAC1C,IAAI0zO,EAAU/lP,EAAO,OAErB,GAAI,CAAC+lP,EACH,OAAO3/O,EAAQ,EAAI,EAIrB,MAAM4/O,EAAqB,WAAW,IAAM,CACtCz9O,GAAWA,EAAU,GACvBnC,EAAQ,EAAK,CAEhB,EAAEmC,CAAO,EAGVvI,EAAO,QAAQnS,GAAQ,CAChBs3P,GAAoBt3P,CAAI,EAAE,KAAK,IAAM,CACnC,EAAEk4P,IACL,aAAaC,CAAkB,EAC/B5/O,EAAQ,EAAI,EAEf,EAAEiM,CAAM,CACjB,CAAO,CACP,CAAK,CACF,CAED,MAAO,CACL,EAAGrS,EACH,IAAA7I,EACA,MAAA2uP,CACJ,CACA,CC3FA,SAASG,GAAS51L,EAAK,CACrB,GAAI,CAACA,EACH,MAAO,GAGT,MAAMxsC,EAAQwsC,EAAI,MAAM,8DAA8D,EAEtF,GAAI,CAACxsC,EACH,MAAO,GAIT,MAAMw6C,EAAQx6C,EAAM,CAAC,GAAK,GACpBqiO,EAAWriO,EAAM,CAAC,GAAK,GAC7B,MAAO,CACL,KAAMA,EAAM,CAAC,EACb,KAAMA,EAAM,CAAC,EACb,SAAUA,EAAM,CAAC,EACjB,OAAQw6C,EACR,KAAM6nL,EACN,SAAUriO,EAAM,CAAC,EAAIw6C,EAAQ6nL,CACjC,CACA,CCnBA,MAAMC,IAAsB,CAAC,QAAS,QAAS,UAAW,MAAO,OAAQ,OAAO,EAQhF,SAASC,IAAwB7vG,EAAO,CACtC,OAAQA,IAAU,OAAS,UAAY4vG,IAAoB,SAAS5vG,CAAK,EAAIA,EAAQ,KACvF,CCdA,MAAM8vG,IAA4B,UAE5BC,IAAkC,WAgBxC,SAASC,IAEPC,EACA,CACA,MAAMC,EAAgBC,IAAmBF,CAAa,EAEtD,GAAI,CAACC,EACH,OAIF,MAAME,EAAyB,OAAO,QAAQF,CAAa,EAAE,OAAO,CAACrsK,EAAK,CAAC9vF,EAAKqB,CAAK,IAAM,CACzF,GAAIrB,EAAI,MAAMg8P,GAA+B,EAAG,CAC9C,MAAMM,EAAiBt8P,EAAI,MAAM+7P,IAA0B,MAAM,EACjEjsK,EAAIwsK,CAAc,EAAIj7P,CACvB,CACD,OAAOyuF,CACR,EAAE,CAAE,CAAA,EAIL,GAAI,OAAO,KAAKusK,CAAsB,EAAE,OAAS,EAC/C,OAAOA,CAIX,CAoCA,SAASD,IACPF,EACA,CACA,GAAI,GAACA,GAAkB,CAACl7P,GAASk7P,CAAa,GAAK,CAAC,MAAM,QAAQA,CAAa,GAI/E,OAAI,MAAM,QAAQA,CAAa,EAEtBA,EAAc,OAAO,CAACpsK,EAAKysK,IAAS,CACzC,MAAMC,EAAoBC,GAAsBF,CAAI,EACpD,cAAO,QAAQC,CAAiB,EAAE,QAAQ,CAAC,CAACx8P,EAAKqB,CAAK,IAAM,CAC1DyuF,EAAI9vF,CAAG,EAAIqB,CACnB,CAAO,EACMyuF,CACR,EAAE,CAAE,CAAA,EAGA2sK,GAAsBP,CAAa,CAC5C,CAQA,SAASO,GAAsBP,EAAe,CAC5C,OAAOA,EACJ,MAAM,GAAG,EACT,IAAIQ,GAAgBA,EAAa,MAAM,GAAG,EAAE,IAAIC,GAAc,mBAAmBA,EAAW,KAAI,CAAE,CAAC,CAAC,EACpG,OAAO,CAAC7sK,EAAK,CAAC9vF,EAAKqB,CAAK,KACnBrB,GAAOqB,IACTyuF,EAAI9vF,CAAG,EAAIqB,GAENyuF,GACN,CAAE,CAAA,CACT,CCjHA,SAAS8sK,GAAe/0L,EAAS9J,EAAQ,GAAI,CAC3C,MAAO,CAAC8J,EAAS9J,CAAK,CACxB,CAOA,SAAS8+L,IAAkBC,EAAUC,EAAS,CAC5C,KAAM,CAACl1L,EAAS9J,CAAK,EAAI++L,EACzB,MAAO,CAACj1L,EAAS,CAAC,GAAG9J,EAAOg/L,CAAO,CAAC,CACtC,CAQA,SAASC,GACPF,EACA3vP,EACA,CACA,MAAM8vP,EAAgBH,EAAS,CAAC,EAEhC,UAAWI,KAAgBD,EAAe,CACxC,MAAME,EAAmBD,EAAa,CAAC,EAAE,KAGzC,GAFe/vP,EAAS+vP,EAAcC,CAAgB,EAGpD,MAAO,EAEV,CAED,MAAO,EACT,CAYA,SAASC,GAAWliN,EAAO,CACzB,OAAOk1M,GAAW,YAAcA,GAAW,WAAW,eAClDA,GAAW,WAAW,eAAel1M,CAAK,EAC1C,IAAI,YAAa,EAAC,OAAOA,CAAK,CACpC,CAcA,SAASmiN,IAAkBP,EAAU,CACnC,KAAM,CAACQ,EAAYv/L,CAAK,EAAI++L,EAG5B,IAAI78G,EAAQ,KAAK,UAAUq9G,CAAU,EAErC,SAASC,EAAOn/O,EAAM,CAChB,OAAO6hI,GAAU,SACnBA,EAAQ,OAAO7hI,GAAS,SAAW6hI,EAAQ7hI,EAAO,CAACg/O,GAAWn9G,CAAK,EAAG7hI,CAAI,EAE1E6hI,EAAM,KAAK,OAAO7hI,GAAS,SAAWg/O,GAAWh/O,CAAI,EAAIA,CAAI,CAEhE,CAED,UAAW7a,KAAQw6D,EAAO,CACxB,KAAM,CAACy/L,EAAahrL,CAAO,EAAIjvE,EAI/B,GAFAg6P,EAAO;AAAA,EAAK,KAAK,UAAUC,CAAW,CAAC;AAAA,CAAI,EAEvC,OAAOhrL,GAAY,UAAYA,aAAmB,WACpD+qL,EAAO/qL,CAAO,MACT,CACL,IAAIirL,EACJ,GAAI,CACFA,EAAqB,KAAK,UAAUjrL,CAAO,CAC5C,MAAW,CAIVirL,EAAqB,KAAK,UAAUnyD,GAAU94H,CAAO,CAAC,CACvD,CACD+qL,EAAOE,CAAkB,CAC1B,CACF,CAED,OAAO,OAAOx9G,GAAU,SAAWA,EAAQy9G,IAAcz9G,CAAK,CAChE,CAEA,SAASy9G,IAAcC,EAAS,CAC9B,MAAMC,EAAcD,EAAQ,OAAO,CAAC7tK,EAAKyzE,IAAQzzE,EAAMyzE,EAAI,OAAQ,CAAC,EAE9DvxI,EAAS,IAAI,WAAW4rO,CAAW,EACzC,IAAI5iN,EAAS,EACb,UAAWtlC,KAAUioP,EACnB3rO,EAAO,IAAItc,EAAQslC,CAAM,EACzBA,GAAUtlC,EAAO,OAGnB,OAAOsc,CACT,CA0CA,SAAS6rO,IAAuBC,EAAU,CAKxC,MAAO,CAJa,CAClB,KAAM,MACV,EAEuBA,CAAQ,CAC/B,CAKA,SAASC,IAA6BC,EAAY,CAChD,MAAMtoP,EAAS,OAAOsoP,EAAW,MAAS,SAAWZ,GAAWY,EAAW,IAAI,EAAIA,EAAW,KAE9F,MAAO,CACL9J,GAAkB,CAChB,KAAM,aACN,OAAQx+O,EAAO,OACf,SAAUsoP,EAAW,SACrB,aAAcA,EAAW,YACzB,gBAAiBA,EAAW,cAClC,CAAK,EACDtoP,CACJ,CACA,CAEA,MAAMuoP,IAAiC,CACrC,QAAS,UACT,SAAU,UACV,WAAY,aACZ,YAAa,cACb,MAAO,QACP,cAAe,WACf,YAAa,UACb,QAAS,UACT,cAAe,UACf,aAAc,SACd,iBAAkB,SAClB,SAAU,UACV,SAAU,WACV,KAAM,OACN,OAAQ,eACV,EAKA,SAASC,GAA+Bz0P,EAAM,CAC5C,OAAOw0P,IAA+Bx0P,CAAI,CAC5C,CAGA,SAAS00P,GAAgCC,EAAiB,CACxD,GAAI,CAACA,GAAmB,CAACA,EAAgB,IACvC,OAEF,KAAM,CAAE,KAAAn6P,EAAM,QAAA0uB,GAAYyrO,EAAgB,IAC1C,MAAO,CAAE,KAAAn6P,EAAM,QAAA0uB,EACjB,CAMA,SAAS0rO,IACPvoP,EACAwoP,EACAC,EACAjM,EACA,CACA,MAAM+J,EAAyBvmP,EAAM,uBAAyBA,EAAM,sBAAsB,uBAC1F,MAAO,CACL,SAAUA,EAAM,SAChB,QAAS,IAAI,KAAM,EAAC,YAAa,EACjC,GAAIwoP,GAAW,CAAE,IAAKA,GACtB,GAAI,CAAC,CAACC,GAAUjM,GAAO,CAAE,IAAKD,GAAYC,CAAG,GAC7C,GAAI+J,GAA0B,CAC5B,MAAOnI,GAAkB,CAAE,GAAGmI,EAAwB,CAC5D,CACA,CACA,CC/OA,SAASmC,IACPC,EACAnM,EACAlkK,EACA,CACA,MAAMswK,EAAmB,CACvB,CAAE,KAAM,eAAiB,EACzB,CACE,UAAWtwK,GAAaqoK,GAAwB,EAChD,iBAAAgI,CACD,CACL,EACE,OAAO7B,GAAetK,EAAM,CAAE,IAAAA,CAAK,EAAG,GAAI,CAACoM,CAAgB,CAAC,CAC9D,CCnBA,MAAMC,IAAsB,GAAK,IAQjC,SAASC,IAAsBxnM,EAAQ8V,EAAM,KAAK,IAAG,EAAI,CACvD,MAAM2xL,EAAc,SAAS,GAAGznM,CAAM,GAAI,EAAE,EAC5C,GAAI,CAAC,MAAMynM,CAAW,EACpB,OAAOA,EAAc,IAGvB,MAAMC,EAAa,KAAK,MAAM,GAAG1nM,CAAM,EAAE,EACzC,OAAK,MAAM0nM,CAAU,EAIdH,IAHEG,EAAa5xL,CAIxB,CASA,SAAS6xL,IAAcC,EAAQC,EAAc,CAC3C,OAAOD,EAAOC,CAAY,GAAKD,EAAO,KAAO,CAC/C,CAKA,SAASE,IAAcF,EAAQC,EAAc/xL,EAAM,KAAK,IAAG,EAAI,CAC7D,OAAO6xL,IAAcC,EAAQC,CAAY,EAAI/xL,CAC/C,CAOA,SAASiyL,IACPH,EACA,CAAE,WAAA9O,EAAY,QAAAroL,CAAS,EACvBqF,EAAM,KAAK,IAAK,EAChB,CACA,MAAMkyL,EAAoB,CACxB,GAAGJ,CACP,EAIQK,EAAkBx3L,GAAWA,EAAQ,sBAAsB,EAC3Dy3L,EAAmBz3L,GAAWA,EAAQ,aAAa,EAEzD,GAAIw3L,EAeF,UAAWjyI,KAASiyI,EAAgB,KAAI,EAAG,MAAM,GAAG,EAAG,CACrD,KAAM,CAAC/jD,EAAYikD,IAAgBC,CAAU,EAAIpyI,EAAM,MAAM,IAAK,CAAC,EAC7DyxI,EAAc,SAASvjD,EAAY,EAAE,EACrC/zL,GAAU,MAAMs3O,CAAW,EAAkB,GAAdA,GAAoB,IACzD,GAAI,CAACU,EACHH,EAAkB,IAAMlyL,EAAM3lD,MAE9B,WAAWsrH,KAAY0sH,EAAW,MAAM,GAAG,EACrC1sH,IAAa,iBAEX,CAAC2sH,GAAcA,EAAW,MAAM,GAAG,EAAE,SAAS,QAAQ,KACxDJ,EAAkBvsH,CAAQ,EAAI3lE,EAAM3lD,GAGtC63O,EAAkBvsH,CAAQ,EAAI3lE,EAAM3lD,CAI3C,MACQ+3O,EACTF,EAAkB,IAAMlyL,EAAM0xL,IAAsBU,EAAkBpyL,CAAG,EAChEgjL,IAAe,MACxBkP,EAAkB,IAAMlyL,EAAM,GAAK,KAGrC,OAAOkyL,CACT,CCjGA,SAASK,IAA6B,CACpC,MAAO,CACL,QAAS9G,GAAO,EAChB,OAAQA,GAAK,EAAG,UAAU,EAAE,CAChC,CACA,CCJA,MAAMjI,GAASN,GAQf,SAASsP,KAAkB,CAMzB,MAAMC,EAAajP,GAAS,OACtBkP,EAAsBD,GAAaA,EAAU,KAAOA,EAAU,IAAI,QAElEE,EAAgB,YAAanP,IAAU,CAAC,CAACA,GAAO,QAAQ,WAAa,CAAC,CAACA,GAAO,QAAQ,aAE5F,MAAO,CAACkP,GAAuBC,CACjC,CCrBA,MAAMpO,GAAe,OAAO,iBAAqB,KAAe,iBCShE,SAASqO,IAAiB,CAExB,OAAAC,GAAiB3P,EAAU,EACpBA,EACT,CAGA,SAAS2P,GAAiBC,EAAS,CACjC,MAAMxP,EAAcwP,EAAQ,WAAaA,EAAQ,YAAc,CAAA,EAG/D,OAAAxP,EAAW,QAAUA,EAAW,SAAWL,GAInCK,EAAWL,EAAW,EAAIK,EAAWL,EAAW,GAAK,CAAA,CAC/D,CCpBA,SAAS8P,IAAY1tO,EAAS,CAE5B,MAAM2tO,EAAepJ,KAEf3oF,EAAU,CACd,IAAKwqF,GAAO,EACZ,KAAM,GACN,UAAWuH,EACX,QAASA,EACT,SAAU,EACV,OAAQ,KACR,OAAQ,EACR,eAAgB,GAChB,OAAQ,IAAMC,IAAchyF,CAAO,CACvC,EAEE,OAAI57I,GACF6tO,GAAcjyF,EAAS57I,CAAO,EAGzB47I,CACT,CAcA,SAASiyF,GAAcjyF,EAAS57I,EAAU,GAAI,CAiC5C,GAhCIA,EAAQ,OACN,CAAC47I,EAAQ,WAAa57I,EAAQ,KAAK,aACrC47I,EAAQ,UAAY57I,EAAQ,KAAK,YAG/B,CAAC47I,EAAQ,KAAO,CAAC57I,EAAQ,MAC3B47I,EAAQ,IAAM57I,EAAQ,KAAK,IAAMA,EAAQ,KAAK,OAASA,EAAQ,KAAK,WAIxE47I,EAAQ,UAAY57I,EAAQ,WAAaukO,GAAkB,EAEvDvkO,EAAQ,qBACV47I,EAAQ,mBAAqB57I,EAAQ,oBAGnCA,EAAQ,iBACV47I,EAAQ,eAAiB57I,EAAQ,gBAE/BA,EAAQ,MAEV47I,EAAQ,IAAM57I,EAAQ,IAAI,SAAW,GAAKA,EAAQ,IAAMomO,MAEtDpmO,EAAQ,OAAS,SACnB47I,EAAQ,KAAO57I,EAAQ,MAErB,CAAC47I,EAAQ,KAAO57I,EAAQ,MAC1B47I,EAAQ,IAAM,GAAG57I,EAAQ,GAAG,IAE1B,OAAOA,EAAQ,SAAY,WAC7B47I,EAAQ,QAAU57I,EAAQ,SAExB47I,EAAQ,eACVA,EAAQ,SAAW,eACV,OAAO57I,EAAQ,UAAa,SACrC47I,EAAQ,SAAW57I,EAAQ,aACtB,CACL,MAAMiW,EAAW2lI,EAAQ,UAAYA,EAAQ,QAC7CA,EAAQ,SAAW3lI,GAAY,EAAIA,EAAW,CAC/C,CACGjW,EAAQ,UACV47I,EAAQ,QAAU57I,EAAQ,SAExBA,EAAQ,cACV47I,EAAQ,YAAc57I,EAAQ,aAE5B,CAAC47I,EAAQ,WAAa57I,EAAQ,YAChC47I,EAAQ,UAAY57I,EAAQ,WAE1B,CAAC47I,EAAQ,WAAa57I,EAAQ,YAChC47I,EAAQ,UAAY57I,EAAQ,WAE1B,OAAOA,EAAQ,QAAW,WAC5B47I,EAAQ,OAAS57I,EAAQ,QAEvBA,EAAQ,SACV47I,EAAQ,OAAS57I,EAAQ,OAE7B,CAaA,SAAS8tO,IAAalyF,EAAS7lG,EAAQ,CACrC,IAAI/1C,EAAU,CAAA,EACV+1C,EACF/1C,EAAU,CAAE,OAAA+1C,GACH6lG,EAAQ,SAAW,OAC5B57I,EAAU,CAAE,OAAQ,WAGtB6tO,GAAcjyF,EAAS57I,CAAO,CAChC,CAWA,SAAS4tO,IAAchyF,EAAS,CAC9B,OAAO+lF,GAAkB,CACvB,IAAK,GAAG/lF,EAAQ,GAAG,GACnB,KAAMA,EAAQ,KAEd,QAAS,IAAI,KAAKA,EAAQ,QAAU,GAAI,EAAE,YAAa,EACvD,UAAW,IAAI,KAAKA,EAAQ,UAAY,GAAI,EAAE,YAAa,EAC3D,OAAQA,EAAQ,OAChB,OAAQA,EAAQ,OAChB,IAAK,OAAOA,EAAQ,KAAQ,UAAY,OAAOA,EAAQ,KAAQ,SAAW,GAAGA,EAAQ,GAAG,GAAK,OAC7F,SAAUA,EAAQ,SAClB,mBAAoBA,EAAQ,mBAC5B,MAAO,CACL,QAASA,EAAQ,QACjB,YAAaA,EAAQ,YACrB,WAAYA,EAAQ,UACpB,WAAYA,EAAQ,SACrB,CACL,CAAG,CACH,CC1JA,MAAMmyF,GAAmB,cAMzB,SAASC,GAAiBx5P,EAAOy5P,EAAM,CACjCA,EACFlN,GAAyBvsP,EAAQu5P,GAAkBE,CAAI,EAGvD,OAAQz5P,EAAQu5P,EAAgB,CAEpC,CAMA,SAASG,GAAiB15P,EAAO,CAC/B,OAAOA,EAAMu5P,EAAgB,CAC/B,CChBA,MAAMI,IAA0B,IAKhC,MAAMC,EAAY,CA+Cf,aAAc,CACb,KAAK,oBAAsB,GAC3B,KAAK,gBAAkB,GACvB,KAAK,iBAAmB,GACxB,KAAK,aAAe,GACpB,KAAK,aAAe,GACpB,KAAK,MAAQ,GACb,KAAK,MAAQ,GACb,KAAK,OAAS,GACd,KAAK,UAAY,GACjB,KAAK,uBAAyB,GAC9B,KAAK,oBAAsBlB,IAC5B,CAKA,OAAQ,CACP,MAAMmB,EAAW,IAAID,GACrB,OAAAC,EAAS,aAAe,CAAC,GAAG,KAAK,YAAY,EAC7CA,EAAS,MAAQ,CAAE,GAAG,KAAK,KAAK,EAChCA,EAAS,OAAS,CAAE,GAAG,KAAK,MAAM,EAClCA,EAAS,UAAY,CAAE,GAAG,KAAK,SAAS,EACxCA,EAAS,MAAQ,KAAK,MACtBA,EAAS,OAAS,KAAK,OACvBA,EAAS,SAAW,KAAK,SACzBA,EAAS,iBAAmB,KAAK,iBACjCA,EAAS,aAAe,KAAK,aAC7BA,EAAS,iBAAmB,CAAC,GAAG,KAAK,gBAAgB,EACrDA,EAAS,gBAAkB,KAAK,gBAChCA,EAAS,aAAe,CAAC,GAAG,KAAK,YAAY,EAC7CA,EAAS,uBAAyB,CAAE,GAAG,KAAK,sBAAsB,EAClEA,EAAS,oBAAsB,CAAE,GAAG,KAAK,mBAAmB,EAC5DA,EAAS,QAAU,KAAK,QACxBA,EAAS,aAAe,KAAK,aAE7BL,GAAiBK,EAAUH,GAAiB,IAAI,CAAC,EAE1CG,CACR,CAKA,UAAU9lL,EAAQ,CACjB,KAAK,QAAUA,CAChB,CAKA,eAAe+lL,EAAa,CAC3B,KAAK,aAAeA,CACrB,CAKA,WAAY,CACX,OAAO,KAAK,OACb,CAKA,aAAc,CACb,OAAO,KAAK,YACb,CAKA,iBAAiB1zP,EAAU,CAC1B,KAAK,gBAAgB,KAAKA,CAAQ,CACnC,CAKA,kBAAkBA,EAAU,CAC3B,YAAK,iBAAiB,KAAKA,CAAQ,EAC5B,IACR,CAKA,QAAQmjL,EAAM,CAGb,YAAK,MAAQA,GAAQ,CACnB,MAAO,OACP,GAAI,OACJ,WAAY,OACZ,SAAU,MAChB,EAEQ,KAAK,UACP8vE,GAAc,KAAK,SAAU,CAAE,KAAA9vE,CAAM,CAAA,EAGvC,KAAK,sBAAqB,EACnB,IACR,CAKA,SAAU,CACT,OAAO,KAAK,KACb,CAKA,mBAAoB,CACnB,OAAO,KAAK,eACb,CAKA,kBAAkBwwE,EAAgB,CACjC,YAAK,gBAAkBA,EAChB,IACR,CAKA,QAAQrnB,EAAM,CACb,YAAK,MAAQ,CACX,GAAG,KAAK,MACR,GAAGA,CACT,EACI,KAAK,sBAAqB,EACnB,IACR,CAKA,OAAOz5O,EAAKqB,EAAO,CAClB,YAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,CAACrB,CAAG,EAAGqB,GACrC,KAAK,sBAAqB,EACnB,IACR,CAKA,UAAU0/P,EAAQ,CACjB,YAAK,OAAS,CACZ,GAAG,KAAK,OACR,GAAGA,CACT,EACI,KAAK,sBAAqB,EACnB,IACR,CAKA,SAAS/gQ,EAAKghQ,EAAO,CACpB,YAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,CAAChhQ,CAAG,EAAGghQ,GACvC,KAAK,sBAAqB,EACnB,IACR,CAKA,eAAeC,EAAa,CAC3B,YAAK,aAAeA,EACpB,KAAK,sBAAqB,EACnB,IACR,CAKA,SAASh1G,EAAO,CACf,YAAK,OAASA,EACd,KAAK,sBAAqB,EACnB,IACR,CAKA,mBAAmBhoJ,EAAM,CACxB,YAAK,iBAAmBA,EACxB,KAAK,sBAAqB,EACnB,IACR,CAKA,WAAWjE,EAAKuyB,EAAS,CACxB,OAAIA,IAAY,KAEd,OAAO,KAAK,UAAUvyB,CAAG,EAEzB,KAAK,UAAUA,CAAG,EAAIuyB,EAGxB,KAAK,sBAAqB,EACnB,IACR,CAKA,WAAW47I,EAAS,CACnB,OAAKA,EAGH,KAAK,SAAWA,EAFhB,OAAO,KAAK,SAId,KAAK,sBAAqB,EACnB,IACR,CAKA,YAAa,CACZ,OAAO,KAAK,QACb,CAKA,OAAO+yF,EAAgB,CACtB,GAAI,CAACA,EACH,OAAO,KAGT,MAAMC,EAAe,OAAOD,GAAmB,WAAaA,EAAe,IAAI,EAAIA,EAE7E,CAACE,EAAeN,CAAc,EAClCK,aAAwBE,GACpB,CAACF,EAAa,aAAY,EAAIA,EAAa,kBAAiB,CAAE,EAC9D5/P,GAAc4/P,CAAY,EACxB,CAACD,EAAkBA,EAAiB,cAAc,EAClD,GAEF,CAAE,KAAAznB,EAAM,MAAAunB,EAAO,KAAA1wE,EAAM,SAAAgxE,EAAU,MAAAr1G,EAAO,YAAAg1G,EAAc,GAAI,mBAAAM,GAAuBH,GAAiB,CAAA,EAEtG,YAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,GAAG3nB,GACjC,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,GAAGunB,GACnC,KAAK,UAAY,CAAE,GAAG,KAAK,UAAW,GAAGM,GAErChxE,GAAQ,OAAO,KAAKA,CAAI,EAAE,SAC5B,KAAK,MAAQA,GAGXrkC,IACF,KAAK,OAASA,GAGZg1G,EAAY,SACd,KAAK,aAAeA,GAGlBM,IACF,KAAK,oBAAsBA,GAGzBT,IACF,KAAK,gBAAkBA,GAGlB,IACR,CAKA,OAAQ,CAEP,YAAK,aAAe,GACpB,KAAK,MAAQ,GACb,KAAK,OAAS,GACd,KAAK,MAAQ,GACb,KAAK,UAAY,GACjB,KAAK,OAAS,OACd,KAAK,iBAAmB,OACxB,KAAK,aAAe,OACpB,KAAK,gBAAkB,OACvB,KAAK,SAAW,OAChBP,GAAiB,KAAM,MAAS,EAChC,KAAK,aAAe,GACpB,KAAK,oBAAsBd,KAE3B,KAAK,sBAAqB,EACnB,IACR,CAKA,cAAc+B,EAAYC,EAAgB,CACzC,MAAMC,EAAY,OAAOD,GAAmB,SAAWA,EAAiBf,IAGxE,GAAIgB,GAAa,EACf,OAAO,KAGT,MAAMC,EAAmB,CACvB,UAAWlL,GAAwB,EACnC,GAAG+K,CACT,EAEUI,EAAc,KAAK,aACzB,OAAAA,EAAY,KAAKD,CAAgB,EACjC,KAAK,aAAeC,EAAY,OAASF,EAAYE,EAAY,MAAM,CAACF,CAAS,EAAIE,EAErF,KAAK,sBAAqB,EAEnB,IACR,CAKA,mBAAoB,CACnB,OAAO,KAAK,aAAa,KAAK,aAAa,OAAS,CAAC,CACtD,CAKA,kBAAmB,CAClB,YAAK,aAAe,GACpB,KAAK,sBAAqB,EACnB,IACR,CAKA,cAAc5D,EAAY,CACzB,YAAK,aAAa,KAAKA,CAAU,EAC1B,IACR,CAKA,kBAAmB,CAClB,YAAK,aAAe,GACb,IACR,CAGA,cAAe,CACd,MAAO,CACL,YAAa,KAAK,aAClB,YAAa,KAAK,aAClB,SAAU,KAAK,UACf,KAAM,KAAK,MACX,MAAO,KAAK,OACZ,KAAM,KAAK,MACX,MAAO,KAAK,OACZ,YAAa,KAAK,cAAgB,CAAE,EACpC,gBAAiB,KAAK,iBACtB,mBAAoB,KAAK,oBACzB,sBAAuB,KAAK,uBAC5B,gBAAiB,KAAK,iBACtB,KAAMyC,GAAiB,IAAI,CACjC,CACG,CAKA,yBAAyBxnL,EAAS,CACjC,YAAK,uBAAyB,CAAE,GAAG,KAAK,uBAAwB,GAAGA,GAE5D,IACR,CAKA,sBAAsB1mD,EAAS,CAC9B,YAAK,oBAAsBA,EACpB,IACR,CAKA,uBAAwB,CACvB,OAAO,KAAK,mBACb,CAKA,iBAAiBuxH,EAAWstB,EAAM,CACjC,MAAM2nF,EAAU3nF,GAAQA,EAAK,SAAWA,EAAK,SAAWunF,KAExD,GAAI,CAAC,KAAK,QACR,OAAAp8E,GAAO,KAAK,6DAA6D,EAClEw8E,EAGT,MAAM8I,EAAqB,IAAI,MAAM,2BAA2B,EAEhE,YAAK,QAAQ,iBACX/9G,EACA,CACE,kBAAmBA,EACnB,mBAAA+9G,EACA,GAAGzwF,EACH,SAAU2nF,CACX,EACD,IACN,EAEWA,CACR,CAKA,eAAe32M,EAAS6pG,EAAOmlB,EAAM,CACpC,MAAM2nF,EAAU3nF,GAAQA,EAAK,SAAWA,EAAK,SAAWunF,KAExD,GAAI,CAAC,KAAK,QACR,OAAAp8E,GAAO,KAAK,2DAA2D,EAChEw8E,EAGT,MAAM8I,EAAqB,IAAI,MAAMz/M,CAAO,EAE5C,YAAK,QAAQ,eACXA,EACA6pG,EACA,CACE,kBAAmB7pG,EACnB,mBAAAy/M,EACA,GAAGzwF,EACH,SAAU2nF,CACX,EACD,IACN,EAEWA,CACR,CAKA,aAAajjP,EAAOs7J,EAAM,CACzB,MAAM2nF,EAAU3nF,GAAQA,EAAK,SAAWA,EAAK,SAAWunF,KAExD,OAAK,KAAK,SAKV,KAAK,QAAQ,aAAa7iP,EAAO,CAAE,GAAGs7J,EAAM,SAAU2nF,GAAW,IAAI,EAE9DA,IANLx8E,GAAO,KAAK,yDAAyD,EAC9Dw8E,EAMV,CAKA,uBAAwB,CAIlB,KAAK,sBACR,KAAK,oBAAsB,GAC3B,KAAK,gBAAgB,QAAQ5rP,GAAY,CACvCA,EAAS,IAAI,CACrB,CAAO,EACD,KAAK,oBAAsB,GAE9B,CACH,CASA,MAAMk0P,GAAQV,GCtiBd,SAASmB,KAAyB,CAChC,OAAOzR,GAAmB,sBAAuB,IAAM,IAAIgR,EAAO,CACpE,CAGA,SAASU,KAA2B,CAClC,OAAO1R,GAAmB,wBAAyB,IAAM,IAAIgR,EAAO,CACtE,CCHA,MAAMW,GAAkB,CAErB,YAAYj7P,EAAOk7P,EAAgB,CAClC,IAAIC,EACCn7P,EAGHm7P,EAAgBn7P,EAFhBm7P,EAAgB,IAAIb,GAKtB,IAAIc,EACCF,EAGHE,EAAyBF,EAFzBE,EAAyB,IAAId,GAM/B,KAAK,OAAS,CAAC,CAAE,MAAOa,CAAe,CAAA,EACvC,KAAK,gBAAkBC,CACxB,CAKA,UAAUh1P,EAAU,CACnB,MAAMpG,EAAQ,KAAK,aAEnB,IAAIq7P,EACJ,GAAI,CACFA,EAAqBj1P,EAASpG,CAAK,CACpC,OAAQynB,EAAG,CACV,WAAK,UAAS,EACRA,CACP,CAED,OAAIs1C,GAAWs+L,CAAkB,EAExBA,EAAmB,KACxB9+P,IACE,KAAK,UAAS,EACPA,GAETkrB,GAAK,CACH,WAAK,UAAS,EACRA,CACP,CACT,GAGI,KAAK,UAAS,EACP4zO,EACR,CAKA,WAAY,CACX,OAAO,KAAK,YAAa,EAAC,MAC3B,CAKA,UAAW,CACV,OAAO,KAAK,YAAa,EAAC,KAC3B,CAKA,mBAAoB,CACnB,OAAO,KAAK,eACb,CAKA,aAAc,CACb,OAAO,KAAK,OAAO,KAAK,OAAO,OAAS,CAAC,CAC1C,CAKA,YAAa,CAEZ,MAAMr7P,EAAQ,KAAK,SAAU,EAAC,MAAK,EACnC,YAAK,OAAO,KAAK,CACf,OAAQ,KAAK,UAAW,EACxB,MAAAA,CACN,CAAK,EACMA,CACR,CAKA,WAAY,CACX,OAAI,KAAK,OAAO,QAAU,EAAU,GAC7B,CAAC,CAAC,KAAK,OAAO,IAAG,CACzB,CACH,CAMA,SAASs7P,IAAuB,CAC9B,MAAMtmP,EAAW+jP,KACXwC,EAASvC,GAAiBhkP,CAAQ,EAExC,OAAQumP,EAAO,MAAQA,EAAO,OAAS,IAAIN,IAAkBF,IAAsB,EAAIC,IAAwB,CAAE,CACnH,CAEA,SAASQ,IAAUp1P,EAAU,CAC3B,OAAOk1P,GAAsB,EAAC,UAAUl1P,CAAQ,CAClD,CAEA,SAASq1P,IAAaz7P,EAAOoG,EAAU,CACrC,MAAMmtC,EAAQ+nN,KACd,OAAO/nN,EAAM,UAAU,KACrBA,EAAM,YAAW,EAAG,MAAQvzC,EACrBoG,EAASpG,CAAK,EACtB,CACH,CAEA,SAAS07P,GAAmBt1P,EAAU,CACpC,OAAOk1P,GAAoB,EAAG,UAAU,IAC/Bl1P,EAASk1P,KAAuB,kBAAmB,CAAA,CAC3D,CACH,CAKA,SAASK,KAA+B,CACtC,MAAO,CACL,mBAAAD,GACJ,UAAIF,IACA,aAAAC,IACA,sBAAuB,CAACG,EAAiBx1P,IAChCs1P,GAAmBt1P,CAAQ,EAEpC,gBAAiB,IAAMk1P,GAAsB,EAAC,SAAU,EACxD,kBAAmB,IAAMA,GAAsB,EAAC,kBAAmB,CACvE,CACA,CCxIA,SAASO,GAAwB5C,EAAS,CACxC,MAAMsC,EAASvC,GAAiBC,CAAO,EAEvC,OAAIsC,EAAO,IACFA,EAAO,IAITI,IAA4B,CACrC,CCpBA,SAAS17P,IAAkB,CACzB,MAAMg5P,EAAUF,KAEhB,OADY8C,GAAwB5C,CAAO,EAChC,iBACb,CAMA,SAAS6C,IAAoB,CAC3B,MAAM7C,EAAUF,KAEhB,OADY8C,GAAwB5C,CAAO,EAChC,mBACb,CAMA,SAAS8C,KAAiB,CACxB,OAAOzS,GAAmB,cAAe,IAAM,IAAIgR,EAAO,CAC5D,CAWA,SAASkB,MACJv6I,EACH,CACA,MAAMg4I,EAAUF,KACViD,EAAMH,GAAwB5C,CAAO,EAG3C,GAAIh4I,EAAK,SAAW,EAAG,CACrB,KAAM,CAACjhH,EAAOoG,CAAQ,EAAI66G,EAE1B,OAAKjhH,EAIEg8P,EAAI,aAAah8P,EAAOoG,CAAQ,EAH9B41P,EAAI,UAAU51P,CAAQ,CAIhC,CAED,OAAO41P,EAAI,UAAU/6I,EAAK,CAAC,CAAC,CAC9B,CAwCA,SAASg7I,IAAY,CACnB,OAAOh8P,GAAe,EAAG,WAC3B,CC9FA,MAAMi8P,IAAqB,iBAK3B,SAASC,GAA4B1C,EAAM,CACzC,MAAM2C,EAAW3C,EAAOyC,GAAkB,EAE1C,GAAI,CAACE,EACH,OAEF,MAAMhiH,EAAS,CAAA,EAEf,SAAW,CAAA,CAAG,CAACiiH,EAAWC,CAAO,CAAC,IAAKF,GACzBhiH,EAAOiiH,CAAS,IAAMjiH,EAAOiiH,CAAS,EAAI,CAAA,IAClD,KAAKlP,GAAkBmP,CAAO,CAAC,EAGrC,OAAOliH,CACT,CCrBA,MAAMmiH,GAAmC,gBAKnCC,GAAwC,qBAKxCC,GAA+B,YAK/BC,GAAmC,gBAMnCC,IAA6C,0BAG7CC,IAA8C,2BAK9CC,IAAgC,oBAEhCC,IAAoC,wBCpCpCC,IAAoB,EACpBC,IAAiB,ECSjBC,GAAkB,EAClBC,GAAqB,EAO3B,SAASC,IAA8B1D,EAAM,CAC3C,KAAM,CAAE,OAAQ2D,EAAS,QAASC,GAAa5D,EAAK,cAC9C,CAAE,KAAA9nP,EAAM,GAAA0gJ,EAAI,eAAAirG,EAAgB,OAAA/7L,EAAQ,OAAAowJ,CAAQ,EAAG4rC,GAAW9D,CAAI,EAEpE,OAAOtM,GAAkB,CACvB,eAAAmQ,EACA,QAAAF,EACA,SAAAC,EACA,KAAA1rP,EACA,GAAA0gJ,EACA,OAAA9wF,EACA,OAAAowJ,CACJ,CAAG,CACH,CAKA,SAAS6rC,IAAmB/D,EAAM,CAChC,KAAM,CAAE,OAAQ2D,EAAS,QAASC,GAAa5D,EAAK,cAC9C,CAAE,eAAA6D,CAAc,EAAKC,GAAW9D,CAAI,EAE1C,OAAOtM,GAAkB,CAAE,eAAAmQ,EAAgB,QAAAF,EAAS,SAAAC,CAAU,CAAA,CAChE,CAcA,SAASI,GAAuBtpN,EAAO,CACrC,OAAI,OAAOA,GAAU,SACZupN,GAAyBvpN,CAAK,EAGnC,MAAM,QAAQA,CAAK,EAEdA,EAAM,CAAC,EAAIA,EAAM,CAAC,EAAI,IAG3BA,aAAiB,KACZupN,GAAyBvpN,EAAM,QAAO,CAAE,EAG1C47M,GAAkB,CAC3B,CAKA,SAAS2N,GAAyBr2K,EAAW,CAE3C,OADaA,EAAY,WACXA,EAAY,IAAOA,CACnC,CAQA,SAASk2K,GAAW9D,EAAM,CACxB,GAAIkE,IAAiBlE,CAAI,EACvB,OAAOA,EAAK,cAGd,GAAI,CACF,KAAM,CAAE,OAAQ2D,EAAS,QAASC,GAAa5D,EAAK,cAGpD,GAAImE,IAAoCnE,CAAI,EAAG,CAC7C,KAAM,CAAE,WAAAn8H,EAAY,UAAA+yD,EAAW,KAAAnzL,EAAM,QAAA2gQ,EAAS,aAAAC,EAAc,OAAAv8L,CAAQ,EAAGk4L,EAEvE,OAAOtM,GAAkB,CACvB,QAAAiQ,EACA,SAAAC,EACA,KAAM//H,EACN,YAAapgI,EACb,eAAgB4gQ,EAChB,gBAAiBL,GAAuBptE,CAAS,EAEjD,UAAWotE,GAAuBI,CAAO,GAAK,OAC9C,OAAQE,GAAiBx8L,CAAM,EAC/B,GAAI+7D,EAAWm/H,EAA4B,EAC3C,OAAQn/H,EAAWo/H,EAAgC,EACnD,iBAAkBP,GAA4B1C,CAAI,CAC1D,CAAO,CACF,CAGD,MAAO,CACL,QAAA2D,EACA,SAAAC,CACN,CACG,MAAW,CACV,MAAO,EACR,CACH,CAEA,SAASO,IAAoCnE,EAAM,CACjD,MAAMuE,EAAWvE,EACjB,MAAO,CAAC,CAACuE,EAAS,YAAc,CAAC,CAACA,EAAS,WAAa,CAAC,CAACA,EAAS,MAAQ,CAAC,CAACA,EAAS,SAAW,CAAC,CAACA,EAAS,MAC9G,CAQA,SAASL,IAAiBlE,EAAM,CAC9B,OAAO,OAAQA,EAAO,aAAgB,UACxC,CAQA,SAASwE,GAAcxE,EAAM,CAG3B,KAAM,CAAE,WAAAyE,CAAU,EAAKzE,EAAK,YAAW,EACvC,OAAOyE,IAAehB,EACxB,CAGA,SAASa,GAAiBx8L,EAAQ,CAChC,GAAI,GAACA,GAAUA,EAAO,OAASw7L,KAI/B,OAAIx7L,EAAO,OAASy7L,IACX,KAGFz7L,EAAO,SAAW,eAC3B,CAEA,MAAM48L,GAAoB,oBACpBC,GAAkB,kBAKxB,SAASC,GAAmB5E,EAAM6E,EAAW,CAG3C,MAAMC,EAAW9E,EAAK2E,EAAe,GAAK3E,EAC1ClN,GAAyB+R,EAAYF,GAAiBG,CAAQ,EAI1D9E,EAAK0E,EAAiB,EACxB1E,EAAK0E,EAAiB,EAAE,IAAIG,CAAS,EAErC/R,GAAyBkN,EAAM0E,GAAmB,IAAI,IAAI,CAACG,CAAS,CAAC,CAAC,CAE1E,CAYA,SAASE,IAAmB/E,EAAM,CAChC,MAAMtjB,EAAY,IAAI,IAEtB,SAASsoB,EAAgBhF,EAAM,CAE7B,GAAI,CAAAtjB,EAAU,IAAIsjB,CAAI,GAGXwE,GAAcxE,CAAI,EAAG,CAC9BtjB,EAAU,IAAIsjB,CAAI,EAClB,MAAMiF,EAAajF,EAAK0E,EAAiB,EAAI,MAAM,KAAK1E,EAAK0E,EAAiB,CAAC,EAAI,GACnF,UAAWG,KAAaI,EACtBD,EAAgBH,CAAS,CAE5B,CACF,CAED,OAAAG,EAAgBhF,CAAI,EAEb,MAAM,KAAKtjB,CAAS,CAC7B,CAKA,SAASwoB,GAAYlF,EAAM,CACzB,OAAOA,EAAK2E,EAAe,GAAK3E,CAClC,CAKA,SAASmF,IAAgB,CACvB,MAAM3F,EAAUF,KACViD,EAAMH,GAAwB5C,CAAO,EAC3C,OAAI+C,EAAI,cACCA,EAAI,gBAGNtC,GAAiBz5P,GAAe,CAAE,CAC3C,CCzOA,MAAM4+P,GAA4B,eAC5BC,GAAsC,wBAG5C,SAASC,IAAwBtF,EAAMz5P,EAAOk7P,EAAgB,CACxDzB,IACFlN,GAAyBkN,EAAMqF,GAAqC5D,CAAc,EAClF3O,GAAyBkN,EAAMoF,GAA2B7+P,CAAK,EAEnE,CAKA,SAASg/P,GAAwBvF,EAAM,CACrC,MAAO,CACL,MAAQA,EAAOoF,EAAyB,EACxC,eAAiBpF,EAAOqF,EAAmC,CAC/D,CACA,CCbA,SAASG,GACPC,EACA,CACA,GAAI,OAAO,oBAAuB,WAAa,CAAC,mBAC9C,MAAO,GAGT,MAAMnrL,EAASkoL,KACT76P,EAAU89P,GAAiBnrL,GAAUA,EAAO,WAAY,EAE9D,MAAO,CAAC,CAAC3yE,IAAYA,EAAQ,eAAiB,qBAAsBA,GAAW,kBAAmBA,EACpG,CCdA,MAAM+9P,EAAwB,CAE3B,YAAYC,EAAc,GAAI,CAC7B,KAAK,SAAWA,EAAY,SAAWxN,GAAK,EAC5C,KAAK,QAAUwN,EAAY,QAAUxN,KAAQ,UAAU,EAAE,CAC1D,CAGA,aAAc,CACb,MAAO,CACL,OAAQ,KAAK,QACb,QAAS,KAAK,SACd,WAAYqL,EAClB,CACG,CAIA,IAAIoC,EAAY,CAAE,CAGlB,aAAargQ,EAAMkkE,EAAQ,CAC1B,OAAO,IACR,CAGA,cAAco8L,EAAS,CACtB,OAAO,IACR,CAGA,UAAUC,EAAS,CAClB,OAAO,IACR,CAGA,WAAWC,EAAO,CACjB,OAAO,IACR,CAGA,aAAc,CACb,MAAO,EACR,CAGA,SACCA,EACAC,EACAC,EACA,CACA,OAAO,IACR,CASA,QAAQC,EAAO,CACd,OAAO,IACR,CASA,SAASC,EAAQ,CAChB,OAAO,IACR,CASA,gBAAgBC,EAAYC,EAAO,CAEnC,CACH,CC5FA,MAAMC,GAAsB,aCWtBC,GAAmB,aAKzB,SAASC,GAAgBxG,EAAMyG,EAAK,CAElC3T,GADyBkN,EACkBuG,GAAkBE,CAAG,CAClE,CAOA,SAASC,GAAoC9C,EAAUtpL,EAAQ,CAC7D,MAAM3yE,EAAU2yE,EAAO,aAEjB,CAAE,UAAWqsL,CAAU,EAAKrsL,EAAO,OAAQ,GAAI,GAE/CmsL,EAAM/S,GAAkB,CAC5B,YAAa/rP,EAAQ,aAAe2+P,GACpC,QAAS3+P,EAAQ,QACjB,WAAAg/P,EACA,SAAA/C,CACJ,CAAG,EAED,OAAAtpL,EAAO,KAAK,YAAamsL,CAAG,EAErBA,CACT,CASA,SAASG,GAAkC5G,EAAM,CAC/C,MAAM1lL,EAASkoL,KACf,GAAI,CAACloL,EACH,MAAO,GAGT,MAAMmsL,EAAMC,GAAoC5C,GAAW9D,CAAI,EAAE,UAAY,GAAI1lL,CAAM,EAEjFwqL,EAAWI,GAAYlF,CAAI,EAG3B6G,EAAa/B,EAAWyB,EAAgB,EAC9C,GAAIM,EACF,OAAOA,EAIT,MAAMC,EAAahC,EAAS,YAAW,EAAG,WACpCiC,EAAgBD,GAAcA,EAAW,IAAI,YAAY,EAGzDE,EAAkBD,GAAiBtL,IAAsCsL,CAAa,EAE5F,GAAIC,EACF,OAAOA,EAIT,MAAMC,EAAWnD,GAAWgB,CAAQ,EAC9BjhI,EAAaojI,EAAS,MAAQ,GAC9BC,EAAkBrjI,EAAWk/H,EAAqC,EAEpEmE,GAAmB,OACrBT,EAAI,YAAc,GAAGS,CAAe,IAItC,MAAMr2P,EAASgzH,EAAWi/H,EAAgC,EAGpDr/P,EAAOwjQ,EAAS,YACtB,OAAIp2P,IAAW,OAASpN,IACtBgjQ,EAAI,YAAchjQ,GAMhB+hQ,GAAiB,IACnBiB,EAAI,QAAU,OAAOjC,GAAcM,CAAQ,CAAC,GAG9CxqL,EAAO,KAAK,YAAamsL,EAAK3B,CAAQ,EAE/B2B,CACT,CClGA,SAASU,IAAanH,EAAM,CAC1B,GAAI,CAAC/O,GAAa,OAElB,KAAM,CAAE,YAAAjkE,EAAc,mBAAoB,GAAAp0B,EAAK,iBAAkB,eAAgByrG,CAAc,EAAGP,GAAW9D,CAAI,EAC3G,CAAE,OAAAoH,CAAM,EAAKpH,EAAK,YAAW,EAE7BqH,EAAU7C,GAAcxE,CAAI,EAC5B8E,EAAWI,GAAYlF,CAAI,EAC3BsH,EAAaxC,IAAa9E,EAE1BppM,EAAS,sBAAsBywM,EAAU,UAAY,WAAW,IAAIC,EAAa,QAAU,EAAE,OAE7FC,EAAY,CAAC,OAAO3uG,CAAE,GAAI,SAASo0B,CAAW,GAAI,OAAOo6E,CAAM,EAAE,EAMvE,GAJI/C,GACFkD,EAAU,KAAK,cAAclD,CAAY,EAAE,EAGzC,CAACiD,EAAY,CACf,KAAM,CAAE,GAAA1uG,EAAI,YAAAo0B,CAAa,EAAG82E,GAAWgB,CAAQ,EAC/CyC,EAAU,KAAK,YAAYzC,EAAS,cAAc,MAAM,EAAE,EACtDlsG,GACF2uG,EAAU,KAAK,YAAY3uG,CAAE,EAAE,EAE7Bo0B,GACFu6E,EAAU,KAAK,qBAAqBv6E,CAAW,EAAE,CAEpD,CAEDjR,GAAO,IAAI,GAAGnlH,CAAM;AAAA,IAClB2wM,EAAU,KAAK;AAAA,GAAM,CAAC,EAAE,CAC5B,CAKA,SAASC,IAAWxH,EAAM,CACxB,GAAI,CAAC/O,GAAa,OAElB,KAAM,CAAE,YAAAjkE,EAAc,mBAAoB,GAAAp0B,EAAK,kBAAqBkrG,GAAW9D,CAAI,EAC7E,CAAE,OAAAoH,CAAM,EAAKpH,EAAK,YAAW,EAE7BsH,EADWpC,GAAYlF,CAAI,IACDA,EAE1B5kN,EAAM,wBAAwBw9G,CAAE,KAAK0uG,EAAa,QAAU,EAAE,SAASt6E,CAAW,aAAao6E,CAAM,GAC3GrrF,GAAO,IAAI3gI,CAAG,CAChB,CC3CA,SAASqsN,GAAgBC,EAAY,CACnC,GAAI,OAAOA,GAAe,UACxB,OAAO,OAAOA,CAAU,EAG1B,MAAMr6L,EAAO,OAAOq6L,GAAe,SAAW,WAAWA,CAAU,EAAIA,EACvE,GAAI,OAAOr6L,GAAS,UAAY,MAAMA,CAAI,GAAKA,EAAO,GAAKA,EAAO,EAAG,CACnE4jL,IACEl1E,GAAO,KACL,0GAA0G,KAAK,UAC7G2rF,CACV,CAAS,YAAY,KAAK,UAAU,OAAOA,CAAU,CAAC,GACtD,EACI,MACD,CAED,OAAOr6L,CACT,CChBA,SAASs6L,IACPhgQ,EACAigQ,EACA,CAEA,GAAI,CAACpC,GAAkB79P,CAAO,EAC5B,MAAO,CAAC,EAAK,EAKf,IAAI+/P,EACA,OAAO//P,EAAQ,eAAkB,WACnC+/P,EAAa//P,EAAQ,cAAcigQ,CAAe,EACzCA,EAAgB,gBAAkB,OAC3CF,EAAaE,EAAgB,cACpB,OAAOjgQ,EAAQ,iBAAqB,IAC7C+/P,EAAa//P,EAAQ,iBAGrB+/P,EAAa,EAKf,MAAMG,EAAmBJ,GAAgBC,CAAU,EAEnD,OAAIG,IAAqB,QACvB5W,IAAel1E,GAAO,KAAK,kEAAkE,EACtF,CAAC,EAAK,GAIV8rF,EAcgB,KAAK,OAAM,EAAKA,EAa9B,CAAC,GAAMA,CAAgB,GAT5B5W,IACEl1E,GAAO,IACL,oGAAoG,OAClG2rF,CACD,CAAA,GACT,EACW,CAAC,GAAOG,CAAgB,IAvB/B5W,IACEl1E,GAAO,IACL,4CACE,OAAOp0K,EAAQ,eAAkB,WAC7B,oCACA,4EACd,EACA,EACW,CAAC,GAAOkgQ,CAAgB,EAmBnC,CChEA,SAASC,IAAwBxyP,EAAOwoP,EAAS,CAC/C,OAAKA,IAGLxoP,EAAM,IAAMA,EAAM,KAAO,CAAA,EACzBA,EAAM,IAAI,KAAOA,EAAM,IAAI,MAAQwoP,EAAQ,KAC3CxoP,EAAM,IAAI,QAAUA,EAAM,IAAI,SAAWwoP,EAAQ,QACjDxoP,EAAM,IAAI,aAAe,CAAC,GAAIA,EAAM,IAAI,cAAgB,CAAA,EAAK,GAAIwoP,EAAQ,cAAgB,CAAA,CAAG,EAC5FxoP,EAAM,IAAI,SAAW,CAAC,GAAIA,EAAM,IAAI,UAAY,CAAA,EAAK,GAAIwoP,EAAQ,UAAY,CAAA,CAAG,GACzExoP,CACT,CAGA,SAASyyP,IACPp6F,EACAmkF,EACAkW,EACAjK,EACA,CACA,MAAMD,EAAUH,GAAgCqK,CAAQ,EAClDC,EAAkB,CACtB,QAAS,IAAI,KAAM,EAAC,YAAa,EACjC,GAAInK,GAAW,CAAE,IAAKA,GACtB,GAAI,CAAC,CAACC,GAAUjM,GAAO,CAAE,IAAKD,GAAYC,CAAG,EACjD,EAEQ4K,EACJ,eAAgB/uF,EAAU,CAAC,CAAE,KAAM,UAAY,EAAEA,CAAO,EAAI,CAAC,CAAE,KAAM,SAAS,EAAIA,EAAQ,OAAQ,CAAA,EAEpG,OAAOyuF,GAAe6L,EAAiB,CAACvL,CAAY,CAAC,CACvD,CAKA,SAASwL,IACP5yP,EACAw8O,EACAkW,EACAjK,EACA,CACA,MAAMD,EAAUH,GAAgCqK,CAAQ,EASlDG,EAAY7yP,EAAM,MAAQA,EAAM,OAAS,eAAiBA,EAAM,KAAO,QAE7EwyP,IAAwBxyP,EAAO0yP,GAAYA,EAAS,GAAG,EAEvD,MAAMC,EAAkBpK,IAA2BvoP,EAAOwoP,EAASC,EAAQjM,CAAG,EAM9E,cAAOx8O,EAAM,sBAGN8mP,GAAe6L,EAAiB,CADrB,CAAC,CAAE,KAAME,CAAW,EAAE7yP,CAAK,CACI,CAAC,CACpD,CAOA,SAAS8yP,IAAmBC,EAAO/tL,EAAQ,CACzC,SAASguL,EAAoB7B,EAAK,CAChC,MAAO,CAAC,CAACA,EAAI,UAAY,CAAC,CAACA,EAAI,UAChC,CAKD,MAAMA,EAAMG,GAAkCyB,EAAM,CAAC,CAAC,EAEhDvW,EAAMx3K,GAAUA,EAAO,OAAM,EAC7ByjL,EAASzjL,GAAUA,EAAO,WAAU,EAAG,OAEvCjT,EAAU,CACd,QAAS,IAAI,KAAM,EAAC,YAAa,EACjC,GAAIihM,EAAoB7B,CAAG,GAAK,CAAE,MAAOA,CAAG,EAC5C,GAAI,CAAC,CAAC1I,GAAUjM,GAAO,CAAE,IAAKD,GAAYC,CAAG,EACjD,EAEQyW,EAAiBjuL,GAAUA,EAAO,WAAU,EAAG,eAC/CkuL,EAAoBD,EACrBvI,GAASuI,EAAezE,GAAW9D,CAAI,CAAG,EAC1CA,GAAS8D,GAAW9D,CAAI,EAEvBziM,EAAQ,CAAA,EACd,UAAWyiM,KAAQqI,EAAO,CACxB,MAAM/K,EAAWkL,EAAkBxI,CAAI,EACnC1C,GACF//L,EAAM,KAAK8/L,IAAuBC,CAAQ,CAAC,CAE9C,CAED,OAAOlB,GAAe/0L,EAAS9J,CAAK,CACtC,CC3FA,SAASkrM,GAA0BxsE,EAAQ,CACzC,GAAI,CAACA,GAAUA,EAAO,SAAW,EAC/B,OAGF,MAAMysE,EAAe,CAAA,EACrB,OAAAzsE,EAAO,QAAQ3mL,GAAS,CACtB,MAAMuuH,EAAavuH,EAAM,YAAc,GACjC+2E,EAAOw3C,EAAWq/H,GAA0C,EAC5DriQ,EAAQgjI,EAAWs/H,GAA2C,EAEhE,OAAO92K,GAAS,UAAY,OAAOxrF,GAAU,WAC/C6nQ,EAAapzP,EAAM,IAAI,EAAI,CAAE,MAAAzU,EAAO,KAAAwrF,CAAI,EAE9C,CAAG,EAEMq8K,CACT,CC1BA,MAAMC,GAAiB,IAKvB,MAAMC,EAAY,CAmBf,YAAYjD,EAAc,GAAI,CAC7B,KAAK,SAAWA,EAAY,SAAWxN,GAAK,EAC5C,KAAK,QAAUwN,EAAY,QAAUxN,KAAQ,UAAU,EAAE,EACzD,KAAK,WAAawN,EAAY,gBAAkBrP,GAAkB,EAElE,KAAK,YAAc,GACnB,KAAK,cAAc,CACjB,CAAC2M,EAAgC,EAAG,SACpC,CAACD,EAA4B,EAAG2C,EAAY,GAC5C,GAAGA,EAAY,UACrB,CAAK,EAED,KAAK,MAAQA,EAAY,KAErBA,EAAY,eACd,KAAK,cAAgBA,EAAY,cAG/B,YAAaA,IACf,KAAK,SAAWA,EAAY,SAE1BA,EAAY,eACd,KAAK,SAAWA,EAAY,cAG9B,KAAK,QAAU,GAEf,KAAK,kBAAoBA,EAAY,aAGjC,KAAK,UACP,KAAK,aAAY,CAEpB,CASA,QAAQO,EAAO,CACd,OAAO,IACR,CASA,SAASC,EAAQ,CAChB,OAAO,IACR,CASA,gBAAgBC,EAAYC,EAAO,CAEnC,CAGA,aAAc,CACb,KAAM,CAAE,QAASe,EAAQ,SAAUyB,EAAS,SAAUxB,CAAS,EAAG,KAClE,MAAO,CACL,OAAAD,EACA,QAAAyB,EACA,WAAYxB,EAAU5D,GAAqBD,EACjD,CACG,CAGA,aAAahkQ,EAAKqB,EAAO,CACxB,OAAIA,IAAU,OAEZ,OAAO,KAAK,YAAYrB,CAAG,EAE3B,KAAK,YAAYA,CAAG,EAAIqB,EAGnB,IACR,CAGA,cAAcgjI,EAAY,CACzB,cAAO,KAAKA,CAAU,EAAE,QAAQrkI,GAAO,KAAK,aAAaA,EAAKqkI,EAAWrkI,CAAG,CAAC,CAAC,EACvE,IACR,CAUA,gBAAgBspQ,EAAW,CAC1B,KAAK,WAAa9E,GAAuB8E,CAAS,CACnD,CAKA,UAAUjoQ,EAAO,CAChB,YAAK,QAAUA,EACR,IACR,CAKA,WAAW4C,EAAM,CAChB,YAAK,MAAQA,EACN,IACR,CAGA,IAAIslQ,EAAc,CAEb,KAAK,WAIT,KAAK,SAAW/E,GAAuB+E,CAAY,EACnDvB,IAAW,IAAI,EAEf,KAAK,aAAY,EAClB,CAUA,aAAc,CACb,OAAO9T,GAAkB,CACvB,KAAM,KAAK,YACX,YAAa,KAAK,MAClB,GAAI,KAAK,YAAYsP,EAA4B,EACjD,eAAgB,KAAK,cACrB,QAAS,KAAK,QACd,gBAAiB,KAAK,WACtB,OAAQsB,GAAiB,KAAK,OAAO,EACrC,UAAW,KAAK,SAChB,SAAU,KAAK,SACf,OAAQ,KAAK,YAAYrB,EAAgC,EACzD,iBAAkBP,GAA4B,IAAI,EAClD,WAAY,KAAK,YAAYU,GAA6B,EAC1D,eAAgB,KAAK,YAAYC,GAAiC,EAClE,aAAcoF,GAA0B,KAAK,OAAO,EACpD,WAAa,KAAK,mBAAqBvD,GAAY,IAAI,IAAM,MAAS,OACtE,WAAY,KAAK,kBAAoBA,GAAY,IAAI,EAAE,YAAW,EAAG,OAAS,MACpF,CAAK,CACF,CAGA,aAAc,CACb,MAAO,CAAC,KAAK,UAAY,CAAC,CAAC,KAAK,QACjC,CAKA,SACCzhQ,EACAulQ,EACApyE,EACA,CACAq6D,IAAel1E,GAAO,IAAI,qCAAsCt4K,CAAI,EAEpE,MAAM2sF,EAAO64K,GAAgBD,CAAqB,EAAIA,EAAwBpyE,GAAa0/D,KACrFzyH,EAAaolI,GAAgBD,CAAqB,EAAI,CAAE,EAAGA,GAAyB,GAEpF1zP,EAAQ,CACZ,KAAA7R,EACA,KAAMugQ,GAAuB5zK,CAAI,EACjC,WAAAyzC,CACN,EAEI,YAAK,QAAQ,KAAKvuH,CAAK,EAEhB,IACR,CAUA,kBAAmB,CAClB,MAAO,CAAC,CAAC,KAAK,iBACf,CAGA,cAAe,CACd,MAAMglE,EAASkoL,KAUf,GATIloL,GACFA,EAAO,KAAK,UAAW,IAAI,EAQzB,EAFkB,KAAK,mBAAqB,OAAS4qL,GAAY,IAAI,GAGvE,OAIF,GAAI,KAAK,kBAAmB,CACtB,KAAK,SACPgE,IAAiBd,IAAmB,CAAC,IAAI,EAAG9tL,CAAM,CAAC,GAEnD22K,IACEl1E,GAAO,IAAI,sFAAsF,EAC/FzhG,GACFA,EAAO,mBAAmB,cAAe,MAAM,GAGnD,MACD,CAED,MAAM6uL,EAAmB,KAAK,4BAC1BA,IACY5D,GAAwB,IAAI,EAAE,OAAS/+P,GAAe,GAC9D,aAAa2iQ,CAAgB,CAEtC,CAKA,2BAA4B,CAE3B,GAAI,CAACC,GAAmBtF,GAAW,IAAI,CAAC,EACtC,OAGG,KAAK,QACR7S,IAAel1E,GAAO,KAAK,qEAAqE,EAChG,KAAK,MAAQ,2BAGf,KAAM,CAAE,MAAOstF,EAAmB,eAAgBC,GAA+B/D,GAAwB,IAAI,EAEvGjrL,GADQ+uL,GAAqB7iQ,MACd,UAAW,GAAIg8P,GAAS,EAE7C,GAAI,KAAK,WAAa,GAAM,CAE1BvR,IAAel1E,GAAO,IAAI,kFAAkF,EAExGzhG,GACFA,EAAO,mBAAmB,cAAe,aAAa,EAGxD,MACD,CAKD,MAAM+tL,EAFgBtD,IAAmB,IAAI,EAAE,OAAO/E,GAAQA,IAAS,MAAQ,CAACuJ,IAAiBvJ,CAAI,CAAC,EAE1E,IAAIA,GAAQ8D,GAAW9D,CAAI,CAAC,EAAE,OAAOoJ,EAAkB,EAE7Ev4P,EAAS,KAAK,YAAYiyP,EAAgC,EAE1D0G,EAAc,CAClB,SAAU,CACR,MAAO9F,IAA8B,IAAI,CAC1C,EACD,MAGE2E,EAAM,OAASM,GACXN,EAAM,KAAK,CAAC3jQ,EAAGC,IAAMD,EAAE,gBAAkBC,EAAE,eAAe,EAAE,MAAM,EAAGgkQ,EAAc,EACnFN,EACN,gBAAiB,KAAK,WACtB,UAAW,KAAK,SAChB,YAAa,KAAK,MAClB,KAAM,cACN,sBAAuB,CACrB,kBAAAgB,EACA,2BAAAC,EACA,GAAG5V,GAAkB,CACnB,uBAAwBkT,GAAkC,IAAI,CACxE,CAAS,CACF,EACD,iBAAkBlE,GAA4B,IAAI,EAClD,GAAI7xP,GAAU,CACZ,iBAAkB,CAChB,OAAAA,CACD,CACT,CACA,EAEU63P,EAAeD,GAA0B,KAAK,OAAO,EAG3D,OAFwBC,GAAgB,OAAO,KAAKA,CAAY,EAAE,SAGhEzX,IACEl1E,GAAO,IACL,0DACA,KAAK,UAAU2sF,EAAc,OAAW,CAAC,CACnD,EACMc,EAAY,aAAed,GAGtBc,CACR,CACH,CAEA,SAASP,GAAgBpoQ,EAAO,CAC9B,OAAQA,GAAS,OAAOA,GAAU,UAAaA,aAAiB,MAAQ,MAAM,QAAQA,CAAK,CAC7F,CAGA,SAASuoQ,GAAmB1uN,EAAO,CACjC,MAAO,CAAC,CAACA,EAAM,iBAAmB,CAAC,CAACA,EAAM,WAAa,CAAC,CAACA,EAAM,SAAW,CAAC,CAACA,EAAM,QACpF,CAGA,SAAS6uN,IAAiBvJ,EAAM,CAC9B,OAAOA,aAAgB4I,IAAc5I,EAAK,iBAAgB,CAC5D,CAQA,SAASkJ,IAAiB5M,EAAU,CAClC,MAAMhiL,EAASkoL,KACf,GAAI,CAACloL,EACH,OAGF,MAAMmvL,EAAYnN,EAAS,CAAC,EAC5B,GAAI,CAACmN,GAAaA,EAAU,SAAW,EAAG,CACxCnvL,EAAO,mBAAmB,cAAe,MAAM,EAC/C,MACD,CAED,MAAMovL,EAAYpvL,EAAO,eACrBovL,GACFA,EAAU,KAAKpN,CAAQ,EAAE,KAAK,KAAM7tL,GAAU,CAC5CwiL,IAAel1E,GAAO,MAAM,4BAA6BttG,CAAM,CACrE,CAAK,CAEL,CC7XA,MAAMk7L,GAAuB,8BA0H7B,SAASC,GAAkBjiQ,EAAS,CAClC,MAAM46P,EAAMsH,KACZ,GAAItH,EAAI,kBACN,OAAOA,EAAI,kBAAkB56P,CAAO,EAGtC,MAAMmiQ,EAAgBC,IAAyBpiQ,CAAO,EAChD,CAAE,iBAAAqiQ,EAAkB,WAAYC,CAAgB,EAAKtiQ,EAU3D,OANgBA,EAAQ,MACnBgF,GAAao1P,GAAUp6P,EAAQ,MAAOgF,CAAQ,EAC/Cs9P,IAAqB,OAClBt9P,GAAau9P,IAAeD,EAAkBt9P,CAAQ,EACtDA,GAAaA,KAEL,IAAM,CACnB,MAAMpG,EAAQC,KACR2jQ,EAAaC,IAAc7jQ,CAAK,EAItC,OAFuBoB,EAAQ,cAAgB,CAACwiQ,EAGvC,IAAIzE,GAGN2E,IAAsB,CAC3B,WAAAF,EACA,cAAAL,EACA,iBAAAE,EACA,MAAAzjQ,CACN,CAAK,CACL,CAAG,CACH,CAmCA,SAAS2jQ,IAAelK,EAAMrzP,EAAU,CACtC,MAAM41P,EAAMsH,KACZ,OAAItH,EAAI,eACCA,EAAI,eAAevC,EAAMrzP,CAAQ,EAGnCo1P,GAAUx7P,IACfw5P,GAAiBx5P,EAAOy5P,GAAQ,MAAS,EAClCrzP,EAASpG,CAAK,EACtB,CACH,CAwCA,SAAS8jQ,IAAsB,CAC7B,WAAAF,EACA,cAAAL,EACA,iBAAAE,EACA,MAAAzjQ,CACF,EAEE,CACA,GAAI,CAACi/P,GAAiB,EACpB,OAAO,IAAIE,GAGb,MAAMjE,EAAiBY,KAEvB,IAAIrC,EACJ,GAAImK,GAAc,CAACH,EACjBhK,EAAOsK,IAAgBH,EAAY5jQ,EAAOujQ,CAAa,EACvDlF,GAAmBuF,EAAYnK,CAAI,UAC1BmK,EAAY,CAErB,MAAM1D,EAAMG,GAAkCuD,CAAU,EAClD,CAAE,QAAAtB,EAAS,OAAQxE,CAAY,EAAK8F,EAAW,cAC/CI,EAAgB/F,GAAc2F,CAAU,EAE9CnK,EAAOwK,GACL,CACE,QAAA3B,EACA,aAAAxE,EACA,GAAGyF,CACJ,EACDvjQ,EACAgkQ,CACN,EAEI/D,GAAgBxG,EAAMyG,CAAG,CAC7B,KAAS,CACL,KAAM,CACJ,QAAAoC,EACA,IAAApC,EACA,aAAApC,EACA,QAASkG,CACf,EAAQ,CACF,GAAG9I,EAAe,sBAAuB,EACzC,GAAGl7P,EAAM,sBAAuB,CACtC,EAEIy5P,EAAOwK,GACL,CACE,QAAA3B,EACA,aAAAxE,EACA,GAAGyF,CACJ,EACDvjQ,EACAgkQ,CACN,EAEQ9D,GACFD,GAAgBxG,EAAMyG,CAAG,CAE5B,CAED,OAAAU,IAAanH,CAAI,EAEjBsF,IAAwBtF,EAAMz5P,EAAOk7P,CAAc,EAE5CzB,CACT,CAOA,SAAS+J,IAAyBpiQ,EAAS,CAEzC,MAAM8iQ,EAAa,CACjB,cAFU9iQ,EAAQ,cAAgB,IAEhB,WAClB,GAAGA,CACP,EAEE,GAAIA,EAAQ,UAAW,CACrB,MAAMyP,EAAM,CAAE,GAAGqzP,GACjB,OAAArzP,EAAI,eAAiB4sP,GAAuBr8P,EAAQ,SAAS,EAC7D,OAAOyP,EAAI,UACJA,CACR,CAED,OAAOqzP,CACT,CAEA,SAASZ,IAAS,CAChB,MAAMrK,EAAUF,KAChB,OAAO8C,GAAwB5C,CAAO,CACxC,CAEA,SAASgL,GAAeV,EAAevjQ,EAAOgkQ,EAAe,CAC3D,MAAMjwL,EAASkoL,KACT76P,EAAW2yE,GAAUA,EAAO,WAAU,GAAO,CAAA,EAE7C,CAAE,KAAA72E,EAAO,GAAI,WAAAogI,CAAU,EAAKimI,EAC5B,CAACzC,EAASK,CAAU,EAAInhQ,EAAM,aAAc,EAAC,sBAAsBojQ,EAAoB,EACzF,CAAC,EAAK,EACNhC,IAAWhgQ,EAAS,CAClB,KAAAlE,EACA,cAAA8mQ,EACA,WAAA1mI,EACA,mBAAoB,CAClB,KAAApgI,EACA,cAAA8mQ,CACD,CACT,CAAO,EAECzF,EAAW,IAAI8D,GAAW,CAC9B,GAAGkB,EACH,WAAY,CACV,CAAChH,EAAgC,EAAG,SACpC,GAAGgH,EAAc,UAClB,EACD,QAAAzC,CACJ,CAAG,EACD,OAAIK,IAAe,QACjB5C,EAAS,aAAa/B,GAAuC2E,CAAU,EAGrEptL,GACFA,EAAO,KAAK,YAAawqL,CAAQ,EAG5BA,CACT,CAMA,SAASwF,IAAgBH,EAAY5jQ,EAAOujQ,EAAe,CACzD,KAAM,CAAE,OAAA1C,EAAQ,QAAAyB,CAAS,EAAGsB,EAAW,YAAW,EAC5C9C,EAAU9gQ,EAAM,eAAe,sBAAsBojQ,EAAoB,EAAI,GAAQnF,GAAc2F,CAAU,EAE7GtF,EAAYwC,EACd,IAAIuB,GAAW,CACb,GAAGkB,EACH,aAAc1C,EACd,QAAAyB,EACA,QAAAxB,CACR,CAAO,EACD,IAAI3B,GAAuB,CAAE,QAAAmD,CAAO,CAAE,EAE1CjE,GAAmBuF,EAAYtF,CAAS,EAExC,MAAMvqL,EAASkoL,KACf,OAAIloL,IACFA,EAAO,KAAK,YAAauqL,CAAS,EAE9BiF,EAAc,cAChBxvL,EAAO,KAAK,UAAWuqL,CAAS,GAI7BA,CACT,CAEA,SAASuF,IAAc7jQ,EAAO,CAC5B,MAAMy5P,EAAOC,GAAiB15P,CAAK,EAEnC,GAAI,CAACy5P,EACH,OAGF,MAAM1lL,EAASkoL,KAEf,OADgBloL,EAASA,EAAO,WAAU,EAAK,CAAA,GACnC,2BACH4qL,GAAYlF,CAAI,EAGlBA,CACT,CC7aA,SAAS0K,GACPC,EACAr1P,EACAs7J,EACAhmJ,EAAQ,EACR,CACA,OAAO,IAAI0vO,GAAY,CAACh/O,EAASiM,IAAW,CAC1C,MAAMqjP,EAAYD,EAAW//O,CAAK,EAClC,GAAItV,IAAU,MAAQ,OAAOs1P,GAAc,WACzCtvP,EAAQhG,CAAK,MACR,CACL,MAAMlK,EAASw/P,EAAU,CAAE,GAAGt1P,CAAO,EAAEs7J,CAAI,EAE3CqgF,IAAe2Z,EAAU,IAAMx/P,IAAW,MAAQ2wK,GAAO,IAAI,oBAAoB6uF,EAAU,EAAE,iBAAiB,EAE1GtnM,GAAWl4D,CAAM,EACdA,EACF,KAAKy/P,GAASH,GAAsBC,EAAYE,EAAOj6F,EAAMhmJ,EAAQ,CAAC,EAAE,KAAKtP,CAAO,CAAC,EACrF,KAAK,KAAMiM,CAAM,EAEfmjP,GAAsBC,EAAYv/P,EAAQwlK,EAAMhmJ,EAAQ,CAAC,EAC3D,KAAKtP,CAAO,EACZ,KAAK,KAAMiM,CAAM,CAEvB,CACL,CAAG,CACH,CCzBA,SAASujP,IAAsBx1P,EAAO4C,EAAM,CAC1C,KAAM,CAAE,YAAAuoP,EAAa,KAAAT,EAAM,YAAAoB,EAAa,sBAAA2J,CAAqB,EAAK7yP,EAGlE8yP,IAAiB11P,EAAO4C,CAAI,EAKxB8nP,GACFiL,IAAiB31P,EAAO0qP,CAAI,EAG9BkL,IAAwB51P,EAAOmrP,CAAW,EAC1C0K,IAAwB71P,EAAO8rP,CAAW,EAC1CgK,IAAwB91P,EAAOy1P,CAAqB,CACtD,CAGA,SAASM,GAAenzP,EAAM2kG,EAAW,CACvC,KAAM,CACJ,MAAA2jJ,EACA,KAAAvnB,EACA,KAAAnpD,EACA,SAAAgxE,EACA,MAAAr1G,EACA,sBAAAs/G,EACA,YAAA3J,EACA,YAAAX,EACA,gBAAA6K,EACA,YAAAC,EACA,mBAAAxK,EACA,gBAAAyK,EACA,KAAAxL,CACD,EAAGnjJ,EAEJ4uJ,GAA2BvzP,EAAM,QAASsoP,CAAK,EAC/CiL,GAA2BvzP,EAAM,OAAQ+gO,CAAI,EAC7CwyB,GAA2BvzP,EAAM,OAAQ43K,CAAI,EAC7C27E,GAA2BvzP,EAAM,WAAY4oP,CAAQ,EACrD2K,GAA2BvzP,EAAM,wBAAyB6yP,CAAqB,EAE3Et/G,IACFvzI,EAAK,MAAQuzI,GAGX+/G,IACFtzP,EAAK,gBAAkBszP,GAGrBxL,IACF9nP,EAAK,KAAO8nP,GAGVoB,EAAY,SACdlpP,EAAK,YAAc,CAAC,GAAGA,EAAK,YAAa,GAAGkpP,CAAW,GAGrDX,EAAY,SACdvoP,EAAK,YAAc,CAAC,GAAGA,EAAK,YAAa,GAAGuoP,CAAW,GAGrD6K,EAAgB,SAClBpzP,EAAK,gBAAkB,CAAC,GAAGA,EAAK,gBAAiB,GAAGozP,CAAe,GAGjEC,EAAY,SACdrzP,EAAK,YAAc,CAAC,GAAGA,EAAK,YAAa,GAAGqzP,CAAW,GAGzDrzP,EAAK,mBAAqB,CAAE,GAAGA,EAAK,mBAAoB,GAAG6oP,EAC7D,CAMA,SAAS0K,GAERvzP,EAAMqc,EAAMm3O,EAAU,CACrB,GAAIA,GAAY,OAAO,KAAKA,CAAQ,EAAE,OAAQ,CAE5CxzP,EAAKqc,CAAI,EAAI,CAAE,GAAGrc,EAAKqc,CAAI,CAAC,EAC5B,UAAW/0B,KAAOksQ,EACZ,OAAO,UAAU,eAAe,KAAKA,EAAUlsQ,CAAG,IACpD0Y,EAAKqc,CAAI,EAAE/0B,CAAG,EAAIksQ,EAASlsQ,CAAG,EAGnC,CACH,CAEA,SAASwrQ,IAAiB11P,EAAO4C,EAAM,CACrC,KAAM,CAAE,MAAAsoP,EAAO,KAAAvnB,EAAM,KAAAnpD,EAAM,SAAAgxE,EAAU,MAAAr1G,EAAO,gBAAA+/G,CAAiB,EAAGtzP,EAE1DyzP,EAAejY,GAAkB8M,CAAK,EACxCmL,GAAgB,OAAO,KAAKA,CAAY,EAAE,SAC5Cr2P,EAAM,MAAQ,CAAE,GAAGq2P,EAAc,GAAGr2P,EAAM,QAG5C,MAAMs2P,EAAclY,GAAkBza,CAAI,EACtC2yB,GAAe,OAAO,KAAKA,CAAW,EAAE,SAC1Ct2P,EAAM,KAAO,CAAE,GAAGs2P,EAAa,GAAGt2P,EAAM,OAG1C,MAAMu2P,EAAcnY,GAAkB5jE,CAAI,EACtC+7E,GAAe,OAAO,KAAKA,CAAW,EAAE,SAC1Cv2P,EAAM,KAAO,CAAE,GAAGu2P,EAAa,GAAGv2P,EAAM,OAG1C,MAAMw2P,EAAkBpY,GAAkBoN,CAAQ,EAC9CgL,GAAmB,OAAO,KAAKA,CAAe,EAAE,SAClDx2P,EAAM,SAAW,CAAE,GAAGw2P,EAAiB,GAAGx2P,EAAM,WAG9Cm2I,IACFn2I,EAAM,MAAQm2I,GAIZ+/G,GAAmBl2P,EAAM,OAAS,gBACpCA,EAAM,YAAck2P,EAExB,CAEA,SAASL,IAAwB71P,EAAO8rP,EAAa,CACnD,MAAM2K,EAAoB,CAAC,GAAIz2P,EAAM,aAAe,GAAK,GAAG8rP,CAAW,EACvE9rP,EAAM,YAAcy2P,EAAkB,OAASA,EAAoB,MACrE,CAEA,SAASX,IAAwB91P,EAAOy1P,EAAuB,CAC7Dz1P,EAAM,sBAAwB,CAC5B,GAAGA,EAAM,sBACT,GAAGy1P,CACP,CACA,CAEA,SAASE,IAAiB31P,EAAO0qP,EAAM,CACrC1qP,EAAM,SAAW,CACf,MAAOyuP,IAAmB/D,CAAI,EAC9B,GAAG1qP,EAAM,QACb,EAEEA,EAAM,sBAAwB,CAC5B,uBAAwBsxP,GAAkC5G,CAAI,EAC9D,GAAG1qP,EAAM,qBACb,EAEE,MAAMwvP,EAAWI,GAAYlF,CAAI,EAC3BwL,EAAkB1H,GAAWgB,CAAQ,EAAE,YACzC0G,GAAmB,CAACl2P,EAAM,aAAeA,EAAM,OAAS,gBAC1DA,EAAM,YAAck2P,EAExB,CAMA,SAASN,IAAwB51P,EAAOmrP,EAAa,CAEnDnrP,EAAM,YAAcA,EAAM,YAAc0jP,GAAS1jP,EAAM,WAAW,EAAI,GAGlEmrP,IACFnrP,EAAM,YAAcA,EAAM,YAAY,OAAOmrP,CAAW,GAItDnrP,EAAM,aAAe,CAACA,EAAM,YAAY,QAC1C,OAAOA,EAAM,WAEjB,CCtJA,SAAS02P,IACPrkQ,EACA2N,EACAs7J,EACArqK,EACA+zE,EACAmnL,EACA,CACA,KAAM,CAAE,eAAAwK,EAAiB,EAAG,oBAAAC,EAAsB,GAAI,EAAKvkQ,EACrDwkQ,EAAW,CACf,GAAG72P,EACH,SAAUA,EAAM,UAAYs7J,EAAK,UAAYunF,GAAO,EACpD,UAAW7iP,EAAM,WAAa2gP,GAAwB,CAC1D,EACQmW,EAAex7F,EAAK,cAAgBjpK,EAAQ,aAAa,IAAI7H,GAAKA,EAAE,IAAI,EAE9EusQ,IAAmBF,EAAUxkQ,CAAO,EACpC2kQ,IAA0BH,EAAUC,CAAY,EAE5C9xL,GACFA,EAAO,KAAK,qBAAsBhlE,CAAK,EAIrCA,EAAM,OAAS,QACjBi3P,IAAcJ,EAAUxkQ,EAAQ,WAAW,EAK7C,MAAM6kQ,EAAaC,IAAclmQ,EAAOqqK,EAAK,cAAc,EAEvDA,EAAK,WACP8nF,GAAsByT,EAAUv7F,EAAK,SAAS,EAGhD,MAAM87F,EAAwBpyL,EAASA,EAAO,mBAAkB,EAAK,CAAA,EAK/DpiE,EAAOoqP,MAAiB,eAE9B,GAAIb,EAAgB,CAClB,MAAMkL,EAAgBlL,EAAe,eACrC4J,GAAenzP,EAAMy0P,CAAa,CACnC,CAED,GAAIH,EAAY,CACd,MAAMI,EAAiBJ,EAAW,eAClCnB,GAAenzP,EAAM00P,CAAc,CACpC,CAED,MAAMrB,EAAc,CAAC,GAAI36F,EAAK,aAAe,CAAA,EAAK,GAAG14J,EAAK,WAAW,EACjEqzP,EAAY,SACd36F,EAAK,YAAc26F,GAGrBT,IAAsBqB,EAAUj0P,CAAI,EAEpC,MAAMozP,EAAkB,CACtB,GAAGoB,EAEH,GAAGx0P,EAAK,eACZ,EAIE,OAFewyP,GAAsBY,EAAiBa,EAAUv7F,CAAI,EAEtD,KAAKm+B,IACbA,GAKF89D,IAAe99D,CAAG,EAGhB,OAAOk9D,GAAmB,UAAYA,EAAiB,EAClDa,IAAe/9D,EAAKk9D,EAAgBC,CAAmB,EAEzDn9D,EACR,CACH,CAQA,SAASs9D,IAAmB/2P,EAAO3N,EAAS,CAC1C,KAAM,CAAE,YAAAolQ,EAAa,QAAAC,EAAS,KAAAC,EAAM,eAAAzd,EAAiB,GAAK,EAAG7nP,EAEvD,gBAAiB2N,IACrBA,EAAM,YAAc,gBAAiB3N,EAAUolQ,EAAczG,IAG3DhxP,EAAM,UAAY,QAAa03P,IAAY,SAC7C13P,EAAM,QAAU03P,GAGd13P,EAAM,OAAS,QAAa23P,IAAS,SACvC33P,EAAM,KAAO23P,GAGX33P,EAAM,UACRA,EAAM,QAAU44G,GAAS54G,EAAM,QAASk6O,CAAc,GAGxD,MAAMlsG,EAAYhuI,EAAM,WAAaA,EAAM,UAAU,QAAUA,EAAM,UAAU,OAAO,CAAC,EACnFguI,GAAaA,EAAU,QACzBA,EAAU,MAAQp1B,GAASo1B,EAAU,MAAOksG,CAAc,GAG5D,MAAM9rL,EAAUpuD,EAAM,QAClBouD,GAAWA,EAAQ,MACrBA,EAAQ,IAAMwqD,GAASxqD,EAAQ,IAAK8rL,CAAc,EAEtD,CAEA,MAAM0d,GAA0B,IAAI,QAKpC,SAASX,IAAcj3P,EAAOu/O,EAAa,CACzC,MAAMsY,EAAavd,GAAW,gBAE9B,GAAI,CAACud,EACH,OAGF,IAAIC,EACJ,MAAMC,EAA+BH,GAAwB,IAAIrY,CAAW,EACxEwY,EACFD,EAA0BC,GAE1BD,EAA0B,IAAI,IAC9BF,GAAwB,IAAIrY,EAAauY,CAAuB,GAIlE,MAAME,EAAqB,OAAO,QAAQH,CAAU,EAAE,OACpD,CAAC79K,EAAK,CAACi+K,EAAmBC,CAAY,IAAM,CAC1C,IAAIC,EACJ,MAAMC,EAAoBN,EAAwB,IAAIG,CAAiB,EACnEG,EACFD,EAAcC,GAEdD,EAAc5Y,EAAY0Y,CAAiB,EAC3CH,EAAwB,IAAIG,EAAmBE,CAAW,GAG5D,QAAS3tQ,EAAI2tQ,EAAY,OAAS,EAAG3tQ,GAAK,EAAGA,IAAK,CAEhD,MAAM6tQ,EAAaF,EAAY3tQ,CAAC,EAChC,GAAI6tQ,EAAW,SAAU,CACvBr+K,EAAIq+K,EAAW,QAAQ,EAAIH,EAC3B,KACD,CACF,CACD,OAAOl+K,CACR,EACD,CAAE,CACN,EAEE,GAAI,CAEFh6E,EAAM,UAAU,OAAO,QAAQguI,GAAa,CAE1CA,EAAU,WAAW,OAAO,QAAQoxG,GAAS,CACvCA,EAAM,WACRA,EAAM,SAAW4Y,EAAmB5Y,EAAM,QAAQ,EAE5D,CAAO,CACP,CAAK,CACF,MAAW,CAEX,CACH,CAKA,SAASmY,IAAev3P,EAAO,CAE7B,MAAMg4P,EAAqB,CAAA,EAC3B,GAAI,CAEFh4P,EAAM,UAAU,OAAO,QAAQguI,GAAa,CAE1CA,EAAU,WAAW,OAAO,QAAQoxG,GAAS,CACvCA,EAAM,WACJA,EAAM,SACR4Y,EAAmB5Y,EAAM,QAAQ,EAAIA,EAAM,SAClCA,EAAM,WACf4Y,EAAmB5Y,EAAM,QAAQ,EAAIA,EAAM,UAE7C,OAAOA,EAAM,SAEvB,CAAO,CACP,CAAK,CACF,MAAW,CAEX,CAED,GAAI,OAAO,KAAK4Y,CAAkB,EAAE,SAAW,EAC7C,OAIFh4P,EAAM,WAAaA,EAAM,YAAc,CAAA,EACvCA,EAAM,WAAW,OAASA,EAAM,WAAW,QAAU,GACrD,MAAMs4P,EAASt4P,EAAM,WAAW,OAChC,OAAO,QAAQg4P,CAAkB,EAAE,QAAQ,CAAC,CAAChqN,EAAUuqN,CAAQ,IAAM,CACnED,EAAO,KAAK,CACV,KAAM,YACN,UAAWtqN,EACX,SAAAuqN,CACN,CAAK,CACL,CAAG,CACH,CAMA,SAASvB,IAA0Bh3P,EAAOw4P,EAAkB,CACtDA,EAAiB,OAAS,IAC5Bx4P,EAAM,IAAMA,EAAM,KAAO,CAAA,EACzBA,EAAM,IAAI,aAAe,CAAC,GAAIA,EAAM,IAAI,cAAgB,CAAE,EAAG,GAAGw4P,CAAgB,EAEpF,CAYA,SAAShB,IAAex3P,EAAOgN,EAAOyrP,EAAY,CAChD,GAAI,CAACz4P,EACH,OAAO,KAGT,MAAMtS,EAAa,CACjB,GAAGsS,EACH,GAAIA,EAAM,aAAe,CACvB,YAAaA,EAAM,YAAY,IAAI3Q,IAAM,CACvC,GAAGA,EACH,GAAIA,EAAE,MAAQ,CACZ,KAAMmmM,GAAUnmM,EAAE,KAAM2d,EAAOyrP,CAAU,CACnD,CACA,EAAQ,CACR,EACI,GAAIz4P,EAAM,MAAQ,CAChB,KAAMw1L,GAAUx1L,EAAM,KAAMgN,EAAOyrP,CAAU,CACnD,EACI,GAAIz4P,EAAM,UAAY,CACpB,SAAUw1L,GAAUx1L,EAAM,SAAUgN,EAAOyrP,CAAU,CAC3D,EACI,GAAIz4P,EAAM,OAAS,CACjB,MAAOw1L,GAAUx1L,EAAM,MAAOgN,EAAOyrP,CAAU,CACrD,CACA,EASE,OAAIz4P,EAAM,UAAYA,EAAM,SAAS,OAAStS,EAAW,WACvDA,EAAW,SAAS,MAAQsS,EAAM,SAAS,MAGvCA,EAAM,SAAS,MAAM,OACvBtS,EAAW,SAAS,MAAM,KAAO8nM,GAAUx1L,EAAM,SAAS,MAAM,KAAMgN,EAAOyrP,CAAU,IAKvFz4P,EAAM,QACRtS,EAAW,MAAQsS,EAAM,MAAM,IAAI0qP,IAC1B,CACL,GAAGA,EACH,GAAIA,EAAK,MAAQ,CACf,KAAMl1D,GAAUk1D,EAAK,KAAM19O,EAAOyrP,CAAU,CACtD,CACA,EACK,GAGI/qQ,CACT,CAEA,SAASypQ,IACPlmQ,EACAm6P,EACA,CACA,GAAI,CAACA,EACH,OAAOn6P,EAGT,MAAMimQ,EAAajmQ,EAAQA,EAAM,MAAO,EAAG,IAAIs6P,GAC/C,OAAA2L,EAAW,OAAO9L,CAAc,EACzB8L,CACT,CAMA,SAASwB,IACPp9F,EACA,CACA,GAAKA,EAKL,OAAIq9F,IAAsBr9F,CAAI,EACrB,CAAE,eAAgBA,GAGvBs9F,IAAmBt9F,CAAI,EAClB,CACL,eAAgBA,CACtB,EAGSA,CACT,CAEA,SAASq9F,IACPr9F,EACA,CACA,OAAOA,aAAgBiwF,IAAS,OAAOjwF,GAAS,UAClD,CAEA,MAAMu9F,IAAqB,CACzB,OACA,QACA,QACA,WACA,OACA,cACA,iBACA,oBACF,EAEA,SAASD,IAAmBt9F,EAAM,CAChC,OAAO,OAAO,KAAKA,CAAI,EAAE,KAAKpxK,GAAO2uQ,IAAmB,SAAS3uQ,CAAG,CAAE,CACxE,CCpXA,SAAS4uQ,GAEP9qH,EACAstB,EACA,CACA,OAAOpqK,GAAiB,EAAC,iBAAiB88I,EAAW0qH,IAA+Bp9F,CAAI,CAAC,CAC3F,CAwBA,SAASy9F,GAAa/4P,EAAOs7J,EAAM,CACjC,OAAOpqK,GAAe,EAAG,aAAa8O,EAAOs7J,CAAI,CACnD,CA0MA,SAAS09F,GAAav8O,EAAS,CAC7B,MAAMuoD,EAASkoL,KACTf,EAAiBY,KACjBkM,EAAe/nQ,KAEf,CAAE,QAAAwmQ,EAAS,YAAAD,EAAczG,EAAqB,EAAIhsL,GAAUA,EAAO,WAAY,GAAK,GAGpF,CAAE,UAAAqlH,CAAW,EAAGiwD,GAAW,WAAa,CAAA,EAExCjiF,EAAU8xF,IAAY,CAC1B,QAAAuN,EACA,YAAAD,EACA,KAAMwB,EAAa,WAAa9M,EAAe,QAAS,EACxD,GAAI9hE,GAAa,CAAE,UAAAA,GACnB,GAAG5tK,CACP,CAAG,EAGKy8O,EAAiB/M,EAAe,aACtC,OAAI+M,GAAkBA,EAAe,SAAW,MAC9C5O,GAAc4O,EAAgB,CAAE,OAAQ,QAAU,CAAA,EAGpDC,KAGAhN,EAAe,WAAW9zF,CAAO,EAIjC4gG,EAAa,WAAW5gG,CAAO,EAExBA,CACT,CAKA,SAAS8gG,IAAa,CACpB,MAAMhN,EAAiBY,KACjBkM,EAAe/nQ,KAEfmnK,EAAU4gG,EAAa,WAAY,GAAI9M,EAAe,WAAU,EAClE9zF,GACFkyF,IAAalyF,CAAO,EAEtB+gG,KAGAjN,EAAe,WAAU,EAIzB8M,EAAa,WAAU,CACzB,CAKA,SAASG,IAAqB,CAC5B,MAAMjN,EAAiBY,KACjBkM,EAAe/nQ,KACf8zE,EAASkoL,KAGT70F,EAAU4gG,EAAa,WAAY,GAAI9M,EAAe,WAAU,EAClE9zF,GAAWrzF,GACbA,EAAO,eAAeqzF,CAAO,CAEjC,CAQA,SAASghG,GAAe76P,EAAM,GAAO,CAEnC,GAAIA,EAAK,CACP26P,KACA,MACD,CAGDC,IACF,CC7UA,MAAME,IAAqB,IAG3B,SAASC,IAAmB/c,EAAK,CAC/B,MAAMxjL,EAAWwjL,EAAI,SAAW,GAAGA,EAAI,QAAQ,IAAM,GAC/CI,EAAOJ,EAAI,KAAO,IAAIA,EAAI,IAAI,GAAK,GACzC,MAAO,GAAGxjL,CAAQ,KAAKwjL,EAAI,IAAI,GAAGI,CAAI,GAAGJ,EAAI,KAAO,IAAIA,EAAI,IAAI,GAAK,EAAE,OACzE,CAGA,SAASgd,IAAmBhd,EAAK,CAC/B,MAAO,GAAG+c,IAAmB/c,CAAG,CAAC,GAAGA,EAAI,SAAS,YACnD,CAGA,SAASid,IAAajd,EAAKgM,EAAS,CAClC,OAAO9K,IAAU,CAGf,WAAYlB,EAAI,UAChB,eAAgB8c,IAChB,GAAI9Q,GAAW,CAAE,cAAe,GAAGA,EAAQ,IAAI,IAAIA,EAAQ,OAAO,GACtE,CAAG,CACH,CAOA,SAASkR,IAAsCld,EAAKiM,EAAQD,EAAS,CACnE,OAAOC,GAAkB,GAAG+Q,IAAmBhd,CAAG,CAAC,IAAIid,IAAajd,EAAKgM,CAAO,CAAC,EACnF,CC9BA,MAAMmR,GAAwB,CAAA,EAU9B,SAASC,IAAiB9C,EAAc,CACtC,MAAM+C,EAAqB,CAAA,EAE3B,OAAA/C,EAAa,QAAQjxP,GAAmB,CACtC,KAAM,CAAE,KAAA1X,CAAM,EAAG0X,EAEXi0P,EAAmBD,EAAmB1rQ,CAAI,EAI5C2rQ,GAAoB,CAACA,EAAiB,mBAAqBj0P,EAAgB,oBAI/Eg0P,EAAmB1rQ,CAAI,EAAI0X,EAC/B,CAAG,EAEM,OAAO,OAAOg0P,CAAkB,CACzC,CAGA,SAASE,IAAuB1nQ,EAAS,CACvC,MAAM2nQ,EAAsB3nQ,EAAQ,qBAAuB,GACrD4nQ,EAAmB5nQ,EAAQ,aAGjC2nQ,EAAoB,QAAQE,GAAe,CACzCA,EAAY,kBAAoB,EACpC,CAAG,EAED,IAAIpD,EAEA,MAAM,QAAQmD,CAAgB,EAChCnD,EAAe,CAAC,GAAGkD,EAAqB,GAAGC,CAAgB,EAClD,OAAOA,GAAqB,WACrCnD,EAAepT,GAASuW,EAAiBD,CAAmB,CAAC,EAE7DlD,EAAekD,EAGjB,MAAMG,EAAoBP,IAAiB9C,CAAY,EAMjDsD,EAAaD,EAAkB,UAAUD,GAAeA,EAAY,OAAS,OAAO,EAC1F,GAAIE,EAAa,GAAI,CACnB,KAAM,CAACC,CAAa,EAAIF,EAAkB,OAAOC,EAAY,CAAC,EAC9DD,EAAkB,KAAKE,CAAa,CACrC,CAED,OAAOF,CACT,CAQA,SAASG,IAAkBt1L,EAAQ8xL,EAAc,CAC/C,MAAMyD,EAAmB,CAAA,EAEzB,OAAAzD,EAAa,QAAQoD,GAAe,CAE9BA,GACFM,GAAiBx1L,EAAQk1L,EAAaK,CAAgB,CAE5D,CAAG,EAEMA,CACT,CAKA,SAASE,GAAuBz1L,EAAQ8xL,EAAc,CACpD,UAAWoD,KAAepD,EAEpBoD,GAAeA,EAAY,eAC7BA,EAAY,cAAcl1L,CAAM,CAGtC,CAGA,SAASw1L,GAAiBx1L,EAAQk1L,EAAaK,EAAkB,CAC/D,GAAIA,EAAiBL,EAAY,IAAI,EAAG,CACtCve,IAAel1E,GAAO,IAAI,yDAAyDyzF,EAAY,IAAI,EAAE,EACrG,MACD,CAcD,GAbAK,EAAiBL,EAAY,IAAI,EAAIA,EAGjCP,GAAsB,QAAQO,EAAY,IAAI,IAAM,IAAM,OAAOA,EAAY,WAAc,aAC7FA,EAAY,UAAS,EACrBP,GAAsB,KAAKO,EAAY,IAAI,GAIzCA,EAAY,OAAS,OAAOA,EAAY,OAAU,YACpDA,EAAY,MAAMl1L,CAAM,EAGtB,OAAOk1L,EAAY,iBAAoB,WAAY,CACrD,MAAM7iQ,EAAW6iQ,EAAY,gBAAgB,KAAKA,CAAW,EAC7Dl1L,EAAO,GAAG,kBAAmB,CAAChlE,EAAOs7J,IAASjkK,EAAS2I,EAAOs7J,EAAMt2F,CAAM,CAAC,CAC5E,CAED,GAAI,OAAOk1L,EAAY,cAAiB,WAAY,CAClD,MAAM7iQ,EAAW6iQ,EAAY,aAAa,KAAKA,CAAW,EAEpD5E,EAAY,OAAO,OAAO,CAACt1P,EAAOs7J,IAASjkK,EAAS2I,EAAOs7J,EAAMt2F,CAAM,EAAG,CAC9E,GAAIk1L,EAAY,IACtB,CAAK,EAEDl1L,EAAO,kBAAkBswL,CAAS,CACnC,CAED3Z,IAAel1E,GAAO,IAAI,0BAA0ByzF,EAAY,IAAI,EAAE,CACxE,CC5HA,MAAMQ,GAAqB,8DAiC3B,MAAMC,GAAW,CAkBd,YAAYtoQ,EAAS,CAcpB,GAbA,KAAK,SAAWA,EAChB,KAAK,cAAgB,GACrB,KAAK,eAAiB,EACtB,KAAK,UAAY,GACjB,KAAK,OAAS,GACd,KAAK,iBAAmB,GAEpBA,EAAQ,IACV,KAAK,KAAO8qP,IAAQ9qP,EAAQ,GAAG,EAE/BspP,IAAel1E,GAAO,KAAK,+CAA+C,EAGxE,KAAK,KAAM,CACb,MAAMx2G,EAAMypM,IACV,KAAK,KACLrnQ,EAAQ,OACRA,EAAQ,UAAYA,EAAQ,UAAU,IAAM,MACpD,EACM,KAAK,WAAaA,EAAQ,UAAU,CAClC,OAAQ,KAAK,SAAS,OACtB,mBAAoB,KAAK,mBAAmB,KAAK,IAAI,EACrD,GAAGA,EAAQ,iBACX,IAAA49D,CACR,CAAO,CACF,CACF,CAMA,iBAAiB+9E,EAAWstB,EAAMrqK,EAAO,CACxC,MAAMgyP,EAAUJ,KAGhB,GAAIY,GAAwBz1G,CAAS,EACnC2tG,OAAAA,IAAel1E,GAAO,IAAIi0F,EAAkB,EACrCzX,EAGT,MAAM2X,EAAkB,CACtB,SAAU3X,EACV,GAAG3nF,CACT,EAEI,YAAK,SACH,KAAK,mBAAmBttB,EAAW4sH,CAAe,EAAE,KAAK56P,GACvD,KAAK,cAAcA,EAAO46P,EAAiB3pQ,CAAK,CACjD,CACP,EAEW2pQ,EAAgB,QACxB,CAKA,eACCtuN,EACA6pG,EACAmlB,EACA29F,EACA,CACA,MAAM2B,EAAkB,CACtB,SAAU/X,GAAO,EACjB,GAAGvnF,CACT,EAEUu/F,EAAetiB,GAAsBjsM,CAAO,EAAIA,EAAU,OAAOA,CAAO,EAExEwuN,EAAgBtiB,GAAYlsM,CAAO,EACrC,KAAK,iBAAiBuuN,EAAc1kH,EAAOykH,CAAe,EAC1D,KAAK,mBAAmBtuN,EAASsuN,CAAe,EAEpD,YAAK,SAASE,EAAc,KAAK96P,GAAS,KAAK,cAAcA,EAAO46P,EAAiB3B,CAAY,CAAC,CAAC,EAE5F2B,EAAgB,QACxB,CAKA,aAAa56P,EAAOs7J,EAAM29F,EAAc,CACvC,MAAMhW,EAAUJ,KAGhB,GAAIvnF,GAAQA,EAAK,mBAAqBmoF,GAAwBnoF,EAAK,iBAAiB,EAClFqgF,OAAAA,IAAel1E,GAAO,IAAIi0F,EAAkB,EACrCzX,EAGT,MAAM2X,EAAkB,CACtB,SAAU3X,EACV,GAAG3nF,CACT,EAGUy4F,GADwB/zP,EAAM,uBAAyB,IACb,kBAEhD,YAAK,SAAS,KAAK,cAAcA,EAAO46P,EAAiB7G,GAAqBkF,CAAY,CAAC,EAEpF2B,EAAgB,QACxB,CAKA,eAAeviG,EAAS,CACjB,OAAOA,EAAQ,SAAY,SAC/BsjF,IAAel1E,GAAO,KAAK,4DAA4D,GAEvF,KAAK,YAAYpO,CAAO,EAExBiyF,GAAcjyF,EAAS,CAAE,KAAM,EAAO,CAAA,EAEzC,CAKA,QAAS,CACR,OAAO,KAAK,IACb,CAKA,YAAa,CACZ,OAAO,KAAK,QACb,CAOA,gBAAiB,CAChB,OAAO,KAAK,SAAS,SACtB,CAKA,cAAe,CACd,OAAO,KAAK,UACb,CAKA,MAAMlwJ,EAAS,CACd,MAAMisP,EAAY,KAAK,WACvB,OAAIA,GACF,KAAK,KAAK,OAAO,EACV,KAAK,wBAAwBjsP,CAAO,EAAE,KAAK4yP,GACzC3G,EAAU,MAAMjsP,CAAO,EAAE,KAAK6yP,GAAoBD,GAAkBC,CAAgB,CAC5F,GAEMjW,GAAoB,EAAI,CAElC,CAKA,MAAM58O,EAAS,CACd,OAAO,KAAK,MAAMA,CAAO,EAAE,KAAKrS,IAC9B,KAAK,WAAU,EAAG,QAAU,GAC5B,KAAK,KAAK,OAAO,EACVA,EACR,CACF,CAGA,oBAAqB,CACpB,OAAO,KAAK,gBACb,CAGA,kBAAkBmlQ,EAAgB,CACjC,KAAK,iBAAiB,KAAKA,CAAc,CAC1C,CAGA,MAAO,EAEJ,KAAK,WAAY,GAMjB,KAAK,SAAS,aAAa,KAAK,CAAC,CAAE,KAAA9sQ,CAAI,IAAOA,EAAK,WAAW,WAAW,CAAC,IAE1E,KAAK,mBAAkB,CAE1B,CAOA,qBAAqB+sQ,EAAiB,CACrC,OAAO,KAAK,cAAcA,CAAe,CAC1C,CAKA,eAAehB,EAAa,CAC3B,MAAMiB,EAAqB,KAAK,cAAcjB,EAAY,IAAI,EAG9DM,GAAiB,KAAMN,EAAa,KAAK,aAAa,EAEjDiB,GACHV,GAAuB,KAAM,CAACP,CAAW,CAAC,CAE7C,CAKA,UAAUl6P,EAAOs7J,EAAO,GAAI,CAC3B,KAAK,KAAK,kBAAmBt7J,EAAOs7J,CAAI,EAExC,IAAI8/F,EAAMxI,IAAoB5yP,EAAO,KAAK,KAAM,KAAK,SAAS,UAAW,KAAK,SAAS,MAAM,EAE7F,UAAWkoP,KAAc5sF,EAAK,aAAe,CAAA,EAC3C8/F,EAAMrU,IAAkBqU,EAAKnT,IAA6BC,CAAU,CAAC,EAGvE,MAAMxsL,EAAU,KAAK,aAAa0/L,CAAG,EACjC1/L,GACFA,EAAQ,KAAK2/L,GAAgB,KAAK,KAAK,iBAAkBr7P,EAAOq7P,CAAY,EAAG,IAAI,CAEtF,CAKA,YAAYhjG,EAAS,CACpB,MAAM+iG,EAAM3I,IAAsBp6F,EAAS,KAAK,KAAM,KAAK,SAAS,UAAW,KAAK,SAAS,MAAM,EAInG,KAAK,aAAa+iG,CAAG,CACtB,CAKA,mBAAmBjiM,EAAQ4jE,EAAUu+H,EAAc,CAClD,GAAI,KAAK,SAAS,kBAAmB,CAGnC,MAAMrsN,EAAQ,OAAOqsN,GAAiB,SAAWA,EAAe,EAQ1DpxQ,EAAM,GAAGivE,CAAM,IAAI4jE,CAAQ,GACjC4+G,IAAel1E,GAAO,IAAI,uBAAuBv8K,CAAG,IAAI+kD,EAAQ,EAAI,KAAKA,CAAK,UAAY,EAAE,EAAE,EAC9F,KAAK,UAAU/kD,CAAG,GAAK,KAAK,UAAUA,CAAG,GAAK,GAAK+kD,CACpD,CACF,CAQA,GAAGnvC,EAAMzI,EAAU,CAClB,MAAMkZ,EAAS,KAAK,OAAOzQ,CAAI,EAAI,KAAK,OAAOA,CAAI,GAAK,CAAA,EAGxD,OAAAyQ,EAAM,KAAKlZ,CAAQ,EAMZ,IAAM,CAEX,MAAMkkQ,EAAUhrP,EAAM,QAAQlZ,CAAQ,EAClCkkQ,EAAU,IACZhrP,EAAM,OAAOgrP,EAAS,CAAC,CAE/B,CACG,CAKA,KAAKz7P,KAASoyG,EAAM,CACnB,MAAM25B,EAAY,KAAK,OAAO/rI,CAAI,EAC9B+rI,GACFA,EAAU,QAAQx0I,GAAYA,EAAS,GAAG66G,CAAI,CAAC,CAElD,CAKA,aAAa80I,EAAU,CAGtB,OAFA,KAAK,KAAK,iBAAkBA,CAAQ,EAEhC,KAAK,cAAgB,KAAK,WACrB,KAAK,WAAW,KAAKA,CAAQ,EAAE,KAAK,KAAM7tL,IAC/CwiL,IAAel1E,GAAO,MAAM,6BAA8BttG,CAAM,EACzDA,EACR,GAGHwiL,IAAel1E,GAAO,MAAM,oBAAoB,EAEzCs+E,GAAoB,CAAA,CAAE,EAC9B,CAKA,oBAAqB,CACpB,KAAM,CAAE,aAAA+R,CAAY,EAAK,KAAK,SAC9B,KAAK,cAAgBwD,IAAkB,KAAMxD,CAAY,EACzD2D,GAAuB,KAAM3D,CAAY,CAC1C,CAGA,wBAAwBz+F,EAASr4J,EAAO,CACvC,IAAIw7P,EAAU,GACVC,EAAU,GACd,MAAMxhB,EAAaj6O,EAAM,WAAaA,EAAM,UAAU,OAEtD,GAAIi6O,EAAY,CACdwhB,EAAU,GAEV,UAAWxtH,KAAMgsG,EAAY,CAC3B,MAAMyhB,EAAYztH,EAAG,UACrB,GAAIytH,GAAaA,EAAU,UAAY,GAAO,CAC5CF,EAAU,GACV,KACD,CACF,CACF,CAKD,MAAMG,EAAqBtjG,EAAQ,SAAW,MACjBsjG,GAAsBtjG,EAAQ,SAAW,GAAOsjG,GAAsBH,KAGjGlR,GAAcjyF,EAAS,CACrB,GAAImjG,GAAW,CAAE,OAAQ,WACzB,OAAQnjG,EAAQ,QAAU,OAAOojG,GAAWD,CAAO,CAC3D,CAAO,EACD,KAAK,eAAenjG,CAAO,EAE9B,CAYA,wBAAwBlwJ,EAAS,CAChC,OAAO,IAAI68O,GAAYh/O,GAAW,CAChC,IAAI41P,EAAS,EACb,MAAM7qC,EAAO,EAEP35I,EAAW,YAAY,IAAM,CAC7B,KAAK,gBAAkB,GACzB,cAAcA,CAAQ,EACtBpxE,EAAQ,EAAI,IAEZ41P,GAAU7qC,EACN5oN,GAAWyzP,GAAUzzP,IACvB,cAAcivE,CAAQ,EACtBpxE,EAAQ,EAAK,GAGlB,EAAE+qN,CAAI,CACb,CAAK,CACF,CAGA,YAAa,CACZ,OAAO,KAAK,aAAa,UAAY,IAAS,KAAK,aAAe,MACnE,CAgBA,cACC/wN,EACAs7J,EACA29F,EACA9M,EAAiBY,GAAmB,EACpC,CACA,MAAM16P,EAAU,KAAK,aACfykQ,EAAe,OAAO,KAAK,KAAK,aAAa,EACnD,MAAI,CAACx7F,EAAK,cAAgBw7F,EAAa,OAAS,IAC9Cx7F,EAAK,aAAew7F,GAGtB,KAAK,KAAK,kBAAmB92P,EAAOs7J,CAAI,EAEnCt7J,EAAM,MACTmsP,EAAe,eAAensP,EAAM,UAAYs7J,EAAK,QAAQ,EAGxDo7F,IAAarkQ,EAAS2N,EAAOs7J,EAAM29F,EAAc,KAAM9M,CAAc,EAAE,KAAK1yD,GAAO,CACxF,GAAIA,IAAQ,KACV,OAAOA,EAGT,MAAMgyD,EAAqB,CACzB,GAAGU,EAAe,sBAAuB,EACzC,GAAI8M,EAAeA,EAAa,sBAAqB,EAAK,MAClE,EAGM,GAAI,EADUx/D,EAAI,UAAYA,EAAI,SAAS,QAC7BgyD,EAAoB,CAChC,KAAM,CAAE,QAAS6C,EAAU,OAAAwD,EAAQ,aAAA/C,EAAc,IAAAoC,CAAK,EAAG1F,EACzDhyD,EAAI,SAAW,CACb,MAAO2kD,GAAkB,CACvB,SAAAkQ,EACA,QAASwD,EACT,eAAgB/C,CAC5B,CAAW,EACD,GAAGt1D,EAAI,QACjB,EAEQ,MAAM8sD,EAAyB4K,GAAYC,GAAoC9C,EAAU,IAAI,EAE7F70D,EAAI,sBAAwB,CAC1B,uBAAA8sD,EACA,GAAG9sD,EAAI,qBACjB,CACO,CACD,OAAOA,CACb,CAAK,CACF,CAQA,cAAcz5L,EAAOs7J,EAAO,CAAA,EAAIrqK,EAAO,CACtC,OAAO,KAAK,cAAc+O,EAAOs7J,EAAMrqK,CAAK,EAAE,KAC5C4qQ,GACSA,EAAW,SAEpB1iM,GAAU,CACR,GAAIwiL,GAAa,CAGf,MAAMmgB,EAAc3iM,EAChB2iM,EAAY,WAAa,MAC3Br1F,GAAO,IAAIq1F,EAAY,OAAO,EAE9Br1F,GAAO,KAAKq1F,CAAW,CAE1B,CAEF,CACP,CACG,CAeA,cAAc97P,EAAOs7J,EAAM29F,EAAc,CACxC,MAAM5mQ,EAAU,KAAK,aACf,CAAE,WAAA+/P,CAAY,EAAG//P,EAEjB0pQ,EAAgBC,GAAmBh8P,CAAK,EACxC2rE,EAAUysK,GAAap4O,CAAK,EAC5B6yP,EAAY7yP,EAAM,MAAQ,QAC1Bi8P,EAAkB,0BAA0BpJ,CAAS,KAKrDN,EAAmB,OAAOH,EAAe,IAAc,OAAYD,GAAgBC,CAAU,EACnG,GAAIzmL,GAAW,OAAO4mL,GAAqB,UAAY,KAAK,OAAQ,EAAGA,EACrE,YAAK,mBAAmB,cAAe,QAASvyP,CAAK,EAC9CilP,GACL,IAAI7H,GACF,oFAAoFgV,CAAU,IAC9F,KACD,CACT,EAGI,MAAMjJ,EAAe0J,IAAc,eAAiB,SAAWA,EAGzDmB,GADwBh0P,EAAM,uBAAyB,IACJ,2BAEzD,OAAO,KAAK,cAAcA,EAAOs7J,EAAM29F,EAAcjF,CAA0B,EAC5E,KAAK6C,GAAY,CAChB,GAAIA,IAAa,KACf,WAAK,mBAAmB,kBAAmB1N,EAAcnpP,CAAK,EACxD,IAAIo9O,GAAY,2DAA4D,KAAK,EAIzF,GAD4B9hF,EAAK,MAASA,EAAK,KAAO,aAAe,GAEnE,OAAOu7F,EAGT,MAAM/gQ,EAASomQ,IAAkB,KAAM7pQ,EAASwkQ,EAAUv7F,CAAI,EAC9D,OAAO6gG,IAA0BrmQ,EAAQmmQ,CAAe,CAChE,CAAO,EACA,KAAKG,GAAkB,CACtB,GAAIA,IAAmB,KAAM,CAE3B,GADA,KAAK,mBAAmB,cAAejT,EAAcnpP,CAAK,EACtD+7P,EAAe,CAGjB,MAAMM,EAAY,GAFJr8P,EAAM,OAAS,IAED,OAC5B,KAAK,mBAAmB,cAAe,OAAQq8P,CAAS,CACzD,CACD,MAAM,IAAIjf,GAAY,GAAG6e,CAAe,2CAA4C,KAAK,CAC1F,CAED,MAAM5jG,EAAU4gG,GAAgBA,EAAa,WAAU,EAKvD,GAJI,CAAC8C,GAAiB1jG,GACpB,KAAK,wBAAwBA,EAAS+jG,CAAc,EAGlDL,EAAe,CACjB,MAAMO,EACHF,EAAe,uBAAyBA,EAAe,sBAAsB,2BAC9E,EACIG,EAAiBH,EAAe,MAAQA,EAAe,MAAM,OAAS,EAEtEI,EAAmBF,EAAkBC,EACvCC,EAAmB,GACrB,KAAK,mBAAmB,cAAe,OAAQA,CAAgB,CAElE,CAKD,MAAMC,EAAkBL,EAAe,iBACvC,GAAIL,GAAiBU,GAAmBL,EAAe,cAAgBp8P,EAAM,YAAa,CACxF,MAAMzE,EAAS,SACf6gQ,EAAe,iBAAmB,CAChC,GAAGK,EACH,OAAAlhQ,CACZ,CACS,CAED,YAAK,UAAU6gQ,EAAgB9gG,CAAI,EAC5B8gG,CACf,CAAO,EACA,KAAK,KAAMjjM,GAAU,CACpB,MAAIA,aAAkBikL,GACdjkL,GAGR,KAAK,iBAAiBA,EAAQ,CAC5B,KAAM,CACJ,WAAY,EACb,EACD,kBAAmBA,CAC7B,CAAS,EACK,IAAIikL,GACR;AAAA,UAA8HjkL,CAAM,EAC9I,EACA,CAAO,CACJ,CAKA,SAASuC,EAAS,CACjB,KAAK,iBACAA,EAAQ,KACXnwE,IACE,KAAK,iBACEA,GAET4tE,IACE,KAAK,iBACEA,EAEf,CACG,CAKA,gBAAiB,CAChB,MAAMujM,EAAW,KAAK,UACtB,YAAK,UAAY,GACV,OAAO,QAAQA,CAAQ,EAAE,IAAI,CAAC,CAACxyQ,EAAK69M,CAAQ,IAAM,CACvD,KAAM,CAAC5uI,EAAQ4jE,CAAQ,EAAI7yI,EAAI,MAAM,GAAG,EACxC,MAAO,CACL,OAAAivE,EACA,SAAA4jE,EACA,SAAAgrE,CACR,CACA,CAAK,CACF,CAKA,gBAAiB,CAChB4zC,IAAel1E,GAAO,IAAI,sBAAsB,EAEhD,MAAMi2F,EAAW,KAAK,iBAEtB,GAAIA,EAAS,SAAW,EAAG,CACzB/gB,IAAel1E,GAAO,IAAI,qBAAqB,EAC/C,MACD,CAGD,GAAI,CAAC,KAAK,KAAM,CACdk1E,IAAel1E,GAAO,IAAI,yCAAyC,EACnE,MACD,CAEDk1E,IAAel1E,GAAO,IAAI,oBAAqBi2F,CAAQ,EAEvD,MAAM1V,EAAW0B,IAA2BgU,EAAU,KAAK,SAAS,QAAUngB,GAAY,KAAK,IAAI,CAAC,EAIpG,KAAK,aAAayK,CAAQ,CAC3B,CAOH,CAKA,SAASmV,IACPQ,EACAV,EACA,CACA,MAAMW,EAAoB,GAAGX,CAAe,0CAC5C,GAAIjuM,GAAW2uM,CAAgB,EAC7B,OAAOA,EAAiB,KACtB38P,GAAS,CACP,GAAI,CAACvU,GAAcuU,CAAK,GAAKA,IAAU,KACrC,MAAM,IAAIo9O,GAAYwf,CAAiB,EAEzC,OAAO58P,CACR,EACD0Y,GAAK,CACH,MAAM,IAAI0kO,GAAY,GAAG6e,CAAe,kBAAkBvjP,CAAC,EAAE,CAC9D,CACP,EACS,GAAI,CAACjtB,GAAckxQ,CAAgB,GAAKA,IAAqB,KAClE,MAAM,IAAIvf,GAAYwf,CAAiB,EAEzC,OAAOD,CACT,CAKA,SAAST,IACPl3L,EACA3yE,EACA2N,EACAs7J,EACA,CACA,KAAM,CAAE,WAAAuhG,EAAY,sBAAAC,EAAuB,eAAA7J,CAAc,EAAK5gQ,EAE9D,GAAI+lP,GAAap4O,CAAK,GAAK68P,EACzB,OAAOA,EAAW78P,EAAOs7J,CAAI,EAG/B,GAAI0gG,GAAmBh8P,CAAK,EAAG,CAC7B,GAAIA,EAAM,OAASizP,EAAgB,CACjC,MAAM8J,EAAiB,CAAA,EACvB,UAAWrS,KAAQ1qP,EAAM,MAAO,CAC9B,MAAMg9P,EAAgB/J,EAAevI,CAAI,EACrCsS,EACFD,EAAe,KAAKC,CAAa,EAEjCh4L,EAAO,mBAAmB,cAAe,MAAM,CAElD,CACDhlE,EAAM,MAAQ+8P,CACf,CAED,GAAID,EAAuB,CACzB,GAAI98P,EAAM,MAAO,CAGf,MAAMs8P,EAAkBt8P,EAAM,MAAM,OACpCA,EAAM,sBAAwB,CAC5B,GAAGA,EAAM,sBACT,0BAA2Bs8P,CACrC,CACO,CACD,OAAOQ,EAAsB98P,EAAOs7J,CAAI,CACzC,CACF,CAED,OAAOt7J,CACT,CAEA,SAASo4O,GAAap4O,EAAO,CAC3B,OAAOA,EAAM,OAAS,MACxB,CAEA,SAASg8P,GAAmBh8P,EAAO,CACjC,OAAOA,EAAM,OAAS,aACxB,CCvyBA,SAASi9P,IACPC,EACA7qQ,EACA,CACIA,EAAQ,QAAU,KAChBspP,GACFl1E,GAAO,OAAM,EAGbs1E,GAAe,IAAM,CAEnB,QAAQ,KAAK,8EAA8E,CACnG,CAAO,GAGS7qP,KACR,OAAOmB,EAAQ,YAAY,EAEjC,MAAM2yE,EAAS,IAAIk4L,EAAY7qQ,CAAO,EACtC,OAAA8qQ,IAAiBn4L,CAAM,EACvBA,EAAO,KAAI,EACJA,CACT,CAKA,SAASm4L,IAAiBn4L,EAAQ,CAChC9zE,GAAiB,EAAC,UAAU8zE,CAAM,CACpC,CCvCA,MAAMo4L,IAAgC,GAQtC,SAASC,IACPhrQ,EACAirQ,EACA19P,EAAS0lP,IACPjzP,EAAQ,YAAc+qQ,GACvB,EACD,CACA,IAAIG,EAAa,CAAA,EACjB,MAAM9xP,EAAStD,GAAYvI,EAAO,MAAMuI,CAAO,EAE/C,SAASq1P,EAAKxW,EAAU,CACtB,MAAMyW,EAAwB,CAAA,EAc9B,GAXAvW,GAAoBF,EAAU,CAACv5P,EAAMkG,IAAS,CAC5C,MAAMw1P,EAAef,GAA+Bz0P,CAAI,EACxD,GAAIy1P,IAAcmU,EAAYpU,CAAY,EAAG,CAC3C,MAAMnpP,EAAQ09P,GAAwBjwQ,EAAMkG,CAAI,EAChDtB,EAAQ,mBAAmB,oBAAqB82P,EAAcnpP,CAAK,CAC3E,MACQy9P,EAAsB,KAAKhwQ,CAAI,CAEvC,CAAK,EAGGgwQ,EAAsB,SAAW,EACnC,OAAO1Y,GAAoB,CAAA,CAAE,EAI/B,MAAM4Y,EAAmB7W,GAAeE,EAAS,CAAC,EAAGyW,CAAqB,EAGpEG,EAAsBzkM,GAAW,CACrC+tL,GAAoByW,EAAkB,CAAClwQ,EAAMkG,IAAS,CACpD,MAAMqM,EAAQ09P,GAAwBjwQ,EAAMkG,CAAI,EAChDtB,EAAQ,mBAAmB8mE,EAAQivL,GAA+Bz0P,CAAI,EAAGqM,CAAK,CACtF,CAAO,CACP,EAEU69P,EAAc,IAClBP,EAAY,CAAE,KAAM/V,IAAkBoW,CAAgB,CAAC,CAAE,EAAE,KACzDtvM,IAEMA,EAAS,aAAe,SAAcA,EAAS,WAAa,KAAOA,EAAS,YAAc,MAC5FstL,IAAel1E,GAAO,KAAK,qCAAqCp4G,EAAS,UAAU,iBAAiB,EAGtGkvM,EAAalU,IAAiBkU,EAAYlvM,CAAQ,EAC3CA,GAETh8C,GAAS,CACP,MAAAurP,EAAmB,eAAe,EAC5BvrP,CACP,CACT,EAEI,OAAOzS,EAAO,IAAIi+P,CAAW,EAAE,KAC7B/nQ,GAAUA,EACVuc,GAAS,CACP,GAAIA,aAAiB+qO,GACnBzB,OAAAA,IAAel1E,GAAO,MAAM,+CAA+C,EAC3Em3F,EAAmB,gBAAgB,EAC5B7Y,GAAoB,CAAA,CAAE,EAE7B,MAAM1yO,CAET,CACP,CACG,CAED,MAAO,CACL,KAAAmrP,EACA,MAAA/xP,CACJ,CACA,CAEA,SAASiyP,GAAwBjwQ,EAAMkG,EAAM,CAC3C,GAAI,EAAAA,IAAS,SAAWA,IAAS,eAIjC,OAAO,MAAM,QAAQlG,CAAI,EAAKA,EAAO,CAAC,EAAI,MAC5C,CC/EA,SAASqwQ,IAAiBzrQ,EAASlE,EAAM4vQ,EAAQ,CAAC5vQ,CAAI,EAAGoN,EAAS,MAAO,CACvE,MAAMm3P,EAAWrgQ,EAAQ,WAAa,GAEjCqgQ,EAAS,MACZA,EAAS,IAAM,CACb,KAAM,qBAAqBvkQ,CAAI,GAC/B,SAAU4vQ,EAAM,IAAI5vQ,IAAS,CAC3B,KAAM,GAAGoN,CAAM,YAAYpN,CAAI,GAC/B,QAASksP,EACjB,EAAQ,EACF,QAASA,EACf,GAGEhoP,EAAQ,UAAYqgQ,CACtB,CCvBA,MAAMsL,IAAsB,IAQ5B,SAASC,GAAcvS,EAAYpwF,EAAM,CACvC,MAAMt2F,EAASkoL,KACTf,EAAiBY,KAEvB,GAAI,CAAC/nL,EAAQ,OAEb,KAAM,CAAE,iBAAAk5L,EAAmB,KAAM,eAAAvS,EAAiBqS,KAAwBh5L,EAAO,aAEjF,GAAI2mL,GAAkB,EAAG,OAGzB,MAAME,EAAmB,CAAE,UADTlL,KACoB,GAAG+K,CAAU,EAC7CyS,EAAkBD,EACnBniB,GAAe,IAAMmiB,EAAiBrS,EAAkBvwF,CAAI,CAAC,EAC9DuwF,EAEAsS,IAAoB,OAEpBn5L,EAAO,MACTA,EAAO,KAAK,sBAAuBm5L,EAAiB7iG,CAAI,EAG1D6wF,EAAe,cAAcgS,EAAiBxS,CAAc,EAC9D,CClCA,IAAIyS,GAEJ,MAAMC,IAAmB,mBAEnBC,GAAgB,IAAI,QAEpBC,IAAgC,KAC7B,CACL,KAAMF,IACN,WAAY,CAEVD,GAA2B,SAAS,UAAU,SAI9C,GAAI,CAEF,SAAS,UAAU,SAAW,YAAc3pQ,EAAM,CAChD,MAAM+pQ,EAAmB/gB,GAAoB,IAAI,EAC3ChhO,EACJ6hP,GAAc,IAAIpR,GAAW,CAAA,GAAMsR,IAAqB,OAAYA,EAAmB,KACzF,OAAOJ,GAAyB,MAAM3hP,EAAShoB,CAAI,CAC7D,CACO,MAAW,CAEX,CACF,EACD,MAAMuwE,EAAQ,CACZs5L,GAAc,IAAIt5L,EAAQ,EAAI,CAC/B,CACL,GAcMy5L,IAAgDF,IC1ChDG,IAAwB,CAC5B,oBACA,gDACA,kEACA,wCACA,gDACA,oDACA,gHACA,+CACF,EAIML,IAAmB,iBACnBM,IAA8B,CAACtsQ,EAAU,MACtC,CACL,KAAMgsQ,IACN,aAAar+P,EAAO4+P,EAAO55L,EAAQ,CACjC,MAAM65L,EAAgB75L,EAAO,aACvB85L,EAAgBC,IAAc1sQ,EAASwsQ,CAAa,EAC1D,OAAOG,IAAiBh/P,EAAO8+P,CAAa,EAAI,KAAO9+P,CACxD,CACL,GAGMi/P,IAA8CN,IAEpD,SAASI,IACPG,EAAkB,CAAE,EACpBL,EAAgB,CAAE,EAClB,CACA,MAAO,CACL,UAAW,CAAC,GAAIK,EAAgB,WAAa,CAAA,EAAK,GAAIL,EAAc,WAAa,CAAA,CAAG,EACpF,SAAU,CAAC,GAAIK,EAAgB,UAAY,CAAA,EAAK,GAAIL,EAAc,UAAY,CAAA,CAAG,EACjF,aAAc,CACZ,GAAIK,EAAgB,cAAgB,GACpC,GAAIL,EAAc,cAAgB,GAClC,GAAIK,EAAgB,qBAAuB,CAAE,EAAGR,GACjD,EACD,mBAAoB,CAAC,GAAIQ,EAAgB,oBAAsB,CAAA,EAAK,GAAIL,EAAc,oBAAsB,CAAA,CAAG,EAC/G,eAAgBK,EAAgB,iBAAmB,OAAYA,EAAgB,eAAiB,EACpG,CACA,CAEA,SAASF,IAAiBh/P,EAAO3N,EAAS,CACxC,OAAIA,EAAQ,gBAAkB8sQ,IAAen/P,CAAK,GAChD27O,IACEl1E,GAAO,KAAK;AAAA,SAA6Du8E,GAAoBhjP,CAAK,CAAC,EAAE,EAChG,IAELo/P,IAAgBp/P,EAAO3N,EAAQ,YAAY,GAC7CspP,IACEl1E,GAAO,KACL;AAAA,SAA0Eu8E,GAAoBhjP,CAAK,CAAC,EAC5G,EACW,IAELq/P,IAAgBr/P,CAAK,GACvB27O,IACEl1E,GAAO,KACL;AAAA,SAAuFu8E,GACrFhjP,CACV,CAAS,EACT,EACW,IAELs/P,IAAsBt/P,EAAO3N,EAAQ,kBAAkB,GACzDspP,IACEl1E,GAAO,KACL;AAAA,SAAgFu8E,GAAoBhjP,CAAK,CAAC,EAClH,EACW,IAELu/P,IAAav/P,EAAO3N,EAAQ,QAAQ,GACtCspP,IACEl1E,GAAO,KACL;AAAA,SAAsEu8E,GACpEhjP,CACD,CAAA;AAAA,OAAWw/P,GAAmBx/P,CAAK,CAAC,EAC7C,EACW,IAEJy/P,IAAcz/P,EAAO3N,EAAQ,SAAS,EASpC,IARLspP,IACEl1E,GAAO,KACL;AAAA,SAA2Eu8E,GACzEhjP,CACD,CAAA;AAAA,OAAWw/P,GAAmBx/P,CAAK,CAAC,EAC7C,EACW,GAGX,CAEA,SAASo/P,IAAgBp/P,EAAO0/P,EAAc,CAE5C,OAAI1/P,EAAM,MAAQ,CAAC0/P,GAAgB,CAACA,EAAa,OACxC,GAGFC,IAA0B3/P,CAAK,EAAE,KAAKssC,GAAWysM,GAAyBzsM,EAASozN,CAAY,CAAC,CACzG,CAEA,SAASJ,IAAsBt/P,EAAO4/P,EAAoB,CACxD,GAAI5/P,EAAM,OAAS,eAAiB,CAAC4/P,GAAsB,CAACA,EAAmB,OAC7E,MAAO,GAGT,MAAMzxQ,EAAO6R,EAAM,YACnB,OAAO7R,EAAO4qP,GAAyB5qP,EAAMyxQ,CAAkB,EAAI,EACrE,CAEA,SAASL,IAAav/P,EAAO6/P,EAAU,CAErC,GAAI,CAACA,GAAY,CAACA,EAAS,OACzB,MAAO,GAET,MAAM5vM,EAAMuvM,GAAmBx/P,CAAK,EACpC,OAAQiwD,EAAc8oL,GAAyB9oL,EAAK4vM,CAAQ,EAA9C,EAChB,CAEA,SAASJ,IAAcz/P,EAAO8/P,EAAW,CAEvC,GAAI,CAACA,GAAa,CAACA,EAAU,OAC3B,MAAO,GAET,MAAM7vM,EAAMuvM,GAAmBx/P,CAAK,EACpC,OAAQiwD,EAAa8oL,GAAyB9oL,EAAK6vM,CAAS,EAA9C,EAChB,CAEA,SAASH,IAA0B3/P,EAAO,CACxC,MAAM+/P,EAAmB,CAAA,EAErB//P,EAAM,SACR+/P,EAAiB,KAAK//P,EAAM,OAAO,EAGrC,IAAIggQ,EACJ,GAAI,CAEFA,EAAgBhgQ,EAAM,UAAU,OAAOA,EAAM,UAAU,OAAO,OAAS,CAAC,CACzE,MAAW,CAEX,CAED,OAAIggQ,GACEA,EAAc,QAChBD,EAAiB,KAAKC,EAAc,KAAK,EACrCA,EAAc,MAChBD,EAAiB,KAAK,GAAGC,EAAc,IAAI,KAAKA,EAAc,KAAK,EAAE,GAKpED,CACT,CAEA,SAASZ,IAAen/P,EAAO,CAC7B,GAAI,CAEF,OAAOA,EAAM,UAAU,OAAO,CAAC,EAAE,OAAS,aAC3C,MAAW,CAEX,CACD,MAAO,EACT,CAEA,SAASigQ,IAAiB/gB,EAAS,GAAI,CACrC,QAAS10P,EAAI00P,EAAO,OAAS,EAAG10P,GAAK,EAAGA,IAAK,CAC3C,MAAM40P,EAAQF,EAAO10P,CAAC,EAEtB,GAAI40P,GAASA,EAAM,WAAa,eAAiBA,EAAM,WAAa,gBAClE,OAAOA,EAAM,UAAY,IAE5B,CAED,OAAO,IACT,CAEA,SAASogB,GAAmBx/P,EAAO,CACjC,GAAI,CACF,IAAIk/O,EACJ,GAAI,CAEFA,EAASl/O,EAAM,UAAU,OAAO,CAAC,EAAE,WAAW,MAC/C,MAAW,CAEX,CACD,OAAOk/O,EAAS+gB,IAAiB/gB,CAAM,EAAI,IAC5C,MAAY,CACXvD,OAAAA,IAAel1E,GAAO,MAAM,gCAAgCu8E,GAAoBhjP,CAAK,CAAC,EAAE,EACjF,IACR,CACH,CAEA,SAASq/P,IAAgBr/P,EAAO,CAO9B,OANIA,EAAM,MAMN,CAACA,EAAM,WAAa,CAACA,EAAM,UAAU,QAAUA,EAAM,UAAU,OAAO,SAAW,EAC5E,GAKP,CAACA,EAAM,SAEP,CAACA,EAAM,UAAU,OAAO,KAAKzU,GAASA,EAAM,YAAeA,EAAM,MAAQA,EAAM,OAAS,SAAYA,EAAM,KAAK,CAEnH,CCtNA,MAAM8yQ,IAAmB,SAEnB6B,IAAsB,IAAM,CAChC,IAAIC,EAEJ,MAAO,CACL,KAAM9B,IACN,aAAa+B,EAAc,CAGzB,GAAIA,EAAa,KACf,OAAOA,EAIT,GAAI,CACF,GAAIpB,IAAiBoB,EAAcD,CAAa,EAC9CxkB,OAAAA,IAAel1E,GAAO,KAAK,sEAAsE,EAC1F,IAEjB,MAAoB,CAAE,CAEhB,OAAQ05F,EAAgBC,CACzB,CACL,CACA,EAKMC,IAAsCH,IAG5C,SAASlB,IAAiBoB,EAAcD,EAAe,CACrD,OAAKA,EAID,GAAAG,IAAoBF,EAAcD,CAAa,GAI/CI,IAAsBH,EAAcD,CAAa,GAP5C,EAYX,CAEA,SAASG,IAAoBF,EAAcD,EAAe,CACxD,MAAMK,EAAiBJ,EAAa,QAC9BK,EAAkBN,EAAc,QAoBtC,MAjBI,GAACK,GAAkB,CAACC,GAKnBD,GAAkB,CAACC,GAAqB,CAACD,GAAkBC,GAI5DD,IAAmBC,GAInB,CAACC,GAAmBN,EAAcD,CAAa,GAI/C,CAACQ,GAAkBP,EAAcD,CAAa,EAKpD,CAEA,SAASI,IAAsBH,EAAcD,EAAe,CAC1D,MAAMS,EAAoBC,GAAuBV,CAAa,EACxDW,EAAmBD,GAAuBT,CAAY,EAc5D,MAZI,GAACQ,GAAqB,CAACE,GAIvBF,EAAkB,OAASE,EAAiB,MAAQF,EAAkB,QAAUE,EAAiB,OAIjG,CAACJ,GAAmBN,EAAcD,CAAa,GAI/C,CAACQ,GAAkBP,EAAcD,CAAa,EAKpD,CAEA,SAASQ,GAAkBP,EAAcD,EAAe,CACtD,IAAIY,EAAgBnhB,GAAmBwgB,CAAY,EAC/CY,EAAiBphB,GAAmBugB,CAAa,EAGrD,GAAI,CAACY,GAAiB,CAACC,EACrB,MAAO,GAYT,GARKD,GAAiB,CAACC,GAAoB,CAACD,GAAiBC,IAI7DD,EAAgBA,EAChBC,EAAiBA,EAGbA,EAAe,SAAWD,EAAc,QAC1C,MAAO,GAIT,QAASv2Q,EAAI,EAAGA,EAAIw2Q,EAAe,OAAQx2Q,IAAK,CAE9C,MAAMy2Q,EAASD,EAAex2Q,CAAC,EAEzB02Q,EAASH,EAAcv2Q,CAAC,EAE9B,GACEy2Q,EAAO,WAAaC,EAAO,UAC3BD,EAAO,SAAWC,EAAO,QACzBD,EAAO,QAAUC,EAAO,OACxBD,EAAO,WAAaC,EAAO,SAE3B,MAAO,EAEV,CAED,MAAO,EACT,CAEA,SAASR,GAAmBN,EAAcD,EAAe,CACvD,IAAIgB,EAAqBf,EAAa,YAClCgB,EAAsBjB,EAAc,YAGxC,GAAI,CAACgB,GAAsB,CAACC,EAC1B,MAAO,GAIT,GAAKD,GAAsB,CAACC,GAAyB,CAACD,GAAsBC,EAC1E,MAAO,GAGTD,EAAqBA,EACrBC,EAAsBA,EAGtB,GAAI,CACF,OAAUD,EAAmB,KAAK,EAAE,IAAMC,EAAoB,KAAK,EAAE,CACtE,MAAa,CACZ,MAAO,EACR,CACH,CAEA,SAASP,GAAuB7gQ,EAAO,CACrC,OAAOA,EAAM,WAAaA,EAAM,UAAU,QAAUA,EAAM,UAAU,OAAO,CAAC,CAC9E,CC3KA,MAAM46O,GAASN,GAEf,IAAI+mB,GAAgB,EAKpB,SAASC,IAAsB,CAC7B,OAAOD,GAAgB,CACzB,CAKA,SAASE,KAAoB,CAE3BF,KACA,WAAW,IAAM,CACfA,IACJ,CAAG,CACH,CAWA,SAAS3qQ,GACP5K,EACAuG,EAEC,CAAE,EACHy/B,EAEA,CAQA,GAAI,OAAOhmC,GAAO,WAChB,OAAOA,EAGT,GAAI,CAGF,MAAMimC,EAAUjmC,EAAG,mBACnB,GAAIimC,EACF,OAAI,OAAOA,GAAY,WACdA,EAIAjmC,EAKX,GAAI2xP,GAAoB3xP,CAAE,EACxB,OAAOA,CAEV,MAAW,CAIV,OAAOA,CACR,CAID,MAAM01Q,EAAgB,UAAY,CAChC,MAAM/sQ,EAAO,MAAM,UAAU,MAAM,KAAK,SAAS,EAEjD,GAAI,CACEq9B,GAAU,OAAOA,GAAW,YAC9BA,EAAO,MAAM,KAAM,SAAS,EAI9B,MAAM2vO,EAAmBhtQ,EAAK,IAAK7H,GAAQ8J,GAAK9J,EAAKyF,CAAO,CAAC,EAM7D,OAAOvG,EAAG,MAAM,KAAM21Q,CAAgB,CACvC,OAAQxzH,EAAI,CACX,MAAAszH,MAEA9U,GAAUx7P,GAAS,CACjBA,EAAM,kBAAkB+O,IAClB3N,EAAQ,YACV8wP,GAAsBnjP,EAAO,OAAW,MAAS,EACjDojP,GAAsBpjP,EAAO3N,EAAQ,SAAS,GAGhD2N,EAAM,MAAQ,CACZ,GAAGA,EAAM,MACT,UAAWvL,CACvB,EAEiBuL,EACR,EAED84P,GAAiB7qH,CAAE,CAC3B,CAAO,EAEKA,CACP,CACL,EAKE,GAAI,CACF,UAAWpyC,KAAY/vG,EACjB,OAAO,UAAU,eAAe,KAAKA,EAAI+vG,CAAQ,IACnD2lK,EAAc3lK,CAAQ,EAAI/vG,EAAG+vG,CAAQ,EAG7C,MAAgB,CAAE,CAIhB0hJ,GAAoBikB,EAAe11Q,CAAE,EAErC0xP,GAAyB1xP,EAAI,qBAAsB01Q,CAAa,EAGhE,GAAI,CACiB,OAAO,yBAAyBA,EAAe,MAAM,EACzD,cACb,OAAO,eAAeA,EAAe,OAAQ,CAC3C,KAAM,CACJ,OAAO11Q,EAAG,IACX,CACT,CAAO,CAGP,MAAgB,CAAE,CAEhB,OAAO01Q,CACT,CCnJA,MAAM7lB,GAAe,OAAO,iBAAqB,KAAe,iBCChE,SAAS+lB,GAAmBniB,EAAatxG,EAAI,CAE3C,MAAMixG,EAASyiB,GAAiBpiB,EAAatxG,CAAE,EAEzCD,EAAY,CAChB,KAAM4zH,IAAY3zH,CAAE,EACpB,MAAO4zH,IAAe5zH,CAAE,CAC5B,EAEE,OAAIixG,EAAO,SACTlxG,EAAU,WAAa,CAAE,OAAAkxG,IAGvBlxG,EAAU,OAAS,QAAaA,EAAU,QAAU,KACtDA,EAAU,MAAQ,8BAGbA,CACT,CAEA,SAAS8zH,IACPviB,EACAvxG,EACA+9G,EACAgW,EACA,CACA,MAAM/8L,EAASkoL,KACTyJ,EAAiB3xL,GAAUA,EAAO,WAAU,EAAG,eAG/Cg9L,EAAgBC,IAA2Bj0H,CAAS,EAEpDk9G,EAAQ,CACZ,eAAgBrH,GAAgB71G,EAAW2oH,CAAc,CAC7D,EAEE,GAAIqL,EACF,MAAO,CACL,UAAW,CACT,OAAQ,CAACN,GAAmBniB,EAAayiB,CAAa,CAAC,CACxD,EACD,MAAA9W,CACN,EAGE,MAAMlrP,EAAQ,CACZ,UAAW,CACT,OAAQ,CACN,CACE,KAAMy4O,GAAQzqG,CAAS,EAAIA,EAAU,YAAY,KAAO+zH,EAAuB,qBAAuB,QACtG,MAAOG,IAAgCl0H,EAAW,CAAE,qBAAA+zH,CAAoB,CAAE,CAC3E,CACF,CACF,EACD,MAAA7W,CACJ,EAEE,GAAIa,EAAoB,CACtB,MAAM7M,EAASyiB,GAAiBpiB,EAAawM,CAAkB,EAC3D7M,EAAO,SAGTl/O,EAAM,UAAU,OAAO,CAAC,EAAE,WAAa,CAAE,OAAAk/O,GAE5C,CAED,OAAOl/O,CACT,CAEA,SAASmiQ,GAAe5iB,EAAatxG,EAAI,CACvC,MAAO,CACL,UAAW,CACT,OAAQ,CAACyzH,GAAmBniB,EAAatxG,CAAE,CAAC,CAC7C,CACL,CACA,CAGA,SAAS0zH,GACPpiB,EACAtxG,EACA,CAIA,MAAMm0H,EAAan0H,EAAG,YAAcA,EAAG,OAAS,GAE1Co0H,EAAYC,IAA6Br0H,CAAE,EAC3CgxG,EAAcsjB,IAAqBt0H,CAAE,EAE3C,GAAI,CACF,OAAOsxG,EAAY6iB,EAAYC,EAAWpjB,CAAW,CACtD,MAAW,CAEX,CAED,MAAO,EACT,CAGA,MAAMujB,IAAsB,8BAO5B,SAASF,IAA6Br0H,EAAI,CACxC,OAAIA,GAAMu0H,IAAoB,KAAKv0H,EAAG,OAAO,EACpC,EAGF,CACT,CAUA,SAASs0H,IAAqBt0H,EAAI,CAChC,OAAI,OAAOA,EAAG,aAAgB,SACrBA,EAAG,YAGL,CACT,CAIA,SAASw0H,GAAuBz0H,EAAW,CAGzC,OAAI,OAAO,YAAgB,KAAe,OAAO,YAAY,UAAc,IAElEA,aAAqB,YAAY,UAEjC,EAEX,CAOA,SAAS4zH,IAAY3zH,EAAI,CACvB,MAAM9/I,EAAO8/I,GAAMA,EAAG,KAItB,MAAI,CAAC9/I,GAAQs0Q,GAAuBx0H,CAAE,EAEXA,EAAG,SAAW,MAAM,QAAQA,EAAG,OAAO,GAAKA,EAAG,QAAQ,QAAU,EAC/DA,EAAG,QAAQ,CAAC,EAAI,wBAGrC9/I,CACT,CAOA,SAAS0zQ,IAAe5zH,EAAI,CAC1B,MAAM3hG,EAAU2hG,GAAMA,EAAG,QAEzB,OAAK3hG,EAIDA,EAAQ,OAAS,OAAOA,EAAQ,MAAM,SAAY,SAC7CA,EAAQ,MAAM,QAInBm2N,GAAuBx0H,CAAE,GAAK,MAAM,QAAQA,EAAG,OAAO,GAAKA,EAAG,QAAQ,QAAU,EAC3EA,EAAG,QAAQ,CAAC,EAGd3hG,EAZE,kBAaX,CAMA,SAASo2N,IACPnjB,EACAvxG,EACAstB,EACAqnG,EACA,CACA,MAAM5W,EAAsBzwF,GAAQA,EAAK,oBAAuB,OAC1Dt7J,EAAQ4iQ,GAAsBrjB,EAAavxG,EAAW+9G,EAAoB4W,CAAgB,EAChG,OAAAvf,GAAsBpjP,CAAK,EAC3BA,EAAM,MAAQ,QACVs7J,GAAQA,EAAK,WACft7J,EAAM,SAAWs7J,EAAK,UAEjBypF,GAAoB/kP,CAAK,CAClC,CAMA,SAAS6iQ,IACPtjB,EACAjzM,EACA6pG,EAAQ,OACRmlB,EACAqnG,EACA,CACA,MAAM5W,EAAsBzwF,GAAQA,EAAK,oBAAuB,OAC1Dt7J,EAAQ8iQ,GAAgBvjB,EAAajzM,EAASy/M,EAAoB4W,CAAgB,EACxF,OAAA3iQ,EAAM,MAAQm2I,EACVmlB,GAAQA,EAAK,WACft7J,EAAM,SAAWs7J,EAAK,UAEjBypF,GAAoB/kP,CAAK,CAClC,CAKA,SAAS4iQ,GACPrjB,EACAvxG,EACA+9G,EACA4W,EACAZ,EACA,CACA,IAAI/hQ,EAEJ,GAAIo4O,GAAapqG,CAAS,GAAOA,EAAY,MAG3C,OAAOm0H,GAAe5iB,EADHvxG,EAC2B,KAAK,EAUrD,GAAIqqG,GAAWrqG,CAAS,GAAKsqG,IAAetqG,CAAS,EAAI,CACvD,MAAM+0H,EAAe/0H,EAErB,GAAI,UAAYA,EACdhuI,EAAQmiQ,GAAe5iB,EAAavxG,OAC/B,CACL,MAAM7/I,EAAO40Q,EAAa,OAAS1qB,GAAW0qB,CAAY,EAAI,WAAa,gBACrEz2N,EAAUy2N,EAAa,QAAU,GAAG50Q,CAAI,KAAK40Q,EAAa,OAAO,GAAK50Q,EAC5E6R,EAAQ8iQ,GAAgBvjB,EAAajzM,EAASy/M,EAAoB4W,CAAgB,EAClFxf,GAAsBnjP,EAAOssC,CAAO,CACrC,CACD,MAAI,SAAUy2N,IAEZ/iQ,EAAM,KAAO,CAAE,GAAGA,EAAM,KAAM,oBAAqB,GAAG+iQ,EAAa,IAAI,KAGlE/iQ,CACR,CACD,OAAI2rE,GAAQqiE,CAAS,EAEZm0H,GAAe5iB,EAAavxG,CAAS,EAE1CviJ,GAAcuiJ,CAAS,GAAKyqG,GAAQzqG,CAAS,GAK/ChuI,EAAQ8hQ,IAAqBviB,EADLvxG,EACmC+9G,EAAoBgW,CAAoB,EACnG3e,GAAsBpjP,EAAO,CAC3B,UAAW,EACjB,CAAK,EACMA,IAYTA,EAAQ8iQ,GAAgBvjB,EAAavxG,EAAY+9G,EAAoB4W,CAAgB,EACrFxf,GAAsBnjP,EAAO,GAAGguI,CAAS,GAAI,MAAS,EACtDo1G,GAAsBpjP,EAAO,CAC3B,UAAW,EACf,CAAG,EAEMA,EACT,CAEA,SAAS8iQ,GACPvjB,EACAjzM,EACAy/M,EACA4W,EACA,CACA,MAAM3iQ,EAAQ,CAAA,EAEd,GAAI2iQ,GAAoB5W,EAAoB,CAC1C,MAAM7M,EAASyiB,GAAiBpiB,EAAawM,CAAkB,EAC3D7M,EAAO,SACTl/O,EAAM,UAAY,CAChB,OAAQ,CAAC,CAAE,MAAOssC,EAAS,WAAY,CAAE,OAAA4yM,CAAM,EAAI,CAC3D,EAEG,CAED,GAAI3G,GAAsBjsM,CAAO,EAAG,CAClC,KAAM,CAAE,2BAAA02N,EAA4B,2BAAAC,CAA4B,EAAG32N,EAEnE,OAAAtsC,EAAM,SAAW,CACf,QAASgjQ,EACT,OAAQC,CACd,EACWjjQ,CACR,CAED,OAAAA,EAAM,QAAUssC,EACTtsC,CACT,CAEA,SAASkiQ,IACPl0H,EACA,CAAE,qBAAA+zH,CAAsB,EACxB,CACA,MAAMt+P,EAAOu6O,IAA+BhwG,CAAS,EAC/Ck1H,EAAcnB,EAAuB,oBAAsB,YAIjE,OAAI3pB,GAAapqG,CAAS,EACjB,oCAAoCk1H,CAAW,mBAAmBl1H,EAAU,OAAO,KAGxFyqG,GAAQzqG,CAAS,EAEZ,WADWm1H,IAAmBn1H,CAAS,CACnB,YAAYA,EAAU,IAAI,iBAAiBk1H,CAAW,GAG5E,sBAAsBA,CAAW,eAAez/P,CAAI,EAC7D,CAEA,SAAS0/P,IAAmBr2Q,EAAK,CAC/B,GAAI,CACF,MAAMm9D,EAAY,OAAO,eAAen9D,CAAG,EAC3C,OAAOm9D,EAAYA,EAAU,YAAY,KAAO,MACjD,MAAW,CAEX,CACH,CAGA,SAASg4M,IAA2Bn1Q,EAAK,CACvC,UAAWmyB,KAAQnyB,EACjB,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAKmyB,CAAI,EAAG,CACnD,MAAM1zB,EAAQuB,EAAImyB,CAAI,EACtB,GAAI1zB,aAAiB,MACnB,OAAOA,CAEV,CAIL,CC1XA,SAAS63Q,IACPC,EACA,CACE,SAAA3Q,EACA,OAAAjK,EACA,IAAAjM,CACD,EAGD,CACA,MAAMzqL,EAAU,CACd,SAAUsxM,EAAS,SACnB,QAAS,IAAI,KAAM,EAAC,YAAa,EACjC,GAAI3Q,GACFA,EAAS,KAAO,CACd,IAAK,CACH,KAAMA,EAAS,IAAI,KACnB,QAASA,EAAS,IAAI,OACvB,CACT,EACI,GAAI,CAAC,CAACjK,GAAU,CAAC,CAACjM,GAAO,CAAE,IAAKD,GAAYC,CAAG,EACnD,EACQ/uP,EAAO61Q,IAA+BD,CAAQ,EAEpD,OAAOvc,GAAe/0L,EAAS,CAACtkE,CAAI,CAAC,CACvC,CAEA,SAAS61Q,IAA+BD,EAAU,CAIhD,MAAO,CAHiB,CACtB,KAAM,aACV,EAC2BA,CAAQ,CACnC,CCnBA,MAAME,YAAsB5I,GAAW,CAMpC,YAAYtoQ,EAAS,CACpB,MAAMyuD,EAAO,CAEX,2BAA4B,GAC5B,GAAGzuD,CACT,EACUmxQ,EAAY5oB,GAAO,mBAAqB6H,IAAY,EAC1Dqb,IAAiBh9M,EAAM,UAAW,CAAC,SAAS,EAAG0iN,CAAS,EAExD,MAAM1iN,CAAI,EAENA,EAAK,mBAAqB85L,GAAO,UACnCA,GAAO,SAAS,iBAAiB,mBAAoB,IAAM,CACrDA,GAAO,SAAS,kBAAoB,UACtC,KAAK,eAAc,CAE7B,CAAO,CAEJ,CAKA,mBAAmB5sG,EAAWstB,EAAM,CACnC,OAAOonG,IAAmB,KAAK,SAAS,YAAa10H,EAAWstB,EAAM,KAAK,SAAS,gBAAgB,CACrG,CAKA,iBACChvH,EACA6pG,EAAQ,OACRmlB,EACA,CACA,OAAOunG,IAAiB,KAAK,SAAS,YAAav2N,EAAS6pG,EAAOmlB,EAAM,KAAK,SAAS,gBAAgB,CACxG,CAOA,oBAAoB+nG,EAAU,CAC7B,GAAI,CAAC,KAAK,aAAc,CACtB1nB,IAAel1E,GAAO,KAAK,kDAAkD,EAC7E,MACD,CAED,MAAMugF,EAAWoc,IAA2BC,EAAU,CACpD,SAAU,KAAK,eAAgB,EAC/B,IAAK,KAAK,OAAQ,EAClB,OAAQ,KAAK,WAAU,EAAG,MAChC,CAAK,EAID,KAAK,aAAarc,CAAQ,CAC3B,CAKA,cAAchnP,EAAOs7J,EAAMrqK,EAAO,CACjC,OAAA+O,EAAM,SAAWA,EAAM,UAAY,aAC5B,MAAM,cAAcA,EAAOs7J,EAAMrqK,CAAK,CAC9C,CACH,CCtFA,MAAM0qP,IAAe,OAAO,iBAAqB,KAAe,iBCH1Df,GAASN,GCCTmpB,IAAoB,IAE1B,IAAIC,GACAC,GACAC,GAQJ,SAASC,IAAuCpjQ,EAAS,CACvD,MAAM9M,EAAO,MACbmsP,GAAWnsP,EAAM8M,CAAO,EACxBs/O,GAAgBpsP,EAAMmwQ,GAAa,CACrC,CAGA,SAASA,KAAgB,CACvB,GAAI,CAAClpB,GAAO,SACV,OAMF,MAAMmpB,EAAoB9jB,GAAgB,KAAK,KAAM,KAAK,EACpD+jB,EAAwBC,GAAoBF,EAAmB,EAAI,EACzEnpB,GAAO,SAAS,iBAAiB,QAASopB,EAAuB,EAAK,EACtEppB,GAAO,SAAS,iBAAiB,WAAYopB,EAAuB,EAAK,EAOzE,CAAC,cAAe,MAAM,EAAE,QAAStwQ,GAAW,CAE1C,MAAMm9F,EAAS+pJ,GAASlnP,CAAM,GAAMknP,GAASlnP,CAAM,EAAE,UAEjD,CAACm9F,GAAS,CAACA,EAAM,gBAAkB,CAACA,EAAM,eAAe,kBAAkB,IAI/Eoa,GAAKpa,EAAO,mBAAoB,SAAUqzK,EAA0B,CAClE,OAAO,SAELvwQ,EACA8jE,EACAplE,EACA,CACA,GAAIsB,IAAS,SAAWA,GAAQ,WAC9B,GAAI,CACF,MAAMpJ,EAAK,KACLqyK,EAAYryK,EAAG,oCAAsCA,EAAG,qCAAuC,CAAA,EAC/F45Q,EAAkBvnG,EAASjpK,CAAI,EAAIipK,EAASjpK,CAAI,GAAK,CAAE,SAAU,CAAC,EAExE,GAAI,CAACwwQ,EAAe,QAAS,CAC3B,MAAM1jQ,EAAUwjQ,GAAoBF,CAAiB,EACrDI,EAAe,QAAU1jQ,EACzByjQ,EAAyB,KAAK,KAAMvwQ,EAAM8M,EAASpO,CAAO,CAC3D,CAED8xQ,EAAe,UAChB,MAAW,CAGX,CAGH,OAAOD,EAAyB,KAAK,KAAMvwQ,EAAM8jE,EAAUplE,CAAO,CAC1E,CACA,CAAK,EAED44G,GACEpa,EACA,sBACA,SAAUuzK,EAA6B,CACrC,OAAO,SAELzwQ,EACA8jE,EACAplE,EACA,CACA,GAAIsB,IAAS,SAAWA,GAAQ,WAC9B,GAAI,CACF,MAAMpJ,EAAK,KACLqyK,EAAWryK,EAAG,qCAAuC,GACrD45Q,EAAiBvnG,EAASjpK,CAAI,EAEhCwwQ,IACFA,EAAe,WAEXA,EAAe,UAAY,IAC7BC,EAA4B,KAAK,KAAMzwQ,EAAMwwQ,EAAe,QAAS9xQ,CAAO,EAC5E8xQ,EAAe,QAAU,OACzB,OAAOvnG,EAASjpK,CAAI,GAIlB,OAAO,KAAKipK,CAAQ,EAAE,SAAW,GACnC,OAAOryK,EAAG,oCAGf,MAAW,CAGX,CAGH,OAAO65Q,EAA4B,KAAK,KAAMzwQ,EAAM8jE,EAAUplE,CAAO,CAC/E,CACO,CACP,EACA,CAAG,CACH,CAKA,SAASgyQ,IAA6BrkQ,EAAO,CAE3C,GAAIA,EAAM,OAAS2jQ,GACjB,MAAO,GAGT,GAAI,CAGF,GAAI,CAAC3jQ,EAAM,QAAWA,EAAM,OAAS,YAAc4jQ,GACjD,MAAO,EAEV,MAAW,CAGX,CAKD,MAAO,EACT,CAMA,SAASU,IAAmBzR,EAAWn/P,EAAQ,CAE7C,OAAIm/P,IAAc,WACT,GAGL,CAACn/P,GAAU,CAACA,EAAO,QACd,GAKL,EAAAA,EAAO,UAAY,SAAWA,EAAO,UAAY,YAAcA,EAAO,kBAK5E,CAKA,SAASuwQ,GACPxjQ,EACA8jQ,EAAiB,GACjB,CACA,OAAQvkQ,GAAU,CAIhB,GAAI,CAACA,GAASA,EAAM,gBAClB,OAGF,MAAMtM,EAAS8wQ,IAAexkQ,CAAK,EAGnC,GAAIskQ,IAAmBtkQ,EAAM,KAAMtM,CAAM,EACvC,OAIF8pP,GAAyBx9O,EAAO,kBAAmB,EAAI,EAEnDtM,GAAU,CAACA,EAAO,WAEpB8pP,GAAyB9pP,EAAQ,YAAamvP,GAAO,CAAA,EAGvD,MAAM10P,EAAO6R,EAAM,OAAS,WAAa,QAAUA,EAAM,KAKpDqkQ,IAA6BrkQ,CAAK,IAErCS,EADoB,CAAE,MAAAT,EAAO,KAAA7R,EAAM,OAAQo2Q,CAAc,CACtC,EACnBZ,GAAwB3jQ,EAAM,KAC9B4jQ,GAA4BlwQ,EAASA,EAAO,UAAY,QAI1D,aAAagwQ,EAAe,EAC5BA,GAAkB9oB,GAAO,WAAW,IAAM,CACxCgpB,GAA4B,OAC5BD,GAAwB,MACzB,EAAEF,GAAiB,CACxB,CACA,CAEA,SAASe,IAAexkQ,EAAO,CAC7B,GAAI,CACF,OAAOA,EAAM,MACd,MAAW,CAGV,OAAO,IACR,CACH,CClOA,IAAIykQ,GAUJ,SAASC,GAAiCjkQ,EAAS,CACjD,MAAM9M,EAAO,UACbmsP,GAAWnsP,EAAM8M,CAAO,EACxBs/O,GAAgBpsP,EAAMgxQ,GAAiB,CACzC,CAEA,SAASA,KAAoB,CAC3B,GAAI,CAAC/a,IAAe,EAClB,OAGF,MAAMgb,EAAgBhqB,GAAO,WAC7BA,GAAO,WAAa,YAAcnmP,EAAM,CACtC,MAAM8mB,EAAKq/N,GAAO,SAAS,KAErBp/N,EAAOipP,GAIb,GAHAA,GAAWlpP,EAEX0kO,GAAgB,UADI,CAAE,KAAAzkO,EAAM,GAAAD,EACU,EAClCqpP,EAIF,GAAI,CACF,OAAOA,EAAc,MAAM,KAAMnwQ,CAAI,CACtC,MAAa,CAEb,CAEP,EAEE,SAASowQ,EAA2BC,EAAyB,CAC3D,OAAO,YAAcrwQ,EAAM,CACzB,MAAMw7D,EAAMx7D,EAAK,OAAS,EAAIA,EAAK,CAAC,EAAI,OACxC,GAAIw7D,EAAK,CAEP,MAAMz0C,EAAOipP,GACPlpP,EAAK,OAAO00C,CAAG,EAErBw0M,GAAWlpP,EAEX0kO,GAAgB,UADI,CAAE,KAAAzkO,EAAM,GAAAD,EACU,CACvC,CACD,OAAOupP,EAAwB,MAAM,KAAMrwQ,CAAI,CACrD,CACG,CAEDw2G,GAAK2vI,GAAO,QAAS,YAAaiqB,CAA0B,EAC5D55J,GAAK2vI,GAAO,QAAS,eAAgBiqB,CAA0B,CACjE,CCpDA,MAAME,GAAwB,CAAA,EAW9B,SAASC,IACP72Q,EACA,CACA,MAAM4S,EAASgkQ,GAAsB52Q,CAAI,EACzC,GAAI4S,EACF,OAAOA,EAGT,IAAIkkQ,EAAOrqB,GAAOzsP,CAAI,EAGtB,GAAIoyP,GAAiB0kB,CAAI,EACvB,OAAQF,GAAsB52Q,CAAI,EAAI82Q,EAAK,KAAKrqB,EAAM,EAGxD,MAAM74D,EAAW64D,GAAO,SAExB,GAAI74D,GAAY,OAAOA,EAAS,eAAkB,WAChD,GAAI,CACF,MAAM0+D,EAAU1+D,EAAS,cAAc,QAAQ,EAC/C0+D,EAAQ,OAAS,GACjB1+D,EAAS,KAAK,YAAY0+D,CAAO,EACjC,MAAMykB,EAAgBzkB,EAAQ,cAC1BykB,GAAiBA,EAAc/2Q,CAAI,IACrC82Q,EAAOC,EAAc/2Q,CAAI,GAE3B4zL,EAAS,KAAK,YAAY0+D,CAAO,CAClC,OAAQ/nO,EAAG,CAEVijO,KAAel1E,GAAO,KAAK,uCAAuCt4K,CAAI,6BAA6BA,CAAI,KAAMuqB,CAAC,CAC/G,CAKH,OAAKusP,IAIGF,GAAsB52Q,CAAI,EAAI82Q,EAAK,KAAKrqB,EAAM,EACxD,CAGA,SAASuqB,GAA0Bh3Q,EAAM,CACvC42Q,GAAsB52Q,CAAI,EAAI,MAChC,CC/DA,MAAMi3Q,GAAsB,oBAU5B,SAASC,IAA6B5kQ,EAAS,CAC7C,MAAM9M,EAAO,MACbmsP,GAAWnsP,EAAM8M,CAAO,EACxBs/O,GAAgBpsP,EAAM2xQ,GAAa,CACrC,CAGA,SAASA,KAAgB,CACvB,GAAI,CAAE1qB,GAAS,eACb,OAGF,MAAM2qB,EAAW,eAAe,UAGhCA,EAAS,KAAO,IAAI,MAAMA,EAAS,KAAM,CACvC,MAAMC,EAAcC,EAAgBC,EAAiB,CACnD,MAAMC,EAAiB3kB,GAAoB,EAAG,IAIxCvpP,EAASvM,GAASw6Q,EAAgB,CAAC,CAAC,EAAIA,EAAgB,CAAC,EAAE,YAAa,EAAG,OAC3Ez1M,EAAM41L,IAAS6f,EAAgB,CAAC,CAAC,EAEvC,GAAI,CAACjuQ,GAAU,CAACw4D,EACd,OAAOu1M,EAAa,MAAMC,EAAgBC,CAAe,EAG3DD,EAAeL,EAAmB,EAAI,CACpC,OAAA3tQ,EACA,IAAAw4D,EACA,gBAAiB,CAAE,CAC3B,EAGUx4D,IAAW,QAAUw4D,EAAI,MAAM,YAAY,IAC7Cw1M,EAAe,uBAAyB,IAG1C,MAAMG,EAA4B,IAAM,CAEtC,MAAMC,EAAUJ,EAAeL,EAAmB,EAElD,GAAKS,GAIDJ,EAAe,aAAe,EAAG,CACnC,GAAI,CAGFI,EAAQ,YAAcJ,EAAe,MACtC,MAAW,CAEX,CAED,MAAM3jB,EAAc,CAClB,aAAcd,GAAkB,EAAK,IACrC,eAAA2kB,EACA,IAAKF,CACjB,EACUxlB,GAAgB,MAAO6B,CAAW,CACnC,CACT,EAEM,MAAI,uBAAwB2jB,GAAkB,OAAOA,EAAe,oBAAuB,WACzFA,EAAe,mBAAqB,IAAI,MAAMA,EAAe,mBAAoB,CAC/E,MAAMK,EAA4BC,EAA2BC,EAA4B,CACvF,OAAAJ,IACOE,EAA2B,MAAMC,EAA2BC,CAA0B,CAC9F,CACX,CAAS,EAEDP,EAAe,iBAAiB,mBAAoBG,CAAyB,EAM/EH,EAAe,iBAAmB,IAAI,MAAMA,EAAe,iBAAkB,CAC3E,MACEQ,EACAC,EACAC,EACA,CACA,KAAM,CAAC7kN,EAAQ/1D,CAAK,EAAI46Q,EAElBN,EAAUK,EAAwBd,EAAmB,EAE3D,OAAIS,GAAW36Q,GAASo2D,CAAM,GAAKp2D,GAASK,CAAK,IAC/Cs6Q,EAAQ,gBAAgBvkN,EAAO,YAAa,CAAA,EAAI/1D,GAG3C06Q,EAAyB,MAAMC,EAAyBC,CAAwB,CACxF,CACT,CAAO,EAEMX,EAAa,MAAMC,EAAgBC,CAAe,CAC1D,CACL,CAAG,EAGDH,EAAS,KAAO,IAAI,MAAMA,EAAS,KAAM,CACvC,MAAMa,EAAcC,EAAaC,EAAc,CAC7C,MAAMC,EAAgBF,EAAYjB,EAAmB,EAErD,GAAI,CAACmB,EACH,OAAOH,EAAa,MAAMC,EAAaC,CAAY,EAGjDA,EAAa,CAAC,IAAM,SACtBC,EAAc,KAAOD,EAAa,CAAC,GAGrC,MAAMxkB,EAAc,CAClB,eAAgBd,GAAkB,EAAK,IACvC,IAAKqlB,CACb,EACM,OAAApmB,GAAgB,MAAO6B,CAAW,EAE3BskB,EAAa,MAAMC,EAAaC,CAAY,CACpD,CACL,CAAG,CACH,CAEA,SAASzgB,IAAS51L,EAAK,CACrB,GAAI/kE,GAAS+kE,CAAG,EACd,OAAOA,EAGT,GAAI,CAKF,OAAQA,EAAM,UAClB,MAAe,CAAE,CAGjB,CCjJA,SAASu2M,IACPn0Q,EACAo0Q,EAAczB,IAAwB,OAAO,EAC7C,CACA,IAAI0B,EAAkB,EAClBC,EAAe,EAEnB,SAASrJ,EAAYlvM,EAAS,CAC5B,MAAMw4M,EAAcx4M,EAAQ,KAAK,OACjCs4M,GAAmBE,EACnBD,IAEA,MAAME,EAAiB,CACrB,KAAMz4M,EAAQ,KACd,OAAQ,OACR,eAAgB,SAChB,QAAS/7D,EAAQ,QAYjB,UAAWq0Q,GAAmB,KAASC,EAAe,GACtD,GAAGt0Q,EAAQ,YACjB,EAEI,GAAI,CAACo0Q,EACH,OAAAtB,GAA0B,OAAO,EAC1BlgB,GAAoB,mCAAmC,EAGhE,GAAI,CAEF,OAAOwhB,EAAYp0Q,EAAQ,IAAKw0Q,CAAc,EAAE,KAAKx4M,IACnDq4M,GAAmBE,EACnBD,IACO,CACL,WAAYt4M,EAAS,OACrB,QAAS,CACP,uBAAwBA,EAAS,QAAQ,IAAI,sBAAsB,EACnE,cAAeA,EAAS,QAAQ,IAAI,aAAa,CAClD,CACX,EACO,CACF,OAAQ31C,EAAG,CACV,OAAAysP,GAA0B,OAAO,EACjCuB,GAAmBE,EACnBD,IACO1hB,GAAoBvsO,CAAC,CAC7B,CACF,CAED,OAAO2kP,IAAgBhrQ,EAASirQ,CAAW,CAC7C,CC9DA,MAAMwJ,IAAkB,GAElBC,IAAiB,GAEvB,SAASC,GAAYh5N,EAAU85C,EAAMm/K,EAAQC,EAAO,CAClD,MAAM9nB,EAAQ,CACZ,SAAApxM,EACA,SAAU85C,IAAS,cAAgB42J,GAAmB52J,EACtD,OAAQ,EACZ,EAEE,OAAIm/K,IAAW,SACb7nB,EAAM,OAAS6nB,GAGbC,IAAU,SACZ9nB,EAAM,MAAQ8nB,GAGT9nB,CACT,CAKA,MAAM+nB,IAAsB,yCAGtBC,IACJ,6IAEIC,IAAkB,gCAKlBC,IAAsB5iO,GAAQ,CAElC,MAAM6iO,EAAYJ,IAAoB,KAAKziO,CAAI,EAE/C,GAAI6iO,EAAW,CACb,KAAM,CAAG,CAAAv5N,EAAUtJ,EAAM8iO,CAAG,EAAID,EAChC,OAAOP,GAAYh5N,EAAU0wM,GAAkB,CAACh6M,EAAM,CAAC8iO,CAAG,CAC3D,CAED,MAAMr9H,EAAQi9H,IAAY,KAAK1iO,CAAI,EAEnC,GAAIylG,EAAO,CAGT,GAFeA,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAE,QAAQ,MAAM,IAAM,EAE5C,CACV,MAAMs9H,EAAWJ,IAAgB,KAAKl9H,EAAM,CAAC,CAAC,EAE1Cs9H,IAEFt9H,EAAM,CAAC,EAAIs9H,EAAS,CAAC,EACrBt9H,EAAM,CAAC,EAAIs9H,EAAS,CAAC,EACrBt9H,EAAM,CAAC,EAAIs9H,EAAS,CAAC,EAExB,CAID,KAAM,CAAC3/K,EAAM95C,CAAQ,EAAI05N,GAA8Bv9H,EAAM,CAAC,GAAKu0G,GAAkBv0G,EAAM,CAAC,CAAC,EAE7F,OAAO68H,GAAYh5N,EAAU85C,EAAMqiD,EAAM,CAAC,EAAI,CAACA,EAAM,CAAC,EAAI,OAAWA,EAAM,CAAC,EAAI,CAACA,EAAM,CAAC,EAAI,MAAS,CACtG,CAGH,EAEMw9H,IAAwB,CAACb,IAAiBQ,GAAmB,EAK7DM,IACJ,uIACIC,IAAiB,gDAEjBC,IAAQpjO,GAAQ,CACpB,MAAMylG,EAAQy9H,IAAW,KAAKljO,CAAI,EAElC,GAAIylG,EAAO,CAET,GADeA,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAE,QAAQ,SAAS,EAAI,GAC7C,CACV,MAAMs9H,EAAWI,IAAe,KAAK19H,EAAM,CAAC,CAAC,EAEzCs9H,IAEFt9H,EAAM,CAAC,EAAIA,EAAM,CAAC,GAAK,OACvBA,EAAM,CAAC,EAAIs9H,EAAS,CAAC,EACrBt9H,EAAM,CAAC,EAAIs9H,EAAS,CAAC,EACrBt9H,EAAM,CAAC,EAAI,GAEd,CAED,IAAIn8F,EAAWm8F,EAAM,CAAC,EAClBriD,EAAOqiD,EAAM,CAAC,GAAKu0G,GACvB,OAAC52J,EAAM95C,CAAQ,EAAI05N,GAA8B5/K,EAAM95C,CAAQ,EAExDg5N,GAAYh5N,EAAU85C,EAAMqiD,EAAM,CAAC,EAAI,CAACA,EAAM,CAAC,EAAI,OAAWA,EAAM,CAAC,EAAI,CAACA,EAAM,CAAC,EAAI,MAAS,CACtG,CAGH,EAEM49H,IAAuB,CAAChB,IAAgBe,GAAK,EAiC7CE,IAA0B,CAACL,IAAuBI,GAAoB,EAEtEE,IAAqBppB,GAAkB,GAAGmpB,GAAuB,EAsBjEN,GAAgC,CAAC5/K,EAAM95C,IAAa,CACxD,MAAMk6N,EAAoBpgL,EAAK,QAAQ,kBAAkB,IAAM,GACzDqgL,EAAuBrgL,EAAK,QAAQ,sBAAsB,IAAM,GAEtE,OAAOogL,GAAqBC,EACxB,CACErgL,EAAK,QAAQ,GAAG,IAAM,GAAMA,EAAK,MAAM,GAAG,EAAE,CAAC,EAAM42J,GACnDwpB,EAAoB,oBAAoBl6N,CAAQ,GAAK,wBAAwBA,CAAQ,EACtF,EACD,CAAC85C,EAAM95C,CAAQ,CACrB,EC3KMo6N,GAA4B,KAE5B/J,IAAmB,cAEnBgK,IAA2B,CAACh2Q,EAAU,KAAO,CACjD,MAAMu3H,EAAW,CACf,QAAS,GACT,IAAK,GACL,MAAO,GACP,QAAS,GACT,OAAQ,GACR,IAAK,GACL,GAAGv3H,CACP,EAEE,MAAO,CACL,KAAMgsQ,IACN,MAAMr5L,EAAQ,CACR4kD,EAAS,SACXu2H,IAAiCmoB,IAA6BtjM,CAAM,CAAC,EAEnE4kD,EAAS,KACXi6I,IAAuC0E,IAAyBvjM,EAAQ4kD,EAAS,GAAG,CAAC,EAEnFA,EAAS,KACXy7I,IAA6BmD,IAAyBxjM,CAAM,CAAC,EAE3D4kD,EAAS,OACX43H,IAA+BinB,IAA2BzjM,CAAM,CAAC,EAE/D4kD,EAAS,SACX86I,GAAiCgE,IAA6B1jM,CAAM,CAAC,EAEnE4kD,EAAS,QACX5kD,EAAO,GAAG,kBAAmB2jM,IAA4B3jM,CAAM,CAAC,CAEnE,CACL,CACA,EAEM4jM,IAA2CP,IAKjD,SAASM,IAA4B3jM,EAAQ,CAC3C,OAAO,SAA6BhlE,EAAO,CACrCktP,GAAW,IAAKloL,GAIpBi5L,GACE,CACE,SAAU,UAAUj+P,EAAM,OAAS,cAAgB,cAAgB,OAAO,GAC1E,SAAUA,EAAM,SAChB,MAAOA,EAAM,MACb,QAASgjP,GAAoBhjP,CAAK,CACnC,EACD,CACE,MAAAA,CACD,CACP,CACA,CACA,CAMA,SAASuoQ,IACPvjM,EACA6jM,EACA,CACA,OAAO,SAA6B/mB,EAAa,CAC/C,GAAIoL,GAAW,IAAKloL,EAClB,OAGF,IAAItxE,EACAo1Q,EACA3tB,EAAW,OAAO0tB,GAAQ,SAAWA,EAAI,mBAAqB,OAE9DztB,EACF,OAAOytB,GAAQ,UAAY,OAAOA,EAAI,iBAAoB,SAAWA,EAAI,gBAAkB,OACzFztB,GAAmBA,EAAkBgtB,KACvCzsB,IACEl1E,GAAO,KACL,yCAAyC2hG,EAAyB,oBAAoBhtB,CAAe,oCAAoCgtB,EAAyB,WAC5K,EACMhtB,EAAkBgtB,IAGhB,OAAOjtB,GAAa,WACtBA,EAAW,CAACA,CAAQ,GAItB,GAAI,CACF,MAAMn7O,EAAQ8hP,EAAY,MACpBr/L,EAAUsmN,IAAS/oQ,CAAK,EAAIA,EAAM,OAASA,EAEjDtM,EAASonP,GAAiBr4L,EAAS,CAAE,SAAA04L,EAAU,gBAAAC,CAAiB,CAAA,EAChE0tB,EAAgB/iQ,IAAiB08C,CAAO,CACzC,MAAW,CACV/uD,EAAS,WACV,CAED,GAAIA,EAAO,SAAW,EACpB,OAGF,MAAMg4P,EAAa,CACjB,SAAU,MAAM5J,EAAY,IAAI,GAChC,QAASpuP,CACf,EAEQo1Q,IACFpd,EAAW,KAAO,CAAE,oBAAqBod,CAAa,GAGxD7K,GAAcvS,EAAY,CACxB,MAAO5J,EAAY,MACnB,KAAMA,EAAY,KAClB,OAAQA,EAAY,MAC1B,CAAK,CACL,CACA,CAKA,SAASwmB,IAA6BtjM,EAAQ,CAC5C,OAAO,SAA4B88K,EAAa,CAC9C,GAAIoL,GAAW,IAAKloL,EAClB,OAGF,MAAM0mL,EAAa,CACjB,SAAU,UACV,KAAM,CACJ,UAAW5J,EAAY,KACvB,OAAQ,SACT,EACD,MAAOkE,IAAwBlE,EAAY,KAAK,EAChD,QAASlJ,GAASkJ,EAAY,KAAM,GAAG,CAC7C,EAEI,GAAIA,EAAY,QAAU,SACxB,GAAIA,EAAY,KAAK,CAAC,IAAM,GAC1B4J,EAAW,QAAU,qBAAqB9S,GAASkJ,EAAY,KAAK,MAAM,CAAC,EAAG,GAAG,GAAK,gBAAgB,GACtG4J,EAAW,KAAK,UAAY5J,EAAY,KAAK,MAAM,CAAC,MAGpD,QAIJmc,GAAcvS,EAAY,CACxB,MAAO5J,EAAY,KACnB,MAAOA,EAAY,KACzB,CAAK,CACL,CACA,CAKA,SAAS0mB,IAAyBxjM,EAAQ,CACxC,OAAO,SAAwB88K,EAAa,CAC1C,GAAIoL,GAAW,IAAKloL,EAClB,OAGF,KAAM,CAAE,eAAA2gM,EAAgB,aAAAlS,CAAc,EAAG3R,EAEnCykB,EAAgBzkB,EAAY,IAAIsjB,EAAmB,EAGzD,GAAI,CAACO,GAAkB,CAAClS,GAAgB,CAAC8S,EACvC,OAGF,KAAM,CAAE,OAAA9uQ,EAAQ,IAAAw4D,EAAK,YAAA+4M,EAAa,KAAAtlO,CAAI,EAAK6iO,EAErC3jQ,EAAO,CACX,OAAAnL,EACA,IAAAw4D,EACA,YAAA+4M,CACN,EAEU1tG,EAAO,CACX,IAAKwmF,EAAY,IACjB,MAAOp+M,EACP,eAAAiiO,EACA,aAAAlS,CACN,EAEUt9G,EAAQgkG,GAAwC6uB,CAAW,EAEjE/K,GACE,CACE,SAAU,MACV,KAAAr7P,EACA,KAAM,OACN,MAAAuzI,CACD,EACDmlB,CACN,CACA,CACA,CAKA,SAASmtG,IAA2BzjM,EAAQ,CAC1C,OAAO,SAA0B88K,EAAa,CAC5C,GAAIoL,GAAW,IAAKloL,EAClB,OAGF,KAAM,CAAE,eAAA2gM,EAAgB,aAAAlS,CAAc,EAAG3R,EAGzC,GAAK2R,GAID,EAAA3R,EAAY,UAAU,IAAI,MAAM,YAAY,GAAKA,EAAY,UAAU,SAAW,QAKtF,GAAIA,EAAY,MAAO,CACrB,MAAMl/O,EAAOk/O,EAAY,UACnBxmF,EAAO,CACX,KAAMwmF,EAAY,MAClB,MAAOA,EAAY,KACnB,eAAA6jB,EACA,aAAAlS,CACR,EAEMwK,GACE,CACE,SAAU,QACV,KAAAr7P,EACA,MAAO,QACP,KAAM,MACP,EACD04J,CACR,CACA,KAAW,CACL,MAAMjtG,EAAWyzL,EAAY,SACvBl/O,EAAO,CACX,GAAGk/O,EAAY,UACf,YAAazzL,GAAYA,EAAS,MAC1C,EACYitG,EAAO,CACX,MAAOwmF,EAAY,KACnB,SAAAzzL,EACA,eAAAs3M,EACA,aAAAlS,CACR,EACYt9G,EAAQgkG,GAAwCv3O,EAAK,WAAW,EAEtEq7P,GACE,CACE,SAAU,QACV,KAAAr7P,EACA,KAAM,OACN,MAAAuzI,CACD,EACDmlB,CACR,CACK,CACL,CACA,CAKA,SAASotG,IAA6B1jM,EAAQ,CAC5C,OAAO,SAA4B88K,EAAa,CAC9C,GAAIoL,GAAW,IAAKloL,EAClB,OAGF,IAAIxpD,EAAOsmO,EAAY,KACnBvmO,EAAKumO,EAAY,GACrB,MAAMmnB,EAAYpjB,GAASjL,GAAO,SAAS,IAAI,EAC/C,IAAIsuB,EAAa1tP,EAAOqqO,GAASrqO,CAAI,EAAI,OACzC,MAAM2tP,EAAWtjB,GAAStqO,CAAE,GAGxB,CAAC2tP,GAAc,CAACA,EAAW,QAC7BA,EAAaD,GAKXA,EAAU,WAAaE,EAAS,UAAYF,EAAU,OAASE,EAAS,OAC1E5tP,EAAK4tP,EAAS,UAEZF,EAAU,WAAaC,EAAW,UAAYD,EAAU,OAASC,EAAW,OAC9E1tP,EAAO0tP,EAAW,UAGpBjL,GAAc,CACZ,SAAU,aACV,KAAM,CACJ,KAAAziP,EACA,GAAAD,CACD,CACP,CAAK,CACL,CACA,CAEA,SAASwtP,IAAS/oQ,EAAO,CACvB,MAAO,CAAC,CAACA,GAAS,CAAC,CAAEA,EAAQ,MAC/B,CCjUA,MAAMopQ,IAAuB,CAC3B,cACA,SACA,OACA,mBACA,iBACA,mBACA,oBACA,kBACA,cACA,aACA,qBACA,cACA,aACA,iBACA,eACA,kBACA,cACA,cACA,eACA,qBACA,SACA,eACA,YACA,eACA,gBACA,YACA,kBACA,SACA,iBACA,4BACA,sBACF,EAEM/K,IAAmB,mBAEnBgL,IAAgC,CAACh3Q,EAAU,KAAO,CACtD,MAAMu3H,EAAW,CACf,eAAgB,GAChB,YAAa,GACb,sBAAuB,GACvB,YAAa,GACb,WAAY,GACZ,GAAGv3H,CACP,EAEE,MAAO,CACL,KAAMgsQ,IAGN,WAAY,CACNz0I,EAAS,YACX3e,GAAK2vI,GAAQ,aAAc0uB,EAAiB,EAG1C1/I,EAAS,aACX3e,GAAK2vI,GAAQ,cAAe0uB,EAAiB,EAG3C1/I,EAAS,uBACX3e,GAAK2vI,GAAQ,wBAAyB2uB,GAAQ,EAG5C3/I,EAAS,gBAAkB,mBAAoBgxH,IACjD3vI,GAAK,eAAe,UAAW,OAAQu+J,GAAQ,EAGjD,MAAMC,EAAoB7/I,EAAS,YAC/B6/I,IACkB,MAAM,QAAQA,CAAiB,EAAIA,EAAoBL,KAC/D,QAAQM,GAAgB,CAEvC,CACL,CACA,EAKMC,IAAgDN,IAEtD,SAASC,GAAkB/nD,EAAU,CAEnC,OAAO,YAAc9sN,EAAM,CACzB,MAAMm1Q,EAAmBn1Q,EAAK,CAAC,EAC/B,OAAAA,EAAK,CAAC,EAAIiC,GAAKkzQ,EAAkB,CAC/B,UAAW,CACT,KAAM,CAAE,SAAUjqB,GAAgBp+B,CAAQ,CAAG,EAC7C,QAAS,GACT,KAAM,YACP,CACP,CAAK,EACMA,EAAS,MAAM,KAAM9sN,CAAI,CACpC,CACA,CAGA,SAAS80Q,IAAShoD,EAAU,CAE1B,OAAO,SAAWlqN,EAAU,CAE1B,OAAOkqN,EAAS,MAAM,KAAM,CAC1B7qN,GAAKW,EAAU,CACb,UAAW,CACT,KAAM,CACJ,SAAU,wBACV,QAASsoP,GAAgBp+B,CAAQ,CAClC,EACD,QAAS,GACT,KAAM,YACP,CACT,CAAO,CACP,CAAK,CACL,CACA,CAEA,SAASioD,IAASpD,EAAc,CAE9B,OAAO,YAAc3xQ,EAAM,CAEzB,MAAMo1Q,EAAM,KAGZ,MAF4B,CAAC,SAAU,UAAW,aAAc,oBAAoB,EAEhE,QAAQ5qP,GAAQ,CAC9BA,KAAQ4qP,GAAO,OAAOA,EAAI5qP,CAAI,GAAM,YAEtCgsF,GAAK4+J,EAAK5qP,EAAM,SAAUsiM,EAAU,CAClC,MAAMuoD,EAAc,CAClB,UAAW,CACT,KAAM,CACJ,SAAU7qP,EACV,QAAS0gO,GAAgBp+B,CAAQ,CAClC,EACD,QAAS,GACT,KAAM,YACP,CACb,EAGgBi9C,EAAmB/gB,GAAoBl8B,CAAQ,EACrD,OAAIi9C,IACFsL,EAAY,UAAU,KAAK,QAAUnqB,GAAgB6e,CAAgB,GAIhE9nQ,GAAK6qN,EAAUuoD,CAAW,CAC3C,CAAS,CAET,CAAK,EAEM1D,EAAa,MAAM,KAAM3xQ,CAAI,CACxC,CACA,CAEA,SAASi1Q,IAAiBh2Q,EAAQ,CAEhC,MAAMq2Q,EAAenvB,GAEf/pJ,EAAQk5K,EAAar2Q,CAAM,GAAKq2Q,EAAar2Q,CAAM,EAAE,UAGvD,CAACm9F,GAAS,CAACA,EAAM,gBAAkB,CAACA,EAAM,eAAe,kBAAkB,IAI/Eoa,GAAKpa,EAAO,mBAAoB,SAAU0wH,EAE3C,CACG,OAAO,SAGLjmK,EACAxvD,EACAuG,EACA,CACA,GAAI,CACE,OAAOvG,EAAG,aAAgB,aAO5BA,EAAG,YAAc4K,GAAK5K,EAAG,YAAa,CACpC,UAAW,CACT,KAAM,CACJ,SAAU,cACV,QAAS6zP,GAAgB7zP,CAAE,EAC3B,OAAA4H,CACD,EACD,QAAS,GACT,KAAM,YACP,CACb,CAAW,EAEJ,MAAa,CAEb,CAED,OAAO6tN,EAAS,MAAM,KAAM,CAC1BjmK,EAEA5kD,GAAK5K,EAAK,CACR,UAAW,CACT,KAAM,CACJ,SAAU,mBACV,QAAS6zP,GAAgB7zP,CAAE,EAC3B,OAAA4H,CACD,EACD,QAAS,GACT,KAAM,YACP,CACX,CAAS,EACDrB,CACR,CAAO,CACP,CACA,CAAG,EAED44G,GACEpa,EACA,sBACA,SACEuzK,EAEA,CACA,OAAO,SAGL9oN,EACAxvD,EACAuG,EACA,CAkBA,MAAM23Q,EAAsBl+Q,EAC5B,GAAI,CACF,MAAMm+Q,EAAuBD,GAAuBA,EAAoB,mBACpEC,GACF7F,EAA4B,KAAK,KAAM9oN,EAAW2uN,EAAsB53Q,CAAO,CAElF,MAAW,CAEX,CACD,OAAO+xQ,EAA4B,KAAK,KAAM9oN,EAAW0uN,EAAqB33Q,CAAO,CAC7F,CACK,CACL,EACA,CCpQA,MAAMgsQ,IAAmB,iBAEnB6L,IAA8B,CAAC73Q,EAAU,KAAO,CACpD,MAAMu3H,EAAW,CACf,QAAS,GACT,qBAAsB,GACtB,GAAGv3H,CACP,EAEE,MAAO,CACL,KAAMgsQ,IACN,WAAY,CACV,MAAM,gBAAkB,EACzB,EACD,MAAMr5L,EAAQ,CACR4kD,EAAS,UACXugJ,IAA6BnlM,CAAM,EACnColM,GAAiB,SAAS,GAExBxgJ,EAAS,uBACXygJ,IAA0CrlM,CAAM,EAChDolM,GAAiB,sBAAsB,EAE1C,CACL,CACA,EAEME,IAA8CJ,IAEpD,SAASC,IAA6BnlM,EAAQ,CAC5Co9K,IAAqCx/O,GAAQ,CAC3C,KAAM,CAAE,YAAA28O,EAAa,iBAAAojB,CAAkB,EAAG4H,GAAU,EAEpD,GAAIrd,GAAW,IAAKloL,GAAUs8L,KAC5B,OAGF,KAAM,CAAE,IAAAx7N,EAAK,IAAAmqB,EAAK,KAAAvrB,EAAM,OAAAC,EAAQ,MAAAtyB,CAAO,EAAGzP,EAEpC5C,EAAQwqQ,IACZ5H,GAAsBrjB,EAAaltO,GAASyzB,EAAK,OAAW68N,EAAkB,EAAK,EACnF1yM,EACAvrB,EACAC,CACN,EAEI3kC,EAAM,MAAQ,QAEd+4P,GAAa/4P,EAAO,CAClB,kBAAmBqS,EACnB,UAAW,CACT,QAAS,GACT,KAAM,SACP,CACP,CAAK,CACL,CAAG,CACH,CAEA,SAASg4P,IAA0CrlM,EAAQ,CACzDu9K,IAAkD7pO,GAAK,CACrD,KAAM,CAAE,YAAA6mO,EAAa,iBAAAojB,CAAkB,EAAG4H,GAAU,EAEpD,GAAIrd,GAAW,IAAKloL,GAAUs8L,KAC5B,OAGF,MAAMjvP,EAAQo4P,IAA4B/xP,GAEpC1Y,EAAQw4O,GAAYnmO,CAAK,EAC3Bq4P,IAAiCr4P,CAAK,EACtCuwP,GAAsBrjB,EAAaltO,EAAO,OAAWswP,EAAkB,EAAI,EAE/E3iQ,EAAM,MAAQ,QAEd+4P,GAAa/4P,EAAO,CAClB,kBAAmBqS,EACnB,UAAW,CACT,QAAS,GACT,KAAM,sBACP,CACP,CAAK,CACL,CAAG,CACH,CAEA,SAASo4P,IAA4Bp4P,EAAO,CAC1C,GAAImmO,GAAYnmO,CAAK,EACnB,OAAOA,EAIT,GAAI,CAIF,GAAI,WAAaA,EACf,OAAQA,EAAQ,OAQlB,GAAI,WAAaA,GAAW,WAAaA,EAAQ,OAC/C,OAAQA,EAAQ,OAAO,MAE7B,MAAe,CAAE,CAEf,OAAOA,CACT,CAQA,SAASq4P,IAAiCvxM,EAAQ,CAChD,MAAO,CACL,UAAW,CACT,OAAQ,CACN,CACE,KAAM,qBAEN,MAAO,oDAAoD,OAAOA,CAAM,CAAC,EAC1E,CACF,CACF,CACL,CACA,CAGA,SAASqxM,IAA8BxqQ,EAAOiwD,EAAKvrB,EAAMC,EAAQ,CAE/D,MAAMjsB,EAAK1Y,EAAM,UAAYA,EAAM,WAAa,CAAA,EAE1CuxJ,EAAM74I,EAAE,OAASA,EAAE,QAAU,CAAA,EAE7BiyP,EAAOp5G,EAAG,CAAC,EAAIA,EAAG,CAAC,GAAK,CAAA,EAExBq5G,EAAQD,EAAI,WAAaA,EAAI,YAAc,CAAA,EAE3CE,EAASD,EAAK,OAASA,EAAK,QAAU,CAAA,EAEtC1D,EAAQ,MAAM,SAASviO,EAAQ,EAAE,CAAC,EAAI,OAAYA,EAClDsiO,EAAS,MAAM,SAASviO,EAAM,EAAE,CAAC,EAAI,OAAYA,EACjDsJ,EAAW9iD,GAAS+kE,CAAG,GAAKA,EAAI,OAAS,EAAIA,EAAMyrL,MAGzD,OAAImvB,EAAM,SAAW,GACnBA,EAAM,KAAK,CACT,MAAA3D,EACA,SAAAl5N,EACA,SAAU0wM,GACV,OAAQ,GACR,OAAAuoB,CACN,CAAK,EAGIjnQ,CACT,CAEA,SAASoqQ,GAAiBz2Q,EAAM,CAC9BgoP,IAAel1E,GAAO,IAAI,4BAA4B9yK,CAAI,EAAE,CAC9D,CAEA,SAAS42Q,IAAa,CACpB,MAAMvlM,EAASkoL,KAKf,OAJiBloL,GAAUA,EAAO,WAAU,GAAO,CACjD,YAAa,IAAM,CAAE,EACrB,iBAAkB,EACtB,CAEA,CC5KA,MAAM8lM,IAA2C,KACxC,CACL,KAAM,cACN,gBAAgB9qQ,EAAO,CAErB,GAAI,CAAC46O,GAAO,WAAa,CAACA,GAAO,UAAY,CAACA,GAAO,SACnD,OAIF,MAAM3qL,EAAOjwD,EAAM,SAAWA,EAAM,QAAQ,KAAS46O,GAAO,UAAYA,GAAO,SAAS,KAClF,CAAE,SAAAmwB,CAAU,EAAGnwB,GAAO,UAAY,CAAA,EAClC,CAAE,UAAAvwD,CAAW,EAAGuwD,GAAO,WAAa,CAAA,EAEpC7oL,EAAU,CACd,GAAI/xD,EAAM,SAAWA,EAAM,QAAQ,QACnC,GAAI+qQ,GAAY,CAAE,QAASA,GAC3B,GAAI1gF,GAAa,CAAE,aAAcA,EACzC,EACYj8H,EAAU,CAAE,GAAGpuD,EAAM,QAAS,GAAIiwD,GAAO,CAAE,IAAAA,CAAG,EAAK,QAAA8B,GAEzD/xD,EAAM,QAAUouD,CACjB,CACL,GC1BM48M,IAAc,QACdC,IAAgB,EAEhB5M,IAAmB,eAEnB6M,IAA4B,CAAC74Q,EAAU,KAAO,CAClD,MAAMilH,EAAQjlH,EAAQ,OAAS44Q,IACzB/gR,EAAMmI,EAAQ,KAAO24Q,IAE3B,MAAO,CACL,KAAM3M,IACN,gBAAgBr+P,EAAOs7J,EAAMt2F,EAAQ,CACnC,MAAM3yE,EAAU2yE,EAAO,aAEvBk0K,IAEEwoB,GACArvQ,EAAQ,YACRA,EAAQ,eACRnI,EACAotH,EACAt3G,EACAs7J,CACR,CACK,CACL,CACA,EAKM6vG,IAA4CD,ICpBlD,SAASE,GAAuBxhJ,EAAU,CAKxC,MAAO,CACLq1I,IAA2B,EAC3BR,IAA6B,EAC7BkL,IAA6B,EAC7Bf,IAAwB,EACxB0B,IAA2B,EAC3Ba,IAAyB,EACzB9K,IAAmB,EACnByK,IAAwB,CAC5B,CACA,CAEA,SAASO,IAAoBC,EAAa,GAAI,CAC5C,MAAM9/I,EAAiB,CACrB,oBAAqB4/I,GAAwB,EAC7C,QACE,OAAO,oBAAuB,SAC1B,mBACAxwB,GAAO,gBAAkBA,GAAO,eAAe,GAC7CA,GAAO,eAAe,GACtB,OACR,oBAAqB,GACrB,kBAAmB,EACvB,EAME,OAAI0wB,EAAW,qBAAuB,MACpC,OAAOA,EAAW,oBAGb,CAAE,GAAG9/I,EAAgB,GAAG8/I,EACjC,CAEA,SAASC,KAAkC,CACzC,MAAMC,EACJ,OAAO5wB,GAAO,OAAW,KAAgBA,GAC3C,GAAI,CAAC4wB,EAEH,MAAO,GAGT,MAAMC,EAAeD,EAAyB,OAAS,SAAW,UAC5DE,EAAkBF,EAAyBC,CAAY,EAEvDE,EAAYD,GAAmBA,EAAgB,SAAWA,EAAgB,QAAQ,GAClFl1M,EAAQokL,GAAO,UAAYA,GAAO,SAAS,MAAS,GAEpDgxB,EAAqB,CAAC,oBAAqB,iBAAkB,wBAAyB,uBAAuB,EAG7GC,EACJ,CAAC,CAACF,GAAa/wB,KAAWA,GAAO,KAAOgxB,EAAmB,KAAK5yM,GAAYxC,EAAK,WAAW,GAAGwC,CAAQ,IAAI,CAAC,EAIxG8yM,EAAS,OAAON,EAAyB,GAAO,IAEtD,MAAO,CAAC,CAACG,GAAa,CAACE,GAA4B,CAACC,CACtD,CAoDA,SAASz6H,IAAK06H,EAAiB,GAAI,CACjC,MAAM15Q,EAAUg5Q,IAAoBU,CAAc,EAElD,GAAIR,IAA+B,EAAI,CACrCxvB,GAAe,IAAM,CAEnB,QAAQ,MACN,uJACR,CACA,CAAK,EACD,MACD,CAEGJ,KACG2E,GAAa,GAChB75E,GAAO,KACL,oIACR,GAGE,MAAMo4F,EAAgB,CACpB,GAAGxsQ,EACH,YAAaitP,IAAkCjtP,EAAQ,aAAe41Q,GAAkB,EACxF,aAAclO,IAAuB1nQ,CAAO,EAC5C,UAAWA,EAAQ,WAAam0Q,GACpC,EAEQxhM,EAASi4L,IAAYsG,IAAe1E,CAAa,EAEvD,OAAIxsQ,EAAQ,qBACV25Q,MAGKhnM,CACT,CA2FA,SAASgnM,KAAuB,CAC9B,GAAI,OAAOpxB,GAAO,SAAa,IAAa,CAC1Ce,IAAel1E,GAAO,KAAK,oFAAoF,EAC/G,MACD,CAMDuyF,GAAa,CAAE,eAAgB,EAAI,CAAE,EACrCK,KAGAqL,GAAiC,CAAC,CAAE,KAAAlpP,EAAM,GAAAD,KAAS,CAE7CC,IAAS,QAAaA,IAASD,IACjCy9O,GAAa,CAAE,eAAgB,EAAI,CAAE,EACrCK,KAEN,CAAG,CACH,CCvRA,MAAM4S,GAAgB,CAAC,WAAY,QAAS,QAAQ,ECK9CtwB,GAAe,OAAO,iBAAqB,KAAe,iBCoB1DuwB,IAAa,kBACbC,IAAY1iR,GAAQA,EAAI,QAAQyiR,IAAY//Q,GAAKA,EAAE,YAAW,CAAE,EAAE,QAAQ,QAAS,EAAE,EAErFigR,IAAsB,SACtBC,GAA2B,cAE3Bn1J,IAAS,CAACztH,EAAKwD,IACZxD,EAAI,OAAOwD,CAAC,EAGfq/Q,GAAsB,CAACruD,EAAIsuD,IAAgB,CAC/C,GAAI,CAACtuD,EACH,OAAOouD,GAGT,GAAIpuD,EAAG,QAAUA,EACf,OAAOmuD,IAIT,GAAI,CAACnuD,EAAG,SACN,OAAOouD,GAGT,MAAMh6Q,EAAU4rN,EAAG,SAEnB,IAAI9vN,EAAOkE,EAAQ,MAAQA,EAAQ,eAAiBA,EAAQ,OAC5D,MAAMm6Q,EAAOn6Q,EAAQ,OACrB,GAAI,CAAClE,GAAQq+Q,EAAM,CACjB,MAAM/oP,EAAQ+oP,EAAK,MAAM,iBAAiB,EACtC/oP,IACFt1B,EAAOs1B,EAAM,CAAC,EAEjB,CAED,OACGt1B,EAAO,IAAIg+Q,IAASh+Q,CAAI,CAAC,IAAMk+Q,KAA6BG,GAAQD,IAAgB,GAAQ,OAAOC,CAAI,GAAK,GAEjH,EAEMC,IAA0BxuD,GAAO,CACrC,GAAIA,IAAOA,EAAG,QAAUA,EAAG,UAAYA,EAAG,QAAS,CACjD,MAAMyuD,EAAO,CAAA,EACb,IAAIC,EAA2B,EAC/B,KAAO1uD,GAAI,CACT,GAAIyuD,EAAK,OAAS,EAAG,CAEnB,MAAM77Q,EAAO67Q,EAAKA,EAAK,OAAS,CAAC,EAEjC,GAAI77Q,EAAK,cAAgBotN,EAAG,YAAa,CACvC0uD,IACA1uD,EAAKA,EAAG,QACR,QACV,MAAmB0uD,EAA2B,IACpCD,EAAKA,EAAK,OAAS,CAAC,EAAI,CAAC77Q,EAAM87Q,CAAwB,EACvDA,EAA2B,EAE9B,CACDD,EAAK,KAAKzuD,CAAE,EACZA,EAAKA,EAAG,OACT,CAcD,MAAO;AAAA;AAAA;AAAA;AAAA,EAZeyuD,EACnB,IACC,CAACzuD,EAAI,IACH,IACG,IAAM,EAAI,QAAU/mG,IAAO,IAAK,EAAI,EAAI,CAAC,IACzC,MAAM,QAAQ+mG,CAAE,EACb,GAAGquD,GAAoBruD,EAAG,CAAC,CAAC,CAAC,QAAQA,EAAG,CAAC,CAAC,oBAC1CquD,GAAoBruD,CAAE,EACtC,EACO,EACA,KAAK;AAAA,CAAI,CAE2B,EACxC,CAED,MAAO;AAAA;AAAA,YAAiBquD,GAAoBruD,CAAE,CAAC,GACjD,ECnGM2uD,IAAqB,CAAChwP,EAAKvqB,IAAY,CAC3C,KAAM,CAAE,aAAcw6Q,EAAsB,YAAAC,EAAa,OAAA/iD,CAAQ,EAAGntM,EAAI,OAExEA,EAAI,OAAO,aAAe,CAACvK,EAAO4rM,EAAI8uD,IAAkB,CACtD,MAAMjE,EAAgBwD,GAAoBruD,EAAI,EAAK,EAC7C+uD,EAAQ/uD,EAAKwuD,IAAuBxuD,CAAE,EAAI,GAC1Cy0C,EAAW,CACf,cAAAoW,EACA,cAAAiE,EACA,MAAAC,CACN,EAyBI,GAvBI36Q,EAAQ,aAAe4rN,IAGrBA,EAAG,UAAYA,EAAG,SAAS,UAC7By0C,EAAS,UAAYz0C,EAAG,SAAS,UACxBA,EAAG,SACZy0C,EAAS,UAAYz0C,EAAG,SAK5B,WAAW,IAAM,CACf66C,GAAiBzmP,EAAO,CACtB,eAAgB,CAAE,SAAU,CAAE,IAAKqgP,CAAQ,CAAI,EAC/C,UAAW,CAAE,QAAS,EAAO,CACrC,CAAO,CACP,CAAK,EAGG,OAAOma,GAAyB,YAAcjwP,EAAI,OAAO,cAC1DiwP,EAAuB,KAAKjwP,EAAKvK,EAAO4rM,EAAI8uD,CAAa,EAGxD16Q,EAAQ,UAAW,CACrB,MAAM46Q,EAAa,OAAO,QAAY,IAChC3gO,EAAU,YAAYygO,CAAa,MAAM16P,GAASA,EAAM,UAAU,IAEpEy6P,EACDA,EAAc,KAAK,KAAMxgO,EAAS2xK,EAAI+uD,CAAK,EACnCC,GAAc,CAACljD,GACxBgyB,GAAe,IAAM,CAEnB,QAAQ,MAAM,eAAezvM,CAAO,GAAG0gO,CAAK,EAAE,CACxD,CAAS,CAEJ,CACL,CACA,EC/CME,GAAS,SAGTC,IAAQ,CACZ,SAAU,CAAC,YAAa,aAAa,EACrC,OAAQ,CAAC,eAAgB,SAAS,EAElC,QAAS,CAAC,gBAAiB,WAAW,EAEtC,QAAS,CAAC,gBAAiB,WAAW,EACtC,MAAO,CAAC,cAAe,SAAS,EAChC,OAAQ,CAAC,eAAgB,SAAS,CACpC,EAGA,SAASC,IAAenvD,EAAI3lI,EAAWnwE,EAAS,CAC1C81M,EAAG,uBACL,aAAaA,EAAG,qBAAqB,EAGvCA,EAAG,sBAAwB,WAAW,IAAM,CACtCA,EAAG,OAASA,EAAG,MAAM,mBACvBA,EAAG,MAAM,iBAAiB,IAAI3lI,CAAS,EACvC2lI,EAAG,MAAM,iBAAmB,OAE/B,EAAE91M,CAAO,CACZ,CAGA,SAASklQ,IAAmBC,EAAiBC,EAAe,CAC1D,SAASC,EAAqBr/Q,EAAM,CAClC,OAAOA,EAAK,QAAQ,8BAA+B,IAAI,CACxD,CAMD,OAJkBm/Q,EAAgB,KAAKG,GAC9BD,EAAqBD,CAAa,IAAMC,EAAqBC,CAAK,CAC1E,CAGH,CAEA,MAAMC,IAAuBr7Q,GAAY,CACvC,MAAMke,GAASle,EAAQ,OAAS,CAAE,GAC/B,OAAO45Q,EAAa,EAEpB,OAAO,CAAC1gR,EAAO+pB,EAAOlb,IAASA,EAAK,QAAQ7O,CAAK,IAAM+pB,CAAK,EAEzD0F,EAAS,CAAA,EAEf,UAAW2yP,KAAap9P,EAAO,CAG7B,MAAMq9P,EAAgBT,IAAMQ,CAAS,EACrC,GAAI,CAACC,EAAe,CAClBjyB,IAAel1E,GAAO,KAAK,iBAAiBknG,CAAS,EAAE,EACvD,QACD,CAED,UAAWE,KAAgBD,EACzB5yP,EAAO6yP,CAAY,EAAI,UAAY,CACjC,MAAM16N,EAAS,KAAK,QAAU,KAE1BA,GACiB08M,OAEjB,KAAK,iBACH,KAAK,kBACLyE,GAAkB,CAChB,KAAM,qBACN,GAAI,GAAG4Y,EAAM,UACb,WAAY,CACV,CAACvf,EAAgC,EAAG,aACrC,CACjB,CAAe,GAKP,MAAMx/P,EAAOm+Q,GAAoB,KAAM,EAAK,EAEtCz6Q,EAAc,MAAM,QAAQQ,EAAQ,eAAe,EACrDg7Q,IAAmBh7Q,EAAQ,gBAAiBlE,CAAI,EAChDkE,EAAQ,gBAGZ,GAAI,GAAC8gD,GAAU,CAACthD,GAQhB,GAJA,KAAK,cAAgB,KAAK,eAAiB,CAAA,EAIvCg8Q,GAAgBD,EAAc,CAAC,GAEjC,GADoB,KAAK,OAAS,KAAK,MAAM,kBAAqB/d,KAClD,CAId,MAAMie,EAAU,KAAK,cAAcH,CAAS,EACxCG,GACFA,EAAQ,IAAG,EAGb,KAAK,cAAcH,CAAS,EAAIrZ,GAAkB,CAChD,KAAM,OAAOnmQ,CAAI,GACjB,GAAI,GAAG++Q,EAAM,IAAIS,CAAS,GAC1B,WAAY,CACV,CAAChgB,EAAgC,EAAG,aACrC,EAED,aAAc,EAC5B,CAAa,CACF,MACI,CAEL,MAAMjD,EAAO,KAAK,cAAcijB,CAAS,EAGzC,GAAI,CAACjjB,EAAM,OACXA,EAAK,IAAG,EAER0iB,IAAe,KAAMpsB,GAAoB,EAAE3uP,EAAQ,OAAO,CAC3D,CACT,CAEG,CAED,OAAO2oB,CACT,EChIM+yP,IAAgBzzB,GAEhB0zB,IAAiB,CACrB,IAAKD,IAAc,IACnB,YAAa,GACb,UAAW,GACX,mBAAoB,GACpB,MAAO9B,GACP,QAAS,IACT,gBAAiB,EACnB,EAEM5N,IAAmB,MAEnB4P,IAAmB,CAACC,EAAqB,MACtC,CACL,KAAM7P,IACN,MAAMr5L,EAAQ,CACZmpM,IAAkBnpM,EAAQkpM,CAAkB,CAC7C,CACL,GAGME,IAAmCH,IAEzC,SAASE,IAAkBnpM,EAAQkpM,EAAoB,CACrD,MAAM77Q,EAAU,CAAE,GAAG27Q,IAAgB,GAAGhpM,EAAO,WAAY,EAAE,GAAGkpM,GAChE,GAAI,CAAC77Q,EAAQ,KAAO,CAACA,EAAQ,IAAK,CAChC0pP,GAAe,IAAM,CAEnB,QAAQ,KACN,0NAGR,CACA,CAAK,EACD,MACD,CAEG1pP,EAAQ,IACGqxP,GAASrxP,EAAQ,GAAG,EAC5B,QAAQuqB,GAAOyxP,GAAQzxP,EAAKvqB,CAAO,CAAC,EAChCA,EAAQ,KACjBg8Q,GAAQh8Q,EAAQ,IAAKA,CAAO,CAEhC,CAEA,MAAMg8Q,GAAU,CAACzxP,EAAKvqB,IAAY,CAChC,GAAIspP,GAAa,CAIf,MAAM2yB,EAAkB1xP,GAIN0xP,EAAgB,WAAaA,EAAgB,UAAU,aACvD,IAChBvyB,GAAe,IAAM,CAEnB,QAAQ,KACN,sHACV,CACA,CAAO,CAEJ,CAEG1pP,EAAQ,oBACVu6Q,IAAmBhwP,EAAKvqB,CAAO,EAG7B69P,GAAkB79P,CAAO,GAC3BuqB,EAAI,MACF8wP,IAAoB,CAClB,GAAGr7Q,EACH,GAAGA,EAAQ,cACnB,CAAO,CACP,CAEA,EChFA,SAASg/I,IACPljF,EAAS,CAAE,EACX,CACA,MAAM97D,EAAU,CACd,UAAW,CACT,IAAK,CACH,KAAM,wBACN,SAAU,CACR,CACE,KAAM,kBACN,QAASgoP,EACV,CACF,EACD,QAASA,EACV,CACF,EACD,oBAAqB,CAAC,GAAG+wB,GAA6B,EAAGgD,IAAc,CAAE,EACzE,GAAGjgN,CACP,EAEE,OAAOogN,IAAOl8Q,CAAO,CACvB,CC3Be,SAAAm8Q,KAAY,CACzB,MAAMjgR,EAAQ,SAAS,cAAc,OAAO,EAC5C,SAAS,KAAK,sBAAsB,YAAaA,CAAK,EAEtD,MAAMkgR,EAAiB,IACpBlgR,EAAM,YAAc;AAAA;AAAA;AAAA;AAAA;AAAA,eAKV,SAAS,KAAK,YAAc,GAAG;AAAA;AAAA,eAE/B,SAAS,gBAAgB,aAAe,GAAG;AAAA;AAAA;AAAA,IAKlDmgR,EAAsB,IAAM,CAChC,IAAIp+J,EACJ,MAAM8pF,EAAW,IAAM,CACrB,aAAa9pF,CAAQ,EACrBA,EAAW,OAAO,WAAWm+J,EAAgB,GAAG,CACtD,EACI,OAAO,iBAAiB,SAAUr0E,CAAQ,CAC9C,GAEqB,IAAM,CACvB,IAAIu0E,EAAU,EACV5zL,EAAiB,OAAO,YAAY,IAAM,CAC5C0zL,IACI,EAAEE,GAAW,IACf,OAAO,cAAc5zL,CAAc,CAEtC,EAAE,GAAG,EAEN0zL,IACAC,GACJ,IAGA,CC9BA,OAAO,iBAAiB,mBAAoBF,GAAa,EAEzD,SAASI,KAAuB,CAC9B,OAAO,SAAS,gBAAgB,UAAU,SAAS,sBAAsB,CAC3E,CAUA,SAASC,KAA+B,CACtC,UAAW/F,KAAiB5uP,GAC1B,IAAI8mC,GAAmB8nN,EAAe5uP,GAAW4uP,CAAa,EAAIlsP,GAAQi7N,GAAmBj7N,CAAG,CAAC,CAErG,CAEA,SAASkyP,IAAelyP,EAAK,CAC3BmyP,IAAY,CACV,IAAAnyP,EACA,IAAK,qFACL,YAAak7N,GAAiB,eAAe,OAAO,SAAS,QAAQ,EACrE,QAASA,GAAiB,eAAe,OAAO,SAAS,QAAQ,IAAM,aACvE,iBAAkB,EACtB,CAAG,CACH,CAKA,SAASk3B,KAAqB,CAC5B,MAAMpyP,EAAM+hB,KACZk5M,GAAmBj7N,CAAG,EACtBkyP,IAAelyP,CAAG,EAClB,UAAWksP,KAAiB5uP,GAC1B0C,EAAI,UAAUksP,EAAe5uP,GAAW4uP,CAAa,CAAC,EAExDlsP,EAAI,MAAM,MAAM,CAClB,CAKIgyP,MACFC,MAEAG","x_google_ignoreList":[0,1,2,3,4,5,6,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,161,162,164,165,170,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,217,240,241,251,252,253,254,255,256,257,258,259,260,261,262,263,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,300,310,355,356,357,358,359,360,361,362,363,364,365,366,367,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,474,531,534,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635]}