{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///(webpack)/buildin/global.js","webpack:///./node_modules/lodash/debounce.js","webpack:///./node_modules/lodash/isSymbol.js","webpack:///./.tmp/app_col_core/js/components/reservationTimer.js","webpack:///./node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/lodash/now.js","webpack:///./node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/lodash/toNumber.js","webpack:///./node_modules/lodash/_baseTrim.js","webpack:///./node_modules/lodash/_trimmedEndIndex.js","webpack:///./node_modules/lodash/_getRawTag.js","webpack:///./node_modules/lodash/_objectToString.js","webpack:///./node_modules/lodash/isObjectLike.js","webpack:///./.tmp/app_col_core/js/components/minicartSaleItemAlertBadge.js","webpack:///./.tmp/app_col_core/js/components/formValidation.js","webpack:///./.tmp/app_col_core/js/productDetail.js","webpack:///./cartridges/app_storefront_base/cartridge/client/default/js/product/base.js","webpack:///./.tmp/app_col_core/js/components/utils.js","webpack:///./cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack:///../node_modules/ssr-window/ssr-window.esm.js","webpack:///../node_modules/dom7/dom7.esm.js","webpack:///../src/shared/dom.js","webpack:///../src/shared/get-support.js","webpack:///../src/shared/get-device.js","webpack:///../src/shared/get-browser.js","webpack:///../src/shared/utils.js","webpack:///../src/core/transition/transitionEmit.js","webpack:///../src/core/events/onTouchStart.js","webpack:///../src/core/events/onTouchMove.js","webpack:///../src/core/events/onTouchEnd.js","webpack:///../src/core/events/onResize.js","webpack:///../src/core/events/onClick.js","webpack:///../src/core/events/onScroll.js","webpack:///../src/core/events/index.js","webpack:///../src/core/breakpoints/setBreakpoint.js","webpack:///../src/core/defaults.js","webpack:///../src/core/moduleExtendParams.js","webpack:///../src/core/core.js","webpack:///../src/core/events-emitter.js","webpack:///../src/core/update/index.js","webpack:///../src/core/update/updateSize.js","webpack:///../src/core/update/updateSlides.js","webpack:///../src/core/update/updateAutoHeight.js","webpack:///../src/core/update/updateSlidesOffset.js","webpack:///../src/core/update/updateSlidesProgress.js","webpack:///../src/core/update/updateProgress.js","webpack:///../src/core/update/updateSlidesClasses.js","webpack:///../src/core/update/updateActiveIndex.js","webpack:///../src/core/update/updateClickedSlide.js","webpack:///../src/core/translate/index.js","webpack:///../src/core/translate/getTranslate.js","webpack:///../src/core/translate/setTranslate.js","webpack:///../src/core/translate/minTranslate.js","webpack:///../src/core/translate/maxTranslate.js","webpack:///../src/core/translate/translateTo.js","webpack:///../src/core/transition/index.js","webpack:///../src/core/transition/setTransition.js","webpack:///../src/core/transition/transitionStart.js","webpack:///../src/core/transition/transitionEnd.js","webpack:///../src/core/slide/index.js","webpack:///../src/core/slide/slideTo.js","webpack:///../src/core/slide/slideToLoop.js","webpack:///../src/core/slide/slideNext.js","webpack:///../src/core/slide/slidePrev.js","webpack:///../src/core/slide/slideReset.js","webpack:///../src/core/slide/slideToClosest.js","webpack:///../src/core/slide/slideToClickedSlide.js","webpack:///../src/core/loop/index.js","webpack:///../src/core/loop/loopCreate.js","webpack:///../src/core/loop/loopFix.js","webpack:///../src/core/loop/loopDestroy.js","webpack:///../src/core/grab-cursor/index.js","webpack:///../src/core/grab-cursor/setGrabCursor.js","webpack:///../src/core/grab-cursor/unsetGrabCursor.js","webpack:///../src/core/breakpoints/index.js","webpack:///../src/core/breakpoints/getBreakpoint.js","webpack:///../src/core/check-overflow/index.js","webpack:///../src/core/classes/index.js","webpack:///../src/core/classes/addClasses.js","webpack:///../src/core/classes/removeClasses.js","webpack:///../src/core/images/index.js","webpack:///../src/core/images/loadImage.js","webpack:///../src/core/images/preloadImages.js","webpack:///../src/shared/create-element-if-not-defined.js","webpack:///../src/shared/classes-to-selector.js","webpack:///../src/modules/manipulation/methods/appendSlide.js","webpack:///../src/modules/manipulation/methods/prependSlide.js","webpack:///../src/modules/manipulation/methods/addSlide.js","webpack:///../src/modules/manipulation/methods/removeSlide.js","webpack:///../src/modules/manipulation/methods/removeAllSlides.js","webpack:///../src/shared/effect-init.js","webpack:///../src/shared/effect-target.js","webpack:///../src/shared/effect-virtual-transition-end.js","webpack:///../src/shared/create-shadow.js","webpack:///../src/core/modules/resize/resize.js","webpack:///../src/core/modules/observer/observer.js","webpack:///../src/swiper.js","webpack:///../src/modules/virtual/virtual.js","webpack:///../src/modules/keyboard/keyboard.js","webpack:///../src/modules/mousewheel/mousewheel.js","webpack:///../src/modules/navigation/navigation.js","webpack:///../src/modules/pagination/pagination.js","webpack:///../src/modules/scrollbar/scrollbar.js","webpack:///../src/modules/parallax/parallax.js","webpack:///../src/modules/zoom/zoom.js","webpack:///../src/modules/lazy/lazy.js","webpack:///../src/modules/controller/controller.js","webpack:///../src/modules/a11y/a11y.js","webpack:///../src/modules/history/history.js","webpack:///../src/modules/hash-navigation/hash-navigation.js","webpack:///../src/modules/autoplay/autoplay.js","webpack:///../src/modules/thumbs/thumbs.js","webpack:///../src/modules/free-mode/free-mode.js","webpack:///../src/modules/grid/grid.js","webpack:///../src/modules/manipulation/manipulation.js","webpack:///../src/modules/effect-fade/effect-fade.js","webpack:///../src/modules/effect-cube/effect-cube.js","webpack:///../src/modules/effect-flip/effect-flip.js","webpack:///../src/modules/effect-coverflow/effect-coverflow.js","webpack:///../src/modules/effect-creative/effect-creative.js","webpack:///../src/modules/effect-cards/effect-cards.js","webpack:///./.tmp/app_col_core/js/product/onModelDescription.js","webpack:///./.tmp/app_col_core/js/aem/tabbedContainer.js","webpack:///./node_modules/underscore/modules/index-default.js","webpack:///./.tmp/app_col_core/js/product/base.js","webpack:///./.tmp/app_col_core/js/components/processInclude.js","webpack:///./.tmp/app_col_core/js/product/imageGallery.js","webpack:///./.tmp/app_col_core/js/product/loyalty.js","webpack:///./.tmp/app_col_core/js/product/badge.js","webpack:///./.tmp/app_col_core/js/product/overview.js","webpack:///./.tmp/app_col_core/js/sizefit/sizefit.js","webpack:///./.tmp/app_col_core/js/aem/overflowSlider.js","webpack:///./.tmp/app_col_core/js/components/breakpoints.js","webpack:///./node_modules/underscore/modules/index.js","webpack:///./.tmp/app_col_core/js/product/detail.js","webpack:///./node_modules/lodash/isObject.js","webpack:///./node_modules/lodash/_root.js","webpack:///./.tmp/app_col_core/js/notifyMe/notifyMe.js","webpack:///./node_modules/lodash/_Symbol.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","g","this","Function","e","window","isObject","require","now","toNumber","nativeMax","Math","max","nativeMin","min","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","undefined","apply","leadingEdge","setTimeout","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","arguments","clearTimeout","cancel","flush","baseGetTag","isObjectLike","reservationTimerIdSelector","getExpireTime","$","data","destroyTimer","$timerBanner","reservationInterval","clearInterval","resources","reservation","reservationSecondsRemaining","length","trigger","getRemainingSeconds","expireTime","Date","getTime","secondsRemaining","parseInt","popBanners","messages","remainingSeconds","msgKeys","keys","msgKey","msg","startTime","html","title","message","additionalContent","alert","content","placement","theme","id","containerId","timeToLive","createTimeString","mins","floor","secs","updateReservationTimer","text","toggleClass","startTimer","initialTimeStr","timeRemainingMessage","setInterval","autoClose","init","find","not","remove","getDestroyTimer","updateReservationData","response","extend","getRawTag","objectToString","symToStringTag","root","freeGlobal","global","baseTrim","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","other","valueOf","isBinary","test","slice","trimmedEndIndex","reTrimStart","string","replace","reWhitespace","index","charAt","objectProto","nativeObjectToString","toString","isOwn","tag","unmasked","toggleAlertBadge","$icon","hasAlertWrapper","parent","hasClass","clientData","priceDropModalEnabled","sessionStorage","getItem","hasSaleItemInCart","digitalData","cart","item","some","isSaleItem","wrap","unwrap","formElement","payload","removeClass","fields","forEach","feedbackElement","children","Array","isArray","join","siblings","addClass","error","$formElement","prop","closest","attachment","processInclude","jQuery","document","on","accordionHeader","preventDefault","reviewAnchorOffset","offset","animate","scrollTop","top","focusHelper","getPidValue","$el","getQuantitySelector","quantitySelected","quantitySelectedModal","quantitySelectedPDP","val","getQuantitySelected","handleVariantResponse","$productContainer","isVaraint","isChoiceOfBonusProducts","parents","product","variationAttributes","attrs","msgs","attrsWithSwatches","attr","indexOf","values","attrValue","$attrValue","$swatchButton","selected","assistiveSelectedText","empty","url","removeAttr","selectable","processSwatchValues","$attr","resetUrl","processNonSwatchValues","updateAttrs","productType","readyToOrder","imgs","carousel","carouselId","append","alt","appendTo","first","detach","createCarousel","images","large","replaceWith","price","promotionsHtml","availabilityValue","availabilityMessages","availability","info_selectforstock","updateAvailability","attributes","attributeGroup","ID","attribute","label","getAttributesHtml","attributeSelect","selectedValueUrl","container","ajax","method","success","optionsHtml","updateOptions","quantities","map","quantity","updateQuantities","spinner","stop","parseHtml","$html","parseHTML","body","footer","chooseBonusProducts","bonusUrl","start","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","htmlString","maxBonusItems","uuid","pliUUID","addToCartUrl","pageSize","labels","selectprods","dataType","parsedHtml","renderedTemplate","enterDialogMessage","closeButtonText","modal","getOptions","$elOption","urlValue","selectedValueId","optionId","toArray","JSON","stringify","miniCartReportingUrl","methods","editBonusProducts","focusChooseBonusProductModal","focus","onClosingChooseBonusProductModal","trapChooseBonusProductModalFocus","focusParams","event","containerSelector","firstElementSelector","lastElementSelector","setTabNextFocus","colorAttribute","selectAttribute","currentTarget","addToCart","pid","pidsObj","setPids","each","push","qty","childProducts","form","messageType","newBonusDiscountLineItem","handlePostCartAdd","reportingURL","selectBonusProduct","$choiceOfBonusProduct","maxPids","submittedQty","totalQty","optionID","valueId","selectedBonusProductHtml","removeBonusProduct","$selected","count","enableBonusProductSelection","available","showMoreBonusProducts","addBonusProductsToCart","$readyToOrderBonusProducts","queryString","pidsObject","bonusProducts","qtyOption","option","productId","errorMessage","msgSuccess","location","reload","keyValueArray","str","x","k","v","kvp","split","output","queryStringToObject","search","startIndex","endIndex","substring","pair","nameVal","decodeURIComponent","parse","objectToQueryString","obj","urlString","path","hash","qsIndex","hashIndex","param","removeQueryParam","queryparam","URL","searchParams","delete","loadScript","src","callback","script","createElement","type","getElementsByTagName","appendChild","onload","loadJsAfterWindowLoad","readyState","addEventListener","heapify","list","ndx","heapSize","largest","left","right","cscUtils","appendParamToURL","encodeURIComponent","getParamsFromURL","arr","searchHash","postHash","arrHash","output2","updateURLParam","paramVal","newAdditionalURL","tempArray","baseURL","additionalURL","temp","arrayIntersection","a1","a2","inArray","createModalMarkup","defaults","showCloseBtn","enableLayeredDrawers","modalSizeClass","centeredClass","customClasses","modalId","buttons","settings","dataAttributes","header","idAttribute","footerBtns","btn","removeQueryParamFromCurrentUrl","href","history","replaceState","createBackdrop","customClass","removeBackdrop","selector","setUrlKeyValue","qs","setUrlData","decodeQueryParam","elementInViewport","el","offsetToTop","offsetTop","offsetLeft","width","offsetWidth","height","offsetHeight","offsetParent","pageXOffset","pageYOffset","innerHeight","innerWidth","compatMode","documentElement","clientHeight","scrollLeft","clientWidth","insertAtInputCursor","formInput","input","selectionStart","end","selectionEnd","stringToTitleCase","word","toUpperCase","toLowerCase","getTimeAndHours","stageMessage","date","hours","getHours","minutes","getMinutes","ampm","findNHighest","listToUse","arrayLength","firstListItem","heapifyMax","pop","deepEqual","obj1","obj2","reduce","isEqual","keyCode","firstFocusableEl","lastFocusableEl","is","nextToLastElementSelector","linkElements","shiftKey","constructor","target","ssrDocument","removeEventListener","activeElement","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","childNodes","style","setAttribute","createElementNS","importNode","host","hostname","origin","pathname","protocol","getDocument","doc","ssrWindow","navigator","userAgent","pushState","go","back","CustomEvent","getComputedStyle","getPropertyValue","Image","screen","matchMedia","requestAnimationFrame","cancelAnimationFrame","getWindow","win","Dom7","items","proto","__proto__","set","makeReactive","super","arrayFlat","res","arrayFilter","filter","context","trim","toCreate","tempParent","innerHTML","a","nodeType","uniqueArray","fn","support","deviceCached","browser","Methods","classes","classNames","classList","add","className","contains","toggle","getAttribute","attrName","removeAttribute","transform","transition","duration","transitionDuration","eventType","targetSelector","listener","capture","handleLiveEvent","eventData","dom7EventData","unshift","handleEvent","j","events","dom7LiveListeners","proxyListener","dom7Listeners","off","handlers","handler","dom7proxy","splice","evt","detail","bubbles","cancelable","dataIndex","dispatchEvent","transitionEnd","dom","fireCallBack","outerWidth","includeMargins","styles","parseFloat","outerHeight","box","getBoundingClientRect","clientTop","clientLeft","scrollY","scrollX","css","props","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","eq","returnIndex","newChild","els","tempDiv","firstChild","prepend","insertBefore","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","parentNode","foundElements","found","removeChild","nextTick","delay","getTranslate","matrix","curTransform","transformMatrix","axis","curStyle","currentStyle","WebKitCSSMatrix","webkitTransform","MozTransform","OTransform","MsTransform","msTransform","m41","m42","node","to","noExtend","nextSource","HTMLElement","keysArray","nextIndex","len","nextKey","desc","getOwnPropertyDescriptor","__swiper__","setCSSProperty","varName","varValue","setProperty","animateCSSModeScroll","side","swiper","targetPosition","startPosition","translate","params","speed","wrapperEl","scrollSnapType","cssModeFrameID","dir","isOutOfBound","current","progress","easeProgress","cos","PI","currentPosition","scrollTo","overflow","getSupport","smoothScroll","touch","DocumentTouch","passiveListener","supportsPassive","opts","gestures","getDevice","overrides","platform","ua","device","ios","android","screenWidth","screenHeight","match","ipad","ipod","iphone","windows","macos","os","getBrowser","isSafari","isWebView","transitionEmit","step","runCallbacks","direction","activeIndex","previousIndex","emit","onTouchStart","touchEventsData","touches","enabled","animating","preventInteractionOnTransition","cssMode","loop","loopFix","originalEvent","$targetEl","touchEventsTarget","isTouchEvent","which","button","isTouched","isMoved","noSwipingClass","shadowRoot","noSwipingSelector","isTargetShadow","noSwiping","base","__closestFrom","assignedSlot","getRootNode","allowClick","swipeHandler","currentX","targetTouches","pageX","currentY","pageY","startX","startY","edgeSwipeDetection","iOSEdgeSwipeDetection","edgeSwipeThreshold","iOSEdgeSwipeThreshold","assign","allowTouchCallbacks","isScrolling","startMoving","touchStartTime","updateSize","swipeDirection","threshold","allowThresholdMove","focusableElements","shouldPreventDefault","allowTouchMove","touchStartPreventDefault","touchStartForcePreventDefault","isContentEditable","onTouchMove","rtl","rtlTranslate","targetTouch","changedTouches","preventedByNestedSwiper","touchReleaseOnEdges","isVertical","maxTranslate","minTranslate","diffX","diffY","sqrt","touchAngle","isHorizontal","atan2","abs","touchMoveStopPropagation","nested","stopPropagation","startTranslate","setTransition","$wrapperEl","allowMomentumBounce","grabCursor","allowSlideNext","allowSlidePrev","setGrabCursor","diff","touchRatio","currentTranslate","disableParentSwiper","resistanceRatio","resistance","followFinger","freeMode","watchSlidesProgress","updateActiveIndex","updateSlidesClasses","updateProgress","setTranslate","onTouchEnd","slidesGrid","currentPos","touchEndTime","timeDiff","updateClickedSlide","lastClickTime","destroyed","stopIndex","groupSize","slidesSizesGrid","slidesPerGroupSkip","slidesPerGroup","increment","ratio","longSwipesMs","longSwipes","slideTo","longSwipesRatio","shortSwipes","navigation","nextEl","prevEl","onResize","breakpoints","setBreakpoint","snapGrid","updateSlides","slidesPerView","isEnd","isBeginning","centeredSlides","slides","autoplay","running","paused","run","watchOverflow","checkOverflow","onClick","preventClicks","preventClicksPropagation","stopImmediatePropagation","onScroll","previousTranslate","translatesDiff","methodName","writable","dummyEventAttached","dummyEventListener","touchEvents","domMethod","swiperMethod","passiveListeners","passive","move","updateOnWindowResize","isGridEnabled","grid","rows","initialSlide","resizeObserver","createElements","autoHeight","setWrapperSize","virtualTranslate","effect","breakpointsBase","spaceBetween","slidesPerGroupAuto","centeredSlidesBounds","slidesOffsetBefore","slidesOffsetAfter","normalizeSlideIndex","centerInsufficientSlides","roundLengths","simulateTouch","uniqueNavElements","slideToClickedSlide","preloadImages","updateOnImagesReady","loopAdditionalSlides","loopedSlides","loopFillGroupWithBlank","loopPreventsSlide","containerModifierClass","slideClass","slideBlankClass","slideActiveClass","slideDuplicateActiveClass","slideVisibleClass","slideDuplicateClass","slideNextClass","slideDuplicateNextClass","slidePrevClass","slideDuplicatePrevClass","wrapperClass","runCallbacksOnInit","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","auto","prototypes","eventsEmitter","priority","self","eventsListeners","once","onceHandler","__emitterProxy","onAny","eventsAnyListeners","offAny","eventHandler","update","Number","isNaN","size","getDirectionLabel","marginRight","getDirectionPropertyValue","swiperSize","wrongRTL","isVirtual","virtual","previousSlidesLength","slidesLength","offsetBefore","offsetAfter","previousSnapGridLength","previousSlidesGridLength","slidePosition","prevSlideSize","virtualSize","marginLeft","marginBottom","marginTop","slideSize","gridEnabled","initSlides","shouldResetSlideSize","slide","updateSlide","slideStyles","currentTransform","currentWebKitTransform","paddingLeft","paddingRight","boxSizing","swiperSlideSize","updateWrapperSize","newSlidesGrid","slidesGridItem","_","slideIndex","allSlidesSize","slideSizeValue","maxSnap","snap","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","updateSlidesOffset","updateAutoHeight","activeSlides","newHeight","getSlideByIndex","visibleSlides","ceil","swiperSlideOffset","updateSlidesProgress","offsetCenter","visibleSlidesIndexes","slideOffset","slideProgress","slideBefore","slideAfter","multiplier","wasBeginning","wasEnd","activeSlide","realIndex","nextSlide","prevSlide","emitSlidesClasses","newActiveIndex","previousRealIndex","previousSnapIndex","skip","initialized","slideFound","clickedSlide","clickedIndex","byController","y","translateTo","internal","translateBounds","newTranslate","isH","onTranslateToWrapperTransitionEnd","transitionStart","initial","Error","indexAsNumber","isFinite","normalizedTranslate","normalizedGrid","normalizedGridNext","_immediateVirtual","_swiperImmediateVirtual","onSlideToWrapperTransitionEnd","slideToLoop","newIndex","slideNext","perGroup","slidesPerViewDynamic","_clientLeft","slidePrev","normalize","prevSnapIndex","normalizedSnapGrid","prevSnap","prevIndex","slideReset","slideToClosest","currentSnap","slideToIndex","loopCreate","blankSlidesNum","blankNode","prependSlides","appendSlides","cloneNode","loopDestroy","moving","isLocked","cursor","unsetGrabCursor","attachEvents","detachEvents","breakpoint","getBreakpoint","currentBreakpoint","breakpointParams","originalParams","wasMultiRow","isMultiRow","wasEnabled","emitContainerClasses","fill","directionChanged","needsReLoop","changeDirection","isEnabled","disable","enable","containerEl","currentHeight","points","point","minRatio","substr","sort","b","wasLocked","lastSlideIndex","lastSlideRightEdge","addClasses","suffixes","entries","prefix","resultClasses","autoheight","centered","removeClasses","loadImage","imageEl","srcset","sizes","checkForComplete","image","onReady","complete","onerror","imagesLoaded","imagesToLoad","currentSrc","extendedDefaults","Swiper","swipers","newParams","__modules__","mod","extendParams","swiperParams","passedParams","eventName","velocity","desktop","touchEventsTouch","touchEventsDesktop","clickTimeout","velocities","installModule","extendDefaults","newDefaults","use","setProgress","cls","getSlideClasses","slideEl","updates","view","exact","spv","breakLoop","translateValue","newDirection","needUpdate","currentDirection","mount","mounted","getWrapperSelector","wrapper","destroy","deleteInstance","cleanStyles","createElementIfNotDefined","checkProps","element","classesToSelector","appendSlide","observer","prependSlide","addSlide","activeIndexBuffer","baseLength","slidesBuffer","currentSlide","removeSlide","slidesIndexes","indexToRemove","removeAllSlides","effectInit","overwriteParams","perspective","overwriteParamsResult","_s","effectTarget","effectParams","$slideEl","transformEl","effectVirtualTransitionEnd","allSlides","eventTriggered","triggerEvents","createShadow","shadowClass","$shadowContainer","$shadowEl","prototypeGroup","protoMethod","resizeHandler","orientationChangeHandler","ResizeObserver","newWidth","contentBoxSize","contentRect","inlineSize","blockSize","observe","unobserve","observers","attach","MutationObserver","WebkitMutationObserver","mutations","observerUpdate","childList","characterData","observeParents","observeSlideChildren","containerParents","disconnect","cssModeTimeout","renderSlide","cache","force","addSlidesBefore","addSlidesAfter","previousFrom","from","previousTo","previousSlidesGrid","previousOffset","offsetProp","slidesAfter","slidesBefore","onRendered","lazy","load","renderExternal","slidesToRender","renderExternalUpdate","prependIndexes","appendIndexes","numberOfNewSlides","newCache","cachedIndex","$cachedEl","cachedElIndex","handle","kc","charCode","pageUpDown","keyboard","isPageUp","isPageDown","isArrowLeft","isArrowRight","isArrowUp","isArrowDown","altKey","ctrlKey","metaKey","onlyInViewport","inView","swiperWidth","swiperHeight","windowWidth","windowHeight","swiperOffset","swiperCoord","returnValue","timeout","mousewheel","releaseOnEdges","invert","forceToAxis","sensitivity","eventsTarget","thresholdDelta","thresholdTime","lastEventBeforeSnap","lastScrollTime","recentWheelEvents","handleMouseEnter","mouseEntered","handleMouseLeave","animateSlider","newEvent","delta","raw","rtlFactor","sX","sY","pX","pY","wheelDelta","wheelDeltaY","wheelDeltaX","HORIZONTAL_AXIS","deltaY","deltaX","deltaMode","spinX","spinY","pixelX","pixelY","positions","sign","ignoreWheelEvents","position","sticky","shift","prevEvent","firstEvent","snapToThreshold","autoplayDisableOnInteraction","getEl","toggleEl","disabled","disabledClass","tagName","lockClass","$nextEl","$prevEl","onPrevClick","onNextClick","hideOnClick","hiddenClass","targetEl","pagination","clickable","isHidden","bulletSize","pfx","bulletElement","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","number","formatFractionTotal","bulletClass","bulletActiveClass","modifierClass","currentClass","totalClass","progressbarFillClass","progressbarOppositeClass","clickableClass","horizontalClass","verticalClass","bullets","dynamicBulletIndex","isPaginationDisabled","setSideBullets","$bulletEl","total","paginationType","firstIndex","lastIndex","midIndex","suffix","bullet","$bullet","bulletIndex","$firstDisplayedBullet","$lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","progressbarDirection","scale","scaleX","scaleY","render","paginationHTML","numberOfBullets","dragStartPos","dragSize","trackSize","divider","dragTimeout","scrollbar","$dragEl","newSize","newPos","hide","opacity","display","getPointerPosition","clientX","clientY","setDragPosition","positionRatio","onDragStart","onDragMove","onDragEnd","snapOnRelease","activeListener","eventMethod","$swiperEl","dragClass","dragEl","draggable","parallax","setTransform","currentOpacity","currentScale","_swiper","parallaxEl","$parallaxEl","parallaxDuration","zoom","maxRatio","containerClass","zoomedSlideClass","gesturesEnabled","fakeGestureTouched","fakeGestureMoved","isScaling","gesture","slideWidth","slideHeight","$imageEl","$imageWrapEl","minX","minY","maxX","maxY","touchesStart","touchesCurrent","prevPositionX","prevPositionY","prevTime","getDistanceBetweenTouches","x1","y1","x2","y2","onGestureStart","scaleStart","onGestureChange","scaleMove","onGestureEnd","scaledWidth","scaledHeight","onTransitionEnd","zoomIn","touchX","touchY","translateX","translateY","imageWidth","imageHeight","translateMinX","translateMinY","translateMaxX","translateMaxY","touchAction","zoomOut","zoomToggle","getListeners","activeListenerWithCapture","getSlideSelector","toggleGestures","slideSelector","enableGestures","disableGestures","momentumDurationX","momentumDurationY","momentumDistanceX","newPositionX","momentumDistanceY","newPositionY","momentumDuration","in","out","checkInView","loadPrevNext","loadPrevNextAmount","loadOnTransitionStart","scrollingElement","elementClass","loadingClass","loadedClass","preloaderClass","scrollHandlerAttached","initialImageLoaded","loadInSlide","loadInDuplicate","$images","background","$pictureEl","sourceEl","$source","slideOriginalIndex","slideExist","amount","maxIndex","minIndex","checkInViewOnLoad","$scrollElement","isWindow","scrollElementWidth","scrollElementHeight","LinearSpline","i1","i3","binarySearch","guess","array","interpolate","removeSpline","controller","control","spline","inverse","by","_t","controlledTranslate","controlled","setControlledTranslate","setControlledTransition","a11y","notificationClass","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","slideLabelMessage","containerMessage","containerRoleDescriptionMessage","itemRoleDescriptionMessage","slideRole","liveRegion","notify","notification","makeElFocusable","makeElNotFocusable","addElRole","role","addElRoleDescription","description","addElLabel","disableEl","enableEl","onEnterOrSpaceKey","click","updateNavigation","hasPagination","initNavEl","wrapperId","controls","$containerEl","repeat","round","random","live","bulletEl","paths","slugify","getPathValues","urlOverride","pathArray","part","setHistory","includes","currentState","state","scrollToSlide","setHistoryPopState","hashNavigation","watchState","onHashChange","newHash","setHash","$activeSlideEl","autoplayResult","reverseDirection","stopOnLastSlide","pause","waitForTransition","onVisibilityChange","visibilityState","onMouseEnter","disableOnInteraction","onMouseLeave","pauseOnMouseEnter","thumbs","multipleActiveThumbs","autoScrollOffset","slideThumbActiveClass","thumbsContainerClass","swiperCreated","onThumbClick","thumbsSwiper","currentIndex","thumbsParams","SwiperClass","thumbsSwiperParams","useOffset","newThumbsIndex","currentThumbsIndex","prevThumbsIndex","nextThumbsIndex","thumbsToActivate","thumbActiveClass","momentum","momentumRatio","momentumBounce","momentumBounceRatio","momentumVelocityRatio","minimumVelocity","lastMoveEvent","velocityEvent","distance","momentumDistance","newPosition","afterBouncePosition","needsLoopFix","doBounce","bounceAmount","moveDistance","currentSlideSize","slidesNumberEvenToRows","slidesPerRow","numFullColumns","newSlideOrderIndex","column","row","groupIndex","slideIndexInGroup","columnsInGroup","order","fadeEffect","crossFade","tx","ty","slideOpacity","cubeEffect","slideShadows","shadow","shadowOffset","shadowScale","$cubeShadowEl","wrapperRotate","slideAngle","tz","shadowBefore","shadowAfter","shadowAngle","sin","scale1","scale2","zFactor","flipEffect","limitRotation","rotateY","rotateX","zIndex","coverflowEffect","rotate","stretch","depth","modifier","center","offsetMultiplier","translateZ","slideTransform","$shadowBeforeEl","$shadowAfterEl","creativeEffect","limitProgress","shadowPerProgress","progressMultiplier","custom","getTranslateValue","translateString","rotateString","scaleString","opacityString","shadowOpacity","cardsEffect","tX","tY","tZ","tXAdd","isSwipeToNext","isSwipeToPrev","subProgress","prevY","utils","$mainPDPGallery","$modelDescription","getOnModelData","onModelValue","modelKey","modelObject","onModelObj","modelValue","variantUPC","modelDescription","imageModelData","modelDataValue","modelImg","triggerOnModelDescription","imageclick","debounce","reinitializeCarousels","$clickedItem","targetContentSelector","slick","$this","$hybridTabbedContainer","isHighRes","isLowRes","$thisItem","$clickedTab","$contentContainer","$targetContent","$ofs","slideToItem","show","mixin","allExports","onModel","Badge","Overview","minicartSaleItemAlertBadge","oosData","$productObject","topLevelAttribute","$swatchSpan","$swatchAnchor","swatchOutOfStockText","enableNotifyMe","variantData","color","bisnflag","isNotifyMeEnabled","displayValue","preventScroll","masterSelectable","pdpUrl","getSkuValues","skuArray","attributeID","sku","attributeValue","getSelectedSwatchValue","variantID","swatchArrays","swatchKeys","markOOSColorVariants","colorVariantArrays","colorVariantKeys","colorVarKey","updateOOSColorVariants","masterID","String","productCache","variantMatrix","inventory","sizeVariantArrays","sizeVariantKeys","dimVariantArrays","dimension","dimVariantKeys","selectedSize","selectedDim","oosVariants","variant","productObject","topLevelArray","allAttributes","selectedCount","attrOutOfStockText","attributeId","masterId","hasSizeType","hasColor","hasSize","hasDimension","selectedAttributes","selectedSizeType","validSizes","validColors","skuColorArray","skuSizeArray","selectedColor","validDimensions","hideShowValidSwatches","groupVisible","hideColorPriceGroups","setVariantNotifyMeStatus","variantMaster","colorSwatchID","colorSwatchVariantArray","variantSize","variantNotifyMe","createSwiperAssets","assetData","assetType","$swiperSlide","$imageGallery","$wrapper","isThumbnail","modelId","createSketchfabAsset","$asset","$swiperContent","videoID","videoType","productVideoThumbnail","productVideoThumbnailAltText","createVideoAsset","createImagesAndVideo","$imageGalleries","retinaEnabled","hiresImgUrlParams","pdpImgUrlParams","pdpProductImgAppend","badgeData","pdpTechBadgeData","isQuickView","enableStylitics","stylitics","$swiperWrapper","swiperSlideStyle","imageAltIdx","idx","imageData","badgeHTML","displayBadge","techBadgeHTML","displayTechBadge","swiperSlideClass","$swiperImg","$zoomControls","$styliticsLink","videoUrl","productVideoAltText","posterUrl","onModelAttribute","modelData","jumplinkCta","retinaUrl","onColorVariantHover","altText","productThumbnailAltText","product_VideoData","productVideoData","videoData","selectedAttributeID","isVariant","$omnibusPrice","enableServerSideGallery","primaryImage","variantUrl","updatedAttr","linkedSizesHtml","lowestPrice30Days","promotions","promotion","isExclusive","callOutMessageDisplayPages","displayPage","calloutMsg","details","getPromotionCalloutHtml","highlightClass","messageHighlight","calloutOpenAccount","getExclusivePromotionCalloutHtml","exclusivePromotion","instockBool","instock","velocityValue","velocityMessages","velocityMessage","sales","class","cssClass","outerHTML","colorValue","sizeValue","dimensionValue","getUserSelectedAttributes","galleryURL","$$productGalleryContainer","$productGallery","$productGalleryThumb","preQuickViewModalDigitalData","dtmLayer","page","user","attributeType","$existingOldChemistryListItem","oldChemistryText","$prop65ListItemElement","oldChemistryListItemHTMLString","after","updateOldChemistryMessaging","UUID","pageStart","moreURL","isEverythingSelected","$addToCartButton","$swatchAttributes","swatchGroupSelectors","allAttributesSelected","popupAlignment","$popup","viewportWidth","elementCenter","popupHalfWidth","showOutOfStockPopup","$sizeSwatch","thisSwatch","one","disabledAddToCartHandler","$dimElement","$sizeElement","$sizeSwatchSelected","onClickAddToCartButtonDisabled","updateSwatchAttributeLabel","$swatch","selectedValue","initExclusiveEvents","qvPid","setItem","removeItem","$swatchClicked","$selectedAttrUrl","selectedAttrUrl","$url","$dimensionSwatches","$selectedAttr","appendDimensionParams","$swatchEntered","currentLabelText","sizeSwatch","quickViewSwatchFunctionality","searchPID","isNumeric","quantityTotal","isReservable","reservableProduct","hasError","icon","dismissible","hideMinicartTimeout","dtmEvent","action","_satellite","track","Event","restoreDTM","forceOOSNotifyMe","$notifymeVariant","hideForm","notifyme","overviewInit","include","$mainGallery","$thumbnailGallery","swiperMain","swiperThumb","player","initVideoPlayer","$videoSlide","playerHost","videoId","playerId","tagId","firstScriptTag","videoPlayerObserver","videoPlayers","subtree","pauseVideo","initGalleryEvents","$imageClicked","$selectedColorSwatch","basePid","modalHTML","$zoomModal","imageIndexToZoom","$modalBody","zoomViewerHeight","modalBodyPadding","zoomIndex","$zoomViewer","$bigImg","$elem","hiResImage","imgX","imgY","viewerWidth","viewerHeight","difWidth","difHeight","viewerOffset","$activeThumb","initZoom","setImageUrl","galleryConfig","galleryElements","config","hasThumbnails","isQuickview","gallerySelector","thumbnailSelector","galleryContainerSelector","$galleryContainer","$gallery","$thumbnail","getGalleryElements","$main","swiperGalleryMain","swiperConfigMain","swiperGalleryThumb","initSwiperGallery","highlightMultiplierReward","rewardsData","rewardsHtml","gridBadge","badgeType","gridBadgeValue","gridBadgeDisplay","hasSaleSwatchSelected","hideDynamicBadges","isStaticType","svg","svgClass","svgWidth","svgHeight","svgID","closeModal","enableScroll","buildModal","launchModal","disableScroll","tabbedContainer","showUnitToggle","selectCategory","$element","elementIdParts","categorySuffix","dataset","subcat","genderToShow","gendershow","sectionDiv","buttonText","gender","$categorySelected","$divSelected","$activeCategory","$activeSection","menuText","genderCategory","collapse","toggleCategorySizeFit","innerText","toggleMeasurements","useCentimeters","$toggleTable","$columnHeaders","nthIndex","$toggleCell","convertedValue","unit","toFixed","unitConversion","clearTableClasses","$tableElement","applyTableElementStyle","createScrollButtons","$activeContent","tableHeaderHeight","$rightScrollButton","$leftScrollButton","scrollButtonPosition","$container","$table","tableOverflow","initSizeFit","$sizeFitModal","fitAsset","$unitToggles","$activeTable","$currentScrollButton","$tdElement","containsTdElement","elementIndex","has","iterator","rowElement","$rowElement","columnIndex","childElement","$childElement","getSizeFitGuideContent","$modalContentWrapper","successHandler","overflowSlider","parentElement","slideByAmount","slideToX","dragStart","dragging","dragEnd","toggleArrows","listenForArrowClicks","setHeight","clamp","windowResizeTimeoutId","collection","sliderSelector","sliderClass","arrowLeftSelector","arrowLeftClass","arrowRightSelector","arrowRightClass","percentToSlide","newXPos","endX","startXPos","containerSize","sliderSize","always","$item","itemLeft","$slider","currentSliderXPos","sliderMargin","arrowSize","showArrows","itemRight","ofsWidth","ofs","mouseX","sliderX","isDragging","mouseDownXPos","slideAmount","instanceSettings","sliderHeight","$sliderContainer","expectedHeight","attrOptions","elem","imgLoadedTimeoutID","clickedTab","itemClass","arrowBtns","arrowLeftLabel","arrowClass","arrowRightLabel","alignArrowsToImgs","firstImg","imgHeight","$activeItem","activeItemClass","itemSelector","isCurrentBreakpointAbbreviation","breakpointAbbreviation","$breakpointIndicator","isCurrentBreakpoint","abbreviation","getCurrentBreakpoint","currentBP","$bpIndicator","ArrayProto","ObjProto","SymbolProto","nativeIsArray","nativeKeys","nativeCreate","_isNaN","_isFinite","Ctor","_wrapped","VERSION","optimizeCb","argCount","accumulator","baseIteratee","identity","isFunction","matcher","iteratee","Infinity","cb","restArguments","rest","baseCreate","shallowProperty","_has","deepGet","MAX_ARRAY_INDEX","pow","getLength","isArrayLike","_keys","results","currentKey","createReduce","reducer","memo","reduceRight","predicate","findIndex","findKey","reject","negate","every","fromIndex","guard","invoke","contextPath","pluck","where","findWhere","computed","lastComputed","shuffle","sample","clone","last","rand","sortBy","criteria","group","behavior","partition","groupBy","indexBy","countBy","reStrSymbol","isString","pass","compact","Boolean","_flatten","shallow","strict","isArguments","flatten","without","otherArrays","difference","uniq","isSorted","isBoolean","seen","union","arrays","intersection","argsLength","unzip","zip","createPredicateIndexFinder","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","lastIndexOf","range","chunk","executeBound","sourceFunc","boundFunc","callingContext","bound","callArgs","concat","partial","boundArgs","placeholder","bindAll","memoize","hasher","address","defer","throttle","previous","later","throttled","_now","remaining","immediate","callNow","compose","times","before","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","collectNonEnumProps","nonEnumIdx","allKeys","mapObject","pairs","functions","names","createAssigner","keysFunc","source","extendOwn","keyInObj","pick","omit","tap","interceptor","isMatch","aStack","bStack","areArrays","aCtor","bCtor","deepEq","isEmpty","isElement","tagTester","isNumber","isDate","isRegExp","isError","isMap","isWeakMap","isSet","isWeakSet","nodelist","isNull","isUndefined","constant","noop","propertyOf","accum","Int8Array","escapeMap","unescapeMap","createEscaper","escaper","testRegexp","RegExp","replaceRegexp","escape","unescape","fallback","idCounter","uniqueId","templateSettings","evaluate","noMatch","escapes","escapeRegExp","escapeChar","template","oldSettings","variable","argument","chain","instance","_chain","chainResult","toJSON","ImageGallery","loyalty","sizefitJs","pollCountMax","initialPageLoad","refreshKlarnaPlacements","displayedPrice","klarnaPriceValue","Klarna","OnsiteMessaging","refresh","scrollToAccordionSection","sectionSelector","$productDetailsContainer","$productAccordianDrawer","headerHeight","initGallery","hideSizeFitModal","createSizeFitModal","modalConfig","modalMarkup","$modal","launchSizeGuide","sizeGuideUrl","unitType","ssp","sizefitSwitch","toggleHTML","setSelectedInventoryStatus","$attributeLabelValue","$auxSwatch","outOfStockText","$targetNode","$dimensionSwatchSelected","$colorValue","colorSelected","queryScOnLoad","mutationsList","$bvReviewRatings","scOnLoad","$swatchSelected","customValueUrl","initProcess","internalProcessValue","processCopy","process","processValue","env","processParam","stickyAddToCart","$stickyButton","stickyButtonOffsetTop","$discountPercentage","$pranaRating","updateAttributesAndDetails","attributesHtml","shortDescription","longDescription","$inStorePickupContainer","availableForInStorePickup","showSpinner","updateAttribute","updateAddToCart","disableAddToCart","$availabilityMsgContainer","isMaster","allAvailable","allReady","onScrollToDetails","initLoyalty","onClickReviewStars","queryParamProductReviews","bvOpen","launchOmnibusReviewModal","modalTitle","modalContent","launchSizeGuideModal","onSelectAttribute","attrType","attributeLabelValue","onWriteReviewButtonPoll","pollCallback","bvOpenWriteReview","$button","freeSelf","formValidation","showValidationFeedback","clearValidationFeedback","checkValidInput","inputElem","setCustomValidity","checkValidity","validationMessage","submitNotifyMeForm","isValid","errors","validationResult","validationResponse","validateNotifyMeForm","registerNotifyMeForm","elements","variantPID","serialize","handleNotifyMeSuccess","createNotifyMeForm","$formContainer","lazyLoadUrl","responseHTML"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,K,uPClFrD,IAAIC,EAGJA,EAAK,WACJ,OAAOC,KADH,GAIL,IAECD,EAAIA,GAAK,IAAIE,SAAS,cAAb,GACR,MAAOC,GAEc,gCAAXC,OAAM,cAANA,WAAqBJ,EAAII,QAOrCrC,EAAOD,QAAUkC,G,mBCnBjB,IAAIK,EAAWC,EAAQ,GACnBC,EAAMD,EAAQ,IACdE,EAAWF,EAAQ,IAMnBG,EAAYC,KAAKC,IACjBC,EAAYF,KAAKG,IAqLrB9C,EAAOD,QA7HP,SAAkBgD,EAAMC,EAAMC,GAC5B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAiB,EACjBC,GAAU,EACVC,GAAS,EACTC,GAAW,EAEf,GAAmB,mBAARZ,EACT,MAAM,IAAIa,UAzEQ,uBAmFpB,SAASC,EAAWC,GAClB,IAAIC,EAAOb,EACPc,EAAUb,EAKd,OAHAD,EAAWC,OAAWc,EACtBT,EAAiBM,EACjBT,EAASN,EAAKmB,MAAMF,EAASD,GAI/B,SAASI,EAAYL,GAMnB,OAJAN,EAAiBM,EAEjBR,EAAUc,WAAWC,EAAcrB,GAE5BS,EAAUI,EAAWC,GAAQT,EAatC,SAASiB,EAAaR,GACpB,IAAIS,EAAoBT,EAAOP,EAM/B,YAAyBU,IAAjBV,GAA+BgB,GAAqBvB,GACzDuB,EAAoB,GAAOb,GANJI,EAAON,GAM8BJ,EAGjE,SAASiB,IACP,IAAIP,EAAOtB,IACX,GAAI8B,EAAaR,GACf,OAAOU,EAAaV,GAGtBR,EAAUc,WAAWC,EA3BvB,SAAuBP,GACrB,IAEIW,EAAczB,GAFMc,EAAOP,GAI/B,OAAOG,EACHb,EAAU4B,EAAarB,GAJDU,EAAON,IAK7BiB,EAoB+BC,CAAcZ,IAGnD,SAASU,EAAaV,GAKpB,OAJAR,OAAUW,EAINN,GAAYT,EACPW,EAAWC,IAEpBZ,EAAWC,OAAWc,EACfZ,GAeT,SAASsB,IACP,IAAIb,EAAOtB,IACPoC,EAAaN,EAAaR,GAM9B,GAJAZ,EAAW2B,UACX1B,EAAWjB,KACXqB,EAAeO,EAEXc,EAAY,CACd,QAAgBX,IAAZX,EACF,OAAOa,EAAYZ,GAErB,GAAIG,EAIF,OAFAoB,aAAaxB,GACbA,EAAUc,WAAWC,EAAcrB,GAC5Ba,EAAWN,GAMtB,YAHgBU,IAAZX,IACFA,EAAUc,WAAWC,EAAcrB,IAE9BK,EAIT,OA3GAL,EAAOP,EAASO,IAAS,EACrBV,EAASW,KACXQ,IAAYR,EAAQQ,QAEpBL,GADAM,EAAS,YAAaT,GACHP,EAAUD,EAASQ,EAAQG,UAAY,EAAGJ,GAAQI,EACrEO,EAAW,aAAcV,IAAYA,EAAQU,SAAWA,GAoG1DgB,EAAUI,OApCV,gBACkBd,IAAZX,GACFwB,aAAaxB,GAEfE,EAAiB,EACjBN,EAAWK,EAAeJ,EAAWG,OAAUW,GAgCjDU,EAAUK,MA7BV,WACE,YAAmBf,IAAZX,EAAwBD,EAASmB,EAAahC,MA6BhDmC,I,wPC3LT,IAAIM,EAAa1C,EAAQ,IACrB2C,EAAe3C,EAAQ,IA2B3BvC,EAAOD,QALP,SAAkBmB,GAChB,MAAuB,UAAhB,EAAOA,IACXgE,EAAahE,IArBF,mBAqBY+D,EAAW/D,K,iBCzBvC,IAGMiE,EAA6B,IAAH,OADL,oBAGrBC,EAAgB,WAClB,OAAOC,EAAEF,GAA4BG,KAAK,eAAiB,GAOzDC,EAAe,WACjB,IAAMC,EAAeH,EAAEF,GACjBM,EAAsBD,EAAaF,KAAK,uBAE9CI,cAAcD,GAEdD,EAAaF,KAAK,sBAAuB,MACzCE,EAAaF,KAAK,aAAc,MAE5BjD,OAAOsD,WAAatD,OAAOsD,UAAUC,aAAevD,OAAOsD,UAAUC,YAAYC,oCAC1ExD,OAAOsD,UAAUC,YAAYC,4BAEpCL,GAAgBA,EAAaM,QAC7BN,EAAaO,QAAQ,UAIvBC,EAAsB,WAAkC,IAAjCC,EAAa,UAAH,6CAAGb,IAClC5C,GAAM,IAAI0D,MAAOC,UACjBC,EAAmBC,UAAUJ,EAAazD,GAAO,IAAM,IAE3D,OAAO4D,GAGLE,EAAa,WACf,GAAIjE,OAAOsD,WAAatD,OAAOsD,UAAUC,aAAevD,OAAOsD,UAAUC,YAAYW,SAIjF,IAHA,IAAMC,EAAmBR,IAErBS,EAAU9F,OAAO+F,KAAKrE,OAAOsD,UAAUC,YAAYW,UAC9CtG,EAAI,EAAGA,EAAIwG,EAAQX,OAAQ7F,IAAK,CACrC,IAAI0G,EAASF,EAAQxG,GACjB2G,EAAMvE,OAAOsD,UAAUC,YAAYW,SAASI,GAE5CE,OAAqC,IAAlBD,EAAIC,UAA4BD,EAAIC,UAAYL,EAEvE,GAAKA,GAAoBK,GAAaL,EADxBK,EA9CF,QA+CkF,IAAlBD,EAAIC,UAA2B,CAEvG,IAAIC,EAAO,+BAAH,OAAkCF,EAAIG,MAAK,gDAClCH,EAAII,QAAO,6CACdJ,EAAIK,mBAAqB,IACvC5B,EAAE6B,MAAM,CACJC,QAASL,EACTM,UAAW,SACXC,MAAOT,EAAIS,MACXC,GAAIX,EACJY,YAAa,6BACbC,WAAY,aAGTnF,OAAOsD,UAAUC,YAAYW,SAASI,MAMvDc,EAAmB,SAACjB,GACtB,IAAIkB,EAAO/E,KAAKgF,MAAMnB,EAAmB,IACrCoB,EAAOpB,EAAmB,GAI9B,OAHIoB,EAAO,KACPA,EAAO,IAAMA,GAEV,GAAP,OAAUF,EAAI,YAAIE,IAGhBC,EAAyB,WAC3B,IAAMrB,EAAmBR,IAErBQ,GAAoB,GACpBnB,EAAE,sBAAsByC,KAAKL,EAAiBjB,IAE1CA,GAnFK,GAqFLnB,EAAE,GAAD,OAAIF,EAA0B,iBAAgB4C,YAAY,6BAE3D1C,EAAE,GAAD,OAAIF,EAA0B,mBAAkB4C,YAAY,6BAGjEzB,KAEAf,KAIFyC,EAAa,WACf,IAAMxC,EAAeH,EAAEF,GACjBc,GAxFC,IAAIC,MAAOC,UAAYE,SAAoE,IAA3DhE,OAAOsD,UAAUC,YAAYC,4BAAoC,IA0FxG,GAAKL,GAAiBA,EAAaM,OAkB/BN,EAAaF,KAAK,aAAcW,OAlBO,CACvC,IAAMO,EAAmBR,EAAoBC,GAE7C,GAAIO,GAAoB,EAAG,CACvB,IAAIyB,EAAiBR,EAAiBjB,GAClC0B,EAAuB7F,OAAOsD,UAAUC,YAAYsC,qBAClDzC,EAAsB0C,YAAYN,EAAwB,KAEhExC,EAAE6B,MAAM,CACJC,QAAS,kCAAF,OAAoCe,EAAoB,8CAAsCD,EAAc,mBACnHb,UAAW,SACXC,MAAOhF,OAAOsD,UAAUC,YAAYC,6BA/GnC,GA+G+E,SAAW,OAC3FyB,GA9GW,mBA+GXC,YAAa,6BACba,WAAW,IACZ9C,KAAK,sBAAuBG,GAAqBH,KAAK,aAAcW,MAO7EoC,EAAO,WACLhG,OAAOsD,WAAatD,OAAOsD,UAAUC,aAAevD,OAAOsD,UAAUC,YAAYC,6BACjFmC,IAGJ3C,EAAE,+BAA+BiD,KAAK,UAAUC,IAAIpD,GAA4BqD,SAChFlC,KA0BJtG,EAAOD,QAAU,CACbsI,OACAI,gBANoB,WACpB,OAAOlD,GAMPmD,sBA1B0B,SAACC,GACvBA,GAAYA,EAAS/C,cACjBvD,OAAOsD,UACHtD,OAAOsD,UAAUC,aACjBvD,OAAOsD,UAAUC,YAAYW,SAAWlB,EAAEuD,OAAO,GAAIvG,OAAOsD,UAAUC,YAAYW,SAAUoC,EAAS/C,YAAYW,UACjHlE,OAAOsD,UAAUC,YAAYC,4BAA8B8C,EAAS/C,YAAYC,4BAChFR,EAAEF,GAA4BG,KAAK,mBAAoBe,SAASsC,EAAS/C,YAAYC,4BAA6B,MAElHxD,OAAOsD,UAAUC,YAAc+C,EAAS/C,YAG5CvD,OAAOsD,UAAY,CACfC,YAAa+C,EAAS/C,aAG9ByC,Q,mBClJR,IAAIrH,EAASuB,EAAQ,GACjBsG,EAAYtG,EAAQ,IACpBuG,EAAiBvG,EAAQ,IAOzBwG,EAAiB/H,EAASA,EAAOC,iBAAcgD,EAkBnDjE,EAAOD,QATP,SAAoBmB,GAClB,OAAa,MAATA,OACe+C,IAAV/C,EAdQ,qBADL,gBAiBJ6H,GAAkBA,KAAkBpI,OAAOO,GAC/C2H,EAAU3H,GACV4H,EAAe5H,K,mBCxBrB,IAAI8H,EAAOzG,EAAQ,GAsBnBvC,EAAOD,QAJG,WACR,OAAOiJ,EAAK9C,KAAK1D,Q,qQClBnB,IAAIyG,EAA8B,gBAAJ,IAANC,EAAM,cAANA,KAAsBA,GAAUA,EAAOvI,SAAWA,QAAUuI,EAEpFlJ,EAAOD,QAAUkJ,I,oCCHjB,IAAIE,EAAW5G,EAAQ,IACnBD,EAAWC,EAAQ,GACnB6G,EAAW7G,EAAQ,IAMnB8G,EAAa,qBAGbC,EAAa,aAGbC,EAAY,cAGZC,EAAenD,SA8CnBrG,EAAOD,QArBP,SAAkBmB,GAChB,GAAoB,iBAATA,EACT,OAAOA,EAET,GAAIkI,EAASlI,GACX,OA1CM,IA4CR,GAAIoB,EAASpB,GAAQ,CACnB,IAAIuI,EAAgC,mBAAjBvI,EAAMwI,QAAwBxI,EAAMwI,UAAYxI,EACnEA,EAAQoB,EAASmH,GAAUA,EAAQ,GAAMA,EAE3C,GAAoB,iBAATvI,EACT,OAAiB,IAAVA,EAAcA,GAASA,EAEhCA,EAAQiI,EAASjI,GACjB,IAAIyI,EAAWL,EAAWM,KAAK1I,GAC/B,OAAQyI,GAAYJ,EAAUK,KAAK1I,GAC/BsI,EAAatI,EAAM2I,MAAM,GAAIF,EAAW,EAAI,GAC3CN,EAAWO,KAAK1I,GAvDb,KAuD6BA,I,mBC5DvC,IAAI4I,EAAkBvH,EAAQ,IAG1BwH,EAAc,OAelB/J,EAAOD,QANP,SAAkBiK,GAChB,OAAOA,EACHA,EAAOH,MAAM,EAAGC,EAAgBE,GAAU,GAAGC,QAAQF,EAAa,IAClEC,I,iBCdN,IAAIE,EAAe,KAiBnBlK,EAAOD,QAPP,SAAyBiK,GAGvB,IAFA,IAAIG,EAAQH,EAAOlE,OAEZqE,KAAWD,EAAaN,KAAKI,EAAOI,OAAOD,MAClD,OAAOA,I,mBCfT,IAAInJ,EAASuB,EAAQ,GAGjB8H,EAAc1J,OAAOkB,UAGrBC,EAAiBuI,EAAYvI,eAO7BwI,EAAuBD,EAAYE,SAGnCxB,EAAiB/H,EAASA,EAAOC,iBAAcgD,EA6BnDjE,EAAOD,QApBP,SAAmBmB,GACjB,IAAIsJ,EAAQ1I,EAAe1B,KAAKc,EAAO6H,GACnC0B,EAAMvJ,EAAM6H,GAEhB,IACE7H,EAAM6H,QAAkB9E,EACxB,IAAIyG,GAAW,EACf,MAAOtI,IAET,IAAIiB,EAASiH,EAAqBlK,KAAKc,GAQvC,OAPIwJ,IACEF,EACFtJ,EAAM6H,GAAkB0B,SAEjBvJ,EAAM6H,IAGV1F,I,iBCzCT,IAOIiH,EAPc3J,OAAOkB,UAOc0I,SAavCvK,EAAOD,QAJP,SAAwBmB,GACtB,OAAOoJ,EAAqBlK,KAAKc,K,sPCUnClB,EAAOD,QAJP,SAAsBmB,GACpB,OAAgB,MAATA,GAAiC,UAAhB,EAAOA,K,gCCKjClB,EAAOD,QAAU,CACb4K,iBAxBJ,WACI,IAAMC,EAAQvF,EAAE,2BACVwF,EAAkBD,EAAME,SAASC,SAAS,eAEhD,GAAI1I,OAAO2I,YAAc3I,OAAO2I,WAAWC,sBAGvC,GAFsBC,eAAeC,QAAQ,wBAE1B,CACf,IAAMC,KAAuB/I,OAAOgJ,aAAehJ,OAAOgJ,YAAYC,MAAQjJ,OAAOgJ,YAAYC,KAAKC,OAASlJ,OAAOgJ,YAAYC,KAAKC,KAAKC,MAAK,SAAAD,GAAI,MAAwB,QAApBA,EAAKE,cAE1JL,IAAsBP,EACtBD,EAAMc,KAAK,oCACHN,GAAqBP,GAC7BD,EAAMe,OAAO,qBAEVd,GACPD,EAAMe,OAAO,qBAEVd,GACPD,EAAMe,OAAO,mB,gCCxBrB,qOASA3L,EAAOD,QAAU,SAAU6L,EAAaC,GAsBpC,GAzBAxG,EAKgBuG,GALRtD,KAAK,4BAA4BwD,YAAY,cAO9B,WAAnB,EAAOD,IAAwBA,EAAQE,QACvCpL,OAAO+F,KAAKmF,EAAQE,QAAQC,SAAQ,SAAUxK,GAC1C,GAAIqK,EAAQE,OAAOvK,GAAM,CACrB,IAAIyK,EAAkB5G,EAAEuG,GAAatD,KAAK,UAAY9G,EAAM,MACvDsJ,SACAoB,SAAS,qBAEVD,EAAgBnG,OAAS,IACrBqG,MAAMC,QAAQP,EAAQrK,IACtByK,EAAgBnF,KAAK+E,EAAQE,OAAOvK,GAAK6K,KAAK,UAE9CJ,EAAgBnF,KAAK+E,EAAQE,OAAOvK,IAExCyK,EAAgBK,SAAS,iBAAiBC,SAAS,mBAK/DV,GAAWA,EAAQW,MAAO,CAE1B,IAAMC,EAAepH,EAAEuG,IACwB,SAAjCa,EAAaC,KAAK,WAC1BD,EACAA,EAAaE,QAAQ,SAErBzF,MAAM,CACRC,QAAS0E,EAAQW,MAAMH,KAAK,SAC5BhF,MAAO,SACPuF,WAAY,UACZxE,WAAW,O,iCC1CvB,IAAIyE,EAAiBtK,EAAQ,GAE7BuK,QAAO,WACHD,EAAetK,EAAQ,KACvBsK,EAAetK,EAAQ,KAGvB8C,EAAE0H,UAAUC,GAAG,YAAa,6FAA6F,SAAU5K,GAC/H,IAAI6K,EAAkB5H,EAAE,sCACxB,GAAI4H,EAAgBlC,SAAS,aAAc,CACvC3I,EAAE8K,iBACFD,EAAgBlH,QAAQ,SACxB,IAAIoH,EAAqB9H,EAAE,8BAA8B+H,SACzD/H,EAAE,QAAQgI,QAAQ,CACdC,UAAWH,EAAmBI,c,gCCf9C,IAAIC,EAAcjL,EAAQ,IAO1B,SAASkL,EAAYC,GAWjB,OARIrI,EAAE,mBAAmB0F,SAAS,UAAY1F,EAAE,gBAAgBS,OACtDT,EAAEqI,GAAKf,QAAQ,kBAAkBrE,KAAK,sBAAsBhD,KAAK,OAChED,EAAE,uBAAuBS,QAAUT,EAAE,gBAAgBS,OACtDT,EAAEqI,GAAKf,QAAQ,mBAAmBrE,KAAK,eAAeR,OAEtDzC,EAAE,uCAAuCC,KAAK,OAW5D,SAASqI,EAAoBD,GACzB,IAAIE,EACJ,GAAIF,GAAOrI,EAAE,cAAcS,OACvB8H,EAAmBvI,EAAEqI,GAAKf,QAAQ,mBAAmBrE,KAAK,yBACvD,GAAIoF,GAAOrI,EAAE,mBAAmBS,OAAQ,CAC3C,IAAI+H,EAAwBxI,EAAEqI,GAAKf,QAAQ,iBAAiBrE,KAAK,oBAC7DwF,EAAsBzI,EAAEqI,GAAKf,QAAQ,kBAAkBrE,KAAK,oBAE5DsF,OADgC3J,IAAhC4J,EAAsBE,MACHD,EAEAD,OAGvBD,EAAmBvI,EAAE,oBAEzB,OAAOuI,EAQX,SAASI,EAAoBN,GACzB,OAAOC,EAAoBD,GAAKK,MAiNpC,SAASE,EAAsBtF,EAAUuF,GACrC,IAEIC,EAFAC,EACAF,EAAkBG,QAAQ,gCAAgCvI,OAAS,GAEnE6C,EAAS2F,QAAQC,uBAlIzB,SAAqBC,EAAON,EAAmBO,GAE3C,IAAIC,EAAoB,CAAC,SAEzBF,EAAMxC,SAAQ,SAAU2C,GAChBD,EAAkBE,QAAQD,EAAKrH,KAAO,EAvElD,SAA6BqH,EAAMT,EAAmBO,GAClDE,EAAKE,OAAO7C,SAAQ,SAAU8C,GAC1B,IAAIC,EAAab,EAAkB5F,KAAK,eAAiBqG,EAAKrH,GAAK,wBAC/DwH,EAAU5N,MAAQ,MAClB8N,EAAgBD,EAAWjE,SAE3BgE,EAAUG,UACVF,EAAWxC,SAAS,YACpBwC,EAAWzC,SAAS,4BAA4BxE,KAAK2G,EAAKS,yBAE1DH,EAAWjD,YAAY,YACvBiD,EAAWzC,SAAS,4BAA4B6C,SAGhDL,EAAUM,IACVJ,EAAcL,KAAK,WAAYG,EAAUM,KAEzCJ,EAAcK,WAAW,YAI7BN,EAAWjD,YAAY,2BAEvBiD,EAAWxC,SAASuC,EAAUQ,WAAa,aAAe,mBAiDtDC,CAAoBZ,EAAMT,EAAmBO,GAhCzD,SAAgCE,EAAMT,GAClC,IAAIsB,EAAQ,eAAiBb,EAAKrH,GAAK,KAClB4G,EAAkB5F,KAAKkH,EAAQ,YAAcb,EAAKrH,GAAK,iBAC7DqH,KAAK,QAASA,EAAKc,UAElCd,EAAKE,OAAO7C,SAAQ,SAAU8C,GAC1B,IAAIC,EAAab,EACZ5F,KAAKkH,EAAQ,sBAAwBV,EAAU5N,MAAQ,MAC5D6N,EAAWJ,KAAK,QAASG,EAAUM,KAC9BC,WAAW,YAEXP,EAAUQ,YACXP,EAAWJ,KAAK,YAAY,MAsB5Be,CAAuBf,EAAMT,MA2HjCyB,CAAYhH,EAAS2F,QAAQC,oBAAqBL,EAAmBvF,EAAShD,WAC9EwI,EAA6C,YAAjCxF,EAAS2F,QAAQsB,YACzBxB,GAA2BD,IAC3BD,EAAkBpD,OAAO,uBACpBxF,KAAK,MAAOqD,EAAS2F,QAAQhH,IAElC4G,EAAkBpD,OAAO,uBACpBxF,KAAK,iBAAkBqD,EAAS2F,QAAQuB,gBA1CzD,SAAwBC,EAAM5B,GAC1B,IAAI6B,EAAW7B,EAAkB5F,KAAK,aACtCjD,EAAE0K,GAAUA,SAAS,WACrB,IAAIC,EAAa3K,EAAE0K,GAAUpB,KAAK,MAClCtJ,EAAE0K,GAAUZ,QAAQc,OAAO,iIAAmID,EAAa,gHAAkH3K,EAAE0K,GAAUzK,KAAK,QAAU,sDAAwD0K,EAAa,gHAAkH3K,EAAE0K,GAAUzK,KAAK,QAAU,eAC1gB,IAAK,IAAIrF,EAAI,EAAGA,EAAI6P,EAAKhK,OAAQ7F,IAC7BoF,EAAE,wCAA0CyK,EAAK7P,GAAGmP,IAAM,oCAAsCU,EAAK7P,GAAGiQ,IAAM,iBAAmB7J,SAASyJ,EAAK7P,GAAGkK,MAAO,IAAM,YAAc2F,EAAK7P,GAAG8G,MAAQ,+BAA+BoJ,SAAS9K,EAAE0K,GAAUzH,KAAK,oBACtPjD,EAAE,qBAAuB2K,EAAa,oBAAsB/P,EAAI,oBAAoBkQ,SAAS9K,EAAE0K,GAAUzH,KAAK,yBAElHjD,EAAEA,EAAE0K,GAAUzH,KAAK,mBAAmB8H,QAAQ7D,SAAS,UACvDlH,EAAEA,EAAE0K,GAAUzH,KAAK,8BAA8B8H,QAAQ7D,SAAS,UAC9C,IAAhBuD,EAAKhK,QACLT,EAAEA,EAAE0K,GAAUzH,KAAK,wDAAwD+H,SAE/EhL,EAAE0K,GAAUA,WACZ1K,EAAEA,EAAE0K,GAAUzH,KAAK,yBAAyBqG,KAAK,eAAe,GAiChE2B,CADuB3H,EAAS2F,QAAQiC,OAAOC,MACdtC,GAG5BE,KACoB/I,EAAE,iBAAkB6I,GAAmBpI,OACtDT,EAAE,iBAAkB6I,GACpB7I,EAAE,mBACOoL,YAAY9H,EAAS2F,QAAQoC,MAAM5J,OAItDoH,EAAkB5F,KAAK,eAAe6G,QAAQrI,KAAK6B,EAAS2F,QAAQqC,gBAvIxE,SAA4BhI,EAAUuF,GAClC,IAAI0C,EAAoB,GACpBC,EAAuBlI,EAAS2F,QAAQwC,aAAavK,SACpDoC,EAAS2F,QAAQuB,aAGlBgB,EAAqB7E,SAAQ,SAAUhF,GACnC4J,GAAqB,YAAc5J,EAAU,iBAHjD4J,EAAoB,YAAcjI,EAAShD,UAAUoL,oBAAsB,cAO/E1L,EAAE6I,GAAmBnI,QAAQ,6BAA8B,CACvDuI,QAAS3F,EAAS2F,QAClBJ,kBAAmBA,EACnBlH,QAAS4J,EACTjL,UAAWgD,EAAShD,YA0HxBqL,CAAmBrI,EAAUuF,GAEzBE,GACoBF,EAAkB5F,KAAK,yBAC7BvC,QAAQ,kCAAmC,CACrDuI,QAAS3F,EAAS2F,QAASJ,kBAAmBA,IAIlD7I,EAAE,oFAAoFU,QAAQ,0BAA2B,CACrHuI,QAAS3F,EAAS2F,QAASJ,kBAAmBA,IAC/CnI,QAAQ,uBAAwB4C,EAAS2F,SAIhDJ,EAAkB5F,KAAK,oBAAoB6G,QACtCrI,KAhIT,SAA2BmK,GACvB,IAAKA,EACD,MAAO,GAGX,IAAInK,EAAO,GAWX,OATAmK,EAAWjF,SAAQ,SAAUkF,GACC,mBAAtBA,EAAeC,IACfD,EAAeD,WAAWjF,SAAQ,SAAUoF,GACxCtK,GAAQ,iCAAmCsK,EAAUC,MAAQ,KACvDD,EAAUlQ,MAAQ,eAK7B4F,EAgHGwK,CAAkB3I,EAAS2F,QAAQ2C,aAkCjD,SAASM,EAAgBC,EAAkBtD,GACnCsD,IACAnM,EAAE,QAAQU,QAAQ,gCACd,CAAEqJ,IAAKoC,EAAkBC,UAAWvD,IAExC7I,EAAEqM,KAAK,CACHtC,IAAKoC,EACLG,OAAQ,MACRC,QAAS,SAAUtM,GACf2I,EAAsB3I,EAAM4I,GAlI5C,SAAuB2D,EAAa3D,GAEhCA,EAAkB5F,KAAK,oBAAoB6G,QAAQrI,KAAK+K,GAiI5CC,CAAcxM,EAAKgJ,QAAQuD,YAAa3D,GA3BxD,SAA0B6D,EAAY7D,GAClC,GAAIA,EAAkBpD,OAAO,uBAAuBhF,QAAU,EAAG,CAC7D,IAAI+L,EAAcE,EAAWC,KAAI,SAAUC,GACvC,IAAIhD,EAAWgD,EAAShD,SAAW,aAAe,GAClD,MAAO,kBAAoBgD,EAAS/Q,MAAQ,gBAAkB+Q,EAAS7C,IAAM,IACzEH,EAAW,IAAMgD,EAAS/Q,MAAQ,eACvCmL,KAAK,IACRsB,EAAoBO,GAAmBiB,QAAQrI,KAAK+K,IAqB5CK,CAAiB5M,EAAKgJ,QAAQyD,WAAY7D,GAC1C7I,EAAE,QAAQU,QAAQ,+BACd,CAAET,KAAMA,EAAMmM,UAAWvD,IAC7B7I,EAAE8M,UAAUC,QAEhB5F,MAAO,WACHnH,EAAE8M,UAAUC,WAqB5B,SAASC,EAAUvL,GACf,IAAIwL,EAAQjN,EAAE,SAAS4K,OAAO5K,EAAEkN,UAAUzL,IAK1C,MAAO,CAAE0L,KAHEF,EAAMhK,KAAK,4BAGDmK,OAFRH,EAAMhK,KAAK,iBAAiB4D,YAU7C,SAASwG,EAAoBpN,GAMzB,IAAIqN,EALJtN,EAAE,eAAe8M,UAAUS,QAEkB,IAAzCvN,EAAE,4BAA4BS,QAC9BT,EAAE,4BAA4BmD,SAI9BmK,EADArN,EAAKuN,qBACMvN,EAAKwN,yBAELxN,EAAKyN,yBAGpB,IAAIC,EAAa,0NAIU1N,EAAK2N,cAJf,eAKK3N,EAAK4N,KALV,kBAMQ5N,EAAK6N,QANb,uBAOa7N,EAAK8N,aAPlB,qCASS9N,EAAK+N,SATd,kBAUQ/N,EAAKwN,yBAVb,+BAWqBxN,EAAKuN,qBAX1B,wGAeavN,EAAKgO,OAAOC,YAfzB,0QA0BjBlO,EAAE,QAAQ4K,OAAO+C,GACjB3N,EAAE,eAAe8M,UAAUS,QAE3BvN,EAAEqM,KAAK,CACHtC,IAAKuD,EACLhB,OAAQ,MACR6B,SAAU,OACV5B,QAAS,SAAUjJ,GACf,IAAI8K,EAAapB,EAAU1J,EAAS+K,kBACpCrO,EAAE,wCAAwC8J,QAC1C9J,EAAE,2CAA2CyC,KAAKa,EAASgL,oBAC3DtO,EAAE,0DAA0DyC,KAAKa,EAASiL,iBAC1EvO,EAAE,wCAAwCyB,KAAK2M,EAAWjB,MAC1DnN,EAAE,0CAA0CyB,KAAK2M,EAAWhB,QAC5DpN,EAAE,4BAA4BwO,MAAM,QACpCxO,EAAE8M,UAAUC,QAEhB5F,MAAO,WACHnH,EAAE8M,UAAUC,UA2DxB,SAAS0B,EAAW5F,GAChB,IAAIjL,EAAUiL,EACT5F,KAAK,mBACL0J,KAAI,WACD,IAAI+B,EAAY1O,EAAEnD,MAAMoG,KAAK,mBACzB0L,EAAWD,EAAUhG,MACrBkG,EAAkBF,EAAUzL,KAAK,iBAAmB0L,EAAW,MAC9D1O,KAAK,YACV,MAAO,CACH4O,SAAU7O,EAAEnD,MAAMoD,KAAK,aACvB2O,gBAAiBA,MAEtBE,UAEP,OAAOC,KAAKC,UAAUpR,GAQ1B,SAASqR,EAAqBlF,GACtBA,GACA/J,EAAEqM,KAAK,CACHtC,IAAKA,EACLuC,OAAQ,MACRC,QAAS,aAGTpF,MAAO,eAOnBxM,EAAOD,QAAU,CACbwR,gBAAiBA,EACjBgD,QAAS,CACLC,kBAAmB,SAAUlP,GACzBoN,EAAoBpN,KAI5BmP,6BAA8B,WAC1BpP,EAAE,QAAQ2H,GAAG,iBAAkB,4BAA4B,WACvD3H,EAAE,4BAA4BiH,WAAWqC,KAAK,cAAe,QAC7DtJ,EAAE,mCAAmCqP,YAI7CC,iCAAkC,WAC9BtP,EAAE,QAAQ2H,GAAG,kBAAmB,4BAA4B,WACxD3H,EAAE,4BAA4BiH,WAAWqC,KAAK,cAAe,aAIrEiG,iCAAkC,WAC9BvP,EAAE,QAAQ2H,GAAG,UAAW,4BAA4B,SAAU5K,GAC1D,IAAIyS,EAAc,CACdC,MAAO1S,EACP2S,kBAAmB,2BACnBC,qBAAsB,SACtBC,oBAAqB,uBAEzBzH,EAAY0H,gBAAgBL,OAIpCM,eAAgB,WACZ9P,EAAE0H,UAAUC,GAAG,QAAS,8BAA8B,SAAU5K,GAG5D,GAFAA,EAAE8K,kBAEE7H,EAAEnD,MAAMyM,KAAK,YAAjB,CAGA,IAAIT,EAAoB7I,EAAEnD,MAAMyK,QAAQ,aACnCuB,EAAkBpI,SACnBoI,EAAoB7I,EAAEnD,MAAMyK,QAAQ,oBAGxC4E,EAAgBlM,EAAEnD,MAAMyM,KAAK,YAAaT,QAIlDkH,gBAAiB,WACb/P,EAAE0H,UAAUC,GAAG,SAAU,6CAA6C,SAAU5K,GAC5EA,EAAE8K,iBAEF,IAAIgB,EAAoB7I,EAAEnD,MAAMyK,QAAQ,aACnCuB,EAAkBpI,SACnBoI,EAAoB7I,EAAEnD,MAAMyK,QAAQ,oBAExC4E,EAAgBnP,EAAEiT,cAAcnU,MAAOgN,OAI/C4C,aAAc,WACVzL,EAAE0H,UAAUC,GAAG,SAAU,oBAAoB,SAAU5K,GACnDA,EAAE8K,iBAEF,IAAIgB,EAAoB7I,EAAEnD,MAAMyK,QAAQ,mBACnCuB,EAAkBpI,SACnBoI,EAAoB7I,EAAEnD,MAAMyK,QAAQ,kBAAkBrE,KAAK,uBAGV,IAAjDjD,EAAE,gBAAiB6I,GAAmBpI,QACtCyL,EAAgBlM,EAAEjD,EAAEiT,eAAe/M,KAAK,mBAAmBhD,KAAK,OAC5D4I,OAKhBoH,UAAW,WACPjQ,EAAE0H,UAAUC,GAAG,QAAS,iDAAiD,WACrE,IAAIoG,EACAmC,EACAC,EACAC,EAEJpQ,EAAE,QAAQU,QAAQ,0BAA2B7D,MAEzCmD,EAAE,cAAcS,QAAUT,EAAEnD,MAAM6I,SAAS,wBAC3C0K,EAAU,GAEVpQ,EAAE,mBAAmBqQ,MAAK,WACjBrQ,EAAEnD,MAAM6I,SAAS,uBAClB0K,EAAQE,KAAK,CACTJ,IAAKlQ,EAAEnD,MAAMoG,KAAK,eAAeR,OACjC8N,IAAKvQ,EAAEnD,MAAMoG,KAAK,oBAAoByF,MACtC9K,QAAS6Q,EAAWzO,EAAEnD,YAIlCsT,EAAUpB,KAAKC,UAAUoB,IAG7BF,EAAM9H,EAAYpI,EAAEnD,OAEpB,IAAIgM,EAAoB7I,EAAEnD,MAAMyK,QAAQ,mBACnCuB,EAAkBpI,SACnBoI,EAAoB7I,EAAEnD,MAAMyK,QAAQ,sBAAsBrE,KAAK,oBAGnE8K,EA5RD/N,EAAE,oBAAoB0I,MA8RrB,IApKJ8H,EAoKQC,EAAO,CACPP,IAAKA,EACLC,QAASA,EACTK,eAvKRA,EAAgB,GACpBxQ,EAAE,gBAAgBqQ,MAAK,WACnBG,EAAcF,KAAK,CACfJ,IAAKlQ,EAAEnD,MAAMoG,KAAK,eAAeR,OACjCmK,SAAU5L,SAAShB,EAAEnD,MAAMoG,KAAK,kBAAkBhD,KAAK,YAAa,SAIrEuQ,EAAc/P,OAASsO,KAAKC,UAAUwB,GAAiB,IAgKlD5D,SAAUjE,EAAoB3I,EAAEnD,QAG/BmD,EAAE,gBAAgBS,SACnBgQ,EAAK7S,QAAU6Q,EAAW5F,IAG9B7I,EAAEnD,MAAM6D,QAAQ,0BAA2B+P,GACvC1C,GACA/N,EAAEqM,KAAK,CACHtC,IAAKgE,EACLzB,OAAQ,OACRrM,KAAMwQ,EACNlE,QAAS,SAAUtM,IAtNvC,SAA2BqD,GACvBtD,EAAE,aAAaU,QAAQ,eAAgB4C,GACvC,IAAIoN,EAAcpN,EAAS6D,MAAQ,eAAiB,gBAEhD7D,EAASqN,0BACoD,IAA1DrV,OAAO+F,KAAKiC,EAASqN,0BAA0BlQ,OAClD4M,EAAoB/J,EAASqN,2BAEa,IAAtC3Q,EAAE,yBAAyBS,QAC3BT,EAAE,QAAQ4K,OACN,4CAIR5K,EAAE,yBAAyB4K,OACvB,qBAAuB8F,EAAc,kDACnCpN,EAAS3B,QACT,UAGN5C,YAAW,WACPiB,EAAE,wBAAwBmD,WAC3B,MAiMayN,CAAkB3Q,GAClBD,EAAE,QAAQU,QAAQ,yBAA0BT,GAC5CD,EAAE8M,UAAUC,OACZkC,EAAqBhP,EAAK4Q,eAE9B1J,MAAO,WACHnH,EAAE8M,UAAUC,cAMhC+D,mBAAoB,WAChB9Q,EAAE0H,UAAUC,GAAG,QAAS,yBAAyB,WAC7C,IAAIoJ,EAAwB/Q,EAAEnD,MAAMmM,QAAQ,4BACxCkH,EAAMlQ,EAAEnD,MAAMoD,KAAK,OACnB+Q,EAAUhR,EAAE,gCAAgCC,KAAK,aACjDgR,EAAejQ,SAAS+P,EAAsB9N,KAAK,0BAA0ByF,MAAO,IACpFwI,EAAW,EACflR,EAAEqQ,KAAKrQ,EAAE,oEAAoE,WACzEkR,GAAYlR,EAAEnD,MAAMoD,KAAK,UAE7BiR,GAAYD,EACZ,IAAIE,EAAWJ,EAAsB9N,KAAK,mBAAmBhD,KAAK,aAC9DmR,EAAUL,EAAsB9N,KAAK,mCAAmChD,KAAK,WACjF,GAAIiR,GAAYF,EAAS,CACrB,IAAIK,EAA2B,2CAEdnB,EAFc,cAGde,EAHc,oBAIRE,GAAY,IAJJ,iCAKKC,GAAW,IALhB,sDAQ7BL,EAAsB9N,KAAK,iBAAiBxB,OARf,sFAa/BzB,EAAE,qDAAqD4K,OAAOyG,GAC9DrR,EAAE,sBAAsByB,KAAKyP,GAC7BlR,EAAE,2CAA2CyG,YAAY,qBAEzDzG,EAAE,2CAA2CkH,SAAS,oBAIlEoK,mBAAoB,WAChBtR,EAAE0H,UAAUC,GAAG,QAAS,iBAAiB,WACrC3H,EAAEnD,MAAMsG,SACR,IAAIoO,EAAYvR,EAAE,mEACdwR,EAAQ,EACRD,EAAU9Q,QACV8Q,EAAUlB,MAAK,WACXmB,GAASxQ,SAAShB,EAAEnD,MAAMoD,KAAK,OAAQ,OAI/CD,EAAE,sBAAsByB,KAAK+P,GAC7BxR,EAAE,2CAA2CyG,YAAY,oBAGjEgL,4BAA6B,WACzBzR,EAAE,QAAQ2H,GAAG,mCAAmC,SAAU5K,EAAGuG,GACzDtD,EAAE,8BAA+BsD,EAASuF,mBAAmBS,KAAK,YAC5DhG,EAAS2F,QAAQuB,eAAiBlH,EAAS2F,QAAQyI,WACzD,IAAIxB,EAAM5M,EAAS2F,QAAQhH,GAC3BjC,EAAE,8BAA+BsD,EAASuF,mBAAmB5I,KAAK,MAAOiQ,OAGjFyB,sBAAuB,WACnB3R,EAAE0H,UAAUC,GAAG,QAAS,6BAA6B,WACjD,IAAIoC,EAAM/J,EAAEnD,MAAMoD,KAAK,OACvBD,EAAE,kBAAkB8M,UAAUS,QAC9BvN,EAAEqM,KAAK,CACHtC,IAAKA,EACLuC,OAAQ,MACRC,QAAS,SAAU9K,GACf,IAAI2M,EAAapB,EAAUvL,GAC3BzB,EAAE,eAAe4K,OAAOwD,EAAWjB,MACnCnN,EAAE,mCAAmCmD,SACrCnD,EAAE,kBAAkB8M,UAAUC,QAElC5F,MAAO,WACHnH,EAAE,kBAAkB8M,UAAUC,cAK9C6E,uBAAwB,WACpB5R,EAAE0H,UAAUC,GAAG,QAAS,uBAAuB,WAC3C,IAAIkK,EAA6B7R,EAAE,8CAC/B8R,EAAc,SACd/H,EAAM/J,EAAE,gCAAgCC,KAAK,gBAC7C8R,EAAa,CACbC,cAAe,IAGnBhS,EAAEqQ,KAAKwB,GAA4B,WAC/B,IAAII,EACAjR,SAAShB,EAAEnD,MACNoD,KAAK,OAAQ,IAElBiS,EAAS,KACTD,EAAY,IACRjS,EAAEnD,MAAMoD,KAAK,aAAeD,EAAEnD,MAAMoD,KAAK,4BACzCiS,EAAS,IACFrD,SAAW7O,EAAEnD,MAAMoD,KAAK,YAC/BiS,EAAOC,UAAYnS,EAAEnD,MAAMoD,KAAK,OAChCiS,EAAOtD,gBAAkB5O,EAAEnD,MAAMoD,KAAK,0BAE1C8R,EAAWC,cAAc1B,KAAK,CAC1BJ,IAAKlQ,EAAEnD,MAAMoD,KAAK,OAClBsQ,IAAK0B,EACLrU,QAAS,CAACsU,KAEdH,EAAWb,SAAWlQ,SAAShB,EAAE,sBAAsByB,OAAQ,QAKvEqQ,GADAA,GADAA,GAAe/C,KAAKC,UAAU+C,IACF,SAAW/R,EAAE,gCAAgCC,KAAK,SAClD,YAAcD,EAAE,gCAAgCC,KAAK,WACjFD,EAAE8M,UAAUS,QACZvN,EAAEqM,KAAK,CACHtC,IAAKA,EAAM+H,EACXxF,OAAQ,OACRC,QAAS,SAAUtM,GACfD,EAAE8M,UAAUC,OACR9M,EAAKkH,OACLnH,EAAE,4BAA4BwO,MAAM,QACM,IAAtCxO,EAAE,yBAAyBS,QAC3BT,EAAE,QAAQ4K,OAAO,4CAErB5K,EAAE,yBAAyB4K,OACvB,gFAEE3K,EAAKmS,aAAe,UAE1BrT,YAAW,WACPiB,EAAE,wBAAwBmD,WAC3B,OAEHnD,EAAE,uCAAuCyB,KAAKxB,GAC9CD,EAAE,yBAAyByG,YAAY,kBACvCzG,EAAE,4BAA4BwO,MAAM,QAEM,IAAtCxO,EAAE,yBAAyBS,QAC3BT,EAAE,QAAQ4K,OAAO,4CAErB5K,EAAE,sBAAsByB,KAAKxB,EAAKiR,UAClClR,EAAE,yBAAyB4K,OACvB,iFAEE3K,EAAKoS,WAAa,UAExBtT,YAAW,WACPiB,EAAE,wBAAwBmD,SACtBnD,EAAE,cAAcS,QAChB6R,SAASC,WAEd,QAGXpL,MAAO,WACHnH,EAAE8M,UAAUC,cAM5B3E,YAAaA,EACbO,oBAAqBA,EACrBsG,qBAAsBA,I,gCC90B1B,YAGA,yvCAoBA,SAASuD,EAAcC,GAOnB,IANA,IACIC,EACAC,EACAC,EAHAC,EAAMJ,EAAIK,MAAM,KAIhBC,EAAS,GAEJnY,EAAIiY,EAAIpS,OAAS,EAAG7F,GAAK,EAAGA,IAC7BiY,EAAIjY,GAAG6F,SAEPkS,GADAD,EAAIG,EAAIjY,GAAGkY,MAAM,MACX,GACNF,EAAI,GACAF,EAAEjS,OAAS,IACXmS,EAAIF,EAAE,IAEVK,EAAOJ,GAAKC,GAIpB,OAAOG,EAyEX,SAASC,EAAoBjJ,GACzB,IAAIkJ,EACJ,GAAKlJ,EAGE,CAEH,IAAImJ,EAAanJ,EAAIR,QAAQ,KAAO,EAChC4J,EAAWpJ,EAAIR,QAAQ,KAC3B4J,EAAWA,GAAYD,EAAaC,EAAWpJ,EAAItJ,OAInDwS,EAASlJ,EAAIqJ,UAAUF,EAAYC,GAChB,IAAfD,IAA6C,IAAzBD,EAAO1J,QAAQ,OAGnC0J,EAAS,SAbbA,EAASX,SAASW,OAAOG,UAAU,GAiBvC,IAAIpV,EAAS,GACTiV,GACYA,EAAOH,MAAM,KACnBnM,SAAQ,SAAU0M,GACpB,IAAIC,EAAUD,EAAKP,MAAM,KACzB9U,EAAOsV,EAAQ,IAAMC,mBAAmBD,EAAQ,IAAM,OAI9D,OAAOvE,KAAKyE,MAAMzE,KAAKC,UAAUhR,IASrC,SAASyV,EAAoBC,EAAKC,GAC9B,IAAI5J,EAAM4J,GAAa,GACnBC,EAAO,GACPC,EAAO,GACX,GAAI9J,EAAK,CACL,IAEIjF,EAFAgP,EAAU/J,EAAIR,QAAQ,KACtBwK,EAAYhK,EAAIR,QAAQ,KAExBwK,GAAa,IACbjP,EAAQiP,EACRF,EAAO9J,EAAIqJ,UAAUW,IAErBD,GAAW,IACXhP,EAAQgP,GAEZF,EAAO7J,EAAIqJ,UAAU,EAAGtO,GAE5B,OAAO8O,EAAO,IAAM5T,EAAEgU,MAAMN,GAAOG,EA4CvC,SAASI,EAAiBC,EAAYP,GAClC,IAAI5J,EAAM,IAAIoK,IAAIR,GAElB,OADA5J,EAAIqK,aAAaC,OAAOH,GACjBnK,EA8KX,SAASuK,EAAWC,EAAKC,GACrB,IAAIC,EAAS/M,SAASgN,cAAc,UACpCD,EAAOE,KAAO,kBACdF,EAAOF,IAAMA,EACb7M,SAASkN,qBAAqB,QAAQ,GAAGC,YAAYJ,GAEjDD,IACAC,EAAOK,OAASN,GASxB,SAASO,EAAsBR,EAAKC,GACJ,aAAxB9M,SAASsN,WACTV,EAAWC,EAAKC,GAEhBxX,OAAOiY,iBAAiB,QAAQ,WAC5BX,EAAWC,EAAKC,MAiE5B,SAASU,EAAQC,EAAMC,EAAKC,EAAUlZ,GAClC,IAAImZ,EAAUF,EAERG,EAAO,EAAIH,EAAM,EAEjBI,EAAQ,EAAIJ,EAAM,EAaxB,GAVIG,EAAOF,GAAYF,EAAKI,GAAMpZ,GAAOgZ,EAAKG,GAASnZ,KACnDmZ,EAAUC,GAIVC,EAAQH,GAAYF,EAAKK,GAAOrZ,GAAOgZ,EAAKG,GAASnZ,KACrDmZ,EAAUE,GAIVF,IAAYF,EAAK,CAEjB,MAC6B,CAACD,EAAKG,GAAUH,EAAKC,IAAjDD,EAAKC,GAAI,KAAED,EAAKG,GAAQ,KAEzBJ,EAAQC,EAAMG,EAASD,EAAUlZ,IA/CzC0H,EAAO4R,SAAW5R,EAAO4R,UAAY,GACrC5R,EAAO4R,SAASV,sBAAwBA,EAgHxCpa,EAAOD,QAAU,CACbgb,iBA9iBJ,SAA0B3L,EAAK5O,EAAMU,GACjC,IAAIZ,EAAI,IAIR,OAHwB,IAApB8O,EAAIR,QAAQtO,KACZA,EAAI,KAED8O,EAAM9O,EAAIE,EAAO,IAAMwa,mBAAmB9Z,IA0iBjD2W,cAAeA,EACfoD,iBAxgBJ,SAA0B7L,GACtB,IAAI8L,EAAM9L,EAAI+I,MAAM,KAChBG,EAAS,GACT6C,EAAa,GACbC,GAAW,EAEf,GAAIF,EAAIpV,OAAS,EAAG,CAChB,IAAIuV,EAAUH,EAAI,GAAG/C,MAAM,KAC3BG,EAAS+C,EAAQ,GAEbA,EAAQvV,OAAS,IACjBsV,GAAW,EACXD,EAAaE,EAAQ,IAI7B,IAAIjD,EAAS,GAIb,GAHIE,EAAOxS,SACPsS,EAASP,EAAcS,IAEvB8C,GACID,EAAWrV,OAAQ,CACnB,IAAIwV,EAAUzD,EAAcsD,GAC5Bxa,OAAO+F,KAAK4U,GAAStP,SAAQ,SAAUU,GACnC0L,EAAO1L,GAAQ4O,EAAQ5O,MAKnC,OAAO0L,GA4ePmD,eAjeJ,SAAwBnM,EAAKiK,EAAOmC,GAChC,IAAIC,EAAmB,GACnBC,EAAYtM,EAAI+I,MAAM,KACtBwD,EAAUD,EAAU,GACpBE,EAAgBF,EAAU,GAC1BG,EAAO,GACX,GAAID,EAAe,CACfF,EAAYE,EAAczD,MAAM,KAChC,IAAK,IAAIlY,EAAI,EAAGA,EAAIyb,EAAU5V,OAAQ7F,IAC9Byb,EAAUzb,GAAGkY,MAAM,KAAK,KAAOkB,IAC/BoC,GAAoBI,EAAOH,EAAUzb,GACrC4b,EAAO,KAMnB,OAAOF,EAAU,IAAMF,GADRI,EAAO,GAAKxC,EAAQ,IAAMmC,IAkdzCM,kBAhVJ,SAA2BC,EAAIC,GAM3B,OALgB3W,EAAE2M,IAAI+J,GAClB,SAAU9D,GACN,OAAO5S,EAAE4W,QAAQhE,EAAG+D,GAAM,EAAI,KAAO/D,MA8U7CiE,kBA1TJ,WAAuD,IAA5B/U,EAAU,UAAH,6CAAG,GAAIlE,EAAU,UAAH,6CAAG,GAEzCkZ,EAAW,CACbpV,MAAO,GACPqV,cAAc,EACdC,sBAAsB,EACtBC,eAAgB,WAChBC,cAAe,wBACfC,cAAe,GACfC,QAAS,GACTC,QAAS,IAKPC,EAAWtX,EAAEuD,OAAO,GAAIuT,EAAUlZ,GAGlC2Z,EAAiB,GACvB,CAAC,WAAY,WAAY,QAAS,QAAQ5Q,SAAQ,SAAAqN,QACtBpV,IAApB0Y,EAAStD,IACTuD,EAAejH,KAAK,QAAD,OAAS0D,EAAK,aAAKsD,EAAStD,GAAM,SAI7D,IAAIwD,EAAS,6BACTF,EAAS5V,QACT8V,GAAU,4BAAJ,OAAgCF,EAAS5V,MAAK,WAEpD4V,EAASP,eACTS,GAAU,0IAEdA,GAAU,SAEV,IAAIC,EAAc,GACdH,EAASF,UACTK,EAAc,OAAH,OAAUH,EAASF,QAAO,MAGzC,IAEgC,EAF5BhK,EAAS,GACTsK,EAAa,GAAG,IACJJ,EAASD,SAAO,IAAhC,IAAK,EAAL,qBAAkC,KAAzBM,EAAG,QACRD,GAAcC,GACjB,8BACGD,IACAtK,EAAS,6BAAH,OAAgCsK,EAAU,WAKpD,IAAMjW,EAAO,0BAAH,OAA6B6V,EAASH,cAAa,aAAKM,EAAW,qBACvEF,EAAevQ,KAAK,KAAI,sDACUsQ,EAASN,qBAAyC,GAAlB,gBAAoB,mDACzDM,EAASJ,cAAa,YAAII,EAASL,eAAc,gFAElEO,EAAM,mFAEF1V,EAAO,6DAEXsL,EAAM,gEAKxB,OAAO3L,GA2PPuR,oBAAqBA,EACrBS,oBAAqBA,EACrBQ,iBAAkBA,EAClB2D,+BAhWJ,SAAwC1D,GACpC,IAAInK,EAAMkK,EAAiBC,EAAYlX,OAAOsV,SAASuF,MACvDC,QAAQC,aAAa,KAAM,GAAIhO,IA+V/BiO,eAzPJ,SAAwBC,GACpB,IACIxW,EAAO,yBADDwW,GAAe,IACkB,WAC3CjY,EAAE,QAAQ4K,OAAOnJ,IAuPjByW,eAhPJ,SAAwBD,GACpB,IAAIE,EAAW,aAAeF,EAAc,IAAMA,EAAc,IAChEjY,EAAE,QAAQiD,KAAKkV,GAAUhV,UA+OzBiV,eA/YJ,SAAwBrO,EAAK5O,EAAMuN,GAC/B,IAAI2P,EAAKrF,EAAoBjJ,GAE7B,OADAsO,EAAGld,GAAQwa,mBAAmBjN,GACvB+K,EAAoB4E,EAAItO,IA6Y/BuO,WApYJ,SAAoBvO,EAAK2J,GACrB,IAAI2E,EAAKrF,EAAoBjJ,GAE7B,OAAO0J,EADQzT,EAAEuD,OAAO,GAAI8U,EAAI3E,GACK3J,IAkYrCwO,iBAzXJ,SAA0B7P,GACtB,OAAO6K,mBAAmB7K,EAAI9D,QAAQ,MAAO,OAyX7C4T,kBAzOJ,SAA2BC,EAAIC,GAM3B,IALA,IAAIxQ,EAAMuQ,EAAGE,UACTpD,EAAOkD,EAAGG,WACVC,EAAQJ,EAAGK,YACXC,EAASN,EAAGO,aAETP,EAAGQ,cAEN/Q,IADAuQ,EAAKA,EAAGQ,cACEN,UACVpD,GAAQkD,EAAGG,WAOf,YAJ2B,IAAhBF,IACPxQ,GAAOwQ,GAGgB,OAAvB1b,OAAOkc,YAEHhR,EAAOlL,OAAOmc,YAAcnc,OAAOoc,aACnC7D,EAAQvY,OAAOkc,YAAclc,OAAOqc,YACnCnR,EAAM6Q,EAAU/b,OAAOmc,aACvB5D,EAAOsD,EAAS7b,OAAOkc,YAIJ,eAAxBxR,SAAS4R,aAELpR,EAAOlL,OAAO0K,SAAS6R,gBAAgBtR,UAAYjL,OAAO0K,SAAS6R,gBAAgBC,cACnFjE,EAAQvY,OAAO0K,SAAS6R,gBAAgBE,WAAazc,OAAO0K,SAAS6R,gBAAgBG,aACpFxR,EAAM6Q,EAAU/b,OAAO0K,SAAS6R,gBAAgBtR,WAChDsN,EAAOsD,EAAS7b,OAAO0K,SAAS6R,gBAAgBE,aA4MzD1E,sBAAuBA,EACvB4E,oBAhKJ,SAA6BC,EAAWnH,GACpC,IAAIoH,EAAQD,EACRrM,EAAQsM,EAAMC,eACdC,EAAMF,EAAMG,aAGhBH,EAAMhe,MAAQge,EAAMhe,MAAMuX,UAAU,EAAG7F,GAASkF,EAAMoH,EAAMhe,MAAMuX,UAAU2G,GAE5EF,EAAMC,eAAiBvM,EAAQkF,EAAIhS,OACnCoZ,EAAMG,aAAeH,EAAMC,gBAwJ3BG,kBAxHJ,SAA2BxH,GACvB,OAAOA,EAAI7N,QAAQ,aAAa,SAAUsV,GACtC,OAAOA,EAAKnV,OAAO,GAAGoV,cAAgBD,EAAK1V,MAAM,GAAG4V,kBAuHxDC,gBAjJJ,SAAyBC,GACrB,IAAIC,EAAO,IAAI1Z,KACX2Z,EAAQD,EAAKE,WACbC,EAAUH,EAAKI,aACfC,EAAOJ,GAAS,GAAK,KAAO,KAKhC,OAAOF,EAAe,MAHtBE,GADAA,GAAS,KACQ,IAEK,KADtBE,EAAUA,EAAU,GAAK,IAAMA,EAAUA,GACH,IAAME,IA0I5CC,aAtDJ,SAAsB1F,EAAM9Y,EAAGF,GACvBgZ,EAAK1U,OAASpE,IAEdA,EAAI8Y,EAAK1U,QAGb,IAAMqa,EAAY/L,KAAKyE,MAAMzE,KAAKC,UAAUmG,IACtCnX,EAAS,IAhCnB,SAAoBmX,EAAMhZ,GAItB,IAHA,IAAM4e,EAAc5F,EAAK1U,OAGhB2U,EAAM9X,KAAKgF,MAAMyY,EAAc,GAAK,EAAG3F,GAAO,EAAGA,IACtDF,EAAQC,EAAMC,EAAK2F,EAAa5e,GAGpC,IAAK,IAAIiZ,EAAM2F,EAAc,EAAG3F,EAAM,EAAGA,IAAO,CAC5C,IAAI4F,EAAgB7F,EAAK,GAEzBA,EAAK,GAAKA,EAAKC,GAEfD,EAAKC,GAAO4F,EAEZ9F,EAAQC,EAAM,EAAGC,EAAKjZ,IAoB1B8e,CAAWH,EAAW3e,GAEtB,IAAK,IAAIvB,EAAI,EAAGA,EAAIyB,EAAGzB,IAEnBoD,EAAOsS,KAAKwK,EAAUI,OAG1B,OAAOld,GAsCPmd,UA9BJ,SAASA,EAAUC,EAAMC,GACrB,OAAQD,GAAQC,GAAwB,WAAhB,EAAOD,IAAqC,WAAhB,EAAOC,GACtD/f,OAAO+F,KAAK+Z,GAAM3a,SAAWnF,OAAO+F,KAAKga,GAAM5a,QAChDnF,OAAO+F,KAAK+Z,GAAME,QAAO,SAAUC,EAASpf,GACxC,OAAOof,GAAWJ,EAAUC,EAAKjf,GAAMkf,EAAKlf,OAC7C,GAASif,IAASC,M,iDCljB7B1gB,EAAOD,QAAU,CACbmV,gBAAiB,SAAUL,GAIvB,GAF8C,QAA1BA,EAAYC,MAAMtT,KADpB,IACqCqT,EAAYC,MAAM+L,QAEzE,CAIA,IAAIC,EAAmBzb,EAAEwP,EAAYE,kBAAoB,IAAMF,EAAYG,sBACvE+L,EAAkB1b,EAAEwP,EAAYE,kBAAoB,IAAMF,EAAYI,qBAE1E,GAAI5P,EAAEwP,EAAYE,kBAAoB,IAAMF,EAAYI,qBAAqB+L,GAAG,eAC5ED,EAAkB1b,EAAEwP,EAAYE,kBAAoB,IAAMF,EAAYoM,2BAClE5b,EAAE,kCAAkCS,OAAS,GAAG,CAChD,IAAIob,EAAe7b,EAAEwP,EAAYE,kBAAoB,0BACrDgM,EAAkBG,EAAaA,EAAapb,OAAS,GAIzD+O,EAAYC,MAAMqM,SACd9b,EAAE,UAAU2b,GAAGF,KACfC,EAAgBrM,QAChBG,EAAYC,MAAM5H,kBAGlB7H,EAAE,UAAU2b,GAAGD,KACfD,EAAiBpM,QACjBG,EAAYC,MAAM5H,sB,k8HClBlC,SAAS5K,EAASyW,GACd,OAAgB,OAARA,GACW,YAARA,IACP,gBAAiBA,GACjBA,EAAIqI,cAAgBzgB,OAE5B,SAASiI,IAA0B,IAAnByY,yDAAS,GAAIzH,yDAAM,GAC/BjZ,OAAO+F,KAAKkT,GAAK5N,SAASxK,qBACX6f,EAAO7f,GACd6f,EAAO7f,GAAOoY,EAAIpY,GACbc,EAASsX,EAAIpY,KAClBc,EAAS+e,EAAO7f,KAChBb,OAAO+F,KAAKkT,EAAIpY,IAAMsE,OAAS,GAC/B8C,EAAOyY,EAAO7f,GAAMoY,EAAIpY,OAKpC,IAAM8f,EAAc,CAChB9O,KAAM,GACN8H,8BACAiH,iCACAC,cAAe,CACXC,kBACAC,SAAU,IAEdC,cAAa,kBACF,MAEXC,iBAAgB,iBACL,IAEXC,eAAc,kBACH,MAEXC,YAAW,iBACA,CACHC,yBAGRhI,cAAa,iBACF,CACH7N,SAAU,GACV8V,WAAY,GACZC,MAAO,GACPC,0BACAjI,qBAAoB,iBACT,MAInBkI,gBAAe,iBACJ,IAEXC,WAAU,kBACC,MAEXzK,SAAU,CACNuB,KAAM,GACNmJ,KAAM,GACNC,SAAU,GACVpF,KAAM,GACNqF,OAAQ,GACRC,SAAU,GACVC,SAAU,GACVnK,OAAQ,KAGhB,SAASoK,IACL,IAAMC,EAA0B,oBAAb5V,SAA2BA,SAAW,GAEzD,OADAnE,EAAO+Z,EAAKrB,GACLqB,EAGX,IAAMC,EAAY,CACd7V,SAAUuU,EACVuB,UAAW,CACPC,UAAW,IAEfnL,SAAU,CACNuB,KAAM,GACNmJ,KAAM,GACNC,SAAU,GACVpF,KAAM,GACNqF,OAAQ,GACRC,SAAU,GACVC,SAAU,GACVnK,OAAQ,IAEZ6E,QAAS,CACLC,0BACA2F,uBACAC,gBACAC,mBAEJC,YAAa,WACT,OAAOhhB,MAEXoY,8BACAiH,iCACA4B,iBAAgB,iBACL,CACHC,iBAAgB,iBACL,MAInBC,mBACAnd,kBACAod,OAAQ,GACRlf,wBACAU,0BACAye,WAAU,iBACC,IAEXC,sBAAsB3J,kBACQ,oBAAfzV,YACPyV,IACO,MAEJzV,WAAWyV,EAAU,IAEhC4J,8BAAqBnc,GACS,oBAAflD,YAGXU,aAAawC,KAGrB,SAASoc,IACL,IAAMC,EAAwB,oBAAXthB,OAAyBA,OAAS,GAErD,OADAuG,EAAO+a,EAAKf,GACLe,ECpHX,IAAMC,e,qRAAAA,U,IAAAA,G,EAAAA,E,mJACJxC,WAAYyC,SAEG3hB,OAFH2hB,UAfd,SAAsB9K,GACpB,IAAM+K,EAAQ/K,EAAIgL,UAClBpjB,OAAOC,eAAemY,EAAK,YAAa,CACtCjY,IAAG,kBACMgjB,GAGTE,aAAI9iB,GACF4iB,EAAMC,UAAY7iB,KARxB,CAiBI+iB,EADAC,iCAAUL,GAAS,QACN3hB,WAHX0hB,CAGW1hB,EAHEiK,QAQnB,SAASgY,IAAgB,IAANjJ,yDAAM,GACjBkJ,EAAM,GAQZ,OAPAlJ,EAAIlP,SAAQ8R,YACN3R,MAAMC,QAAQ0R,GAChBsG,EAAIzO,WAAJyO,IAAYD,EAAUrG,KAEtBsG,EAAIzO,KAAKmI,MAGNsG,EAET,SAASC,EAAYnJ,EAAKrB,GACxB,OAAO1N,MAAMtK,UAAUyiB,OAAOlkB,KAAK8a,EAAKrB,GAgC1C,SAASxU,EAAEmY,EAAU+G,GACnB,IAAMliB,EAASqhB,IACT3W,EAAW2V,IACbxH,EAAM,GAEV,IAAKqJ,GAAW/G,aAAoBoG,EAClC,OAAOpG,EAGT,IAAKA,EACH,OAAO,IAAIoG,EAAK1I,GAGlB,GAAwB,iBAAbsC,EAAuB,CAChC,IAAM1W,EAAO0W,EAASgH,OAEtB,GAAI1d,EAAK8H,QAAQ,MAAQ,GAAK9H,EAAK8H,QAAQ,MAAQ,EAAG,CACpD,IAAI6V,EAAW,MACa,IAAxB3d,EAAK8H,QAAQ,SAAc6V,EAAW,MACd,IAAxB3d,EAAK8H,QAAQ,SAAc6V,EAAW,SACd,IAAxB3d,EAAK8H,QAAQ,QAAwC,IAAxB9H,EAAK8H,QAAQ,SAAc6V,EAAW,MACxC,IAA3B3d,EAAK8H,QAAQ,YAAiB6V,EAAW,SACb,IAA5B3d,EAAK8H,QAAQ,aAAkB6V,EAAW,UAC9C,IAAMC,EAAa3X,EAASgN,cAAc0K,GAC1CC,EAAWC,UAAY7d,EAEvB,IAAK,IAAI7G,EAAI,EAAGA,EAAIykB,EAAW1C,WAAWlc,OAAQ7F,GAAK,EACrDib,EAAIvF,KAAK+O,EAAW1C,WAAW/hB,SAGjCib,EA7CN,SAAasC,EAAU+G,GACrB,GAAwB,iBAAb/G,EACT,MAAO,CAACA,GAMV,IAHA,IAAMoH,EAAI,GACJR,EAAMG,EAAQ3C,iBAAiBpE,GAE5Bvd,EAAI,EAAGA,EAAImkB,EAAIte,OAAQ7F,GAAK,EACnC2kB,EAAEjP,KAAKyO,EAAInkB,IAGb,OAAO2kB,EAZT,CA6CgBpH,EAASgH,OAAQD,GAAWxX,QAGnC,GAAIyQ,EAASqH,UAAYrH,IAAanb,GAAUmb,IAAazQ,EAClEmO,EAAIvF,KAAK6H,QACJ,GAAIrR,MAAMC,QAAQoR,GAAW,CAClC,GAAIA,aAAoBoG,EAAM,OAAOpG,EACrCtC,EAAMsC,EAGR,OAAO,IAAIoG,EAtEb,SAAqB1I,GAGnB,IAFA,IAAM4J,EAAc,GAEX7kB,EAAI,EAAGA,EAAIib,EAAIpV,OAAQ7F,GAAK,GACE,IAAjC6kB,EAAYlW,QAAQsM,EAAIjb,KAAY6kB,EAAYnP,KAAKuF,EAAIjb,IAG/D,OAAO6kB,EAPT,CAsE8B5J,IAG9B7V,EAAE0f,GAAKnB,EAAK/hB,UCnFZ,ICtCImjB,ECCAC,ECDAC,EHsCEC,EAAU,CACd5Y,SDsFF,WAAqB6Y,wEACnB,IAAMC,EAAalB,EAAUiB,EAAQpT,KAAI1R,mBAAKA,EAAE6X,MAAM,SAItD,OAHAjW,KAAK8J,SAAQ8R,mBACXA,IAAGwH,WAAUC,cAAOF,OAEfnjB,MC1FP4J,YD6FF,WAAwBsZ,wEACtB,IAAMC,EAAalB,EAAUiB,EAAQpT,KAAI1R,mBAAKA,EAAE6X,MAAM,SAItD,OAHAjW,KAAK8J,SAAQ8R,mBACXA,IAAGwH,WAAU9c,iBAAU6c,OAElBnjB,MCjGP6I,SD6GF,WAAqBqa,wEACnB,IAAMC,EAAalB,EAAUiB,EAAQpT,KAAI1R,mBAAKA,EAAE6X,MAAM,SACtD,OAAOkM,EAAYniB,MAAM4b,mBAChBuH,EAAWf,QAAOkB,mBAAa1H,EAAGwH,UAAUG,SAASD,MAAY1f,OAAS,KAChFA,OAAS,GChHZiC,YDmGF,WAAwBqd,wEACtB,IAAMC,EAAalB,EAAUiB,EAAQpT,KAAI1R,mBAAKA,EAAE6X,MAAM,SACtDjW,KAAK8J,SAAQ8R,YACXuH,EAAWrZ,SAAQwZ,YACjB1H,EAAGwH,UAAUI,OAAOF,UCtGxB7W,KDkHF,SAAcH,EAAOtN,GACnB,GAAyB,IAArB2D,UAAUiB,QAAiC,iBAAV0I,EAEnC,OAAItM,KAAK,GAAWA,KAAK,GAAGyjB,aAAanX,UAK3C,IAAK,IAAIvO,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EACpC,GAAyB,IAArB4E,UAAUiB,OAEZ5D,KAAKjC,GAAGiiB,aAAa1T,EAAOtN,QAG5B,IAAK,IAAM0kB,KAAYpX,EACrBtM,KAAKjC,GAAG2lB,GAAYpX,EAAMoX,GAC1B1jB,KAAKjC,GAAGiiB,aAAa0D,EAAUpX,EAAMoX,IAK3C,OAAO1jB,MCtIPmN,WDyIF,SAAoBV,GAClB,IAAK,IAAI1O,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EACpCiC,KAAKjC,GAAG4lB,gBAAgBlX,GAG1B,OAAOzM,MC7IP4jB,UDkRF,SAAmBA,GACjB,IAAK,IAAI7lB,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EACpCiC,KAAKjC,GAAGgiB,MAAM6D,UAAYA,EAG5B,OAAO5jB,MCtRP6jB,WDyRF,SAAoBC,GAClB,IAAK,IAAI/lB,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EACpCiC,KAAKjC,GAAGgiB,MAAMgE,mBAAyC,iBAAbD,YAA2BA,QAAeA,EAGtF,OAAO9jB,MC7RP8K,GDgSF,WAAejJ,8EACRmiB,EAAgDniB,KAArCoiB,EAAqCpiB,KAArBqiB,EAAqBriB,KAAXsiB,EAAWtiB,KASrD,SAASuiB,EAAgBlkB,GACvB,IAAMif,EAASjf,EAAEif,OACjB,GAAKA,EAAL,CACA,IAAMkF,EAAYnkB,EAAEif,OAAOmF,eAAiB,GAM5C,GAJID,EAAU3X,QAAQxM,GAAK,GACzBmkB,EAAUE,QAAQrkB,GAGhBiD,EAAEgc,GAAQL,GAAGmF,GAAiBC,EAASliB,MAAMmd,EAAQkF,QAGvD,IAFA,IAAMlY,EAAUhJ,EAAEgc,GAAQhT,UAEjB2J,EAAI,EAAGA,EAAI3J,EAAQvI,OAAQkS,GAAK,EACnC3S,EAAEgJ,EAAQ2J,IAAIgJ,GAAGmF,IAAiBC,EAASliB,MAAMmK,EAAQ2J,GAAIuO,IAKvE,SAASG,EAAYtkB,GACnB,IAAMmkB,EAAYnkB,GAAKA,EAAEif,QAASjf,EAAEif,OAAOmF,eAAsB,GAE7DD,EAAU3X,QAAQxM,GAAK,GACzBmkB,EAAUE,QAAQrkB,GAGpBgkB,EAASliB,MAAMhC,KAAMqkB,GAhCA,mBAAZxiB,EAAK,KACbmiB,GAAgCniB,UAAhCmiB,GAAWE,OAAUC,OACtBF,UAGGE,IAASA,MAiCd,IAHA,IACIM,EADEC,EAASV,EAAU/N,MAAM,KAGtBlY,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EAAG,CACvC,IAAM6d,EAAK5b,KAAKjC,GAEhB,GAAKkmB,EAaH,IAAKQ,EAAI,EAAGA,EAAIC,EAAO9gB,OAAQ6gB,GAAK,EAAG,CACrC,IAAM7R,EAAQ8R,EAAOD,GAChB7I,EAAG+I,oBAAmB/I,EAAG+I,kBAAoB,IAC7C/I,EAAG+I,kBAAkB/R,KAAQgJ,EAAG+I,kBAAkB/R,GAAS,IAChEgJ,EAAG+I,kBAAkB/R,GAAOa,KAAK,CAC/ByQ,WACAU,cAAeR,IAEjBxI,EAAGxD,iBAAiBxF,EAAOwR,EAAiBD,QApB9C,IAAKM,EAAI,EAAGA,EAAIC,EAAO9gB,OAAQ6gB,GAAK,EAAG,CACrC,IAAM7R,EAAQ8R,EAAOD,GAChB7I,EAAGiJ,gBAAejJ,EAAGiJ,cAAgB,IACrCjJ,EAAGiJ,cAAcjS,KAAQgJ,EAAGiJ,cAAcjS,GAAS,IACxDgJ,EAAGiJ,cAAcjS,GAAOa,KAAK,CAC3ByQ,WACAU,cAAeJ,IAEjB5I,EAAGxD,iBAAiBxF,EAAO4R,EAAaL,IAiB9C,OAAOnkB,MCrWP8kB,IDwWF,WAAgBjjB,8EACTmiB,EAAgDniB,KAArCoiB,EAAqCpiB,KAArBqiB,EAAqBriB,KAAXsiB,EAAWtiB,KAE9B,mBAAZA,EAAK,KACbmiB,GAAgCniB,UAAhCmiB,GAAWE,OAAUC,OACtBF,UAGGE,IAASA,MAGd,IAFA,IAAMO,EAASV,EAAU/N,MAAM,KAEtBlY,EAAI,EAAGA,EAAI2mB,EAAO9gB,OAAQ7F,GAAK,EAGtC,IAFA,IAAM6U,EAAQ8R,EAAO3mB,GAEZ0mB,EAAI,EAAGA,EAAIzkB,KAAK4D,OAAQ6gB,GAAK,EAAG,CACvC,IAAM7I,EAAK5b,KAAKykB,GACZM,SAQJ,IANKd,GAAkBrI,EAAGiJ,cACxBE,EAAWnJ,EAAGiJ,cAAcjS,GACnBqR,GAAkBrI,EAAG+I,oBAC9BI,EAAWnJ,EAAG+I,kBAAkB/R,IAG9BmS,GAAYA,EAASnhB,OACvB,IAAK,IAAIkS,EAAIiP,EAASnhB,OAAS,EAAGkS,GAAK,EAAGA,GAAK,EAAG,CAChD,IAAMkP,EAAUD,EAASjP,GAErBoO,GAAYc,EAAQd,WAAaA,GAG1BA,GAAYc,EAAQd,UAAYc,EAAQd,SAASe,WAAaD,EAAQd,SAASe,YAAcf,GAFtGtI,EAAGyD,oBAAoBzM,EAAOoS,EAAQJ,cAAeT,GACrDY,EAASG,OAAOpP,EAAG,IAIToO,IACVtI,EAAGyD,oBAAoBzM,EAAOoS,EAAQJ,cAAeT,GACrDY,EAASG,OAAOpP,EAAG,KAO7B,OAAO9V,MClZP6D,QD2aF,WAAoBhC,wEAKlB,IAJA,IAAM1B,EAASqhB,IACTkD,EAAS7iB,EAAK,GAAGoU,MAAM,KACvBoO,EAAYxiB,EAAK,GAEd9D,EAAI,EAAGA,EAAI2mB,EAAO9gB,OAAQ7F,GAAK,EAGtC,IAFA,IAAM6U,EAAQ8R,EAAO3mB,GAEZ0mB,EAAI,EAAGA,EAAIzkB,KAAK4D,OAAQ6gB,GAAK,EAAG,CACvC,IAAM7I,EAAK5b,KAAKykB,GAEhB,GAAItkB,EAAO6gB,YAAa,CACtB,IAAMmE,EAAM,IAAIhlB,EAAO6gB,YAAYpO,EAAO,CACxCwS,OAAQf,EACRgB,SAASA,EACTC,YAAYA,IAEd1J,EAAG0I,cAAgBziB,EAAKugB,QAAO,SAAChf,EAAMmiB,UAAcA,EAAY,KAChE3J,EAAG4J,cAAcL,GACjBvJ,EAAG0I,cAAgB,UACZ1I,EAAG0I,eAKhB,OAAOtkB,MCncPylB,cDscF,SAAuB9N,GACrB,IAAM+N,EAAM1lB,KAYZ,OAJI2X,GACF+N,EAAI5a,GAAG,iBAPT,SAAS6a,EAAazlB,GAChBA,EAAEif,SAAWnf,OACjB2X,EAASzZ,KAAK8B,KAAME,GACpBwlB,EAAIZ,IAAI,gBAAiBa,OAOpB3lB,MCldP4lB,WDmfF,SAAoBC,GAClB,GAAI7lB,KAAK4D,OAAS,EAAG,CACnB,GAAIiiB,EAAgB,CAClB,IAAMC,EAAS9lB,KAAK8lB,SACpB,OAAO9lB,KAAK,GAAGic,YAAc8J,WAAWD,EAAO5E,iBAAiB,iBAAmB6E,WAAWD,EAAO5E,iBAAiB,gBAGxH,OAAOlhB,KAAK,GAAGic,YAGjB,OAAO,MC5fP+J,YD6gBF,SAAqBH,GACnB,GAAI7lB,KAAK4D,OAAS,EAAG,CACnB,GAAIiiB,EAAgB,CAClB,IAAMC,EAAS9lB,KAAK8lB,SACpB,OAAO9lB,KAAK,GAAGmc,aAAe4J,WAAWD,EAAO5E,iBAAiB,eAAiB6E,WAAWD,EAAO5E,iBAAiB,kBAGvH,OAAOlhB,KAAK,GAAGmc,aAGjB,OAAO,MCthBP2J,ODwkBF,WACE,IAAM3lB,EAASqhB,IACf,OAAIxhB,KAAK,GAAWG,EAAO8gB,iBAAiBjhB,KAAK,GAAI,MAC9C,IC1kBPkL,ODwhBF,WACE,GAAIlL,KAAK4D,OAAS,EAAG,CACnB,IAAMzD,EAASqhB,IACT3W,EAAW2V,IACX5E,EAAK5b,KAAK,GACVimB,EAAMrK,EAAGsK,wBACT5V,EAAOzF,EAASyF,KAChB6V,EAAYvK,EAAGuK,WAAa7V,EAAK6V,WAAa,EAC9CC,EAAaxK,EAAGwK,YAAc9V,EAAK8V,YAAc,EACjDhb,EAAYwQ,IAAOzb,EAASA,EAAOkmB,QAAUzK,EAAGxQ,UAChDwR,EAAahB,IAAOzb,EAASA,EAAOmmB,QAAU1K,EAAGgB,WACvD,MAAO,CACLvR,IAAK4a,EAAI5a,IAAMD,EAAY+a,EAC3BzN,KAAMuN,EAAIvN,KAAOkE,EAAawJ,GAIlC,OAAO,MCxiBPG,ID4kBF,SAAaC,EAAOxnB,GAClB,IACIjB,EADEoC,EAASqhB,IAGf,GAAyB,IAArB7e,UAAUiB,OAAc,CAC1B,GAAqB,iBAAV4iB,EAGJ,CAEL,IAAKzoB,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EAChC,IAAK,IAAMyM,KAAQgc,EACjBxmB,KAAKjC,GAAGgiB,MAAMvV,GAAQgc,EAAMhc,GAIhC,OAAOxK,KATP,GAAIA,KAAK,GAAI,OAAOG,EAAO8gB,iBAAiBjhB,KAAK,GAAI,MAAMkhB,iBAAiBsF,GAahF,GAAyB,IAArB7jB,UAAUiB,QAAiC,iBAAV4iB,EAAoB,CAEvD,IAAKzoB,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EAChCiC,KAAKjC,GAAGgiB,MAAMyG,GAASxnB,EAGzB,OAAOgB,KAGT,OAAOA,MCxmBPwT,KD2mBF,SAAcmE,GACZ,OAAKA,GACL3X,KAAK8J,SAAQ,SAAC8R,EAAI3T,GAChB0P,EAAS3V,MAAM4Z,EAAI,CAACA,EAAI3T,OAEnBjI,MAJeA,MC3mBtB4E,KDunBF,SAAcA,GACZ,QAAI,IAAOA,EACT,OAAO5E,KAAK,GAAKA,KAAK,GAAGyiB,UAAY,KAGvC,IAAK,IAAI1kB,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EACpCiC,KAAKjC,GAAG0kB,UAAY7d,EAGtB,OAAO5E,MC/nBP4F,KDkoBF,SAAcA,GACZ,QAAI,IAAOA,EACT,OAAO5F,KAAK,GAAKA,KAAK,GAAGymB,YAAYnE,OAAS,KAGhD,IAAK,IAAIvkB,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EACpCiC,KAAKjC,GAAG0oB,YAAc7gB,EAGxB,OAAO5F,MC1oBP8e,GD6oBF,SAAYxD,GACV,IAGIoL,EACA3oB,EAJEoC,EAASqhB,IACT3W,EAAW2V,IACX5E,EAAK5b,KAAK,GAGhB,IAAK4b,YAAaN,EAA0B,OAAO,EAEnD,GAAwB,iBAAbA,EAAuB,CAChC,GAAIM,EAAG+K,QAAS,OAAO/K,EAAG+K,QAAQrL,GAClC,GAAIM,EAAGgL,sBAAuB,OAAOhL,EAAGgL,sBAAsBtL,GAC9D,GAAIM,EAAGiL,kBAAmB,OAAOjL,EAAGiL,kBAAkBvL,GAGtD,IAFAoL,EAAcvjB,EAAEmY,GAEXvd,EAAI,EAAGA,EAAI2oB,EAAY9iB,OAAQ7F,GAAK,EACvC,GAAI2oB,EAAY3oB,KAAO6d,EAAI,OAAO,EAGpC,OAAO,EAGT,GAAIN,IAAazQ,EACf,OAAO+Q,IAAO/Q,EAGhB,GAAIyQ,IAAanb,EACf,OAAOyb,IAAOzb,EAGhB,GAAImb,EAASqH,UAAYrH,aAAoBoG,EAAM,CAGjD,IAFAgF,EAAcpL,EAASqH,SAAW,CAACrH,GAAYA,EAE1Cvd,EAAI,EAAGA,EAAI2oB,EAAY9iB,OAAQ7F,GAAK,EACvC,GAAI2oB,EAAY3oB,KAAO6d,EAAI,OAAO,EAGpC,OAAO,EAGT,OAAO,GCnrBP3T,MDsrBF,WACE,IACIlK,EADA+oB,EAAQ9mB,KAAK,GAGjB,GAAI8mB,EAAO,CAGT,IAFA/oB,EAAI,EAEuC,QAAnC+oB,EAAQA,EAAMC,kBACG,IAAnBD,EAAMnE,WAAgB5kB,GAAK,GAGjC,OAAOA,IChsBTipB,GDssBF,SAAY/e,GACV,QAAI,IAAOA,EAAuB,OAAOjI,KACzC,IAAM4D,EAAS5D,KAAK4D,OAEpB,GAAIqE,EAAQrE,EAAS,EACnB,OAAOT,EAAE,IAGX,GAAI8E,EAAQ,EAAG,CACb,IAAMgf,EAAcrjB,EAASqE,EAC7B,OAA4B9E,EAAxB8jB,EAAc,EAAY,GACrB,CAACjnB,KAAKinB,KAGjB,OAAO9jB,EAAE,CAACnD,KAAKiI,MCntBf8F,ODstBF,WAIE,IAHA,IAAImZ,EACErc,EAAW2V,IAER1K,EAAI,EAAGA,EAAIqR,UAAIvjB,OAAQkS,GAAK,EAAG,CACtCoR,EAAepR,6CAEf,IAAK,IAAI/X,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EACpC,GAAwB,iBAAbmpB,EAAuB,CAChC,IAAME,EAAUvc,EAASgN,cAAc,OAGvC,IAFAuP,EAAQ3E,UAAYyE,EAEbE,EAAQC,YACbrnB,KAAKjC,GAAGia,YAAYoP,EAAQC,iBAEzB,GAAIH,aAAoBxF,EAC7B,IAAK,IAAI+C,EAAI,EAAGA,EAAIyC,EAAStjB,OAAQ6gB,GAAK,EACxCzkB,KAAKjC,GAAGia,YAAYkP,EAASzC,SAG/BzkB,KAAKjC,GAAGia,YAAYkP,GAK1B,OAAOlnB,MC9uBPsnB,QDsvBF,SAAiBJ,GACf,IACInpB,EACA0mB,EAFE5Z,EAAW2V,IAIjB,IAAKziB,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EAChC,GAAwB,iBAAbmpB,EAAuB,CAChC,IAAME,EAAUvc,EAASgN,cAAc,OAGvC,IAFAuP,EAAQ3E,UAAYyE,EAEfzC,EAAI2C,EAAQtH,WAAWlc,OAAS,EAAG6gB,GAAK,EAAGA,GAAK,EACnDzkB,KAAKjC,GAAGwpB,aAAaH,EAAQtH,WAAW2E,GAAIzkB,KAAKjC,GAAG+hB,WAAW,SAE5D,GAAIoH,aAAoBxF,EAC7B,IAAK+C,EAAI,EAAGA,EAAIyC,EAAStjB,OAAQ6gB,GAAK,EACpCzkB,KAAKjC,GAAGwpB,aAAaL,EAASzC,GAAIzkB,KAAKjC,GAAG+hB,WAAW,SAGvD9f,KAAKjC,GAAGwpB,aAAaL,EAAUlnB,KAAKjC,GAAG+hB,WAAW,IAItD,OAAO9f,MC3wBPwnB,KD+yBF,SAAclM,GACZ,OAAItb,KAAK4D,OAAS,EACZ0X,EACEtb,KAAK,GAAGynB,oBAAsBtkB,EAAEnD,KAAK,GAAGynB,oBAAoB3I,GAAGxD,GAC1DnY,EAAE,CAACnD,KAAK,GAAGynB,qBAGbtkB,EAAE,IAGPnD,KAAK,GAAGynB,mBAA2BtkB,EAAE,CAACnD,KAAK,GAAGynB,qBAC3CtkB,EAAE,IAGJA,EAAE,KC5zBTukB,QD+zBF,SAAiBpM,GACf,IAAMqM,EAAU,GACZ/L,EAAK5b,KAAK,GACd,IAAK4b,EAAI,OAAOzY,EAAE,IAElB,KAAOyY,EAAG6L,oBAAoB,CAC5B,IAAMD,EAAO5L,EAAG6L,mBAEZnM,EACEnY,EAAEqkB,GAAM1I,GAAGxD,IAAWqM,EAAQlU,KAAK+T,GAClCG,EAAQlU,KAAK+T,GAEpB5L,EAAK4L,EAGP,OAAOrkB,EAAEwkB,IC70BTC,KDg1BF,SAActM,GACZ,GAAItb,KAAK4D,OAAS,EAAG,CACnB,IAAMgY,EAAK5b,KAAK,GAEhB,OAAIsb,EACEM,EAAGiM,wBAA0B1kB,EAAEyY,EAAGiM,wBAAwB/I,GAAGxD,GACxDnY,EAAE,CAACyY,EAAGiM,yBAGR1kB,EAAE,IAGPyY,EAAGiM,uBAA+B1kB,EAAE,CAACyY,EAAGiM,yBACrC1kB,EAAE,IAGX,OAAOA,EAAE,KC/1BT2kB,QDk2BF,SAAiBxM,GACf,IAAMyM,EAAU,GACZnM,EAAK5b,KAAK,GACd,IAAK4b,EAAI,OAAOzY,EAAE,IAElB,KAAOyY,EAAGiM,wBAAwB,CAChC,IAAMD,EAAOhM,EAAGiM,uBAEZvM,EACEnY,EAAEykB,GAAM9I,GAAGxD,IAAWyM,EAAQtU,KAAKmU,GAClCG,EAAQtU,KAAKmU,GAEpBhM,EAAKgM,EAGP,OAAOzkB,EAAE4kB,ICh3BTnf,ODu3BF,SAAgB0S,GAGd,IAFA,IAAMnP,EAAU,GAEPpO,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EACT,OAAvBiC,KAAKjC,GAAGiqB,aACN1M,EACEnY,EAAEnD,KAAKjC,GAAGiqB,YAAYlJ,GAAGxD,IAAWnP,EAAQsH,KAAKzT,KAAKjC,GAAGiqB,YAE7D7b,EAAQsH,KAAKzT,KAAKjC,GAAGiqB,aAK3B,OAAO7kB,EAAEgJ,ICn4BTA,QDs4BF,SAAiBmP,GAGf,IAFA,IAAMnP,EAAU,GAEPpO,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EAGpC,IAFA,IAAI6K,EAAS5I,KAAKjC,GAAGiqB,WAEdpf,GACD0S,EACEnY,EAAEyF,GAAQkW,GAAGxD,IAAWnP,EAAQsH,KAAK7K,GAEzCuD,EAAQsH,KAAK7K,GAGfA,EAASA,EAAOof,WAIpB,OAAO7kB,EAAEgJ,ICt5BT1B,QDy5BF,SAAiB6Q,GACf,IAAI7Q,EAAUzK,KAEd,gBAAWsb,EACFnY,EAAE,KAGNsH,EAAQqU,GAAGxD,KACd7Q,EAAUA,EAAQ0B,QAAQmP,GAAU0L,GAAG,IAGlCvc,ICn6BPrE,KDs6BF,SAAckV,GAGZ,IAFA,IAAM2M,EAAgB,GAEblqB,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EAGpC,IAFA,IAAMmqB,EAAQloB,KAAKjC,GAAG2hB,iBAAiBpE,GAE9BmJ,EAAI,EAAGA,EAAIyD,EAAMtkB,OAAQ6gB,GAAK,EACrCwD,EAAcxU,KAAKyU,EAAMzD,IAI7B,OAAOthB,EAAE8kB,ICh7BTje,SDm7BF,SAAkBsR,GAGhB,IAFA,IAAMtR,EAAW,GAERjM,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EAGpC,IAFA,IAAM+hB,EAAa9f,KAAKjC,GAAGiM,SAElBya,EAAI,EAAGA,EAAI3E,EAAWlc,OAAQ6gB,GAAK,EACrCnJ,IAAYnY,EAAE2c,EAAW2E,IAAI3F,GAAGxD,IACnCtR,EAASyJ,KAAKqM,EAAW2E,IAK/B,OAAOthB,EAAE6G,IC/7BToY,ODkmBF,SAAgBzK,GAEd,OAAOxU,EADQgf,EAAYniB,KAAM2X,KClmBjCrR,ODi8BF,WACE,IAAK,IAAIvI,EAAI,EAAGA,EAAIiC,KAAK4D,OAAQ7F,GAAK,EAChCiC,KAAKjC,GAAGiqB,YAAYhoB,KAAKjC,GAAGiqB,WAAWG,YAAYnoB,KAAKjC,IAG9D,OAAOiC,OKjgCT,SAASooB,EAASzQ,GAAkB,IAAR0Q,yDAAQ,EAClC,OAAOnmB,WAAWyV,EAAU0Q,GAE9B,SAAS/nB,IACP,OAAO0D,KAAK1D,MAiBd,SAASgoB,EAAa1M,GAAW,IAE3B2M,EACAC,EACAC,EAJoBC,yDAAO,IACzBvoB,EAASqhB,IAKTmH,EArBR,SAA0B/M,GACxB,IACImE,EADE5f,EAASqhB,IAYf,OAVIrhB,EAAO8gB,mBACTlB,EAAQ5f,EAAO8gB,iBAAiBrF,EAAI,QAEjCmE,GAASnE,EAAGgN,eACf7I,EAAQnE,EAAGgN,cAER7I,IACHA,EAAQnE,EAAGmE,OAGNA,EAbT,CAqBoCnE,GAwClC,OAtCIzb,EAAO0oB,kBACTL,EAAeG,EAAS/E,WAAa+E,EAASG,iBAC7B7S,MAAM,KAAKrS,OAAS,IACnC4kB,EAAeA,EACZvS,MAAM,MACNnG,KAAK4S,mBAAMA,EAAE3a,QAAQ,IAAK,QAC1BoC,KAAK,OAIVse,EAAkB,IAAItoB,EAAO0oB,gBAAiC,SAAjBL,EAA0B,GAAKA,IAS5ED,GAPAE,EACEE,EAASI,cACTJ,EAASK,YACTL,EAASM,aACTN,EAASO,aACTP,EAAS/E,WACT+E,EAASzH,iBAAiB,aAAanZ,QAAQ,aAAc,uBACtCM,WAAW4N,MAAM,KAG/B,MAATyS,IAE0BF,EAAxBroB,EAAO0oB,gBAAgCJ,EAAgBU,IAEhC,KAAlBZ,EAAO3kB,OAA8BmiB,WAAWwC,EAAO,KAE5CxC,WAAWwC,EAAO,KAE3B,MAATG,IAE0BF,EAAxBroB,EAAO0oB,gBAAgCJ,EAAgBW,IAEhC,KAAlBb,EAAO3kB,OAA8BmiB,WAAWwC,EAAO,KAE5CxC,WAAWwC,EAAO,KAEjCC,GAAgB,EAEzB,SAASpoB,EAAS5B,GAChB,MACe,YAANA,IACD,OAANA,GACAA,EAAE0gB,aACiD,WAAnDzgB,OAAOkB,UAAU0I,SAASnK,KAAKM,GAAGmJ,MAAM,GAAI,GAUhD,SAASjB,IAGP,IAFA,IARc2iB,EAQRC,EAAK7qB,OAAOA,UAAPA,+BACL8qB,EAAW,CAAC,YAAa,cAAe,aACrCxrB,EAAI,EAAGA,EAAI8D,UAAK+B,OAAQ7F,GAAK,EAAG,CACvC,IAAMyrB,EAAkBzrB,6CACxB,GAAIyrB,UAZQH,EAYmDG,IAV3C,oBAAXrpB,iBAAiCA,OAAOspB,YAC1CJ,aAAgBI,YAElBJ,IAA2B,IAAlBA,EAAK1G,UAAoC,KAAlB0G,EAAK1G,YASxC,IADA,IAAM+G,EAAYjrB,OAAO+F,KAAK/F,OAAO+qB,IAAapH,QAAQ9iB,mBAAQiqB,EAAS7c,QAAQpN,GAAO,KACjFqqB,EAAY,EAAGC,EAAMF,EAAU9lB,OAAQ+lB,EAAYC,EAAKD,GAAa,EAAG,CAC/E,IAAME,EAAUH,EAAUC,GACpBG,EAAOrrB,OAAOsrB,yBAAyBP,EAAYK,YACrDC,GAAsBA,EAAKnrB,aACzByB,EAASkpB,EAAGO,KAAazpB,EAASopB,EAAWK,IAC3CL,EAAWK,GAASG,WACtBV,EAAGO,GAAWL,EAAWK,GAEzBnjB,EAAO4iB,EAAGO,GAAUL,EAAWK,KAEvBzpB,EAASkpB,EAAGO,KAAazpB,EAASopB,EAAWK,KACvDP,EAAGO,GAAW,GACVL,EAAWK,GAASG,WACtBV,EAAGO,GAAWL,EAAWK,GAEzBnjB,EAAO4iB,EAAGO,GAAUL,EAAWK,KAGjCP,EAAGO,GAAWL,EAAWK,KAMnC,OAAOP,EAGT,SAASW,EAAerO,EAAIsO,EAASC,GACnCvO,EAAGmE,MAAMqK,YAAYF,EAASC,GAGhC,SAASE,KAA+CC,IAIlD1oB,EAJ0B2oB,IAAFA,OAAUC,IAAVA,eAA0BF,IAA1BA,KACtBnqB,EAASqhB,IACTiJ,GAAiBF,EAAOG,UAC1B/lB,EAAY,KAEVmf,EAAWyG,EAAOI,OAAOC,MAE/BL,EAAOM,UAAU9K,MAAM+K,eAAiB,OACxC3qB,EAAOohB,qBAAqBgJ,EAAOQ,gBAEnC,IAAMC,EAAMR,EAAiBC,EAAgB,OAAS,OAEhDQ,EAAe,SAACC,EAAS/L,SACb,SAAR6L,GAAkBE,GAAW/L,GAAoB,SAAR6L,GAAkBE,GAAW/L,IAGhE,SAAVhU,IACJvJ,GAAO,IAAIoC,MAAOC,UACA,OAAdU,IACFA,EAAY/C,GAGd,IAAMupB,EAAW1qB,KAAKC,IAAID,KAAKG,KAAKgB,EAAO+C,GAAamf,EAAU,GAAI,GAChEsH,EAAe,GAAM3qB,KAAK4qB,IAAIF,EAAW1qB,KAAK6qB,IAAM,EACtDC,EAAkBd,EAAgBW,GAAgBZ,EAAiBC,GAQvE,GANIQ,EAAaM,EAAiBf,KAChCe,EAAkBf,GAEpBD,EAAOM,UAAUW,SAASA,EAATA,GACdlB,EAAOiB,IAENN,EAAaM,EAAiBf,GAUhC,OATAD,EAAOM,UAAU9K,MAAM0L,SAAW,SAClClB,EAAOM,UAAU9K,MAAM+K,eAAiB,GACxC5oB,YAAW,WACTqoB,EAAOM,UAAU9K,MAAM0L,SAAW,GAClClB,EAAOM,UAAUW,SAASA,EAATA,GACdlB,EAAOiB,YAGZprB,EAAOohB,qBAAqBgJ,EAAOQ,gBAGrCR,EAAOQ,eAAiB5qB,EAAOmhB,sBAAsBnW,GAEvDA,GHnJF,SAASugB,IAIP,OAHK5I,IACHA,EApCJ,WACE,IAAM3iB,EAASqhB,IACT3W,EAAW2V,IAEjB,MAAO,CACLmL,aAAc9gB,EAAS6R,iBAAmB,mBAAoB7R,EAAS6R,gBAAgBqD,MAEvF6L,SACE,iBAAkBzrB,GACjBA,EAAO0rB,eAAiBhhB,aAAoB1K,EAAO0rB,eAGtDC,gBAAkB,WAChB,IAAIC,KACJ,IACE,IAAMC,EAAOvtB,OAAOC,eAAe,GAAI,UAAW,CAEhDE,eACEmtB,QAGJ5rB,EAAOiY,iBAAiB,sBAAuB,KAAM4T,GACrD,MAAO9rB,IAGT,OAAO6rB,EAbS,GAgBlBE,SACS,mBAAoB9rB,GA7BjC,IAsCS2iB,ECwBT,SAASoJ,IAAsB,IAAZC,yDAAY,GAI7B,OAHKpJ,IACHA,EA/DJ,WAAoC,gEAAdnC,IAAFA,UACZkC,EAAU4I,IACVvrB,EAASqhB,IACT4K,EAAWjsB,EAAOwgB,UAAUyL,SAC5BC,EAAKzL,GAAazgB,EAAOwgB,UAAUC,UAEnC0L,EAAS,CACbC,KAAKA,EACLC,SAASA,GAGLC,EAActsB,EAAOihB,OAAOpF,MAC5B0Q,EAAevsB,EAAOihB,OAAOlF,OAE7BsQ,EAAUH,EAAGM,MAAM,+BACrBC,EAAOP,EAAGM,MAAM,wBACdE,EAAOR,EAAGM,MAAM,2BAChBG,GAAUF,GAAQP,EAAGM,MAAM,8BAC3BI,EAAuB,UAAbX,EACZY,EAAqB,aAAbZ,EAuCZ,OArBGQ,GACDI,GACAlK,EAAQ8I,OAjBU,CAClB,YACA,YACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,YAMYlf,QAAQA,GAARA,OAAW+f,cAAeC,KAAmB,KAEzDE,EAAOP,EAAGM,MAAM,0BACLC,EAAO,CAAC,EAAG,EAAG,WACzBI,MAIER,IAAYO,IACdT,EAAOW,GAAK,UACZX,EAAOE,SAAUA,IAEfI,GAAQE,GAAUD,KACpBP,EAAOW,GAAK,MACZX,EAAOC,KAAMA,GAIRD,EA1DT,CA+D8BH,IAErBpJ,ECtDT,SAASmK,IAIP,OAHKlK,IACHA,EAdJ,WACE,IAAM7iB,EAASqhB,IAKf,MAAO,CACL2L,SALF,WACE,IAAMd,EAAKlsB,EAAOwgB,UAAUC,UAAUrD,cACtC,OAAO8O,EAAG3f,QAAQ,WAAa,GAAK2f,EAAG3f,QAAQ,UAAY,GAAK2f,EAAG3f,QAAQ,WAAa,EAF1F,GAME0gB,UAAW,+CAA+C1lB,KAAKvH,EAAOwgB,UAAUC,YARpF,IAgBSoC,EEpBM,SAASqK,KAAkDC,IAAjC/C,IAAFA,OAAUgD,IAAVA,aAAwBC,IAAxBA,UAAmCF,IAAnCA,KAC7BG,EAA+BlD,EAAjCkD,YAAeC,EAAkBnD,EAAjCmD,cACF1C,EAAMwC,EASV,GARKxC,IAC8BA,EAA7ByC,EAAcC,EAAqB,OAC9BD,EAAcC,EAAqB,OACjC,SAGbnD,EAAOoD,KAAKA,aAALA,OAAkBL,IAErBC,GAAgBE,IAAgBC,EAAe,CACjD,GAAY,UAAR1C,EAEF,YADAT,EAAOoD,KAAKA,uBAALA,OAA4BL,IAGrC/C,EAAOoD,KAAKA,wBAALA,OAA6BL,IACxB,SAARtC,EACFT,EAAOoD,KAAKA,sBAALA,OAA2BL,IAElC/C,EAAOoD,KAAKA,sBAALA,OAA2BL,KCLzB,SAASM,EAAahb,GAC7B2X,MAASvqB,KACT6K,EAAW2V,IACXrgB,EAASqhB,IAETpe,EAAOmnB,EAAOsD,gBACZlD,EAA6BJ,EAA/BI,OAAUmD,EAAqBvD,EAA/BuD,QACN,GADqCvD,EAA/BwD,WAGFxD,EAAOyD,YAAarD,EAAOsD,gCAA/B,EAGK1D,EAAOyD,WAAarD,EAAOuD,SAAWvD,EAAOwD,MAChD5D,EAAO6D,UAET,IAAIluB,EAAI0S,EACJ1S,EAAEmuB,gBAAenuB,EAAIA,EAAEmuB,eAC3B,IAAIC,EAAYnrB,EAAEjD,EAAEif,QAEpB,IAAiC,YAA7BwL,EAAO4D,mBACJD,EAAU7jB,QAAQ8f,EAAOM,WAAWjnB,UAE3CR,EAAKorB,aAA0B,eAAXtuB,EAAE4X,MACjB1U,EAAKorB,gBAAgB,UAAWtuB,IAAiB,IAAZA,EAAEuuB,WACvCrrB,EAAKorB,cAAgB,WAAYtuB,GAAKA,EAAEwuB,OAAS,GAClDtrB,EAAKurB,WAAavrB,EAAKwrB,UAA3B,CAG+BjE,EAAOkE,gBAA4C,KAA1BlE,EAAOkE,gBACnC3uB,EAAEif,QAAUjf,EAAEif,OAAO2P,YAAclc,EAAMmE,MAAQnE,EAAMmE,KAAK,KACtFuX,EAAYnrB,EAAEyP,EAAMmE,KAAK,KAG3B,IAAMgY,EAAoBpE,EAAOoE,kBAC7BpE,EAAOoE,6BACHpE,EAAOkE,gBACTG,KAAoB9uB,EAAEif,SAAUjf,EAAEif,OAAO2P,YAG/C,GACEnE,EAAOsE,YACND,EAnDL,SAAwB1T,GAAiBtb,IAAPkvB,yDAAOlvB,KAOvC,OANA,SAASmvB,EAAcvT,GACrB,OAAKA,GAAMA,IAAO4E,KAAiB5E,IAAO4F,KACtC5F,EAAGwT,eAAcxT,EAAKA,EAAGwT,cACfxT,EAAGnR,QAAQ6Q,IACT6T,EAAcvT,EAAGyT,cAAclP,OAHe,KADhE,CAMqB+O,GAPvB,CAoDuBH,EAAmB7uB,EAAEif,QACpCmP,EAAU7jB,QAAQskB,GAAmB,IAEzCxE,EAAO+E,YAAaA,OAItB,IAAI3E,EAAO4E,cACJjB,EAAU7jB,QAAQkgB,EAAO4E,cAAc,GAD9C,CAIAzB,EAAQ0B,SAAsB,eAAXtvB,EAAE4X,KAAwB5X,EAAEuvB,cAAc,GAAGC,MAAQxvB,EAAEwvB,MAC1E5B,EAAQ6B,SAAsB,eAAXzvB,EAAE4X,KAAwB5X,EAAEuvB,cAAc,GAAGG,MAAQ1vB,EAAE0vB,MAC1E,IAAMC,EAAS/B,EAAQ0B,SACjBM,EAAShC,EAAQ6B,SAIjBI,EAAqBpF,EAAOoF,oBAAsBpF,EAAOqF,sBACzDC,EAAqBtF,EAAOsF,oBAAsBtF,EAAOuF,sBAC/D,GACEH,IACCF,GAAUI,GAAsBJ,GAAU1vB,EAAOqc,WAAayT,GAC/D,CACA,GAA2B,YAAvBF,EAGF,OAFAnd,EAAM5H,iBAqBV,GAfAvM,OAAO0xB,OAAO/sB,EAAM,CAClBurB,WAAWA,EACXC,SAASA,EACTwB,qBAAqBA,EACrBC,iBAAaA,EACbC,iBAAaA,IAGfxC,EAAQ+B,OAASA,EACjB/B,EAAQgC,OAASA,EACjB1sB,EAAKmtB,eAAiBjwB,IACtBiqB,EAAO+E,YAAaA,EACpB/E,EAAOiG,aACPjG,EAAOkG,oBAAiBA,EACpB9F,EAAO+F,UAAY,IAAGttB,EAAKutB,oBAAqBA,GACrC,eAAXzwB,EAAE4X,KAAuB,CAC3B,IAAI9M,KACAsjB,EAAUxP,GAAG1b,EAAKwtB,qBAAoB5lB,MAExCH,EAASyU,eACTnc,EAAE0H,EAASyU,eAAeR,GAAG1b,EAAKwtB,oBAClC/lB,EAASyU,gBAAkBgP,EAAU,IAErCzjB,EAASyU,cAAcC,OAGzB,IAAMsR,EACJ7lB,GAAkBuf,EAAOuG,gBAAkBnG,EAAOoG,0BAEjDpG,EAAOqG,gCAAiCH,GACxCvC,EAAU,GAAG2C,mBAEd/wB,EAAE8K,iBAGNuf,EAAOoD,KAAK,aAAcztB,MCvHb,SAASgxB,EAAYte,GAC5B/H,MAAW2V,IACX+J,EAASvqB,KACToD,EAAOmnB,EAAOsD,gBACZlD,EAAgDJ,EAAlDI,OAAUmD,EAAwCvD,EAAlDuD,QAAiCqD,EAAiB5G,EAA/B6G,aACzB,GADwD7G,EAAlDwD,QACN,CACA,IAAI7tB,EAAI0S,EAER,GADI1S,EAAEmuB,gBAAenuB,EAAIA,EAAEmuB,eACtBjrB,EAAKurB,WAMV,IAAIvrB,EAAKorB,cAA2B,cAAXtuB,EAAE4X,KAA3B,CACA,IAAMuZ,EACO,cAAXnxB,EAAE4X,MAAwB5X,EAAEuvB,gBAAkBvvB,EAAEuvB,cAAc,IAAMvvB,EAAEoxB,eAAe,IACjF5B,EAAmB,cAAXxvB,EAAE4X,KAAuBuZ,EAAY3B,MAAQxvB,EAAEwvB,MACvDE,EAAmB,cAAX1vB,EAAE4X,KAAuBuZ,EAAYzB,MAAQ1vB,EAAE0vB,MAC7D,GAAI1vB,EAAEqxB,wBAGJ,OAFAzD,EAAQ+B,OAASH,OACjB5B,EAAQgC,OAASF,GAGnB,IAAKrF,EAAOuG,eAYV,OAVAvG,EAAO+E,YAAaA,OAChBlsB,EAAKurB,YACPlwB,OAAO0xB,OAAOrC,EAAS,CACrB+B,OAAQH,EACRI,OAAQF,EACRJ,SAAUE,EACVC,SAAUC,IAEZxsB,EAAKmtB,eAAiBjwB,MAI1B,GAAI8C,EAAKorB,cAAgB7D,EAAO6G,sBAAwB7G,EAAOwD,KAC7D,GAAI5D,EAAOkH,cAET,GACG7B,EAAQ9B,EAAQgC,QAAUvF,EAAOG,WAAaH,EAAOmH,gBACrD9B,EAAQ9B,EAAQgC,QAAUvF,EAAOG,WAAaH,EAAOoH,eAItD,OAFAvuB,EAAKurB,WAAYA,OACjBvrB,EAAKwrB,SAAUA,QAGZ,GACJc,EAAQ5B,EAAQ+B,QAAUtF,EAAOG,WAAaH,EAAOmH,gBACrDhC,EAAQ5B,EAAQ+B,QAAUtF,EAAOG,WAAaH,EAAOoH,eAEtD,OAGJ,GAAIvuB,EAAKorB,cAAgB3jB,EAASyU,eAC5Bpf,EAAEif,SAAWtU,EAASyU,eAAiBnc,EAAEjD,EAAEif,QAAQL,GAAG1b,EAAKwtB,mBAG7D,OAFAxtB,EAAKwrB,SAAUA,OACfrE,EAAO+E,YAAaA,GAOxB,GAHIlsB,EAAKgtB,qBACP7F,EAAOoD,KAAK,YAAaztB,KAEvBA,EAAEuvB,eAAiBvvB,EAAEuvB,cAAc7rB,OAAS,GAAhD,CAEAkqB,EAAQ0B,SAAWE,EACnB5B,EAAQ6B,SAAWC,EAEnB,IAAMgC,EAAQ9D,EAAQ0B,SAAW1B,EAAQ+B,OACnCgC,EAAQ/D,EAAQ6B,SAAW7B,EAAQgC,OACzC,KAAIvF,EAAOI,OAAO+F,WAAajwB,KAAKqxB,KAAKF,WAAS,YAAIC,EAAS,IAAKtH,EAAOI,OAAO+F,WAAlF,CAIE,IAAIqB,EADN,QAAI,IAAO3uB,EAAKitB,YAGX9F,EAAOyH,gBAAkBlE,EAAQ6B,WAAa7B,EAAQgC,QACtDvF,EAAOkH,cAAgB3D,EAAQ0B,WAAa1B,EAAQ+B,OAErDzsB,EAAKitB,aAAcA,EAGfuB,EAAQA,EAAQC,EAAQA,GAAS,KACnCE,EAA6D,IAA/CtxB,KAAKwxB,MAAMxxB,KAAKyxB,IAAIL,GAAQpxB,KAAKyxB,IAAIN,IAAiBnxB,KAAK6qB,GACzEloB,EAAKitB,YAAc9F,EAAOyH,eACtBD,EAAapH,EAAOoH,WACpB,GAAKA,EAAapH,EAAOoH,YAYnC,GARI3uB,EAAKitB,aACP9F,EAAOoD,KAAK,oBAAqBztB,YAExBkD,EAAKktB,cACVxC,EAAQ0B,WAAa1B,EAAQ+B,QAAU/B,EAAQ6B,WAAa7B,EAAQgC,SACtE1sB,EAAKktB,aAAcA,IAGnBltB,EAAKitB,YACPjtB,EAAKurB,WAAYA,OAGnB,GAAKvrB,EAAKktB,YAAV,CAGA/F,EAAO+E,YAAaA,GACf3E,EAAOuD,SAAWhuB,EAAEolB,YACvBplB,EAAE8K,iBAEA2f,EAAOwH,2BAA6BxH,EAAOyH,QAC7ClyB,EAAEmyB,kBAGCjvB,EAAKwrB,UACJjE,EAAOwD,OAASxD,EAAOuD,SACzB3D,EAAO6D,UAEThrB,EAAKkvB,eAAiB/H,EAAOjC,eAC7BiC,EAAOgI,cAAc,GACjBhI,EAAOyD,WACTzD,EAAOiI,WAAW3uB,QAAQ,qCAE5BT,EAAKqvB,qBAAsBA,GAEvB9H,EAAO+H,iBAAenI,EAAOoI,qBAA2BpI,EAAOqI,gBACjErI,EAAOsI,eAAcA,GAEvBtI,EAAOoD,KAAK,kBAAmBztB,IAEjCqqB,EAAOoD,KAAK,aAAcztB,GAC1BkD,EAAKwrB,SAAUA,EAEf,IAAIkE,EAAOvI,EAAOyH,eAAiBJ,EAAQC,EAC3C/D,EAAQgF,KAAOA,EAEfA,GAAQnI,EAAOoI,WACX5B,IAAK2B,GAAQA,GAEjBvI,EAAOkG,eAAiBqC,EAAO,EAAI,OAAS,OAC5C1vB,EAAK4vB,iBAAmBF,EAAO1vB,EAAKkvB,eAEpC,IAAIW,KACAC,EAAkBvI,EAAOuI,gBA4C7B,GA3CIvI,EAAO6G,sBACT0B,EAAkB,GAEhBJ,EAAO,GAAK1vB,EAAK4vB,iBAAmBzI,EAAOoH,gBAC7CsB,KACItI,EAAOwI,aACT/vB,EAAK4vB,iBACHzI,EAAOoH,eACP,YACEpH,EAAOoH,eAAiBvuB,EAAKkvB,eAAiBQ,EAASI,KACpDJ,EAAO,GAAK1vB,EAAK4vB,iBAAmBzI,EAAOmH,iBACpDuB,KACItI,EAAOwI,aACT/vB,EAAK4vB,iBACHzI,EAAOmH,eACP,WACCnH,EAAOmH,eAAiBtuB,EAAKkvB,eAAiBQ,EAASI,KAG1DD,IACF/yB,EAAEqxB,yBAA0BA,IAK3BhH,EAAOoI,gBACkB,SAA1BpI,EAAOkG,gBACPrtB,EAAK4vB,iBAAmB5vB,EAAKkvB,iBAE7BlvB,EAAK4vB,iBAAmB5vB,EAAKkvB,iBAG5B/H,EAAOqI,gBACkB,SAA1BrI,EAAOkG,gBACPrtB,EAAK4vB,iBAAmB5vB,EAAKkvB,iBAE7BlvB,EAAK4vB,iBAAmB5vB,EAAKkvB,gBAE1B/H,EAAOqI,gBAAmBrI,EAAOoI,iBACpCvvB,EAAK4vB,iBAAmB5vB,EAAKkvB,gBAI3B3H,EAAO+F,UAAY,EAAG,CACxB,KAAIjwB,KAAKyxB,IAAIY,GAAQnI,EAAO+F,WAAattB,EAAKutB,oBAa5C,YADAvtB,EAAK4vB,iBAAmB5vB,EAAKkvB,gBAX7B,IAAKlvB,EAAKutB,mBAQR,OAPAvtB,EAAKutB,oBAAqBA,EAC1B7C,EAAQ+B,OAAS/B,EAAQ0B,SACzB1B,EAAQgC,OAAShC,EAAQ6B,SACzBvsB,EAAK4vB,iBAAmB5vB,EAAKkvB,oBAC7BxE,EAAQgF,KAAOvI,EAAOyH,eAClBlE,EAAQ0B,SAAW1B,EAAQ+B,OAC3B/B,EAAQ6B,SAAW7B,EAAQgC,QAShCnF,EAAOyI,eAAgBzI,EAAOuD,WAIhCvD,EAAO0I,UAAY1I,EAAO0I,SAAStF,SAAWxD,EAAO8I,UACtD1I,EAAO2I,uBAEP/I,EAAOgJ,oBACPhJ,EAAOiJ,uBAELjJ,EAAOI,OAAO0I,UAAY1I,EAAO0I,SAAStF,SAAWxD,EAAO8I,UAC9D9I,EAAO8I,SAASnC,cAGlB3G,EAAOkJ,eAAerwB,EAAK4vB,kBAE3BzI,EAAOmJ,aAAatwB,EAAK4vB,4BAtNnB5vB,EAAKktB,aAAeltB,EAAKitB,aAC3B9F,EAAOoD,KAAK,oBAAqBztB,ICZxB,SAASyzB,EAAW/gB,GAC3B2X,MAASvqB,KACToD,EAAOmnB,EAAOsD,gBAEZlD,EAA4DJ,EAA9DI,OAAUmD,EAAoDvD,EAA9DuD,QAAiCqD,EAA6B5G,EAA3C6G,aAAmBwC,EAAwBrJ,EAA9DqJ,WACN,GADoErJ,EAA9DwD,QACN,CACA,IAAI7tB,EAAI0S,EAMR,GALI1S,EAAEmuB,gBAAenuB,EAAIA,EAAEmuB,eACvBjrB,EAAKgtB,qBACP7F,EAAOoD,KAAK,WAAYztB,GAE1BkD,EAAKgtB,qBAAsBA,GACtBhtB,EAAKurB,UAMR,OALIvrB,EAAKwrB,SAAWjE,EAAO+H,YACzBnI,EAAOsI,eAAcA,GAEvBzvB,EAAKwrB,SAAUA,OACfxrB,EAAKktB,aAAcA,GAKnB3F,EAAO+H,YACPtvB,EAAKwrB,SACLxrB,EAAKurB,iBACJpE,EAAOoI,qBAA2BpI,EAAOqI,iBAE1CrI,EAAOsI,eAAcA,GAIvB,IAiCIgB,EAjCEC,EAAexzB,IACfyzB,EAAWD,EAAe1wB,EAAKmtB,eAgBrC,GAbIhG,EAAO+E,aACT/E,EAAOyJ,mBAAmB9zB,GAC1BqqB,EAAOoD,KAAK,YAAaztB,GACrB6zB,EAAW,KAAOD,EAAe1wB,EAAK6wB,cAAgB,KACxD1J,EAAOoD,KAAK,wBAAyBztB,IAIzCkD,EAAK6wB,cAAgB3zB,IACrB8nB,GAAS,WACFmC,EAAO2J,YAAW3J,EAAO+E,YAAaA,OAI1ClsB,EAAKurB,YACLvrB,EAAKwrB,UACLrE,EAAOkG,gBACS,IAAjB3C,EAAQgF,MACR1vB,EAAK4vB,mBAAqB5vB,EAAKkvB,eAK/B,OAHAlvB,EAAKurB,WAAYA,EACjBvrB,EAAKwrB,SAAUA,OACfxrB,EAAKktB,aAAcA,GAcrB,GAXAltB,EAAKurB,WAAYA,EACjBvrB,EAAKwrB,SAAUA,EACfxrB,EAAKktB,aAAcA,EAIjBuD,EADElJ,EAAOyI,aACIjC,EAAM5G,EAAOG,WAAaH,EAAOG,WAEhCtnB,EAAK4vB,kBAGjBrI,EAAOuD,QAIX,GAAI3D,EAAOI,OAAO0I,UAAY1I,EAAO0I,SAAStF,QAC5CxD,EAAO8I,SAASM,WAAW,CAAEE,mBAD/B,CAQA,IAFA,IAAIM,EAAY,EACZC,EAAY7J,EAAO8J,gBAAgB,GAEjCt2B,EAAI,EACRA,EAAI61B,EAAWhwB,OACf7F,GAAKA,EAAI4sB,EAAO2J,mBAAqB,EAAI3J,EAAO4J,eAChD,CACA,IAAMC,EAAYz2B,EAAI4sB,EAAO2J,mBAAqB,EAAI,EAAI3J,EAAO4J,wBACtDX,EAAW71B,EAAIy2B,GACpBX,GAAcD,EAAW71B,IAAM81B,EAAaD,EAAW71B,EAAIy2B,KAC7DL,EAAYp2B,EACZq2B,EAAYR,EAAW71B,EAAIy2B,GAAaZ,EAAW71B,IAE5C81B,GAAcD,EAAW71B,KAClCo2B,EAAYp2B,EACZq2B,EAAYR,EAAWA,EAAWhwB,OAAS,GAAKgwB,EAAWA,EAAWhwB,OAAS,IAKnF,IAAM6wB,GAASZ,EAAaD,EAAWO,IAAcC,EAC/CI,EAAYL,EAAYxJ,EAAO2J,mBAAqB,EAAI,EAAI3J,EAAO4J,eAEzE,GAAIR,EAAWpJ,EAAO+J,aAAc,CAElC,IAAK/J,EAAOgK,WAEV,YADApK,EAAOqK,QAAQrK,EAAOkD,aAGM,SAA1BlD,EAAOkG,iBACLgE,GAAS9J,EAAOkK,gBAAiBtK,EAAOqK,QAAQT,EAAYK,GAC3DjK,EAAOqK,QAAQT,IAEQ,SAA1B5J,EAAOkG,iBACLgE,EAAQ,EAAI9J,EAAOkK,gBAAiBtK,EAAOqK,QAAQT,EAAYK,GAC9DjK,EAAOqK,QAAQT,QAEjB,CAEL,IAAKxJ,EAAOmK,YAEV,YADAvK,EAAOqK,QAAQrK,EAAOkD,cAItBlD,EAAOwK,YACN70B,EAAEif,SAAWoL,EAAOwK,WAAWC,QAAU90B,EAAEif,SAAWoL,EAAOwK,WAAWE,QAE3C,SAA1B1K,EAAOkG,gBACTlG,EAAOqK,QAAQT,EAAYK,GAEC,SAA1BjK,EAAOkG,gBACTlG,EAAOqK,QAAQT,IAERj0B,EAAEif,SAAWoL,EAAOwK,WAAWC,OACxCzK,EAAOqK,QAAQT,EAAYK,GAE3BjK,EAAOqK,QAAQT,MC3IN,SAASe,IAChB3K,MAASvqB,KAEP2qB,EAAeJ,EAAjBI,OAAU/O,EAAO2O,EAAjB3O,GAEN,IAAIA,GAAyB,IAAnBA,EAAGK,YAAb,CAGI0O,EAAOwK,aACT5K,EAAO6K,gBAIT,IAAQzC,EAA6CpI,EAA/CoI,eAAkBC,EAA6BrI,EAA/CqI,eAAkCyC,EAAa9K,EAA/C8K,SAGN9K,EAAOoI,gBAAiBA,EACxBpI,EAAOqI,gBAAiBA,EAExBrI,EAAOiG,aACPjG,EAAO+K,eAEP/K,EAAOiJ,uBAEqB,SAAzB7I,EAAO4K,eAA4B5K,EAAO4K,cAAgB,IAC3DhL,EAAOiL,QACNjL,EAAOkL,cACPlL,EAAOI,OAAO+K,eAEfnL,EAAOqK,QAAQrK,EAAOoL,OAAO/xB,OAAS,EAAG,GAAG,MAE5C2mB,EAAOqK,QAAQrK,EAAOkD,YAAa,GAAG,MAGpClD,EAAOqL,UAAYrL,EAAOqL,SAASC,SAAWtL,EAAOqL,SAASE,QAChEvL,EAAOqL,SAASG,MAGlBxL,EAAOqI,eAAiBA,EACxBrI,EAAOoI,eAAiBA,EAEpBpI,EAAOI,OAAOqL,eAAiBX,IAAa9K,EAAO8K,UACrD9K,EAAO0L,iBC1CI,SAASC,EAAQh2B,GAC9B,IAAMqqB,EAASvqB,KACVuqB,EAAOwD,UACPxD,EAAO+E,aACN/E,EAAOI,OAAOwL,eAAej2B,EAAE8K,iBAC/Buf,EAAOI,OAAOyL,0BAA4B7L,EAAOyD,YACnD9tB,EAAEmyB,kBACFnyB,EAAEm2B,8BCPO,SAASC,IAChB/L,MAASvqB,KACP6qB,EAAqCN,EAAvCM,UAAauG,EAA0B7G,EAAvC6G,aACN,GAD6C7G,EAAvCwD,QACN,CACAxD,EAAOgM,kBAAoBhM,EAAOG,UAC9BH,EAAOyH,eACTzH,EAAOG,WAAaG,EAAUjO,WAE9B2N,EAAOG,WAAaG,EAAUzf,WAGN,IAAtBmf,EAAOG,YAAkBH,EAAOG,UAAY,GAEhDH,EAAOgJ,oBACPhJ,EAAOiJ,sBAGP,IAAMgD,EAAiBjM,EAAOmH,eAAiBnH,EAAOoH,gBAC/B,IAAnB6E,EACY,GAECjM,EAAOG,UAAYH,EAAOoH,gBAAkB6E,KAEzCjM,EAAOY,UACzBZ,EAAOkJ,eAAerC,GAAgB7G,EAAOG,UAAYH,EAAOG,WAGlEH,EAAOoD,KAAK,eAAgBpD,EAAOG,WAAWA,IXoDhDjsB,OAAO+F,KAAKye,GAASnZ,SAAS2sB,YAC5Bh4B,OAAOC,eAAeyE,EAAE0f,GAAI4T,EAAY,CAAEz3B,MAAOikB,EAAQwT,GAAaC,UAAUA,OYvElF,IAAIC,KACJ,SAASC,KAET,IAAMlS,EAAS,SAAC6F,EAAQ9a,GAChB5E,MAAW2V,IACTmK,EAAwDJ,EAA1DI,OAAUkM,EAAgDtM,EAA1DsM,YAAuBjb,EAAmC2O,EAA1D3O,GAA2BiP,EAA+BN,EAA1DM,UAAsCyB,EAAoB/B,EAA1D+B,OAA8CxJ,EAAYyH,EAA1DzH,QACAqB,IAAYwG,EAAOyH,OACnB0E,EAAuB,OAAXrnB,EAAkB,mBAAqB,sBACnDsnB,EAAetnB,EAGrB,GAAKqT,EAAQ8I,MAIN,CACL,IAAME,IACkB,eAAtB+K,EAAYnmB,QAA0BoS,EAAQgJ,kBAAmBnB,EAAOqM,mBACpE,CAAEC,SAASA,EAAM9S,SAASA,GAEhCvI,EAAGkb,GAAWD,EAAYnmB,MAAO6Z,EAAOqD,aAAc9B,GACtDlQ,EAAGkb,GACDD,EAAYK,KACZ3M,EAAO2G,YACPpO,EAAQgJ,gBAAkB,CAAEmL,SAASA,EAAO9S,WAAYA,GAE1DvI,EAAGkb,GAAWD,EAAY3Z,IAAKqN,EAAOoJ,WAAY7H,GAC9C+K,EAAYh0B,QACd+Y,EAAGkb,GAAWD,EAAYh0B,OAAQ0nB,EAAOoJ,WAAY7H,QAhBvDlQ,EAAGkb,GAAWD,EAAYnmB,MAAO6Z,EAAOqD,cAAcA,GACtD/iB,EAASisB,GAAWD,EAAYK,KAAM3M,EAAO2G,YAAa/M,GAC1DtZ,EAASisB,GAAWD,EAAY3Z,IAAKqN,EAAOoJ,YAAYA,IAkBtDhJ,EAAOwL,eAAiBxL,EAAOyL,2BACjCxa,EAAGkb,GAAW,QAASvM,EAAO2L,SAASA,GAErCvL,EAAOuD,SACTrD,EAAUiM,GAAW,SAAUvM,EAAO+L,UAIpC3L,EAAOwM,qBACT5M,EAAOwM,GACLzK,EAAOC,KAAOD,EAAOE,QACjB,0CACA,wBACJ0I,MAIF3K,EAAOwM,GAAc,iBAAkB7B,OCxDrCkC,EAAgB,SAAC7M,EAAQI,UACtBJ,EAAO8M,MAAQ1M,EAAO0M,MAAQ1M,EAAO0M,KAAKC,KAAO,GCH1Drd,EAAe,CACb9T,MAAMA,EACNqnB,UAAW,aACXe,kBAAmB,UACnBgJ,aAAc,EACd3M,MAAO,IACPsD,SAASA,EACTiJ,sBAAsBA,EACtBK,gBAAgBA,EAChBpF,QAAQA,EACRqF,gBAAgBA,EAChB1J,SAASA,EACT6C,kBAAmB,wDAGnB5U,MAAO,KACPE,OAAQ,KAGR+R,gCAAgCA,EAGhCrN,UAAW,KACX1T,IAAK,KAGL6iB,oBAAoBA,EACpBE,mBAAoB,GAGpByH,YAAYA,EAGZC,gBAAgBA,EAGhBC,kBAAkBA,EAGlBC,OAAQ,QAGR1C,iBAAaA,EACb2C,gBAAiB,SAGjBC,aAAc,EACdxC,cAAe,EACfhB,eAAgB,EAChBD,mBAAoB,EACpB0D,oBAAoBA,EACpBtC,gBAAgBA,EAChBuC,sBAAsBA,EACtBC,mBAAoB,EACpBC,kBAAmB,EACnBC,qBAAqBA,EACrBC,0BAA0BA,EAG1BrC,eAAeA,EAGfsC,cAAcA,EAGdvF,WAAY,EACZhB,WAAY,GACZwG,eAAeA,EACfzD,aAAaA,EACbH,YAAYA,EACZE,gBAAiB,GACjBH,aAAc,IACdtB,cAAcA,EACdtC,gBAAgBA,EAChBJ,UAAW,EACXyB,0BAA0BA,EAC1BpB,0BAA0BA,EAC1BC,+BAA+BA,EAC/BQ,qBAAqBA,EAGrBgH,mBAAmBA,EAGnBrF,YAAYA,EACZD,gBAAiB,IAGjBI,qBAAqBA,EAGrBZ,YAAYA,EAGZyD,eAAeA,EACfC,0BAA0BA,EAC1BqC,qBAAqBA,EAGrBC,eAAeA,EACfC,qBAAqBA,EAGrBxK,MAAMA,EACNyK,qBAAsB,EACtBC,aAAc,KACdC,wBAAwBA,EACxBC,mBAAmBA,EAGnBnG,gBAAgBA,EAChBD,gBAAgBA,EAChBpD,aAAc,KACdN,WAAWA,EACXJ,eAAgB,oBAChBE,kBAAmB,KAGnBiI,kBAAkBA,EAGlBgC,uBAAwB,UACxBC,WAAY,eACZC,gBAAiB,+BACjBC,iBAAkB,sBAClBC,0BAA2B,gCAC3BC,kBAAmB,uBACnBC,oBAAqB,yBACrBC,eAAgB,oBAChBC,wBAAyB,8BACzBC,eAAgB,oBAChBC,wBAAyB,8BACzBC,aAAc,iBAGdC,oBAAoBA,EAGpBC,cAAcA,GCxID,SAASC,EAAmBnP,EAAQoP,GACjD,OAAO,WAA4B,IAANljB,yDAAM,GAC3BmjB,EAAkBv7B,OAAO+F,KAAKqS,GAAK,GACnCojB,EAAepjB,EAAImjB,GACG,YAAjBC,IAA8C,OAAjBA,GAKtC,CAAC,aAAc,aAAc,aAAavtB,QAAQstB,IAAoB,QACtErP,EAAOqP,KAEPrP,EAAOqP,GAAmB,CAAEE,MAAMA,IAE9BF,KAAmBrP,GAAU,YAAasP,QAI5CtP,EAAOqP,KACTrP,EAAOqP,GAAmB,CAAEjM,SAASA,IAEA,YAA5BpD,EAAOqP,KAAmC,YAAarP,EAAOqP,KACvErP,EAAOqP,GAAiBjM,SAAUA,GAE/BpD,EAAOqP,KAAkBrP,EAAOqP,GAAmB,CAAEjM,SAASA,IACnErnB,EAAOqzB,EAAkBljB,IAVvBnQ,EAAOqzB,EAAkBljB,IAVzBnQ,EAAOqzB,EAAkBljB,ICqB/B,IAAMsjB,EAAa,CACjBC,cC3Ba,CACbtvB,YAAG4Z,EAAQM,EAASqV,GAClB,IAAMC,EAAOt6B,KACb,GAAuB,mBAAZglB,EAAwB,OAAOsV,EAC1C,IAAM7qB,EAAS4qB,EAAW,UAAY,OAKtC,OAJA3V,EAAOzO,MAAM,KAAKnM,SAAS8I,YACpB0nB,EAAKC,gBAAgB3nB,KAAQ0nB,EAAKC,gBAAgB3nB,GAAS,IAChE0nB,EAAKC,gBAAgB3nB,GAAOnD,GAAQuV,MAE/BsV,GAGTE,cAAK9V,EAAQM,EAASqV,GACpB,IAAMC,EAAOt6B,KACb,GAAuB,mBAAZglB,EAAwB,OAAOsV,EAC1C,SAASG,IAAe54B,wEACtBy4B,EAAKxV,IAAIJ,EAAQ+V,GACbA,EAAYC,uBACPD,EAAYC,eAErB1V,EAAQhjB,MAAMs4B,EAAMz4B,GAGtB,OADA44B,EAAYC,eAAiB1V,EACtBsV,EAAKxvB,GAAG4Z,EAAQ+V,EAAaJ,IAGtCM,eAAM3V,EAASqV,GACb,IAAMC,EAAOt6B,KACb,GAAuB,mBAAZglB,EAAwB,OAAOsV,EAC1C,IAAM7qB,EAAS4qB,EAAW,UAAY,OAItC,OAHIC,EAAKM,mBAAmBluB,QAAQsY,GAAW,GAC7CsV,EAAKM,mBAAmBnrB,GAAQuV,GAE3BsV,GAGTO,gBAAO7V,GACL,IAAMsV,EAAOt6B,KACb,IAAKs6B,EAAKM,mBAAoB,OAAON,EACrC,IAAMryB,EAAQqyB,EAAKM,mBAAmBluB,QAAQsY,GAI9C,OAHI/c,GAAS,GACXqyB,EAAKM,mBAAmB1V,OAAOjd,EAAO,GAEjCqyB,GAGTxV,aAAIJ,EAAQM,GACV,IAAMsV,EAAOt6B,KACb,OAAKs6B,EAAKC,iBACV7V,EAAOzO,MAAM,KAAKnM,SAAS8I,qBACdoS,EACTsV,EAAKC,gBAAgB3nB,GAAS,GACrB0nB,EAAKC,gBAAgB3nB,IAC9B0nB,EAAKC,gBAAgB3nB,GAAO9I,SAAQ,SAACgxB,EAAc7yB,IAE/C6yB,IAAiB9V,GAChB8V,EAAaJ,gBAAkBI,EAAaJ,iBAAmB1V,IAEhEsV,EAAKC,gBAAgB3nB,GAAOsS,OAAOjd,EAAO,SAK3CqyB,GAf2BA,GAkBpC3M,gBACE,IAEIjJ,EACAthB,EACAif,EAJEiY,EAAOt6B,KACb,IAAKs6B,EAAKC,gBAAiB,OAAOD,EAIX,2BANjBz4B,6CA8BN,MAxBuB,iBAAZA,EAAK,IAAmBoI,MAAMC,QAAQrI,EAAK,KACpD6iB,EAAS7iB,EAAK,GACduB,EAAOvB,EAAK8F,MAAM,EAAG9F,EAAK+B,QAC1Bye,EAAUiY,IAEV5V,EAAS7iB,EAAK,GAAG6iB,OACjBthB,EAAOvB,EAAK,GAAGuB,KACfif,EAAUxgB,EAAK,GAAGwgB,SAAWiY,GAE/Bl3B,EAAKmhB,QAAQlC,IACOpY,MAAMC,QAAQwa,GAAUA,EAASA,EAAOzO,MAAM,MAEtDnM,SAAS8I,YACf0nB,EAAKM,oBAAsBN,EAAKM,mBAAmBh3B,QACrD02B,EAAKM,mBAAmB9wB,SAASgxB,YAC/BA,EAAa94B,MAAMqgB,GAAUzP,YAAUxP,QAGvCk3B,EAAKC,iBAAmBD,EAAKC,gBAAgB3nB,IAC/C0nB,EAAKC,gBAAgB3nB,GAAO9I,SAASgxB,YACnCA,EAAa94B,MAAMqgB,EAASjf,SAI3Bk3B,IDpETS,OEpBa,CACbvK,WCXa,WACb,IACIxU,EACAE,EAFEqO,EAASvqB,KAGTwL,EAAM+e,EAAO/e,IAEjBwQ,WADSuO,EAAOI,OAAO3O,OAAiD,OAAxBuO,EAAOI,OAAO3O,MACtDuO,EAAOI,OAAO3O,MAEdxQ,EAAI,GAAGqR,YAGfX,WADSqO,EAAOI,OAAOzO,QAAmD,OAAzBqO,EAAOI,OAAOzO,OACtDqO,EAAOI,OAAOzO,OAEd1Q,EAAI,GAAGmR,aAEH,IAAVX,GAAeuO,EAAOyH,gBAA+B,IAAX9V,GAAgBqO,EAAOkH,eAKtEzV,EACEA,EACA7X,SAASqH,EAAI+a,IAAI,iBAAmB,EAAG,IACvCpiB,SAASqH,EAAI+a,IAAI,kBAAoB,EAAG,IAC1CrK,EACEA,EACA/X,SAASqH,EAAI+a,IAAI,gBAAkB,EAAG,IACtCpiB,SAASqH,EAAI+a,IAAI,mBAAqB,EAAG,IAEvCyU,OAAOC,MAAMjf,KAAQA,EAAQ,GAC7Bgf,OAAOC,MAAM/e,KAASA,EAAS,GAEnCzd,OAAO0xB,OAAO5F,EAAQ,CACpBvO,QACAE,SACAgf,KAAM3Q,EAAOyH,eAAiBhW,EAAQE,MDvBxCoZ,aEVa,WACb,IAAM/K,EAASvqB,KACf,SAASm7B,EAAkBz7B,GACzB,OAAI6qB,EAAOyH,eACFtyB,EAGF,CACLsc,MAAS,SACT,aAAc,cACd,iBAAkB,eAClB,cAAe,aACf,eAAgB,gBAChB,eAAgB,cAChB,gBAAiB,iBACjBof,YAAe,gBACf17B,GAEJ,SAAS27B,EAA0BhS,EAAMla,GACvC,OAAO4W,WAAWsD,EAAKnI,iBAAiBia,EAAkBhsB,KAAW,GAGjEwb,MAASJ,EAAOI,OAEd6H,EAA8DjI,EAAhEiI,WAAoB8I,EAA4C/Q,EAAlD2Q,KAAgC/J,EAAkB5G,EAAhC6G,aAAmBmK,EAAahR,EAAhEgR,SACAC,EAAYjR,EAAOkR,SAAW9Q,EAAO8Q,QAAQ1N,QAC7C2N,EAAuBF,EAAYjR,EAAOkR,QAAQ9F,OAAO/xB,OAAS2mB,EAAOoL,OAAO/xB,OAChF+xB,EAASnD,EAAWxoB,SAASA,IAATA,OAAaugB,EAAOI,OAAOsO,aAC/C0C,EAAeH,EAAYjR,EAAOkR,QAAQ9F,OAAO/xB,OAAS+xB,EAAO/xB,OACnEyxB,EAAW,GACTzB,EAAa,GACbS,EAAkB,GAEpBuH,EAAejR,EAAOuN,mBACE,mBAAjB0D,IACTA,EAAejR,EAAOuN,mBAAmBh6B,KAAKqsB,IAGhD,IAAIsR,EAAclR,EAAOwN,kBACE,mBAAhB0D,IACTA,EAAclR,EAAOwN,kBAAkBj6B,KAAKqsB,IAG9C,IAAMuR,EAAyBvR,EAAO8K,SAASzxB,OACzCm4B,EAA2BxR,EAAOqJ,WAAWhwB,OAE/Cm0B,EAAepN,EAAOoN,aACtBiE,GAAiBJ,EACjBK,EAAgB,EAChBh0B,EAAQ,EACZ,QAAI,IAAOqzB,EAAX,CAG4B,iBAAjBvD,GAA6BA,EAAarrB,QAAQ,MAAQ,IACnEqrB,EAAgBhS,WAAWgS,EAAahwB,QAAQ,IAAK,KAAO,IAAOuzB,GAGrE/Q,EAAO2R,aAAenE,EAGlB5G,EAAKwE,EAAOpP,IAAI,CAAE4V,WAAY,GAAIC,aAAc,GAAIC,UAAW,KAC9D1G,EAAOpP,IAAI,CAAE6U,YAAa,GAAIgB,aAAc,GAAIC,UAAW,KAG5D1R,EAAO+K,gBAAkB/K,EAAOuD,UAClCjE,EAAeM,EAAOM,UAAW,kCAAmC,IACpEZ,EAAeM,EAAOM,UAAW,iCAAkC,KAGrE,IAMIyR,EANEC,EAAc5R,EAAO0M,MAAQ1M,EAAO0M,KAAKC,KAAO,GAAK/M,EAAO8M,KAC9DkF,GACFhS,EAAO8M,KAAKmF,WAAWb,GAazB,IAPA,IAAMc,EACqB,SAAzB9R,EAAO4K,eACP5K,EAAOwK,aACP12B,OAAO+F,KAAKmmB,EAAOwK,aAAa/S,QAAQ9iB,4BACxBqrB,EAAOwK,YAAY71B,GAAKi2B,iBACrC3xB,OAAS,EAEL7F,EAAI,EAAGA,EAAI49B,EAAc59B,GAAK,EAAG,CACxCu+B,EAAY,EACZ,IAAMI,EAAQ/G,EAAO3O,GAAGjpB,GAIxB,GAHIw+B,GACFhS,EAAO8M,KAAKsF,YAAY5+B,EAAG2+B,EAAOf,EAAcR,GAErB,SAAzBuB,EAAMnW,IAAI,WAAd,CAEA,GAA6B,SAAzBoE,EAAO4K,cAA0B,CAC/BkH,IACF9G,EAAO53B,GAAGgiB,MAAMob,EAAkB,UAAa,IAEjD,IAAMyB,EAAc3b,iBAAiByb,EAAM,IACrCG,EAAmBH,EAAM,GAAG3c,MAAM6D,UAClCkZ,EAAyBJ,EAAM,GAAG3c,MAAM+I,gBAO9C,GANI+T,IACFH,EAAM,GAAG3c,MAAM6D,UAAY,QAEzBkZ,IACFJ,EAAM,GAAG3c,MAAM+I,gBAAkB,QAE/B6B,EAAO2N,aACTgE,EAAY/R,EAAOyH,eAAiB0K,EAAM9W,YAAWA,GAAQ8W,EAAM1W,aAAYA,OAC1E,CAEL,IAAMhK,EAAQqf,EAA0BuB,EAAa,SAC/CG,EAAc1B,EAA0BuB,EAAa,gBACrDI,EAAe3B,EAA0BuB,EAAa,iBACtDT,EAAad,EAA0BuB,EAAa,eACpDxB,EAAcC,EAA0BuB,EAAa,gBACrDK,EAAYL,EAAY1b,iBAAiB,cAC/C,GAAI+b,GAA2B,eAAdA,EACfX,EAAYtgB,EAAQmgB,EAAaf,MAC5B,OACgCsB,EAAM,GAAnC7f,IAAFA,YACNyf,EACEtgB,EACA+gB,EACAC,EACAb,EACAf,GANmBnf,EAAfA,YAOWY,IAGjBggB,IACFH,EAAM,GAAG3c,MAAM6D,UAAYiZ,GAEzBC,IACFJ,EAAM,GAAG3c,MAAM+I,gBAAkBgU,GAE/BnS,EAAO2N,eAAcgE,EAAY77B,KAAKgF,MAAM62B,SAEhDA,GAAahB,GAAc3Q,EAAO4K,cAAgB,GAAKwC,GAAgBpN,EAAO4K,cAC1E5K,EAAO2N,eAAcgE,EAAY77B,KAAKgF,MAAM62B,IAE5C3G,EAAO53B,KACT43B,EAAO53B,GAAGgiB,MAAMob,EAAkB,oBAAemB,SAGjD3G,EAAO53B,KACT43B,EAAO53B,GAAGm/B,gBAAkBZ,GAE9BjI,EAAgB5gB,KAAK6oB,GAEjB3R,EAAO+K,gBACTsG,EAAgBA,EAAgBM,EAAY,EAAIL,EAAgB,EAAIlE,EAC9C,IAAlBkE,GAA6B,IAANl+B,IACzBi+B,EAAgBA,EAAgBV,EAAa,EAAIvD,GACzC,IAANh6B,IAASi+B,EAAgBA,EAAgBV,EAAa,EAAIvD,GAC1Dt3B,KAAKyxB,IAAI8J,GAAiB,OAAUA,EAAgB,GACpDrR,EAAO2N,eAAc0D,EAAgBv7B,KAAKgF,MAAMu2B,IAChD/zB,EAAQ0iB,EAAO4J,gBAAmB,GAAGc,EAAS5hB,KAAKuoB,GACvDpI,EAAWngB,KAAKuoB,KAEZrR,EAAO2N,eAAc0D,EAAgBv7B,KAAKgF,MAAMu2B,KAEjD/zB,EAAQxH,KAAKG,IAAI2pB,EAAOI,OAAO2J,mBAAoBrsB,IAClDsiB,EAAOI,OAAO4J,gBAChB,GAEAc,EAAS5hB,KAAKuoB,GAChBpI,EAAWngB,KAAKuoB,GAChBA,EAAgBA,EAAgBM,EAAYvE,GAG9CxN,EAAO2R,aAAeI,EAAYvE,EAElCkE,EAAgBK,EAEhBr0B,GAAS,GAkBX,GAhBAsiB,EAAO2R,YAAcz7B,KAAKC,IAAI6pB,EAAO2R,YAAaZ,GAAcO,EAE5D1K,GAAOoK,IAA+B,UAAlB5Q,EAAOkN,QAAwC,cAAlBlN,EAAOkN,SAC1DrF,EAAWjM,IAAI,CAAEvK,MAAOA,GAAPA,OAAUuO,EAAO2R,YAAcvR,EAAOoN,qBAErDpN,EAAOgN,gBACTnF,EAAWjM,IAAIA,EAAJA,GACR4U,EAAkB,mBAAc5Q,EAAO2R,YAAcvR,EAAOoN,qBAI7DwE,GACFhS,EAAO8M,KAAK8F,kBAAkBb,EAAWjH,EAAU8F,IAIhDxQ,EAAO+K,eAAgB,CAE1B,IADA,IAAM0H,EAAgB,GACbr/B,EAAI,EAAGA,EAAIs3B,EAASzxB,OAAQ7F,GAAK,EAAG,CAC3C,IAAIs/B,EAAiBhI,EAASt3B,GAC1B4sB,EAAO2N,eAAc+E,EAAiB58B,KAAKgF,MAAM43B,IACjDhI,EAASt3B,IAAMwsB,EAAO2R,YAAcZ,GACtC8B,EAAc3pB,KAAK4pB,GAGvBhI,EAAW+H,EAGT38B,KAAKgF,MAAM8kB,EAAO2R,YAAcZ,GAAc76B,KAAKgF,MAAM4vB,EAASA,EAASzxB,OAAS,IACpF,GAEAyxB,EAAS5hB,KAAK8W,EAAO2R,YAAcZ,GAKvC,GAFwB,IAApBjG,EAASzxB,SAAcyxB,EAAW,CAAC,IAEX,IAAxB1K,EAAOoN,aAAoB,CAC7B,IAAMz4B,EAAMirB,EAAOyH,gBAAkBb,EAAM,aAAegK,EAAkB,eAC5ExF,EACGvT,QAAO,SAACkb,EAAGC,UACL5S,EAAOuD,SACRqP,IAAe5H,EAAO/xB,OAAS,KAKpC2iB,IAAIA,EAAJA,GAAOjnB,YAASy4B,UAGrB,GAAIpN,EAAO+K,gBAAkB/K,EAAOsN,qBAAsB,CACxD,IAAIuF,EAAgB,EACpBnJ,EAAgBvqB,SAAS2zB,YACvBD,GAAiBC,GAAkB9S,EAAOoN,aAAepN,EAAOoN,aAAe,MAGjF,IAAM2F,GADNF,GAAiB7S,EAAOoN,cACQuD,EAChCjG,EAAWA,EAASvlB,KAAK6tB,mBACnBA,EAAO,GAAW/B,EAClB+B,EAAOD,EAAgBA,EAAU7B,EAC9B8B,KAIX,GAAIhT,EAAO0N,yBAA0B,CACnC,IAAImF,EAAgB,EAKpB,GAJAnJ,EAAgBvqB,SAAS2zB,YACvBD,GAAiBC,GAAkB9S,EAAOoN,aAAepN,EAAOoN,aAAe,OAEjFyF,GAAiB7S,EAAOoN,cACJuD,EAAY,CAC9B,IAAMsC,GAAmBtC,EAAakC,GAAiB,EACvDnI,EAASvrB,SAAQ,SAAC6zB,EAAME,GACtBxI,EAASwI,GAAaF,EAAOC,KAE/BhK,EAAW9pB,SAAQ,SAAC6zB,EAAME,GACxBjK,EAAWiK,GAAaF,EAAOC,MAYrC,GAPAn/B,OAAO0xB,OAAO5F,EAAQ,CACpBoL,SACAN,WACAzB,aACAS,oBAGE1J,EAAO+K,gBAAkB/K,EAAOuD,UAAYvD,EAAOsN,qBAAsB,CAC3EhO,EAAeM,EAAOM,UAAW,mCAAuCwK,EAAS,GAAZ,MACrEpL,EACEM,EAAOM,UACP,iCACGN,EAAO2Q,KAAO,EAAI7G,EAAgBA,EAAgBzwB,OAAS,GAAK,EAAlE,MAEH,IAAMk6B,GAAiBvT,EAAO8K,SAAS,GACjC0I,GAAmBxT,EAAOqJ,WAAW,GAC3CrJ,EAAO8K,SAAW9K,EAAO8K,SAASvlB,KAAKiG,mBAAMA,EAAI+nB,KACjDvT,EAAOqJ,WAAarJ,EAAOqJ,WAAW9jB,KAAKiG,mBAAMA,EAAIgoB,KAGnDpC,IAAiBD,GACnBnR,EAAOoD,KAAK,sBAEV0H,EAASzxB,SAAWk4B,IAClBvR,EAAOI,OAAOqL,eAAezL,EAAO0L,gBACxC1L,EAAOoD,KAAK,yBAEViG,EAAWhwB,SAAWm4B,GACxBxR,EAAOoD,KAAK,0BAGVhD,EAAO2I,qBACT/I,EAAOyT,uBFpRTC,iBGba,SAA0BrT,GACvC,IAII7sB,EAJEwsB,EAASvqB,KACTk+B,EAAe,GACf1C,EAAYjR,EAAOkR,SAAWlR,EAAOI,OAAO8Q,QAAQ1N,QACtDoQ,EAAY,EAEK,iBAAVvT,EACTL,EAAOgI,cAAc3H,QACZA,GACTL,EAAOgI,cAAchI,EAAOI,OAAOC,OAGrC,IAAMwT,EAAmBn2B,mBACnBuzB,EACKjR,EAAOoL,OAAOvT,QAClBxG,mBAAOzX,SAASyX,EAAG6H,aAAa,2BAA4B,MAAQxb,KACrE,GAEGsiB,EAAOoL,OAAO3O,GAAG/e,GAAO,IAGjC,GAAoC,SAAhCsiB,EAAOI,OAAO4K,eAA4BhL,EAAOI,OAAO4K,cAAgB,EAC1E,GAAIhL,EAAOI,OAAO+K,eAChBnL,EAAO8T,cAAc7qB,MAAMkpB,YACzBwB,EAAazqB,KAAKipB,WAGpB,IAAK3+B,EAAI,EAAGA,EAAI0C,KAAK69B,KAAK/T,EAAOI,OAAO4K,eAAgBx3B,GAAK,EAAG,CAC9D,IAAMkK,EAAQsiB,EAAOkD,YAAc1vB,EACnC,GAAIkK,EAAQsiB,EAAOoL,OAAO/xB,SAAW43B,EAAW,MAChD0C,EAAazqB,KAAK2qB,EAAgBn2B,SAItCi2B,EAAazqB,KAAK2qB,EAAgB7T,EAAOkD,cAI3C,IAAK1vB,EAAI,EAAGA,EAAImgC,EAAat6B,OAAQ7F,GAAK,EACxC,QAAI,IAAOmgC,EAAangC,GAAoB,CAC1C,IAAMme,EAASgiB,EAAangC,GAAGoe,aAC/BgiB,EAAYjiB,EAASiiB,EAAYjiB,EAASiiB,EAK1CA,GAAW5T,EAAOiI,WAAWjM,IAAI,mBAAa4X,UHhClDH,mBIda,WAGb,IAFA,IACMrI,EADS31B,KACO21B,OACb53B,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EACtC43B,EAAO53B,GAAGwgC,kBAHGv+B,KAGwBgyB,eACjC2D,EAAO53B,GAAGge,WACV4Z,EAAO53B,GAAG+d,WJShB0iB,qBKba,WAAsE,IAAxC9T,yDAAa1qB,MAAQA,KAAK0qB,WAAc,EAC7EH,EAASvqB,KACT2qB,EAASJ,EAAOI,OAEdgL,EAA8BpL,EAAhCoL,OAAwBxE,EAAQ5G,EAAtB6G,aAEhB,GAAsB,IAAlBuE,EAAO/xB,OAAX,MAAyB,IACd+xB,EAAO,GAAG4I,mBAAmChU,EAAOyT,qBAE/D,IAAIS,GAAgB/T,EAChByG,IAAKsN,EAAe/T,GAGxBiL,EAAO/rB,YAAY+gB,EAAO0O,mBAE1B9O,EAAOmU,qBAAuB,GAC9BnU,EAAO8T,cAAgB,GAEvB,IAAK,IAAItgC,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAAG,CACzC,IAAM2+B,EAAQ/G,EAAO53B,GACjB4gC,EAAcjC,EAAM6B,kBACpB5T,EAAOuD,SAAWvD,EAAO+K,iBAC3BiJ,GAAehJ,EAAO,GAAG4I,mBAG3B,IAAMK,GACHH,GAAgB9T,EAAO+K,eAAiBnL,EAAOoH,eAAiB,GAAKgN,IACrEjC,EAAMQ,gBAAkBvS,EAAOoN,cAC5B8G,IAAgBJ,EAAeE,GAC/BG,EAAaD,EAActU,EAAO8J,gBAAgBt2B,IAErD8gC,GAAe,GAAKA,EAActU,EAAO2Q,KAAO,GAChD4D,EAAa,GAAKA,GAAcvU,EAAO2Q,MACvC2D,GAAe,GAAKC,GAAcvU,EAAO2Q,QAE1C3Q,EAAO8T,cAAc5qB,KAAKipB,GAC1BnS,EAAOmU,qBAAqBjrB,KAAK1V,GACjC43B,EAAO3O,GAAGjpB,GAAGsM,SAASsgB,EAAO0O,oBAE/BqD,EAAMvR,SAAWgG,GAAOyN,EAAgBA,EAE1CrU,EAAO8T,cAAgBl7B,EAAEonB,EAAO8T,iBL3BhC5K,eMhBa,SAAwB/I,GACrC,IAAMH,EAASvqB,KACf,QAAI,IAAO0qB,EAA2B,CACpC,IAAMqU,EAAaxU,EAAO6G,cAAgB,EAAI,EAE9C1G,EAAaH,GAAUA,EAAOG,WAAaH,EAAOG,UAAYqU,GAAe,EAE/E,IAAMpU,EAASJ,EAAOI,OAChB6L,EAAiBjM,EAAOmH,eAAiBnH,EAAOoH,eAChDxG,EAAiCZ,EAAnCY,SAAYsK,EAAuBlL,EAAnCkL,YAAyBD,EAAUjL,EAAnCiL,MACEwJ,EAAevJ,EACfwJ,EAASzJ,EACQ,IAAnBgB,GACFrL,EAAW,EACXsK,KACAD,OAGAC,GADAtK,GAAYT,EAAYH,EAAOoH,gBAAkB6E,IACvB,EAC1BhB,EAAQrK,GAAY,GAEtB1sB,OAAO0xB,OAAO5F,EAAQ,CACpBY,WACAsK,cACAD,WAGE7K,EAAO2I,qBAAwB3I,EAAO+K,gBAAkB/K,EAAO+M,aACjEnN,EAAOiU,qBAAqB9T,GAE1B+K,IAAgBuJ,GAClBzU,EAAOoD,KAAK,yBAEV6H,IAAUyJ,GACZ1U,EAAOoD,KAAK,oBAETqR,IAAiBvJ,GAAiBwJ,IAAWzJ,IAChDjL,EAAOoD,KAAK,YAGdpD,EAAOoD,KAAK,WAAYxC,INvBxBqI,oBOjBa,WACPjJ,IASF2U,EATE3U,EAASvqB,KAEP21B,EAAuDpL,EAAzDoL,OAAUhL,EAA+CJ,EAAzDI,OAAkB6H,EAAuCjI,EAAzDiI,WAA8B/E,EAA2BlD,EAAzDkD,YAA2C0R,EAAc5U,EAAzD4U,UACA3D,EAAYjR,EAAOkR,SAAW9Q,EAAO8Q,QAAQ1N,QAEnD4H,EAAO/rB,YAAYA,GAAZA,OACF+gB,EAAOwO,6BAAoBxO,EAAO4O,2BAAkB5O,EAAO8O,2BAAkB9O,EAAOyO,sCAA6BzO,EAAO6O,oCAA2B7O,EAAO+O,2BAK7JwF,EADE1D,EACYjR,EAAOiI,WAAWpsB,KAAKA,IAALA,OAC1BukB,EAAOsO,gDAAuCxL,SAGtCkI,EAAO3O,GAAGyG,IAIdpjB,SAASsgB,EAAOwO,kBAExBxO,EAAOwD,OAEL+Q,EAAYr2B,SAAS8hB,EAAO2O,qBAC9B9G,EACGxoB,SAASA,IAATA,OACK2gB,EAAOsO,4BAAmBtO,EAAO2O,0DAAiD6F,SAEvF90B,SAASsgB,EAAOyO,2BAEnB5G,EACGxoB,SAASA,IAATA,OACK2gB,EAAOsO,uBAActO,EAAO2O,yDAAgD6F,SAEjF90B,SAASsgB,EAAOyO,4BAIvB,IAAIgG,EAAYF,EACbxX,QAAQA,IAARA,OAAYiD,EAAOsO,aACnBjS,GAAG,GACH3c,SAASsgB,EAAO4O,gBACf5O,EAAOwD,MAA6B,IAArBiR,EAAUx7B,SAC3Bw7B,EAAYzJ,EAAO3O,GAAG,IACZ3c,SAASsgB,EAAO4O,gBAG5B,IAAI8F,EAAYH,EACbpX,QAAQA,IAARA,OAAY6C,EAAOsO,aACnBjS,GAAG,GACH3c,SAASsgB,EAAO8O,gBACf9O,EAAOwD,MAA6B,IAArBkR,EAAUz7B,SAC3By7B,EAAY1J,EAAO3O,IAAI,IACb3c,SAASsgB,EAAO8O,gBAExB9O,EAAOwD,OAELiR,EAAUv2B,SAAS8hB,EAAO2O,qBAC5B9G,EACGxoB,SAASA,IAATA,OACK2gB,EAAOsO,4BACTtO,EAAO2O,0DACqB8F,EAAU3yB,KAAK,kCAE9CpC,SAASsgB,EAAO6O,yBAEnBhH,EACGxoB,SAASA,IAATA,OACK2gB,EAAOsO,uBACTtO,EAAO2O,yDACoB8F,EAAU3yB,KAAK,kCAE7CpC,SAASsgB,EAAO6O,yBAEjB6F,EAAUx2B,SAAS8hB,EAAO2O,qBAC5B9G,EACGxoB,SAASA,IAATA,OACK2gB,EAAOsO,4BACTtO,EAAO2O,0DACqB+F,EAAU5yB,KAAK,kCAE9CpC,SAASsgB,EAAO+O,yBAEnBlH,EACGxoB,SAASA,IAATA,OACK2gB,EAAOsO,uBACTtO,EAAO2O,yDACoB+F,EAAU5yB,KAAK,kCAE7CpC,SAASsgB,EAAO+O,0BAGvBnP,EAAO+U,qBP3EP/L,kBQlBa,SAA2BgM,GAClChV,IAWFsT,EAXEtT,EAASvqB,KACT0qB,EAAYH,EAAO6G,aAAe7G,EAAOG,WAAaH,EAAOG,UAEjEkJ,EAMErJ,EAPEqJ,WAEJyB,EAKE9K,EAPE8K,SAGJ1K,EAIEJ,EAPEI,OAIS+C,EAGXnD,EAHFkD,YACW+R,EAETjV,EAFF4U,UACWM,EACTlV,EADFsT,UAEEpQ,EAAc8R,EAElB,QAAI,IAAO9R,EAA6B,CACtC,IAAK,IAAI1vB,EAAI,EAAGA,EAAI61B,EAAWhwB,OAAQ7F,GAAK,WAC/B61B,EAAW71B,EAAI,GAEtB2sB,GAAakJ,EAAW71B,IACxB2sB,EAAYkJ,EAAW71B,EAAI,IAAM61B,EAAW71B,EAAI,GAAK61B,EAAW71B,IAAM,EAEtE0vB,EAAc1vB,EACL2sB,GAAakJ,EAAW71B,IAAM2sB,EAAYkJ,EAAW71B,EAAI,KAClE0vB,EAAc1vB,EAAI,GAEX2sB,GAAakJ,EAAW71B,KACjC0vB,EAAc1vB,GAId4sB,EAAOyN,sBACL3K,EAAc,QAAK,IAAOA,KAA6BA,EAAc,GAG7E,GAAI4H,EAAS3oB,QAAQge,IAAc,EACjCmT,EAAYxI,EAAS3oB,QAAQge,OACxB,CACL,IAAMgV,EAAOj/B,KAAKG,IAAI+pB,EAAO2J,mBAAoB7G,GACjDoQ,EAAY6B,EAAOj/B,KAAKgF,OAAOgoB,EAAciS,GAAQ/U,EAAO4J,gBAG9D,GADIsJ,GAAaxI,EAASzxB,SAAQi6B,EAAYxI,EAASzxB,OAAS,GAC5D6pB,IAAgBC,EAApB,CASA,IAAMyR,EAAYh7B,SAChBomB,EAAOoL,OAAO3O,GAAGyG,GAAahhB,KAAK,4BAA8BghB,EACjE,IAGFhvB,OAAO0xB,OAAO5F,EAAQ,CACpBsT,YACAsB,YACAzR,gBACAD,gBAEFlD,EAAOoD,KAAK,qBACZpD,EAAOoD,KAAK,mBACR6R,IAAsBL,GACxB5U,EAAOoD,KAAK,oBAEVpD,EAAOoV,aAAepV,EAAOI,OAAOiP,qBACtCrP,EAAOoD,KAAK,oBAzBRkQ,IAAc4B,IAChBlV,EAAOsT,UAAYA,EACnBtT,EAAOoD,KAAK,qBRxBhBqG,mBSjBa,SAA4B9zB,GACzC,IAIIq9B,EAJEhT,EAASvqB,KACT2qB,EAASJ,EAAOI,OAChB+R,EAAQv5B,EAAEjD,EAAEif,QAAQ1U,QAAQA,IAARA,OAAYkgB,EAAOsO,aAAc,GACvD2G,KAGJ,GAAIlD,EACF,IAAK,IAAI3+B,EAAI,EAAGA,EAAIwsB,EAAOoL,OAAO/xB,OAAQ7F,GAAK,EAC7C,GAAIwsB,EAAOoL,OAAO53B,KAAO2+B,EAAO,CAC9BkD,KACArC,EAAax/B,EACb,MAKN,IAAI2+B,IAASkD,EAUX,OAFArV,EAAOsV,kBAAeA,OACtBtV,EAAOuV,kBAAeA,GARtBvV,EAAOsV,aAAenD,EAClBnS,EAAOkR,SAAWlR,EAAOI,OAAO8Q,QAAQ1N,QAC1CxD,EAAOuV,aAAe37B,SAAShB,EAAEu5B,GAAOjwB,KAAK,2BAA4B,IAEzE8d,EAAOuV,aAAevC,EAQxB5S,EAAO8N,8BACPlO,EAAOuV,cACPvV,EAAOuV,eAAiBvV,EAAOkD,aAE/BlD,EAAOkO,wBXLT/N,UYzBa,CACbpC,aCLa,WAA+D,IAAnCI,yDAAO1oB,KAAKgyB,eAAiB,IAAM,IAGpErH,EAFO3qB,KAET2qB,OAAwBwG,EAFfnxB,KAECoxB,aAAmB1G,EAFpB1qB,KAET0qB,UAAwC8H,EAF/BxyB,KAETwyB,WAEN,GAAI7H,EAAOiN,iBACT,OAAOzG,GAAOzG,EAAYA,EAE5B,GAAIC,EAAOuD,QACT,OAAOxD,EAGT,IAAIsI,EAAmB1K,EAAakK,EAAW,GAAI9J,GAGnD,OAFIyI,IAAK6B,GAAoBA,GAEtBA,GAAoB,GDT3BU,aERa,SAAsBhJ,EAAWqV,GACxCxV,MAASvqB,KACOmxB,EAAiD5G,EAA/D6G,aAAmBzG,EAA4CJ,EAAjEI,OAA6B6H,EAAoCjI,EAAjEiI,WAAyC3H,EAAwBN,EAAjEM,UAAoDM,EAAaZ,EAAjEY,SACFtV,EAAI,EACJmqB,EAAI,EAGJzV,EAAOyH,eACTnc,EAAIsb,GAAOzG,EAAYA,EAEvBsV,EAAItV,EAGFC,EAAO2N,eACTziB,EAAIpV,KAAKgF,MAAMoQ,GACfmqB,EAAIv/B,KAAKgF,MAAMu6B,IAGbrV,EAAOuD,QACTrD,EAAUN,EAAOyH,eAAiB,aAAe,aAAezH,EAAOyH,gBAAkBnc,GAAKmqB,EACpFrV,EAAOiN,kBACjBpF,EAAW5O,UAAUA,eAAVA,OAAyB/N,iBAAQmqB,eAE9CzV,EAAOgM,kBAAoBhM,EAAOG,UAClCH,EAAOG,UAAYH,EAAOyH,eAAiBnc,EAAImqB,EAI/C,IAAMxJ,EAAiBjM,EAAOmH,eAAiBnH,EAAOoH,gBAC/B,IAAnB6E,EACY,GAEC9L,EAAYH,EAAOoH,gBAAkB6E,KAElCrL,GAClBZ,EAAOkJ,eAAe/I,GAGxBH,EAAOoD,KAAK,eAAgBpD,EAAOG,UAAWqV,IF7B9CpO,aGTa,WACb,OAAQ3xB,KAAKq1B,SAAS,IHStB3D,aIVa,WACb,OAAQ1xB,KAAKq1B,SAASr1B,KAAKq1B,SAASzxB,OAAS,IJU7Cq8B,YKTa,WAKbC,IAJAxV,yDAAY,EACZE,yDAAQ5qB,KAAK2qB,OAAOC,MACpB2C,6DACA4S,6DACAD,yCAEM3V,EAASvqB,KAEP2qB,EAAsBJ,EAAxBI,OAAUE,EAAcN,EAAxBM,UAEN,GAAIN,EAAOyD,WAAarD,EAAOsD,+BAC7B,OAAO,EAGT,IAEImS,EAFEzO,EAAepH,EAAOoH,eACtBD,EAAenH,EAAOmH,eAS5B,GAPiD0O,EAA7CD,GAAmBzV,EAAYiH,EAA6BA,EACvDwO,GAAmBzV,EAAYgH,EAA6BA,EACjDhH,EAGpBH,EAAOkJ,eAAe2M,GAElBzV,EAAOuD,QAAS,CAClB,IAAMmS,EAAM9V,EAAOyH,eACnB,GAAc,IAAVpH,EACFC,EAAUwV,EAAM,aAAe,cAAgBD,MAC1C,OACL,IAAK7V,EAAOzH,QAAQ6I,aAElB,OADAtB,EAAqB,CAAEE,SAAQC,gBAAiB4V,EAAc9V,KAAM+V,EAAM,OAAS,WAGrFxV,EAAUW,iBACP6U,EAAM,OAAS,OAASD,kBACf,cAGd,OAAO,EAiDT,OA9Cc,IAAVxV,GACFL,EAAOgI,cAAc,GACrBhI,EAAOmJ,aAAa0M,GAChB7S,IACFhD,EAAOoD,KAAK,wBAAyB/C,EAAOsV,GAC5C3V,EAAOoD,KAAK,oBAGdpD,EAAOgI,cAAc3H,GACrBL,EAAOmJ,aAAa0M,GAChB7S,IACFhD,EAAOoD,KAAK,wBAAyB/C,EAAOsV,GAC5C3V,EAAOoD,KAAK,oBAETpD,EAAOyD,YACVzD,EAAOyD,WAAYA,EACdzD,EAAO+V,oCACV/V,EAAO+V,kCAAoC,SAAuBpgC,GAC3DqqB,IAAUA,EAAO2J,WAClBh0B,EAAEif,SAAWnf,OACjBuqB,EAAOiI,WAAW,GAAGnT,oBACnB,gBACAkL,EAAO+V,mCAET/V,EAAOiI,WAAW,GAAGnT,oBACnB,sBACAkL,EAAO+V,mCAET/V,EAAO+V,kCAAoC,YACpC/V,EAAO+V,kCACV/S,GACFhD,EAAOoD,KAAK,oBAIlBpD,EAAOiI,WAAW,GAAGpa,iBACnB,gBACAmS,EAAO+V,mCAET/V,EAAOiI,WAAW,GAAGpa,iBACnB,sBACAmS,EAAO+V,0CjBrDbzc,WkB5Ba,CACb0O,cCLa,SAAuBzO,EAAUic,GAC9C,IAAMxV,EAASvqB,KAEVuqB,EAAOI,OAAOuD,SACjB3D,EAAOiI,WAAW3O,WAAWC,GAG/ByG,EAAOoD,KAAK,gBAAiB7J,EAAUic,IDDvCQ,gBEJa,WAA8C/S,IAArBD,6DAAqBC,yCACrDjD,EAASvqB,KACP2qB,EAAWJ,EAAbI,OACFA,EAAOuD,UACPvD,EAAO+M,YACTnN,EAAO0T,mBAGT5Q,EAAe,CAAE9C,SAAQgD,eAAcC,YAAWF,KAAM,YFHxD7H,cGLa,WAA4C+H,IAArBD,6DAAqBC,yCACnDjD,EAASvqB,KACP2qB,EAAWJ,EAAbI,OACNJ,EAAOyD,WAAYA,EACfrD,EAAOuD,UACX3D,EAAOgI,cAAc,GAErBlF,EAAe,CAAE9C,SAAQgD,eAAcC,YAAWF,KAAM,WrBwBxDoP,MsBzBa,CACb9H,QCPa,WAKb4L,IAJAv4B,yDAAQ,EACR2iB,yDAAQ5qB,KAAK2qB,OAAOC,MACpB2C,6DACA2S,yCACAM,yCAEA,GAAqB,iBAAVv4B,GAAuC,iBAAVA,EACtC,MAAM,IAAIw4B,MAAMA,2EAANA,SAC0Ex4B,gBAItF,GAAqB,iBAAVA,EAAoB,CAK7B,IAAMy4B,EAAgBv8B,SAAS8D,EAAO,IAStC,IAFsB04B,SAASD,GAG7B,MAAM,IAAID,MAAMA,sEAANA,OAC8Dx4B,eAM1EA,EAAQy4B,EAGV,IAAMnW,EAASvqB,KACXu9B,EAAat1B,EACbs1B,EAAa,IAAGA,EAAa,GAEjC,IACE5S,EAQEJ,EATEI,OAEJ0K,EAOE9K,EATE8K,SAGJzB,EAMErJ,EATEqJ,WAIJlG,EAKEnD,EATEmD,cAKJD,EAIElD,EATEkD,YAMU0D,EAGZ5G,EAHF6G,aACAvG,EAEEN,EATEM,UAQJkD,EACExD,EATEwD,QAWN,GACGxD,EAAOyD,WAAarD,EAAOsD,iCAC1BF,IAAYmS,IAAaM,EAE3B,OAAO,EAGT,IAAMd,EAAOj/B,KAAKG,IAAI2pB,EAAOI,OAAO2J,mBAAoBiJ,GACpDM,EAAY6B,EAAOj/B,KAAKgF,OAAO83B,EAAamC,GAAQnV,EAAOI,OAAO4J,gBAClEsJ,GAAaxI,EAASzxB,SAAQi6B,EAAYxI,EAASzxB,OAAS,IAE3D6pB,GAAe9C,EAAO4M,cAAgB,MAAQ7J,GAAiB,IAAMH,GACxEhD,EAAOoD,KAAK,0BAGd,IA8CIH,EA9CE9C,GAAa2K,EAASwI,GAM5B,GAHAtT,EAAOkJ,eAAe/I,GAGlBC,EAAOyN,oBACT,IAAK,IAAIr6B,EAAI,EAAGA,EAAI61B,EAAWhwB,OAAQ7F,GAAK,EAAG,CAC7C,IAAM6iC,GAAuBngC,KAAKgF,MAAkB,IAAZilB,GAClCmW,EAAiBpgC,KAAKgF,MAAsB,IAAhBmuB,EAAW71B,IACvC+iC,EAAqBrgC,KAAKgF,MAA0B,IAApBmuB,EAAW71B,EAAI,aAC1C61B,EAAW71B,EAAI,GAEtB6iC,GAAuBC,GACvBD,EAAsBE,GAAsBA,EAAqBD,GAAkB,EAEnFtD,EAAax/B,EAEb6iC,GAAuBC,GACvBD,EAAsBE,IAEtBvD,EAAax/B,EAAI,GAEV6iC,GAAuBC,IAChCtD,EAAax/B,GAKnB,GAAIwsB,EAAOoV,aAAepC,IAAe9P,EAAa,CACpD,IACGlD,EAAOoI,gBACRjI,EAAYH,EAAOG,WACnBA,EAAYH,EAAOoH,eAEnB,OAAO,EAET,IACGpH,EAAOqI,gBACRlI,EAAYH,EAAOG,WACnBA,EAAYH,EAAOmH,iBAEdjE,GAAe,KAAO8P,EAAY,OAAO,EAUlD,GAL8B/P,EAA1B+P,EAAa9P,EAAyB,OACjC8P,EAAa9P,EAAyB,OAC9B,QAGZ0D,IAAQzG,IAAcH,EAAOG,YAAgByG,GAAOzG,IAAcH,EAAOG,UAc5E,OAbAH,EAAOgJ,kBAAkBgK,GAErB5S,EAAO+M,YACTnN,EAAO0T,mBAET1T,EAAOiJ,sBACe,UAAlB7I,EAAOkN,QACTtN,EAAOmJ,aAAahJ,GAEJ,UAAd8C,IACFjD,EAAOgW,gBAAgBhT,EAAcC,GACrCjD,EAAO9E,cAAc8H,EAAcC,OAIvC,GAAI7C,EAAOuD,QAAS,CAClB,IAAMmS,EAAM9V,EAAOyH,eACb/yB,EAAIkyB,EAAMzG,GAAaA,EAC7B,GAAc,IAAVE,EAAa,CACf,IAAM4Q,EAAYjR,EAAOkR,SAAWlR,EAAOI,OAAO8Q,QAAQ1N,QACtDyN,IACFjR,EAAOM,UAAU9K,MAAM+K,eAAiB,OACxCP,EAAOwW,mBAAoBA,GAE7BlW,EAAUwV,EAAM,aAAe,aAAephC,EAC1Cu8B,GACFla,uBAAsB,WACpBiJ,EAAOM,UAAU9K,MAAM+K,eAAiB,GACxCP,EAAOyW,yBAA0BA,SAGhC,OACL,IAAKzW,EAAOzH,QAAQ6I,aAElB,OADAtB,EAAqB,CAAEE,SAAQC,eAAgBvrB,EAAGqrB,KAAM+V,EAAM,OAAS,WAGzExV,EAAUW,iBACP6U,EAAM,OAAS,MAAQphC,kBACd,cAGd,OAAO,EA6CT,OA1Cc,IAAV2rB,GACFL,EAAOgI,cAAc,GACrBhI,EAAOmJ,aAAahJ,GACpBH,EAAOgJ,kBAAkBgK,GACzBhT,EAAOiJ,sBACPjJ,EAAOoD,KAAK,wBAAyB/C,EAAOsV,GAC5C3V,EAAOgW,gBAAgBhT,EAAcC,GACrCjD,EAAO9E,cAAc8H,EAAcC,KAEnCjD,EAAOgI,cAAc3H,GACrBL,EAAOmJ,aAAahJ,GACpBH,EAAOgJ,kBAAkBgK,GACzBhT,EAAOiJ,sBACPjJ,EAAOoD,KAAK,wBAAyB/C,EAAOsV,GAC5C3V,EAAOgW,gBAAgBhT,EAAcC,GAChCjD,EAAOyD,YACVzD,EAAOyD,WAAYA,EACdzD,EAAO0W,gCACV1W,EAAO0W,8BAAgC,SAAuB/gC,GACvDqqB,IAAUA,EAAO2J,WAClBh0B,EAAEif,SAAWnf,OACjBuqB,EAAOiI,WAAW,GAAGnT,oBACnB,gBACAkL,EAAO0W,+BAET1W,EAAOiI,WAAW,GAAGnT,oBACnB,sBACAkL,EAAO0W,+BAET1W,EAAO0W,8BAAgC,YAChC1W,EAAO0W,8BACd1W,EAAO9E,cAAc8H,EAAcC,MAGvCjD,EAAOiI,WAAW,GAAGpa,iBAAiB,gBAAiBmS,EAAO0W,+BAC9D1W,EAAOiI,WAAW,GAAGpa,iBACnB,sBACAmS,EAAO0W,qCDlMbC,YEVa,WAIbhB,IAHAj4B,yDAAQ,EACR2iB,yDAAQ5qB,KAAK2qB,OAAOC,MACpB2C,6DACA2S,yCAEM3V,EAASvqB,KACXmhC,EAAWl5B,EAKf,OAJIsiB,EAAOI,OAAOwD,OAChBgT,GAAY5W,EAAOsO,cAGdtO,EAAOqK,QAAQuM,EAAUvW,EAAO2C,EAAc2S,IFDrDkB,UGVa,WAAmElB,IAAhDtV,yDAAQ5qB,KAAK2qB,OAAOC,MAAO2C,6DAAqB2S,yCAC1E3V,EAASvqB,KACPguB,EAA+BzD,EAAjCyD,UAAaD,EAAoBxD,EAAjCwD,QAAsBpD,EAAWJ,EAAjCI,OACN,IAAKoD,EAAS,OAAOxD,EACrB,IAAI8W,EAAW1W,EAAO4J,eACO,SAAzB5J,EAAO4K,eAAsD,IAA1B5K,EAAO4J,gBAAwB5J,EAAOqN,qBAC3EqJ,EAAW5gC,KAAKC,IAAI6pB,EAAO+W,qBAAqB,cAAkB,IAEpE,IAAM9M,EAAYjK,EAAOkD,YAAc9C,EAAO2J,mBAAqB,EAAI+M,EACvE,GAAI1W,EAAOwD,KAAM,CACf,GAAIH,GAAarD,EAAOoO,kBAAmB,OAAO,EAClDxO,EAAO6D,UAEP7D,EAAOgX,YAAchX,EAAOiI,WAAW,GAAGpM,WAE5C,OAAOmE,EAAOqK,QAAQrK,EAAOkD,YAAc+G,EAAW5J,EAAO2C,EAAc2S,IHJ3EsB,UIXa,WAAmEtB,IAAhDtV,yDAAQ5qB,KAAK2qB,OAAOC,MAAO2C,6DAAqB2S,yCAC1E3V,EAASvqB,KACP2qB,EAAmEJ,EAArEI,OAAUqD,EAA2DzD,EAArEyD,UAAqBqH,EAAgD9K,EAArE8K,SAA+BzB,EAAsCrJ,EAArEqJ,WAA2CxC,EAA0B7G,EAArE6G,aAAyDrD,EAAYxD,EAArEwD,QACN,IAAKA,EAAS,OAAOxD,EAErB,GAAII,EAAOwD,KAAM,CACf,GAAIH,GAAarD,EAAOoO,kBAAmB,OAAO,EAClDxO,EAAO6D,UAEP7D,EAAOgX,YAAchX,EAAOiI,WAAW,GAAGpM,WAI5C,SAASqb,EAAU51B,GACjB,OAAIA,EAAM,GAAWpL,KAAKgF,MAAMhF,KAAKyxB,IAAIrmB,IAClCpL,KAAKgF,MAAMoG,GAEpB,IAKM61B,EALAd,EAAsBa,EANVrQ,EAAe7G,EAAOG,WAAaH,EAAOG,WAOtDiX,EAAqBtM,EAASvlB,KAAKjE,mBAAQ41B,EAAU51B,MAEvD+1B,EAAWvM,EAASsM,EAAmBj1B,QAAQk0B,GAAuB,QACtE,IAAOgB,GAA4BjX,EAAOuD,UAE5CmH,EAASvrB,SAAQ,SAAC6zB,EAAME,GAClB+C,GAAuBjD,IAEzB+D,EAAgB7D,eAGT6D,IACTE,EAAWvM,EAASqM,EAAgB,EAAIA,EAAgB,EAAIA,KAGhE,IAAIG,EAAY,EAahB,YAAO,IAZID,KACTC,EAAYjO,EAAWlnB,QAAQk1B,IACf,IAAGC,EAAYtX,EAAOkD,YAAc,GAEzB,SAAzB9C,EAAO4K,eACmB,IAA1B5K,EAAO4J,gBACP5J,EAAOqN,qBAEP6J,EAAYA,EAAYtX,EAAO+W,qBAAqB,eAAoB,EACxEO,EAAYphC,KAAKC,IAAImhC,EAAW,KAG7BtX,EAAOqK,QAAQiN,EAAWjX,EAAO2C,EAAc2S,IJlCtD4B,WKZa,WAAoE5B,IAAhDtV,yDAAQ5qB,KAAK2qB,OAAOC,MAAO2C,6DAAqB2S,yCAEjF,OADelgC,KACD40B,QADC50B,KACcytB,YAAa7C,EAAO2C,EAAc2S,ILW/D6B,eMba,WAID,IAHZnX,yDAAQ5qB,KAAK2qB,OAAOC,MACpB2C,6DACA2S,yCACAxP,yDAAY,GAENnG,EAASvqB,KACXiI,EAAQsiB,EAAOkD,YACbiS,EAAOj/B,KAAKG,IAAI2pB,EAAOI,OAAO2J,mBAAoBrsB,GAClD41B,EAAY6B,EAAOj/B,KAAKgF,OAAOwC,EAAQy3B,GAAQnV,EAAOI,OAAO4J,gBAE7D7J,EAAYH,EAAO6G,aAAe7G,EAAOG,WAAaH,EAAOG,UAEnE,GAAIA,GAAaH,EAAO8K,SAASwI,GAAY,CAG3C,IAAMmE,EAAczX,EAAO8K,SAASwI,GAEhCnT,EAAYsX,GADCzX,EAAO8K,SAASwI,EAAY,GACHmE,GAAetR,IACvDzoB,GAASsiB,EAAOI,OAAO4J,oBAEpB,CAGL,IAAMqN,EAAWrX,EAAO8K,SAASwI,EAAY,GAEzCnT,EAAYkX,IADIrX,EAAO8K,SAASwI,GACO+D,GAAYlR,IACrDzoB,GAASsiB,EAAOI,OAAO4J,gBAM3B,OAHAtsB,EAAQxH,KAAKC,IAAIuH,EAAO,GACxBA,EAAQxH,KAAKG,IAAIqH,EAAOsiB,EAAOqJ,WAAWhwB,OAAS,GAE5C2mB,EAAOqK,QAAQ3sB,EAAO2iB,EAAO2C,EAAc2S,INnBlDzH,oBOZa,WACPlO,IAMF4U,EANE5U,EAASvqB,KACP2qB,EAAuBJ,EAAzBI,OAAU6H,EAAejI,EAAzBiI,WAEA+C,EACqB,SAAzB5K,EAAO4K,cAA2BhL,EAAO+W,uBAAyB3W,EAAO4K,cACvE0M,EAAe1X,EAAOuV,aAE1B,GAAInV,EAAOwD,KAAM,CACf,GAAI5D,EAAOyD,UAAW,OACtBmR,EAAYh7B,SAAShB,EAAEonB,EAAOsV,cAAcpzB,KAAK,2BAA4B,IACzEke,EAAO+K,eAEPuM,EAAe1X,EAAOsO,aAAetD,EAAgB,GACrD0M,EAAe1X,EAAOoL,OAAO/xB,OAAS2mB,EAAOsO,aAAetD,EAAgB,GAE5EhL,EAAO6D,UACP6T,EAAezP,EACZxoB,SAASA,IAATA,OACK2gB,EAAOsO,gDAAuCkG,qBAAoBxU,EAAO2O,0BAE9EtS,GAAG,GACH/e,QAEHmgB,GAAS,WACPmC,EAAOqK,QAAQqN,OAGjB1X,EAAOqK,QAAQqN,GAERA,EAAe1X,EAAOoL,OAAO/xB,OAAS2xB,GAC/ChL,EAAO6D,UACP6T,EAAezP,EACZxoB,SAASA,IAATA,OACK2gB,EAAOsO,gDAAuCkG,qBAAoBxU,EAAO2O,0BAE9EtS,GAAG,GACH/e,QAEHmgB,GAAS,WACPmC,EAAOqK,QAAQqN,OAGjB1X,EAAOqK,QAAQqN,QAGjB1X,EAAOqK,QAAQqN,K7BfjB9T,K8B9Ba,CACb+T,WCFa,WACP3X,MAASvqB,KACT6K,EAAW2V,IACTmK,EAAuBJ,EAAzBI,OAAU6H,EAAejI,EAAzBiI,WAENA,EAAWxoB,SAASA,IAATA,OAAa2gB,EAAOsO,uBAActO,EAAO2O,sBAAuBhzB,SAE3E,IAAIqvB,EAASnD,EAAWxoB,SAASA,IAATA,OAAa2gB,EAAOsO,aAE5C,GAAItO,EAAOmO,uBAAwB,CACjC,IAAMqJ,EAAiBxX,EAAO4J,eAAkBoB,EAAO/xB,OAAS+mB,EAAO4J,eACvE,GAAI4N,IAAmBxX,EAAO4J,eAAgB,CAC5C,IAAK,IAAIx2B,EAAI,EAAGA,EAAIokC,EAAgBpkC,GAAK,EAAG,CAC1C,IAAMqkC,EAAYj/B,EAAE0H,EAASgN,cAAc,QAAQxN,SAASA,GAATA,OAC9CsgB,EAAOsO,uBAActO,EAAOuO,kBAEjC1G,EAAWzkB,OAAOq0B,GAEpBzM,EAASnD,EAAWxoB,SAASA,IAATA,OAAa2gB,EAAOsO,cAIf,SAAzBtO,EAAO4K,eAA6B5K,EAAOkO,eAAclO,EAAOkO,aAAelD,EAAO/xB,QAE1F2mB,EAAOsO,aAAep4B,KAAK69B,KAAKvY,WAAW4E,EAAOkO,cAAgBlO,EAAO4K,cAAe,KACxFhL,EAAOsO,cAAgBlO,EAAOiO,qBAC1BrO,EAAOsO,aAAelD,EAAO/xB,SAC/B2mB,EAAOsO,aAAelD,EAAO/xB,QAG/B,IAAMy+B,EAAgB,GAChBC,EAAe,GACrB3M,EAAOniB,MAAK,SAACoI,EAAI3T,GACf,IAAMy0B,EAAQv5B,EAAEyY,GACZ3T,EAAQsiB,EAAOsO,cACjByJ,EAAa7uB,KAAKmI,GAEhB3T,EAAQ0tB,EAAO/xB,QAAUqE,GAAS0tB,EAAO/xB,OAAS2mB,EAAOsO,cAC3DwJ,EAAc5uB,KAAKmI,GAErB8gB,EAAMjwB,KAAK,0BAA2BxE,MAExC,IAAK,IAAIlK,EAAI,EAAGA,EAAIukC,EAAa1+B,OAAQ7F,GAAK,EAC5Cy0B,EAAWzkB,OAAO5K,EAAEm/B,EAAavkC,GAAGwkC,WAAUA,IAAOl4B,SAASsgB,EAAO2O,sBAEvE,IAAK,IAAIv7B,EAAIskC,EAAcz+B,OAAS,EAAG7F,GAAK,EAAGA,GAAK,EAClDy0B,EAAWlL,QAAQnkB,EAAEk/B,EAActkC,GAAGwkC,WAAUA,IAAOl4B,SAASsgB,EAAO2O,uBD3CzElL,QENa,WACb,IAAM7D,EAASvqB,KAEfuqB,EAAOoD,KAAK,iBAEZ,IASIwT,EARF1T,EAOElD,EAREkD,YAEJkI,EAMEpL,EAREoL,OAGJkD,EAKEtO,EAREsO,aAIJjG,EAIErI,EAREqI,eAKJD,EAGEpI,EAREoI,eAMJ0C,EAEE9K,EARE8K,SAOUlE,EACZ5G,EADF6G,aAGF7G,EAAOqI,gBAAiBA,EACxBrI,EAAOoI,gBAAiBA,EAExB,IACMG,GADiBuC,EAAS5H,GACHlD,EAAOjC,eAGhCmF,EAAcoL,GAChBsI,EAAWxL,EAAO/xB,OAAwB,EAAfi1B,EAAmBpL,EAC9C0T,GAAYtI,EACStO,EAAOqK,QAAQuM,EAAU,GAAG,OACpB,IAATrO,GAClBvI,EAAOmJ,cAAcvC,GAAO5G,EAAOG,UAAYH,EAAOG,WAAaoI,IAE5DrF,GAAekI,EAAO/xB,OAASi1B,IAExCsI,GAAYxL,EAAO/xB,OAAS6pB,EAAcoL,EAC1CsI,GAAYtI,EACStO,EAAOqK,QAAQuM,EAAU,GAAG,OACpB,IAATrO,GAClBvI,EAAOmJ,cAAcvC,GAAO5G,EAAOG,UAAYH,EAAOG,WAAaoI,IAGvEvI,EAAOqI,eAAiBA,EACxBrI,EAAOoI,eAAiBA,EAExBpI,EAAOoD,KAAK,YFlCZ6U,YGPa,eAELhQ,EADOxyB,KACTwyB,WAAc7H,EADL3qB,KACT2qB,OAAsBgL,EADb31B,KACT21B,OACNnD,EACGxoB,SAASA,IAATA,OACK2gB,EAAOsO,uBAActO,EAAO2O,iCAAwB3O,EAAOsO,uBAActO,EAAOuO,kBAErF5yB,SACHqvB,EAAOxoB,WAAW,6BjC2BlBulB,WkChCa,CACbG,cCJa,SAAuB4P,GACpC,IAAMlY,EAASvqB,KACf,KACEuqB,EAAOzH,QAAQ8I,QACdrB,EAAOI,OAAO4N,eACdhO,EAAOI,OAAOqL,eAAiBzL,EAAOmY,UACvCnY,EAAOI,OAAOuD,SAJhB,CAOA,IAAMtS,EAAyC,cAApC2O,EAAOI,OAAO4D,kBAAoChE,EAAO3O,GAAK2O,EAAOM,UAChFjP,EAAGmE,MAAM4iB,OAAS,OAClB/mB,EAAGmE,MAAM4iB,OAASF,EAAS,mBAAqB,eAChD7mB,EAAGmE,MAAM4iB,OAASF,EAAS,eAAiB,YAC5C7mB,EAAGmE,MAAM4iB,OAASF,EAAS,WAAa,SDRxCG,gBELa,WACb,IAAMrY,EAASvqB,KAEbuqB,EAAOzH,QAAQ8I,OACdrB,EAAOI,OAAOqL,eAAiBzL,EAAOmY,UACvCnY,EAAOI,OAAOuD,UAIhB3D,EAA2C,cAApCA,EAAOI,OAAO4D,kBAAoC,KAAO,aAAaxO,MAAM4iB,OAAS,MpC2B5Fje,OJsDa,CACbme,aA7BF,WACQtY,MAASvqB,KACT6K,EAAW2V,IACTmK,EAAoBJ,EAAtBI,OAAU7H,EAAYyH,EAAtBzH,QAENyH,EAAOqD,aAAeA,EAAaruB,KAAKgrB,GACxCA,EAAO2G,YAAcA,EAAY3xB,KAAKgrB,GACtCA,EAAOoJ,WAAaA,EAAWp0B,KAAKgrB,GAEhCI,EAAOuD,UACT3D,EAAO+L,SAAWA,EAAS/2B,KAAKgrB,IAGlCA,EAAO2L,QAAUA,EAAQ32B,KAAKgrB,GAE1BzH,EAAQ8I,QAAU+K,IACpB9rB,EAASuN,iBAAiB,aAAcwe,GACxCD,MAGFjS,EAAO6F,EAAQ,OAUfuY,aAPF,WAEEpe,EADe1kB,KACA,SIlDfm1B,YqClCa,CAAEC,cxCGF,WACP7K,MAASvqB,KACPytB,EAA4DlD,EAA9DkD,YAAekS,EAA+CpV,EAA9DoV,cAA8DpV,EAA9DsO,aAA4BA,aAAe,IAAGlO,EAAgBJ,EAA9DI,OAAsDnf,EAAQ+e,EAA9D/e,IACA2pB,EAAcxK,EAAOwK,YAC3B,GAAKA,KAAgBA,GAAmD,IAApC12B,OAAO+F,KAAK2wB,GAAavxB,QAA7D,CAGA,IAAMm/B,EAAaxY,EAAOyY,cAAc7N,EAAa5K,EAAOI,OAAOmN,gBAAiBvN,EAAO3O,IAE3F,GAAKmnB,GAAcxY,EAAO0Y,oBAAsBF,EAAhD,CAEA,IACMG,GADuBH,KAAc5N,EAAcA,EAAY4N,YACpBxY,EAAO4Y,eAClDC,EAAchM,EAAc7M,EAAQI,GACpC0Y,EAAajM,EAAc7M,EAAQ2Y,GAEnCI,EAAa3Y,EAAOoD,QAEtBqV,IAAgBC,GAClB73B,EAAI5B,YAAYA,GAAZA,OACC+gB,EAAOqO,uCAA8BrO,EAAOqO,uCAEjDzO,EAAOgZ,yBACGH,GAAeC,IACzB73B,EAAInB,SAASA,GAATA,OAAYsgB,EAAOqO,iCAEpBkK,EAAiB7L,KAAKmM,MAAuC,WAA/BN,EAAiB7L,KAAKmM,OACnDN,EAAiB7L,KAAKmM,MAA6B,WAArB7Y,EAAO0M,KAAKmM,OAE5Ch4B,EAAInB,SAASA,GAATA,OAAYsgB,EAAOqO,uCAEzBzO,EAAOgZ,wBAGT,IAAME,EACJP,EAAiB1V,WAAa0V,EAAiB1V,YAAc7C,EAAO6C,UAChEkW,EACJ/Y,EAAOwD,OAAS+U,EAAiB3N,gBAAkB5K,EAAO4K,eAAiBkO,GAEzEA,GAAoB9D,GACtBpV,EAAOoZ,kBAETj9B,EAAO6jB,EAAOI,OAAQuY,GAEtB,IAAMU,EAAYrZ,EAAOI,OAAOoD,QAEhCtvB,OAAO0xB,OAAO5F,EAAQ,CACpBuG,eAAgBvG,EAAOI,OAAOmG,eAC9B6B,eAAgBpI,EAAOI,OAAOgI,eAC9BC,eAAgBrI,EAAOI,OAAOiI,iBAG5B0Q,IAAeM,EACjBrZ,EAAOsZ,WACGP,GAAcM,GACxBrZ,EAAOuZ,SAGTvZ,EAAO0Y,kBAAoBF,EAE3BxY,EAAOoD,KAAK,oBAAqBuV,GAE7BQ,GAAe/D,IACjBpV,EAAOiY,cACPjY,EAAO2X,aACP3X,EAAO+K,eACP/K,EAAOqK,QAAQnH,EAAcoL,EAAetO,EAAOsO,aAAc,GAAG,IAGtEtO,EAAOoD,KAAK,aAAcuV,MwCxEIF,cCDjB,SAAuB7N,GAA8B4O,IAAjB7U,yDAAO,SAAU6U,yCAClE,GAAK5O,IAAyB,cAATjG,GAAyB6U,GAA9C,CACA,IAAIhB,KAEE5iC,EAASqhB,IACTwiB,EAAyB,WAAT9U,EAAoB/uB,EAAOoc,YAAcwnB,EAAYpnB,aAErEsnB,EAASxlC,OAAO+F,KAAK2wB,GAAarlB,KAAKo0B,YAC3C,GAAqB,iBAAVA,GAA6C,IAAvBA,EAAMx3B,QAAQ,KAAY,CACzD,IAAMy3B,EAAWpe,WAAWme,EAAME,OAAO,IAEzC,MAAO,CAAEplC,MADKglC,EAAgBG,EACdD,SAElB,MAAO,CAAEllC,MAAOklC,EAAOA,YAGzBD,EAAOI,MAAK,SAAC3hB,EAAG4hB,UAAMngC,SAASue,EAAE1jB,MAAO,IAAMmF,SAASmgC,EAAEtlC,MAAO,OAChE,IAAK,IAAIjB,EAAI,EAAGA,EAAIkmC,EAAOrgC,OAAQ7F,GAAK,EAAG,OAChBkmC,EAAOlmC,GAAxBmmC,IAAFA,MAASllC,IAATA,MACO,WAATkwB,EACE/uB,EAAOkhB,WAAWA,eAAXA,OAA0BriB,UAAY2nB,UAC/Coc,EAAamB,GAENllC,GAAS+kC,EAAYlnB,cAC9BkmB,EAAamB,GAGjB,OAAOnB,GAAc,StCSrB9M,cuCRa,CAAEA,cA9BjB,WACQ1L,MAASvqB,KACGukC,EAAsBha,EAAhCmY,SAAqB/X,EAAWJ,EAAlCI,OACEuN,EAAuBvN,EAAzBuN,mBAEN,GAAIA,EAAoB,CACtB,IAAMsM,EAAiBja,EAAOoL,OAAO/xB,OAAS,EACxC6gC,EACJla,EAAOqJ,WAAW4Q,GAClBja,EAAO8J,gBAAgBmQ,GACF,EAArBtM,EACF3N,EAAOmY,SAAWnY,EAAO2Q,KAAOuJ,OAEhCla,EAAOmY,SAAsC,IAA3BnY,EAAO8K,SAASzxB,YAEhC+mB,EAAOgI,iBACTpI,EAAOoI,gBAAkBpI,EAAOmY,eAE9B/X,EAAOiI,iBACTrI,EAAOqI,gBAAkBrI,EAAOmY,UAG9B6B,GAAaA,IAAcha,EAAOmY,WACpCnY,EAAOiL,OAAQA,GAEb+O,IAAcha,EAAOmY,UACvBnY,EAAOoD,KAAKpD,EAAOmY,SAAW,OAAS,YvCazCxf,QwCpCa,CAAEwhB,WCaF,WACPna,MAASvqB,KACPmjB,EAAkDoH,EAApDpH,WAAcwH,EAAsCJ,EAApDI,OAAsBwG,EAA8B5G,EAApD4G,IAA2B3lB,EAAyB+e,EAApD/e,IAAgC8gB,EAAoB/B,EAApD+B,OAAwCxJ,EAAYyH,EAApDzH,QAEA6hB,EApBR,SAAwBC,EAASC,GAC/B,IAAMC,EAAgB,GAYtB,OAXAF,EAAQ96B,SAAST,YACK,YAATA,GACT5K,OAAO+F,KAAK6E,GAAMS,SAASqZ,YACrB9Z,EAAK8Z,IACP2hB,EAAcrxB,KAAKoxB,EAAS1hB,MAGP,iBAAT9Z,GAChBy7B,EAAcrxB,KAAKoxB,EAASx7B,MAGzBy7B,EAbT,CAoBkC,CAC9B,cACAna,EAAO6C,UACP,CAAE,kBAAmB1K,EAAQ8I,OAC7B,CAAE,YAAarB,EAAOI,OAAO0I,UAAY1I,EAAO0I,SAAStF,SACzD,CAAEgX,WAAcpa,EAAO+M,YACvB,CAAEvG,IAAOA,GACT,CAAEkG,KAAQ1M,EAAO0M,MAAQ1M,EAAO0M,KAAKC,KAAO,GAC5C,CAAE,cAAe3M,EAAO0M,MAAQ1M,EAAO0M,KAAKC,KAAO,GAA0B,WAArB3M,EAAO0M,KAAKmM,MACpE,CAAEhX,QAAWF,EAAOE,SACpB,CAAED,IAAOD,EAAOC,KAChB,CAAE,WAAY5B,EAAOuD,SACrB,CAAE8W,SAAYra,EAAOuD,SAAWvD,EAAO+K,iBACtC/K,EAAOqO,wBACV7V,EAAW1P,WAAX0P,IAAmBwhB,IACnBn5B,EAAInB,SAAS,EAAI8Y,GAAYhZ,KAAK,MAClCogB,EAAOgZ,wBDjCoB0B,cEHd,eAELz5B,EADOxL,KACTwL,IAAO2X,EADEnjB,KACTmjB,WAEN3X,EAAI5B,YAAYuZ,EAAWhZ,KAAK,MAHjBnK,KAIRujC,yB1CmCPl1B,O2CrCa,CACb62B,UCDa,SAAmBC,EAASztB,EAAK0tB,EAAQC,EAAOC,EAAkB3tB,GAC/E,IACI4tB,EADEplC,EAASqhB,IAEf,SAASgkB,IACH7tB,GAAUA,IAEExU,EAAEgiC,GAASv8B,OAAO,WAAW,IAE3Bu8B,EAAQM,UAAaH,EAmBvCE,IAlBI9tB,IACF6tB,EAAQ,IAAIplC,EAAOghB,OACblJ,OAASutB,EACfD,EAAMG,QAAUF,EACZH,IACFE,EAAMF,MAAQA,GAEZD,IACFG,EAAMH,OAASA,GAEb1tB,IACF6tB,EAAM7tB,IAAMA,IAGd8tB,KDrBJ9M,cELa,WACb,IAAMnO,EAASvqB,KAEf,SAASwlC,IACH,MAAOjb,GAA8CA,IAAUA,EAAO2J,qBACtE3J,EAAOob,eAA4Bpb,EAAOob,cAAgB,GAC1Dpb,EAAOob,eAAiBpb,EAAOqb,aAAahiC,SAC1C2mB,EAAOI,OAAOgO,qBAAqBpO,EAAOwQ,SAC9CxQ,EAAOoD,KAAK,iBANhBpD,EAAOqb,aAAerb,EAAO/e,IAAIpF,KAAK,OAStC,IAAK,IAAIrI,EAAI,EAAGA,EAAIwsB,EAAOqb,aAAahiC,OAAQ7F,GAAK,EAAG,CACtD,IAAMonC,EAAU5a,EAAOqb,aAAa7nC,GACpCwsB,EAAO2a,UACLC,EACAA,EAAQU,YAAcV,EAAQ1hB,aAAa,OAC3C0hB,EAAQC,QAAUD,EAAQ1hB,aAAa,UACvC0hB,EAAQE,OAASF,EAAQ1hB,aAAa,YAEtC+hB,O7CwBAM,EAAmB,GAEnBC,aACJ7mB,aAAerd,QACT+Z,EACA+O,EAFS9oB,UAiBb,2BAjBaA,6CAiBb,GAbkB,IAAhBA,EAAK+B,QACL/B,EAAK,GAAGqd,aACiD,WAAzDzgB,OAAOkB,UAAU0I,SAASnK,KAAK2D,EAAK,IAAI8F,MAAM,GAAI,GAElDgjB,EAAS9oB,EAAK,IAEb+Z,GAAc/Z,UAAd+Z,GAAI+O,QAEFA,IAAQA,EAAS,IAEtBA,EAASjkB,EAAO,GAAIikB,GAChB/O,IAAO+O,EAAO/O,KAAI+O,EAAO/O,GAAKA,GAE9B+O,EAAO/O,IAAMzY,EAAEwnB,EAAO/O,IAAIhY,OAAS,EAAG,CACxC,IAAMoiC,EAAU,GAKhB,OAJA7iC,EAAEwnB,EAAO/O,IAAIpI,MAAMuwB,YACjB,IAAMkC,EAAYv/B,EAAO,GAAIikB,EAAQ,CAAE/O,GAAImoB,IAC3CiC,EAAQvyB,KAAK,IAAIsyB,EAAOE,OAEnBD,EAIT,IAAMzb,EAASvqB,KACfuqB,EAAOP,YAAaA,EACpBO,EAAOzH,QAAU4I,IACjBnB,EAAO+B,OAASJ,EAAU,CAAEtL,UAAW+J,EAAO/J,YAC9C2J,EAAOvH,QAAUkK,IAEjB3C,EAAOgQ,gBAAkB,GACzBhQ,EAAOqQ,mBAAqB,GAC5BrQ,EAAOtsB,QAAUA,EAAIssB,EAAO2b,aACxBvb,EAAO1sB,SAAWgM,MAAMC,QAAQygB,EAAO1sB,WACzCssB,IAAOtsB,SAAQwV,eAAQkX,EAAO1sB,UAGhC,IAAM87B,EAAmB,GAEzBxP,EAAOtsB,QAAQ6L,SAASq8B,YACtBA,EAAI,CACF5b,SACA6b,aAActM,EAAmBnP,EAAQoP,GACzCjvB,GAAIyf,EAAOzf,GAAGvL,KAAKgrB,GACnBiQ,KAAMjQ,EAAOiQ,KAAKj7B,KAAKgrB,GACvBzF,IAAKyF,EAAOzF,IAAIvlB,KAAKgrB,GACrBoD,KAAMpD,EAAOoD,KAAKpuB,KAAKgrB,QAK3B,IAAM8b,EAAe3/B,EAAO,GAAIuT,EAAU8f,GAiI1C,OA9HAxP,EAAOI,OAASjkB,EAAO,GAAI2/B,EAAcP,EAAkBnb,GAC3DJ,EAAO4Y,eAAiBz8B,EAAO,GAAI6jB,EAAOI,QAC1CJ,EAAO+b,aAAe5/B,EAAO,GAAIikB,GAG7BJ,EAAOI,QAAUJ,EAAOI,OAAO7f,IACjCrM,OAAO+F,KAAK+lB,EAAOI,OAAO7f,IAAIhB,SAASy8B,YACrChc,EAAOzf,GAAGy7B,EAAWhc,EAAOI,OAAO7f,GAAGy7B,OAGtChc,EAAOI,QAAUJ,EAAOI,OAAOgQ,OACjCpQ,EAAOoQ,MAAMpQ,EAAOI,OAAOgQ,OAI7BpQ,EAAOpnB,EAAIA,EAGX1E,OAAO0xB,OAAO5F,EAAQ,CACpBwD,QAASxD,EAAOI,OAAOoD,QACvBnS,KAGAuH,WAAY,GAGZwS,OAAQxyB,IACRywB,WAAY,GACZyB,SAAU,GACVhB,gBAAiB,GAGjBrC,aAAY,iBACyB,eAA5BzH,EAAOI,OAAO6C,WAEvBiE,WAAU,iBAC2B,aAA5BlH,EAAOI,OAAO6C,WAIvBC,YAAa,EACb0R,UAAW,EAGX1J,aAAaA,EACbD,OAAOA,EAGP9K,UAAW,EACX6L,kBAAmB,EACnBpL,SAAU,EACVqb,SAAU,EACVxY,WAAWA,EAGX2E,eAAgBpI,EAAOI,OAAOgI,eAC9BC,eAAgBrI,EAAOI,OAAOiI,eAG9BiE,YAAc,WACZ,IAAMjL,EAAQ,CAAC,aAAc,YAAa,WAAY,eAChD6a,EAAU,CAAC,cAAe,cAAe,aAa/C,OAXAlc,EAAOmc,iBAAmB,CACxBh2B,MAAOkb,EAAM,GACbsL,KAAMtL,EAAM,GACZ1O,IAAK0O,EAAM,GACX/oB,OAAQ+oB,EAAM,IAEhBrB,EAAOoc,mBAAqB,CAC1Bj2B,MAAO+1B,EAAQ,GACfvP,KAAMuP,EAAQ,GACdvpB,IAAKupB,EAAQ,IAERlc,EAAOzH,QAAQ8I,QAAUrB,EAAOI,OAAO4N,cAC1ChO,EAAOmc,iBACPnc,EAAOoc,mBAjBC,GAmBd9Y,gBAAiB,CACfc,eAAWA,EACXC,aAASA,EACTwB,yBAAqBA,EACrBG,oBAAgBA,EAChBF,iBAAaA,EACb2C,sBAAkBA,EAClBV,oBAAgBA,EAChB3B,wBAAoBA,EAEpBC,kBAAmBrG,EAAOI,OAAOiG,kBAEjCqD,cAAe3zB,IACfsmC,kBAAcA,EAEdC,WAAY,GACZpU,yBAAqBA,EACrBjE,kBAAcA,EACd8B,iBAAaA,GAIfhB,YAAYA,EAGZwB,eAAgBvG,EAAOI,OAAOmG,eAE9BhD,QAAS,CACP+B,OAAQ,EACRC,OAAQ,EACRN,SAAU,EACVG,SAAU,EACVmD,KAAM,GAIR8S,aAAc,GACdD,aAAc,IAGhBpb,EAAOoD,KAAK,WAGRpD,EAAOI,OAAOxkB,MAChBokB,EAAOpkB,OAIFokB,E,UA2YWuc,O,EAxYpBhD,E,EA4XqBiD,sCAACC,GACpBtgC,EAAOo/B,EAAkBkB,KAGAlB,oCAQNK,GACdJ,EAAOpmC,UAAUumC,cAAaH,EAAOpmC,UAAUumC,YAAc,IAClE,IAAMjoC,EAAU8nC,EAAOpmC,UAAUumC,YAEd,mBAARC,GAAsBloC,EAAQyO,QAAQy5B,GAAO,GACtDloC,EAAQwV,KAAK0yB,KAIPc,0BAACnpC,GACT,OAAImM,MAAMC,QAAQpM,IAChBA,EAAOgM,SAAS3L,mBAAM4nC,EAAOe,cAAc3oC,MACpC4nC,IAETA,EAAOe,cAAchpC,GACdioC,4CAtBP,OAAOD,IAGU7rB,+BACjB,OAAOA,M,EArYT6pB,gCACE,IAAMvZ,EAASvqB,KACXuqB,EAAOwD,UACXxD,EAAOwD,SAAUA,EACbxD,EAAOI,OAAO+H,YAChBnI,EAAOsI,gBAETtI,EAAOoD,KAAK,aAGdkW,gCACE,IAAMtZ,EAASvqB,KACVuqB,EAAOwD,UACZxD,EAAOwD,SAAUA,EACbxD,EAAOI,OAAO+H,YAChBnI,EAAOqY,kBAETrY,EAAOoD,KAAK,cAGduZ,kCAAY/b,EAAUP,GACpB,IAAML,EAASvqB,KACfmrB,EAAW1qB,KAAKG,IAAIH,KAAKC,IAAIyqB,EAAU,GAAI,GAC3C,IAAMvqB,EAAM2pB,EAAOoH,eAEbzG,GADMX,EAAOmH,eACI9wB,GAAOuqB,EAAWvqB,EACzC2pB,EAAO0V,YAAY/U,WAAgBN,EAAwB,EAAIA,GAC/DL,EAAOgJ,oBACPhJ,EAAOiJ,wBAGT+P,6CACE,IAAMhZ,EAASvqB,KACf,GAAKuqB,EAAOI,OAAOkP,cAAiBtP,EAAO3O,GAA3C,CACA,IAAMurB,EAAM5c,EAAO3O,GAAG0H,UAAUrN,MAAM,KAAKmM,QAAQkB,mBAEf,IAAhCA,EAAU5W,QAAQ,WAC0C,IAA5D4W,EAAU5W,QAAQ6d,EAAOI,OAAOqO,2BAGpCzO,EAAOoD,KAAK,oBAAqBwZ,EAAIh9B,KAAK,SAG5Ci9B,sCAAgBC,GACd,IAAM9c,EAASvqB,KAEf,OAAOqnC,EAAQ/jB,UACZrN,MAAM,KACNmM,QAAQkB,mBAEiC,IAAtCA,EAAU5W,QAAQ,iBAC8B,IAAhD4W,EAAU5W,QAAQ6d,EAAOI,OAAOsO,eAGnC9uB,KAAK,OAGVm1B,0CACE,IAAM/U,EAASvqB,KACf,GAAKuqB,EAAOI,OAAOkP,cAAiBtP,EAAO3O,GAA3C,CACA,IAAM0rB,EAAU,GAChB/c,EAAOoL,OAAOniB,MAAM6zB,YAClB,IAAMlkB,EAAaoH,EAAO6c,gBAAgBC,GAC1CC,EAAQ7zB,KAAK,CAAE4zB,UAASlkB,eACxBoH,EAAOoD,KAAK,cAAe0Z,EAASlkB,MAEtCoH,EAAOoD,KAAK,gBAAiB2Z,MAG/BhG,6CAA+C,IAA1BiG,yDAAO,UAAWC,0DAE7B7c,EADO3qB,KACT2qB,OAAUgL,EADD31B,KACT21B,OAAkB/B,EADT5zB,KACT4zB,WAA8BS,EADrBr0B,KACTq0B,gBAAqDiH,EAD5Ct7B,KACsCk7B,KAAkBzN,EADxDztB,KACTytB,YACFga,EAAM,EACV,GAAI9c,EAAO+K,eAAgB,CAGzB,IAFA,IACIgS,EADApL,EAAY3G,EAAOlI,GAAayP,gBAE3Bn/B,EAAI0vB,EAAc,EAAG1vB,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAChD43B,EAAO53B,KAAO2pC,IAEhBD,GAAO,GADPnL,GAAa3G,EAAO53B,GAAGm/B,iBAEP5B,IAAYoM,OAGhC,IAAK,IAAI3pC,EAAI0vB,EAAc,EAAG1vB,GAAK,EAAGA,GAAK,EACrC43B,EAAO53B,KAAO2pC,IAEhBD,GAAO,GADPnL,GAAa3G,EAAO53B,GAAGm/B,iBAEP5B,IAAYoM,YAKhC,GAAa,YAATH,EACF,IAAK,IAAIxpC,EAAI0vB,EAAc,EAAG1vB,EAAI43B,EAAO/xB,OAAQ7F,GAAK,GAChCypC,EAChB5T,EAAW71B,GAAKs2B,EAAgBt2B,GAAK61B,EAAWnG,GAAe6N,EAC/D1H,EAAW71B,GAAK61B,EAAWnG,GAAe6N,KAE5CmM,GAAO,QAKX,IAAK,IAAI1pC,EAAI0vB,EAAc,EAAG1vB,GAAK,EAAGA,GAAK,EACrB61B,EAAWnG,GAAemG,EAAW71B,GAAKu9B,IAE5DmM,GAAO,GAKf,OAAOA,IAGT1M,+BACE,IAAMxQ,EAASvqB,KACf,GAAKuqB,IAAUA,EAAO2J,UAAtB,CACA,IAAQmB,EAAqB9K,EAAvB8K,SAAY1K,EAAWJ,EAAvBI,OAEFA,EAAOwK,aACT5K,EAAO6K,gBAET7K,EAAOiG,aACPjG,EAAO+K,eACP/K,EAAOkJ,iBACPlJ,EAAOiJ,sBAaHjJ,EAAOI,OAAO0I,UAAY9I,EAAOI,OAAO0I,SAAStF,SACnD2F,IACInJ,EAAOI,OAAO+M,YAChBnN,EAAO0T,sBAI0B,SAAhC1T,EAAOI,OAAO4K,eAA4BhL,EAAOI,OAAO4K,cAAgB,IACzEhL,EAAOiL,QACNjL,EAAOI,OAAO+K,eAEFnL,EAAOqK,QAAQrK,EAAOoL,OAAO/xB,OAAS,EAAG,GAAG,MAE5C2mB,EAAOqK,QAAQrK,EAAOkD,YAAa,GAAG,QAGnDiG,IAGA/I,EAAOqL,eAAiBX,IAAa9K,EAAO8K,UAC9C9K,EAAO0L,gBAET1L,EAAOoD,KAAK,UAjCZ,SAAS+F,IACP,IAAMiU,EAAiBpd,EAAO6G,cAAmC,EAApB7G,EAAOG,UAAiBH,EAAOG,UACtE0V,EAAe3/B,KAAKG,IACxBH,KAAKC,IAAIinC,EAAgBpd,EAAOmH,gBAChCnH,EAAOoH,gBAETpH,EAAOmJ,aAAa0M,GACpB7V,EAAOgJ,oBACPhJ,EAAOiJ,yBA4BXmQ,sCAAgBiE,GAA2B,IAAbC,6DACtBtd,EAASvqB,KACT8nC,EAAmBvd,EAAOI,OAAO6C,UAKvC,OAJKoa,IAEHA,EAAoC,eAArBE,EAAoC,WAAa,cAGhEF,IAAiBE,GACC,eAAjBF,GAAkD,aAAjBA,IAKpCrd,EAAO/e,IACJ5B,YAAYA,GAAZA,OAAe2gB,EAAOI,OAAOqO,+BAAyB8O,IACtDz9B,SAASA,GAATA,OAAYkgB,EAAOI,OAAOqO,+BAAyB4O,IACtDrd,EAAOgZ,uBAEPhZ,EAAOI,OAAO6C,UAAYoa,EAE1Brd,EAAOoL,OAAOniB,MAAM6zB,YACG,aAAjBO,EACFP,EAAQtnB,MAAM/D,MAAQ,GAEtBqrB,EAAQtnB,MAAM7D,OAAS,MAI3BqO,EAAOoD,KAAK,mBACRka,GAAYtd,EAAOwQ,UAnBdxQ,IAwBXwd,4BAAMnsB,GACJ,IAAM2O,EAASvqB,KACf,GAAIuqB,EAAOyd,QAAS,OAAO,EAG3B,IAAMx8B,EAAMrI,EAAEyY,GAAM2O,EAAOI,OAAO/O,IAGlC,KAFAA,EAAKpQ,EAAI,IAGP,OAAO,EAGToQ,EAAG2O,OAASA,EAEZ,IAAM0d,EAAqB,WAArBA,kBACQ1d,EAAOI,OAAOgP,cAAgB,IAAIrX,OAAOrM,MAAM,KAAK9L,KAAK,OAanEqoB,EAVe,WACjB,GAAI5W,GAAMA,EAAGkT,YAAclT,EAAGkT,WAAWrP,cAAe,CACtD,IAAMyC,EAAM/e,EAAEyY,EAAGkT,WAAWrP,cAAcwoB,MAG1C,OADA/lB,EAAIlY,SAAYjJ,mBAAYyK,EAAIxB,SAASjJ,IAClCmhB,EAET,OAAO1W,EAAIxB,SAASi+B,KAPH,GAWnB,GAA0B,IAAtBzV,EAAW5uB,QAAgB2mB,EAAOI,OAAO8M,eAAgB,CAC3D,IACMyQ,EADW1nB,IACQ3I,cAAc,OACvC2a,EAAarvB,EAAE+kC,GACfA,EAAQ5kB,UAAYiH,EAAOI,OAAOgP,aAClCnuB,EAAIuC,OAAOm6B,GACX18B,EAAIxB,SAASA,IAATA,OAAaugB,EAAOI,OAAOsO,aAAczlB,MAAM6zB,YACjD7U,EAAWzkB,OAAOs5B,MAmBtB,OAfA5oC,OAAO0xB,OAAO5F,EAAQ,CACpB/e,MACAoQ,KACA4W,aACA3H,UAAW2H,EAAW,GACtBwV,SAASA,EAGT7W,IAA8B,QAAzBvV,EAAGoP,IAAIzN,eAAoD,QAAzB/R,EAAI+a,IAAI,aAC/C6K,aAC8B,eAA5B7G,EAAOI,OAAO6C,YACY,QAAzB5R,EAAGoP,IAAIzN,eAAoD,QAAzB/R,EAAI+a,IAAI,cAC7CgV,SAAwC,gBAA9B/I,EAAWjM,IAAI,kBAM7BpgB,2BAAKyV,GACH,IAAM2O,EAASvqB,KACf,OAAIuqB,EAAOoV,cAGX,IADgBpV,EAAOwd,MAAMnsB,KAG7B2O,EAAOoD,KAAK,cAGRpD,EAAOI,OAAOwK,aAChB5K,EAAO6K,gBAIT7K,EAAOma,aAGHna,EAAOI,OAAOwD,MAChB5D,EAAO2X,aAIT3X,EAAOiG,aAGPjG,EAAO+K,eAEH/K,EAAOI,OAAOqL,eAChBzL,EAAO0L,gBAIL1L,EAAOI,OAAO+H,YAAcnI,EAAOwD,SACrCxD,EAAOsI,gBAGLtI,EAAOI,OAAO+N,eAChBnO,EAAOmO,gBAILnO,EAAOI,OAAOwD,KAChB5D,EAAOqK,QACLrK,EAAOI,OAAO4M,aAAehN,EAAOsO,aACpC,EACAtO,EAAOI,OAAOiP,uBACd,GAIFrP,EAAOqK,QAAQrK,EAAOI,OAAO4M,aAAc,EAAGhN,EAAOI,OAAOiP,oBAAoBA,GAAA,GAIlFrP,EAAOsY,eAGPtY,EAAOoV,aAAcA,EAGrBpV,EAAOoD,KAAK,QACZpD,EAAOoD,KAAK,cA5DmBpD,IAiEjC4d,gCAA6C,IAArCC,6DAAuBC,6DACvB9d,EAASvqB,KACP2qB,EAAoCJ,EAAtCI,OAAUnf,EAA4B+e,EAAtC/e,IAAegnB,EAAuBjI,EAAtCiI,WAA2BmD,EAAWpL,EAAtCoL,OAEN,gBAAWpL,EAAOI,QAA0BJ,EAAO2J,YAInD3J,EAAOoD,KAAK,iBAGZpD,EAAOoV,aAAcA,EAGrBpV,EAAOuY,eAGHnY,EAAOwD,MACT5D,EAAOiY,cAIL6F,IACF9d,EAAO0a,gBACPz5B,EAAI2B,WAAW,SACfqlB,EAAWrlB,WAAW,SAClBwoB,GAAUA,EAAO/xB,QACnB+xB,EACG/rB,YACC,CACE+gB,EAAO0O,kBACP1O,EAAOwO,iBACPxO,EAAO4O,eACP5O,EAAO8O,gBACPtvB,KAAK,MAERgD,WAAW,SACXA,WAAW,4BAIlBod,EAAOoD,KAAK,WAGZlvB,OAAO+F,KAAK+lB,EAAOgQ,iBAAiBzwB,SAASy8B,YAC3Chc,EAAOzF,IAAIyhB,WAGT6B,IACF7d,EAAO/e,IAAI,GAAG+e,OAAS,KZ1lB7B,SAAqB1T,GACnB,IAAMpX,EAASoX,EACfpY,OAAO+F,KAAK/E,GAAQqK,SAASxK,YAC3B,IACEG,EAAOH,GAAO,KACd,MAAOY,IAGT,WACST,EAAOH,GACd,MAAOY,QAVb,CY2lBkBqqB,IAEdA,EAAO2J,WAAYA,GA/CV,U,8EAgES4S,EAnkBhBf,G8C3CS,SAASuC,EAA0B/d,EAAQ4Y,EAAgBxY,EAAQ4d,GAChF,IAAM19B,EAAW2V,IAejB,OAdI+J,EAAOI,OAAO8M,gBAChBh5B,OAAO+F,KAAK+jC,GAAYz+B,SAASxK,YAC/B,IAAKqrB,EAAOrrB,SAAQqrB,EAAOuP,KAAe,CACxC,IAAIsO,EAAUje,EAAO/e,IAAIxB,SAASA,IAATA,OAAau+B,EAAWjpC,KAAQ,GACpDkpC,KACHA,EAAU39B,EAASgN,cAAc,QACzByL,UAAYilB,EAAWjpC,GAC/BirB,EAAO/e,IAAIuC,OAAOy6B,IAEpB7d,EAAOrrB,GAAOkpC,EACdrF,EAAe7jC,GAAOkpC,MAIrB7d,EClBM,SAAS8d,IAA4B,IAAVvlB,yDAAU,GAClD,MAAO,IAAP,OAAWA,EACRZ,OACAva,QAAQ,cAAe,QACvBA,QAAQ,KAAM,MCJJ,SAAS2gC,GAAY/S,GAC5BpL,MAASvqB,KACPwyB,EAAuBjI,EAAzBiI,WAAc7H,EAAWJ,EAAzBI,OAIN,GAHIA,EAAOwD,MACT5D,EAAOiY,cAEa,YAAX7M,IAAuB,WAAYA,EAC5C,IAAK,IAAI53B,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAClC43B,EAAO53B,IAAIy0B,EAAWzkB,OAAO4nB,EAAO53B,SAG1Cy0B,EAAWzkB,OAAO4nB,GAEhBhL,EAAOwD,MACT5D,EAAO2X,aAEJvX,EAAOge,UACVpe,EAAOwQ,SCjBI,SAAS6N,GAAajT,GAC7BpL,MAASvqB,KACP2qB,EAAoCJ,EAAtCI,OAAU6H,EAA4BjI,EAAtCiI,WAAsB/E,EAAgBlD,EAAtCkD,YAEF9C,EAAOwD,MACT5D,EAAOiY,cAET,IAAIjD,EAAiB9R,EAAc,EACnC,GAAsB,YAAXkI,IAAuB,WAAYA,EAAQ,CACpD,IAAK,IAAI53B,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAClC43B,EAAO53B,IAAIy0B,EAAWlL,QAAQqO,EAAO53B,IAE3CwhC,EAAiB9R,EAAckI,EAAO/xB,YAEtC4uB,EAAWlL,QAAQqO,GAEjBhL,EAAOwD,MACT5D,EAAO2X,aAEJvX,EAAOge,UACVpe,EAAOwQ,SAETxQ,EAAOqK,QAAQ2K,EAAgB,GAAG,GCtBrB,SAASsJ,GAAS5gC,EAAO0tB,GAChCpL,MAASvqB,KACPwyB,EAAoCjI,EAAtCiI,WAAc7H,EAAwBJ,EAAtCI,OACFme,EADwCve,EAAtCkD,YAEF9C,EAAOwD,OACT2a,GAAqBve,EAAOsO,aAC5BtO,EAAOiY,cACPjY,EAAOoL,OAASnD,EAAWxoB,SAASA,IAATA,OAAa2gB,EAAOsO,cAEjD,IAAM8P,EAAaxe,EAAOoL,OAAO/xB,OACjC,GAAIqE,GAAS,EACXsiB,EAAOqe,aAAajT,QAGtB,GAAI1tB,GAAS8gC,EACXxe,EAAOme,YAAY/S,OADrB,CAOA,IAHA,IAAI4J,EAAiBuJ,EAAoB7gC,EAAQ6gC,EAAoB,EAAIA,EAEnEE,EAAe,GACZjrC,EAAIgrC,EAAa,EAAGhrC,GAAKkK,EAAOlK,GAAK,EAAG,CAC/C,IAAMkrC,EAAe1e,EAAOoL,OAAO3O,GAAGjpB,GACtCkrC,EAAa3iC,SACb0iC,EAAazkB,QAAQ0kB,GAGvB,GAAsB,YAAXtT,IAAuB,WAAYA,EAAQ,CACpD,IAAK,IAAI53B,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAClC43B,EAAO53B,IAAIy0B,EAAWzkB,OAAO4nB,EAAO53B,IAE1CwhC,EACEuJ,EAAoB7gC,EAAQ6gC,EAAoBnT,EAAO/xB,OAASklC,OAElEtW,EAAWzkB,OAAO4nB,GAGpB,IAAK,IAAI53B,EAAI,EAAGA,EAAIirC,EAAaplC,OAAQ7F,GAAK,EAC5Cy0B,EAAWzkB,OAAOi7B,EAAajrC,IAG7B4sB,EAAOwD,MACT5D,EAAO2X,aAEJvX,EAAOge,UACVpe,EAAOwQ,SAELpQ,EAAOwD,KACT5D,EAAOqK,QAAQ2K,EAAiBhV,EAAOsO,aAAc,GAAG,GAExDtO,EAAOqK,QAAQ2K,EAAgB,GAAG,IClDvB,SAAS2J,GAAYC,GAC5B5e,MAASvqB,KACP2qB,EAAoCJ,EAAtCI,OAAU6H,EAA4BjI,EAAtCiI,WAEFsW,EAFwCve,EAAtCkD,YAGF9C,EAAOwD,OACT2a,GAAqBve,EAAOsO,aAC5BtO,EAAOiY,cACPjY,EAAOoL,OAASnD,EAAWxoB,SAASA,IAATA,OAAa2gB,EAAOsO,cAEjD,IACImQ,EADA7J,EAAiBuJ,EAGrB,GAA6B,YAAlBK,IAA8B,WAAYA,EAAe,CAClE,IAAK,IAAIprC,EAAI,EAAGA,EAAIorC,EAAcvlC,OAAQ7F,GAAK,EAC7CqrC,EAAgBD,EAAcprC,GAC1BwsB,EAAOoL,OAAOyT,IAAgB7e,EAAOoL,OAAO3O,GAAGoiB,GAAe9iC,SAC9D8iC,EAAgB7J,IAAgBA,GAAkB,GAExDA,EAAiB9+B,KAAKC,IAAI6+B,EAAgB,QAE1C6J,EAAgBD,EACZ5e,EAAOoL,OAAOyT,IAAgB7e,EAAOoL,OAAO3O,GAAGoiB,GAAe9iC,SAC9D8iC,EAAgB7J,IAAgBA,GAAkB,GACtDA,EAAiB9+B,KAAKC,IAAI6+B,EAAgB,GAGxC5U,EAAOwD,MACT5D,EAAO2X,aAGJvX,EAAOge,UACVpe,EAAOwQ,SAELpQ,EAAOwD,KACT5D,EAAOqK,QAAQ2K,EAAiBhV,EAAOsO,aAAc,GAAG,GAExDtO,EAAOqK,QAAQ2K,EAAgB,GAAG,GCrCvB,SAAS8J,KAItB,IAHA,IAEMF,EAAgB,GACbprC,EAAI,EAAGA,EAHDiC,KAGY21B,OAAO/xB,OAAQ7F,GAAK,EAC7CorC,EAAc11B,KAAK1V,GAJNiC,KAMRkpC,YAAYC,GCPN,SAASG,GAAW3e,OACzBkN,EAAkFlN,EAApFkN,OAAUtN,EAA0EI,EAApFJ,OAAkBzf,EAAkE6f,EAApF7f,GAAsB4oB,EAA8D/I,EAApF+I,aAAoCnB,EAAgD5H,EAApF4H,cAAmDgX,EAAiC5e,EAApF4e,gBAAoEC,EAAgB7e,EAApF6e,YAEN1+B,EAAG,cAAc,WACf,GAAIyf,EAAOI,OAAOkN,SAAWA,EAA7B,CACAtN,EAAOpH,WAAW1P,KAAKA,GAALA,OAAQ8W,EAAOI,OAAOqO,+BAAyBnB,IAC7D2R,GAAeA,KACjBjf,EAAOpH,WAAW1P,KAAKA,GAALA,OAAQ8W,EAAOI,OAAOqO,8BAG1C,IAAMyQ,EAAwBF,EAAkBA,IAAoB,GAEpE9qC,OAAO0xB,OAAO5F,EAAOI,OAAQ8e,GAC7BhrC,OAAO0xB,OAAO5F,EAAO4Y,eAAgBsG,OAEvC3+B,EAAG,gBAAgB,WACbyf,EAAOI,OAAOkN,SAAWA,GAC7BnE,OAEF5oB,EAAG,iBAAiB,SAAC4+B,EAAI5lB,GACnByG,EAAOI,OAAOkN,SAAWA,GAC7BtF,EAAczO,MCrBH,SAAS6lB,GAAaC,EAAcC,GACjD,OAAID,EAAaE,YACRD,EAASzjC,KAAKwjC,EAAaE,aAAavjB,IAAI,CACjD,sBAAuB,SACvB,8BAA+B,WAG5BsjB,ECPM,SAASE,MAA4DC,IAA/Bzf,IAAFA,OAAUzG,IAAVA,SAAoBgmB,IAApBA,YAAiCE,IAAjCA,UACzCrU,EAAoCpL,EAAtCoL,OAAUlI,EAA4BlD,EAAtCkD,YAAuB+E,EAAejI,EAAtCiI,WACN,GAAIjI,EAAOI,OAAOiN,kBAAiC,IAAb9T,EAAgB,CACpD,IAAImmB,MAEAD,EACqBF,EAAcnU,EAAOvvB,KAAK0jC,GAAenU,EAEzCmU,EACnBnU,EAAO3O,GAAGyG,GAAarnB,KAAK0jC,GAC5BnU,EAAO3O,GAAGyG,IAEKhI,eAAc,WACjC,IAAIwkB,GACC1f,IAAUA,EAAO2J,UAAtB,CACA+V,KACA1f,EAAOyD,WAAYA,EAEnB,IADA,IAAMkc,EAAgB,CAAC,sBAAuB,iBACrCnsC,EAAI,EAAGA,EAAImsC,EAActmC,OAAQ7F,GAAK,EAC7Cy0B,EAAW3uB,QAAQqmC,EAAcnsC,SCjB1B,SAASosC,GAAaxf,EAAQkf,EAAUvf,GACrD,IAAM8f,EAAe,uBAAqB9f,aAAWA,GAAS,IACxD+f,EAAmB1f,EAAOmf,YAAcD,EAASzjC,KAAKukB,EAAOmf,aAAeD,EAC9ES,EAAYD,EAAiBrgC,SAASA,IAATA,OAAaogC,IAM9C,OAJKE,EAAU1mC,SACb0mC,EAAYnnC,2CAAoCmnB,aAAWA,GAAS,gBACpE+f,EAAiBt8B,OAAOu8B,IAEnBA,ExDwnBT7rC,OAAO+F,KAAK21B,GAAYrwB,SAASygC,YAC/B9rC,OAAO+F,KAAK21B,EAAWoQ,IAAiBzgC,SAAS0gC,YAC/CzE,EAAOpmC,UAAU6qC,GAAerQ,EAAWoQ,GAAgBC,SAI/DzE,EAAOkB,IAAI,CyDvoBI,YAA8BtZ,IAAZpD,IAAFA,OAAUzf,IAAVA,GAAc6iB,IAAdA,KACvBxtB,EAASqhB,IACXmnB,EAAW,KAET8B,EAAgB,WACflgB,IAAUA,EAAO2J,WAAc3J,EAAOoV,cAC3ChS,EAAK,gBACLA,EAAK,YAgCD+c,EAA2B,WAC1BngB,IAAUA,EAAO2J,WAAc3J,EAAOoV,aAC3ChS,EAAK,sBAGP7iB,EAAG,QAAQ,WACLyf,EAAOI,OAAO6M,qBAAkBA,IAAOr3B,EAAOwqC,eAlC7CpgB,IAAUA,EAAO2J,WAAc3J,EAAOoV,cAC3CgJ,EAAW,IAAIgC,gBAAgB/F,gBACrB5oB,EAAkBuO,EAApBvO,MAASE,EAAWqO,EAApBrO,OACF0uB,EAAW5uB,EACXmiB,EAAYjiB,EAChB0oB,EAAQ96B,SAAQ,YAAgCqV,IAA7B0rB,mBAAgBC,gBAAa3rB,WAC1CA,GAAUA,IAAWoL,EAAO3O,KAChCgvB,EAAWE,EACPA,EAAY9uB,OACX6uB,EAAe,IAAMA,GAAgBE,WAC1C5M,EAAY2M,EACRA,EAAY5uB,QACX2uB,EAAe,IAAMA,GAAgBG,cAExCJ,IAAa5uB,GAASmiB,IAAcjiB,GACtCuuB,QAGKQ,QAAQ1gB,EAAO3O,KAoBxBzb,EAAOiY,iBAAiB,SAAUqyB,GAClCtqC,EAAOiY,iBAAiB,oBAAqBsyB,OAG/C5/B,EAAG,WAAW,WApBR69B,GAAYA,EAASuC,WAAa3gB,EAAO3O,KAC3C+sB,EAASuC,UAAU3gB,EAAO3O,IAC1B+sB,EAAW,MAoBbxoC,EAAOkf,oBAAoB,SAAUorB,GACrCtqC,EAAOkf,oBAAoB,oBAAqBqrB,OCxDrC,YAA8C/c,IAA1BpD,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAA4B6iB,IAA5BA,KACzBwd,EAAY,GACZhrC,EAASqhB,IACT4pB,EAAS,SAACjsB,GAAkB,IAAVpe,yDAAU,GAE1B4nC,EAAW,IADIxoC,EAAOkrC,kBAAoBlrC,EAAOmrC,yBACpBC,YAIjC,GAAyB,IAArBA,EAAU3nC,OAAd,CAIA,IAAM4nC,EAAiB,WACrB7d,EAAK,iBAAkB4d,EAAU,KAG/BprC,EAAOmhB,sBACTnhB,EAAOmhB,sBAAsBkqB,GAE7BrrC,EAAO+B,WAAWspC,EAAgB,QAVlC7d,EAAK,iBAAkB4d,EAAU,OAcrC5C,EAASsC,QAAQ9rB,EAAQ,CACvBpQ,gBAAYA,IAAOhO,EAAQgO,YAAoChO,EAAQgO,WACvE08B,eAAWA,IAAO1qC,EAAQ0qC,WAAmC1qC,EAAQ0qC,UACrEC,mBAAeA,IAAO3qC,EAAQ2qC,eAAuC3qC,EAAQ2qC,gBAG/EP,EAAU13B,KAAKk1B,IAyBjBvC,EAAa,CACXuC,UAAUA,EACVgD,gBAAgBA,EAChBC,sBAAsBA,IAExB9gC,EAAG,QA5BU,WACX,GAAKyf,EAAOI,OAAOge,SAAnB,CACA,GAAIpe,EAAOI,OAAOghB,eAEhB,IADA,IAAME,EAAmBthB,EAAO/e,IAAIW,UAC3BpO,EAAI,EAAGA,EAAI8tC,EAAiBjoC,OAAQ7F,GAAK,EAChDqtC,EAAOS,EAAiB9tC,IAI5BqtC,EAAO7gB,EAAO/e,IAAI,GAAI,CACpBigC,UAAWlhB,EAAOI,OAAOihB,uBAI3BR,EAAO7gB,EAAOiI,WAAW,GAAI,CAAEzjB,YAAYA,QAe7CjE,EAAG,WAba,WACdqgC,EAAUrhC,SAAS6+B,YACjBA,EAASmD,gBAEXX,EAAUjmB,OAAO,EAAGimB,EAAUvnC,cCjDlC,IAAM3F,GAAU,CCFD,YAAyC6M,IAclDihC,EAd4BxhB,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAyB9B,SAASkhC,EAAYtP,EAAOz0B,GAC1B,IAAM0iB,EAASJ,EAAOI,OAAO8Q,QAC7B,GAAI9Q,EAAOshB,OAAS1hB,EAAOkR,QAAQwQ,MAAMhkC,GACvC,OAAOsiB,EAAOkR,QAAQwQ,MAAMhkC,GAE9B,IAAM4hC,EAAWlf,EAAOqhB,YACpB7oC,EAAEwnB,EAAOqhB,YAAY9tC,KAAKqsB,EAAQmS,EAAOz0B,IACzC9E,wBACiBonB,EAAOI,OAAOsO,iDAAwChxB,eAAUy0B,aAIrF,OAFKmN,EAASp9B,KAAK,4BAA4Bo9B,EAASp9B,KAAK,0BAA2BxE,GACpF0iB,EAAOshB,QAAO1hB,EAAOkR,QAAQwQ,MAAMhkC,GAAS4hC,GACzCA,EAGT,SAAS9O,EAAOmR,SAC4C3hB,EAAOI,OAAzD4K,IAAFA,cAAiBhB,IAAjBA,eAAiCmB,IAAjCA,iBACsCnL,EAAOI,OAAO8Q,QAAlD0Q,IAAFA,gBAAmBC,IAAnBA,iBAOF7hB,EAAOkR,QALH4Q,IAANC,KACIC,IAAJjjB,GACAqM,IAHIA,OAIQ6W,IAAZ5Y,WACQ6Y,IAARvhC,OAEGqf,EAAOI,OAAOuD,SACjB3D,EAAOgJ,oBAGT,IAEImZ,EAIAC,EACAC,EAPEnf,EAAclD,EAAOkD,aAAe,EAGjBif,EAArBniB,EAAO6G,aAA2B,QACpB7G,EAAOyH,eAAiB,OAAS,MAI/C0D,GACFiX,EAAclsC,KAAKgF,MAAM8vB,EAAgB,GAAKhB,EAAiB6X,EAC/DQ,EAAensC,KAAKgF,MAAM8vB,EAAgB,GAAKhB,EAAiB4X,IAEhEQ,EAAcpX,GAAiBhB,EAAiB,GAAK6X,EACrDQ,EAAerY,EAAiB4X,GAElC,IAAMG,EAAO7rC,KAAKC,KAAK+sB,GAAe,GAAKmf,EAAc,GACnDtjB,EAAK7oB,KAAKG,KAAK6sB,GAAe,GAAKkf,EAAahX,EAAO/xB,OAAS,GAChEsH,GAAUqf,EAAOqJ,WAAW0Y,IAAS,IAAM/hB,EAAOqJ,WAAW,IAAM,GASzE,SAASiZ,IACPtiB,EAAO+K,eACP/K,EAAOkJ,iBACPlJ,EAAOiJ,sBACHjJ,EAAOuiB,MAAQviB,EAAOI,OAAOmiB,KAAK/e,SACpCxD,EAAOuiB,KAAKC,OAIhB,GAhBAtuC,OAAO0xB,OAAO5F,EAAOkR,QAAS,CAC5B6Q,OACAhjB,KACApe,SACA0oB,WAAYrJ,EAAOqJ,aAYjByY,IAAiBC,GAAQC,IAAejjB,IAAO4iB,EAKjD,OAJI3hB,EAAOqJ,aAAe4Y,GAAsBthC,IAAWuhC,GACzDliB,EAAOoL,OAAOpP,IAAImmB,YAAexhC,cAEnCqf,EAAOkJ,iBAGT,GAAIlJ,EAAOI,OAAO8Q,QAAQuR,eAgBxB,OAfAziB,EAAOI,OAAO8Q,QAAQuR,eAAe9uC,KAAKqsB,EAAQ,CAChDrf,SACAohC,OACAhjB,KACAqM,OAAS,WAEP,IADA,IAAMsX,EAAiB,GACdlvC,EAAIuuC,EAAMvuC,GAAKurB,EAAIvrB,GAAK,EAC/BkvC,EAAex5B,KAAKkiB,EAAO53B,IAE7B,OAAOkvC,EALA,UAQP1iB,EAAOI,OAAO8Q,QAAQyR,sBACxBL,KAIJ,IAAMM,EAAiB,GACjBC,EAAgB,GACtB,GAAIlB,EACF3hB,EAAOiI,WAAWpsB,KAAKA,IAALA,OAASmkB,EAAOI,OAAOsO,aAAc3yB,cAEvD,IAAK,IAAIvI,EAAIsuC,EAActuC,GAAKwuC,EAAYxuC,GAAK,GAC3CA,EAAIuuC,GAAQvuC,EAAIurB,IAClBiB,EAAOiI,WACJpsB,KAAKA,IAALA,OAASmkB,EAAOI,OAAOsO,gDAAuCl7B,SAC9DuI,SAIT,IAAK,IAAIvI,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAClCA,GAAKuuC,GAAQvuC,GAAKurB,aACTijB,GAA8BL,EACvCkB,EAAc35B,KAAK1V,IAEfA,EAAIwuC,GAAYa,EAAc35B,KAAK1V,GACnCA,EAAIsuC,GAAcc,EAAe15B,KAAK1V,KAIhDqvC,EAActjC,SAAS7B,YACrBsiB,EAAOiI,WAAWzkB,OAAOi+B,EAAYrW,EAAO1tB,GAAQA,OAEtDklC,EACG9I,MAAK,SAAC3hB,EAAG4hB,UAAMA,EAAI5hB,KACnB5Y,SAAS7B,YACRsiB,EAAOiI,WAAWlL,QAAQ0kB,EAAYrW,EAAO1tB,GAAQA,OAEzDsiB,EAAOiI,WAAWxoB,SAAS,iBAAiBuc,IAAImmB,YAAexhC,SAC/D2hC,IAjJFzG,EAAa,CACX3K,QAAS,CACP1N,SAASA,EACT4H,OAAQ,GACRsW,OAAOA,EACPD,YAAa,KACbgB,eAAgB,KAChBE,sBAAsBA,EACtBf,gBAAiB,EACjBC,eAAgB,KAMpB7hB,EAAOkR,QAAU,CACfwQ,MAAO,GACPK,UAAMA,EACNhjB,QAAIA,EACJqM,OAAQ,GACRzqB,OAAQ,EACR0oB,WAAY,IA0Md9oB,EAAG,cAAc,WACVyf,EAAOI,OAAO8Q,QAAQ1N,UAC3BxD,EAAOkR,QAAQ9F,OAASpL,EAAOI,OAAO8Q,QAAQ9F,OAC9CpL,EAAOpH,WAAW1P,KAAKA,GAALA,OAAQ8W,EAAOI,OAAOqO,mCAExCzO,EAAOI,OAAO2I,qBAAsBA,EACpC/I,EAAO4Y,eAAe7P,qBAAsBA,EAEvC/I,EAAOI,OAAO4M,cACjBwD,QAGJjwB,EAAG,gBAAgB,WACZyf,EAAOI,OAAO8Q,QAAQ1N,UACvBxD,EAAOI,OAAOuD,UAAY3D,EAAOwW,mBACnCn+B,aAAampC,GACbA,EAAiB7pC,YAAW,WAC1B64B,MACC,MAEHA,QAGJjwB,EAAG,sBAAsB,WAClByf,EAAOI,OAAO8Q,QAAQ1N,SACvBxD,EAAOI,OAAOuD,SAChBjE,EAAeM,EAAOM,UAAW,kCAA4BN,EAAO2R,sBAIxEz9B,OAAO0xB,OAAO5F,EAAOkR,QAAS,CAC5BiN,YA1GF,SAAqB/S,GACnB,GAAsB,YAAXA,IAAuB,WAAYA,EAC5C,IAAK,IAAI53B,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAClC43B,EAAO53B,IAAIwsB,EAAOkR,QAAQ9F,OAAOliB,KAAKkiB,EAAO53B,SAGnDwsB,EAAOkR,QAAQ9F,OAAOliB,KAAKkiB,GAE7BoF,OAmGA6N,aAjGF,SAAsBjT,GACpB,IAAMlI,EAAclD,EAAOkD,YACvB8R,EAAiB9R,EAAc,EAC/B4f,EAAoB,EAExB,GAAIpjC,MAAMC,QAAQyrB,GAAS,CACzB,IAAK,IAAI53B,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAClC43B,EAAO53B,IAAIwsB,EAAOkR,QAAQ9F,OAAOpR,QAAQoR,EAAO53B,IAEtDwhC,EAAiB9R,EAAckI,EAAO/xB,OACtCypC,EAAoB1X,EAAO/xB,YAE3B2mB,EAAOkR,QAAQ9F,OAAOpR,QAAQoR,GAEhC,GAAIpL,EAAOI,OAAO8Q,QAAQwQ,MAAO,CAC/B,IAAMA,EAAQ1hB,EAAOkR,QAAQwQ,MACvBqB,EAAW,GACjB7uC,OAAO+F,KAAKynC,GAAOniC,SAASyjC,YAC1B,IAAMC,EAAYvB,EAAMsB,GAClBE,EAAgBD,EAAU/gC,KAAK,2BACjCghC,GACFD,EAAU/gC,KACR,0BACAtI,SAASspC,EAAe,IAAMJ,GAGlCC,EAASnpC,SAASopC,EAAa,IAAMF,GAAqBG,KAE5DjjB,EAAOkR,QAAQwQ,MAAQqB,EAEzBvS,MACAxQ,EAAOqK,QAAQ2K,EAAgB,IAmE/B2J,YAjEF,SAAqBC,GACnB,GAAI,MAAOA,EAAX,CACA,IAAI1b,EAAclD,EAAOkD,YACzB,GAAIxjB,MAAMC,QAAQi/B,GAChB,IAAK,IAAIprC,EAAIorC,EAAcvlC,OAAS,EAAG7F,GAAK,EAAGA,GAAK,EAClDwsB,EAAOkR,QAAQ9F,OAAOzQ,OAAOikB,EAAcprC,GAAI,GAC3CwsB,EAAOI,OAAO8Q,QAAQwQ,cACjB1hB,EAAOkR,QAAQwQ,MAAM9C,EAAcprC,IAExCorC,EAAcprC,GAAK0vB,IAAaA,GAAe,GACnDA,EAAchtB,KAAKC,IAAI+sB,EAAa,QAGtClD,EAAOkR,QAAQ9F,OAAOzQ,OAAOikB,EAAe,GACxC5e,EAAOI,OAAO8Q,QAAQwQ,cACjB1hB,EAAOkR,QAAQwQ,MAAM9C,GAE1BA,EAAgB1b,IAAaA,GAAe,GAChDA,EAAchtB,KAAKC,IAAI+sB,EAAa,GAEtCsN,MACAxQ,EAAOqK,QAAQnH,EAAa,KA6C5B4b,gBA3CF,WACE9e,EAAOkR,QAAQ9F,OAAS,GACpBpL,EAAOI,OAAO8Q,QAAQwQ,QACxB1hB,EAAOkR,QAAQwQ,MAAQ,IAEzBlR,MACAxQ,EAAOqK,QAAQ,EAAG,IAsClBmG,YClQW,YAA8CpN,IAA1BpD,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAA4B6iB,IAA5BA,KACzB9iB,EAAW2V,IACXrgB,EAASqhB,IAYf,SAASksB,EAAO96B,GACd,GAAK2X,EAAOwD,QAAZ,CAEA,IAAsBoD,EAAQ5G,EAAtB6G,aACJlxB,EAAI0S,EACJ1S,EAAEmuB,gBAAenuB,EAAIA,EAAEmuB,eAC3B,IAAMsf,EAAKztC,EAAEye,SAAWze,EAAE0tC,SACpBC,EAAatjB,EAAOI,OAAOmjB,SAASD,WACpCE,EAAWF,GAAqB,KAAPF,EACzBK,EAAaH,GAAqB,KAAPF,EAC3BM,EAAqB,KAAPN,EACdO,EAAsB,KAAPP,EACfQ,EAAmB,KAAPR,EACZS,EAAqB,KAAPT,EAEpB,IACGpjB,EAAOoI,iBACNpI,EAAOyH,gBAAkBkc,GACxB3jB,EAAOkH,cAAgB2c,GACxBJ,GAEF,OAAO,EAET,IACGzjB,EAAOqI,iBACNrI,EAAOyH,gBAAkBic,GAAiB1jB,EAAOkH,cAAgB0c,GAAcJ,GAEjF,OAAO,EAET,KAAI7tC,EAAE+e,UAAY/e,EAAEmuC,QAAUnuC,EAAEouC,SAAWpuC,EAAEquC,SAI3C1jC,EAASyU,eACTzU,EAASyU,cAAcE,WAC4B,UAAlD3U,EAASyU,cAAcE,SAASjC,eACmB,aAAlD1S,EAASyU,cAAcE,SAASjC,gBAJpC,CAQA,GACEgN,EAAOI,OAAOmjB,SAASU,iBACtBT,GAAYC,GAAcC,GAAeC,GAAgBC,GAAaC,GACvE,CACA,IAAIK,KAEJ,GACElkB,EAAO/e,IAAIW,QAAQA,IAARA,OAAYoe,EAAOI,OAAOsO,aAAcr1B,OAAS,GACQ,IAApE2mB,EAAO/e,IAAIW,QAAQA,IAARA,OAAYoe,EAAOI,OAAOwO,mBAAoBv1B,OAEzD,OAGF,IAAM4H,EAAM+e,EAAO/e,IACbkjC,EAAcljC,EAAI,GAAGqR,YACrB8xB,EAAenjC,EAAI,GAAGmR,aACtBiyB,EAAczuC,EAAOqc,WACrBqyB,EAAe1uC,EAAOoc,YACtBuyB,EAAevkB,EAAO/e,IAAIN,SAC5BimB,IAAK2d,EAAap2B,MAAQ6R,EAAO/e,IAAI,GAAGoR,YAO5C,IANA,IAAMmyB,EAAc,CAClB,CAACD,EAAap2B,KAAMo2B,EAAazjC,KACjC,CAACyjC,EAAap2B,KAAOg2B,EAAaI,EAAazjC,KAC/C,CAACyjC,EAAap2B,KAAMo2B,EAAazjC,IAAMsjC,GACvC,CAACG,EAAap2B,KAAOg2B,EAAaI,EAAazjC,IAAMsjC,IAE9C5wC,EAAI,EAAGA,EAAIgxC,EAAYnrC,OAAQ7F,GAAK,EAAG,CAC9C,IAAMmmC,EAAQ6K,EAAYhxC,GAC1B,GAAImmC,EAAM,IAAM,GAAKA,EAAM,IAAM0K,GAAe1K,EAAM,IAAM,GAAKA,EAAM,IAAM2K,EAAc,CACzF,GAAiB,IAAb3K,EAAM,IAAyB,IAAbA,EAAM,GAAU,SACtCuK,MAGJ,IAAKA,EAAQ,OAEXlkB,EAAOyH,iBACL+b,GAAYC,GAAcC,GAAeC,KACvChuC,EAAE8K,eAAgB9K,EAAE8K,iBACnB9K,EAAE8uC,aAAcA,KAEjBhB,GAAcE,KAAkB/c,IAAU4c,GAAYE,IAAgB9c,IAC1E5G,EAAO6W,cACH2M,GAAYE,KAAiB9c,IAAU6c,GAAcE,IAAiB/c,IAC1E5G,EAAOiX,eAELuM,GAAYC,GAAcG,GAAaC,KACrCluC,EAAE8K,eAAgB9K,EAAE8K,iBACnB9K,EAAE8uC,aAAcA,IAEnBhB,GAAcI,IAAa7jB,EAAO6W,aAClC2M,GAAYI,IAAW5jB,EAAOiX,aAEpC7T,EAAK,WAAYggB,KAGnB,SAAS7J,IACHvZ,EAAOujB,SAAS/f,UACpB5qB,EAAE0H,GAAUC,GAAG,UAAW4iC,GAC1BnjB,EAAOujB,SAAS/f,SAAUA,GAE5B,SAAS8V,IACFtZ,EAAOujB,SAAS/f,UACrB5qB,EAAE0H,GAAUia,IAAI,UAAW4oB,GAC3BnjB,EAAOujB,SAAS/f,SAAUA,GAlH5BxD,EAAOujB,SAAW,CAChB/f,SAASA,GAEXqY,EAAa,CACX0H,SAAU,CACR/f,SAASA,EACTygB,gBAAgBA,EAChBX,YAAYA,KA8GhB/iC,EAAG,QAAQ,WACLyf,EAAOI,OAAOmjB,SAAS/f,SACzB+V,OAGJh5B,EAAG,WAAW,WACRyf,EAAOujB,SAAS/f,SAClB8V,OAIJplC,OAAO0xB,OAAO5F,EAAOujB,SAAU,CAC7BhK,SACAD,aCpIW,YAAgDlW,IAoBzDshB,EApB+B1kB,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAA4B6iB,IAA5BA,KAC3BxtB,EAASqhB,IAEf4kB,EAAa,CACX8I,WAAY,CACVnhB,SAASA,EACTohB,gBAAgBA,EAChBC,QAAQA,EACRC,aAAaA,EACbC,YAAa,EACbC,aAAc,YACdC,eAAgB,KAChBC,cAAe,QAInBllB,EAAO2kB,WAAa,CAClBnhB,SAASA,GAIX,IACI2hB,EADAC,EAAiBrvC,IAEfsvC,EAAoB,GA4E1B,SAASC,IACFtlB,EAAOwD,UACZxD,EAAOulB,cAAeA,GAExB,SAASC,IACFxlB,EAAOwD,UACZxD,EAAOulB,cAAeA,GAExB,SAASE,EAAcC,GACrB,QACE1lB,EAAOI,OAAOukB,WAAWM,gBACzBS,EAASC,MAAQ3lB,EAAOI,OAAOukB,WAAWM,gBAO1CjlB,EAAOI,OAAOukB,WAAWO,eACzBnvC,IAAQqvC,EAAiBplB,EAAOI,OAAOukB,WAAWO,iBAShDQ,EAASC,OAAS,GAAK5vC,IAAQqvC,EAAiB,MAgBhDM,EAASziB,UAAY,EACjBjD,EAAOiL,QAASjL,EAAOI,OAAOwD,MAAU5D,EAAOyD,YACnDzD,EAAO6W,YACPzT,EAAK,SAAUsiB,EAASE,MAEf5lB,EAAOkL,cAAelL,EAAOI,OAAOwD,MAAU5D,EAAOyD,YAChEzD,EAAOiX,YACP7T,EAAK,SAAUsiB,EAASE,MAG1BR,GAAiB,IAAIxvC,EAAO6D,MAAOC,cAiBrC,SAASypC,EAAO96B,GACd,IAAI1S,EAAI0S,EAER,GAAK2X,EAAOwD,QAAZ,CACA,IAAMpD,EAASJ,EAAOI,OAAOukB,WAEzB3kB,EAAOI,OAAOuD,SAChBhuB,EAAE8K,iBAGJ,IAAImU,EAASoL,EAAO/e,IAIpB,GAH8C,cAA1C+e,EAAOI,OAAOukB,WAAWK,eAC3BpwB,EAAShc,EAAEonB,EAAOI,OAAOukB,WAAWK,gBAEjChlB,EAAOulB,eAAiB3wB,EAAO,GAAGoE,SAASrjB,EAAEif,UAAYwL,EAAOwkB,eACnE,OAAO,EAELjvC,EAAEmuB,gBAAenuB,EAAIA,EAAEmuB,eAC3B,IAAI6hB,EAAQ,EACNE,EAAY7lB,EAAO6G,cAAgB,EAAI,EAEvChuB,EAtKR,SAAmBlD,GAMjB,IAAImwC,EAAK,EACLC,EAAK,EACLC,EAAK,EACLC,EAAK,EA0DT,MAvDI,WAAYtwC,IACdowC,EAAKpwC,EAAEklB,QAEL,eAAgBllB,IAClBowC,GAAMpwC,EAAEuwC,WAAa,KAEnB,gBAAiBvwC,IACnBowC,GAAMpwC,EAAEwwC,YAAc,KAEpB,gBAAiBxwC,IACnBmwC,GAAMnwC,EAAEywC,YAAc,KAIpB,SAAUzwC,GAAKA,EAAEwoB,OAASxoB,EAAE0wC,kBAC9BP,EAAKC,EACLA,EAAK,GAGPC,EA7BmB,GA6BdF,EACLG,EA9BmB,GA8BdF,EAED,WAAYpwC,IACdswC,EAAKtwC,EAAE2wC,QAEL,WAAY3wC,IACdqwC,EAAKrwC,EAAE4wC,QAGL5wC,EAAE+e,WAAasxB,IAEjBA,EAAKC,EACLA,EAAK,IAGFD,GAAMC,IAAOtwC,EAAE6wC,YACE,IAAhB7wC,EAAE6wC,WAEJR,GA/CgB,GAgDhBC,GAhDgB,KAmDhBD,GAlDgB,IAmDhBC,GAnDgB,MAwDhBD,IAAOF,IACTA,EAAKE,EAAK,GAAK,EAAI,GAEjBC,IAAOF,IACTA,EAAKE,EAAK,GAAK,EAAI,GAGd,CACLQ,MAAOX,EACPY,MAAOX,EACPY,OAAQX,EACRY,OAAQX,GAvEZ,CAsKyBtwC,GAEvB,GAAIyqB,EAAO0kB,YACT,GAAI9kB,EAAOyH,eAAgB,CACzB,KAAIvxB,KAAKyxB,IAAI9uB,EAAK8tC,QAAUzwC,KAAKyxB,IAAI9uB,EAAK+tC,SACrC,OAAO,EADuCjB,GAAS9sC,EAAK8tC,OAASd,MAErE,MAAI3vC,KAAKyxB,IAAI9uB,EAAK+tC,QAAU1wC,KAAKyxB,IAAI9uB,EAAK8tC,SAC5C,OAAO,EAD8ChB,GAAS9sC,EAAK+tC,YAGxEjB,EACEzvC,KAAKyxB,IAAI9uB,EAAK8tC,QAAUzwC,KAAKyxB,IAAI9uB,EAAK+tC,SAAW/tC,EAAK8tC,OAASd,GAAahtC,EAAK+tC,OAGrF,GAAc,IAAVjB,EAAa,OAAO,EAEpBvlB,EAAOykB,SAAQc,GAASA,GAG5B,IAAIkB,EAAY7mB,EAAOjC,eAAiB4nB,EAAQvlB,EAAO2kB,YAkBvD,GAhBI8B,GAAa7mB,EAAOoH,iBAAgByf,EAAY7mB,EAAOoH,gBACvDyf,GAAa7mB,EAAOmH,iBAAgB0f,EAAY7mB,EAAOmH,mBASrCnH,EAAOI,OAAOwD,QAE9BijB,IAAc7mB,EAAOoH,gBAAkByf,IAAc7mB,EAAOmH,kBAEvCnH,EAAOI,OAAOyH,QAAQlyB,EAAEmyB,kBAE9C9H,EAAOI,OAAO0I,UAAa9I,EAAOI,OAAO0I,SAAStF,QAyChD,CAOL,IAAMkiB,EAAW,CACfruC,KAAMtB,IACN4vC,MAAOzvC,KAAKyxB,IAAIge,GAChB1iB,UAAW/sB,KAAK4wC,KAAKnB,IAEjBoB,EACJ5B,GACAO,EAASruC,KAAO8tC,EAAoB9tC,KAAO,KAC3CquC,EAASC,OAASR,EAAoBQ,OACtCD,EAASziB,YAAckiB,EAAoBliB,UAC7C,IAAK8jB,EAAmB,CACtB5B,SAEInlB,EAAOI,OAAOwD,MAChB5D,EAAO6D,UAET,IAAImjB,EAAWhnB,EAAOjC,eAAiB4nB,EAAQvlB,EAAO2kB,YAChDtQ,EAAezU,EAAOkL,YACtBwJ,EAAS1U,EAAOiL,MAetB,GAbI+b,GAAYhnB,EAAOoH,iBAAgB4f,EAAWhnB,EAAOoH,gBACrD4f,GAAYhnB,EAAOmH,iBAAgB6f,EAAWhnB,EAAOmH,gBAEzDnH,EAAOgI,cAAc,GACrBhI,EAAOmJ,aAAa6d,GACpBhnB,EAAOkJ,iBACPlJ,EAAOgJ,oBACPhJ,EAAOiJ,wBAEDwL,GAAgBzU,EAAOkL,cAAkBwJ,GAAU1U,EAAOiL,QAC9DjL,EAAOiJ,sBAGLjJ,EAAOI,OAAO0I,SAASme,OAAQ,CAYjC5uC,aAAaqsC,GACbA,SACIW,EAAkBhsC,QAAU,IAC9BgsC,EAAkB6B,QAEpB,IAAMC,EAAY9B,EAAkBhsC,OAChCgsC,EAAkBA,EAAkBhsC,OAAS,UAE3C+tC,EAAa/B,EAAkB,GAErC,GADAA,EAAkBn8B,KAAKw8B,GAErByB,IACCzB,EAASC,MAAQwB,EAAUxB,OAASD,EAASziB,YAAckkB,EAAUlkB,WAGtEoiB,EAAkB1qB,OAAO,QACpB,GACL0qB,EAAkBhsC,QAAU,IAC5BqsC,EAASruC,KAAO+vC,EAAW/vC,KAAO,KAClC+vC,EAAWzB,MAAQD,EAASC,OAAS,GACrCD,EAASC,OAAS,EAClB,CAOA,IAAM0B,EAAkB1B,EAAQ,EAAI,GAAM,GAC1CR,EAAsBO,EACtBL,EAAkB1qB,OAAO,GACzB+pB,EAAU7mB,GAAS,WACjBmC,EAAOwX,eAAexX,EAAOI,OAAOC,OAAOA,OAAA,EAAiBgnB,KAC3D,GAEA3C,IAIHA,EAAU7mB,GAAS,WAEjBsnB,EAAsBO,EACtBL,EAAkB1qB,OAAO,GACzBqF,EAAOwX,eAAexX,EAAOI,OAAOC,OAAOA,OAAA,EAHnB,MAIvB,MAWP,GANK0mB,GAAmB3jB,EAAK,SAAUztB,GAGnCqqB,EAAOI,OAAOiL,UAAYrL,EAAOI,OAAOknB,8BAC1CtnB,EAAOqL,SAAS1lB,OAEdqhC,IAAahnB,EAAOoH,gBAAkB4f,IAAahnB,EAAOmH,eAAgB,OAAO,OApJzB,CAE9D,IAAMue,EAAW,CACfruC,KAAMtB,IACN4vC,MAAOzvC,KAAKyxB,IAAIge,GAChB1iB,UAAW/sB,KAAK4wC,KAAKnB,GACrBC,IAAKv9B,GAIHg9B,EAAkBhsC,QAAU,GAC9BgsC,EAAkB6B,QAEpB,IAAMC,EAAY9B,EAAkBhsC,OAChCgsC,EAAkBA,EAAkBhsC,OAAS,UAwBjD,GAtBAgsC,EAAkBn8B,KAAKw8B,GAQnByB,GAEAzB,EAASziB,YAAckkB,EAAUlkB,WACjCyiB,EAASC,MAAQwB,EAAUxB,OAC3BD,EAASruC,KAAO8vC,EAAU9vC,KAAO,MAEjCouC,EAAcC,GAGhBD,EAAcC,GAvGpB,SAAuBA,GACrB,IAAMtlB,EAASJ,EAAOI,OAAOukB,WAC7B,GAAIe,EAASziB,UAAY,GACvB,GAAIjD,EAAOiL,QAAUjL,EAAOI,OAAOwD,MAAQxD,EAAOwkB,eAEhD,OAAO,OAEJ,GAAI5kB,EAAOkL,cAAgBlL,EAAOI,OAAOwD,MAAQxD,EAAOwkB,eAE7D,OAAO,EAET,OAAO,EAXT,CA4GsBc,GAChB,OAAO,EAmHX,OAFI/vC,EAAE8K,eAAgB9K,EAAE8K,iBACnB9K,EAAE8uC,aAAcA,GAAA,GAIvB,SAAStqB,EAAOjV,GACd,IAAI0P,EAASoL,EAAO/e,IAC0B,cAA1C+e,EAAOI,OAAOukB,WAAWK,eAC3BpwB,EAAShc,EAAEonB,EAAOI,OAAOukB,WAAWK,eAEtCpwB,EAAO1P,GAAQ,aAAcogC,GAC7B1wB,EAAO1P,GAAQ,aAAcsgC,GAC7B5wB,EAAO1P,GAAQ,QAASi+B,GAG1B,SAAS5J,IACP,OAAIvZ,EAAOI,OAAOuD,SAChB3D,EAAOM,UAAUxL,oBAAoB,QAASquB,QAG5CnjB,EAAO2kB,WAAWnhB,UACtBrJ,EAAO,MACP6F,EAAO2kB,WAAWnhB,SAAUA,GAAA,GAG9B,SAAS8V,IACP,OAAItZ,EAAOI,OAAOuD,SAChB3D,EAAOM,UAAUzS,iBAAiBxF,MAAO86B,SAGtCnjB,EAAO2kB,WAAWnhB,UACvBrJ,EAAO,OACP6F,EAAO2kB,WAAWnhB,SAAUA,GAAA,GAI9BjjB,EAAG,QAAQ,YACJyf,EAAOI,OAAOukB,WAAWnhB,SAAWxD,EAAOI,OAAOuD,SACrD2V,IAEEtZ,EAAOI,OAAOukB,WAAWnhB,SAAS+V,OAExCh5B,EAAG,WAAW,WACRyf,EAAOI,OAAOuD,SAChB4V,IAEEvZ,EAAO2kB,WAAWnhB,SAAS8V,OAGjCplC,OAAO0xB,OAAO5F,EAAO2kB,WAAY,CAC/BpL,SACAD,aChbW,YAAgDlW,IAA1BpD,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAA4B6iB,IAA5BA,KAoBjC,SAASmkB,EAAMl2B,GACb,IAAIpQ,EAYJ,OAXIoQ,IACFpQ,EAAMrI,EAAEyY,GAEN2O,EAAOI,OAAO6N,mBACA,iBAAP5c,GACPpQ,EAAI5H,OAAS,GACkB,IAA/B2mB,EAAO/e,IAAIpF,KAAKwV,GAAIhY,SAEpB4H,EAAM+e,EAAO/e,IAAIpF,KAAKwV,KAGnBpQ,EAGT,SAASumC,EAASvmC,EAAKwmC,GACrB,IAAMrnB,EAASJ,EAAOI,OAAOoK,WACzBvpB,GAAOA,EAAI5H,OAAS,IACtB4H,EAAIwmC,EAAW,WAAa,eAAernB,EAAOsnB,eAC9CzmC,EAAI,IAAyB,WAAnBA,EAAI,GAAG0mC,UAAsB1mC,EAAI,GAAGwmC,SAAWA,GACzDznB,EAAOI,OAAOqL,eAAiBzL,EAAOwD,SACxCviB,EAAI+e,EAAOmY,SAAW,WAAa,eAAe/X,EAAOwnB,YAI/D,SAASpX,IAEP,IAAIxQ,EAAOI,OAAOwD,KAAlB,CACA,MAA6B5D,EAAOwK,WAA5Bqd,IAAFA,QAENL,EAFiBM,EAAXA,QAEY9nB,EAAOkL,aACzBsc,EAASK,EAAS7nB,EAAOiL,QAE3B,SAAS8c,EAAYpyC,GACnBA,EAAE8K,iBACEuf,EAAOkL,cAAgBlL,EAAOI,OAAOwD,MACzC5D,EAAOiX,YAET,SAAS+Q,EAAYryC,GACnBA,EAAE8K,iBACEuf,EAAOiL,QAAUjL,EAAOI,OAAOwD,MACnC5D,EAAO6W,YAET,SAASj7B,IACP,IAAMwkB,EAASJ,EAAOI,OAAOoK,WAW7B,GATAxK,EAAOI,OAAOoK,WAAauT,EACzB/d,EACAA,EAAO4Y,eAAepO,WACtBxK,EAAOI,OAAOoK,WACd,CACEC,OAAQ,qBACRC,OAAQ,uBAGNtK,EAAOqK,QAAUrK,EAAOsK,OAA9B,CAEA,IAAMmd,EAAUN,EAAMnnB,EAAOqK,QACvBqd,EAAUP,EAAMnnB,EAAOsK,QAEzBmd,GAAWA,EAAQxuC,OAAS,GAC9BwuC,EAAQtnC,GAAG,QAASynC,GAElBF,GAAWA,EAAQzuC,OAAS,GAC9ByuC,EAAQvnC,GAAG,QAASwnC,GAGtB7zC,OAAO0xB,OAAO5F,EAAOwK,WAAY,CAC/Bqd,UACApd,OAAQod,GAAWA,EAAQ,GAC3BC,UACApd,OAAQod,GAAWA,EAAQ,KAGxB9nB,EAAOwD,UACNqkB,GAASA,EAAQ/nC,SAASsgB,EAAOwnB,WACjCE,GAASA,EAAQhoC,SAASsgB,EAAOwnB,aAGzC,SAAShK,UACsB5d,EAAOwK,WAA5Bqd,IAAFA,QAAWC,IAAXA,QACFD,GAAWA,EAAQxuC,SACrBwuC,EAAQttB,IAAI,QAASytB,GACrBH,EAAQxoC,YAAY2gB,EAAOI,OAAOoK,WAAWkd,gBAE3CI,GAAWA,EAAQzuC,SACrByuC,EAAQvtB,IAAI,QAASwtB,GACrBD,EAAQzoC,YAAY2gB,EAAOI,OAAOoK,WAAWkd,gBA3GjD7L,EAAa,CACXrR,WAAY,CACVC,OAAQ,KACRC,OAAQ,KAERud,aAAaA,EACbP,cAAe,yBACfQ,YAAa,uBACbN,UAAW,wBAIf5nB,EAAOwK,WAAa,CAClBC,OAAQ,KACRod,QAAS,KACTnd,OAAQ,KACRod,QAAS,MA+FXvnC,EAAG,QAAQ,WACT3E,IACA40B,OAEFjwB,EAAG,+BAA+B,WAChCiwB,OAEFjwB,EAAG,WAAW,WACZq9B,OAEFr9B,EAAG,kBAAkB,iBACUyf,EAAOwK,WAA5Bqd,IAAFA,QAAWC,IAAXA,QACFD,GACFA,EAAQ7nB,EAAOwD,QAAU,cAAgB,YAAYxD,EAAOI,OAAOoK,WAAWod,WAE5EE,GACFA,EAAQ9nB,EAAOwD,QAAU,cAAgB,YAAYxD,EAAOI,OAAOoK,WAAWod,cAGlFrnC,EAAG,SAAS,SAAC4+B,EAAIxpC,SACcqqB,EAAOwK,WAA5Bqd,IAAFA,QAAWC,IAAXA,QACAK,EAAWxyC,EAAEif,OACnB,GACEoL,EAAOI,OAAOoK,WAAWyd,cACxBrvC,EAAEuvC,GAAU5zB,GAAGuzB,KACflvC,EAAEuvC,GAAU5zB,GAAGszB,GAChB,CACA,GACE7nB,EAAOooB,YACPpoB,EAAOI,OAAOgoB,YACdpoB,EAAOI,OAAOgoB,WAAWC,YACxBroB,EAAOooB,WAAW/2B,KAAO82B,GAAYnoB,EAAOooB,WAAW/2B,GAAG2H,SAASmvB,IAEpE,OACF,IAAIG,EACAT,EACFS,EAAWT,EAAQvpC,SAAS0hB,EAAOI,OAAOoK,WAAW0d,aAC5CJ,IACTQ,EAAWR,EAAQxpC,SAAS0hB,EAAOI,OAAOoK,WAAW0d,cAGrD9kB,OADEklB,EACG,iBAEA,kBAEHT,GACFA,EAAQvsC,YAAY0kB,EAAOI,OAAOoK,WAAW0d,aAE3CJ,GACFA,EAAQxsC,YAAY0kB,EAAOI,OAAOoK,WAAW0d,iBAKnDh0C,OAAO0xB,OAAO5F,EAAOwK,WAAY,CAC/BgG,SACA50B,OACAgiC,aCxKW,YAAgDxa,IAuCzDmlB,EAvC+BvoB,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAA4B6iB,IAA5BA,KAC3BolB,EAAM,oBACZ3M,EAAa,CACXuM,WAAY,CACV/2B,GAAI,KACJo3B,cAAe,OACfJ,WAAWA,EACXJ,aAAaA,EACbS,aAAc,KACdC,kBAAmB,KACnBC,eAAgB,KAChBC,aAAc,KACdC,qBAAqBA,EACrBv7B,KAAM,UACNw7B,gBAAgBA,EAChBC,mBAAoB,EACpBC,sBAAwBC,mBAAWA,GACnCC,oBAAsBD,mBAAWA,GACjCE,YAAaA,GAAbA,OAAgBZ,aAChBa,kBAAmBA,GAAnBA,OAAsBb,oBACtBc,cAAeA,GAAfA,OAAkBd,OAClBe,aAAcA,GAAdA,OAAiBf,cACjBgB,WAAYA,GAAZA,OAAehB,YACfN,YAAaA,GAAbA,OAAgBM,aAChBiB,qBAAsBA,GAAtBA,OAAyBjB,uBACzBkB,yBAA0BA,GAA1BA,OAA6BlB,2BAC7BmB,eAAgBA,GAAhBA,OAAmBnB,gBACnBZ,UAAWA,GAAXA,OAAcY,WACdoB,gBAAiBA,GAAjBA,OAAoBpB,iBACpBqB,cAAeA,GAAfA,OAAkBrB,kBAItBxoB,EAAOooB,WAAa,CAClB/2B,GAAI,KACJpQ,IAAK,KACL6oC,QAAS,IAIX,IAAIC,EAAqB,EAEzB,SAASC,IACP,OACGhqB,EAAOI,OAAOgoB,WAAW/2B,KACzB2O,EAAOooB,WAAW/2B,KAClB2O,EAAOooB,WAAWnnC,KACc,IAAjC+e,EAAOooB,WAAWnnC,IAAI5H,OAI1B,SAAS4wC,EAAeC,EAAWlD,OACzBqC,EAAsBrpB,EAAOI,OAAOgoB,WAAtCiB,kBACNa,EAAUlD,KACPlnC,SAASA,GAATA,OAAYupC,cAAqBrC,IACjCA,KACAlnC,SAASA,GAATA,OAAYupC,cAAqBrC,cAAYA,IAGlD,SAASxW,IAEP,IAAM5J,EAAM5G,EAAO4G,IACbxG,EAASJ,EAAOI,OAAOgoB,WAC7B,IAAI4B,IAAJ,CACA,IAMIrpB,EANEyQ,EACJpR,EAAOkR,SAAWlR,EAAOI,OAAO8Q,QAAQ1N,QACpCxD,EAAOkR,QAAQ9F,OAAO/xB,OACtB2mB,EAAOoL,OAAO/xB,OACd4H,EAAM+e,EAAOooB,WAAWnnC,IAGxBkpC,EAAQnqB,EAAOI,OAAOwD,KACxB1tB,KAAK69B,MAAM3C,EAAqC,EAAtBpR,EAAOsO,cAAoBtO,EAAOI,OAAO4J,gBACnEhK,EAAO8K,SAASzxB,OAgBpB,GAfI2mB,EAAOI,OAAOwD,OAChBjD,EAAUzqB,KAAK69B,MACZ/T,EAAOkD,YAAclD,EAAOsO,cAAgBtO,EAAOI,OAAO4J,iBAE/CoH,EAAe,EAA0B,EAAtBpR,EAAOsO,eACtC3N,GAAWyQ,EAAqC,EAAtBpR,EAAOsO,cAE/B3N,EAAUwpB,EAAQ,IAAGxpB,GAAWwpB,GAChCxpB,EAAU,GAAsC,YAAjCX,EAAOI,OAAOgqB,iBAA8BzpB,EAAUwpB,EAAQxpB,IAEjFA,WADgBX,EAAOsT,UACbtT,EAAOsT,UAEPtT,EAAOkD,aAAe,EAIhB,YAAhB9C,EAAO7S,MACPyS,EAAOooB,WAAW0B,SAClB9pB,EAAOooB,WAAW0B,QAAQzwC,OAAS,EACnC,CACA,IACIgxC,EACAC,EACAC,EAHET,EAAU9pB,EAAOooB,WAAW0B,QA2BlC,GAvBI1pB,EAAO2oB,iBACTR,EAAauB,EAAQrtB,GAAG,GAAGuD,EAAOyH,eAAiB,aAAe,mBAClExmB,EAAI+a,IACFgE,EAAOyH,eAAiB,QAAU,SAC/B8gB,GAAcnoB,EAAO4oB,mBAAqB,GAA5C,MAEC5oB,EAAO4oB,mBAAqB,QAAK,IAAAhpB,EAAOmD,iBAC1C4mB,GAAsBppB,EAAUX,EAAOmD,eACd/C,EAAO4oB,mBAAqB,EACnDe,EAAqB3pB,EAAO4oB,mBAAqB,EACxCe,EAAqB,IAC9BA,EAAqB,IAKzBQ,IADAD,GADAD,EAAa1pB,EAAUopB,IACG7zC,KAAKG,IAAIyzC,EAAQzwC,OAAQ+mB,EAAO4oB,oBAAsB,IACxDqB,GAAc,GAExCP,EAAQzqC,YACN,CAAC,GAAI,QAAS,aAAc,QAAS,aAAc,SAChDkG,KAAKilC,4BAAcpqB,EAAOipB,0BAAoBmB,MAC9C5qC,KAAK,MAENqB,EAAI5H,OAAS,EACfywC,EAAQ7gC,MAAMwhC,YACZ,IAAMC,EAAU9xC,EAAE6xC,GACZE,EAAcD,EAAQhtC,QACxBitC,IAAgBhqB,GAClB+pB,EAAQ5qC,SAASsgB,EAAOipB,mBAEtBjpB,EAAO2oB,iBACL4B,GAAeN,GAAcM,GAAeL,GAC9CI,EAAQ5qC,SAASA,GAATA,OAAYsgB,EAAOipB,4BAEzBsB,IAAgBN,GAClBJ,EAAeS,EAAS,QAEtBC,IAAgBL,GAClBL,EAAeS,EAAS,gBAIzB,CACL,IAAMA,EAAUZ,EAAQrtB,GAAGkE,GACrBgqB,EAAcD,EAAQhtC,QAE5B,GADAgtC,EAAQ5qC,SAASsgB,EAAOipB,mBACpBjpB,EAAO2oB,eAAgB,CAGzB,IAFA,IAAM6B,EAAwBd,EAAQrtB,GAAG4tB,GACnCQ,EAAuBf,EAAQrtB,GAAG6tB,GAC/B92C,EAAI62C,EAAY72C,GAAK82C,EAAW92C,GAAK,EAC5Cs2C,EAAQrtB,GAAGjpB,GAAGsM,SAASA,GAATA,OAAYsgB,EAAOipB,4BAEnC,GAAIrpB,EAAOI,OAAOwD,KAChB,GAAI+mB,GAAeb,EAAQzwC,OAAS+mB,EAAO4oB,mBAAoB,CAC7D,IAAK,IAAIx1C,EAAI4sB,EAAO4oB,mBAAoBx1C,GAAK,EAAGA,GAAK,EACnDs2C,EAAQrtB,GAAGqtB,EAAQzwC,OAAS7F,GAAGsM,SAASA,GAATA,OAAYsgB,EAAOipB,4BAEpDS,EACGrtB,GAAGqtB,EAAQzwC,OAAS+mB,EAAO4oB,mBAAqB,GAChDlpC,SAASA,GAATA,OAAYsgB,EAAOipB,iCAEtBY,EAAeW,EAAuB,QACtCX,EAAeY,EAAsB,aAGvCZ,EAAeW,EAAuB,QACtCX,EAAeY,EAAsB,SAI3C,GAAIzqB,EAAO2oB,eAAgB,CACzB,IAAM+B,EAAuB50C,KAAKG,IAAIyzC,EAAQzwC,OAAQ+mB,EAAO4oB,mBAAqB,GAC5E+B,GACHxC,EAAauC,EAAuBvC,GAAc,EAAIgC,EAAWhC,EAC9DpG,EAAavb,EAAM,QAAU,OACnCkjB,EAAQ9tB,IAAIgE,EAAOyH,eAAiB0a,EAAa,gBAAU4I,UAS/D,GANoB,aAAhB3qB,EAAO7S,OACTtM,EACGpF,KAAKqiC,EAAkB9d,EAAOmpB,eAC9BluC,KAAK+kB,EAAO6oB,sBAAsBtoB,EAAU,IAC/C1f,EAAIpF,KAAKqiC,EAAkB9d,EAAOopB,aAAanuC,KAAK+kB,EAAO+oB,oBAAoBgB,KAE7D,gBAAhB/pB,EAAO7S,KAAwB,CACjC,IAAIy9B,EAEFA,EADE5qB,EAAO0oB,oBACc9oB,EAAOyH,eAAiB,WAAa,aAErCzH,EAAOyH,eAAiB,aAAe,WAEhE,IAAMwjB,GAAStqB,EAAU,GAAKwpB,EAC1Be,EAAS,EACTC,EAAS,EACgB,eAAzBH,EACFE,EAASD,EAETE,EAASF,EAEXhqC,EACGpF,KAAKqiC,EAAkB9d,EAAOqpB,uBAC9BpwB,UAAUA,6BAAVA,OAAuC6xB,sBAAkBC,QACzD7xB,WAAW0G,EAAOI,OAAOC,OAEV,WAAhBD,EAAO7S,MAAqB6S,EAAOyoB,cACrC5nC,EAAI5G,KAAK+lB,EAAOyoB,aAAa7oB,EAAQW,EAAU,EAAGwpB,IAClD/mB,EAAK,mBAAoBniB,EAAI,KAE7BmiB,EAAK,mBAAoBniB,EAAI,IAE3B+e,EAAOI,OAAOqL,eAAiBzL,EAAOwD,SACxCviB,EAAI+e,EAAOmY,SAAW,WAAa,eAAe/X,EAAOwnB,YAG7D,SAASwD,IAEP,IAAMhrB,EAASJ,EAAOI,OAAOgoB,WAC7B,IAAI4B,IAAJ,CACA,IAAM5Y,EACJpR,EAAOkR,SAAWlR,EAAOI,OAAO8Q,QAAQ1N,QACpCxD,EAAOkR,QAAQ9F,OAAO/xB,OACtB2mB,EAAOoL,OAAO/xB,OAEd4H,EAAM+e,EAAOooB,WAAWnnC,IAC1BoqC,EAAiB,GACrB,GAAoB,YAAhBjrB,EAAO7S,KAAoB,CAC7B,IAAI+9B,EAAkBtrB,EAAOI,OAAOwD,KAChC1tB,KAAK69B,MAAM3C,EAAqC,EAAtBpR,EAAOsO,cAAoBtO,EAAOI,OAAO4J,gBACnEhK,EAAO8K,SAASzxB,OAElB2mB,EAAOI,OAAO0I,UACd9I,EAAOI,OAAO0I,SAAStF,UACtBxD,EAAOI,OAAOwD,MACf0nB,EAAkBla,IAElBka,EAAkBla,GAEpB,IAAK,IAAI59B,EAAI,EAAGA,EAAI83C,EAAiB93C,GAAK,EACpC4sB,EAAOsoB,aACT2C,GAAkBjrB,EAAOsoB,aAAa/0C,KAAKqsB,EAAQxsB,EAAG4sB,EAAOgpB,aAE7DiC,cAAsBjrB,EAAOqoB,iCAAwBroB,EAAOgpB,2BAAkBhpB,EAAOqoB,mBAGzFxnC,EAAI5G,KAAKgxC,GAETrrB,EAAOooB,WAAW0B,QAAU7oC,EAAIpF,KAAKqiC,EAAkB9d,EAAOgpB,cAE5C,aAAhBhpB,EAAO7S,OAEP89B,EADEjrB,EAAOwoB,eACQxoB,EAAOwoB,eAAej1C,KAAKqsB,EAAQI,EAAOmpB,aAAcnpB,EAAOopB,mCAG9DppB,EAAOmpB,iDAEPnpB,EAAOopB,wBAE3BvoC,EAAI5G,KAAKgxC,IAES,gBAAhBjrB,EAAO7S,OAEP89B,EADEjrB,EAAOuoB,kBACQvoB,EAAOuoB,kBAAkBh1C,KAAKqsB,EAAQI,EAAOqpB,6CAE7BrpB,EAAOqpB,kCAE1CxoC,EAAI5G,KAAKgxC,IAES,WAAhBjrB,EAAO7S,MACT6V,EAAK,mBAAoBpD,EAAOooB,WAAWnnC,IAAI,KAGnD,SAASrF,IACPokB,EAAOI,OAAOgoB,WAAarK,EACzB/d,EACAA,EAAO4Y,eAAewP,WACtBpoB,EAAOI,OAAOgoB,WACd,CAAE/2B,GAAI,sBAER,IAAM+O,EAASJ,EAAOI,OAAOgoB,WAC7B,GAAKhoB,EAAO/O,GAAZ,CAEA,IAAIpQ,EAAMrI,EAAEwnB,EAAO/O,IACA,IAAfpQ,EAAI5H,SAEJ2mB,EAAOI,OAAO6N,mBAA0C,iBAAd7N,EAAO/O,IAAmBpQ,EAAI5H,OAAS,KACnF4H,EAAM+e,EAAO/e,IAAIpF,KAAKukB,EAAO/O,KAErBhY,OAAS,IACf4H,EAAMA,EAAI4W,QAAQxG,mBACZzY,EAAEyY,GAAIzP,QAAQ,WAAW,KAAOoe,EAAO3O,QAM7B,YAAhB+O,EAAO7S,MAAsB6S,EAAOioB,WACtCpnC,EAAInB,SAASsgB,EAAOupB,gBAGtB1oC,EAAInB,SAASsgB,EAAOkpB,cAAgBlpB,EAAO7S,MAC3CtM,EAAInB,SAASsgB,EAAOkpB,cAAgBtpB,EAAOI,OAAO6C,WAE9B,YAAhB7C,EAAO7S,MAAsB6S,EAAO2oB,iBACtC9nC,EAAInB,SAASA,GAATA,OAAYsgB,EAAOkpB,sBAAgBlpB,EAAO7S,kBAC9Cw8B,EAAqB,EACjB3pB,EAAO4oB,mBAAqB,IAC9B5oB,EAAO4oB,mBAAqB,IAGZ,gBAAhB5oB,EAAO7S,MAA0B6S,EAAO0oB,qBAC1C7nC,EAAInB,SAASsgB,EAAOspB,0BAGlBtpB,EAAOioB,WACTpnC,EAAIV,GAAG,QAAS29B,EAAkB9d,EAAOgpB,cAAc,SAAiBzzC,GACtEA,EAAE8K,iBACF,IAAI/C,EAAQ9E,EAAEnD,MAAMiI,QAAUsiB,EAAOI,OAAO4J,eACxChK,EAAOI,OAAOwD,OAAMlmB,GAASsiB,EAAOsO,cACxCtO,EAAOqK,QAAQ3sB,MAInBxJ,OAAO0xB,OAAO5F,EAAOooB,WAAY,CAC/BnnC,MACAoQ,GAAIpQ,EAAI,KAGL+e,EAAOwD,SACVviB,EAAInB,SAASsgB,EAAOwnB,aAGxB,SAAShK,IACP,IAAMxd,EAASJ,EAAOI,OAAOgoB,WAC7B,IAAI4B,IAAJ,CACA,IAAM/oC,EAAM+e,EAAOooB,WAAWnnC,IAE9BA,EAAI5B,YAAY+gB,EAAO8nB,aACvBjnC,EAAI5B,YAAY+gB,EAAOkpB,cAAgBlpB,EAAO7S,MAC9CtM,EAAI5B,YAAY+gB,EAAOkpB,cAAgBtpB,EAAOI,OAAO6C,WACjDjD,EAAOooB,WAAW0B,SAAW9pB,EAAOooB,WAAW0B,QAAQzqC,aACzD2gB,EAAOooB,WAAW0B,QAAQzqC,YAAY+gB,EAAOipB,mBAC3CjpB,EAAOioB,WACTpnC,EAAIsZ,IAAI,QAAS2jB,EAAkB9d,EAAOgpB,eAI9C7oC,EAAG,QAAQ,WACT3E,IACAwvC,IACA5a,OAEFjwB,EAAG,qBAAqB,YAClByf,EAAOI,OAAOwD,eAEA5D,EAAOsT,YADvB9C,OAKJjwB,EAAG,mBAAmB,WACfyf,EAAOI,OAAOwD,MACjB4M,OAGJjwB,EAAG,sBAAsB,WACnByf,EAAOI,OAAOwD,OAChBwnB,IACA5a,QAGJjwB,EAAG,wBAAwB,WACpByf,EAAOI,OAAOwD,OACjBwnB,IACA5a,QAGJjwB,EAAG,WAAW,WACZq9B,OAEFr9B,EAAG,kBAAkB,eACXU,EAAQ+e,EAAOooB,WAAjBnnC,IACFA,GACFA,EAAI+e,EAAOwD,QAAU,cAAgB,YAAYxD,EAAOI,OAAOgoB,WAAWR,cAG9ErnC,EAAG,eAAe,WAChBiwB,OAEFjwB,EAAG,SAAS,SAAC4+B,EAAIxpC,GACTwyC,MAAWxyC,EAAEif,OACX3T,EAAQ+e,EAAOooB,WAAjBnnC,IACN,GACE+e,EAAOI,OAAOgoB,WAAW/2B,IACzB2O,EAAOI,OAAOgoB,WAAWH,aACzBhnC,EAAI5H,OAAS,IACZT,EAAEuvC,GAAU7pC,SAAS0hB,EAAOI,OAAOgoB,WAAWgB,aAC/C,CACA,GACEppB,EAAOwK,aACLxK,EAAOwK,WAAWC,QAAU0d,IAAanoB,EAAOwK,WAAWC,QAC1DzK,EAAOwK,WAAWE,QAAUyd,IAAanoB,EAAOwK,WAAWE,QAE9D,OACF,IAAM4d,EAAWrnC,EAAI3C,SAAS0hB,EAAOI,OAAOgoB,WAAWF,aAErD9kB,OADEklB,EACG,iBAEA,kBAEPrnC,EAAI3F,YAAY0kB,EAAOI,OAAOgoB,WAAWF,iBAI7Ch0C,OAAO0xB,OAAO5F,EAAOooB,WAAY,CAC/BgD,SACA5a,SACA50B,OACAgiC,aC7ZW,YAA+Cxa,IAMxDmoB,EACAC,EACAC,EACAC,EAT8B1rB,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAA4B6iB,IAA5BA,KAC1B9iB,EAAW2V,IAEbmO,KACAsgB,EAAU,KACViH,EAAc,KAyBlB,SAASxiB,IACP,GAAKnJ,EAAOI,OAAOwrB,UAAUv6B,IAAO2O,EAAO4rB,UAAUv6B,GAArD,CACA,IAAQu6B,EAA2C5rB,EAA7C4rB,UAA2BhlB,EAAkB5G,EAAhC6G,aAAmBjG,EAAaZ,EAA7CY,SACEirB,EAAiBD,EAAnBC,QAAW5qC,EAAQ2qC,EAAnB3qC,IACAmf,EAASJ,EAAOI,OAAOwrB,UAEzBE,EAAUN,EACVO,GAAUN,EAAYD,GAAY5qB,EAClCgG,GACFmlB,GAAUA,GACG,GACXD,EAAUN,EAAWO,EACrBA,EAAS,IACCA,EAASP,EAAWC,IAC9BK,EAAUL,EAAYM,GAEfA,EAAS,GAClBD,EAAUN,EAAWO,EACrBA,EAAS,GACAA,EAASP,EAAWC,IAC7BK,EAAUL,EAAYM,GAEpB/rB,EAAOyH,gBACTokB,EAAQxyB,UAAUA,eAAVA,OAAyB0yB,gBACjCF,EAAQ,GAAGr2B,MAAM/D,MAAQA,GAARA,OAAWq6B,UAE5BD,EAAQxyB,UAAUA,oBAAVA,OAA8B0yB,aACtCF,EAAQ,GAAGr2B,MAAM7D,OAASA,GAATA,OAAYm6B,SAE3B1rB,EAAO4rB,OACT3zC,aAAaqsC,GACbzjC,EAAI,GAAGuU,MAAMy2B,QAAU,EACvBvH,EAAU/sC,YAAW,WACnBsJ,EAAI,GAAGuU,MAAMy2B,QAAU,EACvBhrC,EAAIqY,WAAW,OACd,OAOP,SAAS2M,IACP,GAAKjG,EAAOI,OAAOwrB,UAAUv6B,IAAO2O,EAAO4rB,UAAUv6B,GAArD,CAEA,IAAQu6B,EAAc5rB,EAAhB4rB,UACEC,EAAiBD,EAAnBC,QAAW5qC,EAAQ2qC,EAAnB3qC,IAEN4qC,EAAQ,GAAGr2B,MAAM/D,MAAQ,GACzBo6B,EAAQ,GAAGr2B,MAAM7D,OAAS,GAC1B85B,EAAYzrB,EAAOyH,eAAiBxmB,EAAI,GAAGyQ,YAAczQ,EAAI,GAAG2Q,aAEhE85B,EACE1rB,EAAO2Q,MACN3Q,EAAO2R,YACN3R,EAAOI,OAAOuN,oBACb3N,EAAOI,OAAO+K,eAAiBnL,EAAO8K,SAAS,GAAK,IAEvD0gB,EADuC,SAArCxrB,EAAOI,OAAOwrB,UAAUJ,SACfC,EAAYC,EAEZ9xC,SAASomB,EAAOI,OAAOwrB,UAAUJ,SAAU,IAGpDxrB,EAAOyH,eACTokB,EAAQ,GAAGr2B,MAAM/D,MAAQA,GAARA,OAAW+5B,QAE5BK,EAAQ,GAAGr2B,MAAM7D,OAASA,GAATA,OAAY65B,QAI7BvqC,EAAI,GAAGuU,MAAM02B,QADXR,GAAW,EACU,OAEA,GAErB1rB,EAAOI,OAAOwrB,UAAUI,OAC1B/qC,EAAI,GAAGuU,MAAMy2B,QAAU,GAGrBjsB,EAAOI,OAAOqL,eAAiBzL,EAAOwD,SACxCooB,EAAU3qC,IAAI+e,EAAOmY,SAAW,WAAa,eAC3CnY,EAAOI,OAAOwrB,UAAUhE,YAI9B,SAASuE,EAAmBx2C,GAC1B,OAAIqqB,EAAOyH,eACS,eAAX9xB,EAAE4X,MAAoC,cAAX5X,EAAE4X,KAChC5X,EAAEuvB,cAAc,GAAGknB,QACnBz2C,EAAEy2C,QAEU,eAAXz2C,EAAE4X,MAAoC,cAAX5X,EAAE4X,KAChC5X,EAAEuvB,cAAc,GAAGmnB,QACnB12C,EAAE02C,QAER,SAASC,EAAgB32C,OAInB42C,EAHIX,EAAiC5rB,EAAnC4rB,UAA2BhlB,EAAQ5G,EAAtB6G,aACX5lB,EAAQ2qC,EAAV3qC,IAGNsrC,GACGJ,EAAmBx2C,GAClBsL,EAAIN,SAASqf,EAAOyH,eAAiB,OAAS,QAC5B,OAAjB8jB,EAAwBA,EAAeC,EAAW,KACpDC,EAAYD,GACfe,EAAgBr2C,KAAKC,IAAID,KAAKG,IAAIk2C,EAAe,GAAI,GACjD3lB,IACF2lB,EAAgB,EAAIA,GAGtB,IAAMvF,EACJhnB,EAAOoH,gBAAkBpH,EAAOmH,eAAiBnH,EAAOoH,gBAAkBmlB,EAE5EvsB,EAAOkJ,eAAe8d,GACtBhnB,EAAOmJ,aAAa6d,GACpBhnB,EAAOgJ,oBACPhJ,EAAOiJ,sBAET,SAASujB,EAAY72C,GACbyqB,MAASJ,EAAOI,OAAOwrB,UACrBA,EAA0B5rB,EAA5B4rB,UAAa3jB,EAAejI,EAA5BiI,WACEhnB,EAAiB2qC,EAAnB3qC,IAAO4qC,EAAYD,EAAnBC,QACNznB,KACAmnB,EACE51C,EAAEif,SAAWi3B,EAAQ,IAAMl2C,EAAEif,SAAWi3B,EACpCM,EAAmBx2C,GACnBA,EAAEif,OAAO+G,wBAAwBqE,EAAOyH,eAAiB,OAAS,OAClE,KACN9xB,EAAE8K,iBACF9K,EAAEmyB,kBAEFG,EAAW3O,WAAW,KACtBuyB,EAAQvyB,WAAW,KACnBgzB,EAAgB32C,GAEhB0C,aAAaszC,GAEb1qC,EAAIqY,WAAW,GACX8G,EAAO4rB,MACT/qC,EAAI+a,IAAI,UAAW,GAEjBgE,EAAOI,OAAOuD,SAChB3D,EAAOiI,WAAWjM,IAAI,mBAAoB,QAE5CoH,EAAK,qBAAsBztB,GAE7B,SAAS82C,EAAW92C,OACVi2C,EAA0B5rB,EAA5B4rB,UAAa3jB,EAAejI,EAA5BiI,WACEhnB,EAAiB2qC,EAAnB3qC,IAAO4qC,EAAYD,EAAnBC,QAEDznB,IACDzuB,EAAE8K,eAAgB9K,EAAE8K,iBACnB9K,EAAE8uC,aAAcA,EACrB6H,EAAgB32C,GAChBsyB,EAAW3O,WAAW,GACtBrY,EAAIqY,WAAW,GACfuyB,EAAQvyB,WAAW,GACnB8J,EAAK,oBAAqBztB,IAE5B,SAAS+2C,EAAU/2C,GACXyqB,MAASJ,EAAOI,OAAOwrB,UACrBA,EAA0B5rB,EAA5B4rB,UAAa3jB,EAAejI,EAA5BiI,WACEhnB,EAAQ2qC,EAAV3qC,IAEDmjB,IACLA,KACIpE,EAAOI,OAAOuD,UAChB3D,EAAOiI,WAAWjM,IAAI,mBAAoB,IAC1CiM,EAAW3O,WAAW,KAEpB8G,EAAO4rB,OACT3zC,aAAaszC,GACbA,EAAc9tB,GAAS,WACrB5c,EAAI+a,IAAI,UAAW,GACnB/a,EAAIqY,WAAW,OACd,MAEL8J,EAAK,mBAAoBztB,GACrByqB,EAAOusB,eACT3sB,EAAOwX,kBAIX,SAASrd,EAAOjV,OACN0mC,EAAqE5rB,EAAvE4rB,UAAazP,EAA0Dnc,EAAvEmc,iBAA+BC,EAAwCpc,EAAvEoc,mBAAmDhc,EAAoBJ,EAAvEI,OAA2D7H,EAAYyH,EAAvEzH,QAEA3D,EADMg3B,EAAU3qC,IACH,GACb2rC,KACJr0B,EAAQgJ,kBAAmBnB,EAAOqM,mBAC9B,CAAEC,SAASA,EAAO9S,SAASA,GAE3B2H,KACJhJ,EAAQgJ,kBAAmBnB,EAAOqM,mBAC9B,CAAEC,SAASA,EAAM9S,SAASA,GAEhC,GAAKhF,EAAL,CACA,IAAMi4B,EAAyB,OAAX3nC,EAAkB,mBAAqB,sBACtDqT,EAAQ8I,OAKXzM,EAAOi4B,GAAa1Q,EAAiBh2B,MAAOqmC,EAAaI,GACzDh4B,EAAOi4B,GAAa1Q,EAAiBxP,KAAM8f,EAAYG,GACvDh4B,EAAOi4B,GAAa1Q,EAAiBxpB,IAAK+5B,EAAWnrB,KANrD3M,EAAOi4B,GAAazQ,EAAmBj2B,MAAOqmC,EAAaI,GAC3DtsC,EAASusC,GAAazQ,EAAmBzP,KAAM8f,EAAYG,GAC3DtsC,EAASusC,GAAazQ,EAAmBzpB,IAAK+5B,EAAWnrB,KAgB7D,SAAS3lB,QACCgwC,EAA8B5rB,EAAhC4rB,UAAkBkB,EAAc9sB,EAAnB/e,IACnB+e,EAAOI,OAAOwrB,UAAY7N,EACxB/d,EACAA,EAAO4Y,eAAegT,UACtB5rB,EAAOI,OAAOwrB,UACd,CAAEv6B,GAAI,qBAER,IAAM+O,EAASJ,EAAOI,OAAOwrB,UAC7B,GAAKxrB,EAAO/O,GAAZ,CAEA,IAAIpQ,EAAMrI,EAAEwnB,EAAO/O,IAEjB2O,EAAOI,OAAO6N,mBACO,iBAAd7N,EAAO/O,IACdpQ,EAAI5H,OAAS,GACwB,IAArCyzC,EAAUjxC,KAAKukB,EAAO/O,IAAIhY,SAE1B4H,EAAM6rC,EAAUjxC,KAAKukB,EAAO/O,KAG9B,IAAIw6B,EAAU5qC,EAAIpF,KAAKA,IAALA,OAASmkB,EAAOI,OAAOwrB,UAAUmB,YAC5B,IAAnBlB,EAAQxyC,SACVwyC,EAAUjzC,wBAAiBonB,EAAOI,OAAOwrB,UAAUmB,uBACnD9rC,EAAIuC,OAAOqoC,IAGb33C,OAAO0xB,OAAOgmB,EAAW,CACvB3qC,MACAoQ,GAAIpQ,EAAI,GACR4qC,UACAmB,OAAQnB,EAAQ,KAGdzrB,EAAO6sB,WAzCNjtB,EAAOI,OAAOwrB,UAAUv6B,IAC7B8I,EAAO,MA4CHlZ,GACFA,EAAI+e,EAAOwD,QAAU,cAAgB,YAAYxD,EAAOI,OAAOwrB,UAAUhE,YAG7E,SAAShK,IA7CF5d,EAAOI,OAAOwrB,UAAUv6B,IAC7B8I,EAAO,OAxOT0hB,EAAa,CACX+P,UAAW,CACTv6B,GAAI,KACJm6B,SAAU,OACVQ,MAAMA,EACNiB,WAAWA,EACXN,eAAeA,EACf/E,UAAW,wBACXmF,UAAW,2BAIf/sB,EAAO4rB,UAAY,CACjBv6B,GAAI,KACJ27B,OAAQ,KACR/rC,IAAK,KACL4qC,QAAS,MAwQXtrC,EAAG,QAAQ,WACT3E,IACAqqB,IACAkD,OAEF5oB,EAAG,4CAA4C,WAC7C0lB,OAEF1lB,EAAG,gBAAgB,WACjB4oB,OAEF5oB,EAAG,iBAAiB,SAAC4+B,EAAI5lB,IA1OzB,SAAuBA,GAChByG,EAAOI,OAAOwrB,UAAUv6B,IAAO2O,EAAO4rB,UAAUv6B,IACrD2O,EAAO4rB,UAAUC,QAAQvyB,WAAWC,GAFtC,CA2OgBA,MAEhBhZ,EAAG,kBAAkB,eACXU,EAAQ+e,EAAO4rB,UAAjB3qC,IACFA,GACFA,EAAI+e,EAAOwD,QAAU,cAAgB,YAAYxD,EAAOI,OAAOwrB,UAAUhE,cAG7ErnC,EAAG,WAAW,WACZq9B,OAGF1pC,OAAO0xB,OAAO5F,EAAO4rB,UAAW,CAC9B3lB,aACAkD,eACAvtB,OACAgiC,aClUW,YAA0Cr9B,IAAtByf,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAC/Bs7B,EAAa,CACXqR,SAAU,CACR1pB,SAASA,KAIb,IAAM2pB,EAAe,SAAC97B,EAAIuP,GACxB,IAAQgG,EAAQ5G,EAAV4G,IAEA3lB,EAAMrI,EAAEyY,GACRw0B,EAAYjf,GAAO,EAAI,EAEvBtxB,EAAI2L,EAAIiB,KAAK,yBAA2B,IAC1CoJ,EAAIrK,EAAIiB,KAAK,0BACbuzB,EAAIx0B,EAAIiB,KAAK,0BACX+oC,EAAQhqC,EAAIiB,KAAK,8BACjB+pC,EAAUhrC,EAAIiB,KAAK,gCAwBzB,GAtBIoJ,GAAKmqB,GACPnqB,EAAIA,GAAK,IACTmqB,EAAIA,GAAK,KACAzV,EAAOyH,gBAChBnc,EAAIhW,EACJmgC,EAAI,MAEJA,EAAIngC,EACJgW,EAAI,KAIJA,EADEA,EAAEnJ,QAAQ,MAAQ,EACbvI,SAAS0R,EAAG,IAAMsV,EAAWilB,EAA/B,IAEEv6B,EAAIsV,EAAWilB,EAAjB,KAGLpQ,EADEA,EAAEtzB,QAAQ,MAAQ,EACbvI,SAAS67B,EAAG,IAAM7U,EAApB,IAEE6U,EAAI7U,EAAN,KAGH,MAAOqrB,EAA6C,CACtD,IAAMmB,EAAiBnB,GAAWA,EAAU,IAAM,EAAI/1C,KAAKyxB,IAAI/G,IAC/D3f,EAAI,GAAGuU,MAAMy2B,QAAUmB,EAEzB,GAAI,MAAOnC,EACThqC,EAAIoY,UAAUA,eAAVA,OAAyB/N,eAAMmqB,iBAC9B,CACL,IAAM4X,EAAepC,GAASA,EAAQ,IAAM,EAAI/0C,KAAKyxB,IAAI/G,IACzD3f,EAAIoY,UAAUA,eAAVA,OAAyB/N,eAAMmqB,0BAAiB4X,UAIlDlkB,EAAe,eACXloB,EAAoC+e,EAAtC/e,IAAOmqB,EAA+BpL,EAAtCoL,OAAexK,EAAuBZ,EAAtCY,SAAyBkK,EAAa9K,EAAtC8K,SACN7pB,EACGxB,SACC,4IAEDwJ,MAAMoI,YACL87B,EAAa97B,EAAIuP,MAErBwK,EAAOniB,MAAK,SAAC6zB,EAAS9J,GACpB,IAAIqB,EAAgByI,EAAQlc,SACxBZ,EAAOI,OAAO4J,eAAiB,GAAqC,SAAhChK,EAAOI,OAAO4K,gBACpDqJ,GAAiBn+B,KAAK69B,KAAKf,EAAa,GAAKpS,GAAYkK,EAASzxB,OAAS,IAE7Eg7B,EAAgBn+B,KAAKG,IAAIH,KAAKC,IAAIk+B,GAAgB,GAAI,GACtDz7B,EAAEkkC,GACCjhC,KACC,4IAEDoN,MAAMoI,YACL87B,EAAa97B,EAAIgjB,UAoBzB9zB,EAAG,cAAc,WACVyf,EAAOI,OAAO8sB,SAAS1pB,UAC5BxD,EAAOI,OAAO2I,qBAAsBA,EACpC/I,EAAO4Y,eAAe7P,qBAAsBA,MAE9CxoB,EAAG,QAAQ,WACJyf,EAAOI,OAAO8sB,SAAS1pB,SAC5B2F,OAEF5oB,EAAG,gBAAgB,WACZyf,EAAOI,OAAO8sB,SAAS1pB,SAC5B2F,OAEF5oB,EAAG,iBAAiB,SAAC+sC,EAAS/zB,GACvByG,EAAOI,OAAO8sB,SAAS1pB,SA7BR,WAA0BnD,IAAzB9G,yDAAWyG,EAAOI,OAAOC,MACtCpf,EAAQ+e,EAAV/e,IACNA,EACGpF,KACC,4IAEDoN,MAAMskC,YACL,IAAMC,EAAc50C,EAAE20C,GAClBE,EACF7zC,SAAS4zC,EAAYtrC,KAAK,iCAAkC,KAAOqX,EACpD,IAAbA,IAAgBk0B,EAAmB,GACvCD,EAAYl0B,WAAWm0B,MAXP,CA8BNl0B,OC1GH,YAA0C6J,IAA1BpD,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAA4B6iB,IAA5BA,KACrBxtB,EAASqhB,IACf4kB,EAAa,CACX6R,KAAM,CACJlqB,SAASA,EACTmqB,SAAU,EACV/T,SAAU,EACV3gB,QAAQA,EACR20B,eAAgB,wBAChBC,iBAAkB,yBAItB7tB,EAAO0tB,KAAO,CACZlqB,SAASA,GAGX,IAEIsqB,EACAC,EACAC,EAJAX,EAAe,EACfY,KAIEC,EAAU,CACd5O,cAAUA,EACV6O,gBAAYA,EACZC,iBAAaA,EACbC,cAAUA,EACVC,kBAAcA,EACdX,SAAU,GAEN3S,EAAQ,CACZ5W,eAAWA,EACXC,aAASA,EACTY,cAAUA,EACVG,cAAUA,EACVmpB,UAAMA,EACNC,UAAMA,EACNC,UAAMA,EACNC,UAAMA,EACNj9B,WAAOA,EACPE,YAAQA,EACR2T,YAAQA,EACRC,YAAQA,EACRopB,aAAc,GACdC,eAAgB,IAEZ3S,EAAW,CACf3wB,OAAGA,EACHmqB,OAAGA,EACHoZ,mBAAeA,EACfC,mBAAeA,EACfC,cAAUA,GAGR9D,EAAQ,EAeZ,SAAS+D,EAA0Br5C,GACjC,GAAIA,EAAEuvB,cAAc7rB,OAAS,EAAG,OAAO,EACvC,IAAM41C,EAAKt5C,EAAEuvB,cAAc,GAAGC,MACxB+pB,EAAKv5C,EAAEuvB,cAAc,GAAGG,MACxB8pB,EAAKx5C,EAAEuvB,cAAc,GAAGC,MACxBiqB,EAAKz5C,EAAEuvB,cAAc,GAAGG,MAE9B,OADiBnvB,KAAKqxB,KAAKA,KAALA,IAAM4nB,EAAKF,EAAO,YAAKG,EAAKF,EAAO,IAK3D,SAASG,EAAe15C,GACtB,IAAM4iB,EAAUyH,EAAOzH,QACjB6H,EAASJ,EAAOI,OAAOstB,KAG7B,GAFAK,KACAC,MACKz1B,EAAQmJ,SAAU,CACrB,GAAe,eAAX/rB,EAAE4X,MAAqC,eAAX5X,EAAE4X,MAAyB5X,EAAEuvB,cAAc7rB,OAAS,EAClF,OAEF00C,KACAG,EAAQoB,WAAaN,EAA0Br5C,GAE5Cu4C,EAAQ5O,UAAa4O,EAAQ5O,SAASjmC,SACzC60C,EAAQ5O,SAAW1mC,EAAEjD,EAAEif,QAAQ1U,QAAQA,IAARA,OAAY8f,EAAOI,OAAOsO,aACzB,IAA5Bwf,EAAQ5O,SAASjmC,SAAc60C,EAAQ5O,SAAWtf,EAAOoL,OAAO3O,GAAGuD,EAAOkD,cAC9EgrB,EAAQG,SAAWH,EAAQ5O,SACxBzjC,KAAKA,IAALA,OAASukB,EAAOwtB,iBAChBnxB,GAAG,GACH5gB,KAAK,kDACRqyC,EAAQI,aAAeJ,EAAQG,SAAShwC,OAAOA,IAAPA,OAAW+hB,EAAOwtB,iBAC1DM,EAAQP,SAAWO,EAAQI,aAAapsC,KAAK,qBAAuBke,EAAOutB,SACvC,IAAhCO,EAAQI,aAAaj1C,SAKvB60C,EAAQG,UACVH,EAAQG,SAAS/0B,WAAW,GAE9B20B,MAPIC,EAAQG,cAAWA,EASzB,SAASkB,EAAgB55C,GACvB,IAAM4iB,EAAUyH,EAAOzH,QACjB6H,EAASJ,EAAOI,OAAOstB,KACvBA,EAAO1tB,EAAO0tB,KACpB,IAAKn1B,EAAQmJ,SAAU,CACrB,GAAe,cAAX/rB,EAAE4X,MAAoC,cAAX5X,EAAE4X,MAAwB5X,EAAEuvB,cAAc7rB,OAAS,EAChF,OAEF20C,KACAE,EAAQsB,UAAYR,EAA0Br5C,GAG3Cu4C,EAAQG,UAAwC,IAA5BH,EAAQG,SAASh1C,QAItCkf,EAAQmJ,SACVgsB,EAAKzC,MAAQt1C,EAAEs1C,MAAQoC,EAEvBK,EAAKzC,MAASiD,EAAQsB,UAAYtB,EAAQoB,WAAcjC,EAEtDK,EAAKzC,MAAQiD,EAAQP,WACvBD,EAAKzC,MAAQiD,EAAQP,SAAW,EAAI,KAAJ,IAAKD,EAAKzC,MAAQiD,EAAQP,SAAW,EAAM,KAEzED,EAAKzC,MAAQ7qB,EAAOwZ,WACtB8T,EAAKzC,MAAQ7qB,EAAOwZ,SAAW,EAAI,KAAJ,IAAKxZ,EAAOwZ,SAAW8T,EAAKzC,MAAQ,EAAM,KAE3EiD,EAAQG,SAASh1B,UAAUA,4BAAVA,OAAsCq0B,EAAKzC,aAd3C,kBAAXt1C,EAAE4X,MAA0B8hC,EAAe15C,GAgBnD,SAAS85C,EAAa95C,GACpB,IAAMosB,EAAS/B,EAAO+B,OAChBxJ,EAAUyH,EAAOzH,QACjB6H,EAASJ,EAAOI,OAAOstB,KACvBA,EAAO1tB,EAAO0tB,KACpB,IAAKn1B,EAAQmJ,SAAU,CACrB,IAAKqsB,IAAuBC,EAC1B,OAEF,GACa,aAAXr4C,EAAE4X,MACU,aAAX5X,EAAE4X,MAAuB5X,EAAEoxB,eAAe1tB,OAAS,IAAM0oB,EAAOE,QAEjE,OAEF8rB,KACAC,KAEGE,EAAQG,UAAwC,IAA5BH,EAAQG,SAASh1C,SAC1Cq0C,EAAKzC,MAAQ/0C,KAAKC,IAAID,KAAKG,IAAIq3C,EAAKzC,MAAOiD,EAAQP,UAAWvtB,EAAOwZ,UACrEsU,EAAQG,SACL/0B,WAAW0G,EAAOI,OAAOC,OACzBhH,UAAUA,4BAAVA,OAAsCq0B,EAAKzC,YAC9CoC,EAAeK,EAAKzC,MACpBgD,KACmB,IAAfP,EAAKzC,QAAaiD,EAAQ5O,cAAWA,IAW3C,SAAS3Y,EAAYhxB,GACnB,IAAM+3C,EAAO1tB,EAAO0tB,KACpB,GAAKQ,EAAQG,UAAwC,IAA5BH,EAAQG,SAASh1C,SAC1C2mB,EAAO+E,YAAaA,EACfiW,EAAM5W,WAAc8pB,EAAQ5O,UAAjC,CAEKtE,EAAM3W,UACT2W,EAAMvpB,MAAQy8B,EAAQG,SAAS,GAAG38B,YAClCspB,EAAMrpB,OAASu8B,EAAQG,SAAS,GAAGz8B,aACnCopB,EAAM1V,OAASvH,EAAamwB,EAAQI,aAAa,GAAI,MAAQ,EAC7DtT,EAAMzV,OAASxH,EAAamwB,EAAQI,aAAa,GAAI,MAAQ,EAC7DJ,EAAQC,WAAaD,EAAQ5O,SAAS,GAAG5tB,YACzCw8B,EAAQE,YAAcF,EAAQ5O,SAAS,GAAG1tB,aAC1Cs8B,EAAQI,aAAah1B,WAAW,IAGlC,IAAMo2B,EAAc1U,EAAMvpB,MAAQi8B,EAAKzC,MACjC0E,EAAe3U,EAAMrpB,OAAS+7B,EAAKzC,MAEzC,KAAIyE,EAAcxB,EAAQC,YAAcwB,EAAezB,EAAQE,aAA/D,CAUA,GARApT,EAAMuT,KAAOr4C,KAAKG,IAAI63C,EAAQC,WAAa,EAAIuB,EAAc,EAAG,GAChE1U,EAAMyT,MAAQzT,EAAMuT,KACpBvT,EAAMwT,KAAOt4C,KAAKG,IAAI63C,EAAQE,YAAc,EAAIuB,EAAe,EAAG,GAClE3U,EAAM0T,MAAQ1T,EAAMwT,KAEpBxT,EAAM4T,eAAetjC,EAAe,cAAX3V,EAAE4X,KAAuB5X,EAAEuvB,cAAc,GAAGC,MAAQxvB,EAAEwvB,MAC/E6V,EAAM4T,eAAenZ,EAAe,cAAX9/B,EAAE4X,KAAuB5X,EAAEuvB,cAAc,GAAGG,MAAQ1vB,EAAE0vB,OAE1E2V,EAAM3W,UAAY4pB,EAAW,CAChC,GACEjuB,EAAOyH,iBACLvxB,KAAKgF,MAAM8/B,EAAMuT,QAAUr4C,KAAKgF,MAAM8/B,EAAM1V,SAC5C0V,EAAM4T,eAAetjC,EAAI0vB,EAAM2T,aAAarjC,GAC3CpV,KAAKgF,MAAM8/B,EAAMyT,QAAUv4C,KAAKgF,MAAM8/B,EAAM1V,SAC3C0V,EAAM4T,eAAetjC,EAAI0vB,EAAM2T,aAAarjC,GAGhD,YADA0vB,EAAM5W,WAAYA,GAGpB,IACGpE,EAAOyH,iBACNvxB,KAAKgF,MAAM8/B,EAAMwT,QAAUt4C,KAAKgF,MAAM8/B,EAAMzV,SAC5CyV,EAAM4T,eAAenZ,EAAIuF,EAAM2T,aAAalZ,GAC3Cv/B,KAAKgF,MAAM8/B,EAAM0T,QAAUx4C,KAAKgF,MAAM8/B,EAAMzV,SAC3CyV,EAAM4T,eAAenZ,EAAIuF,EAAM2T,aAAalZ,GAGhD,YADAuF,EAAM5W,WAAYA,GAIlBzuB,EAAEolB,YACJplB,EAAE8K,iBAEJ9K,EAAEmyB,kBAEFkT,EAAM3W,SAAUA,EAChB2W,EAAM/V,SAAW+V,EAAM4T,eAAetjC,EAAI0vB,EAAM2T,aAAarjC,EAAI0vB,EAAM1V,OACvE0V,EAAM5V,SAAW4V,EAAM4T,eAAenZ,EAAIuF,EAAM2T,aAAalZ,EAAIuF,EAAMzV,OAEnEyV,EAAM/V,SAAW+V,EAAMuT,OACzBvT,EAAM/V,SAAW+V,EAAMuT,KAAO,EAAI,KAAJ,IAAKvT,EAAMuT,KAAOvT,EAAM/V,SAAW,EAAM,KAErE+V,EAAM/V,SAAW+V,EAAMyT,OACzBzT,EAAM/V,SAAW+V,EAAMyT,KAAO,EAAI,KAAJ,IAAKzT,EAAM/V,SAAW+V,EAAMyT,KAAO,EAAM,KAGrEzT,EAAM5V,SAAW4V,EAAMwT,OACzBxT,EAAM5V,SAAW4V,EAAMwT,KAAO,EAAI,KAAJ,IAAKxT,EAAMwT,KAAOxT,EAAM5V,SAAW,EAAM,KAErE4V,EAAM5V,SAAW4V,EAAM0T,OACzB1T,EAAM5V,SAAW4V,EAAM0T,KAAO,EAAI,KAAJ,IAAK1T,EAAM5V,SAAW4V,EAAM0T,KAAO,EAAM,KAIpEzS,EAAS4S,gBAAe5S,EAAS4S,cAAgB7T,EAAM4T,eAAetjC,GACtE2wB,EAAS6S,gBAAe7S,EAAS6S,cAAgB9T,EAAM4T,eAAenZ,GACtEwG,EAAS8S,WAAU9S,EAAS8S,SAAWt1C,KAAK1D,OACjDkmC,EAAS3wB,GACN0vB,EAAM4T,eAAetjC,EAAI2wB,EAAS4S,gBAAkBp1C,KAAK1D,MAAQkmC,EAAS8S,UAAY,EACzF9S,EAASxG,GACNuF,EAAM4T,eAAenZ,EAAIwG,EAAS6S,gBAAkBr1C,KAAK1D,MAAQkmC,EAAS8S,UAAY,EACrF74C,KAAKyxB,IAAIqT,EAAM4T,eAAetjC,EAAI2wB,EAAS4S,eAAiB,IAAG5S,EAAS3wB,EAAI,GAC5EpV,KAAKyxB,IAAIqT,EAAM4T,eAAenZ,EAAIwG,EAAS6S,eAAiB,IAAG7S,EAASxG,EAAI,GAChFwG,EAAS4S,cAAgB7T,EAAM4T,eAAetjC,EAC9C2wB,EAAS6S,cAAgB9T,EAAM4T,eAAenZ,EAC9CwG,EAAS8S,SAAWt1C,KAAK1D,MAEzBm4C,EAAQI,aAAaj1B,UAAUA,eAAVA,OAAyB2hB,EAAM/V,wBAAe+V,EAAM5V,qBA2C3E,SAASwqB,IACP,IAAMlC,EAAO1tB,EAAO0tB,KAChBQ,EAAQ5O,UAAYtf,EAAOmD,gBAAkBnD,EAAOkD,cAClDgrB,EAAQG,UACVH,EAAQG,SAASh1B,UAAU,+BAEzB60B,EAAQI,cACVJ,EAAQI,aAAaj1B,UAAU,sBAGjCq0B,EAAKzC,MAAQ,EACboC,EAAe,EAEfa,EAAQ5O,cAAWA,EACnB4O,EAAQG,cAAWA,EACnBH,EAAQI,kBAAeA,GAI3B,SAASuB,EAAOl6C,GACd,IAmCIm6C,EACAC,EAGA1oB,EACAC,EACA0oB,EACAC,EACAC,EACAC,EACAT,EACAC,EACAS,EACAC,EACAC,EACAC,EACApC,EACAC,EApDEV,EAAO1tB,EAAO0tB,KACdttB,EAASJ,EAAOI,OAAOstB,MAExBQ,EAAQ5O,WACP3pC,GAAKA,EAAEif,SACTs5B,EAAQ5O,SAAW1mC,EAAEjD,EAAEif,QAAQ1U,QAAQA,IAARA,OAAY8f,EAAOI,OAAOsO,cAEtDwf,EAAQ5O,WACPtf,EAAOI,OAAO8Q,SAAWlR,EAAOI,OAAO8Q,QAAQ1N,SAAWxD,EAAOkR,QACnEgd,EAAQ5O,SAAWtf,EAAOiI,WAAWxoB,SAASA,IAATA,OAAaugB,EAAOI,OAAOwO,mBAEhEsf,EAAQ5O,SAAWtf,EAAOoL,OAAO3O,GAAGuD,EAAOkD,cAI/CgrB,EAAQG,SAAWH,EAAQ5O,SACxBzjC,KAAKA,IAALA,OAASukB,EAAOwtB,iBAChBnxB,GAAG,GACH5gB,KAAK,kDACRqyC,EAAQI,aAAeJ,EAAQG,SAAShwC,OAAOA,IAAPA,OAAW+hB,EAAOwtB,kBAGzDM,EAAQG,UACmB,IAA5BH,EAAQG,SAASh1C,QAChB60C,EAAQI,cACuB,IAAhCJ,EAAQI,aAAaj1C,UAGnB2mB,EAAOI,OAAOuD,UAChB3D,EAAOM,UAAU9K,MAAM0L,SAAW,SAClClB,EAAOM,UAAU9K,MAAMg7B,YAAc,QAGvCtC,EAAQ5O,SAASx/B,SAASA,GAATA,OAAYsgB,EAAOytB,4BAqBzB7S,EAAM2T,aAAarjC,GAAqB3V,GACjDm6C,EAAoB,aAAXn6C,EAAE4X,KAAsB5X,EAAEoxB,eAAe,GAAG5B,MAAQxvB,EAAEwvB,MAC/D4qB,EAAoB,aAAXp6C,EAAE4X,KAAsB5X,EAAEoxB,eAAe,GAAG1B,MAAQ1vB,EAAE0vB,QAE/DyqB,EAAS9U,EAAM2T,aAAarjC,EAC5BykC,EAAS/U,EAAM2T,aAAalZ,GAG9BiY,EAAKzC,MAAQiD,EAAQI,aAAapsC,KAAK,qBAAuBke,EAAOutB,SACrEN,EAAea,EAAQI,aAAapsC,KAAK,qBAAuBke,EAAOutB,SACnEh4C,GACFw4C,EAAaD,EAAQ5O,SAAS,GAAG5tB,YACjC08B,EAAcF,EAAQ5O,SAAS,GAAG1tB,aAGlCyV,EAFU6mB,EAAQ5O,SAAS3+B,SAASwN,KAAOvY,EAAOmmB,QAEhCoyB,EAAa,EAAI2B,EACnCxoB,EAFU4mB,EAAQ5O,SAAS3+B,SAASG,IAAMlL,EAAOkmB,QAE/BsyB,EAAc,EAAI2B,EAEpCG,EAAahC,EAAQG,SAAS,GAAG38B,YACjCy+B,EAAcjC,EAAQG,SAAS,GAAGz8B,aAClC89B,EAAcQ,EAAaxC,EAAKzC,MAChC0E,EAAeQ,EAAczC,EAAKzC,MAIlCqF,IAFAF,EAAgBl6C,KAAKG,IAAI83C,EAAa,EAAIuB,EAAc,EAAG,IAG3Da,IAFAF,EAAgBn6C,KAAKG,IAAI+3C,EAAc,EAAIuB,EAAe,EAAG,KAI7DK,EAAa3oB,EAAQqmB,EAAKzC,OAGTmF,IACfJ,EAAaI,GAEXJ,EAAaM,IACfN,EAAaM,IANfL,EAAa3oB,EAAQomB,EAAKzC,OASToF,IACfJ,EAAaI,GAEXJ,EAAaM,IACfN,EAAaM,KAGfP,EAAa,EACbC,EAAa,GAEf/B,EAAQI,aACLh1B,WAAW,KACXD,UAAUA,eAAVA,OAAyB22B,iBAAiBC,YAC7C/B,EAAQG,SAAS/0B,WAAW,KAAKD,UAAUA,4BAAVA,OAAsCq0B,EAAKzC,aAE9E,SAASwF,IACP,IAAM/C,EAAO1tB,EAAO0tB,KACdttB,EAASJ,EAAOI,OAAOstB,KAExBQ,EAAQ5O,WACPtf,EAAOI,OAAO8Q,SAAWlR,EAAOI,OAAO8Q,QAAQ1N,SAAWxD,EAAOkR,QACnEgd,EAAQ5O,SAAWtf,EAAOiI,WAAWxoB,SAASA,IAATA,OAAaugB,EAAOI,OAAOwO,mBAEhEsf,EAAQ5O,SAAWtf,EAAOoL,OAAO3O,GAAGuD,EAAOkD,aAE7CgrB,EAAQG,SAAWH,EAAQ5O,SACxBzjC,KAAKA,IAALA,OAASukB,EAAOwtB,iBAChBnxB,GAAG,GACH5gB,KAAK,kDACRqyC,EAAQI,aAAeJ,EAAQG,SAAShwC,OAAOA,IAAPA,OAAW+hB,EAAOwtB,kBAGzDM,EAAQG,UACmB,IAA5BH,EAAQG,SAASh1C,QAChB60C,EAAQI,cACuB,IAAhCJ,EAAQI,aAAaj1C,SAGnB2mB,EAAOI,OAAOuD,UAChB3D,EAAOM,UAAU9K,MAAM0L,SAAW,GAClClB,EAAOM,UAAU9K,MAAMg7B,YAAc,IAEvC9C,EAAKzC,MAAQ,EACboC,EAAe,EACfa,EAAQI,aAAah1B,WAAW,KAAKD,UAAU,sBAC/C60B,EAAQG,SAAS/0B,WAAW,KAAKD,UAAU,+BAC3C60B,EAAQ5O,SAASjgC,YAAYA,GAAZA,OAAe+gB,EAAOytB,mBACvCK,EAAQ5O,cAAWA,GAIrB,SAASoR,EAAW/6C,GAClB,IAAM+3C,EAAO1tB,EAAO0tB,KAEhBA,EAAKzC,OAAwB,IAAfyC,EAAKzC,MAErBwF,IAGAZ,EAAOl6C,GAIX,SAASg7C,IACP,IAAMp4B,EAAUyH,EAAOzH,QAUvB,MAAO,CAAEgJ,kBARsB,eAA7BvB,EAAOsM,YAAYnmB,QACnBoS,EAAQgJ,kBACRvB,EAAOI,OAAOqM,mBACV,CAAEC,SAASA,EAAM9S,SAASA,GAKNg3B,2BAHQr4B,EAAQgJ,iBACtC,CAAEmL,SAASA,EAAO9S,SAASA,IAKjC,SAASi3B,IACP,MAAO,IAAP,OAAW7wB,EAAOI,OAAOsO,YAG3B,SAASoiB,EAAe5rC,OACdqc,EAAoBovB,IAAtBpvB,gBACAwvB,EAAgBF,IACtB7wB,EAAOiI,WAAW/iB,GAAQ,eAAgB6rC,EAAe1B,EAAgB9tB,GACzEvB,EAAOiI,WAAW/iB,GAAQ,gBAAiB6rC,EAAexB,EAAiBhuB,GAC3EvB,EAAOiI,WAAW/iB,GAAQ,aAAc6rC,EAAetB,EAAcluB,GAEvE,SAASyvB,IACHlD,IACJA,KACAgD,EAAe,OAEjB,SAASG,IACFnD,IACLA,KACAgD,EAAe,QAIjB,SAASvX,IACP,IAAMmU,EAAO1tB,EAAO0tB,KACpB,IAAIA,EAAKlqB,QAAT,CACAkqB,EAAKlqB,SAAUA,EACTjL,MAAUyH,EAAOzH,UACgCo4B,IAA/CpvB,IAAFA,gBAAmBqvB,IAAnBA,0BACAG,EAAgBF,IAGlBt4B,EAAQmJ,UACV1B,EAAOiI,WAAW1nB,GAAGyf,EAAOsM,YAAYnmB,MAAO6qC,EAAgBzvB,GAC/DvB,EAAOiI,WAAW1nB,GAAGyf,EAAOsM,YAAY3Z,IAAKs+B,EAAiB1vB,IACxB,eAA7BvB,EAAOsM,YAAYnmB,QAC5B6Z,EAAOiI,WAAW1nB,GAChByf,EAAOsM,YAAYnmB,MACnB4qC,EACA1B,EACA9tB,GAEFvB,EAAOiI,WAAW1nB,GAChByf,EAAOsM,YAAYK,KACnBokB,EACAxB,EACAqB,GAEF5wB,EAAOiI,WAAW1nB,GAAGyf,EAAOsM,YAAY3Z,IAAKo+B,EAAetB,EAAcluB,GACtEvB,EAAOsM,YAAYh0B,QACrB0nB,EAAOiI,WAAW1nB,GAChByf,EAAOsM,YAAYh0B,OACnBy4C,EACAtB,EACAluB,IAMNvB,EAAOiI,WAAW1nB,GAChByf,EAAOsM,YAAYK,gBACf3M,EAAOI,OAAOstB,KAAKE,gBACvBjnB,EACAiqB,IAGJ,SAAStX,IACP,IAAMoU,EAAO1tB,EAAO0tB,KACpB,GAAKA,EAAKlqB,QAAV,CACA,IAAMjL,EAAUyH,EAAOzH,QACvBm1B,EAAKlqB,SAAUA,EAEf,MAAuDmtB,IAA/CpvB,IAAFA,gBAAmBqvB,IAAnBA,0BACAG,EAAgBF,IAGlBt4B,EAAQmJ,UACV1B,EAAOiI,WAAW1N,IAAIyF,EAAOsM,YAAYnmB,MAAO6qC,EAAgBzvB,GAChEvB,EAAOiI,WAAW1N,IAAIyF,EAAOsM,YAAY3Z,IAAKs+B,EAAiB1vB,IACzB,eAA7BvB,EAAOsM,YAAYnmB,QAC5B6Z,EAAOiI,WAAW1N,IAChByF,EAAOsM,YAAYnmB,MACnB4qC,EACA1B,EACA9tB,GAEFvB,EAAOiI,WAAW1N,IAChByF,EAAOsM,YAAYK,KACnBokB,EACAxB,EACAqB,GAEF5wB,EAAOiI,WAAW1N,IAAIyF,EAAOsM,YAAY3Z,IAAKo+B,EAAetB,EAAcluB,GACvEvB,EAAOsM,YAAYh0B,QACrB0nB,EAAOiI,WAAW1N,IAChByF,EAAOsM,YAAYh0B,OACnBy4C,EACAtB,EACAluB,IAMNvB,EAAOiI,WAAW1N,IAChByF,EAAOsM,YAAYK,gBACf3M,EAAOI,OAAOstB,KAAKE,gBACvBjnB,EACAiqB,IAtiBJ18C,OAAOC,eAAe6rB,EAAO0tB,KAAM,QAAS,CAC1Cr5C,IAAG,kBACM42C,GAET1zB,aAAI9iB,GACF,GAAIw2C,IAAUx2C,EAAO,CACnB,IAAMmmC,EAAUsT,EAAQG,SAAWH,EAAQG,SAAS,QAAK,EACnDvR,EAAUoR,EAAQ5O,SAAW4O,EAAQ5O,SAAS,QAAK,EACzDlc,EAAK,aAAc3uB,EAAOmmC,EAASkC,GAErCmO,EAAQx2C,KAgiBZ8L,EAAG,QAAQ,WACLyf,EAAOI,OAAOstB,KAAKlqB,SACrB+V,OAGJh5B,EAAG,WAAW,WACZ+4B,OAEF/4B,EAAG,cAAc,SAAC4+B,EAAIxpC,GACfqqB,EAAO0tB,KAAKlqB,SAncnB,SAAsB7tB,GACpB,IAAMosB,EAAS/B,EAAO+B,OACjBmsB,EAAQG,UAAwC,IAA5BH,EAAQG,SAASh1C,SACtC2hC,EAAM5W,YACNrC,EAAOE,SAAWtsB,EAAEolB,YAAYplB,EAAE8K,iBACtCu6B,EAAM5W,WAAYA,EAClB4W,EAAM2T,aAAarjC,EAAe,eAAX3V,EAAE4X,KAAwB5X,EAAEuvB,cAAc,GAAGC,MAAQxvB,EAAEwvB,MAC9E6V,EAAM2T,aAAalZ,EAAe,eAAX9/B,EAAE4X,KAAwB5X,EAAEuvB,cAAc,GAAGG,MAAQ1vB,EAAE0vB,QAPhF,CAoce1vB,MAEf4K,EAAG,YAAY,SAAC4+B,EAAIxpC,GACbqqB,EAAO0tB,KAAKlqB,SApWnB,WACE,IAAMkqB,EAAO1tB,EAAO0tB,KACpB,GAAKQ,EAAQG,UAAwC,IAA5BH,EAAQG,SAASh1C,OAA1C,CACA,IAAK2hC,EAAM5W,YAAc4W,EAAM3W,QAG7B,OAFA2W,EAAM5W,WAAYA,OAClB4W,EAAM3W,SAAUA,GAGlB2W,EAAM5W,WAAYA,EAClB4W,EAAM3W,SAAUA,EAChB,IAAI6sB,EAAoB,IACpBC,EAAoB,IAClBC,EAAoBnV,EAAS3wB,EAAI4lC,EACjCG,EAAerW,EAAM/V,SAAWmsB,EAChCE,EAAoBrV,EAASxG,EAAI0b,EACjCI,EAAevW,EAAM5V,SAAWksB,EAGnB,IAAfrV,EAAS3wB,IACX4lC,EAAoBh7C,KAAKyxB,KAAK0pB,EAAerW,EAAM/V,UAAYgX,EAAS3wB,IACvD,IAAf2wB,EAASxG,IACX0b,EAAoBj7C,KAAKyxB,KAAK4pB,EAAevW,EAAM5V,UAAY6W,EAASxG,IAC1E,IAAM+b,EAAmBt7C,KAAKC,IAAI+6C,EAAmBC,GAErDnW,EAAM/V,SAAWosB,EACjBrW,EAAM5V,SAAWmsB,EAGjB,IAAM7B,EAAc1U,EAAMvpB,MAAQi8B,EAAKzC,MACjC0E,EAAe3U,EAAMrpB,OAAS+7B,EAAKzC,MACzCjQ,EAAMuT,KAAOr4C,KAAKG,IAAI63C,EAAQC,WAAa,EAAIuB,EAAc,EAAG,GAChE1U,EAAMyT,MAAQzT,EAAMuT,KACpBvT,EAAMwT,KAAOt4C,KAAKG,IAAI63C,EAAQE,YAAc,EAAIuB,EAAe,EAAG,GAClE3U,EAAM0T,MAAQ1T,EAAMwT,KACpBxT,EAAM/V,SAAW/uB,KAAKC,IAAID,KAAKG,IAAI2kC,EAAM/V,SAAU+V,EAAMyT,MAAOzT,EAAMuT,MACtEvT,EAAM5V,SAAWlvB,KAAKC,IAAID,KAAKG,IAAI2kC,EAAM5V,SAAU4V,EAAM0T,MAAO1T,EAAMwT,MAEtEN,EAAQI,aACLh1B,WAAWk4B,GACXn4B,UAAUA,eAAVA,OAAyB2hB,EAAM/V,wBAAe+V,EAAM5V,oBAvCzD,MAuWA7kB,EAAG,aAAa,SAAC4+B,EAAIxpC,IAEhBqqB,EAAOyD,WACRzD,EAAOI,OAAOstB,KAAKlqB,SACnBxD,EAAO0tB,KAAKlqB,SACZxD,EAAOI,OAAOstB,KAAKz0B,QAEnBy3B,EAAW/6C,MAGf4K,EAAG,iBAAiB,WACdyf,EAAO0tB,KAAKlqB,SAAWxD,EAAOI,OAAOstB,KAAKlqB,SAC5CosB,OAGJrvC,EAAG,eAAe,WACZyf,EAAO0tB,KAAKlqB,SAAWxD,EAAOI,OAAOstB,KAAKlqB,SAAWxD,EAAOI,OAAOuD,SACrEisB,OAIJ17C,OAAO0xB,OAAO5F,EAAO0tB,KAAM,CACzBnU,SACAD,UACAmY,GAAI5B,EACJ6B,IAAKjB,EACLx3B,OAAQy3B,KC5oBG,YAA0CttB,IAA1BpD,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAA4B6iB,IAA5BA,KAC3ByY,EAAa,CACX0G,KAAM,CACJoP,aAAaA,EACbnuB,SAASA,EACTouB,cAAcA,EACdC,mBAAoB,EACpBC,uBAAuBA,EACvBC,iBAAkB,GAElBC,aAAc,cACdC,aAAc,sBACdC,YAAa,qBACbC,eAAgB,2BAIpBnyB,EAAOuiB,KAAO,GAEd,IAAI6P,KACAC,KAEJ,SAASC,EAAY50C,GAAyB,IAAlB60C,6DACpBnyB,EAASJ,EAAOI,OAAOmiB,KAC7B,QAAI,IAAO7kC,GACkB,IAAzBsiB,EAAOoL,OAAO/xB,OAAlB,CACA,IAEMimC,EAFYtf,EAAOkR,SAAWlR,EAAOI,OAAO8Q,QAAQ1N,QAGtDxD,EAAOiI,WAAWxoB,SAASA,IAATA,OACZugB,EAAOI,OAAOsO,gDAAuChxB,SAE3DsiB,EAAOoL,OAAO3O,GAAG/e,GAEf80C,EAAUlT,EAASzjC,KAAKA,IAALA,OACnBukB,EAAO4xB,8BAAqB5xB,EAAO8xB,8BAAqB9xB,EAAO6xB,oBAGnE3S,EAAShhC,SAAS8hB,EAAO4xB,eACxB1S,EAAShhC,SAAS8hB,EAAO8xB,cACzB5S,EAAShhC,SAAS8hB,EAAO6xB,eAE1BO,EAAQtpC,KAAKo2B,EAAS,IAED,IAAnBkT,EAAQn5C,QAEZm5C,EAAQvpC,MAAM2xB,YACZ,IAAMyT,EAAWz1C,EAAEgiC,GACnByT,EAASvuC,SAASsgB,EAAO6xB,cAEzB,IAAMQ,EAAapE,EAASnsC,KAAK,mBAC3BiL,EAAMkhC,EAASnsC,KAAK,YACpB24B,EAASwT,EAASnsC,KAAK,eACvB44B,EAAQuT,EAASnsC,KAAK,cACtBwwC,EAAarE,EAAShwC,OAAO,WAEnC2hB,EAAO2a,UAAU0T,EAAS,GAAIlhC,GAAOslC,EAAY5X,EAAQC,MAAc,WACrE,GACE,MAAO9a,GAENA,KACAA,GAAWA,EAAOI,UACnBJ,EAAO2J,UALT,CAsCA,GA9BI8oB,GACFpE,EAASryB,IAAI,kCAA4By2B,SACzCpE,EAASzrC,WAAW,qBAEhBi4B,IACFwT,EAASnsC,KAAK,SAAU24B,GACxBwT,EAASzrC,WAAW,gBAElBk4B,IACFuT,EAASnsC,KAAK,QAAS44B,GACvBuT,EAASzrC,WAAW,eAElB8vC,EAAWr5C,QACbq5C,EAAWjzC,SAAS,UAAUwJ,MAAM0pC,YAClC,IAAMC,EAAUh6C,EAAE+5C,GAEdC,EAAQ1wC,KAAK,iBACf0wC,EAAQ1wC,KAAK,SAAU0wC,EAAQ1wC,KAAK,gBACpC0wC,EAAQhwC,WAAW,mBAIrBuK,IACFkhC,EAASnsC,KAAK,MAAOiL,GACrBkhC,EAASzrC,WAAW,cAIxByrC,EAASvuC,SAASsgB,EAAO8xB,aAAa7yC,YAAY+gB,EAAO6xB,cACzD3S,EAASzjC,KAAKA,IAALA,OAASukB,EAAO+xB,iBAAkBp2C,SACvCikB,EAAOI,OAAOwD,MAAQ2uB,EAAiB,CACzC,IAAMM,EAAqBvT,EAASp9B,KAAK,2BACrCo9B,EAAShhC,SAAS0hB,EAAOI,OAAO2O,qBAIlCujB,EAHsBtyB,EAAOiI,WAAWxoB,SAASA,6BAATA,OACTozC,qBAA6B7yB,EAAOI,OAAO2O,0BAEhDrxB,SAASA,GAKnC40C,EAHwBtyB,EAAOiI,WAAWxoB,SAASA,IAATA,OACpCugB,EAAOI,OAAO2O,yDAAgD8jB,SAExCn1C,SAASA,GAGzC0lB,EAAK,iBAAkBkc,EAAS,GAAI+O,EAAS,IACzCruB,EAAOI,OAAO+M,YAChBnN,EAAO0T,uBAIXtQ,EAAK,gBAAiBkc,EAAS,GAAI+O,EAAS,QAIhD,SAAS7L,QACCva,EAA0DjI,EAA5DiI,WAAsB6T,EAAsC9b,EAA9CI,OAAsBgL,EAAwBpL,EAA5DoL,OAA4ClI,EAAgBlD,EAA5DkD,YACA+N,EAAYjR,EAAOkR,SAAW4K,EAAa5K,QAAQ1N,QACnDpD,EAAS0b,EAAayG,KAExBvX,EAAgB8Q,EAAa9Q,cAKjC,SAAS8nB,EAAWp1C,GAClB,GAAIuzB,GACF,GACEhJ,EAAWxoB,SAASA,IAATA,OAAaq8B,EAAapN,gDAAuChxB,SACzErE,OAEH,OAAO,OAEJ,GAAI+xB,EAAO1tB,GAAQ,OAAO,EACjC,OAAO,EAGT,SAASs1B,EAAW8J,GAClB,OAAI7L,EACKr4B,EAAEkkC,GAAS56B,KAAK,2BAElBtJ,EAAEkkC,GAASp/B,QAIpB,GAxBsB,SAAlBstB,IACFA,EAAgB,GAsBbqnB,IAAoBA,MACrBryB,EAAOI,OAAO2I,oBAChBd,EAAWxoB,SAASA,IAATA,OAAaq8B,EAAahN,oBAAqB7lB,MAAM6zB,YAE9DwV,EADcrhB,EAAYr4B,EAAEkkC,GAAS56B,KAAK,2BAA6BtJ,EAAEkkC,GAASp/B,iBAG/E,GAAIstB,EAAgB,EACzB,IAAK,IAAIx3B,EAAI0vB,EAAa1vB,EAAI0vB,EAAc8H,EAAex3B,GAAK,EAC1Ds/C,EAAWt/C,IAAI8+C,EAAY9+C,QAGjC8+C,EAAYpvB,GAEd,GAAI9C,EAAOwxB,aACT,GAAI5mB,EAAgB,GAAM5K,EAAOyxB,oBAAsBzxB,EAAOyxB,mBAAqB,EAAI,CAMrF,IALA,IAAMkB,EAAS3yB,EAAOyxB,mBAChB3U,EAAMlS,EACNgoB,EAAW98C,KAAKG,IAAI6sB,EAAcga,EAAMhnC,KAAKC,IAAI48C,EAAQ7V,GAAM9R,EAAO/xB,QACtE45C,EAAW/8C,KAAKC,IAAI+sB,EAAchtB,KAAKC,IAAI+mC,EAAK6V,GAAS,GAEtDv/C,EAAI0vB,EAAc8H,EAAex3B,EAAIw/C,EAAUx/C,GAAK,EACvDs/C,EAAWt/C,IAAI8+C,EAAY9+C,GAGjC,IAAK,IAAIA,EAAIy/C,EAAUz/C,EAAI0vB,EAAa1vB,GAAK,EACvCs/C,EAAWt/C,IAAI8+C,EAAY9+C,OAE5B,CACL,IAAMqhC,EAAY5M,EAAWxoB,SAASA,IAATA,OAAaq8B,EAAa9M,iBACnD6F,EAAUx7B,OAAS,GAAGi5C,EAAYtf,EAAW6B,IAEjD,IAAMC,EAAY7M,EAAWxoB,SAASA,IAATA,OAAaq8B,EAAa5M,iBACnD4F,EAAUz7B,OAAS,GAAGi5C,EAAYtf,EAAW8B,KAIvD,SAASoe,IACP,IAAMt9C,EAASqhB,IACf,GAAK+I,IAAUA,EAAO2J,UAAtB,CACMwpB,MAAiBnzB,EAAOI,OAAOmiB,KAAKwP,iBACtCn5C,EAAEonB,EAAOI,OAAOmiB,KAAKwP,kBACrBn5C,EAAEhD,GACAw9C,EAAWD,EAAe,KAAOv9C,EACjCy9C,EAAqBD,EAAWx9C,EAAOqc,WAAakhC,EAAe,GAAGzhC,YACtE4hC,EAAsBF,EAAWx9C,EAAOoc,YAAcmhC,EAAe,GAAGvhC,aACxE2yB,EAAevkB,EAAO/e,IAAIN,SAG5BujC,KAF0BlkB,EAAtB6G,eAIC0d,EAAap2B,MAAQ6R,EAAO/e,IAAI,GAAGoR,YAO5C,IANA,IAAMmyB,EAAc,CAClB,CAACD,EAAap2B,KAAMo2B,EAAazjC,KACjC,CAACyjC,EAAap2B,KAAO6R,EAAOvO,MAAO8yB,EAAazjC,KAChD,CAACyjC,EAAap2B,KAAMo2B,EAAazjC,IAAMkf,EAAOrO,QAC9C,CAAC4yB,EAAap2B,KAAO6R,EAAOvO,MAAO8yB,EAAazjC,IAAMkf,EAAOrO,SAEtDne,EAAI,EAAGA,EAAIgxC,EAAYnrC,OAAQ7F,GAAK,EAAG,CAC9C,IAAMmmC,EAAQ6K,EAAYhxC,GAC1B,GACEmmC,EAAM,IAAM,GACZA,EAAM,IAAM0Z,GACZ1Z,EAAM,IAAM,GACZA,EAAM,IAAM2Z,EACZ,CACA,GAAiB,IAAb3Z,EAAM,IAAyB,IAAbA,EAAM,GAAU,SACtCuK,MAIJ,IAAM3iB,IACyB,eAA7BvB,EAAOsM,YAAYnmB,QACnB6Z,EAAOzH,QAAQgJ,kBACfvB,EAAOI,OAAOqM,mBACV,CAAEC,SAASA,EAAM9S,SAASA,GAG5BsqB,GACF1B,IACA2Q,EAAe54B,IAAI,SAAU24B,EAAmB3xB,IACtC6wB,IACVA,KACAe,EAAe5yC,GAAG,SAAU2yC,EAAmB3xB,KAInDhhB,EAAG,cAAc,WACXyf,EAAOI,OAAOmiB,KAAK/e,SAAWxD,EAAOI,OAAO+N,gBAC9CnO,EAAOI,OAAO+N,eAAgBA,MAGlC5tB,EAAG,QAAQ,WACLyf,EAAOI,OAAOmiB,KAAK/e,UACjBxD,EAAOI,OAAOmiB,KAAKoP,YACrBuB,IAEA1Q,QAINjiC,EAAG,UAAU,WAETyf,EAAOI,OAAO0I,UACd9I,EAAOI,OAAO0I,SAAStF,UACtBxD,EAAOI,OAAO0I,SAASme,QAExBzE,OAGJjiC,EAAG,uDAAuD,WACpDyf,EAAOI,OAAOmiB,KAAK/e,UACjBxD,EAAOI,OAAOmiB,KAAKoP,YACrBuB,IAEA1Q,QAINjiC,EAAG,mBAAmB,WAChByf,EAAOI,OAAOmiB,KAAK/e,UAEnBxD,EAAOI,OAAOmiB,KAAKuP,wBACjB9xB,EAAOI,OAAOmiB,KAAKuP,wBAA0BO,KAE3CryB,EAAOI,OAAOmiB,KAAKoP,YACrBuB,IAEA1Q,QAKRjiC,EAAG,iBAAiB,WACdyf,EAAOI,OAAOmiB,KAAK/e,UAAYxD,EAAOI,OAAOmiB,KAAKuP,wBAChD9xB,EAAOI,OAAOmiB,KAAKoP,YACrBuB,IAEA1Q,QAINjiC,EAAG,eAAe,iBAEdyf,EAAOI,OADDmiB,IAAFA,KAAQ5e,IAARA,QAAiBoF,IAAjBA,oBAAsC9B,IAAtCA,oBAA2D0B,IAA3DA,gBAGJ4Z,EAAK/e,UACJG,GAAYoF,IAAwB9B,GAA2C,IAApB0B,KAE5D6Z,OAIJtuC,OAAO0xB,OAAO5F,EAAOuiB,KAAM,CACzBC,OACA8P,iBC9SW,YAA4C/xC,IAAtByf,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAajC,SAASgzC,EAAajoC,EAAGmqB,GACvB,IAwBI+d,EACAC,EAzBEC,EAAgB,WACpB,IAAIV,EACAC,EACAU,EACJ,OAAO,SAACC,EAAOtyC,GAGb,IAFA2xC,GAAY,EACZD,EAAWY,EAAMv6C,OACV25C,EAAWC,EAAW,GAEvBW,EADJD,EAASX,EAAWC,GAAa,IACb3xC,EAClB2xC,EAAWU,EAEXX,EAAWW,EAGf,OAAOX,GAfW,GAwCtB,OAtBAv9C,KAAK6V,EAAIA,EACT7V,KAAKggC,EAAIA,EACThgC,KAAK60C,UAAYh/B,EAAEjS,OAAS,EAO5B5D,KAAKo+C,YAAc,SAAqB1E,GACtC,OAAKA,GAGLsE,EAAKC,EAAaj+C,KAAK6V,EAAG6jC,GAC1BqE,EAAKC,EAAK,GAKNtE,EAAK15C,KAAK6V,EAAEkoC,KAAQ/9C,KAAKggC,EAAEge,GAAMh+C,KAAKggC,EAAE+d,KAAS/9C,KAAK6V,EAAEmoC,GAAMh+C,KAAK6V,EAAEkoC,IAAO/9C,KAAKggC,EAAE+d,IATvE,GAYX/9C,KAqFT,SAASq+C,IACF9zB,EAAO+zB,WAAWC,SACnBh0B,EAAO+zB,WAAWE,SACpBj0B,EAAO+zB,WAAWE,YAASA,SACpBj0B,EAAO+zB,WAAWE,QA9I7BpY,EAAa,CACXkY,WAAY,CACVC,aAASA,EACTE,SAASA,EACTC,GAAI,WAIRn0B,EAAO+zB,WAAa,CAClBC,aAASA,GAwIXzzC,EAAG,cAAc,WACfyf,EAAO+zB,WAAWC,QAAUh0B,EAAOI,OAAO2zB,WAAWC,WAEvDzzC,EAAG,UAAU,WACXuzC,OAEFvzC,EAAG,UAAU,WACXuzC,OAEFvzC,EAAG,kBAAkB,WACnBuzC,OAEFvzC,EAAG,gBAAgB,SAAC4+B,EAAIhf,EAAWqV,GAC5BxV,EAAO+zB,WAAWC,SACvBh0B,EAAO+zB,WAAW5qB,aAAahJ,EAAWqV,MAE5Cj1B,EAAG,iBAAiB,SAAC4+B,EAAI5lB,EAAUic,GAC5BxV,EAAO+zB,WAAWC,SACvBh0B,EAAO+zB,WAAW/rB,cAAczO,EAAUic,MAG5CthC,OAAO0xB,OAAO5F,EAAO+zB,WAAY,CAC/B5qB,aAxGF,SAAsBirB,EAAI5e,GACxB,IACIhB,EACA6f,EAFEC,EAAat0B,EAAO+zB,WAAWC,QAG/BxY,EAASxb,EAAOrL,YACtB,SAAS4/B,EAAuB1gD,GAK9B,IAAMssB,EAAYH,EAAO6G,cAAgB7G,EAAOG,UAAYH,EAAOG,UAC/B,UAAhCH,EAAOI,OAAO2zB,WAAWI,KAlBjC,SAAgCtgD,GACzBmsB,EAAO+zB,WAAWE,SACrBj0B,EAAO+zB,WAAWE,OAASj0B,EAAOI,OAAOwD,KACrC,IAAI2vB,EAAavzB,EAAOqJ,WAAYx1B,EAAEw1B,YACtC,IAAIkqB,EAAavzB,EAAO8K,SAAUj3B,EAAEi3B,WAJ5C,CAmB6Bj3B,GAGvBwgD,GAAuBr0B,EAAO+zB,WAAWE,OAAOJ,aAAa1zB,IAG1Dk0B,GAAuD,cAAhCr0B,EAAOI,OAAO2zB,WAAWI,KACnD3f,GACG3gC,EAAEszB,eAAiBtzB,EAAEuzB,iBAAmBpH,EAAOmH,eAAiBnH,EAAOoH,gBAC1EitB,GAAuBl0B,EAAYH,EAAOoH,gBAAkBoN,EAAa3gC,EAAEuzB,gBAGzEpH,EAAOI,OAAO2zB,WAAWG,UAC3BG,EAAsBxgD,EAAEszB,eAAiBktB,GAE3CxgD,EAAEq1B,eAAemrB,GACjBxgD,EAAEs1B,aAAakrB,EAAqBr0B,GACpCnsB,EAAEm1B,oBACFn1B,EAAEo1B,sBAEJ,GAAIvpB,MAAMC,QAAQ20C,GAChB,IAAK,IAAI9gD,EAAI,EAAGA,EAAI8gD,EAAWj7C,OAAQ7F,GAAK,EACtC8gD,EAAW9gD,KAAOgiC,GAAgB8e,EAAW9gD,aAAcgoC,GAC7D+Y,EAAuBD,EAAW9gD,SAG7B8gD,aAAsB9Y,GAAUhG,IAAiB8e,GAC1DC,EAAuBD,IAkEzBtsB,cA/DF,SAAuBzO,EAAUic,GAC/B,IAEIhiC,EAFEgoC,EAASxb,EAAOrL,YAChB2/B,EAAat0B,EAAO+zB,WAAWC,QAErC,SAASQ,EAAwB3gD,GAC/BA,EAAEm0B,cAAczO,EAAUyG,GACT,IAAbzG,IACF1lB,EAAEmiC,kBACEniC,EAAEusB,OAAO+M,YACXtP,GAAS,WACPhqB,EAAE6/B,sBAGN7/B,EAAEo0B,WAAW/M,eAAc,WACpBo5B,IACDzgD,EAAEusB,OAAOwD,MAAwC,UAAhC5D,EAAOI,OAAO2zB,WAAWI,IAC5CtgD,EAAEgwB,UAEJhwB,EAAEqnB,qBAIR,GAAIxb,MAAMC,QAAQ20C,GAChB,IAAK9gD,EAAI,EAAGA,EAAI8gD,EAAWj7C,OAAQ7F,GAAK,EAClC8gD,EAAW9gD,KAAOgiC,GAAgB8e,EAAW9gD,aAAcgoC,GAC7DgZ,EAAwBF,EAAW9gD,SAG9B8gD,aAAsB9Y,GAAUhG,IAAiB8e,GAC1DE,EAAwBF,OCvIf,YAAsC/zC,IAAtByf,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAC3Bs7B,EAAa,CACX4Y,KAAM,CACJjxB,SAASA,EACTkxB,kBAAmB,sBACnBC,iBAAkB,iBAClBC,iBAAkB,aAClBC,kBAAmB,0BACnBC,iBAAkB,yBAClBC,wBAAyB,wBACzBC,kBAAmB,+BACnBC,iBAAkB,KAClBC,gCAAiC,KACjCC,2BAA4B,KAC5BC,UAAW,WAIf,IAAIC,EAAa,KAEjB,SAASC,EAAO/6C,GACd,IAAMg7C,EAAeF,EACO,IAAxBE,EAAal8C,SACjBk8C,EAAal7C,KAAK,IAClBk7C,EAAal7C,KAAKE,IAOpB,SAASi7C,EAAgBv0C,GACvBA,EAAIiB,KAAK,WAAY,KAEvB,SAASuzC,EAAmBx0C,GAC1BA,EAAIiB,KAAK,WAAY,MAEvB,SAASwzC,EAAUz0C,EAAK00C,GACtB10C,EAAIiB,KAAK,OAAQyzC,GAEnB,SAASC,EAAqB30C,EAAK40C,GACjC50C,EAAIiB,KAAK,uBAAwB2zC,GAKnC,SAASC,EAAW70C,EAAK2D,GACvB3D,EAAIiB,KAAK,aAAc0C,GAQzB,SAASmxC,EAAU90C,GACjBA,EAAIiB,KAAK,oBAEX,SAAS8zC,EAAS/0C,GAChBA,EAAIiB,KAAK,oBAGX,SAAS+zC,EAAkBtgD,GACzB,GAAkB,KAAdA,EAAEye,SAAgC,KAAdze,EAAEye,QAA1B,CACA,IAAMgM,EAASJ,EAAOI,OAAOq0B,KACvB1wB,EAAYnrB,EAAEjD,EAAEif,QAClBoL,EAAOwK,YAAcxK,EAAOwK,WAAWqd,SAAW9jB,EAAUxP,GAAGyL,EAAOwK,WAAWqd,WAC7E7nB,EAAOiL,QAAUjL,EAAOI,OAAOwD,MACnC5D,EAAO6W,YAEL7W,EAAOiL,MACTqqB,EAAOl1B,EAAO00B,kBAEdQ,EAAOl1B,EAAOw0B,mBAGd50B,EAAOwK,YAAcxK,EAAOwK,WAAWsd,SAAW/jB,EAAUxP,GAAGyL,EAAOwK,WAAWsd,WAC7E9nB,EAAOkL,cAAgBlL,EAAOI,OAAOwD,MACzC5D,EAAOiX,YAELjX,EAAOkL,YACToqB,EAAOl1B,EAAOy0B,mBAEdS,EAAOl1B,EAAOu0B,mBAKhB30B,EAAOooB,YACPrkB,EAAUxP,GAAG2pB,EAAkBle,EAAOI,OAAOgoB,WAAWgB,eAExDrlB,EAAU,GAAGmyB,SAIjB,SAASC,IACP,IAAIn2B,EAAOI,OAAOwD,MAAS5D,EAAOwK,WAAlC,CACA,MAA6BxK,EAAOwK,WAA5Bqd,IAAFA,QAAWC,IAAXA,QAEFA,GAAWA,EAAQzuC,OAAS,IAC1B2mB,EAAOkL,aACT6qB,EAAUjO,GACV2N,EAAmB3N,KAEnBkO,EAASlO,GACT0N,EAAgB1N,KAGhBD,GAAWA,EAAQxuC,OAAS,IAC1B2mB,EAAOiL,OACT8qB,EAAUlO,GACV4N,EAAmB5N,KAEnBmO,EAASnO,GACT2N,EAAgB3N,MAKtB,SAASuO,IACP,OACEp2B,EAAOooB,YACPpoB,EAAOI,OAAOgoB,WAAWC,WACzBroB,EAAOooB,WAAW0B,SAClB9pB,EAAOooB,WAAW0B,QAAQzwC,OAqB9B,IAAMg9C,EAAY,SAACp1C,EAAKq1C,EAAW/7C,GACjCi7C,EAAgBv0C,GACO,WAAnBA,EAAI,GAAG0mC,UACT+N,EAAUz0C,EAAK,UACfA,EAAIV,GAAG,UAAW01C,IAEpBH,EAAW70C,EAAK1G,GA5GlB,SAAuB0G,EAAKs1C,GAC1Bt1C,EAAIiB,KAAK,gBAAiBq0C,GAD5B,CA6GgBt1C,EAAKq1C,IAmGrB/1C,EAAG,cAAc,WACf80C,EAAaz8C,yBACKonB,EAAOI,OAAOq0B,KAAKC,4EAIvCn0C,EAAG,aAAa,WACTyf,EAAOI,OAAOq0B,KAAKjxB,UAvG1B,WACE,IAAMpD,EAASJ,EAAOI,OAAOq0B,KAE7Bz0B,EAAO/e,IAAIuC,OAAO6xC,GAGlB,IAAMmB,EAAex2B,EAAO/e,IACxBmf,EAAO80B,iCACTU,EAAqBY,EAAcp2B,EAAO80B,iCAExC90B,EAAO60B,kBACTa,EAAWU,EAAcp2B,EAAO60B,kBAIlC,IAzHoBp6C,EAyHdotB,EAAajI,EAAOiI,WACpBquB,EAAYruB,EAAW/lB,KAAK,gCAhJpC,WAAgC,IAAPyuB,yDAAO,GAE9B,MAAO,IAAI8lB,OAAO9lB,GAAMnzB,QAAQ,MADb,kBAAMtH,KAAKwgD,MAAM,GAAKxgD,KAAKygD,UAAU74C,SAAS,OADnE,CAgJ+E,KACvE84C,EAAO52B,EAAOI,OAAOiL,UAAYrL,EAAOI,OAAOiL,SAAS7H,QAAU,MAAQ,SA3H5D3oB,EA4HAy7C,EAAZruB,EA3HJ/lB,KAAK,KAAMrH,GAEjB,SAAmBoG,EAAK21C,GACtB31C,EAAIiB,KAAK,YAAa00C,GADxB,CA0HY3uB,EAAY2uB,GAGlBx2B,EAAO+0B,4BACTS,EAAqBh9C,EAAEonB,EAAOoL,QAAShL,EAAO+0B,4BAEhDO,EAAU98C,EAAEonB,EAAOoL,QAAShL,EAAOg1B,WAEnC,IAgBIvN,EACAC,EAjBE1W,EAAepR,EAAOI,OAAOwD,KAC/B5D,EAAOoL,OAAOvT,QAAQxG,mBAAQA,EAAGwH,UAAUG,SAASgH,EAAOI,OAAO2O,wBAC/D11B,OACH2mB,EAAOoL,OAAO/xB,OAClB2mB,EAAOoL,OAAOniB,MAAK,SAAC6zB,EAASp/B,GAC3B,IAAM4hC,EAAW1mC,EAAEkkC,GACb9J,EAAahT,EAAOI,OAAOwD,KAC7BhqB,SAAS0lC,EAASp9B,KAAK,2BAA4B,IACnDxE,EAIJo4C,EAAWxW,EAHclf,EAAO40B,kBAC7Bx3C,QAAQ,gBAAiBw1B,EAAa,GACtCx1B,QAAQ,uBAAwB4zB,OAOjCpR,EAAOwK,YAAcxK,EAAOwK,WAAWqd,UACzCA,EAAU7nB,EAAOwK,WAAWqd,SAE1B7nB,EAAOwK,YAAcxK,EAAOwK,WAAWsd,UACzCA,EAAU9nB,EAAOwK,WAAWsd,SAG1BD,GAAWA,EAAQxuC,QACrBg9C,EAAUxO,EAASyO,EAAWl2B,EAAOw0B,kBAEnC9M,GAAWA,EAAQzuC,QACrBg9C,EAAUvO,EAASwO,EAAWl2B,EAAOu0B,kBAInCyB,KACFp2B,EAAOooB,WAAWnnC,IAAIV,GACpB,UACA29B,EAAkBle,EAAOI,OAAOgoB,WAAWgB,aAC3C6M,GAwCJr6C,GACAu6C,QAEF51C,EAAG,UAAU,WACNyf,EAAOI,OAAOq0B,KAAKjxB,SACxB2yB,OAEF51C,EAAG,YAAY,WACRyf,EAAOI,OAAOq0B,KAAKjxB,SACxB2yB,OAEF51C,EAAG,oBAAoB,WAChByf,EAAOI,OAAOq0B,KAAKjxB,SA/I1B,WACE,IAAMpD,EAASJ,EAAOI,OAAOq0B,KACzB2B,KACFp2B,EAAOooB,WAAW0B,QAAQ7gC,MAAM4tC,YAC9B,IAAM3M,EAAYtxC,EAAEi+C,GACpBrB,EAAgBtL,GACXlqB,EAAOI,OAAOgoB,WAAWM,eAC5BgN,EAAUxL,EAAW,UACrB4L,EACE5L,EACA9pB,EAAO20B,wBAAwBv3C,QAAQ,gBAAiB0sC,EAAUxsC,QAAU,QAVtF,MAkJA6C,EAAG,WAAW,WACPyf,EAAOI,OAAOq0B,KAAKjxB,SApD1B,WAGE,IAAIqkB,EACAC,EAHAuN,GAAcA,EAAWh8C,OAAS,GAAGg8C,EAAWt5C,SAIhDikB,EAAOwK,YAAcxK,EAAOwK,WAAWqd,UACzCA,EAAU7nB,EAAOwK,WAAWqd,SAE1B7nB,EAAOwK,YAAcxK,EAAOwK,WAAWsd,UACzCA,EAAU9nB,EAAOwK,WAAWsd,SAE1BD,GACFA,EAAQttB,IAAI,UAAW07B,GAErBnO,GACFA,EAAQvtB,IAAI,UAAW07B,GAIrBG,KACFp2B,EAAOooB,WAAWnnC,IAAIsZ,IACpB,UACA2jB,EAAkBle,EAAOI,OAAOgoB,WAAWgB,aAC3C6M,GAvBN,OChOa,YAAyC11C,IAAtByf,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAC9Bs7B,EAAa,CACXnrB,QAAS,CACP8S,SAASA,EACTjnB,KAAM,GACNoU,cAAcA,EACd5b,IAAK,YAIT,IAAIqgC,KACA0hB,EAAQ,GAENC,EAAW17C,mBACRA,EACJyC,WACAN,QAAQ,OAAQ,KAChBA,QAAQ,WAAY,IACpBA,QAAQ,OAAQ,KAChBA,QAAQ,MAAO,IACfA,QAAQ,MAAO,KAGdw5C,EAAiBC,YACrB,IAAMrhD,EAASqhB,IAOTigC,GALFD,EACS,IAAIlqC,IAAIkqC,GAERrhD,EAAOsV,UAEO6K,SACxB3Y,MAAM,GACNsO,MAAM,KACNmM,QAAQs/B,kBAAkB,KAATA,KACdhN,EAAQ+M,EAAU79C,OAGxB,MAAO,CAAEtE,IAFGmiD,EAAU/M,EAAQ,GAEhB11C,MADAyiD,EAAU/M,EAAQ,KAG5BiN,EAAa,SAACriD,EAAK2I,GACvB,IAAM9H,EAASqhB,IACf,GAAKme,GAAgBpV,EAAOI,OAAO1P,QAAQ8S,QAA3C,CACA,IAAItY,EAEFA,EADE8U,EAAOI,OAAOzd,IACL,IAAIoK,IAAIiT,EAAOI,OAAOzd,KAEtB/M,EAAOsV,SAEpB,IAAMinB,EAAQnS,EAAOoL,OAAO3O,GAAG/e,GAC3BjJ,EAAQsiD,EAAQ5kB,EAAMjwB,KAAK,iBAC/B,GAAI8d,EAAOI,OAAO1P,QAAQnU,KAAKlD,OAAS,EAAG,CACzC,IAAIkD,EAAOyjB,EAAOI,OAAO1P,QAAQnU,KACH,MAA1BA,EAAKA,EAAKlD,OAAS,KAAYkD,EAAOA,EAAKa,MAAM,EAAGb,EAAKlD,OAAS,IACtE5E,YAAW8H,cAAQxH,cAAON,QAChByW,EAAS6K,SAASshC,SAAStiD,KACrCN,YAAWM,cAAON,IAEpB,IAAM6iD,EAAe1hD,EAAO8a,QAAQ6mC,MAChCD,GAAgBA,EAAa7iD,QAAUA,IAGvCurB,EAAOI,OAAO1P,QAAQC,aACxB/a,EAAO8a,QAAQC,aAAa,CAAElc,SAAS,KAAMA,GAE7CmB,EAAO8a,QAAQ4F,UAAU,CAAE7hB,SAAS,KAAMA,MAIxC+iD,EAAgB,SAACn3B,EAAO5rB,EAAOuuB,GACnC,GAAIvuB,EACF,IAAK,IAAIjB,EAAI,EAAG6F,EAAS2mB,EAAOoL,OAAO/xB,OAAQ7F,EAAI6F,EAAQ7F,GAAK,EAAG,CACjE,IAAM2+B,EAAQnS,EAAOoL,OAAO3O,GAAGjpB,GAE/B,GADqBujD,EAAQ5kB,EAAMjwB,KAAK,mBACnBzN,IAAU09B,EAAM7zB,SAAS0hB,EAAOI,OAAO2O,qBAAsB,CAChF,IAAMrxB,EAAQy0B,EAAMz0B,QACpBsiB,EAAOqK,QAAQ3sB,EAAO2iB,EAAO2C,SAIjChD,EAAOqK,QAAQ,EAAGhK,EAAO2C,IAIvBy0B,EAAqB,WACzBX,EAAQE,EAAch3B,EAAOI,OAAOzd,KACpC60C,EAAcx3B,EAAOI,OAAOC,MAAOL,EAAO82B,MAAMriD,OAAOA,IA0BzD8L,EAAG,QAAQ,WACLyf,EAAOI,OAAO1P,QAAQ8S,SAxBf,WACX,IAAM5tB,EAASqhB,IACf,GAAK+I,EAAOI,OAAO1P,QAAnB,CACA,IAAK9a,EAAO8a,UAAY9a,EAAO8a,QAAQ4F,UAGrC,OAFA0J,EAAOI,OAAO1P,QAAQ8S,SAAUA,OAChCxD,EAAOI,OAAOs3B,eAAel0B,SAAUA,GAGzC4R,OACA0hB,EAAQE,EAAch3B,EAAOI,OAAOzd,MACzB5N,KAAQ+hD,EAAMriD,SACzB+iD,EAAc,EAAGV,EAAMriD,MAAOurB,EAAOI,OAAOiP,oBACvCrP,EAAOI,OAAO1P,QAAQC,cACzB/a,EAAOiY,iBAAiB,WAAY4pC,KAb3B,MA4Bbl3C,EAAG,WAAW,WACRyf,EAAOI,OAAO1P,QAAQ8S,SAbZ,WACd,IAAM5tB,EAASqhB,IACV+I,EAAOI,OAAO1P,QAAQC,cACzB/a,EAAOkf,oBAAoB,WAAY2iC,GAH3B,MAiBhBl3C,EAAG,4CAA4C,WACzC60B,GACFgiB,EAAWp3B,EAAOI,OAAO1P,QAAQ3b,IAAKirB,EAAOkD,gBAGjD3iB,EAAG,eAAe,WACZ60B,GAAepV,EAAOI,OAAOuD,SAC/ByzB,EAAWp3B,EAAOI,OAAO1P,QAAQ3b,IAAKirB,EAAOkD,iBChIpC,YAAsD3iB,IAA5Byf,IAAFA,OAAU6b,IAAVA,aAAwBzY,IAAxBA,KAA8B7iB,IAA9BA,GACjC60B,KACE90B,EAAW2V,IACXrgB,EAASqhB,IACf4kB,EAAa,CACX6b,eAAgB,CACdl0B,SAASA,EACT7S,cAAcA,EACdgnC,YAAYA,KAGhB,IAAMC,EAAe,WACnBx0B,EAAK,cACL,IAAMy0B,EAAUv3C,EAAS4K,SAASuB,KAAKjP,QAAQ,IAAK,IAEpD,GAAIq6C,IADoB73B,EAAOoL,OAAO3O,GAAGuD,EAAOkD,aAAahhB,KAAK,aACjC,CAC/B,IAAM00B,EAAW5W,EAAOiI,WACrBxoB,SAASA,IAATA,OAAaugB,EAAOI,OAAOsO,kCAAyBmpB,SACpDn6C,QACH,QAAI,IAAOk5B,EAA0B,OACrC5W,EAAOqK,QAAQuM,KAGbkhB,EAAU,WACd,GAAK1iB,GAAgBpV,EAAOI,OAAOs3B,eAAel0B,QAClD,GACExD,EAAOI,OAAOs3B,eAAe/mC,cAC7B/a,EAAO8a,SACP9a,EAAO8a,QAAQC,aAEf/a,EAAO8a,QAAQC,aACb,KACA,KACC,WAAGqP,EAAOoL,OAAO3O,GAAGuD,EAAOkD,aAAahhB,KAAK,gBAAkB,GAElEkhB,EAAK,eACA,CACL,IAAM+O,EAAQnS,EAAOoL,OAAO3O,GAAGuD,EAAOkD,aAChCzW,EAAO0lB,EAAMjwB,KAAK,cAAgBiwB,EAAMjwB,KAAK,gBACnD5B,EAAS4K,SAASuB,KAAOA,GAAQ,GACjC2W,EAAK,aAgCT7iB,EAAG,QAAQ,WACLyf,EAAOI,OAAOs3B,eAAel0B,SA9BtB,WACX,MACGxD,EAAOI,OAAOs3B,eAAel0B,SAC7BxD,EAAOI,OAAO1P,SAAWsP,EAAOI,OAAO1P,QAAQ8S,SAFlD,CAKA4R,KACA,IAAM3oB,EAAOnM,EAAS4K,SAASuB,KAAKjP,QAAQ,IAAK,IACjD,GAAIiP,EAEF,IADA,IACSjZ,EAAI,EAAG6F,EAAS2mB,EAAOoL,OAAO/xB,OAAQ7F,EAAI6F,EAAQ7F,GAAK,EAAG,CACjE,IAAM2+B,EAAQnS,EAAOoL,OAAO3O,GAAGjpB,GAE/B,IADkB2+B,EAAMjwB,KAAK,cAAgBiwB,EAAMjwB,KAAK,mBACtCuK,IAAS0lB,EAAM7zB,SAAS0hB,EAAOI,OAAO2O,qBAAsB,CAC5E,IAAMrxB,EAAQy0B,EAAMz0B,QACpBsiB,EAAOqK,QAAQ3sB,EANL,EAMmBsiB,EAAOI,OAAOiP,oBAAoBA,IAIjErP,EAAOI,OAAOs3B,eAAeC,YAC/B/+C,EAAEhD,GAAQ2K,GAAG,aAAcq3C,IApBlB,MAkCbr3C,EAAG,WAAW,WACRyf,EAAOI,OAAOs3B,eAAel0B,SAX7BxD,EAAOI,OAAOs3B,eAAeC,YAC/B/+C,EAAEhD,GAAQ2kB,IAAI,aAAcq9B,MAchCr3C,EAAG,4CAA4C,WACzC60B,GACF0iB,OAGJv3C,EAAG,eAAe,WACZ60B,GAAepV,EAAOI,OAAOuD,SAC/Bm0B,QCvFS,YAA8C10B,IACvDshB,EAD6B1kB,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAA4B6iB,IAA5BA,KAoB/B,SAASoI,IACP,IAAMusB,EAAiB/3B,EAAOoL,OAAO3O,GAAGuD,EAAOkD,aAC3CpF,EAAQkC,EAAOI,OAAOiL,SAASvN,MAC/Bi6B,EAAe71C,KAAK,0BACtB4b,EAAQi6B,EAAe71C,KAAK,yBAA2B8d,EAAOI,OAAOiL,SAASvN,OAEhFzlB,aAAaqsC,GACbA,EAAU7mB,GAAS,WACjB,IAAIm6B,EACAh4B,EAAOI,OAAOiL,SAAS4sB,iBACrBj4B,EAAOI,OAAOwD,MAChB5D,EAAO6D,UACPm0B,EAAiBh4B,EAAOiX,UAAUjX,EAAOI,OAAOC,OAAOA,GAAA,GACvD+C,EAAK,aACKpD,EAAOkL,YAGPlL,EAAOI,OAAOiL,SAAS6sB,gBASjCvyC,KARAqyC,EAAiBh4B,EAAOqK,QACtBrK,EAAOoL,OAAO/xB,OAAS,EACvB2mB,EAAOI,OAAOC,UACd,GAGF+C,EAAK,cATL40B,EAAiBh4B,EAAOiX,UAAUjX,EAAOI,OAAOC,OAAOA,GAAA,GACvD+C,EAAK,aAYEpD,EAAOI,OAAOwD,MACvB5D,EAAO6D,UACPm0B,EAAiBh4B,EAAO6W,UAAU7W,EAAOI,OAAOC,OAAOA,GAAA,GACvD+C,EAAK,aACKpD,EAAOiL,MAGPjL,EAAOI,OAAOiL,SAAS6sB,gBAIjCvyC,KAHAqyC,EAAiBh4B,EAAOqK,QAAQ,EAAGrK,EAAOI,OAAOC,OAAOA,GAAA,GACxD+C,EAAK,cAJL40B,EAAiBh4B,EAAO6W,UAAU7W,EAAOI,OAAOC,OAAOA,GAAA,GACvD+C,EAAK,cAOHpD,EAAOI,OAAOuD,SAAW3D,EAAOqL,SAASC,cACpC0sB,IAD6CxsB,MAIrD1N,GAEL,SAAS3X,IACP,gBAAWu+B,IACP1kB,EAAOqL,SAASC,UACpBtL,EAAOqL,SAASC,SAAUA,EAC1BlI,EAAK,iBACLoI,QAGF,SAAS7lB,IACP,QAAKqa,EAAOqL,SAASC,kBACVoZ,IAEPA,IACFrsC,aAAaqsC,GACbA,UAEF1kB,EAAOqL,SAASC,SAAUA,EAC1BlI,EAAK,oBAGP,SAAS+0B,EAAM93B,GACRL,EAAOqL,SAASC,UACjBtL,EAAOqL,SAASE,SAChBmZ,GAASrsC,aAAaqsC,GAC1B1kB,EAAOqL,SAASE,QAASA,EACX,IAAVlL,GAAgBL,EAAOI,OAAOiL,SAAS+sB,kBAIzC,CAAC,gBAAiB,uBAAuB74C,SAAS8I,YAChD2X,EAAOiI,WAAW,GAAGpa,iBAAiBxF,EAAOunC,OAJ/C5vB,EAAOqL,SAASE,QAASA,EACzBC,OAOJ,SAAS6sB,IACP,IAAM/3C,EAAW2V,IACgB,WAA7B3V,EAASg4C,iBAAgCt4B,EAAOqL,SAASC,SAC3D6sB,IAE+B,YAA7B73C,EAASg4C,iBAAiCt4B,EAAOqL,SAASE,SAC5DC,IACAxL,EAAOqL,SAASE,QAASA,GAG7B,SAASqkB,EAAgBj6C,GAClBqqB,IAAUA,EAAO2J,WAAc3J,EAAOiI,YACvCtyB,EAAEif,SAAWoL,EAAOiI,WAAW,KACnC,CAAC,gBAAiB,uBAAuB1oB,SAAS8I,YAChD2X,EAAOiI,WAAW,GAAGnT,oBAAoBzM,EAAOunC,MAElD5vB,EAAOqL,SAASE,QAASA,EACpBvL,EAAOqL,SAASC,QAGnBE,IAFA7lB,KAKJ,SAAS4yC,IACHv4B,EAAOI,OAAOiL,SAASmtB,qBACzB7yC,IAEAwyC,IAGF,CAAC,gBAAiB,uBAAuB54C,SAAS8I,YAChD2X,EAAOiI,WAAW,GAAGnT,oBAAoBzM,EAAOunC,MAGpD,SAAS6I,IACHz4B,EAAOI,OAAOiL,SAASmtB,uBAG3Bx4B,EAAOqL,SAASE,QAASA,EACzBC,KAzIFxL,EAAOqL,SAAW,CAChBC,SAASA,EACTC,QAAQA,GAGVsQ,EAAa,CACXxQ,SAAU,CACR7H,SAASA,EACT1F,MAAO,IACPs6B,mBAAmBA,EACnBI,sBAAsBA,EACtBN,iBAAiBA,EACjBD,kBAAkBA,EAClBS,mBAAmBA,KAyIvBn4C,EAAG,QAAQ,WACLyf,EAAOI,OAAOiL,SAAS7H,UACzBrd,IACiB8P,IACRpI,iBAAiB,mBAAoBwqC,GAd5Cr4B,EAAOI,OAAOiL,SAASqtB,oBACzB14B,EAAO/e,IAAIV,GAAG,aAAcg4C,GAC5Bv4B,EAAO/e,IAAIV,GAAG,aAAck4C,QAgBhCl4C,EAAG,yBAAyB,SAAC4+B,EAAI9e,EAAOsV,GAClC3V,EAAOqL,SAASC,UACdqK,IAAa3V,EAAOI,OAAOiL,SAASmtB,qBACtCx4B,EAAOqL,SAAS8sB,MAAM93B,GAEtB1a,QAINpF,EAAG,mBAAmB,WAChByf,EAAOqL,SAASC,UACdtL,EAAOI,OAAOiL,SAASmtB,qBACzB7yC,IAEAwyC,QAIN53C,EAAG,YAAY,WAEXyf,EAAOI,OAAOuD,SACd3D,EAAOqL,SAASE,SACfvL,EAAOI,OAAOiL,SAASmtB,sBAExBhtB,OAGJjrB,EAAG,WAAW,WAvCZyf,EAAO/e,IAAIsZ,IAAI,aAAcg+B,GAC7Bv4B,EAAO/e,IAAIsZ,IAAI,aAAck+B,GAwCzBz4B,EAAOqL,SAASC,SAClB3lB,IAEesQ,IACRnB,oBAAoB,mBAAoBujC,MAGnDnkD,OAAO0xB,OAAO5F,EAAOqL,SAAU,CAC7B8sB,QACA3sB,MACArlB,QACAR,UC3MW,YAAuCpF,IAAtByf,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAC5Bs7B,EAAa,CACX8c,OAAQ,CACN34B,OAAQ,KACR44B,sBAAsBA,EACtBC,iBAAkB,EAClBC,sBAAuB,4BACvBC,qBAAsB,mBAI1B,IAAI3jB,KACA4jB,KAMJ,SAASC,IACP,IAAMC,EAAel5B,EAAO24B,OAAO34B,OACnC,GAAKk5B,EAAL,CACA,IAAM3jB,EAAe2jB,EAAa3jB,aAC5BD,EAAe4jB,EAAa5jB,aAClC,KAAIA,GAAgB18B,EAAE08B,GAAch3B,SAAS0hB,EAAOI,OAAOu4B,OAAOG,wBAE9D,MAAOvjB,GAAX,CACA,IAAImC,EAMJ,GAJEA,EADEwhB,EAAa94B,OAAOwD,KACPhqB,SAAShB,EAAEsgD,EAAa5jB,cAAcpzB,KAAK,2BAA4B,IAEvEqzB,EAEbvV,EAAOI,OAAOwD,KAAM,CACtB,IAAIu1B,EAAen5B,EAAOkD,YACtBlD,EAAOoL,OAAO3O,GAAG08B,GAAc76C,SAAS0hB,EAAOI,OAAO2O,uBACxD/O,EAAO6D,UAEP7D,EAAOgX,YAAchX,EAAOiI,WAAW,GAAGpM,WAC1Cs9B,EAAen5B,EAAOkD,aAExB,IAAMoU,EAAYtX,EAAOoL,OACtB3O,GAAG08B,GACH57B,QAAQA,6BAARA,OAAqCma,SACrCjb,GAAG,GACH/e,QACG0hB,EAAYY,EAAOoL,OACtB3O,GAAG08B,GACHh8B,QAAQA,6BAARA,OAAqCua,SACrCjb,GAAG,GACH/e,QACmCg6B,WAA3BJ,EAA0ClY,WACrCA,EAA0CkY,EACjDlY,EAAY+5B,EAAeA,EAAe7hB,EAA0BlY,EACzDkY,EAEtBtX,EAAOqK,QAAQqN,KAGjB,SAAS97B,QACSw9C,EAAiBp5B,EAAOI,OAAhCu4B,OACR,GAAIvjB,EAAa,OAAO,EACxBA,KACA,IAAMikB,EAAcr5B,EAAOrL,YAC3B,GAAIykC,EAAap5B,kBAAkBq5B,EACjCr5B,EAAO24B,OAAO34B,OAASo5B,EAAap5B,OACpC9rB,OAAO0xB,OAAO5F,EAAO24B,OAAO34B,OAAO4Y,eAAgB,CACjD7P,qBAAqBA,EACrBmF,qBAAqBA,IAEvBh6B,OAAO0xB,OAAO5F,EAAO24B,OAAO34B,OAAOI,OAAQ,CACzC2I,qBAAqBA,EACrBmF,qBAAqBA,SAElB,GAAIr4B,EAASujD,EAAap5B,QAAS,CACxC,IAAMs5B,EAAqBplD,OAAO0xB,OAAO,GAAIwzB,EAAap5B,QAC1D9rB,OAAO0xB,OAAO0zB,EAAoB,CAChCvwB,qBAAqBA,EACrBmF,qBAAqBA,IAEvBlO,EAAO24B,OAAO34B,OAAS,IAAIq5B,EAAYC,GACvCN,KAIF,OAFAh5B,EAAO24B,OAAO34B,OAAO/e,IAAInB,SAASkgB,EAAOI,OAAOu4B,OAAOI,sBACvD/4B,EAAO24B,OAAO34B,OAAOzf,GAAG,MAAO04C,MAIjC,SAASzoB,EAAOyF,GACd,IAAMijB,EAAel5B,EAAO24B,OAAO34B,OACnC,GAAKk5B,EAAL,CAEA,IAAMluB,EACkC,SAAtCkuB,EAAa94B,OAAO4K,cAChBkuB,EAAaniB,uBACbmiB,EAAa94B,OAAO4K,cAEpB6tB,EAAmB74B,EAAOI,OAAOu4B,OAAOE,iBACxCU,EAAYV,IAAqBK,EAAa94B,OAAOwD,KAC3D,GAAI5D,EAAO4U,YAAcskB,EAAatkB,WAAa2kB,EAAW,CAC5D,IACIC,EACAv2B,EAFAw2B,EAAqBP,EAAah2B,YAGtC,GAAIg2B,EAAa94B,OAAOwD,KAAM,CAE1Bs1B,EAAa9tB,OACV3O,GAAGg9B,GACHn7C,SAAS46C,EAAa94B,OAAO2O,uBAEhCmqB,EAAar1B,UAEbq1B,EAAaliB,YAAckiB,EAAajxB,WAAW,GAAGpM,WACtD49B,EAAqBP,EAAah2B,aAGpC,IAAMw2B,EAAkBR,EAAa9tB,OAClC3O,GAAGg9B,GACHl8B,QAAQA,6BAARA,OAAqCyC,EAAO4U,iBAC5CnY,GAAG,GACH/e,QACGi8C,EAAkBT,EAAa9tB,OAClC3O,GAAGg9B,GACHt8B,QAAQA,6BAARA,OAAqC6C,EAAO4U,iBAC5CnY,GAAG,GACH/e,QAED87C,WADSE,EACQC,WACDA,EACCD,EACRC,EAAkBF,GAAuBA,EAAqBC,EAErER,EAAa94B,OAAO4J,eAAiB,EAAI2vB,EAAkBF,EACpDE,EAAkBF,EAAqBA,EAAqBC,EACpDC,EAEAD,EAEnBz2B,EAAYjD,EAAOkD,YAAclD,EAAOmD,cAAgB,OAAS,YAGjEF,GADAu2B,EAAiBx5B,EAAO4U,WACK5U,EAAOmD,cAAgB,OAAS,OAE3Do2B,IACFC,GAAgC,SAAdv2B,EAAuB41B,GAAoB,EAAIA,GAIjEK,EAAa/kB,sBACb+kB,EAAa/kB,qBAAqBhyB,QAAQq3C,GAAkB,IAExDN,EAAa94B,OAAO+K,eAEpBquB,EADEA,EAAiBC,EACFD,EAAiBtjD,KAAKgF,MAAM8vB,EAAgB,GAAK,EAEjDwuB,EAAiBtjD,KAAKgF,MAAM8vB,EAAgB,GAAK,EAGpEwuB,EAAiBC,GACjBP,EAAa94B,OAAO4J,eAItBkvB,EAAa7uB,QAAQmvB,EAAgBvjB,EAAU,OAAI,IAKvD,IAAI2jB,EAAmB,EACjBC,EAAmB75B,EAAOI,OAAOu4B,OAAOG,sBAa9C,GAXI94B,EAAOI,OAAO4K,cAAgB,IAAMhL,EAAOI,OAAO+K,iBACpDyuB,EAAmB55B,EAAOI,OAAO4K,eAG9BhL,EAAOI,OAAOu4B,OAAOC,uBACxBgB,EAAmB,GAGrBA,EAAmB1jD,KAAKgF,MAAM0+C,GAE9BV,EAAa9tB,OAAO/rB,YAAYw6C,GAE9BX,EAAa94B,OAAOwD,MACnBs1B,EAAa94B,OAAO8Q,SAAWgoB,EAAa94B,OAAO8Q,QAAQ1N,QAE5D,IAAK,IAAIhwB,EAAI,EAAGA,EAAIomD,EAAkBpmD,GAAK,EACzC0lD,EAAajxB,WACVxoB,SAASA,6BAATA,OAAsCugB,EAAO4U,UAAYphC,SACzDsM,SAAS+5C,QAGd,IAAK,IAAIrmD,EAAI,EAAGA,EAAIomD,EAAkBpmD,GAAK,EACzC0lD,EAAa9tB,OAAO3O,GAAGuD,EAAO4U,UAAYphC,GAAGsM,SAAS+5C,IAjL5D75B,EAAO24B,OAAS,CACd34B,OAAQ,MAqLVzf,EAAG,cAAc,eACPo4C,EAAW34B,EAAOI,OAApBu4B,OACDA,GAAWA,EAAO34B,SACvBpkB,IACA40B,UAEFjwB,EAAG,4CAA4C,WACxCyf,EAAO24B,OAAO34B,QACnBwQ,OAEFjwB,EAAG,iBAAiB,SAAC4+B,EAAI5lB,GACvB,IAAM2/B,EAAel5B,EAAO24B,OAAO34B,OAC9Bk5B,GACLA,EAAalxB,cAAczO,MAE7BhZ,EAAG,iBAAiB,WAClB,IAAM24C,EAAel5B,EAAO24B,OAAO34B,OAC9Bk5B,GACDF,GAAiBE,GACnBA,EAAatb,aAIjB1pC,OAAO0xB,OAAO5F,EAAO24B,OAAQ,CAC3B/8C,OACA40B,YC9NW,YAAgDP,IAA5BjQ,IAAFA,OAAU6b,IAAVA,aAAwBzY,IAAxBA,KAA8B6M,IAA9BA,KAC/B4L,EAAa,CACX/S,SAAU,CACRtF,SAASA,EACTs2B,UAAUA,EACVC,cAAe,EACfC,gBAAgBA,EAChBC,oBAAqB,EACrBC,sBAAuB,EACvBjT,QAAQA,EACRkT,gBAAiB,OAyMrBjmD,OAAO0xB,OAAO5F,EAAQ,CACpB8I,SAAU,CACRnC,YAvMJ,eAC2B9tB,EAAkBmnB,EAAnCsD,gBAAuBC,EAAYvD,EAArCuD,QAEyB,IAA3B1qB,EAAKyjC,WAAWjjC,QAClBR,EAAKyjC,WAAWpzB,KAAK,CACnB89B,SAAUzjB,EAAQvD,EAAOyH,eAAiB,SAAW,UACrDpwB,KAAMwB,EAAKmtB,iBAGfntB,EAAKyjC,WAAWpzB,KAAK,CACnB89B,SAAUzjB,EAAQvD,EAAOyH,eAAiB,WAAa,YACvDpwB,KAAMtB,OA6LNqzB,WAzLJ,SAAoB,GAAEE,QAAFA,WACVlJ,EAA2EJ,EAA7EI,OAAU6H,EAAmEjI,EAA7EiI,WAAoCrB,EAAyC5G,EAAvD6G,aAAmBiE,EAAoC9K,EAA7E8K,SAAoEjyB,EAASmnB,EAA1BsD,gBAGnDkG,EADezzB,IACW8C,EAAKmtB,eAErC,GAAIsD,GAActJ,EAAOoH,eACvBpH,EAAOqK,QAAQrK,EAAOkD,kBAGxB,GAAIoG,GAActJ,EAAOmH,eACnBnH,EAAOoL,OAAO/xB,OAASyxB,EAASzxB,OAClC2mB,EAAOqK,QAAQS,EAASzxB,OAAS,GAEjC2mB,EAAOqK,QAAQrK,EAAOoL,OAAO/xB,OAAS,OAJ1C,CASA,GAAI+mB,EAAO0I,SAASgxB,SAAU,CAC5B,GAAIjhD,EAAKyjC,WAAWjjC,OAAS,EAAG,CAC9B,IAAM+gD,EAAgBvhD,EAAKyjC,WAAWxoB,MAChCumC,EAAgBxhD,EAAKyjC,WAAWxoB,MAEhCwmC,EAAWF,EAAcpT,SAAWqT,EAAcrT,SAClD3vC,EAAO+iD,EAAc/iD,KAAOgjD,EAAchjD,KAChD2oB,EAAOic,SAAWqe,EAAWjjD,EAC7B2oB,EAAOic,UAAY,EACf/lC,KAAKyxB,IAAI3H,EAAOic,UAAY7b,EAAO0I,SAASqxB,kBAC9Cn6B,EAAOic,SAAW,IAIhB5kC,EAAO,KAAOtB,IAAQqkD,EAAc/iD,KAAO,OAC7C2oB,EAAOic,SAAW,QAGpBjc,EAAOic,SAAW,EAEpBjc,EAAOic,UAAY7b,EAAO0I,SAASoxB,sBAEnCrhD,EAAKyjC,WAAWjjC,OAAS,EACzB,IAAIm4C,EAAmB,IAAOpxB,EAAO0I,SAASixB,cACxCQ,EAAmBv6B,EAAOic,SAAWuV,EAEvCgJ,EAAcx6B,EAAOG,UAAYo6B,EACjC3zB,IAAK4zB,GAAeA,GAExB,IACIC,EAEAC,EAHAC,KAEEC,EAA2C,GAA5B1kD,KAAKyxB,IAAI3H,EAAOic,UAAiB7b,EAAO0I,SAASmxB,oBAEtE,GAAIO,EAAcx6B,EAAOmH,eACnB/G,EAAO0I,SAASkxB,gBACdQ,EAAcx6B,EAAOmH,gBAAkByzB,IACzCJ,EAAcx6B,EAAOmH,eAAiByzB,GAExCH,EAAsBz6B,EAAOmH,eAC7BwzB,KACA9hD,EAAKqvB,qBAAsBA,GAE3BsyB,EAAcx6B,EAAOmH,eAEnB/G,EAAOwD,MAAQxD,EAAO+K,iBAAgBuvB,WACrC,GAAIF,EAAcx6B,EAAOoH,eAC1BhH,EAAO0I,SAASkxB,gBACdQ,EAAcx6B,EAAOoH,eAAiBwzB,IACxCJ,EAAcx6B,EAAOoH,eAAiBwzB,GAExCH,EAAsBz6B,EAAOoH,eAC7BuzB,KACA9hD,EAAKqvB,qBAAsBA,GAE3BsyB,EAAcx6B,EAAOoH,eAEnBhH,EAAOwD,MAAQxD,EAAO+K,iBAAgBuvB,WACrC,GAAIt6B,EAAO0I,SAASme,OAAQ,CAEjC,IADA,IAAIpS,EACK3a,EAAI,EAAGA,EAAI4Q,EAASzxB,OAAQ6gB,GAAK,EACxC,GAAI4Q,EAAS5Q,IAAMsgC,EAAa,CAC9B3lB,EAAY3a,EACZ,MAaJsgC,IAJEA,EAJAtkD,KAAKyxB,IAAImD,EAAS+J,GAAa2lB,GAC7BtkD,KAAKyxB,IAAImD,EAAS+J,EAAY,GAAK2lB,IACX,SAA1Bx6B,EAAOkG,eAEO4E,EAAS+J,GAET/J,EAAS+J,EAAY,IAUvC,GANI6lB,GACFzqB,EAAK,iBAAiB,WACpBjQ,EAAO6D,aAIa,IAApB7D,EAAOic,UAMT,GAJEuV,EADE5qB,EACiB1wB,KAAKyxB,MAAM6yB,EAAcx6B,EAAOG,WAAaH,EAAOic,UAEpD/lC,KAAKyxB,KAAK6yB,EAAcx6B,EAAOG,WAAaH,EAAOic,UAEpE7b,EAAO0I,SAASme,OAAQ,CAQ1B,IAAM4T,EAAe3kD,KAAKyxB,KAAKf,GAAO4zB,EAAcA,GAAex6B,EAAOG,WACpE26B,EAAmB96B,EAAO8J,gBAAgB9J,EAAOkD,aAErDsuB,EADEqJ,EAAeC,EACE16B,EAAOC,MACjBw6B,EAAe,EAAIC,EACM,IAAf16B,EAAOC,MAEQ,IAAfD,EAAOC,YAGzB,GAAID,EAAO0I,SAASme,OAEzB,YADAjnB,EAAOwX,iBAILpX,EAAO0I,SAASkxB,gBAAkBW,GACpC36B,EAAOkJ,eAAeuxB,GACtBz6B,EAAOgI,cAAcwpB,GACrBxxB,EAAOmJ,aAAaqxB,GACpBx6B,EAAOgW,iBAAgBA,EAAMhW,EAAOkG,gBACpClG,EAAOyD,WAAYA,EACnBwE,EAAW/M,eAAc,WAClB8E,IAAUA,EAAO2J,WAAc9wB,EAAKqvB,sBACzC9E,EAAK,kBACLpD,EAAOgI,cAAc5H,EAAOC,OAC5B1oB,YAAW,WACTqoB,EAAOmJ,aAAasxB,GACpBxyB,EAAW/M,eAAc,WAClB8E,IAAUA,EAAO2J,WACtB3J,EAAO9E,qBAER,QAEI8E,EAAOic,UAChB7Y,EAAK,8BACLpD,EAAOkJ,eAAesxB,GACtBx6B,EAAOgI,cAAcwpB,GACrBxxB,EAAOmJ,aAAaqxB,GACpBx6B,EAAOgW,iBAAgBA,EAAMhW,EAAOkG,gBAC/BlG,EAAOyD,YACVzD,EAAOyD,WAAYA,EACnBwE,EAAW/M,eAAc,WAClB8E,IAAUA,EAAO2J,WACtB3J,EAAO9E,qBAIX8E,EAAOkJ,eAAesxB,GAGxBx6B,EAAOgJ,oBACPhJ,EAAOiJ,0BACF,IAAI7I,EAAO0I,SAASme,OAEzB,YADAjnB,EAAOwX,iBAEEpX,EAAO0I,UAChB1F,EAAK,gCAGFhD,EAAO0I,SAASgxB,UAAYtwB,GAAYpJ,EAAO+J,gBAClDnK,EAAOkJ,iBACPlJ,EAAOgJ,oBACPhJ,EAAOiJ,6BCjNE,YAAwB4S,IAQjCkf,EACAC,EACAC,EAVyBj7B,IAAFA,QAC3B6b,EADqCA,EAAVA,cACd,CACX/O,KAAM,CACJC,KAAM,EACNkM,KAAM,YAwFVjZ,EAAO8M,KAAO,CACZmF,WAjFkBb,YAClB,IAAQpG,EAAkBhL,EAAOI,OAA3B4K,gBACiBhL,EAAOI,OAAO0M,KAA7BC,IAAFA,KAAQkM,IAARA,KACN+hB,EAAeD,EAAyBhuB,EACxCkuB,EAAiB/kD,KAAKgF,MAAMk2B,EAAerE,GAEzCguB,EADE7kD,KAAKgF,MAAMk2B,EAAerE,KAAUqE,EAAerE,EAC5BqE,EAEAl7B,KAAK69B,KAAK3C,EAAerE,GAAQA,EAEtC,SAAlB/B,GAAqC,QAATiO,IAC9B8hB,EAAyB7kD,KAAKC,IAAI4kD,EAAwB/vB,EAAgB+B,KAuE5EqF,YAnEkB,SAAC5+B,EAAG2+B,EAAOf,EAAcR,OAIvCsqB,EACAC,EACAC,EANuCxqB,EACF5Q,EAAOI,OAAxC4J,IAAFA,eAAkBwD,IAAlBA,eACiBxN,EAAOI,OAAO0M,KAA7BC,IAAFA,KAAQkM,IAARA,KAKN,GAAa,QAATA,GAAkBjP,EAAiB,EAAG,CACxC,IAAMqxB,EAAanlD,KAAKgF,MAAM1H,GAAKw2B,EAAiB+C,IAC9CuuB,EAAoB9nD,EAAIu5B,EAAO/C,EAAiBqxB,EAChDE,EACW,IAAfF,EACIrxB,EACA9zB,KAAKG,IACHH,KAAK69B,MAAM3C,EAAeiqB,EAAatuB,EAAO/C,GAAkB+C,GAChE/C,GAKRkxB,GAFAC,EAASG,GADTF,EAAMllD,KAAKgF,MAAMogD,EAAoBC,IACFA,EAAiBF,EAAarxB,GAElCoxB,EAAML,EAA0BhuB,EAC/DoF,EAAMnW,IAAI,CACR,gBAAiBk/B,EACjBM,MAAON,QAES,WAATjiB,GAETmiB,EAAM5nD,GADN2nD,EAASjlD,KAAKgF,MAAM1H,EAAIu5B,IACLA,GACfouB,EAASF,GAAmBE,IAAWF,GAAkBG,IAAQruB,EAAO,MAC1EquB,GAAO,IACIruB,IACTquB,EAAM,EACND,GAAU,KAKdA,EAAS3nD,GADT4nD,EAAMllD,KAAKgF,MAAM1H,EAAIwnD,IACFA,EAErB7oB,EAAMnW,IACJ4U,EAAkB,cACV,IAARwqB,EAAY5tB,aAAmBA,QAAmB,KA2BpDoF,kBAvBwB,SAACb,EAAWjH,EAAU8F,SACS5Q,EAAOI,OAAtDoN,IAAFA,aAAgBrC,IAAhBA,eAAgC4C,IAAhCA,aACEhB,EAAS/M,EAAOI,OAAO0M,KAAzBC,KAMN,GALA/M,EAAO2R,aAAeI,EAAYvE,GAAgButB,EAClD/6B,EAAO2R,YAAcz7B,KAAK69B,KAAK/T,EAAO2R,YAAc5E,GAAQS,EAC5DxN,EAAOiI,WAAWjM,IAAIA,EAAJA,GACf4U,EAAkB,mBAAc5Q,EAAO2R,YAAcnE,UAEpDrC,EAAgB,CAClBL,EAASnQ,OAAO,EAAGmQ,EAASzxB,QAE5B,IADA,IAAMw5B,EAAgB,GACbr/B,EAAI,EAAGA,EAAIs3B,EAASzxB,OAAQ7F,GAAK,EAAG,CAC3C,IAAIs/B,EAAiBhI,EAASt3B,GAC1Bu6B,IAAc+E,EAAiB58B,KAAKgF,MAAM43B,IAC1ChI,EAASt3B,GAAKwsB,EAAO2R,YAAc7G,EAAS,IAAI+H,EAAc3pB,KAAK4pB,GAEzEhI,EAAS5hB,WAAT4hB,EAAiB+H,OClFR,YAAwB7S,QAAFA,OACnC9rB,OAAO0xB,OAAO5F,EAAQ,CACpBme,YAAaA,GAAYnpC,KAAKgrB,GAC9Bqe,aAAcA,GAAarpC,KAAKgrB,GAChCse,SAAUA,GAAStpC,KAAKgrB,GACxB2e,YAAaA,GAAY3pC,KAAKgrB,GAC9B8e,gBAAiBA,GAAgB9pC,KAAKgrB,MCR3B,YAA4Czf,IAAtByf,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GACjCs7B,EAAa,CACX4f,WAAY,CACVC,WAAWA,EACXnc,YAAa,QAoCjBR,GAAW,CACTzR,OAAQ,OACRtN,SACAzf,KACA4oB,aApCmB,WAGnB,IAFA,IAAQiC,EAAWpL,EAAboL,OACAhL,EAASJ,EAAOI,OAAOq7B,WACpBjoD,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAAG,CACzC,IAAM8rC,EAAWtf,EAAOoL,OAAO3O,GAAGjpB,GAE9BmoD,GADWrc,EAAS,GAAGtL,kBAEtBhU,EAAOI,OAAOiN,mBAAkBsuB,GAAM37B,EAAOG,WAClD,IAAIy7B,EAAK,EACJ57B,EAAOyH,iBACVm0B,EAAKD,EACLA,EAAK,GAEP,IAAME,EAAe77B,EAAOI,OAAOq7B,WAAWC,UAC1CxlD,KAAKC,IAAI,EAAID,KAAKyxB,IAAI2X,EAAS,GAAG1e,UAAW,GAC7C,EAAI1qB,KAAKG,IAAIH,KAAKC,IAAImpC,EAAS,GAAG1e,UAAW,GAAI,GAEnCwe,GAAahf,EAAQkf,GAEpCtjB,IAAI,CACHiwB,QAAS4P,IAEVxiC,UAAUA,eAAVA,OAAyBsiC,iBAASC,iBAevC5zB,cAZqBzO,gBACbgmB,EAAgBvf,EAAOI,OAAOq7B,WAAhClc,aACsBA,EAAcvf,EAAOoL,OAAOvvB,KAAK0jC,GAAevf,EAAOoL,QAC/D9R,WAAWC,GAC/BimB,GAA2B,CAAExf,SAAQzG,WAAUgmB,cAAaE,WAAWA,KASvET,gBAAiB,kBACfhU,cAAe,EACfhB,eAAgB,EAChBjB,qBAAqBA,EACrByE,aAAc,EACdH,kBAAmBrN,EAAOI,OAAOuD,aCpDxB,YAA4CpjB,IAAtByf,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GACjCs7B,EAAa,CACXigB,WAAY,CACVC,cAAcA,EACdC,QAAQA,EACRC,aAAc,GACdC,YAAa,OA0JjBnd,GAAW,CACTzR,OAAQ,OACRtN,SACAzf,KACA4oB,aA1JmB,eAefgzB,EAbFl7C,EAQE+e,EATE/e,IAEJgnB,EAOEjI,EATEiI,WAGJmD,EAMEpL,EATEoL,OAIG+Y,EAKLnkB,EALFvO,MACQ2yB,EAINpkB,EAJFrO,OACciV,EAGZ5G,EAHF6G,aACMkK,EAEJ/Q,EAFF2Q,KACAlY,EACEuH,EATEvH,QAUA2H,EAASJ,EAAOI,OAAO07B,WACvBr0B,EAAezH,EAAOyH,eACtBwJ,EAAYjR,EAAOkR,SAAWlR,EAAOI,OAAO8Q,QAAQ1N,QACtD44B,EAAgB,EAEhBh8B,EAAO47B,SACLv0B,GAE2B,KAD7B00B,EAAgBl0B,EAAWpsB,KAAK,wBACdxC,SAChB8iD,EAAgBvjD,EAAE,0CAClBqvB,EAAWzkB,OAAO24C,IAEpBA,EAAcngC,IAAI,CAAErK,OAAQA,GAARA,OAAWwyB,WAGF,KAD7BgY,EAAgBl7C,EAAIpF,KAAK,wBACPxC,SAChB8iD,EAAgBvjD,EAAE,0CAClBqI,EAAIuC,OAAO24C,KAIjB,IAAK,IAAI3oD,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAAG,CACzC,IAAM8rC,EAAWlU,EAAO3O,GAAGjpB,GACvBw/B,EAAax/B,EACby9B,IACF+B,EAAap5B,SAAS0lC,EAASp9B,KAAK,2BAA4B,KAElE,IAAIm6C,EAA0B,GAAbrpB,EACb0jB,EAAQxgD,KAAKgF,MAAMmhD,EAAa,KAChCz1B,IACFy1B,GAAcA,EACd3F,EAAQxgD,KAAKgF,OAAOmhD,EAAa,MAEnC,IAAMz7B,EAAW1qB,KAAKC,IAAID,KAAKG,IAAIipC,EAAS,GAAG1e,SAAU,IAAK,GAC1D+6B,EAAK,EACLC,EAAK,EACLU,EAAK,EACLtpB,EAAa,GAAM,GACrB2oB,EAAc,GAARjF,EAAY3lB,EAClBurB,EAAK,IACKtpB,EAAa,GAAK,GAAM,GAClC2oB,EAAK,EACLW,EAAc,GAAR5F,EAAY3lB,IACRiC,EAAa,GAAK,GAAM,GAClC2oB,EAAK5qB,EAAqB,EAAR2lB,EAAY3lB,EAC9BurB,EAAKvrB,IACKiC,EAAa,GAAK,GAAM,IAClC2oB,GAAM5qB,EACNurB,EAAK,EAAIvrB,EAA0B,EAAbA,EAAiB2lB,GAErC9vB,IACF+0B,GAAMA,GAGHl0B,IACHm0B,EAAKD,EACLA,EAAK,GAGP,IAAMtiC,oBAAuBoO,EAAe,GAAK40B,0BAC/C50B,EAAe40B,EAAa,8BACVV,iBAASC,iBAASU,SAMtC,GALI17B,GAAY,GAAKA,GAAY,IAC/Bw7B,EAA6B,GAAbppB,EAA6B,GAAXpS,EAC9BgG,IAAKw1B,EAA8B,IAAbppB,EAA6B,GAAXpS,IAE9C0e,EAASjmB,UAAUA,GACf+G,EAAO27B,aAAc,CAEvB,IAAIQ,EAAe90B,EACf6X,EAASzjC,KAAK,6BACdyjC,EAASzjC,KAAK,4BACd2gD,EAAc/0B,EACd6X,EAASzjC,KAAK,8BACdyjC,EAASzjC,KAAK,+BACU,IAAxB0gD,EAAaljD,SACfkjD,EAAe3jD,4CACsB6uB,EAAe,OAAS,mBAE7D6X,EAAS97B,OAAO+4C,IAES,IAAvBC,EAAYnjD,SACdmjD,EAAc5jD,4CACuB6uB,EAAe,QAAU,sBAE9D6X,EAAS97B,OAAOg5C,IAEdD,EAAaljD,SAAQkjD,EAAa,GAAG/mC,MAAMy2B,QAAU/1C,KAAKC,KAAKyqB,EAAU,IACzE47B,EAAYnjD,SAAQmjD,EAAY,GAAGhnC,MAAMy2B,QAAU/1C,KAAKC,IAAIyqB,EAAU,KAQ9E,GALAqH,EAAWjM,IAAI,CACb,8CAAwC+U,EAAa,QACrD,sCAAgCA,EAAa,UAG3C3Q,EAAO47B,OACT,GAAIv0B,EACF00B,EAAc9iC,UAAUA,oBAAVA,OACQ8qB,EAAc,EAAI/jB,EAAO67B,6BAC1C9X,EAAc,oDACyB/jB,EAAO87B,sBAE9C,CACL,IAAMO,EAAcvmD,KAAKyxB,IAAIy0B,GAA4D,GAA3ClmD,KAAKgF,MAAMhF,KAAKyxB,IAAIy0B,GAAiB,IAC7E5nB,EACJ,KACCt+B,KAAKwmD,IAAmB,EAAdD,EAAkBvmD,KAAK6qB,GAAM,KAAO,EAC7C7qB,KAAK4qB,IAAmB,EAAd27B,EAAkBvmD,KAAK6qB,GAAM,KAAO,GAC5C47B,EAASv8B,EAAO87B,YAChBU,EAASx8B,EAAO87B,YAAc1nB,EAC9B7zB,EAASyf,EAAO67B,aACtBE,EAAc9iC,UAAUA,WAAVA,OACDsjC,kBAAcC,gCAA4BxY,EAAe,EAAIzjC,kBACrEyjC,EAAe,EAAIwY,0BAK5B,IAAMC,EAAUpkC,EAAQmK,UAAYnK,EAAQoK,WAAakO,EAAa,EAAI,EAC1E9I,EAAW5O,UAAUA,qBAAVA,OACYwjC,yBACnB78B,EAAOyH,eAAiB,EAAI20B,0BACdp8B,EAAOyH,gBAAkB20B,EAAgB,YAqB3Dp0B,cAlBqBzO,gBACbtY,EAAgB+e,EAAlB/e,IAAkB+e,EAAlBoL,OAEH9R,WAAWC,GACX1d,KACC,gHAEDyd,WAAWC,GACVyG,EAAOI,OAAO07B,WAAWE,SAAWh8B,EAAOyH,gBAC7CxmB,EAAIpF,KAAK,uBAAuByd,WAAWC,IAU7C0lB,YAAa,qBACbD,gBAAiB,kBACfhU,cAAe,EACfhB,eAAgB,EAChBjB,qBAAqBA,EACrBJ,gBAAiB,EACjB6E,aAAc,EACdrC,gBAAgBA,EAChBkC,kBAAkBA,OC5KT,YAA4C9sB,IAAtByf,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GACjCs7B,EAAa,CACXihB,WAAY,CACVf,cAAcA,EACdgB,eAAeA,EACfxd,YAAa,QAiEjBR,GAAW,CACTzR,OAAQ,OACRtN,SACAzf,KACA4oB,aAjEmB,WAGnB,IAHmB,IACXiC,EAA8BpL,EAAhCoL,OAAwBxE,EAAQ5G,EAAtB6G,aACVzG,EAASJ,EAAOI,OAAO08B,WACpBtpD,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAAG,CACzC,IAAM8rC,EAAWlU,EAAO3O,GAAGjpB,GACvBotB,EAAW0e,EAAS,GAAG1e,SACvBZ,EAAOI,OAAO08B,WAAWC,gBAC3Bn8B,EAAW1qB,KAAKC,IAAID,KAAKG,IAAIipC,EAAS,GAAG1e,SAAU,IAAK,IAE1D,IAAMjgB,EAAS2+B,EAAS,GAAGtL,kBAEvBgpB,GADY,IAAMp8B,EAElBq8B,EAAU,EACVtB,EAAK37B,EAAOI,OAAOuD,SAAWhjB,EAASqf,EAAOG,WAAaxf,EAC3Di7C,EAAK,EAYT,GAXK57B,EAAOyH,eAKDb,IACTo2B,GAAWA,IALXpB,EAAKD,EACLA,EAAK,EACLsB,GAAWD,EACXA,EAAU,GAKZ1d,EAAS,GAAG9pB,MAAM0nC,QAAUhnD,KAAKyxB,IAAIzxB,KAAKwgD,MAAM91B,IAAawK,EAAO/xB,OAEhE+mB,EAAO27B,aAAc,CAEvB,IAAIQ,EAAev8B,EAAOyH,eACtB6X,EAASzjC,KAAK,6BACdyjC,EAASzjC,KAAK,4BACd2gD,EAAcx8B,EAAOyH,eACrB6X,EAASzjC,KAAK,8BACdyjC,EAASzjC,KAAK,+BACU,IAAxB0gD,EAAaljD,SACfkjD,EAAe3c,GAAaxf,EAAQkf,EAAUtf,EAAOyH,eAAiB,OAAS,QAEtD,IAAvB+0B,EAAYnjD,SACdmjD,EAAc5c,GAAaxf,EAAQkf,EAAUtf,EAAOyH,eAAiB,QAAU,WAE7E80B,EAAaljD,SAAQkjD,EAAa,GAAG/mC,MAAMy2B,QAAU/1C,KAAKC,KAAKyqB,EAAU,IACzE47B,EAAYnjD,SAAQmjD,EAAY,GAAGhnC,MAAMy2B,QAAU/1C,KAAKC,IAAIyqB,EAAU,IAE5E,IAAMvH,wBAA2BsiC,iBAASC,8BAAsBqB,0BAAuBD,UACrE5d,GAAahf,EAAQkf,GAC7BjmB,UAAUA,KAqBtB2O,cAjBqBzO,gBACbgmB,EAAgBvf,EAAOI,OAAO08B,WAAhCvd,aACsBA,EAAcvf,EAAOoL,OAAOvvB,KAAK0jC,GAAevf,EAAOoL,QAEhF9R,WAAWC,GACX1d,KACC,gHAEDyd,WAAWC,GACdimB,GAA2B,CAAExf,SAAQzG,WAAUgmB,iBAS/CN,YAAa,qBACbD,gBAAiB,kBACfhU,cAAe,EACfhB,eAAgB,EAChBjB,qBAAqBA,EACrByE,aAAc,EACdH,kBAAmBrN,EAAOI,OAAOuD,aCnFxB,YAAiDpjB,IAAtByf,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GACtCs7B,EAAa,CACXshB,gBAAiB,CACfC,OAAQ,GACRC,QAAS,EACTC,MAAO,IACPrS,MAAO,EACPsS,SAAU,EACVxB,cAAcA,EACdxc,YAAa,QAiFjBR,GAAW,CACTzR,OAAQ,YACRtN,SACAzf,KACA4oB,aAjFmB,WASnB,IATmB,IACJgb,EAA+DnkB,EAAtEvO,MAA4B2yB,EAA0CpkB,EAAlDrO,OAAsByZ,EAA4BpL,EAAxEoL,OAAoDtB,EAAoB9J,EAAxE8J,gBACA1J,EAASJ,EAAOI,OAAO+8B,gBACvB11B,EAAezH,EAAOyH,eACtBpO,EAAY2G,EAAOG,UACnBq9B,EAAS/1B,EAA4B0c,EAAc,EAA1B9qB,EAA2C+qB,EAAe,EAA3B/qB,EACxD+jC,EAAS31B,EAAerH,EAAOg9B,QAAUh9B,EAAOg9B,OAChDj9B,EAAYC,EAAOk9B,MAEhB9pD,EAAI,EAAG6F,EAAS+xB,EAAO/xB,OAAQ7F,EAAI6F,EAAQ7F,GAAK,EAAG,CAC1D,IAAM8rC,EAAWlU,EAAO3O,GAAGjpB,GACrBu+B,EAAYjI,EAAgBt2B,GAE5BiqD,GACFD,EAFgBle,EAAS,GAAGtL,kBAELjC,EAAY,GAAKA,EAAa3R,EAAOm9B,SAE5DP,EAAUv1B,EAAe21B,EAASK,EAAmB,EACrDR,EAAUx1B,EAAe,EAAI21B,EAASK,EAEtCC,GAAcv9B,EAAYjqB,KAAKyxB,IAAI81B,GAEnCJ,EAAUj9B,EAAOi9B,QAEE,iBAAZA,IAAkD,IAA1BA,EAAQl7C,QAAQ,OACjDk7C,EAAW7hC,WAAW4E,EAAOi9B,SAAW,IAAOtrB,GAEjD,IAAIke,EAAaxoB,EAAe,EAAI41B,EAAUI,EAC1CzN,EAAavoB,EAAe41B,EAAUI,EAAmB,EAEzDxS,EAAQ,GAAK,EAAI7qB,EAAO6qB,OAAS/0C,KAAKyxB,IAAI81B,GAG1CvnD,KAAKyxB,IAAIqoB,GAAc,OAAOA,EAAa,GAC3C95C,KAAKyxB,IAAIsoB,GAAc,OAAOA,EAAa,GAC3C/5C,KAAKyxB,IAAI+1B,GAAc,OAAOA,EAAa,GAC3CxnD,KAAKyxB,IAAIq1B,GAAW,OAAOA,EAAU,GACrC9mD,KAAKyxB,IAAIs1B,GAAW,OAAOA,EAAU,GACrC/mD,KAAKyxB,IAAIsjB,GAAS,OAAOA,EAAQ,GAErC,IAAM0S,wBAAgC3N,gBAAgBC,gBAAgByN,0BAA0BT,0BAAuBD,wBAAqB/R,OAM5I,GALkB7L,GAAahf,EAAQkf,GAC7BjmB,UAAUskC,GAEpBre,EAAS,GAAG9pB,MAAM0nC,OAAmD,EAAzChnD,KAAKyxB,IAAIzxB,KAAKwgD,MAAM+G,IAE5Cr9B,EAAO27B,aAAc,CAEvB,IAAI6B,EAAkBn2B,EAClB6X,EAASzjC,KAAK,6BACdyjC,EAASzjC,KAAK,4BACdgiD,EAAiBp2B,EACjB6X,EAASzjC,KAAK,8BACdyjC,EAASzjC,KAAK,+BACa,IAA3B+hD,EAAgBvkD,SAClBukD,EAAkBhe,GAAaxf,EAAQkf,EAAU7X,EAAe,OAAS,QAE7C,IAA1Bo2B,EAAexkD,SACjBwkD,EAAiBje,GAAaxf,EAAQkf,EAAU7X,EAAe,QAAU,WAEvEm2B,EAAgBvkD,SAClBukD,EAAgB,GAAGpoC,MAAMy2B,QAAUwR,EAAmB,EAAIA,EAAmB,GAC3EI,EAAexkD,SACjBwkD,EAAe,GAAGroC,MAAMy2B,SAAWwR,EAAmB,GAAKA,EAAmB,MAoBpFz1B,cAhBqBzO,gBACbgmB,EAAgBvf,EAAOI,OAAO+8B,gBAAhC5d,aACsBA,EAAcvf,EAAOoL,OAAOvvB,KAAK0jC,GAAevf,EAAOoL,QAEhF9R,WAAWC,GACX1d,KACC,gHAEDyd,WAAWC,IASd0lB,YAAa,qBACbD,gBAAiB,kBACfjW,qBAAqBA,OCjGZ,YAAgDxoB,IAAtByf,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GACrCs7B,EAAa,CACXiiB,eAAgB,CACdve,YAAa,KACbwe,cAAe,EACfC,mBAAmBA,EACnBC,mBAAoB,EACpBhf,aAAaA,EACb5hB,KAAM,CACJ8C,UAAW,CAAC,EAAG,EAAG,GAClBi9B,OAAQ,CAAC,EAAG,EAAG,GACfnR,QAAS,EACThB,MAAO,GAEThuB,KAAM,CACJkD,UAAW,CAAC,EAAG,EAAG,GAClBi9B,OAAQ,CAAC,EAAG,EAAG,GACfnR,QAAS,EACThB,MAAO,MAiGblM,GAAW,CACTzR,OAAQ,WACRtN,SACAzf,KACA4oB,aA3FmB,WAInB,IAHA,IAAQiC,EAAWpL,EAAboL,OACAhL,EAASJ,EAAOI,OAAO09B,eACDtpB,EAAepU,EAAnC69B,mBAFWj+B,WAGVxsB,GACP,IAAM8rC,EAAWlU,EAAO3O,GAAGjpB,GACrB6gC,EAAgBiL,EAAS,GAAG1e,SAC5BA,EAAW1qB,KAAKG,IACpBH,KAAKC,IAAImpC,EAAS,GAAG1e,UAAWR,EAAO29B,eACvC39B,EAAO29B,eAEHp9C,EAAS2+B,EAAS,GAAGtL,kBACrBt/B,EAAI,CAACsrB,EAAOI,OAAOuD,SAAWhjB,EAASqf,EAAOG,WAAaxf,EAAQ,EAAG,GACtErM,EAAI,CAAC,EAAG,EAAG,GACb4pD,KACCl+B,EAAOyH,iBACV/yB,EAAE,GAAKA,EAAE,GACTA,EAAE,GAAK,GAET,IAAImE,EAAO,CACTsnB,UAAW,CAAC,EAAG,EAAG,GAClBi9B,OAAQ,CAAC,EAAG,EAAG,GACfnS,MAAO,EACPgB,QAAS,GAEPrrB,EAAW,GACb/nB,EAAOunB,EAAOnD,KACdihC,MACSt9B,EAAW,IACpB/nB,EAAOunB,EAAO/C,KACd6gC,MAGFxpD,EAAE6K,SAAQ,SAAC9K,EAAOiJ,GAChBhJ,EAAEgJ,kBAAiBjJ,mBAvCEA,kBACJ,iBAAVA,EAA2BA,YAC5BA,QAqC2B0pD,CAAkBtlD,EAAKsnB,UAAUziB,kBAAaxH,KAAKyxB,IAClF/G,EAAW4T,YAIflgC,EAAEiL,SAAQ,SAAC9K,EAAOiJ,GAChBpJ,EAAEoJ,GAAS7E,EAAKukD,OAAO1/C,GAASxH,KAAKyxB,IAAI/G,EAAW4T,MAGtD8K,EAAS,GAAG9pB,MAAM0nC,QAAUhnD,KAAKyxB,IAAIzxB,KAAKwgD,MAAMriB,IAAkBjJ,EAAO/xB,OAEzE,IAAM+kD,EAAkB1pD,EAAEkL,KAAK,MACzBy+C,oBAA0B/pD,EAAE,2BAAkBA,EAAE,2BAAkBA,EAAE,WACpEgqD,EACO,gBAAX19B,EAAW,EACE,GAAK,EAAI/nB,EAAKoyC,OAASrqB,EAAW4T,EAClC,GAAK,EAAI37B,EAAKoyC,OAASrqB,EAAW4T,EADAA,KAE3C+pB,EACJ39B,EAAW,EACP,GAAK,EAAI/nB,EAAKozC,SAAWrrB,EAAW4T,EACpC,GAAK,EAAI37B,EAAKozC,SAAWrrB,EAAW4T,EACpCnb,wBAA2B+kC,eAAoBC,cAAgBC,GAGrE,GAAKJ,GAAUrlD,EAAKmjD,SAAYkC,EAAQ,CACtC,IAAIne,EAAYT,EAAS7/B,SAAS,wBAIlC,GAHyB,IAArBsgC,EAAU1mC,QAAgBR,EAAKmjD,SACjCjc,EAAYH,GAAaxf,EAAQkf,IAE/BS,EAAU1mC,OAAQ,CACpB,IAAMmlD,EAAgBp+B,EAAO49B,kBACzBp9B,GAAY,EAAIR,EAAO29B,eACvBn9B,EACJmf,EAAU,GAAGvqB,MAAMy2B,QAAU/1C,KAAKG,IAAIH,KAAKC,IAAID,KAAKyxB,IAAI62B,GAAgB,GAAI,IAIhF,IAAMz6B,EAAYqb,GAAahf,EAAQkf,GACvCvb,EAAU1K,UAAUA,GAAW2C,IAAI,CAAEiwB,QAASsS,IAC1C1lD,EAAKid,QACPiO,EAAU/H,IAAI,mBAAoBnjB,EAAKid,SAtElCtiB,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAAG,EAAlCA,IAwFTw0B,cAbqBzO,gBACbgmB,EAAgBvf,EAAOI,OAAO09B,eAAhCve,aACsBA,EAAcvf,EAAOoL,OAAOvvB,KAAK0jC,GAAevf,EAAOoL,QAC/D9R,WAAWC,GAAU1d,KAAK,wBAAwByd,WAAWC,GAEjFimB,GAA2B,CAAExf,SAAQzG,WAAUgmB,cAAaE,WAAWA,KASvER,YAAa,kBAAMjf,EAAOI,OAAO09B,eAAe7e,aAChDD,gBAAiB,kBACfjW,qBAAqBA,EACrBsE,kBAAmBrN,EAAOI,OAAOuD,aC5HxB,YAA6CpjB,IAAtByf,IAAFA,OAAU6b,IAAVA,aAAwBt7B,IAAxBA,GAClCs7B,EAAa,CACX4iB,YAAa,CACX1C,cAAcA,EACdxc,YAAa,QA+FjBR,GAAW,CACTzR,OAAQ,QACRtN,SACAzf,KACA4oB,aA/FmB,WAKnB,IALmB,IACXiC,EAAwBpL,EAA1BoL,OAAUlI,EAAgBlD,EAA1BkD,YACA9C,EAASJ,EAAOI,OAAOq+B,cACSz+B,EAAOsD,gBAArCyE,IAAFA,eAAkB3D,IAAlBA,UACAqE,EAAmBzI,EAAOG,UACvB3sB,EAAI,EAAGA,EAAI43B,EAAO/xB,OAAQ7F,GAAK,EAAG,CACzC,IAAM8rC,EAAWlU,EAAO3O,GAAGjpB,GACrB6gC,EAAgBiL,EAAS,GAAG1e,SAC5BA,EAAW1qB,KAAKG,IAAIH,KAAKC,IAAIk+B,GAAgB,GAAI,GACnD1zB,EAAS2+B,EAAS,GAAGtL,kBACrBhU,EAAOI,OAAO+K,iBAAmBnL,EAAOI,OAAOuD,SACjD3D,EAAOiI,WAAW5O,UAAUA,cAAVA,OAAwB2G,EAAOoH,uBAE/CpH,EAAOI,OAAO+K,gBAAkBnL,EAAOI,OAAOuD,UAChDhjB,GAAUyqB,EAAO,GAAG4I,mBAEtB,IAAI0qB,EAAK1+B,EAAOI,OAAOuD,SAAWhjB,EAASqf,EAAOG,WAAaxf,EAC3Dg+C,EAAK,EACHC,GAAM,IAAM1oD,KAAKyxB,IAAI/G,GACvBqqB,EAAQ,EACRmS,GAAU,EAAIx8B,EAEdi+B,EAAQ,EAAyB,IAArB3oD,KAAKyxB,IAAI/G,GAEnBk+B,GACHtrD,IAAM0vB,GAAe1vB,IAAM0vB,EAAc,IAC1CtC,EAAW,GACXA,EAAW,IACVwD,GAAapE,EAAOI,OAAOuD,UAC5B8E,EAAmBV,EACfg3B,GACHvrD,IAAM0vB,GAAe1vB,IAAM0vB,EAAc,IAC1CtC,EAAW,GACXA,GAAY,IACXwD,GAAapE,EAAOI,OAAOuD,UAC5B8E,EAAmBV,EACrB,GAAI+2B,GAAiBC,EAAe,CAClC,IAAMC,WAAe,EAAI9oD,KAAKyxB,KAAKzxB,KAAKyxB,IAAI/G,GAAY,IAAO,IAAS,IACxEw8B,IAAW,GAAKx8B,EAAWo+B,EAC3B/T,IAAU,GAAM+T,EAChBH,GAAS,GAAKG,EACdL,GAAS,GAAKK,EAAc9oD,KAAKyxB,IAAI/G,GAA/B,IAYR,GAPE89B,EAFE99B,EAAW,iBAEA89B,mBAAWG,EAAQ3oD,KAAKyxB,IAAI/G,UAChCA,EAAW,iBAEP89B,oBAAYG,EAAQ3oD,KAAKyxB,IAAI/G,oBAElC89B,SAEL1+B,EAAOyH,eAAgB,CAC1B,IAAMw3B,EAAQN,EACdA,EAAKD,EACLA,EAAKO,EAGP,IAEM5lC,kCACUqlC,eAAOC,eAAOC,kCAClBxB,iCAHVx8B,EAAW,EAAK,IAAE,GAAK,EAAIqqB,GAASrqB,GAAc,IAAE,GAAK,EAAIqqB,GAASrqB,gBAOxE,GAAIR,EAAO27B,aAAc,CAEvB,IAAIhc,EAAYT,EAASzjC,KAAK,wBACL,IAArBkkC,EAAU1mC,SACZ0mC,EAAYH,GAAaxf,EAAQkf,IAE/BS,EAAU1mC,SACZ0mC,EAAU,GAAGvqB,MAAMy2B,QAAU/1C,KAAKG,IAAIH,KAAKC,KAAKD,KAAKyxB,IAAI/G,GAAY,IAAO,GAAK,GAAI,IAGzF0e,EAAS,GAAG9pB,MAAM0nC,QAAUhnD,KAAKyxB,IAAIzxB,KAAKwgD,MAAMriB,IAAkBjJ,EAAO/xB,OACvD+lC,GAAahf,EAAQkf,GAC7BjmB,UAAUA,KAiBtB2O,cAbqBzO,gBACbgmB,EAAgBvf,EAAOI,OAAOq+B,YAAhClf,aACsBA,EAAcvf,EAAOoL,OAAOvvB,KAAK0jC,GAAevf,EAAOoL,QAC/D9R,WAAWC,GAAU1d,KAAK,wBAAwByd,WAAWC,GAEjFimB,GAA2B,CAAExf,SAAQzG,WAAUgmB,iBAS/CN,YAAa,qBACbD,gBAAiB,kBACfjW,qBAAqBA,EACrBsE,kBAAmBrN,EAAOI,OAAOuD,qBxBxGvC6X,EAAOkB,IAAIhpC,U,gCyBPX,IAAMwrD,EAAQppD,EAAQ,GAEhBqpD,EAAkBvmD,EAAE,0BACpBwmD,EAAoBxmD,EAAE,2BAc5B,SAASymD,EAAeC,GACpB,IAAIC,EAEAC,EACE78C,EAAMw8C,EAAgBtmD,KAAK,aACjC,IACI,IAAM4mD,EAAaH,GAAgB33C,KAAKyE,MAAMD,mBAAmBmzC,IAC7DG,IAGAD,EAAc,CACVD,SAHJA,EAAWrrD,OAAO+F,KAAKwlD,GAAY,GAI/BC,WAHSD,EAAWF,IAKxB3mD,EAAEqM,KAAK,CACHtC,IAAKu8C,EAAMluC,eAAerO,EAAK,MAAO88C,EAAWE,WAAW5nC,QAC5DxK,KAAM,OACNxG,SAAU,OACVlO,KAAM2mD,EACNr6C,QAAS,SAAUtM,GACXA,GAAQA,EAAK+mD,kBACbR,EAAkB/kD,KAAKxB,EAAK+mD,kBACvBvgD,YAAY,UAAUS,SAAS,YAG5CC,MAAO,WACHnH,EAAE8M,UAAUC,WAI1B,MAAOhQ,GACL,OAAO,EAEX,OAAO,EAOX,SAASkqD,IACL,IACIC,EADAC,EAAWZ,EAAgBtjD,KAAK,mBAGhCkkD,IAEAD,EADoBpgD,MAAMqiC,KAAKge,GACAlkD,MAAK,SAAUoiC,GAC1C,OAAsC,OAA/BrlC,EAAEqlC,GAASplC,KAAK,eAG/B,OAAOinD,EAeXvsD,EAAOD,QAAU,CACb+rD,eAAgBA,EAChBQ,eAAgBA,EAChBG,0BAXJ,WACI,IAAMN,EAAaG,IACbI,EAAarnD,EAAE8mD,GAAY7mD,KAAK,WAnEtCumD,EAAkB//C,YAAY,WAAWS,SAAS,UAsElDu/C,EAAeY,M,gCC/EnB,IAAMr1B,EAAc90B,EAAQ,GACtBoqD,EAAWpqD,EAAQ,IA+BzB,SAASqqD,EAAsBC,GAC3B,IAAIC,EAAwBD,EAAavnD,KAAK,WAAaunD,EAAal+C,KAAK,QAC7EtJ,EAAEynD,GAAuBxkD,KAAK,sBAAsBykD,MAAM,WAAWA,MAAM,UAG/E/sD,EAAOD,QAAU,CACbsI,KAAM,WAEFhD,EAAE,wCAAwCqQ,MAAK,WAC3C,IAAIs3C,EAAQ3nD,EAAEnD,MACV+qD,EAAyBD,EAAMrgD,QAAQ,oBAG3CtH,EAAEhD,QAAQ2K,GAAG,QAAQ,YACbqqB,EAAY61B,aAAgBD,EAAuBnnD,QAEnDknD,EAAM1kD,KAAK,WAAWgE,WAAWmsC,UAKzCpzC,EAAEhD,QAAQ2K,GAAG,SAAU2/C,GACnB,WACQM,EAAuBnnD,QACvBknD,EAAM1kD,KAAK,WAAWgE,WAAWoZ,OAAO2R,EAAY81B,cAEzD,SAGX9nD,EAAE,2BAA2B2H,GAAG,QAAS,cAAc,SAAU5K,GAC7DA,EAAE8K,iBACF,IAAIkgD,EAAY/nD,EAAEnD,MAGlBkrD,EAAU9gD,SAAS,cAAcR,YAAY,UAC7CshD,EAAU7gD,SAAS,UAEnB,IA7DJ8gD,EAEAC,EACAR,EACAS,EAyDQC,EAAOJ,EAAUzgD,QAAQ,oBAC7B6gD,EAAK9gD,KAAK,OAAO+gD,YAAYD,EAAMJ,GAGnCR,EAAsBQ,GAjE1BC,EAAchoD,EAmEmB+nD,GAjEjCE,EADmBD,EAAY1gD,QAAQ,qBACFT,SAAS,wCAC9C4gD,EAAwBO,EAAY/nD,KAAK,WAAa+nD,EAAY1+C,KAAK,SACvE4+C,EAAiBloD,EAAEynD,IAIRY,QAEXr2B,EAAY61B,aAAgBK,EAAe5gD,QAAQ,oBAAoB7G,QAEvEynD,EAAejhD,WAAWmsC,OAI9B6U,EAAkBphD,SAAS,8BAA8BJ,YAAY,UACrEyhD,EAAehhD,SAAS,aAqDpBlH,EAAE,eAAe2H,GAAG,QAAS,gBAAgB,WAIzC4/C,EAHgBvnD,EAAEnD,UAMtB,IAAIgX,EAAOvB,SAASuB,KAChBA,GAEA7T,EAAE,sCAAsCqQ,MAAK,WACzC,IAAI03C,EAAY/nD,EAAEnD,MAElB,OAD4BkrD,EAAU9nD,KAAK,WAAa8nD,EAAUz+C,KAAK,WACzCuK,IAE1Bk0C,EAAUrnD,QAAQ,UACX,S,8+MC5FvBy5B,EAAImuB,gBAAMC,GAEdpuB,EAAEA,EAAIA,EAESA,S,gCCDf,IAAImsB,EAAQppD,EAAQ,GAChBsrD,EAAUtrD,EAAQ,IAClBurD,EAAQvrD,EAAQ,IAChBwrD,EAAWxrD,EAAQ,IACjByrD,EAA6BzrD,EAAQ,IAMvC6uB,EAAO7uB,EAAQ,IACf80B,EAAc90B,EAAQ,GAEpBqpD,EAAkBvmD,EAAE,0BACpB4oD,EAAU,GAyBhB,SAASxgD,EAAYC,GAWjB,OARIrI,EAAE,oBAAoB0F,SAAS,UAAY1F,EAAE,gBAAgBS,OACvDT,EAAEqI,GAAKf,QAAQ,kBAAkBrE,KAAK,sBAAsBhD,KAAK,OAChED,EAAE,uBAAuBS,QAAUT,EAAE,gBAAgBS,OACtDT,EAAEqI,GAAKf,QAAQ,mBAAmBrE,KAAK,eAAehD,KAAK,OAE3DD,EAAE,uCAAuCC,KAAK,OAc5D,SAASiK,EAAoBZ,EAAMu/C,EAAgBhgD,EAAmBigD,GAClEx/C,EAAKE,OAAO7C,SAAQ,SAAU8C,GAC1B,IASIM,EATEg/C,EAAclgD,EAAkB5F,KAAK,eAAiBqG,EAAKrH,GAAK,wBAA0BwH,EAAU5N,MAAQ,MAC5GmtD,EAAgBD,EAAYtjD,SAC5BwjD,EAAuBD,EAAc1hD,QAAQ,uBAAuBrH,KAAK,iBAG/E8oD,EAAYtiD,YAAY,oCACxBuiD,EAAcviD,YAAY,oCAC1BuiD,EAAc/oD,KAAK,WAAY,IAG3BqJ,EAAKw/C,uBASOlqD,KADZmL,EAAMN,EAAUM,MAGZi/C,EAAc/oD,KAAK,WAAY,IAC/B+oD,EAAc9hD,SAAS,gBACvB6hD,EAAY7hD,SAAS,kBAGrB8hD,EAAc/oD,KAAK,WAAY8J,GAC/Bi/C,EAAc9hD,SAAS,cACvB6hD,EAAY7hD,SAAS,oBAIbtI,KADZmL,EAAMN,EAAUM,MAOc,aAAtB++C,QAAsDlqD,IAAlB6K,EAAUM,KAJlDi/C,EAAc/oD,KAAK,WAAY,IAC/B+oD,EAAc9hD,SAAS,gBACvB6hD,EAAY7hD,SAAS,kBAQjB8hD,EAAc/oD,KAAK,WAAY8J,GAC/Bi/C,EAAc9hD,SAAS,cACvB6hD,EAAY7hD,SAAS,eAIjC,IAAMgiD,EA3Fd,SAA2Bz/C,EAAWo/C,GAClC,IAAIK,EASJ,OARc5tD,OAAO+F,KAAKwnD,EAAeM,aACjCxiD,SAAQ,SAAUxK,GACtB,OAAI0sD,EAAeM,YAAYhtD,GAAKitD,QAAU3/C,EAAUxH,KACpDinD,EAAiBL,EAAeM,YAAYhtD,GAAKktD,UAC1C,MAIRH,EAiFoBI,CAAkB7/C,EAAWo/C,GAGpDG,EAAc1/C,KAAK,aAAcG,EAAU8/C,cACvC9/C,EAAUG,WACVo/C,EAAc9hD,SAAS,YACvB8hD,EAAc1/C,KAAK,aAAcG,EAAU8/C,aAAe,IAAMP,EAAc/oD,KAAK,mBACnF+oD,EAActoD,QAAQ,QAAQiH,GAAG,SAAS,SAAC5K,GACvCA,EAAE8K,iBACF9K,EAAEif,OAAO3M,MAAM,CAAEm6C,eAAe,OAEpCT,EAAY7hD,SAAS,YACrB8hD,EAActoD,QAAQ,mBAAoB,CAACsoD,EAAev/C,MAG3B,IAA/BA,EAAUggD,kBAAiD,OAAnBP,GAA4BA,GAO9B,IAA/Bz/C,EAAUggD,kBAA8BP,IAC1CF,EAActjD,SAAS,kBACxBsjD,EAAc9hD,SAAS,gBACvB6hD,EAAY7hD,SAAS,mBATzB8hD,EAAc9hD,SAAS,iBACvB6hD,EAAY7hD,SAAS,iBACjB8hD,EAActjD,SAAS,kBACvBsjD,EAAcviD,YAAY,gBAC1BsiD,EAAYtiD,YAAY,uBASP7H,IAArB6K,EAAUigD,OACVV,EAAch/C,WAAW,QAEzBg/C,EAAc1/C,KAAK,OAAQG,EAAUigD,QAGrCV,EAActjD,SAAS,gBACvBsjD,EAAc1/C,KAAK,gBAAiB2/C,GAEpCD,EAAc1/C,KAAK,gBAAiB,OA6KhD,SAASqgD,EAAaR,EAAaS,EAAUC,GAEzC,IADA,IAAIh0C,EAAM,GACDjb,EAAI,EAAGA,EAAIgvD,EAASnpD,OAAQ7F,IAAK,CACtC,IAAIkvD,EAAMF,EAAShvD,GACnB,QAAyBgE,IAArBuqD,EAAYW,GAAoB,CAChC,IAAIC,EAAiBZ,EAAYW,GAAKD,IACD,IAAjCh0C,EAAItM,QAAQwgD,IACZl0C,EAAIvF,KAAKy5C,IAIrB,OAAOl0C,EA8IX,SAASm0C,EAAuBC,EAAWC,EAAcC,GAErD,IADA,IAAInsD,EACKpD,EAAI,EAAGA,EAAIuvD,EAAW1pD,OAAQ7F,IACnC,GAAIsvD,EAAaC,EAAWvvD,IAAI6jD,SAASwL,GAAY,CACjDjsD,EAASmsD,EAAWvvD,GACpB,MAGR,OAAOoD,EASX,SAASosD,EAAqBC,EAAoBC,EAAkBL,GAChEK,EAAiB3jD,SAAQ,SAAA4jD,GACjBF,EAAmBE,GAAa9L,SAASwL,IAEzCjqD,EAAE,wCAA0CuqD,EAAc,MACrDjjD,QAAQ,oBACRb,YAAY,cACZS,SAAS,mBAS1B,SAASsjD,EAAuB3hD,GAC5B,IAAM4hD,EAAWC,OAAO7hD,EAAkB5I,KAAK,eACzCgqD,EAAYS,OAAO7hD,EAAkB5I,KAAK,QAGhD,GAAKjD,OAAO2tD,cAAiBF,GAAaR,GACrCjtD,OAAO2tD,aAAaF,IACpBztD,OAAO2tD,aAAaF,GAAUG,eAC9B5tD,OAAO2tD,aAAaF,GAAUG,cAAcC,UAHjD,CAOgC,OAA5B97C,KAAKC,UAAU45C,KACfA,EAAQyB,mBAAqBrtD,OAAO2tD,aAAaF,GAAUG,cAAcxB,OAAS,GAClFR,EAAQ0B,iBAAmBhvD,OAAO+F,KAAKunD,EAAQyB,oBAC/CzB,EAAQkC,kBAAoB9tD,OAAO2tD,aAAaF,GAAUG,cAAc7yB,MAAQ,GAChF6wB,EAAQmC,gBAAkBzvD,OAAO+F,KAAKunD,EAAQkC,mBAC9ClC,EAAQoC,iBAAmBhuD,OAAO2tD,aAAaF,GAAUG,cAAcK,WAAa,GACpFrC,EAAQsC,eAAiB5vD,OAAO+F,KAAKunD,EAAQoC,mBAGjD,IAEQG,EACAC,EAHFC,EAAcruD,OAAO2tD,aAAaF,GAAUG,cAAcC,UAAU,GAC1E,GAAIQ,EAIAF,EAAevC,EAAQkC,kBAAoBd,EAAuBC,EAAWrB,EAAQkC,kBAAmBlC,EAAQmC,iBAAmB,KACnIK,EAAcxC,EAAQoC,iBAAmBhB,EAAuBC,EAAWrB,EAAQoC,iBAAkBpC,EAAQsC,gBAAkB,KAE3HC,IACIC,EAGAxC,EAAQoC,iBAAiBI,GAAazkD,SAAQ,SAAA2kD,GACtCD,EAAY5M,SAAS6M,IAAY1C,EAAQkC,kBAAkBK,GAAc1M,SAAS6M,IAClFlB,EAAqBxB,EAAQyB,mBAAoBzB,EAAQ0B,iBAAkBgB,MAKnF1C,EAAQkC,kBAAkBK,GAAcxkD,SAAQ,SAAA2kD,GACxCD,EAAY5M,SAAS6M,IACrBlB,EAAqBxB,EAAQyB,mBAAoBzB,EAAQ0B,iBAAkBgB,QAgBnG,SAAShhD,EAAYihD,EAAe1iD,GAChC,IAAIM,EAAQoiD,EAAcriD,oBAGtBG,EAAoB,CAAC,SAGrBmiD,EAAgBriD,EAAM8V,QAAO,SAAU3V,GACvC,OAAOA,EAAKw/C,qBAIZA,EAAoB0C,EAAc/qD,OAAS+qD,EAAc,GAAGvpD,GAAK,GAGjEwpD,EAAgB,GACpBtiD,EAAMxC,SAAQ,SAAU2C,GACpBmiD,EAAcn7C,KAAKhH,EAAKrH,IACpBoH,EAAkBE,QAAQD,EAAKrH,KAAO,EACtCiI,EAAoBZ,EAAMiiD,EAAe1iD,EAAmBigD,GAvZxE,SAAgCx/C,EAAMT,EAAmBigD,GACrD,IAAIt3C,EAAQ,EACRk6C,EAAgB,EACpBpiD,EAAKE,OAAO7C,SAAQ,SAAUojD,GACtBA,EAAe9/C,YACfuH,IAEAu4C,EAAengD,UACf8hD,OAGRpiD,EAAKE,OAAO7C,SAAQ,SAAU8C,GAC1B,IAUIM,EAVEL,EAAab,EAAkB5F,KAAK,eAAiBqG,EAAKrH,GAAK,wBAA0BwH,EAAU5N,MAAQ,MAC3G8vD,EAAqBjiD,EAAWpC,QAAQ,+CAA+CrH,KAAK,iBAGlGyJ,EAAWjD,YAAY,oCACvBiD,EAAWzJ,KAAK,WAAY,IACN,IAAlByrD,GACAhiD,EAAWpC,QAAQ,iBAAiBrE,KAAK,wBAAwBwD,YAAY,eAAehE,KAAK,IAIjG6G,EAAKw/C,uBASOlqD,KADZmL,EAAMN,EAAUM,MAGZL,EAAWzJ,KAAK,WAAY,IAC5ByJ,EAAWxC,SAAS,kBAGpBwC,EAAWzJ,KAAK,WAAY8J,GAC5BL,EAAWxC,SAAS,oBAIZtI,KADZmL,EAAMN,EAAUM,MAGZL,EAAWzJ,KAAK,WAAY,IAC5ByJ,EAAWxC,SAAS,kBAEpBwC,EAAWzJ,KAAK,WAAY8J,GAExBN,EAAUQ,WACVP,EAAWxC,SAAS,cAEpBwC,EAAWxC,SAAS,iBAMhCwC,EAAWJ,KAAK,aAAcI,EAAWzJ,KAAK,eAC1CwJ,EAAUG,WACVF,EAAWxC,SAAS,YACpBwC,EAAWJ,KAAK,aAAcI,EAAWzJ,KAAK,cAAgB,IAAMyJ,EAAWzJ,KAAK,mBACpFyJ,EAAWhJ,QAAQ,QAAQiH,GAAG,SAAS,SAAC5K,GACpCA,EAAE8K,iBACF9K,EAAEif,OAAO3M,MAAM,CAAEm6C,eAAe,OAEpC9/C,EAAWhJ,QAAQ,mBAAoB,CAACgJ,EAAYD,KAGpDH,EAAKsiD,aAAkD,cAAnCtiD,EAAKsiD,YAAYxxC,gBACjC3Q,EAAUQ,WACI,IAAVuH,GAAe/H,EAAUG,SACzBF,EAAWxC,SAAS,YAEpBwC,EAAWxC,SAAS,cAGxBwC,EAAWxC,SAAS,kBAIO,IAA/BuC,EAAUggD,kBACV//C,EAAWxC,SAAS,qBAGCtI,IAArB6K,EAAUigD,OACVhgD,EAAWM,WAAW,QAEtBN,EAAWJ,KAAK,OAAQG,EAAUigD,QAGlChgD,EAAWhE,SAAS,gBACpBgE,EAAWJ,KAAK,gBAAiBqiD,GAEjCjiD,EAAWJ,KAAK,gBAAiB,OA0TjCe,CAAuBf,EAAMT,MAOrC,IAAIqH,EAAMq7C,EAAcM,SACxB,GAAI7uD,OAAO2tD,cAAgB3tD,OAAO2tD,aAAaz6C,GAAM,CACjD,IAAIi5C,EAAcnsD,OAAO2tD,aAAaz6C,GAAKi5C,YACvCyB,EAAgB5tD,OAAO2tD,aAAaz6C,GAAK06C,eAzPrD,SAA+B/hD,EAAmBM,EAAO2/C,EAAmB2C,EAAetC,EAAayB,GACpG,GAA0B,KAAtB9B,EAAJ,CAIA,IAAIgD,GAAqD,IAAvCL,EAAcliD,QAAQ,YACpCwiD,GAA+C,IAApCN,EAAcliD,QAAQ,SACjCyiD,GAA6C,IAAnCP,EAAcliD,QAAQ,QAChC0iD,GAAuD,IAAxCR,EAAcliD,QAAQ,aAKzC,GAAMuiD,GAAeG,EAArB,CAKA,IASIrC,EATAsC,EAAqB,GAUzB,GATA/iD,EAAMxC,SAAQ,SAAU2C,GACpBA,EAAKE,OAAO7C,SAAQ,SAAU8C,GACtBA,EAAUG,WACVsiD,EAAmB5iD,EAAKrH,IAAMwH,EAAU5N,aAM1B,aAAtBitD,GAAoCgD,EAAa,CACjDjjD,EAAkB5F,KAAK,0CAA0CwD,YAAY,WAC7EoC,EAAkB5F,KAAK,2CAA2CwD,YAAY,WAI9E,IAAI0lD,EAAmBD,EAA6B,SACpD,QAAyBttD,IAArButD,EACA,OAOJ,GAHAvC,EAAWgB,EAAwB,SAAEuB,GAGjCH,EAAS,CACT,IAAII,EAAazC,EAAaR,EAAaS,EAAU,QAGjDwC,EAAW3rD,QACXoI,EAAkB5F,KAAK,0CAA0CoN,MAAK,WAClE,IAAI3H,EAAM1I,EAAEnD,MAAMoD,KAAK,mBACXrB,IAAR8J,IAA0D,IAArC0jD,EAAW7iD,QAAQmhD,OAAOhiD,KAE/C1I,EAAEnD,MAAMqK,SAAS,cAOjC,GAAI6kD,EAAU,CACV,IAAIM,EAAc1C,EAAaR,EAAaS,EAAU,SAElDyC,EAAY5rD,QACZoI,EAAkB5F,KAAK,2CAA2CoN,MAAK,WACnE,IAAI3H,EAAM1I,EAAEnD,MAAMoD,KAAK,mBACXrB,IAAR8J,IAA2D,IAAtC2jD,EAAY9iD,QAAQmhD,OAAOhiD,KAEhD1I,EAAEnD,MAAMqK,SAAS,oBAK9B,GAA0B,UAAtB4hD,GAAiCmD,EAAc,CACtDpjD,EAAkB5F,KAAK,+CAA+CwD,YAAY,WAGlF,IAAI0kD,EAAee,EAAyB,KAC5C,QAAqBttD,IAAjBusD,EACA,OAGJ,IAAImB,EAAgB,GAChBC,EAAe,GACnB,GAAIR,EAAU,CACV,IAAIS,EAAgBN,EAA0B,WACxBttD,IAAlB4tD,IACAF,EAAgB1B,EAAqB,MAAE4B,IAK/C,GAAIR,EAAS,CAaT,IAAIS,EAAkB9C,EAAaR,EAL/BS,GANJ2C,EAAe3B,EAAoB,KAAEO,IAGpB1qD,QAAU6rD,EAAc7rD,OAG1B6lD,EAAM7vC,kBAAkB81C,EAAcD,GAEtCC,EAG2C,aAGtDE,EAAgBhsD,QAChBoI,EAAkB5F,KAAK,+CAA+CoN,MAAK,WACvE,IAAI3H,EAAM1I,EAAEnD,MAAMoD,KAAK,mBACXrB,IAAR8J,IAA+D,IAA1C+jD,EAAgBljD,QAAQmhD,OAAOhiD,KAEpD1I,EAAEnD,MAAMqK,SAAS,kBA2IjCwlD,CAAsB7jD,EAAmBM,EAAO2/C,EAAmB2C,EAAetC,EAAayB,IAlTvG,SAA8B/hD,GAC1B7I,EAAE,cAAe6I,GAAmBwH,MAAK,WACrC,IAAIs8C,GAAe,EACnB3sD,EAAEnD,MAAMoG,KAAK,gBAAgBoN,MAAK,WAC1BrQ,EAAEnD,MAAM6I,SAAS,gBACwB,IAAtC1F,EAAEnD,MAAM6I,SAAS,mBACe,IAAhC1F,EAAEnD,MAAM6I,SAAS,aAEpBinD,GAAe,MAInBA,EACA3sD,EAAEnD,MAAMwrD,OAERroD,EAAEnD,MAAMu2C,UAsShBwZ,CAAqB/jD,GAkEzB,SAASgkD,IACL,IAAMC,EAAgB9sD,EAAE,mBAAmBC,KAAK,cAC1C8sD,EAAgB/sD,EAAE,gCAAgCC,KAAK,cAG7D,GAAKjD,OAAO2tD,aAAZ,CAIA,IAAMqC,EAA0BhwD,OAAO2tD,aAAamC,GAAelC,cAAcxB,MAAM2D,GAEnFC,GAEAA,EAAwBrmD,SAAQ,SAAU2kD,GACtC,IAAM2B,EAAcjwD,OAAO2tD,aAAamC,GAAe3D,YAAYmC,GAASvzB,KACtEm1B,EAAkBlwD,OAAO2tD,aAAamC,GAAe3D,YAAYmC,GAASjC,SAChErpD,EAAE,oCAAsCitD,EAAc,MAG9DvqD,YAAY,uBAAwBwqD,OA0UxD,SAASC,EAAmBC,EAAWC,GACX9G,EAAgBj/C,QAAQ,mBAAmBrE,KAAK,kDAExDoN,MAAK,WACjB,IAGIi9C,EAHEC,EAAgBvtD,EAAEnD,MAClB2wD,EAAWD,EAActqD,KAAK,mBAC9BwqD,EAAcF,EAAc7nD,SAAS,4BAG3C,GAAkB,cAAd2nD,EACAC,EArEZ,SAA8BF,EAAWK,GAiBrC,OAdIA,EACSztD,EAAE,wJAMFA,EAAE,6JAAD,OAEgFotD,EAAUM,QAAO,2JAyDxFC,CAAqBP,EAAWK,OAC5C,IAAkB,UAAdJ,EAGP,OAFAC,EA7CZ,SAA0BF,EAAWK,GACjC,IAAIG,EACAC,EAuBJ,OApBID,EADAH,EACSztD,EAAE,sLAMFA,EAAE,gGAAD,OAAiGotD,EAAUU,QAAO,wBAAgBV,EAAUW,UAAS,YAGnKF,EAAiB7tD,EAAE,+DAAD,OAGCotD,EAAUY,sBAAqB,mCAC/BZ,EAAUa,6BAA4B,qEAKzDL,EAAOzpC,QAAQ0pC,GAERD,EAoBgBM,CAAiBd,EAAWK,GAK/CD,EAAS5iD,OAAO0iD,GAChBzwD,KAAKuqB,OAAOwQ,YAqBpB,SAASu2B,EAAqBjjD,EAAQrC,GAE9BqC,GA5QR,SAA6BA,EAAQrC,GAEjC,GAAIqC,EAAQ,CACR,IAAMkjD,EAAkBvlD,EAAkB5F,KAAK,kDACzCorD,EAAgBrxD,OAAOsD,UAAU4K,OAAOmjD,gBAAiB,EACzDC,EAAoBtxD,OAAOsD,UAAU4K,OAAOojD,kBAC5CC,EAAkBvxD,OAAOsD,UAAU4K,OAAOsjD,oBAC1CC,EAAY5lD,EAAkB5I,KAAK,SACnCyuD,EAAmB7lD,EAAkB5I,KAAK,kBAC1C0uD,EAAc9lD,EAAkBnD,SAAS,qBACzCkpD,EAAkB5xD,OAAOsD,UAAUuuD,WAAa7xD,OAAOsD,UAAUuuD,UAAUjkC,QAGjFwjC,EAAgB/9C,MAAK,WACjB,IAAMk9C,EAAgBvtD,EAAEnD,MAClBiyD,EAAiBvB,EAActqD,KAAK,mBACpC8rD,EAAmBD,EAAe7rD,KAAK,iBAAiB8H,QAAQzB,KAAK,UAAY,GACjFmkD,EAAcF,EAAc7nD,SAAS,4BACvCspD,EAAc,EAElBF,EAAehlD,QAEf,IAAK,IAAImlD,EAAM,EAAGA,EAAM/jD,EAAOzK,OAAQwuD,IAAO,CAC1C,IAAIC,EAAYhkD,EAAO+jD,GACvB,GAAIN,GAba,IAaEM,EACf,MAGJ,GAAKC,EAAL,CAIA,IAAInlD,EAAMmlD,EAAUnlD,IACdc,EAAMqkD,EAAUrkD,IAChBgO,EAAQq2C,EAAUr2C,MAClBE,EAASm2C,EAAUn2C,OACnBo2C,EAAY1G,EAAM2G,aAAaX,GAC/BY,EAAgB5G,EAAM6G,iBAAiBZ,GACzCa,EAAmB,GACnBjC,OAAY,EACZkC,OAAU,EACVC,OAAa,EACbC,OAAc,EAoBlB,GAlBI3lD,EAAIR,QAAQ,UAAY,GAAKQ,EAAIR,QAAQ,MAAQ,IACjDQ,GAAOwkD,GAGC,IAARU,EACAM,EAAmB9B,EAAc,4BAA8B,sBAChD,IAARwB,IACPM,EAAmB,qBAGnBL,EAAUS,SACVJ,GAAoB,sBAEpBA,GAAoB,oBAGxBjC,EAAettD,EAAE,2BAAD,OAA4BuvD,EAAgB,oBAAYR,EAAgB,yBAAiBE,EAAG,YAExGC,EAAUS,SAENH,EADA/B,EACaztD,EAAE,2HAAD,OAGKkvD,EAAUnlD,IAAG,kEACFmlD,EAAUU,qBAAuB/kD,EAAG,wOAMrD7K,EAAE,gFAAD,OACuCkvD,EAAUW,UAAS,qCAA6BX,EAAUU,qBAAuB/kD,EAAG,4DAClHqkD,EAAUS,SAAQ,8FAI1C,CACH,IAAIG,EAAmBZ,EAAUa,UAAY,iBAAH,OAAoBp6C,mBAAmBu5C,EAAUa,WAAU,KAAM,GAG3GN,EAAiBd,GAAgBlB,EAS5B,KAT0CztD,EAAE,giBAYjD0vD,GAAiBd,GAAoBD,GAAgBlB,EAShD,GAT8DztD,EAAE,yLAAD,OAGtDhD,OAAOsD,UAAUuuD,UAAUmB,YAAW,+QAShDR,EADA/B,EACaztD,EAAE,4EAAD,OAEC+J,EAAG,sDACAskD,GAAiBa,EAAUe,UAAYf,EAAUe,UAAY,MAAQ,GAAE,mDAC1E,cAAgBplD,EAAM,WAAamkD,IAAa,qKAGxCjlD,EAAG,0DACJA,EAAI+I,MAAM,KAAK,GAAKw7C,EAAiB,8CACjDwB,EAAgB,oDACTj3C,EAAK,sDACJE,EAAM,+EACmBs1C,EAAgB,WAAe,UAAW,iEAIxEruD,EAAE,gGAAD,OAEJmvD,EAAS,6CACTE,EAAa,yKAGAtlD,EAAG,8DACAskD,GAAiBa,EAAUe,UAAYf,EAAUe,UAAY,MAAQ,GAAE,2DAC1EplD,EAAM,WAAamkD,IAAa,6LAGxBjlD,EAAG,kEACJA,EAAI+I,MAAM,KAAK,GAAKw7C,EAAiB,sDACjDwB,EAAgB,4DACTj3C,EAAK,8DACJE,EAAM,uFACmBs1C,EAAgB,WAAe,UAAW,qJAQrGmB,EAAW5kD,OAAO6kD,GAClBD,EAAW5kD,OAAO8kD,GAClBpC,EAAa1iD,OAAO4kD,GACpBlC,EAAaxiD,SAASgkD,IAG1BjyD,KAAKuqB,OAAOwQ,SACZ/6B,KAAKuqB,OAAOqK,QAAQ,MAGxBzxB,EAAE,QAAQU,QAAQ,oCA+GlBwvD,CAAoBhlD,EAAQrC,GAEhC,IAhBkBukD,EAAWC,EAgBzB8C,EAAUnzD,OAAOozD,wBAA0BpzD,OAAOozD,wBAA0B,OAChF,GAAIpzD,OAAOqzD,kBAAmB,CAC1B,IAAIC,EAAmBtzD,OAAOqzD,kBAC1BE,EAAY,CACZxC,UAAWuC,EAAiBvC,UAC5BD,QAASwC,EAAiBxC,QAC1BE,sBAAuBsC,EAAiBtC,sBACxCC,6BAA8BkC,GAvBT9C,EAyBD,SAzBVD,EAyBDmD,IAvBbpD,EAAmBC,EAAWC,GA2BlCrtD,EAAE0H,UAAUhH,QAAQ,uBAgBxB,SAASkI,EAAsBtF,EAAUuF,EAAmB2nD,GACxD,IAEIC,EAFE1nD,EAA0BF,EAAkBG,QAAQ,gCAAgCvI,OAAS,EAC7FiwD,EAAgB1wD,EAAE,kBAexB,GAZIsD,EAAS2F,QAAQC,sBACjBoB,EAAYhH,EAAS2F,QAASJ,GAC9B4nD,EAA6C,YAAjCntD,EAAS2F,QAAQsB,YACzBxB,GAA2B0nD,IAC3B5nD,EAAkBpD,OAAO,uBACpBxF,KAAK,MAAOqD,EAAS2F,QAAQhH,IAElC4G,EAAkBpD,OAAO,uBACpBxF,KAAK,iBAAkBqD,EAAS2F,QAAQuB,gBAIzB,UAAxBgmD,IAAoCxzD,OAAOsD,UAAUqwD,wBAAyB,CAC9E,IAAMC,EAAettD,EAAS2F,QAAQiC,OAAOC,MAGzCnL,EAAE,oBAAoBS,OACtB0tD,EAAqByC,EAAc5wD,EAAE,uBAC9BumD,EAAgB9lD,QACvB0tD,EAAqByC,EAAc5wD,EAAE,oBAIzC6sD,MAIC7sD,EAAE,sBAAsBS,QAAkC,cAAxB+vD,GAAuCltD,EAASutD,YACnF/4C,QAAQC,aAAa,CAAE+4C,YAAaN,GAAuB,GAAIltD,EAASutD,YAIxEvtD,EAASytD,iBACT/wD,EAAE,qBAAqBoL,YAAY9H,EAASytD,iBAI3ChoD,KACsB/I,EAAE,iBAAkB6I,GAAmBpI,OACxDT,EAAE,iBAAkB6I,GACpB7I,EAAE,mBACOoL,YAAY9H,EAAS2F,QAAQoC,MAAM5J,OAIjD6B,EAAS2F,QAAQ+nD,kBAEXN,EAAcjwD,QACrBiwD,EAAcjvD,KAAK6B,EAAS2F,QAAQ+nD,kBAAkBvvD,MAFtDivD,EAAc5mD,QAMlB9J,EAAE,eAAeyB,KAjarB,SAAiCwvD,GAC7B,IAAKA,EACD,MAAO,GAGX,IAAIxvD,EAAO,GAcX,OAZAwvD,EAAWtqD,SAAQ,SAAUuqD,GAGpBA,EAAUC,aACXD,EAAUE,2BAA2BzqD,SAAQ,SAAU0qD,GACzB,QAAtBA,EAAYx1D,OAAmBq1D,EAAUI,aACzC7vD,GAAQ,+BAAJ,OAAmCyvD,EAAUK,QAAO,aAAKL,EAAUI,WAAU,iBAM1F7vD,EA8Ye+vD,CAAwBluD,EAAS2F,QAAQgoD,aAC/DjxD,EAAE,eAAemkB,QAtYrB,SAA0C+sC,GACtC,IAAKA,IAAcA,EAAUE,2BACzB,MAAO,GAGX,IAAI3vD,EAAO,GAmBX,OAfAyvD,EAAUE,2BAA2BzqD,SAAQ,SAAU0qD,GACnD,GAA0B,QAAtBA,EAAYx1D,OAAmBq1D,EAAUI,WAAY,CACrD,IAAMG,EAAiBP,EAAUQ,iBAAmB,qBAAuB,GAEvER,EAAUS,mBACVlwD,GAAQ,gDAAJ,OACyBgwD,EAAc,iDAAyCP,EAAUK,QAAO,uCAC3FL,EAAUI,WAAU,mCAG9B7vD,GAAQ,uBAAJ,OAA2BgwD,EAAc,oBAAYP,EAAUK,QAAO,aAAKL,EAAUI,WAAU,cAKxG7vD,EA8WkBmwD,CAAiCtuD,EAAS2F,QAAQ4oD,qBAEvE9oD,GACsBF,EAAkB5F,KAAK,yBAC/BvC,QAAQ,kCAAmC,CACrDuI,QAAS3F,EAAS2F,QAASJ,kBAAmBA,IAIlD7I,EAAE,oFAAoFU,QAAQ,0BAA2B,CACrHuI,QAAS3F,EAAS2F,QAASJ,kBAAmBA,IAC/CnI,QAAQ,uBAAwB4C,EAAS2F,UAliBpD,SAA4B3F,EAAUuF,EAAmB2nD,GACrD,IAAIjlD,EAAoB,GACpBC,EAAuBlI,EAAS2F,QAAQwC,aAAavK,SAErD4wD,EAAcxuD,EAAS2F,QAAQwC,aAAasmD,QAC5CC,EAAgB,GAChBC,EAAmB3uD,EAAS2F,QAAQipD,gBAAgBhxD,UAGnD4wD,GAAexuD,EAAS2F,QAAQuB,cAAgBlH,EAAS2F,QAAQoC,MAAM8mD,OAAS7uD,EAAS2F,QAAQoC,MAAM8mD,MAAMt2D,OAAS2P,EAAqB/K,SAC5I8K,GAAqB,2DACrBC,EAAqB7E,SAAQ,SAAUhF,GACnC4J,GAAqB,wBAA0B5J,EAAQG,QAAU,YAErEyJ,GAAqB,UAIzBvL,EAAE,wBAAwBozC,OAC1BpzC,EAAE,6BAA6BozC,OAE3B6e,EAAiBxxD,QACjBuxD,GAAiB,wCACjBC,EAAiBtrD,SAAQ,SAAUhF,GAC/BqwD,GAAiBhyD,EAAE,SAAU,CACzBoyD,MAAOzwD,EAAQ0wD,SAAW1wD,EAAQ0wD,SAAW,GAC7C5vD,KAAMd,EAAQc,OACf,GAAG6vD,aAEVN,GAAiB,SAEjBhyD,EAAE,kBAAkBqoD,OAAOpoD,KAAK,MAAO,YAAYA,KAAK,MAAOqD,EAAS2F,QAAQhH,MAGhFjC,EAAE,+BAA+BozC,OACjCpzC,EAAE,kBAAkBozC,QAIxBpzC,EAAE,iBAAiByG,YAAY,mBAE/BzG,EAAE6I,GAAmBnI,QAAQ,6BAA8B,CACvDuI,QAAS3F,EAAS2F,QAClBJ,kBAAmBA,EACnB2nD,oBAAqBA,EACrB7uD,QAAS4J,EACTC,uBACAlL,UAAWgD,EAAShD,UACpB4xD,gBAAiBF,IAqfrBrmD,CAAmBrI,EAAUuF,EAAmB2nD,GAmGpD,SAAStkD,EAAgBC,EAAkBtD,EAAmB2nD,GAC1D,GAAIrkD,EAAkB,CAClB,IAAMg9C,EAzFd,SAAmCtgD,EAAmB2nD,GAClD,IAAI+B,EAAa1pD,EAAkB5F,KAAK,kCAAkChD,KAAK,cAC3EuyD,EAAY3pD,EAAkB5F,KAAK,4BAA4BhD,KAAK,cACpEwyD,EAAiB5pD,EAAkB5F,KAAK,iCAAiChD,KAAK,cAC9EyT,EAAM,GAYV,YAXmB9U,IAAf2zD,QAA0C3zD,IAAd4zD,QAA8C5zD,IAAnB6zD,SACpC7zD,IAAf2zD,GAAoD,UAAxB/B,IAC5B98C,EAAI,mBAAqB6+C,QAEX3zD,IAAd4zD,GAAmD,SAAxBhC,IAC3B98C,EAAI,kBAAoB8+C,QAEL5zD,IAAnB6zD,GAAwD,cAAxBjC,IAChC98C,EAAI,uBAAyB++C,IAG9B/+C,EAyEiBg/C,CAA0B7pD,EAAmB2nD,GAC3DmC,EAAsC,UAAxBnC,GAAmCxwD,EAAE,mCAAqCmM,EAAmB,MAAMlM,KAAK,qBAAwB,KAEpJD,EAAE,QAAQU,QAAQ,gCAAiC,CAAEqJ,IAAKoC,EAAkBC,UAAWvD,IAE3D,UAAxB2nD,GAAmCxzD,OAAOsD,UAAUqwD,yBAA2BgC,GAC/E3yD,EAAEqM,KAAK,CACHtC,IAAK4oD,EACLrmD,OAAQ,MACRrM,KAAMkpD,EACN58C,QAAS,SAAUtM,GACf,IAAM2yD,EAA4B/pD,EAAkB5F,KAAK,mBAEzD,GAAIhD,GAAQ2yD,EAA0BnyD,OAAQ,CAC1C,IAAMoyD,EAAkBD,EAA0B3vD,KAAK,uBACjD6vD,EAAuBF,EAA0B3vD,KAAK,6BAExD4vD,EAAgBpyD,QAAUqyD,EAAqBryD,SAC/CoyD,EAAgB,GAAGzrC,OAAO4d,UAC1B8tB,EAAqB,GAAG1rC,OAAO4d,WAGnC4tB,EAA0BxnD,YAAYnL,GACtCD,EAAE0H,UAAUhH,QAAQ,6BAMpCV,EAAEqM,KAAK,CACHtC,IAAKoC,EACLG,OAAQ,MACRrM,KAAMkpD,EACN58C,QAAS,SAAUtM,GACXA,IACA2I,EAAsB3I,EAAM4I,EAAmB2nD,GAC3CxzD,OAAO+1D,8BAAgC,aAAc9yD,GAAQ,gBAAiBjD,OAE1EiD,EAAK+yD,SAASC,MAAQj2D,OAAOgJ,YAAYitD,OACzCj2D,OAAOgJ,YAAYitD,KAAKhqD,QAAUhJ,EAAK+yD,SAASC,KAAKhqD,SAElD,aAAchJ,GAAQ,gBAAiBjD,SAC1CiD,EAAK+yD,SAASC,OACdj2D,OAAOgJ,YAAYitD,KAAOhzD,EAAK+yD,SAASC,MAExChzD,EAAK+yD,SAASE,OACdl2D,OAAOgJ,YAAYktD,KAAOjzD,EAAK+yD,SAASE,MAExCjzD,EAAK+yD,SAAS/sD,OACdjJ,OAAOgJ,YAAYC,KAAOhG,EAAK+yD,SAAS/sD,OAIhDjG,EAAE,QAAQU,QAAQ,+BAAgC,CAAET,KAAMA,EAAMmM,UAAWvD,IAI3EnB,SAASyF,KAAKkV,cAAc,IAAIxE,YAAY,mCAAoC,CAC5EoE,OAAQ,CAEJkxC,cAAe3C,MAIvBhG,EAAuB3hD,GACvB2/C,EAAQpB,4BA7F5B,SAAqCnnD,GACjC,IAAImzD,EAAgCpzD,EAAE,qBAEtC,GAAIC,EAAKgJ,SAAWhJ,EAAKgJ,QAAQoqD,kBAC7B,IAAKD,EAA8B3yD,OAAQ,CACvC,IAAI6yD,EAAyBtzD,EAAE,uBAAuBiD,KAAK,eACvDswD,EAAiC,+CAAiDtzD,EAAKgJ,QAAQoqD,iBAAmB,QAElHC,EAAuB7yD,OACvB6yD,EAAuBE,MAAMD,GAE7BvzD,EAAE,aAAa4K,OAAO2oD,SAI9BH,EAA8BjwD,SAgFlBswD,CAA4BxzD,IAEhCD,EAAE8M,UAAUC,QAEhB5F,MAAO,WACHnH,EAAE8M,UAAUC,WAmC5B,SAASM,EAAoBpN,GACzBD,EAAE8M,UAAUS,QACZvN,EAAE,4BAA4BmD,SAE9B,IAAMmK,EAAWrN,EAAKuN,qBAAuBvN,EAAKwN,yBAA2BxN,EAAKyN,yBAC5EC,EAAa24C,EAAMzvC,kBAAkB,GAAI,CAC3CO,QAAS,0BACT1V,MAAOzB,EAAKgO,OAAOC,YACnBiJ,cAAe,gCAEnBnX,EAAE,QAAQ4K,OAAO+C,GACjB3N,EAAE,0CAA0CC,KAAK,CAC7C,YAAaA,EAAK2N,cAClB8lD,KAAMzzD,EAAK4N,KACXC,QAAS7N,EAAK6N,QACdC,aAAc9N,EAAK8N,aACnB4lD,UAAW,EACX3lD,SAAU/N,EAAK+N,SACf4lD,QAAS3zD,EAAKwN,yBACdD,qBAAsBvN,EAAKuN,uBAG/BxN,EAAEqM,KAAK,CACHtC,IAAKuD,EACLhB,OAAQ,MACR6B,SAAU,OACV5B,QAAS,SAAU9K,GACf,IAAI2M,EAzChB,SAAmB3M,GACf,IAAIwL,EAAQjN,EAAE,SAAS4K,OAAO5K,EAAEkN,UAAUzL,IAK1C,MAAO,CAAE0L,KAHEF,EAAMhK,KAAK,4BAGDmK,OAFRH,EAAMhK,KAAK,iBAAiB4D,YAqChBmG,CAAUvL,GAC3BzB,EAAE,wCAAwCyB,KAAK2M,EAAWjB,MAC1DnN,EAAE,0CAA0CyB,KAAK2M,EAAWhB,QAC5DpN,EAAE,4BAA4BwO,MAAM,QACpCxO,EAAE8M,UAAUC,QAEhB5F,MAAO,WACHnH,EAAE8M,UAAUC,UAgFxB,SAAS0B,EAAW5F,GAChB,IAAIjL,EAAUiL,EACT5F,KAAK,mBACL0J,KAAI,WACD,IAAI+B,EAAY1O,EAAEnD,MAAMoG,KAAK,mBACzB0L,EAAWD,EAAUhG,MACrBkG,EAAkBF,EAAUzL,KAAK,iBAAmB0L,EAAW,MAC9D1O,KAAK,YACV,MAAO,CACH4O,SAAU7O,EAAEnD,MAAMoD,KAAK,aACvB2O,gBAAiBA,MAEtBE,UAEP,OAAOC,KAAKC,UAAUpR,GAS1B,SAASi2D,EAAqBC,GAC1B,IAAIC,EAEEC,EAAuB,mEAGzBD,EADAD,EACoBA,EAAiBxsD,QAJZ,uBAI0CrE,KAAK+wD,GAEpDh0D,EAAEg0D,GAG1B,IAAIC,GAAwB,EAQ5B,OAPAF,EAAkB1jD,MAAK,WACErQ,EAAEnD,MACHoG,KAAK,aAAaxC,SAClCwzD,GAAwB,MAIzBA,EAQX,SAASC,EAAe7rD,EAAK8rD,GACzB,IAAIC,EAAgBp0D,EAAEhD,QAAQ6b,QAG1Bw7C,EAFehsD,EAAIN,SAASwN,KACblN,EAAIoa,aAC4B,EAC/C6xC,EAAiBH,EAAO1xC,aAAe,EAEvCjN,EAAQ8+C,EAAkBF,EAAgBC,EAE9CF,EAHWE,GAAiBC,EAGd,WAAa,eAAe,cAC1CH,EAAO3+C,EAAQ,WAAa,eAAe,eAQ/C,SAAS++C,EAAoBC,EAAa3zC,GAEtC,IAAIszC,EAASK,EAAYvxD,KAAK,8BAE9B,GAAIkxD,EAAO1zD,OAAQ,CACf,IAAIg0D,EAAaD,EAEC,cAAd3zC,GAEAqzC,EAAeM,EAAaL,GAC5BA,EAAO1tD,YAAY,aACnB1H,YAAW,WACPiB,EAAEy0D,GAAYxxD,KAAK,8BAA8BiE,SAAS,eAC3D,MACI8qB,EAAY81B,WAED,UAAdjnC,IACAqzC,EAAeM,EAAaL,GAC5BA,EAAO1tD,YAAY,aACnBzG,EAAE0H,UAAUgtD,IAAI,SAAS,WACrB10D,EAAEy0D,GAAYxxD,KAAK,8BAA8BiE,SAAS,iBAKhD,eAAd2Z,GACAqzC,EAAeM,EAAaL,GAC5BA,EAAO1tD,YAAY,cACE,eAAdoa,IACPqzC,EAAeM,EAAaL,GAC5BA,EAAOjtD,SAAS,eAuDhC,SAASytD,IACL,GAAI30D,EAAE,4CAA4C6jB,GAAG,GAAGxc,KAAK,YAAa,CACtE,IAAIutD,EAAc50D,EAAE,2BAChB60D,EAAe70D,EAAE,sBAEjB40D,EAAYn0D,QACZT,EAAE,+BAA+B0C,YAAY,WAAYkyD,EAAY3xD,KAAK,cAAcxC,QAGxFo0D,EAAap0D,QACbT,EAAE,0BAA0B0C,YAAY,WAAYmyD,EAAa5xD,KAAK,cAAcxC,QAxChG,WACI,IAAIoI,EAAoB7I,EAAEnD,MAAMyK,QAAQ,mBAIpCS,EAAS/H,EAAE,eAAe6iB,cAC9B7iB,EAAE,wBAAwBqoB,SAAStgB,EAAQ,KAG3C,IAAI+sD,EAAsBjsD,EAAkB5F,KAAK,gCACtB6xD,EAAoBr0D,QAE3CT,EAAE,yBAA0B6I,GAAmBpC,YAAY,UAI3DquD,EAAoB7xD,KAAK,8BAA8BxC,OAEvDT,EAAE,QAAQU,QAAQ,8BAA+Bo0D,IAGjD90D,EAAE,qCAAsC6I,GAAmBw/C,OAC3DroD,EAAE,qCAAsC6I,GAAmBw/C,QAE/DroD,EAAE,cAAcU,QAAQ,oBAmBpBq0D,IAQR,SAASC,EAA2BC,GAChC,IAAIC,OASkBt2D,KALlBs2D,EADa,UAFAD,EAAQ3tD,QAAQ,iBAAiBrH,KAAK,QAGnCg1D,EAAQhyD,KAAK,gBAAgBqG,KAAK,SAElC2rD,EAAQh1D,KAAK,gBAI7Bg1D,EAAQ3tD,QAAQ,iBAAiBrE,KAAK,wBAAwBR,KAAKyyD,GAI3Ev6D,EAAOD,QAAU,CACby6D,oBAAqB,WACjBn1D,EAAE0H,UAAUC,GAAG,QAAS,oBAAoB,SAAU5K,GAClD,IAAMq4D,EAAQp1D,EAAEjD,EAAEif,QAAQ1U,QAAQ,sBAAsBrH,KAAK,OAEzDm1D,IACAp1D,EAAE0H,UAAUC,GAAG,iCAAkC,oBAAoB,WACjE9B,eAAewvD,QAAQ,YAAaD,MAGxCp1D,EAAE0H,UAAUC,GAAG,kBAAmB,iCAAiC,WAC/D9B,eAAewvD,QAAQ,YAAaD,MAKxCp1D,EAAE0H,UAAUC,GAAG,eAAe,WAC1B3H,EAAE0H,UAAUia,IAAI,cAChB9b,eAAeyvD,WAAW,iBAIlCt1D,EAAE0H,UAAUhH,QAAQ,0BAG5BmzD,qBAAsBA,EACtB3nD,gBAAiBA,EACjBs+C,uBAAwBA,EACxBt7C,QAAS,CACLC,kBAAmB,SAAUlP,GACzBoN,EAAoBpN,KAG5B8P,gBAAiB,WACb/P,EAAE,mBAAmBiD,KAAK,4BAA4BoN,MAAK,WACvD2kD,EAA2Bh1D,EAAEnD,UAIjC6K,SAASyF,KAAK8H,iBAAiB,mBAAmB,SAAUlY,GACxD,IAAMk4D,EAAUj1D,EAAEjD,EAAEklB,QAEhBgzC,GAKA/oD,EAJY+oD,EAAQh1D,KAAK,YACNg1D,EAAQ3tD,QAAQ,mBAClB2tD,EAAQ3tD,QAAQ,iBAAiBrH,KAAK,YAM/DD,EAAE0H,UAAUC,GAAG,iBAAkB,8BAA8B,SAAU5K,GACrEA,EAAE8K,iBACF,IAAM0tD,EAAiBv1D,EAAEjD,EAAEiT,eAE3B,KAAIulD,EAAeryD,IAAI,uBAAuBwC,SAAS,aAAe6vD,EAAe7vD,SAAS,YAAc6vD,EAAe7vD,SAAS,kBAApI,CAIA6vD,EAAe5zC,IAAI,cACnB4zC,EAAe70D,QAAQ,mBAEvBs0D,EAA2BO,GAE3B,IAAI1sD,EAAoB0sD,EAAejuD,QAAQ,aAC1CuB,EAAkBpI,SACnBoI,EAAoB0sD,EAAejuD,QAAQ,oBAG/C,IAAMkpD,EAAsBxwD,EAAEnD,MAAMyK,QAAQ,iBAAiBrH,KAAK,QAE9Du1D,EAAmBD,EAAet1D,KAAK,YACf,SAAxBuwD,IACAgF,EAniBhB,SAA+BC,GAC3B,IAAIC,EAAOD,EACPE,EAAqB31D,EAAE,mBAAmBiD,KAAK,mDACnD,GAAI0yD,EAAmBl1D,OAAS,EAC5B,GAAkC,IAA9Bk1D,EAAmBl1D,QAAgBk1D,EAAmBjwD,SAAS,YAC/DgwD,EAAOA,EAAO,UAAY11D,EAAE,mBAAmBC,KAAK,OAAS,cAAgB01D,EAAmB11D,KAAK,mBAClG,GAAI01D,EAAmBl1D,OAAS,EAAG,CACtC,IAAIm1D,EAAgB51D,EAAE,mBAAmBiD,KAAK,8DAC9C,GAA6B,IAAzB2yD,EAAcn1D,QAAgBm1D,EAAclwD,SAAS,YACrDgwD,EAAOA,EAAO,UAAY11D,EAAE,mBAAmBC,KAAK,OAAS,cAAgB21D,EAAc31D,KAAK,mBAEhG21D,EAAgB51D,EAAE,mBAAmBiD,KAAK,gEAE9B,IADF0yD,EAAmBl1D,OAASm1D,EAAcn1D,QAGnB,KAD7Bm1D,EAAgB51D,EAAE,mBAAmBiD,KAAK,6DACxBxC,SACdi1D,EAAOA,EAAO,UAAY11D,EAAE,mBAAmBC,KAAK,OAAS,cAAgB21D,EAAc31D,KAAK,eAMpH,OAAOy1D,EA6gBwBG,CAAsBL,IAG7CtpD,EAAgBspD,EAAkB3sD,EAAmB2nD,OAIzDxwD,EAAE0H,UAAUia,IAAI,cAAcha,GAAG,aAAc,8BAA8B,SAAU5K,GACnF,GAAIi1B,EAAY61B,YAAa,CACzB,IAAMiO,EAAiB91D,EAAEjD,EAAEiT,eAG3B,GAAI8lD,EAAepwD,SAAS,YAAa,OAEzC,IAAMqwD,EAAmBD,EAAexuD,QAAQ,iBAAiBrE,KAAK,wBAAwBR,OAE9FuyD,EAA2Bc,GAE3BA,EAAepB,IAAI,cAAc,WAC7BoB,EAAexuD,QAAQ,iBAAiBrE,KAAK,wBAAwBR,KAAKszD,UAMtF/1D,EAAE0H,UAAUC,GAAG,8BAA+B,mGAAmG,SAAU5K,GACvJw3D,EAAoBv0D,EAAEnD,MAAOE,EAAE4X,SAGnC3U,EAAE,QAAQ2H,GAAG,+BAA+B,SAAU5K,EAAGi5D,GACrDzB,EAAoBv0D,EAAEg2D,GAAa,iBAG3CC,6BAA8B,WAE1Bj2D,EAAE,6DAA6DqQ,MAAK,WAChE2kD,EAA2Bh1D,EAAEnD,WAGrC4O,aAAc,WAKVzL,EAAE0H,UAAUC,GAAG,SAAU,oBAAoB,SAAU5K,GACnDA,EAAE8K,iBAEF,IAAIquD,EAAYl2D,EAAEnD,MAAMyK,QAAQ,mBAAmBgC,KAAK,YAGxD,IAAItJ,EAFiB,6BAA+Bk2D,EAAY,KAEzC,mCAAmCv6C,GAAG,YAA7D,CAIA,IAAI9S,EAAoB7I,EAAEnD,MAAMyK,QAAQ,mBACnCuB,EAAkBpI,SACnBoI,EAAoB7I,EAAEnD,MAAMyK,QAAQ,kBAAkBrE,KAAK,uBAGV,IAAjDjD,EAAE,gBAAiB6I,GAAmBpI,QACtCsrB,EAAK7f,gBAAgBlM,EAAEjD,EAAEiT,eAAe/M,KAAK,mBAAmBhD,KAAK,OAAQ4I,QAKzFoH,UAAW,WACPjQ,EAAE0H,UAAUia,IAAI,QAAS,iDAAiDha,GAAG,QAAS,iDAAiD,WACnI,IAAIoG,EACAmC,EACAC,EACAC,EA7VRI,EAgWI,GAAKqjD,EAFkB7zD,EAAEnD,OAMlB,CACHmD,EAAE,QAAQU,QAAQ,0BAA2B7D,MAEzCmD,EAAE,cAAcS,QAAUT,EAAEnD,MAAM6I,SAAS,wBAC3C0K,EAAU,GAEVpQ,EAAE,mBAAmBqQ,MAAK,WACjBrQ,EAAEnD,MAAM6I,SAAS,uBAClB0K,EAAQE,KAAK,CACTJ,IAAKlQ,EAAEnD,MAAMoG,KAAK,eAAehD,KAAK,OACtCsQ,IAAK,EACL3S,QAAS6Q,EAAWzO,EAAEnD,YAIlCsT,EAAUpB,KAAKC,UAAUoB,IAG7BF,EAAM9H,EAAYpI,EAAEnD,OAEpB,IAAIgM,EAAoB7I,EAAEnD,MAAMyK,QAAQ,mBACnCuB,EAAkBpI,SACnBoI,EAAoB7I,EAAEnD,MAAMyK,QAAQ,sBAAsBrE,KAAK,oBAGnE8K,EArfL/N,EAAE,oBAAoB0I,MAufjB,IAAI+H,EAAO,CACPP,IAAKA,EACLC,QAASA,EACTK,eAlYZA,EAAgB,GACpBxQ,EAAE,gBAAgBqQ,MAAK,WACnBG,EAAcF,KAAK,CACfJ,IAAKlQ,EAAEnD,MAAMoG,KAAK,eAAehD,KAAK,OACtC2M,SAAU5L,SAAShB,EAAEnD,MAAMoG,KAAK,kBAAkBhD,KAAK,YAAa,SAIrEuQ,EAAc/P,OAASsO,KAAKC,UAAUwB,GAAiB,IA2X9C5D,SAAU,GAGT5M,EAAE,gBAAgBS,SACnBgQ,EAAK7S,QAAU6Q,EAAW5F,IAG9B7I,EAAEnD,MAAM6D,QAAQ,0BAA2B+P,GACvC1C,GACA/N,EAAEqM,KAAK,CACHtC,IAAKgE,EACLzB,OAAQ,OACRrM,KAAMwQ,EACNlE,QAAS,SAAUtM,GACfD,EAAE8M,UAAUC,OAvcxC,SAA2BzJ,GACnBA,GAAYtD,EAAEm2D,UAAU7yD,EAAS8yD,gBACjCp2D,EAAE0H,UAAUhH,QAAQ,uBAAwB4C,EAAS8yD,eAIzD,IAAIC,EAAe/yD,EAASgzD,kBACxBC,EAAWjzD,EAAS6D,MAExB,GAAIkvD,EAE6Bn5D,EAAQ,IACdmG,sBAAsBC,QAC1C,GAAIizD,EACHv2D,EAAE,oBAAoBS,QAEtBT,EAAE,gCAAgC6B,MAAM,CACpCC,QAAS,GAAF,OAAKwB,EAAS3B,SACrBK,MAAO,SACPiW,YAAa,mBACb1Q,WAAY,SACZivD,KAAM,GACNC,aAAa,QAGlB,CAEHz2D,EAAE0H,UAAUhH,QAAQ,iBAEpB,IAAIg2D,EAAsB33D,YAAW,WACjCiB,EAAE0H,UAAUhH,QAAQ,mBACrB,KAEHV,EAAE,QAAQ00D,IAAI,aAAc,oBAAoB,WAC5Cj1D,aAAai3D,MAIjB,eAAgB15D,QAAU,aAAcsG,GAClCA,EAASqzD,UAAYrzD,EAASqzD,SAASl2D,QACzC6C,EAASqzD,SAAShwD,SAAQ,SAACiwD,GACvBC,WAAWC,MAAMF,EAAOnnD,MAAOmnD,EAAO32D,SA+Z1B2Q,CAAkB3Q,GACbA,EAAKkH,QACNnH,EAAE,QAAQU,QAAQ,yBAA0BT,GAC5CjD,OAAOqlB,cAAc,IAAI00C,MAAM,sBAE/B/5D,OAAO+1D,8BAEP/1D,OAAO+1D,6BAA+BhkD,KAAKyE,MAAMxW,OAAO+1D,8BACxDh0D,YAAW,YA7R3C,SAAoBkB,GAChB,GAAMA,GAAQ,gBAAiBjD,OAAQ,CACb,CAAC,iBAAkB,OAAQ,QACnC2J,SAAQ,SAACU,GACfpH,EAAKoH,KACLrK,OAAOgJ,YAAYqB,GAAQpH,EAAKoH,cAGjCrK,OAAO+1D,8BAsRciE,CAAWh6D,OAAO+1D,gCACnB,MACI9yD,EAAK+yD,UAAY,gBAAiBh2D,SACrCiD,EAAK+yD,SAASC,OACdj2D,OAAOgJ,YAAYitD,KAAOhzD,EAAK+yD,SAASC,MAExChzD,EAAK+yD,SAASE,OACdl2D,OAAOgJ,YAAYktD,KAAOjzD,EAAK+yD,SAASE,OAG5CjzD,EAAK+yD,UAAY/yD,EAAK+yD,SAAS/sD,MAAQ,gBAAiBjJ,SACxDA,OAAOgJ,YAAYC,KAAOhG,EAAK+yD,SAAS/sD,KACxC0iD,EAA2BrjD,qBAGnC6B,MAAO,WACHnH,EAAE8M,UAAUC,eA1ExB/M,EAAE,oFAAoFsJ,KAAK,YAAY,GACvGqrD,IACA30D,EAAE8M,UAAUC,WA+ExB3E,YAAaA,EACbykD,yBAA0BA,EAC1BoK,iBAxrCJ,WACI,IAAMC,EAAmBl3D,EAAE,gCAI3B,GAHek3D,EAAiBz2D,QACjBT,EAAE,gCAAgCS,SAAWT,EAAE,mBAAmBS,QAEnET,EAAE,6BAA6B2b,GAAG,UAAW,CACvD,IAAM60C,EAAsB0G,EAAiB5vD,QAAQ,iBAAiBrH,KAAK,QACrEiyD,EAAkBlyD,EAAE,0BAA0ByC,OAC9CyN,EAAMlQ,EAAE,mBAAmBC,KAAK,OAClC4I,EAAoBquD,EAAiB5vD,QAAQ,aAE5CuB,EAAkBpI,SACnBoI,EAAoBquD,EAAiB5vD,QAAQ,oBAGjDtH,EAAEhD,QAAQ0D,QAAQ,0BAA2B,CAAEy2D,UAAU,IAEzDn3D,EAAE6I,GAAmBnI,QAAQ,6BAA8B,CACvDuI,QAAS,CACLhH,GAAIiO,EACJknD,UAAU,GAEdvuD,kBAAmBA,EACnB2nD,oBAAqBA,EACrB0B,gBAAiBA,MAiqCzBmF,aAAc3O,EAAS1lD,S,+BCz3Dd,qOAEbrI,EAAOD,QAAU,SAAU48D,GACA,mBAAZA,EACPA,IAC0B,WAAnB,EAAOA,IACdh8D,OAAO+F,KAAKi2D,GAAS3wD,SAAQ,SAAUxK,GACP,mBAAjBm7D,EAAQn7D,IACfm7D,EAAQn7D,U,gCCNxB,IAKIo7D,EACAC,EAGAC,EACAC,EAGAC,EAbE/0B,EAAS1lC,EAAQ,IACjB80B,EAAc90B,EAAQ,GACtBopD,EAAQppD,EAAQ,GAChBsrD,EAAUtrD,EAAQ,IA0IxB,SAAS06D,IACL,IAAMC,EAAcN,EAAat0D,KAAK,oBAGtC,GAAK40D,EAAYp3D,OAAjB,CAEA,IAAMq3D,EAAaD,EAAY53D,KAAK,QAC9B83D,EAAUF,EAAY53D,KAAK,YAC3B+3D,EAA0B,YAAfF,EAA2B,YAAcC,EAAU,eAAiBA,EAGrF,GAAmB,YAAfD,EAA0B,CAC1B,IAAMG,EAAQ,qBAEd,IADkBvwD,SAAS8U,eAAey7C,GAC1B,CACZ,IAAM7yD,EAAMsC,SAASgN,cAAc,UACnCtP,EAAImP,IAAM,qCACVnP,EAAInD,GAAKg2D,EACT,IAAMC,EAAiBxwD,SAASkN,qBAAqB,UAAU,GAC/DsjD,EAAerzC,WAAWT,aAAahf,EAAK8yD,IAKpD,IAAMC,EAAsB,IAAIjwB,kBAAiB,YAC7CyvB,EAAS36D,OAAOo7D,aAAaJ,KAEzBG,EAAoBxvB,gBAG5BwvB,EAAoBrwB,QAAQ+vB,EAAY,GAAI,CAAEvvB,WAAW,EAAM+vB,SAAS,IAGxEZ,EAAW9vD,GAAG,eAAe,WACrBgwD,IACmB,YAAfG,EACAH,EAAOW,aAEPX,EAAOpY,aASvB,SAASgZ,IACLhB,EACK51C,IAAI,SAEJha,GAAG,iBAAkB,wBAAwB,WACtC8vD,EAAW9pC,iBACX8pC,EAAW9pC,gBAAiB,EAE5B5uB,YAAW,WACP04D,EAAW9pC,gBAAiB,IAC7B,SAIVhmB,GAAG,aAAc,wBAAwB,WACtC,GAAIqqB,EAAY81B,WACZ2P,EAAW3iB,KAAKz0B,aACb,CACH,IAAMm4C,EAAgBx4D,EAAEnD,MAAMyK,QAAQ,qBAClCyC,EAAMyuD,EAAclxD,QAAQ,uBAAuBrH,KAAK,YAGtDw4D,EAAuBz4D,EAAE,6CAC/B,GAAIy4D,EAAqBh4D,QAAUsJ,EAAK,CACpC,IAAMmG,EAAMlQ,EAAE,mBAAmBC,KAAK,OAAOiF,WACvCkkD,EAAQqP,EAAqBx4D,KAAK,cAMxC,GAHIiQ,IAFWo2C,EAAM1wC,iBAAiB7L,GAAKmG,MAGvCnG,EAAMu8C,EAAMpwC,eAAenM,EAAK,MAAOmG,IAEvCk5C,GAASl5C,EAAK,CAEd,IAAMwoD,EAAUxoD,EAAI4C,MAAM,KAAK,GAC/B/I,EAAMu8C,EAAM5wC,iBAAiB3L,EAAK,SAAW2uD,EAAU,SAAUtP,IAIzE,IAAKr/C,EAAO,OAEZ/J,EAAE8M,UAAUS,QACZvN,EAAEqM,KAAK,CACHtC,IAAKA,EACLuC,OAAQ,MACR6B,SAAU,OACV5B,QAAS,SAAU9K,GACfzB,EAAE8M,UAAUC,OAEZ,IAAM4rD,EAAYrS,EAAMzvC,kBAAkBpV,EAAM,CAAEwV,eAAgB,gBAC9D2hD,EAAa54D,EAAE24D,GAAWnqD,QAE1BqqD,EAAmB,EACnBL,EAAcv4D,KAAK,WACnB44D,EAAmBL,EAAcv4D,KAAK,UAI1C,IAAMipB,EAAKlsB,OAAOwgB,UAAUC,WACxByL,EAAG3f,QAAQ,UAAY,GAAK2f,EAAG3f,QAAQ,aAAe,IACtDqvD,EAAWlE,IAAI,kBAAkB,WAC7B,IAAMoE,EAAaF,EAAW31D,KAAK,eAC7B81D,EAAmBD,EAAW71D,KAAK,2BAA2B4f,cAC9Dm2C,EAAmBp2C,WAAWk2C,EAAW11C,IAAI,gBAAkBR,WAAWk2C,EAAW11C,IAAI,mBAC/F01C,EAAW11C,IAAI,SAAU21C,EAAmBC,MArL5E,SAAkBJ,EAAYK,GAC1B,IAAMC,EAAcN,EAAW31D,KAAK,2BAC9Bk2D,EAAUD,EAAYj2D,KAAK,OAGjC21D,EACKjxD,GAAG,QAAS,qBAAqB,SAAU5K,GACxCA,EAAE8K,iBACF,IAAMuxD,EAAQp5D,EAAEnD,MACVw8D,EAAaD,EAAMn5D,KAAK,cAK1B4K,EAAMuuD,EAAMn2D,KAAK,OAAOqG,KAAK,OAE7BuB,EAAIuI,UANsB,qBAO1BvI,EAAMA,EAAIjG,QAPgB,kBACL,UASzBg0D,EAAW31D,KAAK,qBAAqBwD,YAAY,UACjD2yD,EAAMlyD,SAAS,UACfiyD,EAAQ7vD,KAAK,MAAO+vD,GACpBF,EAAQ7vD,KAAK,MAAOuB,MAGvBlD,GAAG,YAAa,2BAA2B,SAAU5K,GAClD,IAQIu8D,EACAC,EATEC,EAAcN,EAAYz2C,aAC1Bg3C,EAAeP,EAAYr2C,cAC3B62C,EAAWF,EAAcL,EAAQ12C,aACjCk3C,EAAYF,EAAeN,EAAQt2C,cACnC+2C,EAAeV,EAAYnxD,SAQ7BuxD,EAFAI,EAAW,EAEJA,IADH38D,EAAEwvB,MAAQqtC,EAAarkD,MACHikD,EAAe,IAEhC,EAIPD,EAFAI,EAAY,EAELA,IADH58D,EAAE0vB,MAAQmtC,EAAa1xD,KACFuxD,EAAgB,IAElC,EAEXN,EAAQ/1C,IAAI,YAAa,eAAF,OAAiBk2C,EAAI,eAAOC,EAAI,cAE1D5xD,GAAG,iBAAiB,WAEjB,IAAM2iB,EAAcsuC,EAAW31D,KAAK,4BAA4BhD,KAAK,SACrEw3D,EAAWhmC,QAAQnH,MAEtB3iB,GAAG,mBAAmB,WAEnB3H,EAAEnD,MAAMsG,YAIhB,IAAM02D,EAAejB,EAAW31D,KAAK,iCAAmCg2D,EAAY,MAChFY,EAAap5D,QACbo5D,EAAan5D,QAAQ,SAyHLo5D,CAASlB,EAAYC,IAEzB1xD,MAAO,WACHnH,EAAE8M,UAAUC,cAOhC0qD,EAAW9vD,GAAG,cAAc,SAAUyf,EAAQirB,EAAOrQ,GAEjD,IAAI+3B,EAAc/5D,EAAEgiC,GAAS/hC,KAAK,UACpB,IAAVoyC,IACA0nB,EAAc/5D,EAAEgiC,GAAS/hC,KAAK,UAElCD,EAAEgiC,GAAS14B,KAAK,MAAOywD,MAI3B/5D,EAAE0H,UAAUC,GAAG,uBAAuB,WAClCiwD,OAoDRj9D,EAAOD,QAAU,SAAUs/D,GACvB,IAAMC,EArCV,SAA4BC,GACxB,IAQMt8D,EAAUoC,EAAEuD,OAAO,GARH,CAClB42D,eAAe,EACfC,aAAa,EACbC,gBAAiB,sBACjBC,kBAAmB,4BACnBC,yBAA0B,mBAGcL,GAEtCD,EAAkB,GAClBO,EAAoBx6D,EAAEpC,EAAQ28D,0BAA0BxvD,QAE9D,GAAIyvD,EAAkB/5D,OAAQ,CAC1B,IAAMg6D,EAAWD,EAAkBv3D,KAAKrF,EAAQy8D,iBAAiBtvD,QAEjE,GAAI0vD,EAASh6D,SACTw5D,EAAgBQ,SAAWA,EAC3BR,EAAgBO,kBAAoBA,EACpCP,EAAgBG,cAAgBx8D,EAAQw8D,YAEpCx8D,EAAQu8D,eAAe,CACvB,IAAMO,EAAaF,EAAkBv3D,KAAKrF,EAAQ08D,mBAAmBvvD,QAEjE2vD,EAAWj6D,SACXw5D,EAAgBS,WAAaA,EAC7BT,EAAgBE,eAAgB,IAMhD,OAAOF,EAIiBU,CAAmBX,GAE3CzC,EAAe0C,EAAgBQ,SAC/BjD,EAAoByC,EAAgBS,WACpC,IAAMP,EAAgBF,EAAgBE,cAChCC,EAAcH,EAAgBG,YAEpC,OAAK7C,GAAiBA,EAAa92D,SAAU82D,EAAa,GAAGnwC,QAM7DvqB,KAAK49D,SAAWlD,EAEZ4C,IACAt9D,KAAK26D,kBAAoBA,GAG7B36D,KAAKmG,KAAO,YAxUhB,SAA2B43D,EAAOF,GAC9B,IAAMG,EAAoBD,EAAM,GAC1BE,EAAmB,CACrBvoC,gBAAgB,EAChBH,cAAe,EACf0iB,KAAM,CAAEz0B,QAAQ,GAChBuR,WAAY,CACRC,OAAQ,sBACRC,OAAQ,sBACRgd,cAAe,UAEnB9jB,MAAM,GAMV,GAAI0vC,EAAWj6D,OAAQ,CACnB,IAAMs6D,EAAqBL,EAAW,GAEtChD,EAAc,IAAI90B,EAAOm4B,EAAoB,CACzCliD,MAAO,GACPuZ,cAAe,OACfpH,MAAM,EACNuC,UAAW,MAGfutC,EAAiB/a,OAAS,CACtB34B,OAAQswC,GAIZgD,EAAWz3D,KAAK,mBAAmB+G,WAAW,aAGlDhK,EAtB6B,CACzB,mCAqBmBgH,KAAK,MAAMqJ,MAAK,SAAUzV,EAAG2+B,GAChDv5B,EAAEu5B,GAAOp2B,YAGbs0D,EAAa,IAAI70B,EAAOi4B,EAAmBC,GAG3CF,EAAM33D,KAAK,mBAAmB+G,WAAW,aA+RrCgxD,CAAkBzD,EAAcC,GAE3B4C,EAnETp6D,EAAE,wBAAwBkH,SAAS,WAoE3B0wD,IACAW,IACA/P,EAAQpB,8BAMTvqD,MAvBI,CACHmG,KAAM,gB,gCC9UlB,SAASi4D,IACDj7D,EAAE,6BAA6BS,QAC/BT,EAAE,yBAAyBkH,SAAS,+CAc5CvM,EAAOD,QAAU,CACbsI,KAAM,WAEFhD,EAAE,QAAQ2H,GAAG,gCAAgC,SAAU5K,EAAGuG,GACtD,IAVyB7B,EAUrBy5D,EAAc53D,EAASrD,KAAKgJ,QAAQkyD,YACpCD,IAXqBz5D,EAYOy5D,EAXdl7D,EAAE,yBACVyB,KAAKA,GACvBw5D,QAYIA,O,gCCqCRtgE,EAAOD,QAAU,CACb00D,aA9DJ,SAAsBX,GAClB,IAAIzwD,EAAS,GAEb,IAAMywD,IAAaA,EAAU2M,UACzB,OAAOp9D,EAGX,IAQIq9D,EAREC,EAAiB7M,EAAU2M,UAAUv/D,OAAS,KAC9C0/D,EAAmB9M,EAAU2M,UAAU9nB,SAAW,KAClDkoB,EAAwBx7D,EAAE,uCAAuCS,OACjEg7D,IAAsBhN,EAAU2M,UAAUK,kBAG1CC,EADc,CAAC,aAAc,MAAO,eACTjd,SAASgQ,EAAU2M,UAAUv/D,OAuB9D,OAnBI4yD,EAAUkN,IACV39D,EAAS,qIAAH,OAEoC,IAAMywD,EAAUkN,IAAG,gDAGtDL,GAAkBC,GAAqD,SAAjCD,EAAelhD,cAC5DihD,EAAYC,EAAelhD,cACnBqhD,IAAqBD,GAA0BE,IACvDL,EAAY,QAGZA,IACAr9D,EAAS,6EAAH,OAC4Dq9D,EAAS,+BACjEE,EAAgB,yBAIvBv9D,GA2BPsxD,iBAnBJ,SAA0Bb,GACtB,IAAIzwD,EAAS,GAEb,OAAKywD,EAILzwD,EAAS,4CAAH,OAC+BywD,EAAUmN,SAAQ,6CAC3BnN,EAAUoN,SAAQ,YAAIpN,EAAUqN,UAAS,gDACtC,IAAMrN,EAAUsN,MAAK,gDANzC/9D,K,gCClDf,SAASg+D,IACLh8D,EAAE,oCAAoCmD,SAGtCnD,EAAEi8D,eACFj8D,EAAE,QAAQyG,YAAY,cAAc2c,IAAI,gBAAiB,IACzDpjB,EAAEhD,QAAQ0D,QAAQ,UAQtB,SAASw7D,EAAWz6D,GAShB,OARezB,EAAEwO,MAAM,CACnB1M,QAASL,EACT0V,cAAe,iBACfF,eAAgB,aACjBtP,GAAG,mBAAmB,WACrBq0D,OAWR,SAASG,EAAYpyD,GACZA,GAIL/J,EAAEqM,KAAK,CACHtC,IAAKA,EACLuC,OAAQ,MACR6B,SAAU,OACV5B,QAAS,SAACtM,GACNi8D,EAAWj8D,IAEfqiC,SAAU,WACNtiC,EAAE8M,UAAUC,OACZ/M,EAAEo8D,iBAENj1D,MAAO,WACH60D,OAKZrhE,EAAOD,QAAU,CACbsI,KAAM,WACFhD,EAAE,QACG2hB,IAAI,iBAAkB,sBACtBha,GAAG,iBAAkB,sBAAsB,SAAC5K,GACzCA,EAAE8K,iBACF,IAAI8/C,EAAQ3nD,EAAEjD,EAAEiT,eAGhBmsD,EAFWxU,EAAM1nD,KAAK,SAAW0nD,EAAMr+C,KAAK,aAKxD4yD,aACAC,cACAH,e,gCCvEJ,IAAIhqC,EAAc90B,EAAQ,GACtBm/D,EAAkBn/D,EAAQ,IAK9B,SAASo/D,IACDt8D,EAAE,qDAAqD2b,GAAG,YAC1D3b,EAAE,mBAAmBkH,SAAS,UAE9BlH,EAAE,mBAAmByG,YAAY,UAmDzC,SAAS81D,EAAeC,GACpB,IAAIC,EAAiBD,EAASv6D,GAAG6Q,MAAM,KACnC4pD,EAAiBD,EAAe,GAAK,IAAMD,EAASG,QAAQC,OAC5DC,EAAeL,EAASG,QAAQG,YA3CxC,SAA+BJ,EAAgBK,EAAYC,EAAYC,GACnE,QAA8B,IAAnBP,QAAwD,IAAfK,EAApD,CAIA,IAAIG,EAAoBl9D,EAAE,mBAAqB08D,GAC3CS,EAAen9D,EAAE,OAAS+8D,GAC1BK,EAAkBp9D,EAAE,mBACpBq9D,EAAiBr9D,EAAE,kBAEnBo9D,GACAA,EAAgBl2D,SAAS,UAAUT,YAAY,kBAG/C42D,GACAA,EAAen2D,SAAS,UAAUT,YAAY,iBAGlDy2D,EAAkBz2D,YAAY,UAAUS,SAAS,kBACjDi2D,EAAa12D,YAAY,UAAUS,SAAS,iBAC5C,IAAIo2D,EAAWL,EAAS,MAAQD,EACpBh9D,EAAE,iDACRyB,KAAK67D,GAGXhB,IAGAt8D,EAAE,6BAA6BU,QAAQ,SAEvC,IAAI68D,EAAiBN,EAAOr4D,QAAQ,WAAY,IAAIwV,cAEpDpa,EAAE,sBAAwBu9D,GAAgBC,SAAS,UACnDx9D,EAAE,uBAAuBw9D,SAAS,WAalCC,CAAsBf,EAFLD,EAAe,GACfD,EAASkB,UACoCb,GA+BlE,SAASc,EAAmBC,GACF59D,EAAE,2BAEVqQ,MAAK,WACf,IAAMwtD,EAAe79D,EAAEnD,MACjBihE,EAAiBD,EAAa56D,KAAK,YAEzC46D,EAAa56D,KAAK,sBAAsBoN,MAAK,WACzC,IAAM0tD,EAAWD,EAAeh5D,MAAMjI,MAAQ,EACzBghE,EAAa56D,KAAK,sBAAwB86D,EAAW,KAE7D1tD,MAAK,WACd,IAAM2tD,EAAch+D,EAAEnD,MAChBohE,EAnCtB,SAAwBL,EAAgB/hE,GACpC,IAAImC,EAEAkgE,EAAQN,EAAkB,KAAO,MAYrC,OAXI/hE,EAAM0N,QAAQ,MAAQ,EACT1N,EAAMiX,MAAM,KAClBnM,SAAQ,SAAUoxB,GAChBD,MAAMC,KACP/5B,EAAoB,MAAVA,EAAkB4kB,YAAYiV,OAAOE,GAAQmmC,GAAMC,QAAQ,GANrE,IAMkFngE,EAAS,IAAM4kB,YAAYiV,OAAOE,GAAQmmC,GAAMC,QAAQ,GAN1I,QASArmC,MAAMj8B,KACdmC,EAAS4kB,YAAYiV,OAAOh8B,GAASqiE,GAAMC,QAAQ,GAV3C,KAaLngE,EAoB4BogE,CAAeR,EAAgBI,EAAYv7D,QAE9Dw7D,GACAD,EAAYv7D,KAAKw7D,YAWrC,SAASI,EAAkBC,GACvBA,EAAcr7D,KAAK,UAAUwD,YAAY,kEAM7C,SAAS83D,EAAuBD,GAC5B,IAAIn+C,EACJA,EAAYm+C,EAAc3iD,GAAG,MAAQ,uBAAyB,qBAC9D2iD,EAAcp3D,SAASiZ,GAgD3B,SAASq+C,IACL,IAAIC,EAAiBz+D,EAAE,iEACnBsoB,EAAWm2C,EAAex7D,KAAK,iCAAiCwf,aAAeg8C,EAAeh8C,aAClG,GAAI6F,EAAW,GAAK0J,EAAY81B,WAAY,CACxC9nD,EAAE,qBAAqBmD,SACvB,IAAIu7D,EAAoBD,EAAex7D,KAAK,oCAAoCmgB,IAAI,UAChF4V,EAAah4B,SAASy9D,EAAex7D,KAAK,oCAAoCmgB,IAAI,SAAU,IAAM,EAAI,KACtGu7C,EAAqB,mFAAH,OAAsFr2C,EAAQ,4BAAoBo2C,EAAiB,wJAErJE,EAAoB,2GAAH,OAA8GF,EAAiB,mBAAW1lC,EAAU,6IACzKylC,EAAe7zD,OAAOg0D,GACtBH,EAAe7zD,OAAO+zD,IAQ9B,SAASE,EAAqBC,GAC1B,IAAIC,EAASD,EAAW77D,KAAK,iCACzB+7D,EAAgBD,EAAOt8C,aAAeq8C,EAAWr8C,aAEjD7J,EADemmD,EAAOh3D,SACIwN,KAAO,GAEjCypD,EAAgBpmD,EAAa,GAC7B5Y,EAAE,uBAAuBkH,SAAS,UAClClH,EAAE,8CAA8CyG,YAAY,WACrDmS,EAAa,GAAKA,EAAa,IACtC5Y,EAAE,sBAAsBkH,SAAS,UACjClH,EAAE,+CAA+CyG,YAAY,WAgBrE9L,EAAOD,QAAU,CACbukE,YAAa,WACT,IAVEC,EACAC,EASIC,EAAep/D,EAAE,mBAEvBw+D,IAZEU,EAAgBl/D,EAAE,kBAClBm/D,EAAWn/D,EAAE,mBAAmBC,KAAK,aACzBi/D,EAAcj8D,KAAK,SAAWk8D,EAAW,MAGjDj4D,SAAS,WAWflH,EAAE,sBAAsB2H,GAAG,SAAS,WAChC40D,EAAe1/D,MACfmD,EAAEhD,QAAQ0D,QAAQ,aAItB0+D,EAAaz3D,GAAG,SAAS,WACrB,IACIi2D,GAAiB,EADN59D,EAAEnD,MAEJ6I,SAAS,WAClB05D,EAAal4D,SAAS,SAAST,YAAY,UAC3Cm3D,GAAiB,GAEjBwB,EAAal4D,SAAS,UAAUT,YAAY,SAGhDk3D,EAAmBC,MAGvB59D,EAAE,QAAQ2H,GAAG,QAAS,cAAc,WAChC62D,OAGJx+D,EAAE,QAAQ2H,GAAG,QAAS,sBAAsB,WACxC20D,OAGJt8D,EAAE,uBAAuB2H,GAAG,qBAAqB,WAC7C3H,EAAEhD,QAAQ0D,QAAQ,UAElBV,EAAEnD,MAAMoG,KAAK,wCAAwCoN,MAAK,SAACvL,EAAOsH,GAC9D,IAAI0yD,EAAa9+D,EAAEoM,GACnB,OAAO0yD,EAAW17C,IAAI,SAAU07C,EAAW77D,KAAK,WAAW4f,kBAE/D27C,OAGJx+D,EAAE,QAAQ2H,GAAG,QAAS,qBAAqB,WACvC,IAAI03D,EAAer/D,EAAE,mFACjBs/D,EAAuBt/D,EAAEnD,MAC7BwiE,EAAar3D,QAAQ,CAAEyR,WAAY6lD,EAAqBr/D,KAAK,aAAe,KAAK,WAC7E4+D,EAAqBQ,SAG7Br/D,EAAE,QAAQ2H,GAAG,YAAa,4DAA4D,WA3I9F,IACQ43D,EAEAC,EACAC,EACAnB,EAJAiB,EAAav/D,EA2ISnD,MAzItB2iE,EADaD,EAAWj4D,QAAQ,MACDo4D,IAAI,MAAMj/D,OACzCg/D,EAAeF,EAAWz6D,QAE9Bu5D,EADIC,EAAgBiB,EAAWj4D,QAAQ,UAEvCi4D,EAAWr4D,SAAS,0BAIhBs4D,GAAqBC,GAErBnB,EAAcr7D,KAAK,MAAMoN,MAAK,SAAUsvD,EAAUC,GAC9C,IAAIC,EAAc7/D,EAAE4/D,GAIpB,OAAKC,EAAYH,IAAI,6BAA6Bj/D,QAK9Co/D,EAAYh5D,WAAWwJ,MAAK,SAAUyvD,EAAaC,GAC/C,IAAIC,EAAgBhgE,EAAE+/D,GAClBD,EAAcL,GACdlB,EAAuByB,OAGxB,IATPzB,EADev+D,EAAE6/D,EAAY58D,KAAK,UAAUw8D,MAYzC,SA+GXz/D,EAAE,QAAQ2H,GAAG,aAAc,SAAS,WAEhC02D,EADoBr+D,EAAEnD,UAG1BmD,EAAE,qBAAqB2H,GAAG,UAAU,WAEhCk3D,EADiB7+D,EAAEnD,WAI3BojE,uBAAwB,SAAUC,EAAsBn2D,GAAK,WACrDo2D,EAAiB,SAAC1+D,GAElBy+D,EAAqBj9D,KAAK,eAAexB,KAAKA,GAG9Cy+D,EAAqBj9D,KAAK,oBAAoBm9D,iBAC9C/D,EAAgBr5D,OAChBk9D,EAAqBj9D,KAAK,gDAAgDgE,WAAWmsC,OACrF,EAAK6rB,eAITj/D,EAAEqM,KAAK,CACHtC,IAAKA,EACLuC,OAAQ,MACR6B,SAAU,OACV5B,QAAS,SAACtM,GACDigE,EAAqB,GAAGG,cAMzBF,EAAelgE,EAAKoO,kBAJpB6xD,EAAqBv4D,GAAG,kBAAkB,WACtCw4D,EAAelgE,EAAKoO,sBAMhClH,MAAO,WACH+4D,EAAqB1xD,MAAM,c,gCChU3C7T,EAAOD,QAAU,WAmBbsF,EAAE0f,GAAG0gD,eAAiB,SAAUxiE,GAC5B,IAWI0iE,EACAlY,EACAmY,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACA79D,EACA89D,EA2UAC,EAhWAzpD,EAAWtX,EAAEuD,OAAO,GAAIvD,EAAE0f,GAAG0gD,eAAetpD,SAAUlZ,GAEtDojE,EAAankE,KAGb6S,EAAoB,IAAM4H,EAAS09B,eACnCisB,EAAiB,IAAM3pD,EAAS4pD,YAChCC,EAAoB,IAAM7pD,EAAS8pD,eACnCC,EAAqB,IAAM/pD,EAASgqD,gBAoBxChB,EAAgB,SAAUnY,EAAMoZ,GAC5B,IAAIC,EAAU,EACVC,EAAOtZ,EAAK9gD,KAAK,OAAOo6D,KACxBC,EAAY9+C,WAAWulC,EAAKllD,KAAKg+D,GAAgB79C,IAAI,UAAY,EACjEu+C,EAAgBxZ,EAAKllD,KAAKyM,GAAmB2J,aAC7CuoD,EAAazZ,EAAKllD,KAAKg+D,GAAgBx+C,YAAW,GACtD,GAAI0lC,EAAK9gD,KAAK,OAAOiQ,SAASuqB,UAAY8/B,EAAgBC,EAEtDJ,GAAWG,EAAgBC,GAAc,EACzCzZ,EAAKllD,KAAKg+D,GAAgBl0D,OAAO/E,QAAQ,CAAEuN,KAAMisD,GAAW,CACxDK,OAAQ,WACJlB,EAAaxY,EAAMqZ,EAAS,EAAGC,UAGpC,CACH,IAAItoC,EAAYgvB,EAAK9uC,aAAekoD,EAEpChB,EAASpY,EADTqZ,EAAUE,EAAYvoC,KAU9BivB,EAAc,SAAUD,EAAM2Z,GAC1B,IAAIC,EAAWD,EAAM1zB,WAAW74B,KAC5BysD,EAAU7Z,EAAKllD,KAAKg+D,GACpBgB,EAAoBr/C,WAAWo/C,EAAQ5+C,IAAI,UAAY,EACvD8+C,EAAet/C,WAAWo/C,EAAQ5+C,IAAI,gBACtCq+C,EAAOtZ,EAAK9gD,KAAK,OAAOo6D,KACxBU,EAAY,EACZha,EAAK9gD,KAAK,OAAOiQ,SAAS8qD,aAE1BD,EAAYha,EAAKllD,KAAKo+D,GAAoB5+C,YAAW,IAAS0lC,EAAKllD,KAAKk+D,GAAmB1+C,YAAW,IAAS,GAGnH,IAAIk/C,EAAgBxZ,EAAKllD,KAAKyM,GAAmB2J,aAC7CuoD,EAAazZ,EAAKllD,KAAKg+D,GAAgBx+C,YAAW,GACtD,GAAIk/C,EAAgBC,EAEhB,GAAIzZ,EAAK9gD,KAAK,OAAOiQ,SAASuqB,SAAU,CAEpC,IAAI2/B,GAAWG,EAAgBC,GAAc,EAC7CzZ,EAAKllD,KAAKg+D,GAAgBl0D,OAAO/E,QAAQ,CAAEuN,KAAMisD,GAAW,CACxDK,OAAQ,WACJlB,EAAaxY,EAAMqZ,EAAS,EAAGC,WAIvClB,EAASpY,EAAM,QAEhB,GAAI4Z,EAAWE,EAAoB,EAAIE,EAE1C5B,EAASpY,GAAmB,EAAZ4Z,GAAkBG,EAAeC,QAC9C,CACH,IAAIE,EAAYN,EAAWD,EAAMr/C,YAAW,GACxC6/C,EAAWna,EAAKllD,KAAKyM,GAAmB2J,aACxCgpD,EAAYJ,EAAoBC,EAAeI,EAAWH,EAE1D5B,EAASpY,EAAOma,EAAWD,EAAYH,EAAeC,GAGtDxB,EAAaxY,EAAM8Z,EAAmB,EAAGR,KAUrDlB,EAAW,SAAUpY,EAAMz1C,GACvB,IAAI+uD,EAAOtZ,EAAK9gD,KAAK,OAAOo6D,KACxBD,EAAUV,EAAMpuD,EAAG+uD,EAAM,GAC7BtZ,EAAKllD,KAAKg+D,GAAgBl0D,OAAO/E,QAAQ,CAAEuN,KAAMisD,GAAW,CACxDK,OAAQ,WACJlB,EAAaxY,EAAMqZ,EAAS,EAAGC,OAS3CjB,EAAY,SAAUzjE,GAElB,IAAIorD,EAAOnoD,EAAEnD,MAMb,IAJIsrD,EAAK9gD,KAAK,OAAOiQ,SAASzP,gBAA6B,eAAX9K,EAAE4X,MAC9C5X,EAAE8K,iBAGFsgD,EAAK9gD,KAAK,OAAOiQ,SAASuqB,WACNsmB,EAAKllD,KAAKyM,GAAmB2J,aAChC8uC,EAAKllD,KAAKg+D,GAAgBx+C,YAAW,GAGlD,OAKO,eAAX1lB,EAAE4X,KACF9X,KAAK0lE,IAAIC,OAASzlE,EAAE4tB,QAAQ,GAAG6oB,QAE/B32C,KAAK0lE,IAAIC,OAASzlE,EAAEy2C,QAExB32C,KAAK0lE,IAAIE,QAAU7/C,WAAWulC,EAAKllD,KAAKg+D,GAAgB79C,IAAI,UAAY,EAGxE+kC,EAAKxgD,GAAG,gBAAiB84D,GACzBtY,EAAKxgD,GAAG,gBAAiB84D,GAIzBzgE,EAAE0H,UAAUgtD,IAAI,cAAegM,GAC/B1gE,EAAE0H,UAAUgtD,IAAI,eAAgBgM,IAQpCD,EAAW,SAAU1jE,GAEjB,IAOIy2C,EAPA2U,EAAOnoD,EAAEnD,MAETsrD,EAAK9gD,KAAK,OAAOiQ,SAASzP,gBAC1B9K,EAAE8K,iBAGNhL,KAAK0lE,IAAIG,YAAa,EAGlBlvB,EADW,cAAXz2C,EAAE4X,KACQ5X,EAAE4tB,QAAQ,GAAG6oB,QAEbz2C,EAAEy2C,QAGhB,IAAIyuB,EAAoBplE,KAAK0lE,IAAIE,QAC7BE,EAAgB9lE,KAAK0lE,IAAIC,OACzBf,EAAO5kE,KAAK0lE,IAAId,KAChBD,EAAUS,GAAqBzuB,EAAUmvB,GAC7CnB,EAAUV,EAAMU,EAASC,EAAM,GAC/BtZ,EAAKllD,KAAKg+D,GAAgB79C,IAAI,OAAQo+C,IAO1Cd,EAAU,WAGN1gE,EAAEghE,GAAYr/C,IAAI,iBAClB3hB,EAAEghE,GAAYr/C,IAAI,iBAGlB3hB,EAAEghE,GAAY3wD,MAAK,WACf,GAAIxT,KAAK0lE,IAAIG,WAAY,CACrB7lE,KAAK0lE,IAAIG,YAAa,EACtB,IAAIlB,EAAU5+C,WAAW5iB,EAAEnD,MAAMoG,KAAKg+D,GAAgB79C,IAAI,UAAY,EAClEq+C,EAAO5kE,KAAK0lE,IAAId,KAEpBd,EAAa3gE,EAAEnD,MAAO2kE,EAAS,EAAGC,QAGlC5kE,KAAK0lE,IAAIG,YAAa,MAalC/B,EAAe,SAAUxY,EAAMz1C,EAAG6C,EAAMC,GAKpC2yC,EAAKllD,KAAKk+D,GAAmB9gD,OAAO3N,EAAI6C,EADxB,GAEhB4yC,EAAKllD,KAAKo+D,GAAoBhhD,OAAO3N,EAAI8C,EAFzB,IASpBorD,EAAuB,SAAUzY,GAC7B,IAAIya,EAAcza,EAAK9gD,KAAK,OAAOiQ,SAASsrD,YAC5Cza,EAAKxgD,GAAG,YAAaw5D,GAAmB,WACpCb,EAAcnY,EAAMya,MAExBza,EAAKxgD,GAAG,YAAa05D,GAAoB,WACrCf,EAAcnY,GAAQ,EAAIya,OASlC/B,EAAY,SAAU1Y,EAAM0a,GACxB,IAAIC,EAAe3a,EAAKllD,KAAKg+D,GAAgBp+C,cACzCkgD,EAAmB5a,EAAKllD,KAAKyM,IACjC4H,EAAWtX,EAAEuD,OAAO,GAAIvD,EAAE0f,GAAG0gD,eAAetpD,SAAU+rD,IAEzCG,gBAAkBhiE,SAASsW,EAAS0rD,eAAgB,IAAM,EACnED,EAAiB3/C,IAAI,SAAU9L,EAAS0rD,gBACjCF,GACPC,EAAiB3/C,IAAI,SAAU0/C,IAWvC9/D,EAAO,SAAUmlD,GACb,IAAI0a,EAAmBvrD,EAGvB,GAAI6wC,EAAKloD,KAAK,eAAgB,CAE1B,IAAIgjE,EAAc9a,EAAKloD,KAAK,eAC5B4iE,EAAmB7iE,EAAEuD,OAAO,GAAI+T,EAAU2rD,GAG9C,IAAIC,EAAO/a,EAAK,GAGhB+a,EAAKxzD,kBAAoB,IAAMmzD,EAAiB7tB,eAChDkuB,EAAKjC,eAAiB,IAAM4B,EAAiB3B,YAC7CgC,EAAK/B,kBAAoB,IAAM0B,EAAiBzB,eAChD8B,EAAK7B,mBAAqB,IAAMwB,EAAiBvB,gBAEjD,IAQI6B,EARA1B,EAAOtZ,EAAKllD,KAAKigE,EAAKxzD,mBAAmB2J,aAAe8uC,EAAKllD,KAAKigE,EAAKjC,gBAAgBx+C,YAAW,GAuCtG,GArCA0lC,EAAKjhD,SAAS,mBAId25D,EAAU1Y,EAAM0a,GACI1a,EAAKllD,KAAKigE,EAAKjC,gBAAgBh+D,KAAK,OAE1CoN,MAAK,WACVxT,KAAKylC,UAENtiC,EAAEnD,MAAM63D,IAAI,QAAQ,WAChBj1D,aAAa0jE,GACbA,EAAqBpkE,YAAW,WAC5BmkE,EAAKX,IAAI1B,UAAU1Y,KACpB,WAMf+a,EAAKX,IAAM,CACPjrD,SAAUurD,EACVH,YAAY,EACZD,QAAS,EACTD,OAAQ,KACRf,KAAMA,EACN2B,WAAY,KACZpgE,KAAMA,EACN69D,UAAWA,EACXF,aAAcA,EACdJ,SAAUA,EACVnY,YAAaA,GAGJD,EAAKllD,KAAKigE,EAAKjC,gBAAgBp6D,WACrCK,SAAS27D,EAAiBQ,WAE7BR,EAAiBT,WAAY,CAE7B,GAAIja,EAAKllD,KAAKigE,EAAK7B,oBAAoB5gE,OAAS,EAAG,CAC/C,IAAI6iE,EAAY,iDAAH,OACaT,EAAiBU,eAAc,oBAAYV,EAAiBW,WAAU,YAAIX,EAAiBzB,eAAc,oEACzGyB,EAAiBY,gBAAe,oBAAYZ,EAAiBW,WAAU,YAAIX,EAAiBvB,gBAAe,qCAErInZ,EAAKv9C,OAAO04D,GAIhB,GAFA1C,EAAqBzY,GAEjB0a,EAAiBa,kBAAmB,CAEpC,IAAIC,EAAWxb,EAAKllD,KAAK,aACzB,GAAI0gE,EAAU,CACV,IAAIC,EAAYD,EAAS5qD,SACzBovC,EAAKllD,KAAK,IAAM4/D,EAAiBW,YAAYpgD,IAAI,MAAOwgD,EAAY,KAKhF7kE,YAAW,WAEP,IAAI8kE,EAAc1b,EAAKllD,KAAK,IAAM4/D,EAAiBiB,iBAC/CD,EAAYpjE,OACZ2nD,EAAYD,EAAM0b,GAElBvD,EAAcnY,EAAM,KAEzB,IAkCP,OAlBAnoD,EAAEhD,QAAQ2K,GAAG,cATO,WAChBlI,aAAashE,GACbA,EAAwBhiE,YAAW,WAC/BiB,EAAEghE,GAAY3wD,MAAK,WACf,IAAI83C,EAAOnoD,EAAEnD,MACbmG,EAAKmlD,QAEV,QAWP2Y,EAAQ,SAAUpuD,EAAGjV,EAAKF,GAEtB,OADQD,KAAKG,IAAIH,KAAKC,IAAImV,EAAGjV,GAAMF,IAQhCV,KAAKwT,MAAK,WAEb,IAAI83C,EAAOnoD,EAAEnD,MAEbmG,EAAKmlD,GAILA,EAAKxgD,GAAG,gBAAiB64D,GACzBrY,EAAKxgD,GAAG,iBAAkB64D,GAG1B,IAAIuD,EAAe,IAAM5b,EAAK9gD,KAAK,OAAOiQ,SAAS+rD,UAKnD,OAJAlb,EAAKxgD,GAAG,QAASo8D,GAAc,WAC3B3b,EAAYD,EAAMnoD,EAAEnD,UAGjBA,SAOfmD,EAAE0f,GAAG0gD,eAAetpD,SAAW,CAC3B0sD,WAAY,aACZpC,eAAgB,mBAChBE,gBAAiB,oBACjBiC,eAAgB,cAChBE,gBAAiB,aACjBzuB,eAAgB,iBAChBksB,YAAa,cACbmC,UAAW,YACXjB,YAAY,EACZsB,mBAAmB,EACnBd,YAAa,IACb/gC,UAAU,EACViiC,gBAAiB,SACjBd,eAAgB,EAChBn7D,gBAAgB,GAOpB7H,GAAE,WAGEA,EAAE,oBAAoBogE,sB,+BC5b9B,SAAS4D,EAAgCC,GACrC,GAC+B,OAA3BA,GAC2B,OAA3BA,GAC2B,OAA3BA,GAC2B,OAA3BA,GAC2B,OAA3BA,EACA,MAAM,IAAI3mC,MAAM,oCAAsC2mC,GAG1D,IACIC,EAAuBlkE,EADZ,0BAA4BikE,GAG3C,GAAoC,IAAhCC,EAAqBzjE,OACrB,MAAM,IAAI68B,MAAM,uCAAyC2mC,GAE7D,MAA+C,UAAxCC,EAAqB9gD,IAAI,WAqBpCzoB,EAAOD,QAAU,CAMbotD,SAAU,WACN,OAAOjrD,KAAKsnE,oBAAoB,KAAM,KAAM,OAOhDtc,UAAW,WACP,OAAOhrD,KAAKsnE,oBAAoB,KAAM,OAS1CA,oBAAqB,WACjB,GAAyB,IAArB3kE,UAAUiB,OACV,MAAM,IAAI68B,MAAM,0CAGpB,IAAK,IAAI1iC,EAAI,EAAG6rB,EAAMjnB,UAAUiB,OAAQ7F,EAAI6rB,EAAK7rB,IAAK,CAClD,IAAIwpE,EAAe5kE,UAAU5E,GAE7B,GAAIopE,EAAgCI,GAChC,OAAO,EAUf,OAAO,GAGXC,qBA5DJ,WACI,IACIC,EASJ,OAV4BtkE,EAAE,gCAERqQ,MAAK,WACvB,IAAIk0D,EAAevkE,EAAEnD,MACrB,MAAoC,UAAhC0nE,EAAanhD,IAAI,aACjBkhD,EAAYC,EAAatkE,KAAK,OACvB,MAIRqkE,K,kyLC9BX,IAAI3gE,EAAsB,WAAJ,oBAAJwzB,KAAI,cAAJA,QAAoBA,KAAKA,OAASA,MAAQA,MACjC,gBAAJ,IAANtzB,EAAM,cAANA,KAAsBA,EAAOA,SAAWA,GAAUA,GACzD/G,SAAS,cAATA,IACA,GAGN0nE,EAAa19D,MAAMtK,UAAWioE,EAAWnpE,OAAOkB,UAChDkoE,EAAgC,oBAAX/oE,OAAyBA,OAAOa,UAAY,KAGjE8T,EAAOk0D,EAAWl0D,KAClB9L,EAAQggE,EAAWhgE,MACnBU,EAAWu/D,EAASv/D,SACpBzI,EAAiBgoE,EAAShoE,eAI1BkoE,EAAgB79D,MAAMC,QACtB69D,EAAatpE,OAAO+F,KACpBwjE,EAAevpE,OAAOY,OAGtB4oE,EAASnhE,EAAKm0B,MACditC,EAAYphE,EAAK65B,SAGjBwnC,EAAO,aAII,SAAS7qC,EAAEzmB,GACxB,OAAIA,aAAeymB,EAAUzmB,EACvB7W,gBAAgBs9B,OACtBt9B,KAAKooE,SAAWvxD,GADiB,IAAIymB,EAAEzmB,GAKlC,IAAIwxD,EAAU/qC,EAAE+qC,QAAU,SAKjC,SAASC,EAAWznE,EAAMwhB,EAASkmD,GACjC,QAAgB,IAAZlmD,EAAoB,OAAOxhB,EAC/B,OAAoB,MAAZ0nE,EAAmB,EAAIA,GAC7B,KAAK,EAAG,OAAO,SAASvpE,GACtB,OAAO6B,EAAK3C,KAAKmkB,EAASrjB,IAG5B,KAAK,EAAG,OAAO,SAASA,EAAOiJ,EAAOk8D,GACpC,OAAOtjE,EAAK3C,KAAKmkB,EAASrjB,EAAOiJ,EAAOk8D,IAE1C,KAAK,EAAG,OAAO,SAASqE,EAAaxpE,EAAOiJ,EAAOk8D,GACjD,OAAOtjE,EAAK3C,KAAKmkB,EAASmmD,EAAaxpE,EAAOiJ,EAAOk8D,IAGzD,OAAO,WACL,OAAOtjE,EAAKmB,MAAMqgB,EAAS1f,YAO/B,SAAS8lE,EAAazpE,EAAOqjB,EAASkmD,GACpC,OAAa,MAATvpE,EAAsB0pE,GACtBC,GAAW3pE,GAAespE,EAAWtpE,EAAOqjB,EAASkmD,GACrDnoE,GAASpB,KAAWkL,GAAQlL,GAAe4pE,GAAQ5pE,GAChDU,GAASV,GAOX,SAAS6pE,EAAS7pE,EAAOqjB,GAC9B,OAAOomD,EAAazpE,EAAOqjB,EAASymD,KAKtC,SAASC,EAAG/pE,EAAOqjB,EAASkmD,GAC1B,OAAIjrC,EAAEurC,WAAaA,EAAiBvrC,EAAEurC,SAAS7pE,EAAOqjB,GAC/ComD,EAAazpE,EAAOqjB,EAASkmD,GAQ/B,SAASS,EAAcnoE,EAAMwV,GAElC,OADAA,EAA2B,MAAdA,EAAqBxV,EAAK+C,OAAS,GAAKyS,EAC9C,WAIL,IAHA,IAAIzS,EAASnD,KAAKC,IAAIiC,UAAUiB,OAASyS,EAAY,GACjD4yD,EAAOh/D,MAAMrG,GACbqE,EAAQ,EACLA,EAAQrE,EAAQqE,IACrBghE,EAAKhhE,GAAStF,UAAUsF,EAAQoO,GAElC,OAAQA,GACN,KAAK,EAAG,OAAOxV,EAAK3C,KAAK8B,KAAMipE,GAC/B,KAAK,EAAG,OAAOpoE,EAAK3C,KAAK8B,KAAM2C,UAAU,GAAIsmE,GAC7C,KAAK,EAAG,OAAOpoE,EAAK3C,KAAK8B,KAAM2C,UAAU,GAAIA,UAAU,GAAIsmE,GAE7D,IAAIpnE,EAAOoI,MAAMoM,EAAa,GAC9B,IAAKpO,EAAQ,EAAGA,EAAQoO,EAAYpO,IAClCpG,EAAKoG,GAAStF,UAAUsF,GAG1B,OADApG,EAAKwU,GAAc4yD,EACZpoE,EAAKmB,MAAMhC,KAAM6B,IAK5B,SAASqnE,EAAWvpE,GAClB,IAAKS,GAAST,GAAY,MAAO,GACjC,GAAIqoE,EAAc,OAAOA,EAAaroE,GACtCwoE,EAAKxoE,UAAYA,EACjB,IAAIwB,EAAS,IAAIgnE,EAEjB,OADAA,EAAKxoE,UAAY,KACVwB,EAGT,SAASgoE,EAAgB7pE,GACvB,OAAO,SAASuX,GACd,OAAc,MAAPA,OAAc,EAASA,EAAIvX,IAItC,SAAS8pE,EAAKvyD,EAAKE,GACjB,OAAc,MAAPF,GAAejX,EAAe1B,KAAK2Y,EAAKE,GAGjD,SAASsyD,EAAQxyD,EAAKE,GAEpB,IADA,IAAInT,EAASmT,EAAKnT,OACT7F,EAAI,EAAGA,EAAI6F,EAAQ7F,IAAK,CAC/B,GAAW,MAAP8Y,EAAa,OACjBA,EAAMA,EAAIE,EAAKhZ,IAEjB,OAAO6F,EAASiT,OAAM,EAlExBymB,EAAEurC,SAAWA,EAyEb,IAAIS,EAAkB7oE,KAAK8oE,IAAI,EAAG,IAAM,EACpCC,EAAYL,EAAgB,UAChC,SAASM,EAAYtF,GACnB,IAAIvgE,EAAS4lE,EAAUrF,GACvB,MAAwB,iBAAVvgE,GAAsBA,GAAU,GAAKA,GAAU0lE,EASxD,SAAS91D,EAAKqD,EAAKgyD,EAAUxmD,GAElC,IAAItkB,EAAG6F,EACP,GAFAilE,EAAWP,EAAWO,EAAUxmD,GAE5BonD,EAAY5yD,GACd,IAAK9Y,EAAI,EAAG6F,EAASiT,EAAIjT,OAAQ7F,EAAI6F,EAAQ7F,IAC3C8qE,EAAShyD,EAAI9Y,GAAIA,EAAG8Y,OAEjB,CACL,IAAI6yD,EAAQllE,GAAKqS,GACjB,IAAK9Y,EAAI,EAAG6F,EAAS8lE,EAAM9lE,OAAQ7F,EAAI6F,EAAQ7F,IAC7C8qE,EAAShyD,EAAI6yD,EAAM3rE,IAAK2rE,EAAM3rE,GAAI8Y,GAGtC,OAAOA,EAKF,SAAS/G,EAAI+G,EAAKgyD,EAAUxmD,GACjCwmD,EAAWE,EAAGF,EAAUxmD,GAIxB,IAHA,IAAIqnD,GAASD,EAAY5yD,IAAQrS,GAAKqS,GAClCjT,GAAU8lE,GAAS7yD,GAAKjT,OACxB+lE,EAAU1/D,MAAMrG,GACXqE,EAAQ,EAAGA,EAAQrE,EAAQqE,IAAS,CAC3C,IAAI2hE,EAAaF,EAAQA,EAAMzhE,GAASA,EACxC0hE,EAAQ1hE,GAAS4gE,EAAShyD,EAAI+yD,GAAaA,EAAY/yD,GAEzD,OAAO8yD,EAKT,SAASE,EAAa7+C,GAGpB,IAAI8+C,EAAU,SAASjzD,EAAKgyD,EAAUkB,EAAMvpC,GAC1C,IAAIkpC,GAASD,EAAY5yD,IAAQrS,GAAKqS,GAClCjT,GAAU8lE,GAAS7yD,GAAKjT,OACxBqE,EAAQ+iB,EAAM,EAAI,EAAIpnB,EAAS,EAKnC,IAJK48B,IACHupC,EAAOlzD,EAAI6yD,EAAQA,EAAMzhE,GAASA,GAClCA,GAAS+iB,GAEJ/iB,GAAS,GAAKA,EAAQrE,EAAQqE,GAAS+iB,EAAK,CACjD,IAAI4+C,EAAaF,EAAQA,EAAMzhE,GAASA,EACxC8hE,EAAOlB,EAASkB,EAAMlzD,EAAI+yD,GAAaA,EAAY/yD,GAErD,OAAOkzD,GAGT,OAAO,SAASlzD,EAAKgyD,EAAUkB,EAAM1nD,GACnC,IAAIme,EAAU79B,UAAUiB,QAAU,EAClC,OAAOkmE,EAAQjzD,EAAKyxD,EAAWO,EAAUxmD,EAAS,GAAI0nD,EAAMvpC,IAMzD,IAAI/hB,EAASorD,EAAa,GAItBG,EAAcH,GAAc,GAIhC,SAASzjE,EAAKyQ,EAAKozD,EAAW5nD,GACnC,IACI/iB,GADYmqE,EAAY5yD,GAAOqzD,GAAYC,IAC3BtzD,EAAKozD,EAAW5nD,GACpC,QAAY,IAAR/iB,IAA2B,IAATA,EAAY,OAAOuX,EAAIvX,GAKxC,SAAS8iB,EAAOvL,EAAKozD,EAAW5nD,GACrC,IAAIsnD,EAAU,GAKd,OAJAM,EAAYlB,EAAGkB,EAAW5nD,GAC1B7O,EAAKqD,GAAK,SAAS7X,EAAOiJ,EAAOqQ,GAC3B2xD,EAAUjrE,EAAOiJ,EAAOqQ,IAAOqxD,EAAQl2D,KAAKzU,MAE3C2qE,EAKF,SAASS,EAAOvzD,EAAKozD,EAAW5nD,GACrC,OAAOD,EAAOvL,EAAKwzD,GAAOtB,EAAGkB,IAAa5nD,GAIrC,SAASioD,EAAMzzD,EAAKozD,EAAW5nD,GACpC4nD,EAAYlB,EAAGkB,EAAW5nD,GAG1B,IAFA,IAAIqnD,GAASD,EAAY5yD,IAAQrS,GAAKqS,GAClCjT,GAAU8lE,GAAS7yD,GAAKjT,OACnBqE,EAAQ,EAAGA,EAAQrE,EAAQqE,IAAS,CAC3C,IAAI2hE,EAAaF,EAAQA,EAAMzhE,GAASA,EACxC,IAAKgiE,EAAUpzD,EAAI+yD,GAAaA,EAAY/yD,GAAM,OAAO,EAE3D,OAAO,EAKF,SAASvN,EAAKuN,EAAKozD,EAAW5nD,GACnC4nD,EAAYlB,EAAGkB,EAAW5nD,GAG1B,IAFA,IAAIqnD,GAASD,EAAY5yD,IAAQrS,GAAKqS,GAClCjT,GAAU8lE,GAAS7yD,GAAKjT,OACnBqE,EAAQ,EAAGA,EAAQrE,EAAQqE,IAAS,CAC3C,IAAI2hE,EAAaF,EAAQA,EAAMzhE,GAASA,EACxC,GAAIgiE,EAAUpzD,EAAI+yD,GAAaA,EAAY/yD,GAAM,OAAO,EAE1D,OAAO,EAKF,SAAS0M,EAAS1M,EAAKxN,EAAMkhE,EAAWC,GAG7C,OAFKf,EAAY5yD,KAAMA,EAAMlK,GAAOkK,KACZ,iBAAb0zD,GAAyBC,KAAOD,EAAY,GAChD79D,GAAQmK,EAAKxN,EAAMkhE,IAAc,EAKnC,IAAIE,EAASzB,GAAc,SAASnyD,EAAKE,EAAMlV,GACpD,IAAI6oE,EAAa7pE,EAOjB,OANI8nE,GAAW5xD,GACblW,EAAOkW,EACE7M,GAAQ6M,KACjB2zD,EAAc3zD,EAAKpP,MAAM,GAAI,GAC7BoP,EAAOA,EAAKA,EAAKnT,OAAS,IAErBkM,EAAI+G,GAAK,SAASwL,GACvB,IAAI5S,EAAS5O,EACb,IAAK4O,EAAQ,CAIX,GAHIi7D,GAAeA,EAAY9mE,SAC7Bye,EAAUgnD,EAAQhnD,EAASqoD,IAEd,MAAXroD,EAAiB,OACrB5S,EAAS4S,EAAQtL,GAEnB,OAAiB,MAAVtH,EAAiBA,EAASA,EAAOzN,MAAMqgB,EAASxgB,SAKpD,SAAS8oE,EAAM9zD,EAAKvX,GACzB,OAAOwQ,EAAI+G,EAAKnX,GAASJ,IAKpB,SAASsrE,EAAM/zD,EAAKvK,GACzB,OAAO8V,EAAOvL,EAAK+xD,GAAQt8D,IAKtB,SAASu+D,EAAUh0D,EAAKvK,GAC7B,OAAOlG,EAAKyQ,EAAK+xD,GAAQt8D,IAIpB,SAAS5L,EAAImW,EAAKgyD,EAAUxmD,GACjC,IACIrjB,EAAO8rE,EADP3pE,GAAU2nE,IAAUiC,GAAgBjC,IAExC,GAAgB,MAAZD,GAAuC,iBAAZA,GAAyC,UAAjB,EAAOhyD,EAAI,KAAyB,MAAPA,EAElF,IAAK,IAAI9Y,EAAI,EAAG6F,GADhBiT,EAAM4yD,EAAY5yD,GAAOA,EAAMlK,GAAOkK,IACTjT,OAAQ7F,EAAI6F,EAAQ7F,IAElC,OADbiB,EAAQ6X,EAAI9Y,KACSiB,EAAQmC,IAC3BA,EAASnC,QAIb6pE,EAAWE,EAAGF,EAAUxmD,GACxB7O,EAAKqD,GAAK,SAASd,EAAG9N,EAAOqQ,KAC3BwyD,EAAWjC,EAAS9yD,EAAG9N,EAAOqQ,IACfyyD,GAAgBD,KAAchC,KAAY3nE,KAAY2nE,OACnE3nE,EAAS4U,EACTg1D,EAAeD,MAIrB,OAAO3pE,EAIF,SAASP,EAAIiW,EAAKgyD,EAAUxmD,GACjC,IACIrjB,EAAO8rE,EADP3pE,EAAS2nE,IAAUiC,EAAejC,IAEtC,GAAgB,MAAZD,GAAuC,iBAAZA,GAAyC,UAAjB,EAAOhyD,EAAI,KAAyB,MAAPA,EAElF,IAAK,IAAI9Y,EAAI,EAAG6F,GADhBiT,EAAM4yD,EAAY5yD,GAAOA,EAAMlK,GAAOkK,IACTjT,OAAQ7F,EAAI6F,EAAQ7F,IAElC,OADbiB,EAAQ6X,EAAI9Y,KACSiB,EAAQmC,IAC3BA,EAASnC,QAIb6pE,EAAWE,EAAGF,EAAUxmD,GACxB7O,EAAKqD,GAAK,SAASd,EAAG9N,EAAOqQ,KAC3BwyD,EAAWjC,EAAS9yD,EAAG9N,EAAOqQ,IACfyyD,GAAgBD,IAAahC,KAAY3nE,IAAW2nE,OACjE3nE,EAAS4U,EACTg1D,EAAeD,MAIrB,OAAO3pE,EAIF,SAAS6pE,EAAQn0D,GACtB,OAAOo0D,EAAOp0D,EAAKiyD,KAOd,SAASmC,EAAOp0D,EAAKrX,EAAGgrE,GAC7B,GAAS,MAALhrE,GAAagrE,EAEf,OADKf,EAAY5yD,KAAMA,EAAMlK,GAAOkK,IAC7BA,EAAIqqC,GAAOrqC,EAAIjT,OAAS,IAEjC,IAAIqnE,EAASxB,EAAY5yD,GAAOq0D,GAAMr0D,GAAOlK,GAAOkK,GAChDjT,EAAS4lE,EAAUyB,GACvBzrE,EAAIiB,KAAKC,IAAID,KAAKG,IAAIpB,EAAGoE,GAAS,GAElC,IADA,IAAIunE,EAAOvnE,EAAS,EACXqE,EAAQ,EAAGA,EAAQzI,EAAGyI,IAAS,CACtC,IAAImjE,EAAOlqB,GAAOj5C,EAAOkjE,GACrBxxD,EAAOsxD,EAAOhjE,GAClBgjE,EAAOhjE,GAASgjE,EAAOG,GACvBH,EAAOG,GAAQzxD,EAEjB,OAAOsxD,EAAOtjE,MAAM,EAAGnI,GAIlB,SAAS6rE,EAAOx0D,EAAKgyD,EAAUxmD,GACpC,IAAIpa,EAAQ,EAEZ,OADA4gE,EAAWE,EAAGF,EAAUxmD,GACjBsoD,EAAM76D,EAAI+G,GAAK,SAAS7X,EAAOM,EAAKgZ,GACzC,MAAO,CACLtZ,MAAOA,EACPiJ,MAAOA,IACPqjE,SAAUzC,EAAS7pE,EAAOM,EAAKgZ,OAEhC+rB,MAAK,SAAS3rB,EAAMC,GACrB,IAAI+J,EAAIhK,EAAK4yD,SACThnC,EAAI3rB,EAAM2yD,SACd,GAAI5oD,IAAM4hB,EAAG,CACX,GAAI5hB,EAAI4hB,QAAW,IAAN5hB,EAAc,OAAO,EAClC,GAAIA,EAAI4hB,QAAW,IAANA,EAAc,OAAQ,EAErC,OAAO5rB,EAAKzQ,MAAQ0Q,EAAM1Q,SACxB,SAIN,SAASsjE,EAAMC,EAAUC,GACvB,OAAO,SAAS50D,EAAKgyD,EAAUxmD,GAC7B,IAAIlhB,EAASsqE,EAAY,CAAC,GAAI,IAAM,GAMpC,OALA5C,EAAWE,EAAGF,EAAUxmD,GACxB7O,EAAKqD,GAAK,SAAS7X,EAAOiJ,GACxB,IAAI3I,EAAMupE,EAAS7pE,EAAOiJ,EAAO4O,GACjC20D,EAASrqE,EAAQnC,EAAOM,MAEnB6B,GAMJ,IAAIuqE,EAAUH,GAAM,SAASpqE,EAAQnC,EAAOM,GAC7C8pE,EAAKjoE,EAAQ7B,GAAM6B,EAAO7B,GAAKmU,KAAKzU,GAAamC,EAAO7B,GAAO,CAACN,MAK3D2sE,GAAUJ,GAAM,SAASpqE,EAAQnC,EAAOM,GACjD6B,EAAO7B,GAAON,KAML4sE,GAAUL,GAAM,SAASpqE,EAAQnC,EAAOM,GAC7C8pE,EAAKjoE,EAAQ7B,GAAM6B,EAAO7B,KAAa6B,EAAO7B,GAAO,KAGvDusE,GAAc,mEAEX,SAAS55D,GAAQ4E,GACtB,OAAKA,EACD3M,GAAQ2M,GAAalP,EAAMzJ,KAAK2Y,GAChCi1D,GAASj1D,GAEJA,EAAI8V,MAAMk/C,IAEfpC,EAAY5yD,GAAa/G,EAAI+G,EAAK6xD,IAC/B/7D,GAAOkK,GAPG,GAWZ,SAASqkB,GAAKrkB,GACnB,OAAW,MAAPA,EAAoB,EACjB4yD,EAAY5yD,GAAOA,EAAIjT,OAASY,GAAKqS,GAAKjT,OAK5C,IAAI6nE,GAAYF,GAAM,SAASpqE,EAAQnC,EAAO+sE,GACnD5qE,EAAO4qE,EAAO,EAAI,GAAGt4D,KAAKzU,MACzB,GAOI,SAASkP,GAAMiwC,EAAO3+C,EAAGgrE,GAC9B,OAAa,MAATrsB,GAAiBA,EAAMv6C,OAAS,EAAe,MAALpE,OAAY,EAAS,GAC1D,MAALA,GAAagrE,EAAcrsB,EAAM,GAC9B3d,GAAQ2d,EAAOA,EAAMv6C,OAASpE,GAOhC,SAASghC,GAAQ2d,EAAO3+C,EAAGgrE,GAChC,OAAO7iE,EAAMzJ,KAAKigD,EAAO,EAAG19C,KAAKC,IAAI,EAAGy9C,EAAMv6C,QAAe,MAALpE,GAAagrE,EAAQ,EAAIhrE,KAK5E,SAAS2rE,GAAKhtB,EAAO3+C,EAAGgrE,GAC7B,OAAa,MAATrsB,GAAiBA,EAAMv6C,OAAS,EAAe,MAALpE,OAAY,EAAS,GAC1D,MAALA,GAAagrE,EAAcrsB,EAAMA,EAAMv6C,OAAS,GAC7CqlE,GAAK9qB,EAAO19C,KAAKC,IAAI,EAAGy9C,EAAMv6C,OAASpE,IAMzC,SAASypE,GAAK9qB,EAAO3+C,EAAGgrE,GAC7B,OAAO7iE,EAAMzJ,KAAKigD,EAAY,MAAL3+C,GAAagrE,EAAQ,EAAIhrE,GAK7C,SAASwsE,GAAQ7tB,GACtB,OAAO/7B,EAAO+7B,EAAO8tB,SAIvB,SAASC,GAASlvD,EAAOmvD,EAASC,EAAQl2D,GAGxC,IADA,IAAIk8C,GADJl8C,EAASA,GAAU,IACFtS,OACR7F,EAAI,EAAG6F,EAAS4lE,EAAUxsD,GAAQjf,EAAI6F,EAAQ7F,IAAK,CAC1D,IAAIiB,EAAQge,EAAMjf,GAClB,GAAI0rE,EAAYzqE,KAAWkL,GAAQlL,IAAUqtE,GAAYrtE,IAEvD,GAAImtE,EAEF,IADA,IAAI1nD,EAAI,EAAGmF,EAAM5qB,EAAM4E,OAChB6gB,EAAImF,GAAK1T,EAAOk8C,KAASpzD,EAAMylB,UAEtCynD,GAASltE,EAAOmtE,EAASC,EAAQl2D,GACjCk8C,EAAMl8C,EAAOtS,YAELwoE,IACVl2D,EAAOk8C,KAASpzD,GAGpB,OAAOkX,EAIF,SAASo2D,GAAQnuB,EAAOguB,GAC7B,OAAOD,GAAS/tB,EAAOguB,GAAS,GAI3B,IAAII,GAAUvD,GAAc,SAAS7qB,EAAOquB,GACjD,OAAOC,GAAWtuB,EAAOquB,MAQpB,SAASE,GAAKvuB,EAAOwuB,EAAU9D,EAAUxmD,GACzCuqD,GAAUD,KACbtqD,EAAUwmD,EACVA,EAAW8D,EACXA,GAAW,GAEG,MAAZ9D,IAAkBA,EAAWE,EAAGF,EAAUxmD,IAG9C,IAFA,IAAIlhB,EAAS,GACT0rE,EAAO,GACF9uE,EAAI,EAAG6F,EAAS4lE,EAAUrrB,GAAQpgD,EAAI6F,EAAQ7F,IAAK,CAC1D,IAAIiB,EAAQm/C,EAAMpgD,GACd+sE,EAAWjC,EAAWA,EAAS7pE,EAAOjB,EAAGogD,GAASn/C,EAClD2tE,IAAa9D,GACV9qE,GAAK8uE,IAAS/B,GAAU3pE,EAAOsS,KAAKzU,GACzC6tE,EAAO/B,GACEjC,EACJtlD,EAASspD,EAAM/B,KAClB+B,EAAKp5D,KAAKq3D,GACV3pE,EAAOsS,KAAKzU,IAEJukB,EAASpiB,EAAQnC,IAC3BmC,EAAOsS,KAAKzU,GAGhB,OAAOmC,EAMF,IAAI2rE,GAAQ9D,GAAc,SAAS+D,GACxC,OAAOL,GAAKR,GAASa,GAAQ,GAAM,OAK9B,SAASC,GAAa7uB,GAG3B,IAFA,IAAIh9C,EAAS,GACT8rE,EAAatqE,UAAUiB,OAClB7F,EAAI,EAAG6F,EAAS4lE,EAAUrrB,GAAQpgD,EAAI6F,EAAQ7F,IAAK,CAC1D,IAAIsL,EAAO80C,EAAMpgD,GACjB,IAAIwlB,EAASpiB,EAAQkI,GAArB,CACA,IAAIob,EACJ,IAAKA,EAAI,EAAGA,EAAIwoD,GACT1pD,EAAS5gB,UAAU8hB,GAAIpb,GADFob,KAGxBA,IAAMwoD,GAAY9rE,EAAOsS,KAAKpK,IAEpC,OAAOlI,EAKF,IAAIsrE,GAAazD,GAAc,SAAS7qB,EAAO8qB,GAEpD,OADAA,EAAOiD,GAASjD,GAAM,GAAM,GACrB7mD,EAAO+7B,GAAO,SAASn/C,GAC5B,OAAQukB,EAAS0lD,EAAMjqE,SAMpB,SAASkuE,GAAM/uB,GAIpB,IAHA,IAAIv6C,EAASu6C,GAASz9C,EAAIy9C,EAAOqrB,GAAW5lE,QAAU,EAClDzC,EAAS8I,MAAMrG,GAEVqE,EAAQ,EAAGA,EAAQrE,EAAQqE,IAClC9G,EAAO8G,GAAS0iE,EAAMxsB,EAAOl2C,GAE/B,OAAO9G,EAKF,IAAIgsE,GAAMnE,EAAckE,IAKxB,SAASztE,GAAO6Y,EAAM3L,GAE3B,IADA,IAAIxL,EAAS,GACJpD,EAAI,EAAG6F,EAAS4lE,EAAUlxD,GAAOva,EAAI6F,EAAQ7F,IAChD4O,EACFxL,EAAOmX,EAAKva,IAAM4O,EAAO5O,GAEzBoD,EAAOmX,EAAKva,GAAG,IAAMua,EAAKva,GAAG,GAGjC,OAAOoD,EAIT,SAASisE,GAA2BpiD,GAClC,OAAO,SAASmzB,EAAO8rB,EAAW5nD,GAChC4nD,EAAYlB,EAAGkB,EAAW5nD,GAG1B,IAFA,IAAIze,EAAS4lE,EAAUrrB,GACnBl2C,EAAQ+iB,EAAM,EAAI,EAAIpnB,EAAS,EAC5BqE,GAAS,GAAKA,EAAQrE,EAAQqE,GAAS+iB,EAC5C,GAAIi/C,EAAU9rB,EAAMl2C,GAAQA,EAAOk2C,GAAQ,OAAOl2C,EAEpD,OAAQ,GAKL,IAAIiiE,GAAYkD,GAA2B,GACvCC,GAAgBD,IAA4B,GAIhD,SAASE,GAAYnvB,EAAOtnC,EAAKgyD,EAAUxmD,GAIhD,IAFA,IAAIrjB,GADJ6pE,EAAWE,EAAGF,EAAUxmD,EAAS,IACZxL,GACjB02D,EAAM,EAAGC,EAAOhE,EAAUrrB,GACvBovB,EAAMC,GAAM,CACjB,IAAIC,EAAMhtE,KAAKgF,OAAO8nE,EAAMC,GAAQ,GAChC3E,EAAS1qB,EAAMsvB,IAAQzuE,EAAOuuE,EAAME,EAAM,EAAQD,EAAOC,EAE/D,OAAOF,EAIT,SAASG,GAAkB1iD,EAAK2iD,EAAeL,GAC7C,OAAO,SAASnvB,EAAO90C,EAAM+oD,GAC3B,IAAIr0D,EAAI,EAAG6F,EAAS4lE,EAAUrrB,GAC9B,GAAkB,iBAAPiU,EACLpnC,EAAM,EACRjtB,EAAIq0D,GAAO,EAAIA,EAAM3xD,KAAKC,IAAI0xD,EAAMxuD,EAAQ7F,GAE5C6F,EAASwuD,GAAO,EAAI3xD,KAAKG,IAAIwxD,EAAM,EAAGxuD,GAAUwuD,EAAMxuD,EAAS,OAE5D,GAAI0pE,GAAelb,GAAOxuD,EAE/B,OAAOu6C,EADPiU,EAAMkb,EAAYnvB,EAAO90C,MACHA,EAAO+oD,GAAO,EAEtC,GAAI/oD,GAASA,EAEX,OADA+oD,EAAMub,EAAchmE,EAAMzJ,KAAKigD,EAAOpgD,EAAG6F,GAASq3B,MACpC,EAAIm3B,EAAMr0D,GAAK,EAE/B,IAAKq0D,EAAMpnC,EAAM,EAAIjtB,EAAI6F,EAAS,EAAGwuD,GAAO,GAAKA,EAAMxuD,EAAQwuD,GAAOpnC,EACpE,GAAImzB,EAAMiU,KAAS/oD,EAAM,OAAO+oD,EAElC,OAAQ,GAQL,IAAI1lD,GAAUghE,GAAkB,EAAGxD,GAAWoD,IAC1CM,GAAcF,IAAmB,EAAGL,IAKxC,SAASQ,GAAMn9D,EAAOR,EAAMod,GACrB,MAARpd,IACFA,EAAOQ,GAAS,EAChBA,EAAQ,GAEL4c,IACHA,EAAOpd,EAAOQ,GAAS,EAAI,GAM7B,IAHA,IAAI9M,EAASnD,KAAKC,IAAID,KAAK69B,MAAMpuB,EAAOQ,GAAS4c,GAAO,GACpDugD,EAAQ5jE,MAAMrG,GAETwuD,EAAM,EAAGA,EAAMxuD,EAAQwuD,IAAO1hD,GAAS4c,EAC9CugD,EAAMzb,GAAO1hD,EAGf,OAAOm9D,EAKF,SAASC,GAAM3vB,EAAOxpC,GAC3B,GAAa,MAATA,GAAiBA,EAAQ,EAAG,MAAO,GAGvC,IAFA,IAAIxT,EAAS,GACTpD,EAAI,EAAG6F,EAASu6C,EAAMv6C,OACnB7F,EAAI6F,GACTzC,EAAOsS,KAAK9L,EAAMzJ,KAAKigD,EAAOpgD,EAAGA,GAAK4W,IAExC,OAAOxT,EAQT,SAAS4sE,GAAaC,EAAYC,EAAW5rD,EAAS6rD,EAAgBrsE,GACpE,KAAMqsE,aAA0BD,GAAY,OAAOD,EAAWhsE,MAAMqgB,EAASxgB,GAC7E,IAAIy4B,EAAO4uC,EAAW8E,EAAWruE,WAC7BwB,EAAS6sE,EAAWhsE,MAAMs4B,EAAMz4B,GACpC,OAAIzB,GAASe,GAAgBA,EACtBm5B,EAMF,IAAI/6B,GAAOypE,GAAc,SAASnoE,EAAMwhB,EAASxgB,GACtD,IAAK8mE,GAAW9nE,GAAO,MAAM,IAAIa,UAAU,qCAC3C,IAAIysE,EAAQnF,GAAc,SAASoF,GACjC,OAAOL,GAAaltE,EAAMstE,EAAO9rD,EAASriB,KAAM6B,EAAKwsE,OAAOD,OAE9D,OAAOD,KAOEG,GAAUtF,GAAc,SAASnoE,EAAM0tE,GAChD,IAAIC,EAAcF,GAAQE,YAU1B,OATY,SAARL,IAGF,IAFA,IAAI58B,EAAW,EAAG3tC,EAAS2qE,EAAU3qE,OACjC/B,EAAOoI,MAAMrG,GACR7F,EAAI,EAAGA,EAAI6F,EAAQ7F,IAC1B8D,EAAK9D,GAAKwwE,EAAUxwE,KAAOywE,EAAc7rE,UAAU4uC,KAAcg9B,EAAUxwE,GAE7E,KAAOwzC,EAAW5uC,UAAUiB,QAAQ/B,EAAK4R,KAAK9Q,UAAU4uC,MACxD,OAAOw8B,GAAaltE,EAAMstE,EAAOnuE,KAAMA,KAAM6B,OAKjDysE,GAAQE,YAAclxC,EAKf,IAAImxC,GAAUzF,GAAc,SAASnyD,EAAK6yD,GAE/C,IAAIzhE,GADJyhE,EAAQwC,GAASxC,GAAO,GAAO,IACb9lE,OAClB,GAAIqE,EAAQ,EAAG,MAAM,IAAIw4B,MAAM,yCAC/B,KAAOx4B,KAAS,CACd,IAAI3I,EAAMoqE,EAAMzhE,GAChB4O,EAAIvX,GAAOC,GAAKsX,EAAIvX,GAAMuX,OAKvB,SAAS63D,GAAQ7tE,EAAM8tE,GAC5B,IAAID,EAAU,SAAVA,EAAmBpvE,GACrB,IAAI2sC,EAAQyiC,EAAQziC,MAChB2iC,EAAU,IAAMD,EAASA,EAAO3sE,MAAMhC,KAAM2C,WAAarD,GAE7D,OADK8pE,EAAKn9B,EAAO2iC,KAAU3iC,EAAM2iC,GAAW/tE,EAAKmB,MAAMhC,KAAM2C,YACtDspC,EAAM2iC,IAGf,OADAF,EAAQziC,MAAQ,GACTyiC,EAKF,IAAIrmD,GAAQ2gD,GAAc,SAASnoE,EAAMC,EAAMe,GACpD,OAAOK,YAAW,WAChB,OAAOrB,EAAKmB,MAAM,KAAMH,KACvBf,MAKM+tE,GAAQP,GAAQjmD,GAAOiV,EAAG,GAO9B,SAASwxC,GAASjuE,EAAMC,EAAMC,GACnC,IAAIkuC,EAAS5sB,EAASxgB,EAAMV,EACxB4tE,EAAW,EACVhuE,IAASA,EAAU,IAExB,IAAIiuE,EAAQ,WACVD,GAA+B,IAApBhuE,EAAQQ,QAAoB,EAAIjB,KAC3C2uC,EAAU,KACV9tC,EAASN,EAAKmB,MAAMqgB,EAASxgB,GACxBotC,IAAS5sB,EAAUxgB,EAAO,OAG7BotE,EAAY,WACd,IAAIC,EAAO5uE,KACNyuE,IAAgC,IAApBhuE,EAAQQ,UAAmBwtE,EAAWG,GACvD,IAAIC,EAAYruE,GAAQouE,EAAOH,GAc/B,OAbA1sD,EAAUriB,KACV6B,EAAOc,UACHwsE,GAAa,GAAKA,EAAYruE,GAC5BmuC,IACFrsC,aAAaqsC,GACbA,EAAU,MAEZ8/B,EAAWG,EACX/tE,EAASN,EAAKmB,MAAMqgB,EAASxgB,GACxBotC,IAAS5sB,EAAUxgB,EAAO,OACrBotC,IAAgC,IAArBluC,EAAQU,WAC7BwtC,EAAU/sC,WAAW8sE,EAAOG,IAEvBhuE,GAST,OANA8tE,EAAUpsE,OAAS,WACjBD,aAAaqsC,GACb8/B,EAAW,EACX9/B,EAAU5sB,EAAUxgB,EAAO,MAGtBotE,EAOF,SAASxkB,GAAS5pD,EAAMC,EAAMsuE,GACnC,IAAIngC,EAAS9tC,EAET6tE,EAAQ,SAAS3sD,EAASxgB,GAC5BotC,EAAU,KACNptC,IAAMV,EAASN,EAAKmB,MAAMqgB,EAASxgB,KAGrCY,EAAYumE,GAAc,SAASnnE,GAErC,GADIotC,GAASrsC,aAAaqsC,GACtBmgC,EAAW,CACb,IAAIC,GAAWpgC,EACfA,EAAU/sC,WAAW8sE,EAAOluE,GACxBuuE,IAASluE,EAASN,EAAKmB,MAAMhC,KAAM6B,SAEvCotC,EAAU5mB,GAAM2mD,EAAOluE,EAAMd,KAAM6B,GAGrC,OAAOV,KAQT,OALAsB,EAAUI,OAAS,WACjBD,aAAaqsC,GACbA,EAAU,MAGLxsC,EAMF,SAAS+G,GAAK3I,EAAMqnC,GACzB,OAAOomC,GAAQpmC,EAASrnC,GAInB,SAASwpE,GAAOJ,GACrB,OAAO,WACL,OAAQA,EAAUjoE,MAAMhC,KAAM2C,YAM3B,SAAS2sE,KACd,IAAIztE,EAAOc,UACP+N,EAAQ7O,EAAK+B,OAAS,EAC1B,OAAO,WAGL,IAFA,IAAI7F,EAAI2S,EACJvP,EAASU,EAAK6O,GAAO1O,MAAMhC,KAAM2C,WAC9B5E,KAAKoD,EAASU,EAAK9D,GAAGG,KAAK8B,KAAMmB,GACxC,OAAOA,GAKJ,SAASw1D,GAAM4Y,EAAO1uE,GAC3B,OAAO,WACL,KAAM0uE,EAAQ,EACZ,OAAO1uE,EAAKmB,MAAMhC,KAAM2C,YAMvB,SAAS6sE,GAAOD,EAAO1uE,GAC5B,IAAIkpE,EACJ,OAAO,WAKL,QAJMwF,EAAQ,IACZxF,EAAOlpE,EAAKmB,MAAMhC,KAAM2C,YAEtB4sE,GAAS,IAAG1uE,EAAO,MAChBkpE,GAMJ,IAAIvvC,GAAO8zC,GAAQkB,GAAQ,GAM9BC,IAAc,CAACpnE,SAAU,MAAMqnE,qBAAqB,YACpDC,GAAqB,CAAC,UAAW,gBAAiB,WACpD,uBAAwB,iBAAkB,kBAE5C,SAASC,GAAoB/4D,EAAK6yD,GAChC,IAAImG,EAAaF,GAAmB/rE,OAChCsb,EAAcrI,EAAIqI,YAClB0C,EAAQ+mD,GAAWzpD,IAAgBA,EAAYvf,WAAaioE,EAG5Dp9D,EAAO,cAGX,IAFI4+D,EAAKvyD,EAAKrM,KAAU+Y,EAASmmD,EAAOl/D,IAAOk/D,EAAMj2D,KAAKjJ,GAEnDqlE,MACLrlE,EAAOmlE,GAAmBE,MACdh5D,GAAOA,EAAIrM,KAAUoX,EAAMpX,KAAU+Y,EAASmmD,EAAOl/D,IAC/Dk/D,EAAMj2D,KAAKjJ,GAOV,SAAShG,GAAKqS,GACnB,IAAKzW,GAASyW,GAAM,MAAO,GAC3B,GAAIkxD,EAAY,OAAOA,EAAWlxD,GAClC,IAAI6yD,EAAQ,GACZ,IAAK,IAAIpqE,KAAOuX,EAASuyD,EAAKvyD,EAAKvX,IAAMoqE,EAAMj2D,KAAKnU,GAGpD,OADImwE,IAAYG,GAAoB/4D,EAAK6yD,GAClCA,EAIF,SAASoG,GAAQj5D,GACtB,IAAKzW,GAASyW,GAAM,MAAO,GAC3B,IAAI6yD,EAAQ,GACZ,IAAK,IAAIpqE,KAAOuX,EAAK6yD,EAAMj2D,KAAKnU,GAGhC,OADImwE,IAAYG,GAAoB/4D,EAAK6yD,GAClCA,EAIF,SAAS/8D,GAAOkK,GAIrB,IAHA,IAAI6yD,EAAQllE,GAAKqS,GACbjT,EAAS8lE,EAAM9lE,OACf+I,EAAS1C,MAAMrG,GACV7F,EAAI,EAAGA,EAAI6F,EAAQ7F,IAC1B4O,EAAO5O,GAAK8Y,EAAI6yD,EAAM3rE,IAExB,OAAO4O,EAKF,SAASojE,GAAUl5D,EAAKgyD,EAAUxmD,GACvCwmD,EAAWE,EAAGF,EAAUxmD,GAIxB,IAHA,IAAIqnD,EAAQllE,GAAKqS,GACbjT,EAAS8lE,EAAM9lE,OACf+lE,EAAU,GACL1hE,EAAQ,EAAGA,EAAQrE,EAAQqE,IAAS,CAC3C,IAAI2hE,EAAaF,EAAMzhE,GACvB0hE,EAAQC,GAAcf,EAAShyD,EAAI+yD,GAAaA,EAAY/yD,GAE9D,OAAO8yD,EAKF,SAASqG,GAAMn5D,GAIpB,IAHA,IAAI6yD,EAAQllE,GAAKqS,GACbjT,EAAS8lE,EAAM9lE,OACfosE,EAAQ/lE,MAAMrG,GACT7F,EAAI,EAAGA,EAAI6F,EAAQ7F,IAC1BiyE,EAAMjyE,GAAK,CAAC2rE,EAAM3rE,GAAI8Y,EAAI6yD,EAAM3rE,KAElC,OAAOiyE,EAIF,SAAS5gC,GAAOv4B,GAGrB,IAFA,IAAI1V,EAAS,GACTuoE,EAAQllE,GAAKqS,GACR9Y,EAAI,EAAG6F,EAAS8lE,EAAM9lE,OAAQ7F,EAAI6F,EAAQ7F,IACjDoD,EAAO0V,EAAI6yD,EAAM3rE,KAAO2rE,EAAM3rE,GAEhC,OAAOoD,EAIF,SAAS8uE,GAAUp5D,GACxB,IAAIq5D,EAAQ,GACZ,IAAK,IAAI5wE,KAAOuX,EACV8xD,GAAW9xD,EAAIvX,KAAO4wE,EAAMz8D,KAAKnU,GAEvC,OAAO4wE,EAAM7rC,OAKf,SAAS8rC,GAAeC,EAAUn2D,GAChC,OAAO,SAASpD,GACd,IAAIjT,EAASjB,UAAUiB,OAEvB,GADIqW,IAAUpD,EAAMpY,OAAOoY,IACvBjT,EAAS,GAAY,MAAPiT,EAAa,OAAOA,EACtC,IAAK,IAAI5O,EAAQ,EAAGA,EAAQrE,EAAQqE,IAIlC,IAHA,IAAIooE,EAAS1tE,UAAUsF,GACnByhE,EAAQ0G,EAASC,GACjBryE,EAAI0rE,EAAM9lE,OACL7F,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CAC1B,IAAIuB,EAAMoqE,EAAM3rE,GACXkc,QAAyB,IAAbpD,EAAIvX,KAAiBuX,EAAIvX,GAAO+wE,EAAO/wE,IAG5D,OAAOuX,GAKJ,IAAInQ,GAASypE,GAAeL,IAIxBQ,GAAYH,GAAe3rE,IAI/B,SAAS2lE,GAAQtzD,EAAKozD,EAAW5nD,GACtC4nD,EAAYlB,EAAGkB,EAAW5nD,GAE1B,IADA,IAAuB/iB,EAAnBoqE,EAAQllE,GAAKqS,GACR9Y,EAAI,EAAG6F,EAAS8lE,EAAM9lE,OAAQ7F,EAAI6F,EAAQ7F,IAEjD,GAAIksE,EAAUpzD,EADdvX,EAAMoqE,EAAM3rE,IACYuB,EAAKuX,GAAM,OAAOvX,EAK9C,SAASixE,GAASvxE,EAAOM,EAAKuX,GAC5B,OAAOvX,KAAOuX,EAIT,IAAI25D,GAAOxH,GAAc,SAASnyD,EAAK6yD,GAC5C,IAAIvoE,EAAS,GAAI0nE,EAAWa,EAAM,GAClC,GAAW,MAAP7yD,EAAa,OAAO1V,EACpBwnE,GAAWE,IACTa,EAAM9lE,OAAS,IAAGilE,EAAWP,EAAWO,EAAUa,EAAM,KAC5DA,EAAQoG,GAAQj5D,KAEhBgyD,EAAW0H,GACX7G,EAAQwC,GAASxC,GAAO,GAAO,GAC/B7yD,EAAMpY,OAAOoY,IAEf,IAAK,IAAI9Y,EAAI,EAAG6F,EAAS8lE,EAAM9lE,OAAQ7F,EAAI6F,EAAQ7F,IAAK,CACtD,IAAIuB,EAAMoqE,EAAM3rE,GACZiB,EAAQ6X,EAAIvX,GACZupE,EAAS7pE,EAAOM,EAAKuX,KAAM1V,EAAO7B,GAAON,GAE/C,OAAOmC,KAIEsvE,GAAOzH,GAAc,SAASnyD,EAAK6yD,GAC5C,IAAyBrnD,EAArBwmD,EAAWa,EAAM,GAUrB,OATIf,GAAWE,IACbA,EAAWwB,GAAOxB,GACda,EAAM9lE,OAAS,IAAGye,EAAUqnD,EAAM,MAEtCA,EAAQ55D,EAAIo8D,GAASxC,GAAO,GAAO,GAAQ7b,QAC3Cgb,EAAW,SAAS7pE,EAAOM,GACzB,OAAQikB,EAASmmD,EAAOpqE,KAGrBkxE,GAAK35D,EAAKgyD,EAAUxmD,MAIlBpI,GAAWk2D,GAAeL,IAAS,GAKvC,SAASzwE,GAAOM,EAAW6mB,GAChC,IAAIrlB,EAAS+nE,EAAWvpE,GAExB,OADI6mB,GAAO8pD,GAAUnvE,EAAQqlB,GACtBrlB,EAIF,SAAS+pE,GAAMr0D,GACpB,OAAKzW,GAASyW,GACP3M,GAAQ2M,GAAOA,EAAIlP,QAAUjB,GAAO,GAAImQ,GADpBA,EAOtB,SAAS65D,GAAI75D,EAAK85D,GAEvB,OADAA,EAAY95D,GACLA,EAIF,SAAS+5D,GAAQnxE,EAAQ6M,GAC9B,IAAIo9D,EAAQllE,GAAK8H,GAAQ1I,EAAS8lE,EAAM9lE,OACxC,GAAc,MAAVnE,EAAgB,OAAQmE,EAE5B,IADA,IAAIiT,EAAMpY,OAAOgB,GACR1B,EAAI,EAAGA,EAAI6F,EAAQ7F,IAAK,CAC/B,IAAIuB,EAAMoqE,EAAM3rE,GAChB,GAAIuO,EAAMhN,KAASuX,EAAIvX,MAAUA,KAAOuX,GAAM,OAAO,EAEvD,OAAO,EAKT,SAASmQ,GAAGtE,EAAG4hB,EAAGusC,EAAQC,GAGxB,GAAIpuD,IAAM4hB,EAAG,OAAa,IAAN5hB,GAAW,EAAIA,GAAM,EAAI4hB,EAE7C,GAAS,MAAL5hB,GAAkB,MAAL4hB,EAAW,OAAO,EAEnC,GAAI5hB,GAAMA,EAAG,OAAO4hB,GAAMA,EAE1B,IAAIxsB,EAAO,EAAO4K,GAClB,OAAa,aAAT5K,GAAgC,WAATA,GAAiC,UAAZ,EAAOwsB,KAKzD,SAAgB5hB,EAAG4hB,EAAGusC,EAAQC,GAExBpuD,aAAa4a,IAAG5a,EAAIA,EAAE0lD,UACtB9jC,aAAahH,IAAGgH,EAAIA,EAAE8jC,UAE1B,IAAI9kD,EAAYjb,EAASnK,KAAKwkB,GAC9B,GAAIY,IAAcjb,EAASnK,KAAKomC,GAAI,OAAO,EAC3C,OAAQhhB,GAEN,IAAK,kBAEL,IAAK,kBAGH,MAAO,GAAKZ,GAAM,GAAK4hB,EACzB,IAAK,kBAGH,OAAK5hB,IAAOA,GAAW4hB,IAAOA,EAEhB,IAAN5hB,EAAU,GAAKA,GAAM,EAAI4hB,GAAK5hB,IAAO4hB,EAC/C,IAAK,gBACL,IAAK,mBAIH,OAAQ5hB,IAAO4hB,EACjB,IAAK,kBACH,OAAOujC,EAAYrgE,QAAQtJ,KAAKwkB,KAAOmlD,EAAYrgE,QAAQtJ,KAAKomC,GAGpE,IAAIysC,EAA0B,mBAAdztD,EAChB,IAAKytD,EAAW,CACd,GAAgB,UAAZ,EAAOruD,IAA6B,UAAZ,EAAO4hB,GAAe,OAAO,EAIzD,IAAI0sC,EAAQtuD,EAAExD,YAAa+xD,EAAQ3sC,EAAEplB,YACrC,GAAI8xD,IAAUC,KAAWtI,GAAWqI,IAAUA,aAAiBA,GACtCrI,GAAWsI,IAAUA,aAAiBA,IACvC,gBAAiBvuD,GAAK,gBAAiB4hB,EAC7D,OAAO,EASXwsC,EAASA,GAAU,GACnB,IAAIltE,GAFJitE,EAASA,GAAU,IAECjtE,OACpB,KAAOA,KAGL,GAAIitE,EAAOjtE,KAAY8e,EAAG,OAAOouD,EAAOltE,KAAY0gC,EAQtD,GAJAusC,EAAOp9D,KAAKiP,GACZouD,EAAOr9D,KAAK6wB,GAGRysC,EAAW,CAGb,IADAntE,EAAS8e,EAAE9e,UACI0gC,EAAE1gC,OAAQ,OAAO,EAEhC,KAAOA,KACL,IAAKojB,GAAGtE,EAAE9e,GAAS0gC,EAAE1gC,GAASitE,EAAQC,GAAS,OAAO,MAEnD,CAEL,IAAqBxxE,EAAjBoqE,EAAQllE,GAAKke,GAGjB,GAFA9e,EAAS8lE,EAAM9lE,OAEXY,GAAK8/B,GAAG1gC,SAAWA,EAAQ,OAAO,EACtC,KAAOA,KAGL,GADAtE,EAAMoqE,EAAM9lE,IACNwlE,EAAK9kC,EAAGhlC,KAAQ0nB,GAAGtE,EAAEpjB,GAAMglC,EAAEhlC,GAAMuxE,EAAQC,GAAU,OAAO,EAMtE,OAFAD,EAAOxyD,MACPyyD,EAAOzyD,OACA,EA1FA6yD,CAAOxuD,EAAG4hB,EAAGusC,EAAQC,GA8FvB,SAASpyD,GAAQgE,EAAG4hB,GACzB,OAAOtd,GAAGtE,EAAG4hB,GAKR,SAAS6sC,GAAQt6D,GACtB,OAAW,MAAPA,IACA4yD,EAAY5yD,KAAS3M,GAAQ2M,IAAQi1D,GAASj1D,IAAQw1D,GAAYx1D,IAA6B,IAAfA,EAAIjT,OAC5D,IAArBY,GAAKqS,GAAKjT,QAIZ,SAASwtE,GAAUv6D,GACxB,SAAUA,GAAwB,IAAjBA,EAAI8L,UAIvB,SAAS0uD,GAAU/yE,GACjB,OAAO,SAASuY,GACd,OAAOxO,EAASnK,KAAK2Y,KAAS,WAAavY,EAAO,KAM/C,IAAI4L,GAAU49D,GAAiBuJ,GAAU,SAGzC,SAASjxE,GAASyW,GACvB,IAAIiB,EAAO,EAAOjB,GAClB,MAAgB,aAATiB,GAAgC,WAATA,KAAuBjB,EAIhD,IAAIw1D,GAAcgF,GAAU,aACxB1I,GAAa0I,GAAU,YACvBvF,GAAWuF,GAAU,UACrBC,GAAWD,GAAU,UACrBE,GAASF,GAAU,QACnBG,GAAWH,GAAU,UACrBI,GAAUJ,GAAU,SACpBnqE,GAAWmqE,GAAU,UACrBK,GAAQL,GAAU,OAClBM,GAAYN,GAAU,WACtBO,GAAQP,GAAU,OAClBQ,GAAYR,GAAU,YAIhC,WACMhF,GAAY1pE,aACf0pE,GAAc,SAASx1D,GACrB,OAAOuyD,EAAKvyD,EAAK,YAHtB,GAUD,IAAIi7D,GAAWhrE,EAAK+D,UAAY/D,EAAK+D,SAASiV,WAQvC,SAAS6gB,GAAS9pB,GACvB,OAAQ3P,GAAS2P,IAAQqxD,EAAUrxD,KAASoxD,EAAOliD,WAAWlP,IAIzD,SAASokB,GAAMpkB,GACpB,OAAOy6D,GAASz6D,IAAQoxD,EAAOpxD,GAI1B,SAAS+1D,GAAU/1D,GACxB,OAAe,IAARA,IAAwB,IAARA,GAAwC,qBAAvBxO,EAASnK,KAAK2Y,GAIjD,SAASk7D,GAAOl7D,GACrB,OAAe,OAARA,EAIF,SAASm7D,GAAYn7D,GAC1B,YAAe,IAARA,EAKF,SAASgsD,GAAIhsD,EAAKE,GACvB,IAAK7M,GAAQ6M,GACX,OAAOqyD,EAAKvyD,EAAKE,GAGnB,IADA,IAAInT,EAASmT,EAAKnT,OACT7F,EAAI,EAAGA,EAAI6F,EAAQ7F,IAAK,CAC/B,IAAIuB,EAAMyX,EAAKhZ,GACf,GAAW,MAAP8Y,IAAgBjX,EAAe1B,KAAK2Y,EAAKvX,GAC3C,OAAO,EAETuX,EAAMA,EAAIvX,GAEZ,QAASsE,EAOJ,SAAS8kE,GAAS1pE,GACvB,OAAOA,EAIF,SAASizE,GAASjzE,GACvB,OAAO,WACL,OAAOA,GAIJ,SAASkzE,MAIT,SAASxyE,GAASqX,GACvB,OAAK7M,GAAQ6M,GAGN,SAASF,GACd,OAAOwyD,EAAQxyD,EAAKE,IAHboyD,EAAgBpyD,GAQpB,SAASo7D,GAAWt7D,GACzB,OAAW,MAAPA,EACK,aAEF,SAASE,GACd,OAAQ7M,GAAQ6M,GAAoBsyD,EAAQxyD,EAAKE,GAAzBF,EAAIE,IAMzB,SAAS6xD,GAAQt8D,GAEtB,OADAA,EAAQgkE,GAAU,GAAIhkE,GACf,SAASuK,GACd,OAAO+5D,GAAQ/5D,EAAKvK,IAMjB,SAASijE,GAAM/vE,EAAGqpE,EAAUxmD,GACjC,IAAI+vD,EAAQnoE,MAAMxJ,KAAKC,IAAI,EAAGlB,IAC9BqpE,EAAWP,EAAWO,EAAUxmD,EAAS,GACzC,IAAK,IAAItkB,EAAI,EAAGA,EAAIyB,EAAGzB,IAAKq0E,EAAMr0E,GAAK8qE,EAAS9qE,GAChD,OAAOq0E,EAIF,SAASlxB,GAAOtgD,EAAKF,GAK1B,OAJW,MAAPA,IACFA,EAAME,EACNA,EAAM,GAEDA,EAAMH,KAAKgF,MAAMhF,KAAKygD,UAAYxgD,EAAME,EAAM,IA9GH,WAAJ,oBAATyxE,UAAS,cAATA,aAA4C,mBAAZP,KACrEnJ,GAAa,SAAS9xD,GACpB,MAAqB,mBAAPA,IAAqB,IAgHhC,IAAIvW,GAAM0D,KAAK1D,KAAO,WAC3B,OAAO,IAAI0D,MAAOC,WAIhBquE,GAAY,CACd,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,SACL,IAAK,UAEHC,GAAcnjC,GAAOkjC,IAGzB,SAASE,GAAc1iE,GACrB,IAAI2iE,EAAU,SAAS9lD,GACrB,OAAO7c,EAAI6c,IAGT0jD,EAAS,MAAQ7rE,GAAKsL,GAAK3F,KAAK,KAAO,IACvCuoE,EAAaC,OAAOtC,GACpBuC,EAAgBD,OAAOtC,EAAQ,KACnC,OAAO,SAASvoE,GAEd,OADAA,EAAmB,MAAVA,EAAiB,GAAK,GAAKA,EAC7B4qE,EAAWhrE,KAAKI,GAAUA,EAAOC,QAAQ6qE,EAAeH,GAAW3qE,GAGvE,IAAI+qE,GAASL,GAAcF,IACvBQ,GAAWN,GAAcD,IAK7B,SAASpxE,GAAO0V,EAAKE,EAAMg8D,GAC3B7oE,GAAQ6M,KAAOA,EAAO,CAACA,IAC5B,IAAInT,EAASmT,EAAKnT,OAClB,IAAKA,EACH,OAAO+kE,GAAWoK,GAAYA,EAAS70E,KAAK2Y,GAAOk8D,EAErD,IAAK,IAAIh1E,EAAI,EAAGA,EAAI6F,EAAQ7F,IAAK,CAC/B,IAAIyM,EAAc,MAAPqM,OAAc,EAASA,EAAIE,EAAKhZ,SAC9B,IAATyM,IACFA,EAAOuoE,EACPh1E,EAAI6F,GAENiT,EAAM8xD,GAAWn+D,GAAQA,EAAKtM,KAAK2Y,GAAOrM,EAE5C,OAAOqM,EAKT,IAAIm8D,GAAY,EACT,SAASC,GAASpuC,GACvB,IAAIz/B,IAAO4tE,GAAY,GACvB,OAAOnuC,EAASA,EAASz/B,EAAKA,EAKzB,IAAI8tE,GAAmB51C,EAAE41C,iBAAmB,CACjDC,SAAU,kBACV/0B,YAAa,mBACby0B,OAAQ,oBAMNO,GAAU,OAIVC,GAAU,CACZ,IAAK,IACL,KAAM,KACN,KAAM,IACN,KAAM,IACN,SAAU,QACV,SAAU,SAGRC,GAAe,4BAEfC,GAAa,SAAS5mD,GACxB,MAAO,KAAO0mD,GAAQ1mD,IAOjB,SAAS6mD,GAAS5tE,EAAM6U,EAAUg5D,IAClCh5D,GAAYg5D,IAAah5D,EAAWg5D,GACzCh5D,EAAWR,GAAS,GAAIQ,EAAU6iB,EAAE41C,kBAGpC,IAiCIv9B,EAjCAizB,EAAU+J,OAAO,EAClBl4D,EAASo4D,QAAUO,IAAS/C,QAC5B51D,EAAS2jC,aAAeg1B,IAAS/C,QACjC51D,EAAS04D,UAAYC,IAAS/C,QAC/BlmE,KAAK,KAAO,KAAM,KAGhBlC,EAAQ,EACRooE,EAAS,SACbzqE,EAAKmC,QAAQ6gE,GAAS,SAASj8C,EAAOkmD,EAAQz0B,EAAa+0B,EAAUjoE,GAanE,OAZAmlE,GAAUzqE,EAAK+B,MAAMM,EAAOiD,GAAQnD,QAAQurE,GAAcC,IAC1DtrE,EAAQiD,EAASyhB,EAAM/oB,OAEnBivE,EACFxC,GAAU,cAAgBwC,EAAS,iCAC1Bz0B,EACTiyB,GAAU,cAAgBjyB,EAAc,uBAC/B+0B,IACT9C,GAAU,OAAS8C,EAAW,YAIzBxmD,KAET0jD,GAAU,OAGL51D,EAASi5D,WAAUrD,EAAS,mBAAqBA,EAAS,OAE/DA,EAAS,4FAEPA,EAAS,gBAGX,IACE16B,EAAS,IAAI11C,SAASwa,EAASi5D,UAAY,MAAO,IAAKrD,GACvD,MAAOnwE,GAEP,MADAA,EAAEmwE,OAASA,EACLnwE,EAGR,IAAIszE,EAAW,SAASpwE,GACtB,OAAOuyC,EAAOz3C,KAAK8B,KAAMoD,EAAMk6B,IAI7Bq2C,EAAWl5D,EAASi5D,UAAY,MAGpC,OAFAF,EAASnD,OAAS,YAAcsD,EAAW,OAAStD,EAAS,IAEtDmD,EAIF,SAASI,GAAM/8D,GACpB,IAAIg9D,EAAWv2C,EAAEzmB,GAEjB,OADAg9D,EAASC,QAAS,EACXD,EAUT,SAASE,GAAYF,EAAUh9D,GAC7B,OAAOg9D,EAASC,OAASx2C,EAAEzmB,GAAK+8D,QAAU/8D,EAIrC,SAAS40C,GAAM50C,GASpB,OARArD,EAAKy8D,GAAUp5D,IAAM,SAASvY,GAC5B,IAAIuC,EAAOy8B,EAAEh/B,GAAQuY,EAAIvY,GACzBg/B,EAAE39B,UAAUrB,GAAQ,WAClB,IAAIuD,EAAO,CAAC7B,KAAKooE,UAEjB,OADA30D,EAAKzR,MAAMH,EAAMc,WACVoxE,GAAY/zE,KAAMa,EAAKmB,MAAMs7B,EAAGz7B,QAGpCy7B,EAIT9pB,EAAK,CAAC,MAAO,OAAQ,UAAW,QAAS,OAAQ,SAAU,YAAY,SAASlV,GAC9E,IAAImR,EAASk4D,EAAWrpE,GACxBg/B,EAAE39B,UAAUrB,GAAQ,WAClB,IAAIuY,EAAM7W,KAAKooE,SAGf,OAFA34D,EAAOzN,MAAM6U,EAAKlU,WACJ,UAATrE,GAA6B,WAATA,GAAqC,IAAfuY,EAAIjT,eAAqBiT,EAAI,GACrEk9D,GAAY/zE,KAAM6W,OAK7BrD,EAAK,CAAC,SAAU,OAAQ,UAAU,SAASlV,GACzC,IAAImR,EAASk4D,EAAWrpE,GACxBg/B,EAAE39B,UAAUrB,GAAQ,WAClB,OAAOy1E,GAAY/zE,KAAMyP,EAAOzN,MAAMhC,KAAKooE,SAAUzlE,gBAKzD26B,EAAE39B,UAAUX,MAAQ,WAClB,OAAOgB,KAAKooE,UAKd9qC,EAAE39B,UAAU6H,QAAU81B,EAAE39B,UAAUq0E,OAAS12C,EAAE39B,UAAUX,MAEvDs+B,EAAE39B,UAAU0I,SAAW,WACrB,OAAOwlD,OAAO7tD,KAAKooE,Y,iDC1oDrB,yvCAIA,IAAI6L,EAAe5zE,EAAQ,IACvB6zE,EAAU7zE,EAAQ,IAClB80B,EAAc90B,EAAQ,GACtBopD,EAAQppD,EAAQ,GAChB6uB,EAAO7uB,EAAQ,IACf8zE,EAAY9zE,EAAQ,IACpBm/D,EAAkBn/D,EAAQ,IAC1BkjE,EAAiBljE,EAAQ,IACzBi9B,EAAIj9B,EAAQ,IAEZ+zE,EAAe,EACfC,GAAkB,EAsCtB,SAASC,IACL,IAAIC,EAAiBpxE,EAAE,wBAAwBsJ,KAAK,WAChD+nE,EAAmBD,EAAiB9zE,KAAKwgD,MAAuB,IAAjBszB,GAAwB,EAC3EpxE,EAAE,oBAAoBsJ,KAAK,uBAAwB+nE,GAC/Cr0E,OAAOs0E,QAAUt0E,OAAOs0E,OAAOC,iBAC/Bv0E,OAAOs0E,OAAOC,gBAAgBC,UA+NtC,SAASC,EAAyBC,EAAiBC,GAC/C,IAAIC,EAA0BD,EAAyB1uE,KAAKyuE,GAE5D,GAAIE,EAAwBnxE,OAAQ,CAChCmxE,EAAwBpU,SAAS,QAEjC,IAAIqU,EAAe7xE,EAAE,mBAAmB+Y,SAExC/Y,EAAE,cAAcgI,QAAQ,CACpBC,UAAW2pE,EAAwBtqE,QAAQ,uBAAuBS,SAASG,IAAM2pE,EAAe,IACjG,MAOX,SAASC,KACsB,IAAIhB,GACZ9tE,OAMvB,IAAI+uE,EAAmB,WACnB/xE,EAAE,kBAAkBmD,SAEpBnD,EAAE,mBAAmBmD,SACrBnD,EAAE,QAAQyG,YAAY,cAAc2c,IAAI,gBAAiB,IACzDpjB,EAAEi8D,eACFj8D,EAAEhD,QAAQ0D,QAAQ,WAOlBsxE,EAAqB,WACrB,IACIC,EAAc,CACd96D,cAAe,iBAFJ6a,EAAY81B,aAKvBmqB,EAAY/6D,cAAgB,2CAEhC,IAAIg7D,EAAc5rB,EAAMzvC,kBAAkB,GAAIo7D,GAC1CE,EAASnyE,EAAEkyE,GAAa1jE,QAI5B,OAHA2jE,EAAOxqE,GAAG,mBAAmB,WACzBoqE,OAEGI,GAQPC,EAAkB,SAACC,EAAcF,GACjC,GAAKE,EAAL,CAIKF,IACDA,EAASH,KAGbG,EAAO3jE,MAAM,QACbxO,EAAE8M,UAAUS,QAEZ,IAAI4yD,EAAiB,SAAC1+D,EAAM6wE,GAOxB,GANAH,EAAOlvE,KAAK,eAAexB,KAAKA,GAChC46D,EAAgBr5D,OAChBo9D,IACIpjE,OAAOu1E,KACPv1E,OAAOu1E,IAAI,QAAS,gBAEpBF,EAAa9oE,QAAQ,iBAAmB,EAAG,CAC3C,IAAIipE,EAAgBL,EAAOlvE,KAAK,uBAC5BwvE,EAAa,gKAAH,OAEoDH,EAAQ,6KAGc,IAAG,+HACH,IAAG,uKAM3FE,EAAc/wE,KAAKgxE,GAEvBzB,EAAU/R,eAGdj/D,EAAEqM,KAAK,CACHtC,IAAKsoE,EACL/lE,OAAQ,MACR6B,SAAU,OACV5B,QAAS,SAACtM,GACDkyE,EAAO,GAAG9R,cAMXF,EAAelgE,EAAKoO,iBAAkBpO,EAAKqyE,UAJ3CH,EAAOxqE,GAAG,kBAAkB,WACxBw4D,EAAelgE,EAAKoO,iBAAkBpO,EAAKqyE,cAMvDhwC,SAAU,WACNtiC,EAAE8M,UAAUC,OACZ/M,EAAEo8D,iBAENj1D,MAAO,WACH4qE,SAYZ,SAASW,EAA2B5c,EAAgBZ,EAAeyd,EAAsBC,GACrF,IAAMC,EAAiB/c,EAAexuD,QAAQ,wBAAwBrH,KAAK,sBAErDrB,IAAlBs2D,IACIY,EAAepwD,SAAS,iBACxBitE,EAAqBlwE,KAAKyyD,EAAgB,IAAM2d,GAAgB3rE,SAAS,eACrE0rE,EACAA,EAAWtpE,KAAK,gBAAiBupE,GAEjC/c,EAAexsD,KAAK,gBAAiBupE,KAGzCF,EAAqBlwE,KAAKyyD,GAAezuD,YAAY,eACjDmsE,EACAA,EAAWtpE,KAAK,gBAAiB,IAEjCwsD,EAAexsD,KAAK,gBAAiB,MAiJrD3O,EAAOD,QAAU,CAmBbsI,KAAM,WACF,IA1FE8vE,EAEAttC,EAwFI38B,EAAoB7I,EAAE,mBACtB+yE,EAA2B/yE,EAAE,iEAC7B80D,EAAsB90D,EAAE,iDACxBy4D,EAAuBz4D,EAAE,iDACzBgzE,EAAcva,EAAqBnxD,QAAQ,iBAAiBrE,KAAK,wBACjEgwE,EAAgBxa,EAAqBx1D,KAAK,gBAAgBqG,KAAK,SAC/D4pE,EAAgB5sB,EAAM1wC,iBAAiB5Y,OAAOsV,SAASW,QAQ7D,GAxGE6/D,EAAc9yE,EAAE,qBAAqB,GAErCwlC,EAAW,IAAI0C,kBAAiB,SAAUirC,GAAe,IACvB,EADuB,IACpCA,GAAa,IAApC,IAAK,EAAL,qBACI,GAAsB,cADP,QACFx+D,MACL3U,EAAE,qBAAqBiD,KAAK,SAASxC,QAAU,EAAG,CAClD,IAAI2yE,EAAmBpzE,EAAE,oBACrBozE,EAAiB3yE,SACjB2yE,EAAiB3sE,YAAY,UAC7B++B,EAASmD,eAIxB,kCAGDmqC,GACAttC,EAASsC,QAAQgrC,EAhBN,CAAElnE,YAAY,EAAM08B,WAAW,EAAM+vB,SAAS,IAmGrD6a,GAAiBA,EAAcG,UAAqD,MAAzCH,EAAcG,SAASl5D,eAClEi4D,EAAgBpyE,EAAE,uBAAuBsJ,KAAK,aAAc,IAG5DT,EAAkB5I,KAAK,SAAW4I,EAAkB5I,KAAK,cACzD,GAAI8rB,EAAK8nC,uBAAwB,CAC7B,IAAMyf,EAAkBtzE,EAAE,mCAAmC+K,QACvDylD,EAAsB8iB,EAAgBhsE,QAAQ,iBAAiBrH,KAAK,QAE1E8rB,EAAK7f,gBAAgBonE,EAAgBrzE,KAAK,YAAa4I,EAAmB2nD,QACnEuiB,EAAyBtyE,SAAWq0D,EAAoBr0D,QAC/DsrB,EAAK7f,gBAAgB6mE,EAAyB9yE,KAAK,YAAa4I,EAAmB,aAK3F,GAAIA,EAAkB5I,KAAK,wBAAyB,CAChD,IAAIszE,EAAiBvzE,EAAE,6BAA6BC,KAAK,YACzD8rB,EAAK7f,gBAAgBqnE,EAAgB1qE,EAAmB,aAG5DkjB,EAAKy+B,uBAAuB3hD,GAC5B6pE,EAA2B5d,EAAqBme,EAAeD,EAAava,GAC5E0Y,IAGAplD,EAAK8gC,4BAET2mB,YAxGJ,WACI,IAAIC,EACAC,EAAc12E,OAAO22E,QAOzB,SAAS12E,EAAS+W,GACd,MAAwB,WAAjB,EAAOA,IAAgC,OAAVA,IAAmBlN,MAAMC,QAAQiN,GAGzE1Y,OAAOC,eAAeyB,OAAQ,UAAW,CACrCvB,IAAK,WACD,QAAoC,IAAzBg4E,EAAsC,CAC7C,IAAMG,EAAe32E,EAASy2E,GAAeA,EAAc,GAC3DE,EAAaC,IAAM52E,EAAS22E,EAAaC,KAAOD,EAAaC,IAAM,GAEnEJ,EAAuBG,EAG3B,OAAOH,GAEX90D,IAAK,SAAU3K,GACX0/D,EAAcz2E,EAASy2E,GAAeA,EAAc,GACpD,IAAMI,EAAe72E,EAAS+W,GAASA,EAAQ,GACzC4/D,EAAet4E,OAAO0xB,OAAO,GAAI0mD,EAAaI,GACpDF,EAAaC,IAAM52E,EAAS22E,EAAaC,KAAOD,EAAaC,IAAM,GAEnEH,EAAcE,EACdH,EAAuBG,MA0E/BG,gBAjmBJ,WACI,IAAIC,EAAgBh0E,EAAE,2BAEtB,GAA6B,IAAzBg0E,EAAcvzE,SAAgBuxB,EAAY61B,YAA9C,CAIA,IAAIosB,EAAwBD,EAAcjsE,SAASG,IAEnDlI,EAAEhD,QACG2kB,IAAI,0BACJha,GAAG,yBAA0BwyB,EAAEwxC,UAAS,WACrC,IAAIuI,EAAsBF,EAAc/wE,KAAK,wBACzCkxE,EAAeH,EAAc/wE,KAAK,oBAClCjD,EAAEnD,MAAMoL,YAAcgsE,GACtBj0E,EAAE,QAAQkH,SAAS,uBACnBgtE,EAAoBhtE,SAAS,UAC7BitE,EAAa1tE,YAAY,4BACzBzG,EAAE,gCAAgCkH,SAAS,UAE3ClH,EAAE,QAAQyG,YAAY,uBACtBytE,EAAoBztE,YAAY,UAChC0tE,EAAajtE,SAAS,4BACtBlH,EAAE,gCAAgCyG,YAAY,WAEnD,QAykBP2tE,2BArjBJ,WACIp0E,EAAE,QAAQ2H,GAAG,wBAAwB,SAAU5K,EAAGkD,GAI9C,IAAI4I,EAAoB7I,EAAE,6BAA+BC,EAAKgC,GAAK,MAKnE4G,EAAkB5F,KAAK,+CAClB6G,QACArI,KAAKxB,EAAKo0E,gBAEXp0E,EAAKq0E,kBACLzrE,EAAkB5F,KAAK,wCAClBwD,YAAY,kBACjBoC,EAAkB5F,KAAK,iDAClB6G,QACArI,KAAKxB,EAAKq0E,mBAEfzrE,EAAkB5F,KAAK,wCAClBiE,SAAS,kBAGdjH,EAAKs0E,iBACL1rE,EAAkB5F,KAAK,oCAClBwD,YAAY,kBACjBoC,EAAkB5F,KAAK,6CAClB6G,QACArI,KAAKxB,EAAKs0E,kBAEf1rE,EAAkB5F,KAAK,oCAClBiE,SAAS,kBAMlB,IAAIstE,EAA0Bx0E,EAAE,+CAE5Bw0E,EAAwB/zE,OAAS,IAC7BR,EAAKw0E,0BACLD,EAAwB/tE,YAAY,UAEpC+tE,EAAwBttE,SAAS,WAOzCiqE,QAkgBJuD,YA3fJ,WACQ13E,OAAOsD,UAAUqwD,wBACjB3wD,EAAE,QAAQ2H,GAAG,2BAA2B,WACpC3H,EAAE8M,UAAUS,WAGhBvN,EAAE,QAAQ2H,GAAG,yDAAyD,WAClE3H,EAAE8M,UAAUS,YAqfpBonE,gBA7eJ,WACI30E,EAAE,QAAQ2H,GAAG,gCAAgC,SAAU5K,EAAGuG,GAClDtD,EAAE,iCAAiCS,QAK5BT,EAAE,uBAAuB6jB,GAAG,IAJnC7jB,EAAEsD,EAAS8I,WAAWnM,KAAK,MAAOqD,EAASrD,KAAKgJ,QAAQhH,IACxDjC,EAAEsD,EAAS8I,WAAWnJ,KAAK,eACtBhD,KAAK,MAAOqD,EAASrD,KAAKgJ,QAAQhH,IAClCQ,KAAKa,EAASrD,KAAKgJ,QAAQ4iD,YAOhC7rD,EAAE,eAAeC,KAAK,MAAOqD,EAASrD,KAAKgJ,QAAQhH,IAC9CQ,KAAKa,EAASrD,KAAKgJ,QAAQ4iD,UAChC7rD,EAAE,uCAAuCC,KAAK,MAAOqD,EAASrD,KAAKgJ,QAAQhH,SA+dnF2yE,gBAvdJ,WACI50E,EAAE,QAAQ2H,GAAG,2BAA2B,SAAU5K,EAAGuG,GAE7CA,EAAS2F,QAAQuB,eAAiBlH,EAAS2F,QAAQyI,WACnD1R,EAAE,kCAAkCqoD,OAGpCt8B,EAAK8nC,wBACL7zD,EAAE,oFAAoFsJ,KAAK,YAAY,GAM3G,IAAMurE,GAAoBvxE,EAAS2F,QAAQyI,YAAepO,EAAS2F,QAAQuB,eAAiB0mE,EAC5FlxE,EAAE,wDAAyDsD,EAASuF,mBAC/DS,KAAK,WAAYurE,GACjBpyE,KAAKa,EAAS2F,QAAQ+zD,YAEvB6X,IACA3D,GAAkB,GAGTlxE,EAAE,yBAAyB8O,UAAUq4D,OAAM,SAAUjhE,GAC9D,OAAOlG,EAAEkG,GAAMjG,KAAK,cAAgBD,EAAEkG,GAAMjG,KAAK,sBAIjDD,EAAE,kCAAkCozC,WA4b5CznC,mBApbJ,WACI3L,EAAE,QAAQ2H,GAAG,8BAA8B,SAAU5K,EAAGuG,GACpDtD,EAAE,mBAAoBsD,EAASuF,mBAC1B5I,KAAK,iBAAkBqD,EAAS2F,QAAQuB,cACxCvK,KAAK,YAAaqD,EAAS2F,QAAQyI,WAGxC,IAAMojE,EAA4B90E,EAAE,oBAAqBsD,EAASuF,mBAAmBnG,YAAY,UAAWY,EAAS3B,SAsCrH,GApCI2B,EAASkI,sBAAwBlI,EAASkI,qBAAqB/K,QAC/D6C,EAASkI,qBAAqB7E,SAAQ,SAAAhF,GAClCmzE,EAA0BjzE,MAAM,CAC5BC,QAASH,EAAQG,QACjBE,MAAOL,EAAQK,MACfy0D,aAAa,EACb1zD,WAAW,OAKvB/C,EAAE,8BAA+BsD,EAASuF,mBACrCiB,QACArI,KAAK6B,EAAS4uD,iBAEnBlyD,EAAE,iBAAmBsD,EAASktD,oBAAsB,OAAQltD,EAASuF,mBAAmBpC,YAAY,YAAYS,SAAS,UAEzHlH,EAAE,8BAA+BsD,EAASuF,mBAEtCvF,EAAS2F,QAAQmuD,WAAa9zD,EAAS2F,QAAQ8rE,UAC/C/0E,EAAE,wBAAyBsD,EAASuF,mBAAmBuqC,OACvDpzC,EAAE,sBAAuBsD,EAASuF,mBAAmBw/C,OACrDroD,EAAE,8BAA+BsD,EAASuF,mBAAmB3B,SAAS,wCAAwCmhD,OAC9GroD,EAAE,8BAA+BsD,EAASuF,mBAAmBw/C,OAC7DroD,EAAE,yBAA0BsD,EAASuF,mBAAmBH,IAAIpF,EAAS2F,QAAQhH,MAE7EjC,EAAE,wBAAyBsD,EAASuF,mBAAmBw/C,OACvDroD,EAAE,sBAAuBsD,EAASuF,mBAAmBuqC,OACrDpzC,EAAE,yBAA0BsD,EAASuF,mBAAmBH,IAAI,IAG3B,KAA7BpF,EAAS4uD,iBACTlyD,EAAE,8BAA+BsD,EAASuF,mBAAmBpC,YAAY,wCAAwC4hD,QAIrHroD,EAAE,wBAAwBS,OAAQ,CAIlC,IAAIu0E,EAAeh1E,EAAE,yBAAyB8O,UACzCq4D,OAAM,SAAUjhE,GAAQ,OAAOlG,EAAEkG,GAAMjG,KAAK,gBAE7Cg1E,EAAWj1E,EAAE,yBAAyB8O,UACrCq4D,OAAM,SAAUjhE,GAAQ,OAAOlG,EAAEkG,GAAMjG,KAAK,qBAEjDD,EAAE,wBACGC,KAAK,iBAAkBg1E,GACvBh1E,KAAK,YAAa+0E,GAEvBh1E,EAAE,0CAA0C8J,QAExCxG,EAASkI,sBAAwBlI,EAASkI,qBAAqB/K,QAC/D6C,EAASkI,qBAAqB7E,SAAQ,SAAAhF,GAClCmzE,EAA0BjzE,MAAM,CAC5BC,QAASH,EAAQG,QACjBE,MAAOL,EAAQK,MACfy0D,aAAa,EACb1zD,WAAW,OAK3B/C,EAAE,cAAcU,QAAQ,oBACxBV,EAAE,QAAQU,QAAQ,0BAA2B4C,OA4WjD4xE,kBAAmB,WACfl1E,EAAE0H,UAAUC,GAAG,QAAS,6BAA6B,SAAU5K,GAC3DA,EAAE8K,iBAEF4pE,EAAyB,6BADMzxE,EAAEnD,MAAMyK,QAAQ,wBAIvDwqE,YAAa,WACTA,IAEA9xE,EAAE0H,UAAUC,GAAG,yBAAyB,WACpCmqE,QAGRqD,YAAapE,EAAQ/tE,KACrBoyE,mBAAoB,WAChBp1E,EAAEhD,QAAQ2K,GAAG,QAAQ,WACjB3H,EAAE0H,UAAUC,GAAG,QAAS,uHAAuH,SAAU5K,GACrJA,EAAE8K,iBACF,IAAI8pE,EAA2B3xE,EAAEnD,MAAMyK,QAAQ,mBAC1CqqE,EAAyBlxE,SAC1BkxE,EAA2B3xE,EAAE,oBAEjCyxE,EAAyB,6BAA8BE,MAG3D,IAAI0D,EAA2B/uB,EAAM1wC,iBAAiB5Y,OAAOsV,SAASW,QAClEoiE,GAA4BA,EAAyBC,QAA4D,SAAlDD,EAAyBC,OAAOn7D,eAC/Fs3D,EAAyB,6BAA8BzxE,EAAE,wBAIrEu1E,yBAA0B,WACtBv1E,EAAE,QACG2hB,IAAI,QAAS,0BACbha,GAAG,QAAS,0BAA0B,SAAC5K,GACpCA,EAAE8K,iBACF,IAAM8/C,EAAQ3nD,EAAEjD,EAAEiT,eACZwlE,EAAa7tB,EAAM1nD,KAAK,iBACxBw1E,EAAe9tB,EAAM1nD,KAAK,mBAChCD,EAAEwO,MAAM,CACJ9M,MAAO8zE,EACP1zE,QAAS2zE,EACTx+D,eAAgB,+BAIhCy+D,qBAAsB,WAClB11E,EAAE,QACG2hB,IAAI,QAAS,uBACbha,GAAG,QAAS,uBAAuB,SAAC5K,GACjCA,EAAE8K,iBACF,IAAI8/C,EAAQ3nD,EAAEjD,EAAEiT,eACZmiE,EAASH,IACbI,EAAgBzqB,EAAM1nD,KAAK,QAASkyE,OAGhDwD,kBAlQJ,WAEI31E,EAAE,uBAAuB2H,GAAG,kBAAmB,2DAA2D,SAAU5K,GAChH,IAGIm4D,EAHEK,EAAiBv1D,EAAEjD,EAAEiT,eACrB4lE,EAAWrgB,EAAejuD,QAAQ,iBAAiBrH,KAAK,QACxDyJ,EAAa6rD,EAAejuD,QAAQ,iBAAiBrE,KAAK,wBAGhE,GAAiB,UAAb2yE,EACA1gB,EAAgBK,EAAetyD,KAAK,gBAAgBqG,KAAK,aACtD,CACH,IAAMmvD,EAAuBz4D,EAAE,iDACzBgzE,EAAcva,EAAqBnxD,QAAQ,iBAAiBrE,KAAK,wBACjEgwE,EAAgBxa,EAAqBx1D,KAAK,gBAAgBqG,KAAK,SACrE4rD,EAAgBK,EAAet1D,KAAK,cAGpCyyE,EAA2Bnd,EAAgB0d,EAAeD,EAAava,GAG3Eia,EAA2Bnd,EAAgBL,EAAexrD,MAI9D1J,EAAE0H,UAAUC,GAAG,mBAAoB,yEAAyE,SAAU5K,EAAG2M,EAAYD,GACjI,IAAMopE,EAAiBnpE,EAAWpC,QAAQ,wBAAwBrH,KAAK,iBACjE41E,EAAsBnsE,EAAWpC,QAAQ,iBAAiBrE,KAAK,wBACrE4yE,EAAoBpzE,KAAKiH,EAAWzJ,KAAK,eACpCwJ,EAAUQ,YAIX4rE,EAAoBpvE,YAAY,eAAehE,KAAKiH,EAAWzJ,KAAK,eACpEyJ,EAAWJ,KAAK,gBAAiB,MAJjCusE,EAAoB3uE,SAAS,eAAezE,KAAKiH,EAAWzJ,KAAK,cAAgB,IAAM4yE,GACvFnpE,EAAWJ,KAAK,gBAAiBupE,QAqOzCiD,wBAzNJ,WAiBI/2E,YAhBmB,SAAfg3E,IACA,IAAIjkE,EAAcw0C,EAAM1wC,iBAAiB5Y,OAAOsV,SAASW,QAEzD,GAAInB,GAAeA,EAAYkkE,mBAAuD,SAAlClkE,EAAYkkE,mBACxD/E,EAAe,EAAG,CAClBA,GAAgB,EAChB,IAAIgF,EAAUj2E,EAAE,gDACO,IAAnBi2E,EAAQx1E,OACRw1E,EAAQ34B,QAERv+C,WAAWg3E,EA1dM,cAyqBjC9e,iBAAkBlrC,EAAKkrC,mB,qPC1pB3Bt8D,EAAOD,QALP,SAAkBmB,GAChB,IAAI8Y,EAAO,EAAO9Y,GAClB,OAAgB,MAATA,IAA0B,UAAR8Y,GAA4B,YAARA,K,uPC3B/C,IAAI/Q,EAAa1G,EAAQ,IAGrBg5E,EAA0B,WAAJ,oBAAJ/+C,KAAI,cAAJA,QAAoBA,MAAQA,KAAK77B,SAAWA,QAAU67B,KAGxExzB,EAAOC,GAAcsyE,GAAYp5E,SAAS,cAATA,GAErCnC,EAAOD,QAAUiJ,G,gCCPjB,+hCAGA,IAAIwyE,EAAiBj5E,EAAQ,IAO7B,SAASk5E,EAAuBz0E,GAC5B3B,EAAE,qBAAqByC,KAAKd,GAAS0mD,OAOzC,SAASguB,IACLr2E,EAAE,eAAeyG,YAAY,cAC7BzG,EAAE,qBAAqB8J,QAAQspC,OAQnC,SAASkjC,EAAgBC,GAErB,OADAA,EAAUC,kBAAkB,IACvBD,EAAUE,gBAIR,EAAC,EAAM,KAHVz2E,EAAEu2E,GAAWrvE,SAAS,cAAcI,QAAQ,eAAeJ,SAAS,cAC7D,EAAC,EAAOqvE,EAAUG,oBA+BjC,SAASC,IACL,IAAIC,EAvBR,WAEI,GADAP,IACIr2E,EAAE,iBAAiB,KAAOA,EAAE,iBAAiB,GAAGy2E,gBAAiB,CACjE,IAAII,EAAS,GAOb,GANA72E,EAAE,yCAAyCiD,KAAK,SAASoN,MAAK,WAAc,IACN,IAArBimE,EAAgBz5E,MAAK,GAA7Di6E,EAAgB,KAAEC,EAAkB,KACpCD,IACDD,GAAUE,EAAqB,QAGnCF,EAEA,OADAT,EAAuBS,IAChB,EAGf,OAAO,EAQOG,GAKd,OAJIJ,IACA52E,EAAE,iBAAiBU,QAAQ,UAC3BV,EAAE,kBAAkBozC,QAEjBwjC,EAoBX,SAASK,IACLj3E,EAAE0H,UAAUC,GAAG,SAAU,iBAAiB,SAAU5K,GAChD,IAAI0T,EAAOzQ,EAAEnD,MACbE,EAAE8K,iBACF,IAAIkC,EAAM0G,EAAKnH,KAAK,UAEpB,IAAKzM,KAAKq6E,SAASC,WAAWt7E,MAC1B,MAAM,IAAIyhC,MAAM,6DAGpBt9B,EAAE8M,UAAUS,QACZvN,EAAEqM,KAAK,CACHtC,IAAKA,EACL4K,KAAM,OACNxG,SAAU,OACVlO,KAAMwQ,EAAK2mE,YACX7qE,QAAS,SAAUtM,IACVA,EAAKsM,UAA4B,IAAjBtM,EAAKsM,SAAqB,WAAYtM,EACvDk2E,EAAe1lE,EAAMxQ,GA9BzC,SAA+BA,GAE3BD,EAAE,+BAA+ByG,YAAY,wCAAwC2sC,OACrFpzC,EAAE,iBAAiBozC,OAEnBpzC,EAAE,wBAAwByB,KAAKxB,EAAK0B,SAAS0mD,OA2B7BgvB,CAAsBp3E,GAE1BD,EAAE8M,UAAUC,QAEhB5F,MAAO,WACHnH,EAAE8M,UAAUC,aAW5B,SAASuqE,EAAmBngB,GACxB,IAAIogB,EAAiBv3E,EAAE,6BACnBi2E,EAAUj2E,EAAE,kBAEhB,GAA4B,aAAxBi2E,EAAQh2E,KAAK,OAAuB,CAMpC,GAAIg2E,EAAQh2E,KAAK,cACb,OAGJ,IAAIu3E,EAAcvB,EAAQh2E,KAAK,iBAE1Bk3D,GAEDogB,EAAelvB,OAGfkvB,EAAe57D,GAAG,WAKlBs6D,EAAQh2E,KAAK,cAAc,GAE3BD,EAAEqM,KAAK,CACHtC,IAAKytE,EACLlrE,OAAQ,MACRC,QAAS,SAAUkrE,GACfF,EAAe3sE,OAAO6sE,GAGtBF,EAAet0E,KAAK,QAAQvC,QAAQ,gBAGpC62E,EAAet0E,KAAK,eAAeyF,IAAIutE,EAAQh2E,KAAK,QAGpDs3E,EAAet0E,KAAK,wBAAwB6G,QAAQspC,OAGpD6iC,EAAQh2E,KAAK,MAAO,cACpBg3E,KAEJ30C,SAAU,WACN2zC,EAAQh2E,KAAK,cAAc,QAKnCs3E,EAAet0E,KAAK,iBAAiBolD,OACrC4tB,EAAQh2E,KAAK,MAAO,mBAEO,eAAxBg2E,EAAQh2E,KAAK,QACpB02E,IAIRh8E,EAAOD,QAAU,CACbsI,KAAM,WACFhD,EAAE0H,UAAUC,GAAG,QAAS,kBAAkB,WACtC2vE,OAGJt3E,EAAEhD,QAAQ2K,GAAG,2BAA2B,SAAU5K,EAAGa,GAEjD05E,EADiB15E,GAAWA,EAAQu5D,aAIxCn3D,EAAE0H,UAAUC,GAAG,cAAe,uBAAuB,SAAU5K,GAC3Ds5E,IAA0B,IAEwC,IAArBC,EAAgBz5E,MAAK,GAA7Di6E,EAAgB,KAAEC,EAAkB,KAEpC/2E,EAAEjD,EAAEif,QAAQtT,OACb1I,EAAEjD,EAAEif,QAAQ1U,QAAQ,eAAeb,YAAY,cAE9CqwE,GACDV,EAAuBW,MAI/B/2E,EAAE0H,UAAUC,GAAG,QAAS,uBAAuB,SAAU5K,GACrDiD,EAAEjD,EAAEif,QAAQ1U,QAAQ,eAAeJ,SAAS,oB,kBCpNxD,IAGIvL,EAHOuB,EAAQ,GAGDvB,OAElBhB,EAAOD,QAAUiB","file":"productDetail.js","sourcesContent":[" \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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 288);\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","var isObject = require('./isObject'),\n    now = require('./now'),\n    toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\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 */\nfunction 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\nmodule.exports = debounce;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\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 */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","let dangerZone = 60; // change to a danger theme at this time.\nlet messageBufferTime = 5; // time to account for page loading when time passes.\nconst reservationTimerId = 'reservationTimer';\nconst reservationTimerIdSelector = `#${reservationTimerId}`;\n\nconst getExpireTime = () => {\n    return $(reservationTimerIdSelector).data('expireTime') || 0;\n};\n\nconst calculateNewExpireTime = () => {\n    return new Date().getTime() + parseInt(window.resources.reservation.reservationSecondsRemaining * 1000, 10);\n};\n\nconst destroyTimer = () => {\n    const $timerBanner = $(reservationTimerIdSelector);\n    const reservationInterval = $timerBanner.data('reservationInterval');\n\n    clearInterval(reservationInterval);\n\n    $timerBanner.data('reservationInterval', null);\n    $timerBanner.data('expireTime', null);\n\n    if (window.resources && window.resources.reservation && window.resources.reservation.reservationSecondsRemaining) {\n        delete window.resources.reservation.reservationSecondsRemaining;\n    }\n    if ($timerBanner && $timerBanner.length) {\n        $timerBanner.trigger('close');\n    }\n};\n\nconst getRemainingSeconds = (expireTime = getExpireTime()) => {\n    let now = new Date().getTime();\n    let secondsRemaining = parseInt((expireTime - now) / 1000, 10);\n\n    return secondsRemaining;\n};\n\nconst popBanners = () => {\n    if (window.resources && window.resources.reservation && window.resources.reservation.messages) {\n        const remainingSeconds = getRemainingSeconds();\n        // check each message for a matching time.\n        let msgKeys = Object.keys(window.resources.reservation.messages);\n        for (let i = 0; i < msgKeys.length; i++) {\n            let msgKey = msgKeys[i];\n            let msg = window.resources.reservation.messages[msgKey];\n\n            let startTime = typeof msg.startTime !== 'undefined' ? msg.startTime : remainingSeconds; // display it immediately if startTime is undefined.\n            let endTime = startTime - messageBufferTime;\n            if ((remainingSeconds <= startTime && remainingSeconds > endTime) || typeof msg.startTime === 'undefined') {\n                // show the banner:\n                let html = `<p class=\"font-weight-bold\">${msg.title}</p>\n                            <p>${msg.message}</p>\n                            ${msg.additionalContent || ''}`;\n                $.alert({\n                    content: html,\n                    placement: 'banner',\n                    theme: msg.theme,\n                    id: msgKey,\n                    containerId: 'reservationBannerContainer',\n                    timeToLive: 10000\n                });\n                // we've used the message, so remove it from the list\n                delete window.resources.reservation.messages[msgKey];\n            }\n        }\n    }\n};\n\nconst createTimeString = (remainingSeconds) => {\n    let mins = Math.floor(remainingSeconds / 60);\n    let secs = remainingSeconds % 60;\n    if (secs < 10) {\n        secs = '0' + secs; // convert to a string so we can have two digits. 9 => '09'\n    }\n    return `${mins}:${secs}`;\n};\n\nconst updateReservationTimer = () => {\n    const remainingSeconds = getRemainingSeconds();\n\n    if (remainingSeconds >= 0) {\n        $('.reservation__time').text(createTimeString(remainingSeconds));\n\n        if (remainingSeconds <= dangerZone) {\n            // change the theme from 'info' to 'danger'\n            $(`${reservationTimerIdSelector}.alert--info`).toggleClass('alert--info alert--danger');\n        } else {\n            $(`${reservationTimerIdSelector}.alert--danger`).toggleClass('alert--info alert--danger');\n        }\n\n        popBanners();\n    } else {\n        destroyTimer();\n    }\n};\n\nconst startTimer = () => {\n    const $timerBanner = $(reservationTimerIdSelector);\n    const expireTime = calculateNewExpireTime();\n\n    if (!$timerBanner || !$timerBanner.length) { // $timerBanner might be undefined, empty jquery object (truthy), or a valid jquery object (length 1)\n        const remainingSeconds = getRemainingSeconds(expireTime);\n\n        if (remainingSeconds >= 0) { // when remainingSeconds === 0, we still want to display '0:00'\n            let initialTimeStr = createTimeString(remainingSeconds);\n            let timeRemainingMessage = window.resources.reservation.timeRemainingMessage;\n            const reservationInterval = setInterval(updateReservationTimer, 1000);\n\n            $.alert({\n                content: `<div class=\"reservation-timer\">${timeRemainingMessage} <strong class=\"reservation__time\">${initialTimeStr}</strong></div>`,\n                placement: 'banner',\n                theme: window.resources.reservation.reservationSecondsRemaining <= dangerZone ? 'danger' : 'info',\n                id: reservationTimerId,\n                containerId: 'reservationBannerContainer',\n                autoClose: false\n            }).data('reservationInterval', reservationInterval).data('expireTime', expireTime);\n        }\n    } else {\n        $timerBanner.data('expireTime', expireTime);\n    }\n};\n\nconst init = () => {\n    if (window.resources && window.resources.reservation && window.resources.reservation.reservationSecondsRemaining) {\n        startTimer();\n    }\n    // remove any existing banners.\n    $('#reservationBannerContainer').find('.alert').not(reservationTimerIdSelector).remove();\n    popBanners();\n};\n\nconst updateReservationData = (response) => {\n    if (response && response.reservation) {\n        if (window.resources) {\n            if (window.resources.reservation) {\n                window.resources.reservation.messages = $.extend({}, window.resources.reservation.messages, response.reservation.messages);\n                window.resources.reservation.reservationSecondsRemaining = response.reservation.reservationSecondsRemaining;\n                $(reservationTimerIdSelector).data('remainingSeconds', parseInt(response.reservation.reservationSecondsRemaining, 10));\n            } else {\n                window.resources.reservation = response.reservation;\n            }\n        } else {\n            window.resources = {\n                reservation: response.reservation\n            };\n        }\n        init();\n    }\n};\n\nconst getDestroyTimer = () => {\n    return destroyTimer;\n};\n\nmodule.exports = {\n    init,\n    getDestroyTimer,\n    updateReservationData\n};\n","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\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 */\nfunction 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\nmodule.exports = baseGetTag;\n","var root = require('./_root');\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 */\nvar now = function() {\n  return root.Date.now();\n};\n\nmodule.exports = now;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseTrim = require('./_baseTrim'),\n    isObject = require('./isObject'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\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 */\nfunction 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\nmodule.exports = toNumber;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\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 */\nfunction baseTrim(string) {\n  return string\n    ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n    : string;\n}\n\nmodule.exports = baseTrim;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\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 */\nfunction trimmedEndIndex(string) {\n  var index = string.length;\n\n  while (index-- && reWhitespace.test(string.charAt(index))) {}\n  return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\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 */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\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 */\nfunction 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\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\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 */\nvar nativeObjectToString = objectProto.toString;\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 */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\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 */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","'use strict';\n\n/**\n * Adds or removes the alert-badge red dot on the minicart icon based on if\n * the Price Drop Modal is enabled and the user has a value for the\n * priceDropUserSegment in sessionStorage.\n */\nfunction toggleAlertBadge() {\n    const $icon = $('.minicart-icon .svgicon');\n    const hasAlertWrapper = $icon.parent().hasClass('alert-badge');\n\n    if (window.clientData && window.clientData.priceDropModalEnabled) {\n        const customerGroup = sessionStorage.getItem('priceDropUserSegment');\n\n        if (customerGroup) {\n            const hasSaleItemInCart = !!(window.digitalData && window.digitalData.cart && window.digitalData.cart.item) && window.digitalData.cart.item.some(item => item.isSaleItem === 'Yes');\n\n            if (hasSaleItemInCart && !hasAlertWrapper) {\n                $icon.wrap('<div class=\"alert-badge\"></div>');\n            } else if (!hasSaleItemInCart && hasAlertWrapper) {\n                $icon.unwrap('.alert-badge');\n            }\n        } else if (hasAlertWrapper) {\n            $icon.unwrap('.alert-badge');\n        }\n    } else if (hasAlertWrapper) {\n        $icon.unwrap('.alert-badge');\n    }\n}\n\nmodule.exports = {\n    toggleAlertBadge\n};\n","'use strict';\n\n/**\n * Remove all validation. Should be called every time before revalidating form\n * @param {element} form - Form to be cleared\n * @returns {void}\n */\nfunction clearFormErrors(form) {\n    $(form).find('.form-control.is-invalid').removeClass('is-invalid');\n}\n\nmodule.exports = function (formElement, payload) {\n    // clear form validation first\n    clearFormErrors(formElement);\n\n    if (typeof payload === 'object' && payload.fields) {\n        Object.keys(payload.fields).forEach(function (key) {\n            if (payload.fields[key]) {\n                var feedbackElement = $(formElement).find('[name=\"' + key + '\"]')\n                    .parent()\n                    .children('.invalid-feedback');\n\n                if (feedbackElement.length > 0) {\n                    if (Array.isArray(payload[key])) {\n                        feedbackElement.html(payload.fields[key].join('<br/>'));\n                    } else {\n                        feedbackElement.html(payload.fields[key]);\n                    }\n                    feedbackElement.siblings('.form-control').addClass('is-invalid');\n                }\n            }\n        });\n    }\n    if (payload && payload.error) {\n        // Modified to leverage alerts component\n        const $formElement = $(formElement);\n        const $form = $formElement.prop('tagName') === 'FORM'\n            ? $formElement\n            : $formElement.closest('form');\n\n        $form.alert({\n            content: payload.error.join('<br/>'),\n            theme: 'danger',\n            attachment: 'prepend',\n            autoClose: false\n        });\n    }\n};\n","'use strict';\n\nvar processInclude = require('./components/processInclude');\n\njQuery(function () {\n    processInclude(require('./notifyMe/notifyMe'));\n    processInclude(require('./product/detail'));\n\n    // hacky solution to making BV in-drawer review links open accordion drawers\n    $(document).on('mousedown', 'a[data-content-type=\"review\"], .bv-rating, a.bv-rating-stars-container, a.bv-rating-label', function (e) {\n        var accordionHeader = $('.product-accordion-reviews__header');\n        if (accordionHeader.hasClass('collapsed')) {\n            e.preventDefault();\n            accordionHeader.trigger('click');\n            var reviewAnchorOffset = $('#product-accordion-reviews').offset();\n            $('body').animate({\n                scrollTop: reviewAnchorOffset.top\n            });\n        }\n    });\n});\n","'use strict';\nvar focusHelper = require('../components/focus');\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n    var pid;\n\n    if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n        pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n    } else if ($('.product-set-detail').length || $('.product-set').length) {\n        pid = $($el).closest('.product-detail').find('.product-id').text();\n    } else {\n        pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n    }\n\n    return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n    var quantitySelected;\n    if ($el && $('.set-items').length) {\n        quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n    } else if ($el && $('.product-bundle').length) {\n        var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\n        var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\n        if (quantitySelectedModal.val() === undefined) {\n            quantitySelected = quantitySelectedPDP;\n        } else {\n            quantitySelected = quantitySelectedModal;\n        }\n    } else {\n        quantitySelected = $('.quantity-select');\n    }\n    return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n    return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n *     selected.  If there is no variant that corresponds to a specific combination of attribute\n *     values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n    attr.values.forEach(function (attrValue) {\n        var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\n            attrValue.value + '\"]');\n        var $swatchButton = $attrValue.parent();\n\n        if (attrValue.selected) {\n            $attrValue.addClass('selected');\n            $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n        } else {\n            $attrValue.removeClass('selected');\n            $attrValue.siblings('.selected-assistive-text').empty();\n        }\n\n        if (attrValue.url) {\n            $swatchButton.attr('data-url', attrValue.url);\n        } else {\n            $swatchButton.removeAttr('data-url');\n        }\n\n        // Disable if not selectable\n        $attrValue.removeClass('selectable unselectable');\n\n        $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n    });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n *     selected.  If there is no variant that corresponds to a specific combination of attribute\n *     values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n    var $attr = '[data-attr=\"' + attr.id + '\"]';\n    var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n    $defaultOption.attr('value', attr.resetUrl);\n\n    attr.values.forEach(function (attrValue) {\n        var $attrValue = $productContainer\n            .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n        $attrValue.attr('value', attrValue.url)\n            .removeAttr('disabled');\n\n        if (!attrValue.selectable) {\n            $attrValue.attr('disabled', true);\n        }\n    });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n *     swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n    // Currently, the only attribute type that has image swatches is Color.\n    var attrsWithSwatches = ['color'];\n\n    attrs.forEach(function (attr) {\n        if (attrsWithSwatches.indexOf(attr.id) > -1) {\n            processSwatchValues(attr, $productContainer, msgs);\n        } else {\n            processNonSwatchValues(attr, $productContainer);\n        }\n    });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n *                            attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n    var availabilityValue = '';\n    var availabilityMessages = response.product.availability.messages;\n    if (!response.product.readyToOrder) {\n        availabilityValue = '<li><div>' + response.resources.info_selectforstock + '</div></li>';\n    } else {\n        availabilityMessages.forEach(function (message) {\n            availabilityValue += '<li><div>' + message + '</div></li>';\n        });\n    }\n\n    $($productContainer).trigger('product:updateAvailability', {\n        product: response.product,\n        $productContainer: $productContainer,\n        message: availabilityValue,\n        resources: response.resources\n    });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n    if (!attributes) {\n        return '';\n    }\n\n    var html = '';\n\n    attributes.forEach(function (attributeGroup) {\n        if (attributeGroup.ID === 'mainAttributes') {\n            attributeGroup.attributes.forEach(function (attribute) {\n                html += '<div class=\"attribute-values\">' + attribute.label + ': '\n                    + attribute.value + '</div>';\n            });\n        }\n    });\n\n    return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n\t// Update options\n    $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n    var carousel = $productContainer.find('.carousel');\n    $(carousel).carousel('dispose');\n    var carouselId = $(carousel).attr('id');\n    $(carousel).empty().append('<ol class=\"carousel-indicators\"></ol><div class=\"carousel-inner\" role=\"listbox\"></div><a class=\"carousel-control-prev\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"prev\"><span class=\"fa icon-prev\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('prev') + '</span></a><a class=\"carousel-control-next\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"next\"><span class=\"fa icon-next\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('next') + '</span></a>');\n    for (var i = 0; i < imgs.length; i++) {\n        $('<div class=\"carousel-item\"><img src=\"' + imgs[i].url + '\" class=\"d-block img-fluid\" alt=\"' + imgs[i].alt + ' image number ' + parseInt(imgs[i].index, 10) + '\" title=\"' + imgs[i].title + '\" itemprop=\"image\" /></div>').appendTo($(carousel).find('.carousel-inner'));\n        $('<li data-target=\"#' + carouselId + '\" data-slide-to=\"' + i + '\" class=\"\"></li>').appendTo($(carousel).find('.carousel-indicators'));\n    }\n    $($(carousel).find('.carousel-item')).first().addClass('active');\n    $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n    if (imgs.length === 1) {\n        $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n    }\n    $(carousel).carousel();\n    $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n *     attributes have been selected.  Used partially to\n *     determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n    var isChoiceOfBonusProducts =\n        $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n    var isVaraint;\n    if (response.product.variationAttributes) {\n        updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n        isVaraint = response.product.productType === 'variant';\n        if (isChoiceOfBonusProducts && isVaraint) {\n            $productContainer.parent('.bonus-product-item')\n                .data('pid', response.product.id);\n\n            $productContainer.parent('.bonus-product-item')\n                .data('ready-to-order', response.product.readyToOrder);\n        }\n    }\n\n    // Update primary images\n    var primaryImageUrls = response.product.images.large;\n    createCarousel(primaryImageUrls, $productContainer);\n\n    // Update pricing\n    if (!isChoiceOfBonusProducts) {\n        var $priceSelector = $('.prices .price', $productContainer).length\n            ? $('.prices .price', $productContainer)\n            : $('.prices .price');\n        $priceSelector.replaceWith(response.product.price.html);\n    }\n\n    // Update promotions\n    $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\n\n    updateAvailability(response, $productContainer);\n\n    if (isChoiceOfBonusProducts) {\n        var $selectButton = $productContainer.find('.select-bonus-product');\n        $selectButton.trigger('bonusproduct:updateSelectButton', {\n            product: response.product, $productContainer: $productContainer\n        });\n    } else {\n        // Enable \"Add to Cart\" button if all required attributes have been selected\n        $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n            product: response.product, $productContainer: $productContainer\n        }).trigger('product:statusUpdate', response.product);\n    }\n\n    // Update attributes\n    $productContainer.find('.main-attributes').empty()\n        .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n *     etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n    if ($productContainer.parent('.bonus-product-item').length <= 0) {\n        var optionsHtml = quantities.map(function (quantity) {\n            var selected = quantity.selected ? ' selected ' : '';\n            return '<option value=\"' + quantity.value + '\"  data-url=\"' + quantity.url + '\"' +\n                selected + '>' + quantity.value + '</option>';\n        }).join('');\n        getQuantitySelector($productContainer).empty().html(optionsHtml);\n    }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n *         changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n    if (selectedValueUrl) {\n        $('body').trigger('product:beforeAttributeSelect',\n            { url: selectedValueUrl, container: $productContainer });\n\n        $.ajax({\n            url: selectedValueUrl,\n            method: 'GET',\n            success: function (data) {\n                handleVariantResponse(data, $productContainer);\n                updateOptions(data.product.optionsHtml, $productContainer);\n                updateQuantities(data.product.quantities, $productContainer);\n                $('body').trigger('product:afterAttributeSelect',\n                    { data: data, container: $productContainer });\n                $.spinner().stop();\n            },\n            error: function () {\n                $.spinner().stop();\n            }\n        });\n    }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n    return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n    var $html = $('<div>').append($.parseHTML(html));\n\n    var body = $html.find('.choice-of-bonus-product');\n    var footer = $html.find('.modal-footer').children();\n\n    return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n    $('.modal-body').spinner().start();\n\n    if ($('#chooseBonusProductModal').length !== 0) {\n        $('#chooseBonusProductModal').remove();\n    }\n    var bonusUrl;\n    if (data.bonusChoiceRuleBased) {\n        bonusUrl = data.showProductsUrlRuleBased;\n    } else {\n        bonusUrl = data.showProductsUrlListBased;\n    }\n\n    var htmlString = '<!-- Modal -->'\n        + '<div class=\"modal fade\" id=\"chooseBonusProductModal\" tabindex=\"-1\" role=\"dialog\">'\n        + '<span class=\"enter-message sr-only\" ></span>'\n        + '<div class=\"modal-dialog choose-bonus-product-dialog\" '\n        + 'data-total-qty=\"' + data.maxBonusItems + '\"'\n        + 'data-UUID=\"' + data.uuid + '\"'\n        + 'data-pliUUID=\"' + data.pliUUID + '\"'\n        + 'data-addToCartUrl=\"' + data.addToCartUrl + '\"'\n        + 'data-pageStart=\"0\"'\n        + 'data-pageSize=\"' + data.pageSize + '\"'\n        + 'data-moreURL=\"' + data.showProductsUrlRuleBased + '\"'\n        + 'data-bonusChoiceRuleBased=\"' + data.bonusChoiceRuleBased + '\">'\n        + '<!-- Modal content-->'\n        + '<div class=\"modal-content\">'\n        + '<div class=\"modal-header\">'\n        + '    <span class=\"\">' + data.labels.selectprods + '</span>'\n        + '    <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n        + '        <span aria-hidden=\"true\">&times;</span>'\n        + '        <span class=\"sr-only\"> </span>'\n        + '    </button>'\n        + '</div>'\n        + '<div class=\"modal-body\"></div>'\n        + '<div class=\"modal-footer\"></div>'\n        + '</div>'\n        + '</div>'\n        + '</div>';\n    $('body').append(htmlString);\n    $('.modal-body').spinner().start();\n\n    $.ajax({\n        url: bonusUrl,\n        method: 'GET',\n        dataType: 'json',\n        success: function (response) {\n            var parsedHtml = parseHtml(response.renderedTemplate);\n            $('#chooseBonusProductModal .modal-body').empty();\n            $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n            $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n            $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n            $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n            $('#chooseBonusProductModal').modal('show');\n            $.spinner().stop();\n        },\n        error: function () {\n            $.spinner().stop();\n        }\n    });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n    $('.minicart').trigger('count:update', response);\n    var messageType = response.error ? 'alert-danger' : 'alert-success';\n    // show add to cart toast\n    if (response.newBonusDiscountLineItem\n        && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n        chooseBonusProducts(response.newBonusDiscountLineItem);\n    } else {\n        if ($('.add-to-cart-messages').length === 0) {\n            $('body').append(\n                '<div class=\"add-to-cart-messages\"></div>'\n            );\n        }\n\n        $('.add-to-cart-messages').append(\n            '<div class=\"alert ' + messageType + ' add-to-basket-alert text-center\" role=\"alert\">'\n            + response.message\n            + '</div>'\n        );\n\n        setTimeout(function () {\n            $('.add-to-basket-alert').remove();\n        }, 5000);\n    }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n    var childProducts = [];\n    $('.bundle-item').each(function () {\n        childProducts.push({\n            pid: $(this).find('.product-id').text(),\n            quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n        });\n    });\n\n    return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n    var options = $productContainer\n        .find('.product-option')\n        .map(function () {\n            var $elOption = $(this).find('.options-select');\n            var urlValue = $elOption.val();\n            var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n                .data('value-id');\n            return {\n                optionId: $(this).data('option-id'),\n                selectedValueId: selectedValueId\n            };\n        }).toArray();\n\n    return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n    if (url) {\n        $.ajax({\n            url: url,\n            method: 'GET',\n            success: function () {\n                // reporting urls hit on the server\n            },\n            error: function () {\n                // no reporting urls hit on the server\n            }\n        });\n    }\n}\n\nmodule.exports = {\n    attributeSelect: attributeSelect,\n    methods: {\n        editBonusProducts: function (data) {\n            chooseBonusProducts(data);\n        }\n    },\n\n    focusChooseBonusProductModal: function () {\n        $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n            $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n            $('#chooseBonusProductModal .close').focus();\n        });\n    },\n\n    onClosingChooseBonusProductModal: function () {\n        $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n            $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n        });\n    },\n\n    trapChooseBonusProductModalFocus: function () {\n        $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n            var focusParams = {\n                event: e,\n                containerSelector: '#chooseBonusProductModal',\n                firstElementSelector: '.close',\n                lastElementSelector: '.add-bonus-products'\n            };\n            focusHelper.setTabNextFocus(focusParams);\n        });\n    },\n\n    colorAttribute: function () {\n        $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n            e.preventDefault();\n\n            if ($(this).attr('disabled')) {\n                return;\n            }\n            var $productContainer = $(this).closest('.set-item');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.product-detail');\n            }\n\n            attributeSelect($(this).attr('data-url'), $productContainer);\n        });\n    },\n\n    selectAttribute: function () {\n        $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n            e.preventDefault();\n\n            var $productContainer = $(this).closest('.set-item');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.product-detail');\n            }\n            attributeSelect(e.currentTarget.value, $productContainer);\n        });\n    },\n\n    availability: function () {\n        $(document).on('change', '.quantity-select', function (e) {\n            e.preventDefault();\n\n            var $productContainer = $(this).closest('.product-detail');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n            }\n\n            if ($('.bundle-items', $productContainer).length === 0) {\n                attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n                    $productContainer);\n            }\n        });\n    },\n\n    addToCart: function () {\n        $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n            var addToCartUrl;\n            var pid;\n            var pidsObj;\n            var setPids;\n\n            $('body').trigger('product:beforeAddToCart', this);\n\n            if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n                setPids = [];\n\n                $('.product-detail').each(function () {\n                    if (!$(this).hasClass('product-set-detail')) {\n                        setPids.push({\n                            pid: $(this).find('.product-id').text(),\n                            qty: $(this).find('.quantity-select').val(),\n                            options: getOptions($(this))\n                        });\n                    }\n                });\n                pidsObj = JSON.stringify(setPids);\n            }\n\n            pid = getPidValue($(this));\n\n            var $productContainer = $(this).closest('.product-detail');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n            }\n\n            addToCartUrl = getAddToCartUrl();\n\n            var form = {\n                pid: pid,\n                pidsObj: pidsObj,\n                childProducts: getChildProducts(),\n                quantity: getQuantitySelected($(this))\n            };\n\n            if (!$('.bundle-item').length) {\n                form.options = getOptions($productContainer);\n            }\n\n            $(this).trigger('updateAddToCartFormData', form);\n            if (addToCartUrl) {\n                $.ajax({\n                    url: addToCartUrl,\n                    method: 'POST',\n                    data: form,\n                    success: function (data) {\n                        handlePostCartAdd(data);\n                        $('body').trigger('product:afterAddToCart', data);\n                        $.spinner().stop();\n                        miniCartReportingUrl(data.reportingURL);\n                    },\n                    error: function () {\n                        $.spinner().stop();\n                    }\n                });\n            }\n        });\n    },\n    selectBonusProduct: function () {\n        $(document).on('click', '.select-bonus-product', function () {\n            var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n            var pid = $(this).data('pid');\n            var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n            var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\n            var totalQty = 0;\n            $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n                totalQty += $(this).data('qty');\n            });\n            totalQty += submittedQty;\n            var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n            var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n            if (totalQty <= maxPids) {\n                var selectedBonusProductHtml = ''\n                + '<div class=\"selected-pid row\" '\n                + 'data-pid=\"' + pid + '\"'\n                + 'data-qty=\"' + submittedQty + '\"'\n                + 'data-optionID=\"' + (optionID || '') + '\"'\n                + 'data-option-selected-value=\"' + (valueId || '') + '\"'\n                + '>'\n                + '<div class=\"col-sm-11 col-9 bonus-product-name\" >'\n                + $choiceOfBonusProduct.find('.product-name').html()\n                + '</div>'\n                + '<div class=\"col-1\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div>'\n                + '</div>'\n                ;\n                $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n                $('.pre-cart-products').html(totalQty);\n                $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n            } else {\n                $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n            }\n        });\n    },\n    removeBonusProduct: function () {\n        $(document).on('click', '.selected-pid', function () {\n            $(this).remove();\n            var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n            var count = 0;\n            if ($selected.length) {\n                $selected.each(function () {\n                    count += parseInt($(this).data('qty'), 10);\n                });\n            }\n\n            $('.pre-cart-products').html(count);\n            $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n        });\n    },\n    enableBonusProductSelection: function () {\n        $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n            $('button.select-bonus-product', response.$productContainer).attr('disabled',\n                (!response.product.readyToOrder || !response.product.available));\n            var pid = response.product.id;\n            $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n        });\n    },\n    showMoreBonusProducts: function () {\n        $(document).on('click', '.show-more-bonus-products', function () {\n            var url = $(this).data('url');\n            $('.modal-content').spinner().start();\n            $.ajax({\n                url: url,\n                method: 'GET',\n                success: function (html) {\n                    var parsedHtml = parseHtml(html);\n                    $('.modal-body').append(parsedHtml.body);\n                    $('.show-more-bonus-products:first').remove();\n                    $('.modal-content').spinner().stop();\n                },\n                error: function () {\n                    $('.modal-content').spinner().stop();\n                }\n            });\n        });\n    },\n    addBonusProductsToCart: function () {\n        $(document).on('click', '.add-bonus-products', function () {\n            var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n            var queryString = '?pids=';\n            var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n            var pidsObject = {\n                bonusProducts: []\n            };\n\n            $.each($readyToOrderBonusProducts, function () {\n                var qtyOption =\n                    parseInt($(this)\n                        .data('qty'), 10);\n\n                var option = null;\n                if (qtyOption > 0) {\n                    if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n                        option = {};\n                        option.optionId = $(this).data('optionid');\n                        option.productId = $(this).data('pid');\n                        option.selectedValueId = $(this).data('option-selected-value');\n                    }\n                    pidsObject.bonusProducts.push({\n                        pid: $(this).data('pid'),\n                        qty: qtyOption,\n                        options: [option]\n                    });\n                    pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n                }\n            });\n            queryString += JSON.stringify(pidsObject);\n            queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n            queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n            $.spinner().start();\n            $.ajax({\n                url: url + queryString,\n                method: 'POST',\n                success: function (data) {\n                    $.spinner().stop();\n                    if (data.error) {\n                        $('#chooseBonusProductModal').modal('hide');\n                        if ($('.add-to-cart-messages').length === 0) {\n                            $('body').append('<div class=\"add-to-cart-messages\"></div>');\n                        }\n                        $('.add-to-cart-messages').append(\n                            '<div class=\"alert alert-danger add-to-basket-alert text-center\"'\n                            + ' role=\"alert\">'\n                            + data.errorMessage + '</div>'\n                        );\n                        setTimeout(function () {\n                            $('.add-to-basket-alert').remove();\n                        }, 3000);\n                    } else {\n                        $('.configure-bonus-product-attributes').html(data);\n                        $('.bonus-products-step2').removeClass('hidden-xl-down');\n                        $('#chooseBonusProductModal').modal('hide');\n\n                        if ($('.add-to-cart-messages').length === 0) {\n                            $('body').append('<div class=\"add-to-cart-messages\"></div>');\n                        }\n                        $('.minicart-quantity').html(data.totalQty);\n                        $('.add-to-cart-messages').append(\n                            '<div class=\"alert alert-success add-to-basket-alert text-center\"'\n                            + ' role=\"alert\">'\n                            + data.msgSuccess + '</div>'\n                        );\n                        setTimeout(function () {\n                            $('.add-to-basket-alert').remove();\n                            if ($('.cart-page').length) {\n                                location.reload();\n                            }\n                        }, 1500);\n                    }\n                },\n                error: function () {\n                    $.spinner().stop();\n                }\n            });\n        });\n    },\n\n    getPidValue: getPidValue,\n    getQuantitySelected: getQuantitySelected,\n    miniCartReportingUrl: miniCartReportingUrl\n};\n","'use strict';\n\n// TODO: https://columbia.atlassian.net/browse/GSD-16533 Update URL functions to use the JS URL API\n/**\n * Append a parameter to a url\n * @param {string} url - a url\n * @param {string} name - key\n * @param {string} value - value\n * @return {string} url with param appended\n */\nfunction appendParamToURL(url, name, value) {\n    var c = '?';\n    if (url.indexOf(c) !== -1) {\n        c = '&';\n    }\n    return url + c + name + '=' + encodeURIComponent(value);\n}\n\n/**\n * Helper function for getParamsFromURL. Split a url string into key/value pairs.\n * @param {string} str - url parameter string\n * @return {Object} object with params split into key/value pairs\n */\nfunction keyValueArray(str) {\n    var kvp = str.split('&');\n    var x;\n    var k;\n    var v;\n    var output = {};\n\n    for (var i = kvp.length - 1; i >= 0; i--) {\n        if (kvp[i].length) { // No empty strings...\n            x = kvp[i].split('=');\n            k = x[0];\n            v = '';\n            if (x.length > 1) {\n                v = x[1];\n            }\n            output[k] = v;\n        }\n    }\n\n    return output;\n}\n\n/**\n * Split a url string into key/value pairs.\n * @param {string} url - url parameter string\n * @return {Object} object with params split into key/value pairs\n */\nfunction getParamsFromURL(url) {\n    var arr = url.split('?');\n    var search = '';\n    var searchHash = '';\n    var postHash = false;\n\n    if (arr.length > 1) {\n        var arrHash = arr[1].split('#');\n        search = arrHash[0];\n\n        if (arrHash.length > 1) {\n            postHash = true;\n            searchHash = arrHash[1];\n        }\n    }\n\n    var output = {};\n    if (search.length) {\n        output = keyValueArray(search);\n    }\n    if (postHash) {\n        if (searchHash.length) {\n            var output2 = keyValueArray(searchHash);\n            Object.keys(output2).forEach(function (prop) {\n                output[prop] = output2[prop]; // Merge them...\n            });\n        }\n    }\n\n    return output;\n}\n\n/**\n * Update an existing url param\n * https://stackoverflow.com/questions/1090948/change-url-parameters\n * @param {string} url - Url to be updated\n * @param {string} param - param to be updated\n * @param {string} paramVal - new parameter value\n * @returns {string} - updated url\n */\nfunction updateURLParam(url, param, paramVal) {\n    var newAdditionalURL = '';\n    var tempArray = url.split('?');\n    var baseURL = tempArray[0];\n    var additionalURL = tempArray[1];\n    var temp = '';\n    if (additionalURL) {\n        tempArray = additionalURL.split('&');\n        for (var i = 0; i < tempArray.length; i++) {\n            if (tempArray[i].split('=')[0] !== param) {\n                newAdditionalURL += temp + tempArray[i];\n                temp = '&';\n            }\n        }\n    }\n\n    var rowsText = temp + '' + param + '=' + paramVal;\n    return baseURL + '?' + newAdditionalURL + rowsText;\n}\n\n/**\n * Turn the URL query string into a JSON object to make it easier to add/update/delete key/value pairs.\n * @param {string} url the URL string from which to get the querystring. Null or empty string to use the location.href.\n * @returns {obejct} the query string as an object.\n */\nfunction queryStringToObject(url) {\n    var search;\n    if (!url) {\n        // get the query string from window.location.search\n        search = location.search.substring(1); // exclude the leading ?\n    } else {\n        // find the query string in the given url\n        var startIndex = url.indexOf('?') + 1;\n        var endIndex = url.indexOf('#');\n        endIndex = endIndex >= startIndex ? endIndex : url.length;\n        // examples:\n        //   'key=val#hash', '/?key=val#hash' => 'key=val'\n        //   '?key#hash' => 'key'\n        search = url.substring(startIndex, endIndex);\n        if (startIndex === 0 && search.indexOf('=') === -1) {\n            // this string doesn't look like a query string (no '?' and no '=')\n            // examples: 'key#hash', '/#hash'\n            search = '';\n        }\n    }\n\n    var result = {};\n    if (search) {\n        var pairs = search.split('&');\n        pairs.forEach(function (pair) {\n            var nameVal = pair.split('=');\n            result[nameVal[0]] = decodeURIComponent(nameVal[1] || '');\n        });\n    }\n\n    return JSON.parse(JSON.stringify(result));\n}\n\n/**\n * Convert an object into a serialized string; the opposite of queryStringToObject().\n * @param {Object} obj The object to be serialized into a string\n * @param {string} urlString An optional url into which to insert the querystring. Any existing query string will be replaced.\n * @returns {string} The resulting query or URL string.\n */\nfunction objectToQueryString(obj, urlString) {\n    var url = urlString || '';\n    var path = '';\n    var hash = '';\n    if (url) {\n        var qsIndex = url.indexOf('?');\n        var hashIndex = url.indexOf('#');\n        var index;\n        if (hashIndex > -1) {\n            index = hashIndex;\n            hash = url.substring(hashIndex);\n        }\n        if (qsIndex > -1) {\n            index = qsIndex;\n        }\n        path = url.substring(0, index); // if index is undefined, path is the entire string.\n    }\n    return path + '?' + $.param(obj) + hash;\n}\n\n/**\n * Update a URL with a key/value pair. This will insert or update a pair.\n * @param {string} url The url to be updated.\n * @param {string} name The key name to use in the query string.\n * @param {string} val The value of the key to be set.\n * @returns {string} The updated URL.\n */\nfunction setUrlKeyValue(url, name, val) {\n    var qs = queryStringToObject(url);\n    qs[name] = encodeURIComponent(val);\n    return objectToQueryString(qs, url);\n}\n\n/**\n * Update a URL with multiple key/value pairs. This will insert new or update existing keys.\n * @param {string} url The url to be updated.\n * @param {Object} obj an object of name/value pairs to be inserted/updated in the url query string.\n * @returns {string} The updated URL.\n */\nfunction setUrlData(url, obj) {\n    var qs = queryStringToObject(url);\n    var mergedQs = $.extend({}, qs, obj);\n    return objectToQueryString(mergedQs, url);\n}\n\n/**\n * DecodeURIComponent cannot be used directly to parse query parameters from a URL. It needs a bit of preparation.\n * reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent\n * @param {string} val The query param value to be decoded.\n * @returns {string} The decoded query param value.\n */\nfunction decodeQueryParam(val) {\n    return decodeURIComponent(val.replace(/\\+/g, ' '));\n}\n\n/**\n * Remove the queryparam from the url\n * @param {string} queryparam queryparam to be removed\n * @param {string} urlString url to be manipulated\n * @returns {URL} new url without provided queryparam\n */\nfunction removeQueryParam(queryparam, urlString) {\n    var url = new URL(urlString);\n    url.searchParams.delete(queryparam);\n    return url;\n}\n\n/**\n * Remove the queryparam from the url, and replace the state\n * @param {string} queryparam queryparam to be removed\n */\nfunction removeQueryParamFromCurrentUrl(queryparam) {\n    var url = removeQueryParam(queryparam, window.location.href);\n    history.replaceState(null, '', url);\n}\n\n/**\n * Returns an array with values that exist in both arrays\n * @param {array} a1 - Array\n * @param {array} a2 - Array\n * @return {array} - Values that appear in both arrays\n */\nfunction arrayIntersection(a1, a2) {\n    var intersect = $.map(a1,\n        function (v) {\n            return $.inArray(v, a2) < 0 ? null : v;\n        }\n    );\n    return intersect;\n}\n\n/**\n * Creates and returns the markup required to display a modal.\n * The calling script should then use the bootstrap $.modal() method to display the modal.\n * Example 1:\n *      var modalMarkup = createModalMarkup('<p>Hello World</p>', {title: 'Greeting'});\n *      var $modal = $(modalMarkup).modal();\n * Example 2:\n *      var $modal = $(createModalMarkup('')); // create empty modal\n *      $modal.find('.modal-body').html(data); // inject content into the returned markup\n *      $modal.modal();\n * @param {string} content The content to put in the modal. Pass empty string to just get the modal markup.\n * @param {Object} options Additional settings.\n * @return {string} The completed markup.\n */\nfunction createModalMarkup(content = '', options = {}) {\n    /* Bootstrap Modal documentation: https://getbootstrap.com/docs/4.0/components/modal/ */\n    const defaults = {\n        title: '',\n        showCloseBtn: true,\n        enableLayeredDrawers: false,\n        modalSizeClass: 'modal-lg', // possible values: modal-sm, modal-md (or empty string), modal-lg, modal-fluid\n        centeredClass: 'modal-dialog-centered', // pass empty string to top-align the modal\n        customClasses: '', // additional classes to be added to the modal\n        modalId: '', // Custom id for the modal\n        buttons: [\n            // example markup (this will also dismiss the modal on click):\n            // '<button class=\"btn btn-secondary\" data-dismiss=\"modal\">Cancel</button>'\n        ]\n    };\n    const settings = $.extend({}, defaults, options);\n\n    // additional uncommon bootstrap options go into data attributes\n    const dataAttributes = [];\n    ['backdrop', 'keyboard', 'focus', 'show'].forEach(param => {\n        if (settings[param] !== undefined) {\n            dataAttributes.push(`data-${param}=\"${settings[param]}\"`);\n        }\n    });\n\n    let header = '<div class=\"modal-header\">';\n    if (settings.title) {\n        header += `<div class=\"modal-title\">${settings.title}</div>`;\n    }\n    if (settings.showCloseBtn) {\n        header += '<button type=\"button\" class=\"close btn btn-icon\" data-dismiss=\"modal\" aria-label=\"Close\"><svg><use href=\"#close\"></use></svg></button>';\n    }\n    header += '</div>';\n\n    let idAttribute = '';\n    if (settings.modalId) {\n        idAttribute = `id=\"${settings.modalId}\"`;\n    }\n\n    let footer = '';\n    let footerBtns = '';\n    for (let btn of settings.buttons) {\n        footerBtns += btn;\n    }\n    if (footerBtns) {\n        footer = `<div class=\"modal-footer\">${footerBtns}</div>`;\n    }\n\n    // tabindex=\"-1\" is necessary to allow the modal to close when ESC key is pressed.\n    // https://stackoverflow.com/questions/12630156/how-do-you-enable-the-escape-key-close-functionality-in-a-twitter-bootstrap-moda\n    const html = `<div class=\"modal fade ${settings.customClasses}\" ${idAttribute}\n        ${dataAttributes.join(' ')}\n        role=\"dialog\" aria-hidden=\"true\" ${!settings.enableLayeredDrawers ? 'tabindex=\"-1\"' : ''}>\n            <div class=\"modal-dialog ${settings.centeredClass} ${settings.modalSizeClass}\">\n                <div class=\"modal-content\">\n                    ${header}\n                    <div class=\"modal-body\">\n                        ${content}\n                    </div>\n                    ${footer}\n                </div>\n            </div>\n        </div>`;\n\n    return html;\n}\n/**\n * Creates a backdrop element and appends it to the body tag.\n * @param {string} customClass An optional class to apply to the backdrop.\n */\nfunction createBackdrop(customClass) {\n    var cls = customClass || '';\n    var html = '<div class=\"backdrop ' + cls + '\"></div>';\n    $('body').append(html);\n}\n\n/**\n * Removes from the page the backdrop with the passed in class, or all backdrops if nothing is passed.\n * @param {string} customClass An optional class for selecting a backdrop to be removed. All will be removed if this is null.\n */\nfunction removeBackdrop(customClass) {\n    var selector = '.backdrop' + (customClass ? '.' + customClass : '');\n    $('body').find(selector).remove();\n}\n\n/**\n * display element in viewport\n * @param {string} el  element in viewport\n * @param {string} offsetToTop  off set top position\n * @return {boolean} element view port\n */\nfunction elementInViewport(el, offsetToTop) {\n    var top = el.offsetTop;\n    var left = el.offsetLeft;\n    var width = el.offsetWidth;\n    var height = el.offsetHeight;\n\n    while (el.offsetParent) {\n        el = el.offsetParent; // eslint-disable-line no-param-reassign\n        top += el.offsetTop;\n        left += el.offsetLeft;\n    }\n\n    if (typeof offsetToTop !== 'undefined') {\n        top -= offsetToTop;\n    }\n\n    if (window.pageXOffset !== null) {\n        return (\n            top < (window.pageYOffset + window.innerHeight) &&\n            left < (window.pageXOffset + window.innerWidth) &&\n            (top + height) > window.pageYOffset &&\n            (left + width) > window.pageXOffset\n        );\n    }\n\n    if (document.compatMode === 'CSS1Compat') {\n        return (\n            top < (window.document.documentElement.scrollTop + window.document.documentElement.clientHeight) &&\n            left < (window.document.documentElement.scrollLeft + window.document.documentElement.clientWidth) &&\n            (top + height) > window.document.documentElement.scrollTop &&\n            (left + width) > window.document.documentElement.scrollLeft\n        );\n    }\n\n    return false;\n}\n\n/**\n * append script to body tag\n * @param {string} src  url of the script to append\n * @param {function} callback optional callback to fire after load\n */\nfunction loadScript(src, callback) {\n    var script = document.createElement('script');\n    script.type = 'text/javascript';\n    script.src = src;\n    document.getElementsByTagName('body')[0].appendChild(script);\n\n    if (callback) {\n        script.onload = callback;\n    }\n}\n\n/**\n * load script to DOM if document ready state is complete or load after window load\n * @param {string} src  url of the script to append\n * @param {function} callback optional callback to fire after load\n */\nfunction loadJsAfterWindowLoad(src, callback) {\n    if (document.readyState === 'complete') {\n        loadScript(src, callback);\n    } else {\n        window.addEventListener('load', function () {\n            loadScript(src, callback);\n        });\n    }\n}\n\n/**\n * Inserts pasted text at cursor location in input or textarea elements.\n * If a range of text is selected in the input, that range will be replaced by the new text\n * If no text in the input is selected, the string will be inserted at the end\n * @param {selector} formInput - DOM element for the target form input\n * @param {string} str - string to insert into the form\n */\nfunction insertAtInputCursor(formInput, str) {\n    var input = formInput;\n    var start = input.selectionStart;\n    var end = input.selectionEnd;\n\n    // Inserts str between selection start and end positions\n    input.value = input.value.substring(0, start) + str + input.value.substring(end);\n    // Update cursor position\n    input.selectionStart = start + str.length;\n    input.selectionEnd = input.selectionStart;\n}\n\n/**\n * Returns validity of date\n * @param {string} stageMessage The name of the stage we're going to.\n * @returns {string} Returns true if the day is within the month. Returns false if it is an invalid date.\n */\nfunction getTimeAndHours(stageMessage) {\n    var date = new Date();\n    var hours = date.getHours();\n    var minutes = date.getMinutes();\n    var ampm = hours >= 12 ? 'PM' : 'AM';\n    hours %= 12;\n    hours = hours || 12; // the hour '0' should be '12'\n    minutes = minutes < 10 ? '0' + minutes : minutes;\n    var strTime = hours + ':' + minutes + ' ' + ampm;\n    return stageMessage + ' ' + strTime;\n}\n// intentionally export loadJsAfterWindowLoad onto global scope\nglobal.cscUtils = global.cscUtils || {};\nglobal.cscUtils.loadJsAfterWindowLoad = loadJsAfterWindowLoad;\n\n/**\n * Converts a string to Title Case.\n * @example\n * 'fRiEnDsHiP is MAGIC' -> 'Friendship Is Magic'\n * 'don't uppercase contractions' -> 'Don't Uppercase Contractions'\n * 'hyphenated-strings work too' -> 'Hyphenated-Strings Work Too'\n * @param {string} str The string to be title cased.\n * @returns {string} The original string in title case.\n */\nfunction stringToTitleCase(str) {\n    return str.replace(/[^\\s/-]+/g, function (word) {\n        return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n    });\n}\n\n/** Function to heapify a subtree rooted with node ndx\n * @param {Array} list - The array to heapify\n * @param {number} ndx - The index of the root of the subtree to heapify\n * @param {number} heapSize - The size of the heap\n * @param {string} key - The object key to find the highest numbers for\n */\nfunction heapify(list, ndx, heapSize, key) {\n    let largest = ndx;\n    // eslint-disable-next-line @stylistic/js/no-mixed-operators\n    const left = 2 * ndx + 1;\n    // eslint-disable-next-line @stylistic/js/no-mixed-operators\n    const right = 2 * ndx + 2;\n\n    // Check if left child is larger than root\n    if (left < heapSize && list[left][key] > list[largest][key]) {\n        largest = left;\n    }\n\n    // Check if right child is larger than root\n    if (right < heapSize && list[right][key] > list[largest][key]) {\n        largest = right;\n    }\n\n    // If largest is not root\n    if (largest !== ndx) {\n        // Swap array[i] and array[largest]\n        // eslint-disable-next-line no-param-reassign\n        [list[ndx], list[largest]] = [list[largest], list[ndx]];\n        // Recursively heapify the affected sub-tree\n        heapify(list, largest, heapSize, key);\n    }\n}\n\n/** Function to heapify the array into max heap\n * @param {Array} list - The array to heapify\n * @param {string} key - The object key to find the highest numbers for\n */\nfunction heapifyMax(list, key) {\n    const arrayLength = list.length;\n\n    // Build max heap\n    for (let ndx = Math.floor(arrayLength / 2) - 1; ndx >= 0; ndx--) {\n        heapify(list, ndx, arrayLength, key);\n    }\n\n    for (let ndx = arrayLength - 1; ndx > 0; ndx--) {\n        let firstListItem = list[0];\n        // eslint-disable-next-line no-param-reassign\n        list[0] = list[ndx];\n        // eslint-disable-next-line no-param-reassign\n        list[ndx] = firstListItem;\n\n        heapify(list, 0, ndx, key);\n    }\n}\n\n/** Function to find the n highest numbers in an array\n * @param {Array} list - The array to find the n highest numbers in\n * @param {number} n - The number of highest numbers to find\n * @param {string} key - The object key to find the highest numbers for\n * @returns {Array} The n highest numbers\n */\nfunction findNHighest(list, n, key) {\n    if (list.length < n) {\n        // eslint-disable-next-line no-param-reassign\n        n = list.length;\n    }\n\n    const listToUse = JSON.parse(JSON.stringify(list)); // Deep copy the list\n    const result = [];\n\n    // Build max heap\n    heapifyMax(listToUse, key);\n\n    for (let i = 0; i < n; i++) {\n        // Extract max element from the max heap\n        result.push(listToUse.pop());\n    }\n\n    return result;\n}\n\n/** Function to compare two objects for deep equality\n * @param {Object} obj1 - The first object to compare\n * @param {Object} obj2 - The second object to compare\n * @returns {boolean} Whether the two objects are deep equal\n */\nfunction deepEqual(obj1, obj2) {\n    return (obj1 && obj2 && typeof obj1 === 'object' && typeof obj2 === 'object') ?\n        (Object.keys(obj1).length === Object.keys(obj2).length) &&\n        Object.keys(obj1).reduce(function (isEqual, key) {\n            return isEqual && deepEqual(obj1[key], obj2[key]);\n        }, true) : (obj1 === obj2);\n}\n\nmodule.exports = {\n    appendParamToURL: appendParamToURL,\n    keyValueArray: keyValueArray,\n    getParamsFromURL: getParamsFromURL,\n    updateURLParam: updateURLParam,\n    arrayIntersection: arrayIntersection,\n    createModalMarkup: createModalMarkup,\n    queryStringToObject: queryStringToObject,\n    objectToQueryString: objectToQueryString,\n    removeQueryParam: removeQueryParam,\n    removeQueryParamFromCurrentUrl: removeQueryParamFromCurrentUrl,\n    createBackdrop: createBackdrop,\n    removeBackdrop: removeBackdrop,\n    setUrlKeyValue: setUrlKeyValue,\n    setUrlData: setUrlData,\n    decodeQueryParam: decodeQueryParam,\n    elementInViewport: elementInViewport,\n    loadJsAfterWindowLoad: loadJsAfterWindowLoad,\n    insertAtInputCursor: insertAtInputCursor,\n    stringToTitleCase,\n    getTimeAndHours: getTimeAndHours,\n    findNHighest: findNHighest,\n    deepEqual: deepEqual\n};\n","'use strict';\n\nmodule.exports = {\n    setTabNextFocus: function (focusParams) {\n        var KEYCODE_TAB = 9;\n        var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n        if (!isTabPressed) {\n            return;\n        }\n\n        var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n        var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n        if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n            lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n            if ($('.product-quickview.product-set').length > 0) {\n                var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n                lastFocusableEl = linkElements[linkElements.length - 1];\n            }\n        }\n\n        if (focusParams.event.shiftKey) /* shift + tab */ {\n            if ($(':focus').is(firstFocusableEl)) {\n                lastFocusableEl.focus();\n                focusParams.event.preventDefault();\n            }\n        } else /* tab */ {\n            if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n                firstFocusableEl.focus();\n                focusParams.event.preventDefault();\n            }\n        }\n    }\n};\n","/**\n * SSR Window 4.0.0\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: August 25, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n    return (obj !== null &&\n        typeof obj === 'object' &&\n        'constructor' in obj &&\n        obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n    Object.keys(src).forEach((key) => {\n        if (typeof target[key] === 'undefined')\n            target[key] = src[key];\n        else if (isObject(src[key]) &&\n            isObject(target[key]) &&\n            Object.keys(src[key]).length > 0) {\n            extend(target[key], src[key]);\n        }\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}\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 { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/**\n * Dom7 4.0.0\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * https://framework7.io/docs/dom7.html\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: August 25, 2021\n */\nimport { getWindow, getDocument } from 'ssr-window';\n\n/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n  const proto = obj.__proto__;\n  Object.defineProperty(obj, '__proto__', {\n    get() {\n      return proto;\n    },\n\n    set(value) {\n      proto.__proto__ = value;\n    }\n\n  });\n}\n\nclass Dom7 extends Array {\n  constructor(items) {\n    super(...(items || []));\n    makeReactive(this);\n  }\n\n}\n\nfunction arrayFlat(arr = []) {\n  const res = [];\n  arr.forEach(el => {\n    if (Array.isArray(el)) {\n      res.push(...arrayFlat(el));\n    } else {\n      res.push(el);\n    }\n  });\n  return res;\n}\nfunction arrayFilter(arr, callback) {\n  return Array.prototype.filter.call(arr, callback);\n}\nfunction arrayUnique(arr) {\n  const uniqueArray = [];\n\n  for (let i = 0; i < arr.length; i += 1) {\n    if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n  }\n\n  return uniqueArray;\n}\nfunction toCamelCase(string) {\n  return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n\n// eslint-disable-next-line\n\nfunction qsa(selector, context) {\n  if (typeof selector !== 'string') {\n    return [selector];\n  }\n\n  const a = [];\n  const res = context.querySelectorAll(selector);\n\n  for (let i = 0; i < res.length; i += 1) {\n    a.push(res[i]);\n  }\n\n  return a;\n}\n\nfunction $(selector, context) {\n  const window = getWindow();\n  const document = getDocument();\n  let arr = [];\n\n  if (!context && selector instanceof Dom7) {\n    return selector;\n  }\n\n  if (!selector) {\n    return new Dom7(arr);\n  }\n\n  if (typeof selector === 'string') {\n    const html = selector.trim();\n\n    if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n      let toCreate = 'div';\n      if (html.indexOf('<li') === 0) toCreate = 'ul';\n      if (html.indexOf('<tr') === 0) toCreate = 'tbody';\n      if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr';\n      if (html.indexOf('<tbody') === 0) toCreate = 'table';\n      if (html.indexOf('<option') === 0) toCreate = 'select';\n      const tempParent = document.createElement(toCreate);\n      tempParent.innerHTML = html;\n\n      for (let i = 0; i < tempParent.childNodes.length; i += 1) {\n        arr.push(tempParent.childNodes[i]);\n      }\n    } else {\n      arr = qsa(selector.trim(), context || document);\n    } // arr = qsa(selector, document);\n\n  } else if (selector.nodeType || selector === window || selector === document) {\n    arr.push(selector);\n  } else if (Array.isArray(selector)) {\n    if (selector instanceof Dom7) return selector;\n    arr = selector;\n  }\n\n  return new Dom7(arrayUnique(arr));\n}\n\n$.fn = Dom7.prototype;\n\n// eslint-disable-next-line\n\nfunction addClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    el.classList.add(...classNames);\n  });\n  return this;\n}\n\nfunction removeClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    el.classList.remove(...classNames);\n  });\n  return this;\n}\n\nfunction toggleClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    classNames.forEach(className => {\n      el.classList.toggle(className);\n    });\n  });\n}\n\nfunction hasClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  return arrayFilter(this, el => {\n    return classNames.filter(className => el.classList.contains(className)).length > 0;\n  }).length > 0;\n}\n\nfunction attr(attrs, value) {\n  if (arguments.length === 1 && typeof attrs === 'string') {\n    // Get attr\n    if (this[0]) return this[0].getAttribute(attrs);\n    return undefined;\n  } // Set attrs\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (arguments.length === 2) {\n      // String\n      this[i].setAttribute(attrs, value);\n    } else {\n      // Object\n      for (const attrName in attrs) {\n        this[i][attrName] = attrs[attrName];\n        this[i].setAttribute(attrName, attrs[attrName]);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction removeAttr(attr) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].removeAttribute(attr);\n  }\n\n  return this;\n}\n\nfunction prop(props, value) {\n  if (arguments.length === 1 && typeof props === 'string') {\n    // Get prop\n    if (this[0]) return this[0][props];\n  } else {\n    // Set props\n    for (let i = 0; i < this.length; i += 1) {\n      if (arguments.length === 2) {\n        // String\n        this[i][props] = value;\n      } else {\n        // Object\n        for (const propName in props) {\n          this[i][propName] = props[propName];\n        }\n      }\n    }\n\n    return this;\n  }\n\n  return this;\n}\n\nfunction data(key, value) {\n  let el;\n\n  if (typeof value === 'undefined') {\n    el = this[0];\n    if (!el) return undefined; // Get value\n\n    if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n      return el.dom7ElementDataStorage[key];\n    }\n\n    const dataKey = el.getAttribute(`data-${key}`);\n\n    if (dataKey) {\n      return dataKey;\n    }\n\n    return undefined;\n  } // Set value\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    el = this[i];\n    if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n    el.dom7ElementDataStorage[key] = value;\n  }\n\n  return this;\n}\n\nfunction removeData(key) {\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n      el.dom7ElementDataStorage[key] = null;\n      delete el.dom7ElementDataStorage[key];\n    }\n  }\n}\n\nfunction dataset() {\n  const el = this[0];\n  if (!el) return undefined;\n  const dataset = {}; // eslint-disable-line\n\n  if (el.dataset) {\n    for (const dataKey in el.dataset) {\n      dataset[dataKey] = el.dataset[dataKey];\n    }\n  } else {\n    for (let i = 0; i < el.attributes.length; i += 1) {\n      const attr = el.attributes[i];\n\n      if (attr.name.indexOf('data-') >= 0) {\n        dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n      }\n    }\n  }\n\n  for (const key in dataset) {\n    if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n  }\n\n  return dataset;\n}\n\nfunction val(value) {\n  if (typeof value === 'undefined') {\n    // get value\n    const el = this[0];\n    if (!el) return undefined;\n\n    if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n      const values = [];\n\n      for (let i = 0; i < el.selectedOptions.length; i += 1) {\n        values.push(el.selectedOptions[i].value);\n      }\n\n      return values;\n    }\n\n    return el.value;\n  } // set value\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {\n      for (let j = 0; j < el.options.length; j += 1) {\n        el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n      }\n    } else {\n      el.value = value;\n    }\n  }\n\n  return this;\n}\n\nfunction value(value) {\n  return this.val(value);\n}\n\nfunction transform(transform) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.transform = transform;\n  }\n\n  return this;\n}\n\nfunction transition(duration) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration;\n  }\n\n  return this;\n}\n\nfunction on(...args) {\n  let [eventType, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventType, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  if (!capture) capture = false;\n\n  function handleLiveEvent(e) {\n    const target = e.target;\n    if (!target) return;\n    const eventData = e.target.dom7EventData || [];\n\n    if (eventData.indexOf(e) < 0) {\n      eventData.unshift(e);\n    }\n\n    if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n      const parents = $(target).parents(); // eslint-disable-line\n\n      for (let k = 0; k < parents.length; k += 1) {\n        if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData);\n      }\n    }\n  }\n\n  function handleEvent(e) {\n    const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n    if (eventData.indexOf(e) < 0) {\n      eventData.unshift(e);\n    }\n\n    listener.apply(this, eventData);\n  }\n\n  const events = eventType.split(' ');\n  let j;\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (!targetSelector) {\n      for (j = 0; j < events.length; j += 1) {\n        const event = events[j];\n        if (!el.dom7Listeners) el.dom7Listeners = {};\n        if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n        el.dom7Listeners[event].push({\n          listener,\n          proxyListener: handleEvent\n        });\n        el.addEventListener(event, handleEvent, capture);\n      }\n    } else {\n      // Live events\n      for (j = 0; j < events.length; j += 1) {\n        const event = events[j];\n        if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n        if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n        el.dom7LiveListeners[event].push({\n          listener,\n          proxyListener: handleLiveEvent\n        });\n        el.addEventListener(event, handleLiveEvent, capture);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction off(...args) {\n  let [eventType, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventType, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  if (!capture) capture = false;\n  const events = eventType.split(' ');\n\n  for (let i = 0; i < events.length; i += 1) {\n    const event = events[i];\n\n    for (let j = 0; j < this.length; j += 1) {\n      const el = this[j];\n      let handlers;\n\n      if (!targetSelector && el.dom7Listeners) {\n        handlers = el.dom7Listeners[event];\n      } else if (targetSelector && el.dom7LiveListeners) {\n        handlers = el.dom7LiveListeners[event];\n      }\n\n      if (handlers && handlers.length) {\n        for (let k = handlers.length - 1; k >= 0; k -= 1) {\n          const handler = handlers[k];\n\n          if (listener && handler.listener === listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          } else if (!listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          }\n        }\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction once(...args) {\n  const dom = this;\n  let [eventName, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventName, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  function onceHandler(...eventArgs) {\n    listener.apply(this, eventArgs);\n    dom.off(eventName, targetSelector, onceHandler, capture);\n\n    if (onceHandler.dom7proxy) {\n      delete onceHandler.dom7proxy;\n    }\n  }\n\n  onceHandler.dom7proxy = listener;\n  return dom.on(eventName, targetSelector, onceHandler, capture);\n}\n\nfunction trigger(...args) {\n  const window = getWindow();\n  const events = args[0].split(' ');\n  const eventData = args[1];\n\n  for (let i = 0; i < events.length; i += 1) {\n    const event = events[i];\n\n    for (let j = 0; j < this.length; j += 1) {\n      const el = this[j];\n\n      if (window.CustomEvent) {\n        const evt = new window.CustomEvent(event, {\n          detail: eventData,\n          bubbles: true,\n          cancelable: true\n        });\n        el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n        el.dispatchEvent(evt);\n        el.dom7EventData = [];\n        delete el.dom7EventData;\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction transitionEnd(callback) {\n  const dom = this;\n\n  function fireCallBack(e) {\n    if (e.target !== this) return;\n    callback.call(this, e);\n    dom.off('transitionend', fireCallBack);\n  }\n\n  if (callback) {\n    dom.on('transitionend', fireCallBack);\n  }\n\n  return this;\n}\n\nfunction animationEnd(callback) {\n  const dom = this;\n\n  function fireCallBack(e) {\n    if (e.target !== this) return;\n    callback.call(this, e);\n    dom.off('animationend', fireCallBack);\n  }\n\n  if (callback) {\n    dom.on('animationend', fireCallBack);\n  }\n\n  return this;\n}\n\nfunction width() {\n  const window = getWindow();\n\n  if (this[0] === window) {\n    return window.innerWidth;\n  }\n\n  if (this.length > 0) {\n    return parseFloat(this.css('width'));\n  }\n\n  return null;\n}\n\nfunction outerWidth(includeMargins) {\n  if (this.length > 0) {\n    if (includeMargins) {\n      const styles = this.styles();\n      return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n    }\n\n    return this[0].offsetWidth;\n  }\n\n  return null;\n}\n\nfunction height() {\n  const window = getWindow();\n\n  if (this[0] === window) {\n    return window.innerHeight;\n  }\n\n  if (this.length > 0) {\n    return parseFloat(this.css('height'));\n  }\n\n  return null;\n}\n\nfunction outerHeight(includeMargins) {\n  if (this.length > 0) {\n    if (includeMargins) {\n      const styles = this.styles();\n      return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n    }\n\n    return this[0].offsetHeight;\n  }\n\n  return null;\n}\n\nfunction offset() {\n  if (this.length > 0) {\n    const window = getWindow();\n    const document = getDocument();\n    const el = this[0];\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  }\n\n  return null;\n}\n\nfunction hide() {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.display = 'none';\n  }\n\n  return this;\n}\n\nfunction show() {\n  const window = getWindow();\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.style.display === 'none') {\n      el.style.display = '';\n    }\n\n    if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n      // Still not visible\n      el.style.display = 'block';\n    }\n  }\n\n  return this;\n}\n\nfunction styles() {\n  const window = getWindow();\n  if (this[0]) return window.getComputedStyle(this[0], null);\n  return {};\n}\n\nfunction css(props, value) {\n  const window = getWindow();\n  let i;\n\n  if (arguments.length === 1) {\n    if (typeof props === 'string') {\n      // .css('width')\n      if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n    } else {\n      // .css({ width: '100px' })\n      for (i = 0; i < this.length; i += 1) {\n        for (const prop in props) {\n          this[i].style[prop] = props[prop];\n        }\n      }\n\n      return this;\n    }\n  }\n\n  if (arguments.length === 2 && typeof props === 'string') {\n    // .css('width', '100px')\n    for (i = 0; i < this.length; i += 1) {\n      this[i].style[props] = value;\n    }\n\n    return this;\n  }\n\n  return this;\n}\n\nfunction each(callback) {\n  if (!callback) return this;\n  this.forEach((el, index) => {\n    callback.apply(el, [el, index]);\n  });\n  return this;\n}\n\nfunction filter(callback) {\n  const result = arrayFilter(this, callback);\n  return $(result);\n}\n\nfunction html(html) {\n  if (typeof html === 'undefined') {\n    return this[0] ? this[0].innerHTML : null;\n  }\n\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].innerHTML = html;\n  }\n\n  return this;\n}\n\nfunction text(text) {\n  if (typeof text === 'undefined') {\n    return this[0] ? this[0].textContent.trim() : null;\n  }\n\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].textContent = text;\n  }\n\n  return this;\n}\n\nfunction is(selector) {\n  const window = getWindow();\n  const document = getDocument();\n  const el = this[0];\n  let compareWith;\n  let i;\n  if (!el || typeof selector === 'undefined') return false;\n\n  if (typeof selector === 'string') {\n    if (el.matches) return el.matches(selector);\n    if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n    if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n    compareWith = $(selector);\n\n    for (i = 0; i < compareWith.length; i += 1) {\n      if (compareWith[i] === el) return true;\n    }\n\n    return false;\n  }\n\n  if (selector === document) {\n    return el === document;\n  }\n\n  if (selector === window) {\n    return el === window;\n  }\n\n  if (selector.nodeType || selector instanceof Dom7) {\n    compareWith = selector.nodeType ? [selector] : selector;\n\n    for (i = 0; i < compareWith.length; i += 1) {\n      if (compareWith[i] === el) return true;\n    }\n\n    return false;\n  }\n\n  return false;\n}\n\nfunction index() {\n  let child = this[0];\n  let i;\n\n  if (child) {\n    i = 0; // eslint-disable-next-line\n\n    while ((child = child.previousSibling) !== null) {\n      if (child.nodeType === 1) i += 1;\n    }\n\n    return i;\n  }\n\n  return undefined;\n}\n\nfunction eq(index) {\n  if (typeof index === 'undefined') return this;\n  const length = this.length;\n\n  if (index > length - 1) {\n    return $([]);\n  }\n\n  if (index < 0) {\n    const returnIndex = length + index;\n    if (returnIndex < 0) return $([]);\n    return $([this[returnIndex]]);\n  }\n\n  return $([this[index]]);\n}\n\nfunction append(...els) {\n  let newChild;\n  const document = getDocument();\n\n  for (let k = 0; k < els.length; k += 1) {\n    newChild = els[k];\n\n    for (let i = 0; i < this.length; i += 1) {\n      if (typeof newChild === 'string') {\n        const tempDiv = document.createElement('div');\n        tempDiv.innerHTML = newChild;\n\n        while (tempDiv.firstChild) {\n          this[i].appendChild(tempDiv.firstChild);\n        }\n      } else if (newChild instanceof Dom7) {\n        for (let j = 0; j < newChild.length; j += 1) {\n          this[i].appendChild(newChild[j]);\n        }\n      } else {\n        this[i].appendChild(newChild);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction appendTo(parent) {\n  $(parent).append(this);\n  return this;\n}\n\nfunction prepend(newChild) {\n  const document = getDocument();\n  let i;\n  let j;\n\n  for (i = 0; i < this.length; i += 1) {\n    if (typeof newChild === 'string') {\n      const tempDiv = document.createElement('div');\n      tempDiv.innerHTML = newChild;\n\n      for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n        this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n      }\n    } else if (newChild instanceof Dom7) {\n      for (j = 0; j < newChild.length; j += 1) {\n        this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n      }\n    } else {\n      this[i].insertBefore(newChild, this[i].childNodes[0]);\n    }\n  }\n\n  return this;\n}\n\nfunction prependTo(parent) {\n  $(parent).prepend(this);\n  return this;\n}\n\nfunction insertBefore(selector) {\n  const before = $(selector);\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (before.length === 1) {\n      before[0].parentNode.insertBefore(this[i], before[0]);\n    } else if (before.length > 1) {\n      for (let j = 0; j < before.length; j += 1) {\n        before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n      }\n    }\n  }\n}\n\nfunction insertAfter(selector) {\n  const after = $(selector);\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (after.length === 1) {\n      after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n    } else if (after.length > 1) {\n      for (let j = 0; j < after.length; j += 1) {\n        after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n      }\n    }\n  }\n}\n\nfunction next(selector) {\n  if (this.length > 0) {\n    if (selector) {\n      if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n        return $([this[0].nextElementSibling]);\n      }\n\n      return $([]);\n    }\n\n    if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n    return $([]);\n  }\n\n  return $([]);\n}\n\nfunction nextAll(selector) {\n  const nextEls = [];\n  let el = this[0];\n  if (!el) return $([]);\n\n  while (el.nextElementSibling) {\n    const next = el.nextElementSibling; // eslint-disable-line\n\n    if (selector) {\n      if ($(next).is(selector)) nextEls.push(next);\n    } else nextEls.push(next);\n\n    el = next;\n  }\n\n  return $(nextEls);\n}\n\nfunction prev(selector) {\n  if (this.length > 0) {\n    const el = this[0];\n\n    if (selector) {\n      if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n        return $([el.previousElementSibling]);\n      }\n\n      return $([]);\n    }\n\n    if (el.previousElementSibling) return $([el.previousElementSibling]);\n    return $([]);\n  }\n\n  return $([]);\n}\n\nfunction prevAll(selector) {\n  const prevEls = [];\n  let el = this[0];\n  if (!el) return $([]);\n\n  while (el.previousElementSibling) {\n    const prev = el.previousElementSibling; // eslint-disable-line\n\n    if (selector) {\n      if ($(prev).is(selector)) prevEls.push(prev);\n    } else prevEls.push(prev);\n\n    el = prev;\n  }\n\n  return $(prevEls);\n}\n\nfunction siblings(selector) {\n  return this.nextAll(selector).add(this.prevAll(selector));\n}\n\nfunction parent(selector) {\n  const parents = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (this[i].parentNode !== null) {\n      if (selector) {\n        if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n      } else {\n        parents.push(this[i].parentNode);\n      }\n    }\n  }\n\n  return $(parents);\n}\n\nfunction parents(selector) {\n  const parents = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    let parent = this[i].parentNode; // eslint-disable-line\n\n    while (parent) {\n      if (selector) {\n        if ($(parent).is(selector)) parents.push(parent);\n      } else {\n        parents.push(parent);\n      }\n\n      parent = parent.parentNode;\n    }\n  }\n\n  return $(parents);\n}\n\nfunction closest(selector) {\n  let closest = this; // eslint-disable-line\n\n  if (typeof selector === 'undefined') {\n    return $([]);\n  }\n\n  if (!closest.is(selector)) {\n    closest = closest.parents(selector).eq(0);\n  }\n\n  return closest;\n}\n\nfunction find(selector) {\n  const foundElements = [];\n\n  for (let i = 0; i < this.length; i += 1) {\n    const found = this[i].querySelectorAll(selector);\n\n    for (let j = 0; j < found.length; j += 1) {\n      foundElements.push(found[j]);\n    }\n  }\n\n  return $(foundElements);\n}\n\nfunction children(selector) {\n  const children = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    const childNodes = this[i].children;\n\n    for (let j = 0; j < childNodes.length; j += 1) {\n      if (!selector || $(childNodes[j]).is(selector)) {\n        children.push(childNodes[j]);\n      }\n    }\n  }\n\n  return $(children);\n}\n\nfunction remove() {\n  for (let i = 0; i < this.length; i += 1) {\n    if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n  }\n\n  return this;\n}\n\nfunction detach() {\n  return this.remove();\n}\n\nfunction add(...els) {\n  const dom = this;\n  let i;\n  let j;\n\n  for (i = 0; i < els.length; i += 1) {\n    const toAdd = $(els[i]);\n\n    for (j = 0; j < toAdd.length; j += 1) {\n      dom.push(toAdd[j]);\n    }\n  }\n\n  return dom;\n}\n\nfunction empty() {\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.nodeType === 1) {\n      for (let j = 0; j < el.childNodes.length; j += 1) {\n        if (el.childNodes[j].parentNode) {\n          el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n        }\n      }\n\n      el.textContent = '';\n    }\n  }\n\n  return this;\n}\n\n// eslint-disable-next-line\n\nfunction scrollTo(...args) {\n  const window = getWindow();\n  let [left, top, duration, easing, callback] = args;\n\n  if (args.length === 4 && typeof easing === 'function') {\n    callback = easing;\n    [left, top, duration, callback, easing] = args;\n  }\n\n  if (typeof easing === 'undefined') easing = 'swing';\n  return this.each(function animate() {\n    const el = this;\n    let currentTop;\n    let currentLeft;\n    let maxTop;\n    let maxLeft;\n    let newTop;\n    let newLeft;\n    let scrollTop; // eslint-disable-line\n\n    let scrollLeft; // eslint-disable-line\n\n    let animateTop = top > 0 || top === 0;\n    let animateLeft = left > 0 || left === 0;\n\n    if (typeof easing === 'undefined') {\n      easing = 'swing';\n    }\n\n    if (animateTop) {\n      currentTop = el.scrollTop;\n\n      if (!duration) {\n        el.scrollTop = top;\n      }\n    }\n\n    if (animateLeft) {\n      currentLeft = el.scrollLeft;\n\n      if (!duration) {\n        el.scrollLeft = left;\n      }\n    }\n\n    if (!duration) return;\n\n    if (animateTop) {\n      maxTop = el.scrollHeight - el.offsetHeight;\n      newTop = Math.max(Math.min(top, maxTop), 0);\n    }\n\n    if (animateLeft) {\n      maxLeft = el.scrollWidth - el.offsetWidth;\n      newLeft = Math.max(Math.min(left, maxLeft), 0);\n    }\n\n    let startTime = null;\n    if (animateTop && newTop === currentTop) animateTop = false;\n    if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n    function render(time = new Date().getTime()) {\n      if (startTime === null) {\n        startTime = time;\n      }\n\n      const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n      const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n      let done;\n      if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n      if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n      if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n        el.scrollTop = newTop;\n        done = true;\n      }\n\n      if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n        el.scrollTop = newTop;\n        done = true;\n      }\n\n      if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n        el.scrollLeft = newLeft;\n        done = true;\n      }\n\n      if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n        el.scrollLeft = newLeft;\n        done = true;\n      }\n\n      if (done) {\n        if (callback) callback();\n        return;\n      }\n\n      if (animateTop) el.scrollTop = scrollTop;\n      if (animateLeft) el.scrollLeft = scrollLeft;\n      window.requestAnimationFrame(render);\n    }\n\n    window.requestAnimationFrame(render);\n  });\n} // scrollTop(top, duration, easing, callback) {\n\n\nfunction scrollTop(...args) {\n  let [top, duration, easing, callback] = args;\n\n  if (args.length === 3 && typeof easing === 'function') {\n    [top, duration, callback, easing] = args;\n  }\n\n  const dom = this;\n\n  if (typeof top === 'undefined') {\n    if (dom.length > 0) return dom[0].scrollTop;\n    return null;\n  }\n\n  return dom.scrollTo(undefined, top, duration, easing, callback);\n}\n\nfunction scrollLeft(...args) {\n  let [left, duration, easing, callback] = args;\n\n  if (args.length === 3 && typeof easing === 'function') {\n    [left, duration, callback, easing] = args;\n  }\n\n  const dom = this;\n\n  if (typeof left === 'undefined') {\n    if (dom.length > 0) return dom[0].scrollLeft;\n    return null;\n  }\n\n  return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\n// eslint-disable-next-line\n\nfunction animate(initialProps, initialParams) {\n  const window = getWindow();\n  const els = this;\n  const a = {\n    props: Object.assign({}, initialProps),\n    params: Object.assign({\n      duration: 300,\n      easing: 'swing' // or 'linear'\n\n      /* Callbacks\n      begin(elements)\n      complete(elements)\n      progress(elements, complete, remaining, start, tweenValue)\n      */\n\n    }, initialParams),\n    elements: els,\n    animating: false,\n    que: [],\n\n    easingProgress(easing, progress) {\n      if (easing === 'swing') {\n        return 0.5 - Math.cos(progress * Math.PI) / 2;\n      }\n\n      if (typeof easing === 'function') {\n        return easing(progress);\n      }\n\n      return progress;\n    },\n\n    stop() {\n      if (a.frameId) {\n        window.cancelAnimationFrame(a.frameId);\n      }\n\n      a.animating = false;\n      a.elements.each(el => {\n        const element = el;\n        delete element.dom7AnimateInstance;\n      });\n      a.que = [];\n    },\n\n    done(complete) {\n      a.animating = false;\n      a.elements.each(el => {\n        const element = el;\n        delete element.dom7AnimateInstance;\n      });\n      if (complete) complete(els);\n\n      if (a.que.length > 0) {\n        const que = a.que.shift();\n        a.animate(que[0], que[1]);\n      }\n    },\n\n    animate(props, params) {\n      if (a.animating) {\n        a.que.push([props, params]);\n        return a;\n      }\n\n      const elements = []; // Define & Cache Initials & Units\n\n      a.elements.each((el, index) => {\n        let initialFullValue;\n        let initialValue;\n        let unit;\n        let finalValue;\n        let finalFullValue;\n        if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n        elements[index] = {\n          container: el\n        };\n        Object.keys(props).forEach(prop => {\n          initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n          initialValue = parseFloat(initialFullValue);\n          unit = initialFullValue.replace(initialValue, '');\n          finalValue = parseFloat(props[prop]);\n          finalFullValue = props[prop] + unit;\n          elements[index][prop] = {\n            initialFullValue,\n            initialValue,\n            unit,\n            finalValue,\n            finalFullValue,\n            currentValue: initialValue\n          };\n        });\n      });\n      let startTime = null;\n      let time;\n      let elementsDone = 0;\n      let propsDone = 0;\n      let done;\n      let began = false;\n      a.animating = true;\n\n      function render() {\n        time = new Date().getTime();\n        let progress;\n        let easeProgress; // let el;\n\n        if (!began) {\n          began = true;\n          if (params.begin) params.begin(els);\n        }\n\n        if (startTime === null) {\n          startTime = time;\n        }\n\n        if (params.progress) {\n          // eslint-disable-next-line\n          params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n        }\n\n        elements.forEach(element => {\n          const el = element;\n          if (done || el.done) return;\n          Object.keys(props).forEach(prop => {\n            if (done || el.done) return;\n            progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n            easeProgress = a.easingProgress(params.easing, progress);\n            const {\n              initialValue,\n              finalValue,\n              unit\n            } = el[prop];\n            el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n            const currentValue = el[prop].currentValue;\n\n            if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n              el.container.style[prop] = finalValue + unit;\n              propsDone += 1;\n\n              if (propsDone === Object.keys(props).length) {\n                el.done = true;\n                elementsDone += 1;\n              }\n\n              if (elementsDone === elements.length) {\n                done = true;\n              }\n            }\n\n            if (done) {\n              a.done(params.complete);\n              return;\n            }\n\n            el.container.style[prop] = currentValue + unit;\n          });\n        });\n        if (done) return; // Then call\n\n        a.frameId = window.requestAnimationFrame(render);\n      }\n\n      a.frameId = window.requestAnimationFrame(render);\n      return a;\n    }\n\n  };\n\n  if (a.elements.length === 0) {\n    return els;\n  }\n\n  let animateInstance;\n\n  for (let i = 0; i < a.elements.length; i += 1) {\n    if (a.elements[i].dom7AnimateInstance) {\n      animateInstance = a.elements[i].dom7AnimateInstance;\n    } else a.elements[i].dom7AnimateInstance = a;\n  }\n\n  if (!animateInstance) {\n    animateInstance = a;\n  }\n\n  if (initialProps === 'stop') {\n    animateInstance.stop();\n  } else {\n    animateInstance.animate(a.props, a.params);\n  }\n\n  return els;\n}\n\nfunction stop() {\n  const els = this;\n\n  for (let i = 0; i < els.length; i += 1) {\n    if (els[i].dom7AnimateInstance) {\n      els[i].dom7AnimateInstance.stop();\n    }\n  }\n}\n\nconst noTrigger = 'resize scroll'.split(' ');\n\nfunction shortcut(name) {\n  function eventHandler(...args) {\n    if (typeof args[0] === 'undefined') {\n      for (let i = 0; i < this.length; i += 1) {\n        if (noTrigger.indexOf(name) < 0) {\n          if (name in this[i]) this[i][name]();else {\n            $(this[i]).trigger(name);\n          }\n        }\n      }\n\n      return this;\n    }\n\n    return this.on(name, ...args);\n  }\n\n  return eventHandler;\n}\n\nconst click = shortcut('click');\nconst blur = shortcut('blur');\nconst focus = shortcut('focus');\nconst focusin = shortcut('focusin');\nconst focusout = shortcut('focusout');\nconst keyup = shortcut('keyup');\nconst keydown = shortcut('keydown');\nconst keypress = shortcut('keypress');\nconst submit = shortcut('submit');\nconst change = shortcut('change');\nconst mousedown = shortcut('mousedown');\nconst mousemove = shortcut('mousemove');\nconst mouseup = shortcut('mouseup');\nconst mouseenter = shortcut('mouseenter');\nconst mouseleave = shortcut('mouseleave');\nconst mouseout = shortcut('mouseout');\nconst mouseover = shortcut('mouseover');\nconst touchstart = shortcut('touchstart');\nconst touchend = shortcut('touchend');\nconst touchmove = shortcut('touchmove');\nconst resize = shortcut('resize');\nconst scroll = shortcut('scroll');\n\nexport default $;\nexport { $, add, addClass, animate, animationEnd, append, appendTo, attr, blur, change, children, click, closest, css, data, dataset, detach, each, empty, eq, filter, find, focus, focusin, focusout, hasClass, height, hide, html, index, insertAfter, insertBefore, is, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, next, nextAll, off, offset, on, once, outerHeight, outerWidth, parent, parents, prepend, prependTo, prev, prevAll, prop, remove, removeAttr, removeClass, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, styles, submit, text, toggleClass, touchend, touchmove, touchstart, transform, transition, transitionEnd, trigger, val, value, width };\n","import {\n  $,\n  addClass,\n  removeClass,\n  hasClass,\n  toggleClass,\n  attr,\n  removeAttr,\n  transform,\n  transition,\n  on,\n  off,\n  trigger,\n  transitionEnd,\n  outerWidth,\n  outerHeight,\n  styles,\n  offset,\n  css,\n  each,\n  html,\n  text,\n  is,\n  index,\n  eq,\n  append,\n  prepend,\n  next,\n  nextAll,\n  prev,\n  prevAll,\n  parent,\n  parents,\n  closest,\n  find,\n  children,\n  filter,\n  remove,\n} from 'dom7';\n\nconst Methods = {\n  addClass,\n  removeClass,\n  hasClass,\n  toggleClass,\n  attr,\n  removeAttr,\n  transform,\n  transition,\n  on,\n  off,\n  trigger,\n  transitionEnd,\n  outerWidth,\n  outerHeight,\n  styles,\n  offset,\n  css,\n  each,\n  html,\n  text,\n  is,\n  index,\n  eq,\n  append,\n  prepend,\n  next,\n  nextAll,\n  prev,\n  prevAll,\n  parent,\n  parents,\n  closest,\n  find,\n  children,\n  filter,\n  remove,\n};\n\nObject.keys(Methods).forEach((methodName) => {\n  Object.defineProperty($.fn, methodName, { value: Methods[methodName], writable: true });\n});\n\nexport default $;\n","import { getWindow, getDocument } from 'ssr-window';\n\nlet support;\n\nfunction calcSupport() {\n  const window = getWindow();\n  const document = getDocument();\n\n  return {\n    smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style,\n\n    touch: !!(\n      'ontouchstart' in window ||\n      (window.DocumentTouch && document instanceof window.DocumentTouch)\n    ),\n\n    passiveListener: (function checkPassiveListener() {\n      let supportsPassive = false;\n      try {\n        const opts = Object.defineProperty({}, 'passive', {\n          // eslint-disable-next-line\n          get() {\n            supportsPassive = true;\n          },\n        });\n        window.addEventListener('testPassiveListener', null, opts);\n      } catch (e) {\n        // No support\n      }\n      return supportsPassive;\n    })(),\n\n    gestures: (function checkGestures() {\n      return 'ongesturestart' in window;\n    })(),\n  };\n}\n\nfunction getSupport() {\n  if (!support) {\n    support = calcSupport();\n  }\n  return support;\n}\n\nexport { getSupport };\n","import { getWindow } from 'ssr-window';\nimport { getSupport } from './get-support.js';\n\nlet deviceCached;\n\nfunction calcDevice({ userAgent } = {}) {\n  const support = getSupport();\n  const window = getWindow();\n  const platform = window.navigator.platform;\n  const ua = userAgent || window.navigator.userAgent;\n\n  const device = {\n    ios: false,\n    android: false,\n  };\n\n  const screenWidth = window.screen.width;\n  const screenHeight = window.screen.height;\n\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 = [\n    '1024x1366',\n    '1366x1024',\n    '834x1194',\n    '1194x834',\n    '834x1112',\n    '1112x834',\n    '768x1024',\n    '1024x768',\n    '820x1180',\n    '1180x820',\n    '810x1080',\n    '1080x810',\n  ];\n  if (\n    !ipad &&\n    macos &&\n    support.touch &&\n    iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0\n  ) {\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}\n\nfunction getDevice(overrides = {}) {\n  if (!deviceCached) {\n    deviceCached = calcDevice(overrides);\n  }\n  return deviceCached;\n}\n\nexport { getDevice };\n","import { getWindow } from 'ssr-window';\n\nlet browser;\n\nfunction calcBrowser() {\n  const window = getWindow();\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  return {\n    isSafari: isSafari(),\n    isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent),\n  };\n}\n\nfunction getBrowser() {\n  if (!browser) {\n    browser = calcBrowser();\n  }\n  return browser;\n}\n\nexport { getBrowser };\n","import { getWindow } from 'ssr-window';\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 = 0) {\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\n  return style;\n}\nfunction getTranslate(el, axis = 'x') {\n  const window = getWindow();\n  let matrix;\n  let curTransform;\n  let transformMatrix;\n\n  const curStyle = getComputedStyle(el, null);\n\n  if (window.WebKitCSSMatrix) {\n    curTransform = curStyle.transform || curStyle.webkitTransform;\n    if (curTransform.split(',').length > 6) {\n      curTransform = curTransform\n        .split(', ')\n        .map((a) => a.replace(',', '.'))\n        .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 =\n      curStyle.MozTransform ||\n      curStyle.OTransform ||\n      curStyle.MsTransform ||\n      curStyle.msTransform ||\n      curStyle.transform ||\n      curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n    matrix = transformMatrix.toString().split(',');\n  }\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 (\n    typeof o === 'object' &&\n    o !== null &&\n    o.constructor &&\n    Object.prototype.toString.call(o).slice(8, -1) === 'Object'\n  );\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(...args) {\n  const to = Object(args[0]);\n  const noExtend = ['__proto__', 'constructor', 'prototype'];\n  for (let i = 1; i < args.length; i += 1) {\n    const nextSource = args[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}\n\nfunction setCSSProperty(el, varName, varValue) {\n  el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll({ swiper, targetPosition, side }) {\n  const window = getWindow();\n  const startPosition = -swiper.translate;\n  let startTime = null;\n  let time;\n  const duration = swiper.params.speed;\n\n  swiper.wrapperEl.style.scrollSnapType = 'none';\n  window.cancelAnimationFrame(swiper.cssModeFrameID);\n\n  const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n  const isOutOfBound = (current, target) => {\n    return (dir === 'next' && current >= target) || (dir === 'prev' && current <= target);\n  };\n\n  const animate = () => {\n    time = new Date().getTime();\n    if (startTime === null) {\n      startTime = time;\n    }\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\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}\n\nexport {\n  animateCSSModeScroll,\n  deleteProps,\n  nextTick,\n  now,\n  getTranslate,\n  isObject,\n  extend,\n  getComputedStyle,\n  setCSSProperty,\n};\n","export default function transitionEmit({ swiper, runCallbacks, direction, step }) {\n  const { activeIndex, previousIndex } = swiper;\n  let dir = direction;\n  if (!dir) {\n    if (activeIndex > previousIndex) dir = 'next';\n    else if (activeIndex < previousIndex) dir = 'prev';\n    else dir = 'reset';\n  }\n\n  swiper.emit(`transition${step}`);\n\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","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\n// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\nfunction closestElement(selector, base = this) {\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    return found || __closestFrom(el.getRootNode().host);\n  }\n  return __closestFrom(base);\n}\n\nexport default function onTouchStart(event) {\n  const swiper = this;\n  const document = getDocument();\n  const window = getWindow();\n\n  const data = swiper.touchEventsData;\n  const { params, touches, enabled } = swiper;\n  if (!enabled) return;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return;\n  }\n  if (!swiper.animating && params.cssMode && params.loop) {\n    swiper.loopFix();\n  }\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  let $targetEl = $(e.target);\n\n  if (params.touchEventsTarget === 'wrapper') {\n    if (!$targetEl.closest(swiper.wrapperEl).length) return;\n  }\n  data.isTouchEvent = e.type === 'touchstart';\n  if (!data.isTouchEvent && 'which' in e && e.which === 3) return;\n  if (!data.isTouchEvent && '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  if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {\n    $targetEl = $(event.path[0]);\n  }\n\n  const noSwipingSelector = params.noSwipingSelector\n    ? params.noSwipingSelector\n    : `.${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 (\n    params.noSwiping &&\n    (isTargetShadow\n      ? closestElement(noSwipingSelector, e.target)\n      : $targetEl.closest(noSwipingSelector)[0])\n  ) {\n    swiper.allowClick = true;\n    return;\n  }\n\n  if (params.swipeHandler) {\n    if (!$targetEl.closest(params.swipeHandler)[0]) return;\n  }\n\n  touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n  touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : 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  const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n  const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n  if (\n    edgeSwipeDetection &&\n    (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)\n  ) {\n    if (edgeSwipeDetection === 'prevent') {\n      event.preventDefault();\n    } else {\n      return;\n    }\n  }\n\n  Object.assign(data, {\n    isTouched: true,\n    isMoved: false,\n    allowTouchCallbacks: true,\n    isScrolling: undefined,\n    startMoving: undefined,\n  });\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  if (e.type !== 'touchstart') {\n    let preventDefault = true;\n    if ($targetEl.is(data.focusableElements)) preventDefault = false;\n    if (\n      document.activeElement &&\n      $(document.activeElement).is(data.focusableElements) &&\n      document.activeElement !== $targetEl[0]\n    ) {\n      document.activeElement.blur();\n    }\n\n    const shouldPreventDefault =\n      preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n    if (\n      (params.touchStartForcePreventDefault || shouldPreventDefault) &&\n      !$targetEl[0].isContentEditable\n    ) {\n      e.preventDefault();\n    }\n  }\n  swiper.emit('touchStart', e);\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\nexport default function onTouchMove(event) {\n  const document = getDocument();\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const { params, touches, rtlTranslate: rtl, enabled } = swiper;\n  if (!enabled) return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  if (!data.isTouched) {\n    if (data.startMoving && data.isScrolling) {\n      swiper.emit('touchMoveOpposite', e);\n    }\n    return;\n  }\n  if (data.isTouchEvent && e.type !== 'touchmove') return;\n  const targetTouch =\n    e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);\n  const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;\n  const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;\n  if (e.preventedByNestedSwiper) {\n    touches.startX = pageX;\n    touches.startY = pageY;\n    return;\n  }\n  if (!swiper.allowTouchMove) {\n    // isMoved = true;\n    swiper.allowClick = false;\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 (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n    if (swiper.isVertical()) {\n      // Vertical\n      if (\n        (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) ||\n        (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n      ) {\n        data.isTouched = false;\n        data.isMoved = false;\n        return;\n      }\n    } else if (\n      (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) ||\n      (pageX > touches.startX && swiper.translate >= swiper.minTranslate())\n    ) {\n      return;\n    }\n  }\n  if (data.isTouchEvent && document.activeElement) {\n    if (e.target === document.activeElement && $(e.target).is(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  if (e.targetTouches && e.targetTouches.length > 1) return;\n\n  touches.currentX = pageX;\n  touches.currentY = pageY;\n\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)\n    return;\n\n  if (typeof data.isScrolling === 'undefined') {\n    let touchAngle;\n    if (\n      (swiper.isHorizontal() && touches.currentY === touches.startY) ||\n      (swiper.isVertical() && touches.currentX === touches.startX)\n    ) {\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()\n          ? touchAngle > params.touchAngle\n          : 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) {\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\n  if (!data.isMoved) {\n    if (params.loop && !params.cssMode) {\n      swiper.loopFix();\n    }\n    data.startTranslate = swiper.getTranslate();\n    swiper.setTransition(0);\n    if (swiper.animating) {\n      swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\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  swiper.emit('sliderMove', e);\n  data.isMoved = true;\n\n  let diff = swiper.isHorizontal() ? diffX : diffY;\n  touches.diff = diff;\n\n  diff *= params.touchRatio;\n  if (rtl) diff = -diff;\n\n  swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n  data.currentTranslate = diff + data.startTranslate;\n\n  let disableParentSwiper = true;\n  let resistanceRatio = params.resistanceRatio;\n  if (params.touchReleaseOnEdges) {\n    resistanceRatio = 0;\n  }\n  if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {\n    disableParentSwiper = false;\n    if (params.resistance)\n      data.currentTranslate =\n        swiper.minTranslate() -\n        1 +\n        (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n  } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n    disableParentSwiper = false;\n    if (params.resistance)\n      data.currentTranslate =\n        swiper.maxTranslate() +\n        1 -\n        (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n  }\n\n  if (disableParentSwiper) {\n    e.preventedByNestedSwiper = true;\n  }\n\n  // Directions locks\n  if (\n    !swiper.allowSlideNext &&\n    swiper.swipeDirection === 'next' &&\n    data.currentTranslate < data.startTranslate\n  ) {\n    data.currentTranslate = data.startTranslate;\n  }\n  if (\n    !swiper.allowSlidePrev &&\n    swiper.swipeDirection === 'prev' &&\n    data.currentTranslate > data.startTranslate\n  ) {\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()\n          ? touches.currentX - touches.startX\n          : touches.currentY - touches.startY;\n        return;\n      }\n    } else {\n      data.currentTranslate = data.startTranslate;\n      return;\n    }\n  }\n\n  if (!params.followFinger || params.cssMode) return;\n\n  // Update active index in free mode\n  if (\n    (params.freeMode && params.freeMode.enabled && swiper.freeMode) ||\n    params.watchSlidesProgress\n  ) {\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n  if (swiper.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","import { now, nextTick } from '../../shared/utils.js';\n\nexport default function onTouchEnd(event) {\n  const swiper = this;\n  const data = swiper.touchEventsData;\n\n  const { params, touches, rtlTranslate: rtl, slidesGrid, enabled } = swiper;\n  if (!enabled) return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\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  // Return Grab Cursor\n  if (\n    params.grabCursor &&\n    data.isMoved &&\n    data.isTouched &&\n    (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)\n  ) {\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    swiper.updateClickedSlide(e);\n    swiper.emit('tap click', e);\n    if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n      swiper.emit('doubleTap doubleClick', e);\n    }\n  }\n\n  data.lastClickTime = now();\n  nextTick(() => {\n    if (!swiper.destroyed) swiper.allowClick = true;\n  });\n\n  if (\n    !data.isTouched ||\n    !data.isMoved ||\n    !swiper.swipeDirection ||\n    touches.diff === 0 ||\n    data.currentTranslate === data.startTranslate\n  ) {\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\n  let currentPos;\n  if (params.followFinger) {\n    currentPos = rtl ? swiper.translate : -swiper.translate;\n  } else {\n    currentPos = -data.currentTranslate;\n  }\n\n  if (params.cssMode) {\n    return;\n  }\n\n  if (swiper.params.freeMode && params.freeMode.enabled) {\n    swiper.freeMode.onTouchEnd({ currentPos });\n    return;\n  }\n\n  // Find current slide\n  let stopIndex = 0;\n  let groupSize = swiper.slidesSizesGrid[0];\n  for (\n    let i = 0;\n    i < slidesGrid.length;\n    i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup\n  ) {\n    const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n    if (typeof slidesGrid[i + increment] !== 'undefined') {\n      if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n        stopIndex = i;\n        groupSize = slidesGrid[i + increment] - slidesGrid[i];\n      }\n    } else if (currentPos >= slidesGrid[i]) {\n      stopIndex = i;\n      groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n    }\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\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(stopIndex + increment);\n      else swiper.slideTo(stopIndex);\n    }\n    if (swiper.swipeDirection === 'prev') {\n      if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n      else swiper.slideTo(stopIndex);\n    }\n  } else {\n    // Short swipes\n    if (!params.shortSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n    const isNavButtonTarget =\n      swiper.navigation &&\n      (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n    if (!isNavButtonTarget) {\n      if (swiper.swipeDirection === 'next') {\n        swiper.slideTo(stopIndex + increment);\n      }\n      if (swiper.swipeDirection === 'prev') {\n        swiper.slideTo(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","export default function onResize() {\n  const swiper = this;\n\n  const { params, el } = swiper;\n\n  if (el && el.offsetWidth === 0) return;\n\n  // Breakpoints\n  if (params.breakpoints) {\n    swiper.setBreakpoint();\n  }\n\n  // Save locks\n  const { allowSlideNext, allowSlidePrev, snapGrid } = swiper;\n\n  // Disable locks on resize\n  swiper.allowSlideNext = true;\n  swiper.allowSlidePrev = true;\n\n  swiper.updateSize();\n  swiper.updateSlides();\n\n  swiper.updateSlidesClasses();\n  if (\n    (params.slidesPerView === 'auto' || params.slidesPerView > 1) &&\n    swiper.isEnd &&\n    !swiper.isBeginning &&\n    !swiper.params.centeredSlides\n  ) {\n    swiper.slideTo(swiper.slides.length - 1, 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    swiper.autoplay.run();\n  }\n  // Return locks after resize\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n\n  if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n    swiper.checkOverflow();\n  }\n}\n","export default function 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","export default function onScroll() {\n  const swiper = this;\n  const { wrapperEl, rtlTranslate, enabled } = 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\n  swiper.updateActiveIndex();\n  swiper.updateSlidesClasses();\n\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\n  swiper.emit('setTranslate', swiper.translate, false);\n}\n","import { getDocument } from 'ssr-window';\n\nimport onTouchStart from './onTouchStart.js';\nimport onTouchMove from './onTouchMove.js';\nimport onTouchEnd from './onTouchEnd.js';\nimport onResize from './onResize.js';\nimport onClick from './onClick.js';\nimport onScroll from './onScroll.js';\n\nlet dummyEventAttached = false;\nfunction dummyEventListener() {}\n\nconst events = (swiper, method) => {\n  const document = getDocument();\n  const { params, touchEvents, el, wrapperEl, device, support } = swiper;\n  const capture = !!params.nested;\n  const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n  const swiperMethod = method;\n\n  // Touch Events\n  if (!support.touch) {\n    el[domMethod](touchEvents.start, swiper.onTouchStart, false);\n    document[domMethod](touchEvents.move, swiper.onTouchMove, capture);\n    document[domMethod](touchEvents.end, swiper.onTouchEnd, false);\n  } else {\n    const passiveListener =\n      touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners\n        ? { passive: true, capture: false }\n        : false;\n    el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener);\n    el[domMethod](\n      touchEvents.move,\n      swiper.onTouchMove,\n      support.passiveListener ? { passive: false, capture } : capture,\n    );\n    el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener);\n    if (touchEvents.cancel) {\n      el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener);\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](\n      device.ios || device.android\n        ? 'resize orientationchange observerUpdate'\n        : 'resize observerUpdate',\n      onResize,\n      true,\n    );\n  } else {\n    swiper[swiperMethod]('observerUpdate', onResize, true);\n  }\n};\n\nfunction attachEvents() {\n  const swiper = this;\n  const document = getDocument();\n  const { params, support } = swiper;\n\n  swiper.onTouchStart = onTouchStart.bind(swiper);\n  swiper.onTouchMove = onTouchMove.bind(swiper);\n  swiper.onTouchEnd = onTouchEnd.bind(swiper);\n\n  if (params.cssMode) {\n    swiper.onScroll = onScroll.bind(swiper);\n  }\n\n  swiper.onClick = onClick.bind(swiper);\n\n  if (support.touch && !dummyEventAttached) {\n    document.addEventListener('touchstart', dummyEventListener);\n    dummyEventAttached = true;\n  }\n\n  events(swiper, 'on');\n}\n\nfunction detachEvents() {\n  const swiper = this;\n  events(swiper, 'off');\n}\n\nexport default {\n  attachEvents,\n  detachEvents,\n};\n","import { extend } from '../../shared/utils.js';\n\nconst isGridEnabled = (swiper, params) => {\n  return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nexport default function setBreakpoint() {\n  const swiper = this;\n  const { activeIndex, initialized, loopedSlides = 0, params, $el } = 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\n  if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n\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\n  const wasEnabled = params.enabled;\n\n  if (wasMultiRow && !isMultiRow) {\n    $el.removeClass(\n      `${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`,\n    );\n    swiper.emitContainerClasses();\n  } else if (!wasMultiRow && isMultiRow) {\n    $el.addClass(`${params.containerModifierClass}grid`);\n    if (\n      (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column') ||\n      (!breakpointParams.grid.fill && params.grid.fill === 'column')\n    ) {\n      $el.addClass(`${params.containerModifierClass}grid-column`);\n    }\n    swiper.emitContainerClasses();\n  }\n\n  const directionChanged =\n    breakpointParams.direction && breakpointParams.direction !== params.direction;\n  const needsReLoop =\n    params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n  if (directionChanged && initialized) {\n    swiper.changeDirection();\n  }\n  extend(swiper.params, breakpointParams);\n\n  const isEnabled = swiper.params.enabled;\n\n  Object.assign(swiper, {\n    allowTouchMove: swiper.params.allowTouchMove,\n    allowSlideNext: swiper.params.allowSlideNext,\n    allowSlidePrev: swiper.params.allowSlidePrev,\n  });\n\n  if (wasEnabled && !isEnabled) {\n    swiper.disable();\n  } else if (!wasEnabled && isEnabled) {\n    swiper.enable();\n  }\n\n  swiper.currentBreakpoint = breakpoint;\n\n  swiper.emit('_beforeBreakpoint', breakpointParams);\n\n  if (needsReLoop && initialized) {\n    swiper.loopDestroy();\n    swiper.loopCreate();\n    swiper.updateSlides();\n    swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);\n  }\n\n  swiper.emit('breakpoint', breakpointParams);\n}\n","export default {\n  init: true,\n  direction: 'horizontal',\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  enabled: true,\n  focusableElements: 'input, select, option, textarea, button, video, label',\n\n  // Overrides\n  width: null,\n  height: null,\n\n  //\n  preventInteractionOnTransition: false,\n\n  // ssr\n  userAgent: null,\n  url: null,\n\n  // To support iOS's swipe-to-go-back gesture (when being used in-app).\n  edgeSwipeDetection: false,\n  edgeSwipeThreshold: 20,\n\n  // Autoheight\n  autoHeight: false,\n\n  // Set wrapper width\n  setWrapperSize: false,\n\n  // Virtual Translate\n  virtualTranslate: false,\n\n  // Effects\n  effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n  // Breakpoints\n  breakpoints: undefined,\n  breakpointsBase: 'window',\n\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, // in px\n  slidesOffsetAfter: 0, // in px\n  normalizeSlideIndex: true,\n  centerInsufficientSlides: false,\n\n  // Disable swiper and hide navigation when container not overflow\n  watchOverflow: true,\n\n  // Round length\n  roundLengths: false,\n\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: 0,\n  touchMoveStopPropagation: false,\n  touchStartPreventDefault: true,\n  touchStartForcePreventDefault: false,\n  touchReleaseOnEdges: false,\n\n  // Unique Navigation Elements\n  uniqueNavElements: true,\n\n  // Resistance\n  resistance: true,\n  resistanceRatio: 0.85,\n\n  // Progress\n  watchSlidesProgress: false,\n\n  // Cursor\n  grabCursor: false,\n\n  // Clicks\n  preventClicks: true,\n  preventClicksPropagation: true,\n  slideToClickedSlide: false,\n\n  // Images\n  preloadImages: true,\n  updateOnImagesReady: true,\n\n  // loop\n  loop: false,\n  loopAdditionalSlides: 0,\n  loopedSlides: null,\n  loopFillGroupWithBlank: false,\n  loopPreventsSlide: true,\n\n  // Swiping/no swiping\n  allowSlidePrev: true,\n  allowSlideNext: true,\n  swipeHandler: null, // '.swipe-handler',\n  noSwiping: true,\n  noSwipingClass: 'swiper-no-swiping',\n  noSwipingSelector: null,\n\n  // Passive Listeners\n  passiveListeners: true,\n\n  // NS\n  containerModifierClass: 'swiper-', // NEW\n  slideClass: 'swiper-slide',\n  slideBlankClass: 'swiper-slide-invisible-blank',\n  slideActiveClass: 'swiper-slide-active',\n  slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n  slideVisibleClass: 'swiper-slide-visible',\n  slideDuplicateClass: 'swiper-slide-duplicate',\n  slideNextClass: 'swiper-slide-next',\n  slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n  slidePrevClass: 'swiper-slide-prev',\n  slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n  wrapperClass: 'swiper-wrapper',\n\n  // Callbacks\n  runCallbacksOnInit: true,\n\n  // Internals\n  _emitClasses: false,\n};\n","import { extend } from '../shared/utils.js';\n\nexport default function moduleExtendParams(params, allModulesParams) {\n  return function extendParams(obj = {}) {\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 (\n      ['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 &&\n      params[moduleParamName] === true\n    ) {\n      params[moduleParamName] = { auto: true };\n    }\n    if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n      extend(allModulesParams, obj);\n      return;\n    }\n    if (params[moduleParamName] === true) {\n      params[moduleParamName] = { enabled: true };\n    }\n    if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n      params[moduleParamName].enabled = true;\n    }\n    if (!params[moduleParamName]) params[moduleParamName] = { enabled: false };\n    extend(allModulesParams, obj);\n  };\n}\n","/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport $ from '../shared/dom.js';\nimport { extend, now, deleteProps } from '../shared/utils.js';\nimport { getSupport } from '../shared/get-support.js';\nimport { getDevice } from '../shared/get-device.js';\nimport { getBrowser } from '../shared/get-browser.js';\n\nimport Resize from './modules/resize/resize.js';\nimport Observer from './modules/observer/observer.js';\n\nimport eventsEmitter from './events-emitter.js';\n\nimport update from './update/index.js';\nimport translate from './translate/index.js';\nimport transition from './transition/index.js';\nimport slide from './slide/index.js';\nimport loop from './loop/index.js';\nimport grabCursor from './grab-cursor/index.js';\nimport events from './events/index.js';\nimport breakpoints from './breakpoints/index.js';\nimport classes from './classes/index.js';\nimport images from './images/index.js';\nimport checkOverflow from './check-overflow/index.js';\n\nimport defaults from './defaults.js';\nimport moduleExtendParams from './moduleExtendParams.js';\n\nconst prototypes = {\n  eventsEmitter,\n  update,\n  translate,\n  transition,\n  slide,\n  loop,\n  grabCursor,\n  events,\n  breakpoints,\n  checkOverflow,\n  classes,\n  images,\n};\n\nconst extendedDefaults = {};\n\nclass Swiper {\n  constructor(...args) {\n    let el;\n    let params;\n    if (\n      args.length === 1 &&\n      args[0].constructor &&\n      Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object'\n    ) {\n      params = args[0];\n    } else {\n      [el, params] = args;\n    }\n    if (!params) params = {};\n\n    params = extend({}, params);\n    if (el && !params.el) params.el = el;\n\n    if (params.el && $(params.el).length > 1) {\n      const swipers = [];\n      $(params.el).each((containerEl) => {\n        const newParams = extend({}, params, { el: containerEl });\n        swipers.push(new Swiper(newParams));\n      });\n      return swipers;\n    }\n\n    // Swiper Instance\n    const swiper = this;\n    swiper.__swiper__ = true;\n    swiper.support = getSupport();\n    swiper.device = getDevice({ userAgent: params.userAgent });\n    swiper.browser = getBrowser();\n\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\n    const allModulesParams = {};\n\n    swiper.modules.forEach((mod) => {\n      mod({\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    // Save Dom lib\n    swiper.$ = $;\n\n    // Extend Swiper\n    Object.assign(swiper, {\n      enabled: swiper.params.enabled,\n      el,\n\n      // Classes\n      classNames: [],\n\n      // Slides\n      slides: $(),\n      slidesGrid: [],\n      snapGrid: [],\n      slidesSizesGrid: [],\n\n      // isDirection\n      isHorizontal() {\n        return swiper.params.direction === 'horizontal';\n      },\n      isVertical() {\n        return swiper.params.direction === 'vertical';\n      },\n\n      // Indexes\n      activeIndex: 0,\n      realIndex: 0,\n\n      //\n      isBeginning: true,\n      isEnd: false,\n\n      // Props\n      translate: 0,\n      previousTranslate: 0,\n      progress: 0,\n      velocity: 0,\n      animating: false,\n\n      // Locks\n      allowSlideNext: swiper.params.allowSlideNext,\n      allowSlidePrev: swiper.params.allowSlidePrev,\n\n      // Touch Events\n      touchEvents: (function touchEvents() {\n        const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];\n        const desktop = ['pointerdown', 'pointermove', 'pointerup'];\n\n        swiper.touchEventsTouch = {\n          start: touch[0],\n          move: touch[1],\n          end: touch[2],\n          cancel: touch[3],\n        };\n        swiper.touchEventsDesktop = {\n          start: desktop[0],\n          move: desktop[1],\n          end: desktop[2],\n        };\n        return swiper.support.touch || !swiper.params.simulateTouch\n          ? swiper.touchEventsTouch\n          : swiper.touchEventsDesktop;\n      })(),\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: now(),\n        clickTimeout: undefined,\n        // Velocities\n        velocities: [],\n        allowMomentumBounce: undefined,\n        isTouchEvent: undefined,\n        startMoving: undefined,\n      },\n\n      // Clicks\n      allowClick: true,\n\n      // Touches\n      allowTouchMove: swiper.params.allowTouchMove,\n\n      touches: {\n        startX: 0,\n        startY: 0,\n        currentX: 0,\n        currentY: 0,\n        diff: 0,\n      },\n\n      // Images\n      imagesToLoad: [],\n      imagesLoaded: 0,\n    });\n\n    swiper.emit('_swiper');\n\n    // Init\n    if (swiper.params.init) {\n      swiper.init();\n    }\n\n    // Return app instance\n    return swiper;\n  }\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\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\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\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 (\n        className.indexOf('swiper') === 0 ||\n        className.indexOf(swiper.params.containerModifierClass) === 0\n      );\n    });\n    swiper.emit('_containerClasses', cls.join(' '));\n  }\n\n  getSlideClasses(slideEl) {\n    const swiper = this;\n\n    return slideEl.className\n      .split(' ')\n      .filter((className) => {\n        return (\n          className.indexOf('swiper-slide') === 0 ||\n          className.indexOf(swiper.params.slideClass) === 0\n        );\n      })\n      .join(' ');\n  }\n\n  emitSlidesClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const updates = [];\n    swiper.slides.each((slideEl) => {\n      const classNames = swiper.getSlideClasses(slideEl);\n      updates.push({ slideEl, classNames });\n      swiper.emit('_slideClass', slideEl, classNames);\n    });\n    swiper.emit('_slideClasses', updates);\n  }\n\n  slidesPerViewDynamic(view = 'current', exact = false) {\n    const swiper = this;\n    const { params, slides, slidesGrid, slidesSizesGrid, size: swiperSize, activeIndex } = swiper;\n    let spv = 1;\n    if (params.centeredSlides) {\n      let slideSize = slides[activeIndex].swiperSlideSize;\n      let breakLoop;\n      for (let i = activeIndex + 1; i < slides.length; i += 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += 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\n            ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize\n            : 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\n  update() {\n    const swiper = this;\n    if (!swiper || swiper.destroyed) return;\n    const { snapGrid, params } = swiper;\n    // Breakpoints\n    if (params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n    swiper.updateSize();\n    swiper.updateSlides();\n    swiper.updateProgress();\n    swiper.updateSlidesClasses();\n\n    function setTranslate() {\n      const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n      const newTranslate = Math.min(\n        Math.max(translateValue, swiper.maxTranslate()),\n        swiper.minTranslate(),\n      );\n      swiper.setTranslate(newTranslate);\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n    let translated;\n    if (swiper.params.freeMode && swiper.params.freeMode.enabled) {\n      setTranslate();\n      if (swiper.params.autoHeight) {\n        swiper.updateAutoHeight();\n      }\n    } else {\n      if (\n        (swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) &&\n        swiper.isEnd &&\n        !swiper.params.centeredSlides\n      ) {\n        translated = swiper.slideTo(swiper.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\n  changeDirection(newDirection, needUpdate = true) {\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 (\n      newDirection === currentDirection ||\n      (newDirection !== 'horizontal' && newDirection !== 'vertical')\n    ) {\n      return swiper;\n    }\n\n    swiper.$el\n      .removeClass(`${swiper.params.containerModifierClass}${currentDirection}`)\n      .addClass(`${swiper.params.containerModifierClass}${newDirection}`);\n    swiper.emitContainerClasses();\n\n    swiper.params.direction = newDirection;\n\n    swiper.slides.each((slideEl) => {\n      if (newDirection === 'vertical') {\n        slideEl.style.width = '';\n      } else {\n        slideEl.style.height = '';\n      }\n    });\n\n    swiper.emit('changeDirection');\n    if (needUpdate) swiper.update();\n\n    return swiper;\n  }\n\n  mount(el) {\n    const swiper = this;\n    if (swiper.mounted) return true;\n\n    // Find el\n    const $el = $(el || swiper.params.el);\n    el = $el[0];\n\n    if (!el) {\n      return false;\n    }\n\n    el.swiper = swiper;\n\n    const getWrapperSelector = () => {\n      return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n    };\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        res.children = (options) => $el.children(options);\n        return res;\n      }\n      return $el.children(getWrapperSelector());\n    };\n    // Find Wrapper\n    let $wrapperEl = getWrapper();\n    if ($wrapperEl.length === 0 && swiper.params.createElements) {\n      const document = getDocument();\n      const wrapper = document.createElement('div');\n      $wrapperEl = $(wrapper);\n      wrapper.className = swiper.params.wrapperClass;\n      $el.append(wrapper);\n      $el.children(`.${swiper.params.slideClass}`).each((slideEl) => {\n        $wrapperEl.append(slideEl);\n      });\n    }\n\n    Object.assign(swiper, {\n      $el,\n      el,\n      $wrapperEl,\n      wrapperEl: $wrapperEl[0],\n      mounted: true,\n\n      // RTL\n      rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',\n      rtlTranslate:\n        swiper.params.direction === 'horizontal' &&\n        (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n      wrongRTL: $wrapperEl.css('display') === '-webkit-box',\n    });\n\n    return true;\n  }\n\n  init(el) {\n    const swiper = this;\n    if (swiper.initialized) return swiper;\n\n    const mounted = swiper.mount(el);\n    if (mounted === false) return swiper;\n\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    // Create loop\n    if (swiper.params.loop) {\n      swiper.loopCreate();\n    }\n\n    // Update size\n    swiper.updateSize();\n\n    // Update slides\n    swiper.updateSlides();\n\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    if (swiper.params.preloadImages) {\n      swiper.preloadImages();\n    }\n\n    // Slide To Initial Slide\n    if (swiper.params.loop) {\n      swiper.slideTo(\n        swiper.params.initialSlide + swiper.loopedSlides,\n        0,\n        swiper.params.runCallbacksOnInit,\n        false,\n        true,\n      );\n    } else {\n      swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n    }\n\n    // Attach events\n    swiper.attachEvents();\n\n    // Init Flag\n    swiper.initialized = true;\n\n    // Emit\n    swiper.emit('init');\n    swiper.emit('afterInit');\n\n    return swiper;\n  }\n\n  destroy(deleteInstance = true, cleanStyles = true) {\n    const swiper = this;\n    const { params, $el, $wrapperEl, slides } = swiper;\n\n    if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n      return null;\n    }\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.removeAttr('style');\n      $wrapperEl.removeAttr('style');\n      if (slides && slides.length) {\n        slides\n          .removeClass(\n            [\n              params.slideVisibleClass,\n              params.slideActiveClass,\n              params.slideNextClass,\n              params.slidePrevClass,\n            ].join(' '),\n          )\n          .removeAttr('style')\n          .removeAttr('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\n    if (deleteInstance !== false) {\n      swiper.$el[0].swiper = null;\n      deleteProps(swiper);\n    }\n    swiper.destroyed = true;\n\n    return null;\n  }\n\n  static extendDefaults(newDefaults) {\n    extend(extendedDefaults, newDefaults);\n  }\n\n  static get extendedDefaults() {\n    return extendedDefaults;\n  }\n\n  static get defaults() {\n    return defaults;\n  }\n\n  static installModule(mod) {\n    if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n    const modules = Swiper.prototype.__modules__;\n\n    if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n      modules.push(mod);\n    }\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}\n\nObject.keys(prototypes).forEach((prototypeGroup) => {\n  Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => {\n    Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n  });\n});\n\nSwiper.use([Resize, Observer]);\n\nexport default Swiper;\n","/* eslint-disable no-underscore-dangle */\n\nexport default {\n  on(events, handler, priority) {\n    const self = this;\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\n  once(events, handler, priority) {\n    const self = this;\n    if (typeof handler !== 'function') return self;\n    function onceHandler(...args) {\n      self.off(events, onceHandler);\n      if (onceHandler.__emitterProxy) {\n        delete onceHandler.__emitterProxy;\n      }\n      handler.apply(self, args);\n    }\n    onceHandler.__emitterProxy = handler;\n    return self.on(events, onceHandler, priority);\n  },\n\n  onAny(handler, priority) {\n    const self = this;\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\n  offAny(handler) {\n    const self = this;\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\n  off(events, handler) {\n    const self = this;\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 (\n            eventHandler === handler ||\n            (eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler)\n          ) {\n            self.eventsListeners[event].splice(index, 1);\n          }\n        });\n      }\n    });\n    return self;\n  },\n\n  emit(...args) {\n    const self = this;\n    if (!self.eventsListeners) return self;\n    let events;\n    let data;\n    let context;\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\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","import updateSize from './updateSize.js';\nimport updateSlides from './updateSlides.js';\nimport updateAutoHeight from './updateAutoHeight.js';\nimport updateSlidesOffset from './updateSlidesOffset.js';\nimport updateSlidesProgress from './updateSlidesProgress.js';\nimport updateProgress from './updateProgress.js';\nimport updateSlidesClasses from './updateSlidesClasses.js';\nimport updateActiveIndex from './updateActiveIndex.js';\nimport updateClickedSlide from './updateClickedSlide.js';\n\nexport default {\n  updateSize,\n  updateSlides,\n  updateAutoHeight,\n  updateSlidesOffset,\n  updateSlidesProgress,\n  updateProgress,\n  updateSlidesClasses,\n  updateActiveIndex,\n  updateClickedSlide,\n};\n","export default function 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[0].clientWidth;\n  }\n  if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n    height = swiper.params.height;\n  } else {\n    height = $el[0].clientHeight;\n  }\n  if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {\n    return;\n  }\n\n  // Subtract paddings\n  width =\n    width -\n    parseInt($el.css('padding-left') || 0, 10) -\n    parseInt($el.css('padding-right') || 0, 10);\n  height =\n    height -\n    parseInt($el.css('padding-top') || 0, 10) -\n    parseInt($el.css('padding-bottom') || 0, 10);\n\n  if (Number.isNaN(width)) width = 0;\n  if (Number.isNaN(height)) height = 0;\n\n  Object.assign(swiper, {\n    width,\n    height,\n    size: swiper.isHorizontal() ? width : height,\n  });\n}\n","import { setCSSProperty } from '../../shared/utils.js';\n\nexport default function updateSlides() {\n  const swiper = this;\n  function getDirectionLabel(property) {\n    if (swiper.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  function getDirectionPropertyValue(node, label) {\n    return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n  }\n\n  const params = swiper.params;\n\n  const { $wrapperEl, size: swiperSize, rtlTranslate: rtl, wrongRTL } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n  const slides = $wrapperEl.children(`.${swiper.params.slideClass}`);\n  const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n  let snapGrid = [];\n  const slidesGrid = [];\n  const slidesSizesGrid = [];\n\n  let offsetBefore = params.slidesOffsetBefore;\n  if (typeof offsetBefore === 'function') {\n    offsetBefore = params.slidesOffsetBefore.call(swiper);\n  }\n\n  let offsetAfter = params.slidesOffsetAfter;\n  if (typeof offsetAfter === 'function') {\n    offsetAfter = params.slidesOffsetAfter.call(swiper);\n  }\n\n  const previousSnapGridLength = swiper.snapGrid.length;\n  const previousSlidesGridLength = swiper.slidesGrid.length;\n\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  }\n\n  swiper.virtualSize = -spaceBetween;\n\n  // reset margins\n  if (rtl) slides.css({ marginLeft: '', marginBottom: '', marginTop: '' });\n  else slides.css({ marginRight: '', marginBottom: '', marginTop: '' });\n\n  // reset cssMode offsets\n  if (params.centeredSlides && params.cssMode) {\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', '');\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', '');\n  }\n\n  const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n  if (gridEnabled) {\n    swiper.grid.initSlides(slidesLength);\n  }\n\n  // Calc slides\n  let slideSize;\n\n  const shouldResetSlideSize =\n    params.slidesPerView === 'auto' &&\n    params.breakpoints &&\n    Object.keys(params.breakpoints).filter((key) => {\n      return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n    }).length > 0;\n\n  for (let i = 0; i < slidesLength; i += 1) {\n    slideSize = 0;\n    const slide = slides.eq(i);\n    if (gridEnabled) {\n      swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n    }\n    if (slide.css('display') === 'none') continue; // eslint-disable-line\n\n    if (params.slidesPerView === 'auto') {\n      if (shouldResetSlideSize) {\n        slides[i].style[getDirectionLabel('width')] = ``;\n      }\n      const slideStyles = getComputedStyle(slide[0]);\n      const currentTransform = slide[0].style.transform;\n      const currentWebKitTransform = slide[0].style.webkitTransform;\n      if (currentTransform) {\n        slide[0].style.transform = 'none';\n      }\n      if (currentWebKitTransform) {\n        slide[0].style.webkitTransform = 'none';\n      }\n      if (params.roundLengths) {\n        slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(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 { clientWidth, offsetWidth } = slide[0];\n          slideSize =\n            width +\n            paddingLeft +\n            paddingRight +\n            marginLeft +\n            marginRight +\n            (offsetWidth - clientWidth);\n        }\n      }\n      if (currentTransform) {\n        slide[0].style.transform = currentTransform;\n      }\n      if (currentWebKitTransform) {\n        slide[0].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\n      if (slides[i]) {\n        slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n      }\n    }\n    if (slides[i]) {\n      slides[i].swiperSlideSize = slideSize;\n    }\n    slidesSizesGrid.push(slideSize);\n\n    if (params.centeredSlides) {\n      slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n      if (prevSlideSize === 0 && i !== 0)\n        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 (\n        (index - Math.min(swiper.params.slidesPerGroupSkip, index)) %\n          swiper.params.slidesPerGroup ===\n        0\n      )\n        snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n      slidePosition = slidePosition + slideSize + spaceBetween;\n    }\n\n    swiper.virtualSize += slideSize + spaceBetween;\n\n    prevSlideSize = slideSize;\n\n    index += 1;\n  }\n  swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n  if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n    $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` });\n  }\n  if (params.setWrapperSize) {\n    $wrapperEl.css({\n      [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px`,\n    });\n  }\n\n  if (gridEnabled) {\n    swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\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\n    if (\n      Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) >\n      1\n    ) {\n      snapGrid.push(swiper.virtualSize - swiperSize);\n    }\n  }\n  if (snapGrid.length === 0) snapGrid = [0];\n\n  if (params.spaceBetween !== 0) {\n    const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n    slides\n      .filter((_, slideIndex) => {\n        if (!params.cssMode) return true;\n        if (slideIndex === slides.length - 1) {\n          return false;\n        }\n        return true;\n      })\n      .css({ [key]: `${spaceBetween}px` });\n  }\n\n  if (params.centeredSlides && params.centeredSlidesBounds) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach((slideSizeValue) => {\n      allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n    });\n    allSlidesSize -= params.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\n  if (params.centerInsufficientSlides) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach((slideSizeValue) => {\n      allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n    });\n    allSlidesSize -= params.spaceBetween;\n    if (allSlidesSize < swiperSize) {\n      const allSlidesOffset = (swiperSize - allSlidesSize) / 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\n  Object.assign(swiper, {\n    slides,\n    snapGrid,\n    slidesGrid,\n    slidesSizesGrid,\n  });\n\n  if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n    setCSSProperty(\n      swiper.wrapperEl,\n      '--swiper-centered-offset-after',\n      `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`,\n    );\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\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\n  if (params.watchSlidesProgress) {\n    swiper.updateSlidesOffset();\n  }\n}\n","export default function 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\n  const getSlideByIndex = (index) => {\n    if (isVirtual) {\n      return swiper.slides.filter(\n        (el) => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index,\n      )[0];\n    }\n    return swiper.slides.eq(index)[0];\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.each((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) swiper.$wrapperEl.css('height', `${newHeight}px`);\n}\n","export default function updateSlidesOffset() {\n  const swiper = this;\n  const slides = swiper.slides;\n  for (let i = 0; i < slides.length; i += 1) {\n    slides[i].swiperSlideOffset = swiper.isHorizontal()\n      ? slides[i].offsetLeft\n      : slides[i].offsetTop;\n  }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateSlidesProgress(translate = (this && this.translate) || 0) {\n  const swiper = this;\n  const params = swiper.params;\n\n  const { slides, rtlTranslate: rtl } = swiper;\n\n  if (slides.length === 0) return;\n  if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n\n  let offsetCenter = -translate;\n  if (rtl) offsetCenter = translate;\n\n  // Visible Slides\n  slides.removeClass(params.slideVisibleClass);\n\n  swiper.visibleSlidesIndexes = [];\n  swiper.visibleSlides = [];\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\n    const slideProgress =\n      (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) /\n      (slide.swiperSlideSize + params.spaceBetween);\n    const slideBefore = -(offsetCenter - slideOffset);\n    const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n    const isVisible =\n      (slideBefore >= 0 && slideBefore < swiper.size - 1) ||\n      (slideAfter > 1 && slideAfter <= swiper.size) ||\n      (slideBefore <= 0 && slideAfter >= swiper.size);\n    if (isVisible) {\n      swiper.visibleSlides.push(slide);\n      swiper.visibleSlidesIndexes.push(i);\n      slides.eq(i).addClass(params.slideVisibleClass);\n    }\n    slide.progress = rtl ? -slideProgress : slideProgress;\n  }\n  swiper.visibleSlides = $(swiper.visibleSlides);\n}\n","export default function 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 { progress, isBeginning, isEnd } = 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    isBeginning = progress <= 0;\n    isEnd = progress >= 1;\n  }\n  Object.assign(swiper, {\n    progress,\n    isBeginning,\n    isEnd,\n  });\n\n  if (params.watchSlidesProgress || (params.centeredSlides && params.autoHeight))\n    swiper.updateSlidesProgress(translate);\n\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\n  swiper.emit('progress', progress);\n}\n","export default function updateSlidesClasses() {\n  const swiper = this;\n\n  const { slides, params, $wrapperEl, activeIndex, realIndex } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n\n  slides.removeClass(\n    `${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`,\n  );\n\n  let activeSlide;\n  if (isVirtual) {\n    activeSlide = swiper.$wrapperEl.find(\n      `.${params.slideClass}[data-swiper-slide-index=\"${activeIndex}\"]`,\n    );\n  } else {\n    activeSlide = slides.eq(activeIndex);\n  }\n\n  // Active classes\n  activeSlide.addClass(params.slideActiveClass);\n\n  if (params.loop) {\n    // Duplicate to all looped slides\n    if (activeSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl\n        .children(\n          `.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${realIndex}\"]`,\n        )\n        .addClass(params.slideDuplicateActiveClass);\n    } else {\n      $wrapperEl\n        .children(\n          `.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${realIndex}\"]`,\n        )\n        .addClass(params.slideDuplicateActiveClass);\n    }\n  }\n  // Next Slide\n  let nextSlide = activeSlide\n    .nextAll(`.${params.slideClass}`)\n    .eq(0)\n    .addClass(params.slideNextClass);\n  if (params.loop && nextSlide.length === 0) {\n    nextSlide = slides.eq(0);\n    nextSlide.addClass(params.slideNextClass);\n  }\n  // Prev Slide\n  let prevSlide = activeSlide\n    .prevAll(`.${params.slideClass}`)\n    .eq(0)\n    .addClass(params.slidePrevClass);\n  if (params.loop && prevSlide.length === 0) {\n    prevSlide = slides.eq(-1);\n    prevSlide.addClass(params.slidePrevClass);\n  }\n  if (params.loop) {\n    // Duplicate to all looped slides\n    if (nextSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl\n        .children(\n          `.${params.slideClass}:not(.${\n            params.slideDuplicateClass\n          })[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n        )\n        .addClass(params.slideDuplicateNextClass);\n    } else {\n      $wrapperEl\n        .children(\n          `.${params.slideClass}.${\n            params.slideDuplicateClass\n          }[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n        )\n        .addClass(params.slideDuplicateNextClass);\n    }\n    if (prevSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl\n        .children(\n          `.${params.slideClass}:not(.${\n            params.slideDuplicateClass\n          })[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n        )\n        .addClass(params.slideDuplicatePrevClass);\n    } else {\n      $wrapperEl\n        .children(\n          `.${params.slideClass}.${\n            params.slideDuplicateClass\n          }[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n        )\n        .addClass(params.slideDuplicatePrevClass);\n    }\n  }\n  swiper.emitSlidesClasses();\n}\n","export default function updateActiveIndex(newActiveIndex) {\n  const swiper = this;\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  const {\n    slidesGrid,\n    snapGrid,\n    params,\n    activeIndex: previousIndex,\n    realIndex: previousRealIndex,\n    snapIndex: previousSnapIndex,\n  } = swiper;\n  let activeIndex = newActiveIndex;\n  let snapIndex;\n  if (typeof activeIndex === 'undefined') {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (\n          translate >= slidesGrid[i] &&\n          translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2\n        ) {\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  }\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) {\n    if (snapIndex !== previousSnapIndex) {\n      swiper.snapIndex = snapIndex;\n      swiper.emit('snapIndexChange');\n    }\n    return;\n  }\n\n  // Get real index\n  const realIndex = parseInt(\n    swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex,\n    10,\n  );\n\n  Object.assign(swiper, {\n    snapIndex,\n    realIndex,\n    previousIndex,\n    activeIndex,\n  });\n  swiper.emit('activeIndexChange');\n  swiper.emit('snapIndexChange');\n  if (previousRealIndex !== realIndex) {\n    swiper.emit('realIndexChange');\n  }\n  if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n    swiper.emit('slideChange');\n  }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateClickedSlide(e) {\n  const swiper = this;\n  const params = swiper.params;\n  const slide = $(e.target).closest(`.${params.slideClass}`)[0];\n  let slideFound = false;\n  let slideIndex;\n\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\n  if (slide && slideFound) {\n    swiper.clickedSlide = slide;\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      swiper.clickedIndex = parseInt($(slide).attr('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 (\n    params.slideToClickedSlide &&\n    swiper.clickedIndex !== undefined &&\n    swiper.clickedIndex !== swiper.activeIndex\n  ) {\n    swiper.slideToClickedSlide();\n  }\n}\n","import getTranslate from './getTranslate.js';\nimport setTranslate from './setTranslate.js';\nimport minTranslate from './minTranslate.js';\nimport maxTranslate from './maxTranslate.js';\nimport translateTo from './translateTo.js';\n\nexport default {\n  getTranslate,\n  setTranslate,\n  minTranslate,\n  maxTranslate,\n  translateTo,\n};\n","import { getTranslate } from '../../shared/utils.js';\n\nexport default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n  const swiper = this;\n\n  const { params, rtlTranslate: rtl, translate, $wrapperEl } = swiper;\n\n  if (params.virtualTranslate) {\n    return rtl ? -translate : translate;\n  }\n  if (params.cssMode) {\n    return translate;\n  }\n\n  let currentTranslate = getTranslate($wrapperEl[0], axis);\n  if (rtl) currentTranslate = -currentTranslate;\n\n  return currentTranslate || 0;\n}\n","export default function setTranslate(translate, byController) {\n  const swiper = this;\n  const { rtlTranslate: rtl, params, $wrapperEl, wrapperEl, progress } = swiper;\n  let x = 0;\n  let y = 0;\n  const z = 0;\n\n  if (swiper.isHorizontal()) {\n    x = rtl ? -translate : translate;\n  } else {\n    y = translate;\n  }\n\n  if (params.roundLengths) {\n    x = Math.floor(x);\n    y = Math.floor(y);\n  }\n\n  if (params.cssMode) {\n    wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n  } else if (!params.virtualTranslate) {\n    $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`);\n  }\n  swiper.previousTranslate = swiper.translate;\n  swiper.translate = swiper.isHorizontal() ? x : y;\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\n  swiper.emit('setTranslate', swiper.translate, byController);\n}\n","export default function minTranslate() {\n  return -this.snapGrid[0];\n}\n","export default function maxTranslate() {\n  return -this.snapGrid[this.snapGrid.length - 1];\n}\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function translateTo(\n  translate = 0,\n  speed = this.params.speed,\n  runCallbacks = true,\n  translateBounds = true,\n  internal,\n) {\n  const swiper = this;\n\n  const { params, wrapperEl } = swiper;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return false;\n  }\n\n  const minTranslate = swiper.minTranslate();\n  const maxTranslate = swiper.maxTranslate();\n  let newTranslate;\n  if (translateBounds && translate > minTranslate) newTranslate = minTranslate;\n  else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;\n  else newTranslate = translate;\n\n  // Update progress\n  swiper.updateProgress(newTranslate);\n\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({ swiper, targetPosition: -newTranslate, side: isH ? 'left' : 'top' });\n        return true;\n      }\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: -newTranslate,\n        behavior: 'smooth',\n      });\n    }\n    return true;\n  }\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[0].removeEventListener(\n            'transitionend',\n            swiper.onTranslateToWrapperTransitionEnd,\n          );\n          swiper.$wrapperEl[0].removeEventListener(\n            'webkitTransitionEnd',\n            swiper.onTranslateToWrapperTransitionEnd,\n          );\n          swiper.onTranslateToWrapperTransitionEnd = null;\n          delete swiper.onTranslateToWrapperTransitionEnd;\n          if (runCallbacks) {\n            swiper.emit('transitionEnd');\n          }\n        };\n      }\n      swiper.$wrapperEl[0].addEventListener(\n        'transitionend',\n        swiper.onTranslateToWrapperTransitionEnd,\n      );\n      swiper.$wrapperEl[0].addEventListener(\n        'webkitTransitionEnd',\n        swiper.onTranslateToWrapperTransitionEnd,\n      );\n    }\n  }\n\n  return true;\n}\n","import setTransition from './setTransition.js';\nimport transitionStart from './transitionStart.js';\nimport transitionEnd from './transitionEnd.js';\n\nexport default {\n  setTransition,\n  transitionStart,\n  transitionEnd,\n};\n","export default function setTransition(duration, byController) {\n  const swiper = this;\n\n  if (!swiper.params.cssMode) {\n    swiper.$wrapperEl.transition(duration);\n  }\n\n  swiper.emit('setTransition', duration, byController);\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionStart(runCallbacks = true, direction) {\n  const swiper = this;\n  const { params } = swiper;\n  if (params.cssMode) return;\n  if (params.autoHeight) {\n    swiper.updateAutoHeight();\n  }\n\n  transitionEmit({ swiper, runCallbacks, direction, step: 'Start' });\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionEnd(runCallbacks = true, direction) {\n  const swiper = this;\n  const { params } = swiper;\n  swiper.animating = false;\n  if (params.cssMode) return;\n  swiper.setTransition(0);\n\n  transitionEmit({ swiper, runCallbacks, direction, step: 'End' });\n}\n","import slideTo from './slideTo.js';\nimport slideToLoop from './slideToLoop.js';\nimport slideNext from './slideNext.js';\nimport slidePrev from './slidePrev.js';\nimport slideReset from './slideReset.js';\nimport slideToClosest from './slideToClosest.js';\nimport slideToClickedSlide from './slideToClickedSlide.js';\n\nexport default {\n  slideTo,\n  slideToLoop,\n  slideNext,\n  slidePrev,\n  slideReset,\n  slideToClosest,\n  slideToClickedSlide,\n};\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function slideTo(\n  index = 0,\n  speed = this.params.speed,\n  runCallbacks = true,\n  internal,\n  initial,\n) {\n  if (typeof index !== 'number' && typeof index !== 'string') {\n    throw new Error(\n      `The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`,\n    );\n  }\n\n  if (typeof index === 'string') {\n    /**\n     * The `index` argument converted from `string` to `number`.\n     * @type {number}\n     */\n    const indexAsNumber = parseInt(index, 10);\n\n    /**\n     * Determines whether the `index` argument is a valid `number`\n     * after being converted from the `string` type.\n     * @type {boolean}\n     */\n    const isValidNumber = isFinite(indexAsNumber);\n\n    if (!isValidNumber) {\n      throw new Error(\n        `The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`,\n      );\n    }\n\n    // Knowing that the converted `index` is a valid number,\n    // we can update the original argument's value.\n    index = indexAsNumber;\n  }\n\n  const swiper = this;\n  let slideIndex = index;\n  if (slideIndex < 0) slideIndex = 0;\n\n  const {\n    params,\n    snapGrid,\n    slidesGrid,\n    previousIndex,\n    activeIndex,\n    rtlTranslate: rtl,\n    wrapperEl,\n    enabled,\n  } = swiper;\n\n  if (\n    (swiper.animating && params.preventInteractionOnTransition) ||\n    (!enabled && !internal && !initial)\n  ) {\n    return false;\n  }\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\n  if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n    swiper.emit('beforeSlideChangeStart');\n  }\n\n  const translate = -snapGrid[snapIndex];\n\n  // Update progress\n  swiper.updateProgress(translate);\n\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 (\n          normalizedTranslate >= normalizedGrid &&\n          normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2\n        ) {\n          slideIndex = i;\n        } else if (\n          normalizedTranslate >= normalizedGrid &&\n          normalizedTranslate < normalizedGridNext\n        ) {\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 (\n      !swiper.allowSlideNext &&\n      translate < swiper.translate &&\n      translate < swiper.minTranslate()\n    ) {\n      return false;\n    }\n    if (\n      !swiper.allowSlidePrev &&\n      translate > swiper.translate &&\n      translate > swiper.maxTranslate()\n    ) {\n      if ((activeIndex || 0) !== slideIndex) return false;\n    }\n  }\n\n  let direction;\n  if (slideIndex > activeIndex) direction = 'next';\n  else if (slideIndex < activeIndex) direction = 'prev';\n  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      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n      if (isVirtual) {\n        requestAnimationFrame(() => {\n          swiper.wrapperEl.style.scrollSnapType = '';\n          swiper._swiperImmediateVirtual = false;\n        });\n      }\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({ swiper, targetPosition: t, side: isH ? 'left' : 'top' });\n        return true;\n      }\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: t,\n        behavior: 'smooth',\n      });\n    }\n    return true;\n  }\n\n  if (speed === 0) {\n    swiper.setTransition(0);\n    swiper.setTranslate(translate);\n    swiper.updateActiveIndex(slideIndex);\n    swiper.updateSlidesClasses();\n    swiper.emit('beforeTransitionStart', speed, internal);\n    swiper.transitionStart(runCallbacks, direction);\n    swiper.transitionEnd(runCallbacks, direction);\n  } else {\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 (!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[0].removeEventListener(\n            'transitionend',\n            swiper.onSlideToWrapperTransitionEnd,\n          );\n          swiper.$wrapperEl[0].removeEventListener(\n            'webkitTransitionEnd',\n            swiper.onSlideToWrapperTransitionEnd,\n          );\n          swiper.onSlideToWrapperTransitionEnd = null;\n          delete swiper.onSlideToWrapperTransitionEnd;\n          swiper.transitionEnd(runCallbacks, direction);\n        };\n      }\n      swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n      swiper.$wrapperEl[0].addEventListener(\n        'webkitTransitionEnd',\n        swiper.onSlideToWrapperTransitionEnd,\n      );\n    }\n  }\n\n  return true;\n}\n","export default function slideToLoop(\n  index = 0,\n  speed = this.params.speed,\n  runCallbacks = true,\n  internal,\n) {\n  const swiper = this;\n  let newIndex = index;\n  if (swiper.params.loop) {\n    newIndex += swiper.loopedSlides;\n  }\n\n  return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideNext(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const { animating, enabled, params } = swiper;\n  if (!enabled) return swiper;\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  if (params.loop) {\n    if (animating && params.loopPreventsSlide) return false;\n    swiper.loopFix();\n    // eslint-disable-next-line\n    swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n  }\n  return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slidePrev(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const { params, animating, snapGrid, slidesGrid, rtlTranslate, enabled } = swiper;\n  if (!enabled) return swiper;\n\n  if (params.loop) {\n    if (animating && params.loopPreventsSlide) return false;\n    swiper.loopFix();\n    // eslint-disable-next-line\n    swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n  }\n  const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\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\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 (\n      params.slidesPerView === 'auto' &&\n      params.slidesPerGroup === 1 &&\n      params.slidesPerGroupAuto\n    ) {\n      prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n      prevIndex = Math.max(prevIndex, 0);\n    }\n  }\n  return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideReset(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideToClosest(\n  speed = this.params.speed,\n  runCallbacks = true,\n  internal,\n  threshold = 0.5,\n) {\n  const swiper = this;\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\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\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\n  return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n","import $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function slideToClickedSlide() {\n  const swiper = this;\n  const { params, $wrapperEl } = swiper;\n\n  const slidesPerView =\n    params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n  let slideToIndex = swiper.clickedIndex;\n  let realIndex;\n  if (params.loop) {\n    if (swiper.animating) return;\n    realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n    if (params.centeredSlides) {\n      if (\n        slideToIndex < swiper.loopedSlides - slidesPerView / 2 ||\n        slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2\n      ) {\n        swiper.loopFix();\n        slideToIndex = $wrapperEl\n          .children(\n            `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n          )\n          .eq(0)\n          .index();\n\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 = $wrapperEl\n        .children(\n          `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n        )\n        .eq(0)\n        .index();\n\n      nextTick(() => {\n        swiper.slideTo(slideToIndex);\n      });\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  } else {\n    swiper.slideTo(slideToIndex);\n  }\n}\n","import loopCreate from './loopCreate.js';\nimport loopFix from './loopFix.js';\nimport loopDestroy from './loopDestroy.js';\n\nexport default {\n  loopCreate,\n  loopFix,\n  loopDestroy,\n};\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loopCreate() {\n  const swiper = this;\n  const document = getDocument();\n  const { params, $wrapperEl } = swiper;\n  // Remove duplicated slides\n  $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove();\n\n  let slides = $wrapperEl.children(`.${params.slideClass}`);\n\n  if (params.loopFillGroupWithBlank) {\n    const blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);\n    if (blankSlidesNum !== params.slidesPerGroup) {\n      for (let i = 0; i < blankSlidesNum; i += 1) {\n        const blankNode = $(document.createElement('div')).addClass(\n          `${params.slideClass} ${params.slideBlankClass}`,\n        );\n        $wrapperEl.append(blankNode);\n      }\n      slides = $wrapperEl.children(`.${params.slideClass}`);\n    }\n  }\n\n  if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;\n\n  swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));\n  swiper.loopedSlides += params.loopAdditionalSlides;\n  if (swiper.loopedSlides > slides.length) {\n    swiper.loopedSlides = slides.length;\n  }\n\n  const prependSlides = [];\n  const appendSlides = [];\n  slides.each((el, index) => {\n    const slide = $(el);\n    if (index < swiper.loopedSlides) {\n      appendSlides.push(el);\n    }\n    if (index < slides.length && index >= slides.length - swiper.loopedSlides) {\n      prependSlides.push(el);\n    }\n    slide.attr('data-swiper-slide-index', index);\n  });\n  for (let i = 0; i < appendSlides.length; i += 1) {\n    $wrapperEl.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n  }\n  for (let i = prependSlides.length - 1; i >= 0; i -= 1) {\n    $wrapperEl.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n  }\n}\n","export default function loopFix() {\n  const swiper = this;\n\n  swiper.emit('beforeLoopFix');\n\n  const {\n    activeIndex,\n    slides,\n    loopedSlides,\n    allowSlidePrev,\n    allowSlideNext,\n    snapGrid,\n    rtlTranslate: rtl,\n  } = swiper;\n  let newIndex;\n  swiper.allowSlidePrev = true;\n  swiper.allowSlideNext = true;\n\n  const snapTranslate = -snapGrid[activeIndex];\n  const diff = snapTranslate - swiper.getTranslate();\n\n  // Fix For Negative Oversliding\n  if (activeIndex < loopedSlides) {\n    newIndex = slides.length - loopedSlides * 3 + activeIndex;\n    newIndex += loopedSlides;\n    const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n    if (slideChanged && diff !== 0) {\n      swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n    }\n  } else if (activeIndex >= slides.length - loopedSlides) {\n    // Fix For Positive Oversliding\n    newIndex = -slides.length + activeIndex + loopedSlides;\n    newIndex += loopedSlides;\n    const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n    if (slideChanged && diff !== 0) {\n      swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n    }\n  }\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n\n  swiper.emit('loopFix');\n}\n","export default function loopDestroy() {\n  const swiper = this;\n  const { $wrapperEl, params, slides } = swiper;\n  $wrapperEl\n    .children(\n      `.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`,\n    )\n    .remove();\n  slides.removeAttr('data-swiper-slide-index');\n}\n","import setGrabCursor from './setGrabCursor.js';\nimport unsetGrabCursor from './unsetGrabCursor.js';\n\nexport default {\n  setGrabCursor,\n  unsetGrabCursor,\n};\n","export default function setGrabCursor(moving) {\n  const swiper = this;\n  if (\n    swiper.support.touch ||\n    !swiper.params.simulateTouch ||\n    (swiper.params.watchOverflow && swiper.isLocked) ||\n    swiper.params.cssMode\n  )\n    return;\n  const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n  el.style.cursor = 'move';\n  el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n  el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n  el.style.cursor = moving ? 'grabbing' : 'grab';\n}\n","export default function unsetGrabCursor() {\n  const swiper = this;\n  if (\n    swiper.support.touch ||\n    (swiper.params.watchOverflow && swiper.isLocked) ||\n    swiper.params.cssMode\n  ) {\n    return;\n  }\n  swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n}\n","import setBreakpoint from './setBreakpoint.js';\nimport getBreakpoint from './getBreakpoint.js';\n\nexport default { setBreakpoint, getBreakpoint };\n","import { getWindow } from 'ssr-window';\n\nexport default function getBreakpoint(breakpoints, base = 'window', containerEl) {\n  if (!breakpoints || (base === 'container' && !containerEl)) return undefined;\n  let breakpoint = false;\n\n  const window = getWindow();\n  const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n\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 { value, point };\n    }\n    return { value: point, 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 { point, value } = 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","function checkOverflow() {\n  const swiper = this;\n  const { isLocked: wasLocked, params } = swiper;\n  const { slidesOffsetBefore } = params;\n\n  if (slidesOffsetBefore) {\n    const lastSlideIndex = swiper.slides.length - 1;\n    const lastSlideRightEdge =\n      swiper.slidesGrid[lastSlideIndex] +\n      swiper.slidesSizesGrid[lastSlideIndex] +\n      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\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}\n\nexport default { checkOverflow };\n","import addClasses from './addClasses.js';\nimport removeClasses from './removeClasses.js';\n\nexport default { addClasses, removeClasses };\n","function 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}\n\nexport default function addClasses() {\n  const swiper = this;\n  const { classNames, params, rtl, $el, device, support } = swiper;\n  // prettier-ignore\n  const suffixes = prepareClasses([\n    'initialized',\n    params.direction,\n    { 'pointer-events': !support.touch },\n    { 'free-mode': swiper.params.freeMode && params.freeMode.enabled },\n    { 'autoheight': params.autoHeight },\n    { 'rtl': rtl },\n    { 'grid': params.grid && params.grid.rows > 1 },\n    { 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' },\n    { 'android': device.android },\n    { 'ios': device.ios },\n    { 'css-mode': params.cssMode },\n    { 'centered': params.cssMode && params.centeredSlides },\n  ], params.containerModifierClass);\n  classNames.push(...suffixes);\n  $el.addClass([...classNames].join(' '));\n  swiper.emitContainerClasses();\n}\n","export default function removeClasses() {\n  const swiper = this;\n  const { $el, classNames } = swiper;\n\n  $el.removeClass(classNames.join(' '));\n  swiper.emitContainerClasses();\n}\n","import loadImage from './loadImage.js';\nimport preloadImages from './preloadImages.js';\n\nexport default {\n  loadImage,\n  preloadImages,\n};\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {\n  const window = getWindow();\n  let image;\n  function onReady() {\n    if (callback) callback();\n  }\n  const isPicture = $(imageEl).parent('picture')[0];\n\n  if (!isPicture && (!imageEl.complete || !checkForComplete)) {\n    if (src) {\n      image = new window.Image();\n      image.onload = onReady;\n      image.onerror = onReady;\n      if (sizes) {\n        image.sizes = sizes;\n      }\n      if (srcset) {\n        image.srcset = srcset;\n      }\n      if (src) {\n        image.src = src;\n      }\n    } else {\n      onReady();\n    }\n  } else {\n    // image already loaded...\n    onReady();\n  }\n}\n","export default function preloadImages() {\n  const swiper = this;\n  swiper.imagesToLoad = swiper.$el.find('img');\n  function onReady() {\n    if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;\n    if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;\n    if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n      if (swiper.params.updateOnImagesReady) swiper.update();\n      swiper.emit('imagesReady');\n    }\n  }\n  for (let i = 0; i < swiper.imagesToLoad.length; i += 1) {\n    const imageEl = swiper.imagesToLoad[i];\n    swiper.loadImage(\n      imageEl,\n      imageEl.currentSrc || imageEl.getAttribute('src'),\n      imageEl.srcset || imageEl.getAttribute('srcset'),\n      imageEl.sizes || imageEl.getAttribute('sizes'),\n      true,\n      onReady,\n    );\n  }\n}\n","import { getDocument } from 'ssr-window';\n\nexport default function createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n  const document = getDocument();\n  if (swiper.params.createElements) {\n    Object.keys(checkProps).forEach((key) => {\n      if (!params[key] && params.auto === true) {\n        let element = swiper.$el.children(`.${checkProps[key]}`)[0];\n        if (!element) {\n          element = document.createElement('div');\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","export default function classesToSelector(classes = '') {\n  return `.${classes\n    .trim()\n    .replace(/([\\.:!\\/])/g, '\\\\$1') // eslint-disable-line\n    .replace(/ /g, '.')}`;\n}\n","export default function appendSlide(slides) {\n  const swiper = this;\n  const { $wrapperEl, params } = swiper;\n  if (params.loop) {\n    swiper.loopDestroy();\n  }\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) $wrapperEl.append(slides[i]);\n    }\n  } else {\n    $wrapperEl.append(slides);\n  }\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n  if (!params.observer) {\n    swiper.update();\n  }\n}\n","export default function prependSlide(slides) {\n  const swiper = this;\n  const { params, $wrapperEl, activeIndex } = swiper;\n\n  if (params.loop) {\n    swiper.loopDestroy();\n  }\n  let newActiveIndex = activeIndex + 1;\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) $wrapperEl.prepend(slides[i]);\n    }\n    newActiveIndex = activeIndex + slides.length;\n  } else {\n    $wrapperEl.prepend(slides);\n  }\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n  if (!params.observer) {\n    swiper.update();\n  }\n  swiper.slideTo(newActiveIndex, 0, false);\n}\n","export default function addSlide(index, slides) {\n  const swiper = this;\n  const { $wrapperEl, params, activeIndex } = swiper;\n  let activeIndexBuffer = activeIndex;\n  if (params.loop) {\n    activeIndexBuffer -= swiper.loopedSlides;\n    swiper.loopDestroy();\n    swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n  }\n  const baseLength = swiper.slides.length;\n  if (index <= 0) {\n    swiper.prependSlide(slides);\n    return;\n  }\n  if (index >= baseLength) {\n    swiper.appendSlide(slides);\n    return;\n  }\n  let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n\n  const slidesBuffer = [];\n  for (let i = baseLength - 1; i >= index; i -= 1) {\n    const currentSlide = swiper.slides.eq(i);\n    currentSlide.remove();\n    slidesBuffer.unshift(currentSlide);\n  }\n\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) $wrapperEl.append(slides[i]);\n    }\n    newActiveIndex =\n      activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n  } else {\n    $wrapperEl.append(slides);\n  }\n\n  for (let i = 0; i < slidesBuffer.length; i += 1) {\n    $wrapperEl.append(slidesBuffer[i]);\n  }\n\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n  if (!params.observer) {\n    swiper.update();\n  }\n  if (params.loop) {\n    swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n  } else {\n    swiper.slideTo(newActiveIndex, 0, false);\n  }\n}\n","export default function removeSlide(slidesIndexes) {\n  const swiper = this;\n  const { params, $wrapperEl, activeIndex } = swiper;\n\n  let activeIndexBuffer = activeIndex;\n  if (params.loop) {\n    activeIndexBuffer -= swiper.loopedSlides;\n    swiper.loopDestroy();\n    swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n  }\n  let newActiveIndex = activeIndexBuffer;\n  let indexToRemove;\n\n  if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n    for (let i = 0; i < slidesIndexes.length; i += 1) {\n      indexToRemove = slidesIndexes[i];\n      if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n      if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n    }\n    newActiveIndex = Math.max(newActiveIndex, 0);\n  } else {\n    indexToRemove = slidesIndexes;\n    if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n    if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n    newActiveIndex = Math.max(newActiveIndex, 0);\n  }\n\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n\n  if (!params.observer) {\n    swiper.update();\n  }\n  if (params.loop) {\n    swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n  } else {\n    swiper.slideTo(newActiveIndex, 0, false);\n  }\n}\n","export default function removeAllSlides() {\n  const swiper = this;\n\n  const slidesIndexes = [];\n  for (let i = 0; i < swiper.slides.length; i += 1) {\n    slidesIndexes.push(i);\n  }\n  swiper.removeSlide(slidesIndexes);\n}\n","export default function effectInit(params) {\n  const { effect, swiper, on, setTranslate, setTransition, overwriteParams, perspective } = params;\n\n  on('beforeInit', () => {\n    if (swiper.params.effect !== effect) return;\n    swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);\n    if (perspective && perspective()) {\n      swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);\n    }\n\n    const overwriteParamsResult = overwriteParams ? overwriteParams() : {};\n\n    Object.assign(swiper.params, overwriteParamsResult);\n    Object.assign(swiper.originalParams, overwriteParamsResult);\n  });\n  on('setTranslate', () => {\n    if (swiper.params.effect !== effect) return;\n    setTranslate();\n  });\n  on('setTransition', (_s, duration) => {\n    if (swiper.params.effect !== effect) return;\n    setTransition(duration);\n  });\n}\n","export default function effectTarget(effectParams, $slideEl) {\n  if (effectParams.transformEl) {\n    return $slideEl.find(effectParams.transformEl).css({\n      'backface-visibility': 'hidden',\n      '-webkit-backface-visibility': 'hidden',\n    });\n  }\n  return $slideEl;\n}\n","export default function effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides }) {\n  const { slides, activeIndex, $wrapperEl } = swiper;\n  if (swiper.params.virtualTranslate && duration !== 0) {\n    let eventTriggered = false;\n    let $transitionEndTarget;\n    if (allSlides) {\n      $transitionEndTarget = transformEl ? slides.find(transformEl) : slides;\n    } else {\n      $transitionEndTarget = transformEl\n        ? slides.eq(activeIndex).find(transformEl)\n        : slides.eq(activeIndex);\n    }\n    $transitionEndTarget.transitionEnd(() => {\n      if (eventTriggered) return;\n      if (!swiper || swiper.destroyed) return;\n      eventTriggered = true;\n      swiper.animating = false;\n      const triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n      for (let i = 0; i < triggerEvents.length; i += 1) {\n        $wrapperEl.trigger(triggerEvents[i]);\n      }\n    });\n  }\n}\n","import $ from './dom.js';\n\nexport default function createShadow(params, $slideEl, side) {\n  const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`;\n  const $shadowContainer = params.transformEl ? $slideEl.find(params.transformEl) : $slideEl;\n  let $shadowEl = $shadowContainer.children(`.${shadowClass}`);\n\n  if (!$shadowEl.length) {\n    $shadowEl = $(`<div class=\"swiper-slide-shadow${side ? `-${side}` : ''}\"></div>`);\n    $shadowContainer.append($shadowEl);\n  }\n  return $shadowEl;\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function Resize({ swiper, on, emit }) {\n  const window = getWindow();\n  let observer = null;\n\n  const resizeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('beforeResize');\n    emit('resize');\n  };\n\n  const createObserver = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    observer = new ResizeObserver((entries) => {\n      const { width, height } = swiper;\n      let newWidth = width;\n      let newHeight = height;\n      entries.forEach(({ contentBoxSize, contentRect, target }) => {\n        if (target && target !== swiper.el) return;\n        newWidth = contentRect\n          ? contentRect.width\n          : (contentBoxSize[0] || contentBoxSize).inlineSize;\n        newHeight = contentRect\n          ? contentRect.height\n          : (contentBoxSize[0] || contentBoxSize).blockSize;\n      });\n      if (newWidth !== width || newHeight !== height) {\n        resizeHandler();\n      }\n    });\n    observer.observe(swiper.el);\n  };\n\n  const removeObserver = () => {\n    if (observer && observer.unobserve && swiper.el) {\n      observer.unobserve(swiper.el);\n      observer = null;\n    }\n  };\n\n  const orientationChangeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('orientationchange');\n  };\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\n  on('destroy', () => {\n    removeObserver();\n    window.removeEventListener('resize', resizeHandler);\n    window.removeEventListener('orientationchange', orientationChangeHandler);\n  });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function Observer({ swiper, extendParams, on, emit }) {\n  const observers = [];\n  const window = getWindow();\n  const attach = (target, options = {}) => {\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 (mutations.length === 1) {\n        emit('observerUpdate', mutations[0]);\n        return;\n      }\n      const observerUpdate = function observerUpdate() {\n        emit('observerUpdate', mutations[0]);\n      };\n\n      if (window.requestAnimationFrame) {\n        window.requestAnimationFrame(observerUpdate);\n      } else {\n        window.setTimeout(observerUpdate, 0);\n      }\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\n    observers.push(observer);\n  };\n  const init = () => {\n    if (!swiper.params.observer) return;\n    if (swiper.params.observeParents) {\n      const containerParents = swiper.$el.parents();\n      for (let i = 0; i < containerParents.length; i += 1) {\n        attach(containerParents[i]);\n      }\n    }\n    // Observe container\n    attach(swiper.$el[0], {\n      childList: swiper.params.observeSlideChildren,\n    });\n\n    // Observe wrapper\n    attach(swiper.$wrapperEl[0], { attributes: false });\n  };\n  const destroy = () => {\n    observers.forEach((observer) => {\n      observer.disconnect();\n    });\n    observers.splice(0, observers.length);\n  };\n\n  extendParams({\n    observer: false,\n    observeParents: false,\n    observeSlideChildren: false,\n  });\n  on('init', init);\n  on('destroy', destroy);\n}\n","// Swiper Class\nimport Swiper from './core/core.js';\n\n//IMPORT_MODULES\n\nconst modules = [\n  //INSTALL_MODULES\n];\n\nSwiper.use(modules);\n\n//EXPORT\n","import $ from '../../shared/dom.js';\nimport { setCSSProperty } from '../../shared/utils.js';\n\nexport default function Virtual({ swiper, extendParams, on }) {\n  extendParams({\n    virtual: {\n      enabled: false,\n      slides: [],\n      cache: true,\n      renderSlide: null,\n      renderExternal: null,\n      renderExternalUpdate: true,\n      addSlidesBefore: 0,\n      addSlidesAfter: 0,\n    },\n  });\n\n  let cssModeTimeout;\n\n  swiper.virtual = {\n    cache: {},\n    from: undefined,\n    to: undefined,\n    slides: [],\n    offset: 0,\n    slidesGrid: [],\n  };\n\n  function renderSlide(slide, index) {\n    const params = swiper.params.virtual;\n    if (params.cache && swiper.virtual.cache[index]) {\n      return swiper.virtual.cache[index];\n    }\n    const $slideEl = params.renderSlide\n      ? $(params.renderSlide.call(swiper, slide, index))\n      : $(\n          `<div class=\"${swiper.params.slideClass}\" data-swiper-slide-index=\"${index}\">${slide}</div>`,\n        );\n    if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);\n    if (params.cache) swiper.virtual.cache[index] = $slideEl;\n    return $slideEl;\n  }\n\n  function update(force) {\n    const { slidesPerView, slidesPerGroup, centeredSlides } = swiper.params;\n    const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual;\n    const {\n      from: previousFrom,\n      to: previousTo,\n      slides,\n      slidesGrid: previousSlidesGrid,\n      offset: previousOffset,\n    } = swiper.virtual;\n    if (!swiper.params.cssMode) {\n      swiper.updateActiveIndex();\n    }\n\n    const activeIndex = swiper.activeIndex || 0;\n\n    let offsetProp;\n    if (swiper.rtlTranslate) offsetProp = 'right';\n    else offsetProp = swiper.isHorizontal() ? 'left' : 'top';\n\n    let slidesAfter;\n    let slidesBefore;\n    if (centeredSlides) {\n      slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n      slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n    } else {\n      slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;\n      slidesBefore = slidesPerGroup + addSlidesBefore;\n    }\n    const from = Math.max((activeIndex || 0) - slidesBefore, 0);\n    const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n    const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n\n    Object.assign(swiper.virtual, {\n      from,\n      to,\n      offset,\n      slidesGrid: swiper.slidesGrid,\n    });\n\n    function onRendered() {\n      swiper.updateSlides();\n      swiper.updateProgress();\n      swiper.updateSlidesClasses();\n      if (swiper.lazy && swiper.params.lazy.enabled) {\n        swiper.lazy.load();\n      }\n    }\n\n    if (previousFrom === from && previousTo === to && !force) {\n      if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n        swiper.slides.css(offsetProp, `${offset}px`);\n      }\n      swiper.updateProgress();\n      return;\n    }\n    if (swiper.params.virtual.renderExternal) {\n      swiper.params.virtual.renderExternal.call(swiper, {\n        offset,\n        from,\n        to,\n        slides: (function getSlides() {\n          const slidesToRender = [];\n          for (let i = from; i <= to; i += 1) {\n            slidesToRender.push(slides[i]);\n          }\n          return slidesToRender;\n        })(),\n      });\n      if (swiper.params.virtual.renderExternalUpdate) {\n        onRendered();\n      }\n      return;\n    }\n    const prependIndexes = [];\n    const appendIndexes = [];\n    if (force) {\n      swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove();\n    } else {\n      for (let i = previousFrom; i <= previousTo; i += 1) {\n        if (i < from || i > to) {\n          swiper.$wrapperEl\n            .find(`.${swiper.params.slideClass}[data-swiper-slide-index=\"${i}\"]`)\n            .remove();\n        }\n      }\n    }\n    for (let i = 0; i < slides.length; i += 1) {\n      if (i >= from && i <= to) {\n        if (typeof previousTo === 'undefined' || force) {\n          appendIndexes.push(i);\n        } else {\n          if (i > previousTo) appendIndexes.push(i);\n          if (i < previousFrom) prependIndexes.push(i);\n        }\n      }\n    }\n    appendIndexes.forEach((index) => {\n      swiper.$wrapperEl.append(renderSlide(slides[index], index));\n    });\n    prependIndexes\n      .sort((a, b) => b - a)\n      .forEach((index) => {\n        swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n      });\n    swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`);\n    onRendered();\n  }\n\n  function appendSlide(slides) {\n    if (typeof slides === 'object' && 'length' in slides) {\n      for (let i = 0; i < slides.length; i += 1) {\n        if (slides[i]) swiper.virtual.slides.push(slides[i]);\n      }\n    } else {\n      swiper.virtual.slides.push(slides);\n    }\n    update(true);\n  }\n  function prependSlide(slides) {\n    const activeIndex = swiper.activeIndex;\n    let newActiveIndex = activeIndex + 1;\n    let numberOfNewSlides = 1;\n\n    if (Array.isArray(slides)) {\n      for (let i = 0; i < slides.length; i += 1) {\n        if (slides[i]) swiper.virtual.slides.unshift(slides[i]);\n      }\n      newActiveIndex = activeIndex + slides.length;\n      numberOfNewSlides = slides.length;\n    } else {\n      swiper.virtual.slides.unshift(slides);\n    }\n    if (swiper.params.virtual.cache) {\n      const cache = swiper.virtual.cache;\n      const newCache = {};\n      Object.keys(cache).forEach((cachedIndex) => {\n        const $cachedEl = cache[cachedIndex];\n        const cachedElIndex = $cachedEl.attr('data-swiper-slide-index');\n        if (cachedElIndex) {\n          $cachedEl.attr(\n            'data-swiper-slide-index',\n            parseInt(cachedElIndex, 10) + numberOfNewSlides,\n          );\n        }\n        newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;\n      });\n      swiper.virtual.cache = newCache;\n    }\n    update(true);\n    swiper.slideTo(newActiveIndex, 0);\n  }\n  function removeSlide(slidesIndexes) {\n    if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;\n    let activeIndex = swiper.activeIndex;\n    if (Array.isArray(slidesIndexes)) {\n      for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n        swiper.virtual.slides.splice(slidesIndexes[i], 1);\n        if (swiper.params.virtual.cache) {\n          delete swiper.virtual.cache[slidesIndexes[i]];\n        }\n        if (slidesIndexes[i] < activeIndex) activeIndex -= 1;\n        activeIndex = Math.max(activeIndex, 0);\n      }\n    } else {\n      swiper.virtual.slides.splice(slidesIndexes, 1);\n      if (swiper.params.virtual.cache) {\n        delete swiper.virtual.cache[slidesIndexes];\n      }\n      if (slidesIndexes < activeIndex) activeIndex -= 1;\n      activeIndex = Math.max(activeIndex, 0);\n    }\n    update(true);\n    swiper.slideTo(activeIndex, 0);\n  }\n  function removeAllSlides() {\n    swiper.virtual.slides = [];\n    if (swiper.params.virtual.cache) {\n      swiper.virtual.cache = {};\n    }\n    update(true);\n    swiper.slideTo(0, 0);\n  }\n\n  on('beforeInit', () => {\n    if (!swiper.params.virtual.enabled) return;\n    swiper.virtual.slides = swiper.params.virtual.slides;\n    swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);\n\n    swiper.params.watchSlidesProgress = true;\n    swiper.originalParams.watchSlidesProgress = true;\n\n    if (!swiper.params.initialSlide) {\n      update();\n    }\n  });\n  on('setTranslate', () => {\n    if (!swiper.params.virtual.enabled) return;\n    if (swiper.params.cssMode && !swiper._immediateVirtual) {\n      clearTimeout(cssModeTimeout);\n      cssModeTimeout = setTimeout(() => {\n        update();\n      }, 100);\n    } else {\n      update();\n    }\n  });\n  on('init update resize', () => {\n    if (!swiper.params.virtual.enabled) return;\n    if (swiper.params.cssMode) {\n      setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);\n    }\n  });\n\n  Object.assign(swiper.virtual, {\n    appendSlide,\n    prependSlide,\n    removeSlide,\n    removeAllSlides,\n    update,\n  });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Keyboard({ swiper, extendParams, on, emit }) {\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\n  function handle(event) {\n    if (!swiper.enabled) return;\n\n    const { rtlTranslate: rtl } = 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 (\n      !swiper.allowSlideNext &&\n      ((swiper.isHorizontal() && isArrowRight) ||\n        (swiper.isVertical() && isArrowDown) ||\n        isPageDown)\n    ) {\n      return false;\n    }\n    if (\n      !swiper.allowSlidePrev &&\n      ((swiper.isHorizontal() && isArrowLeft) || (swiper.isVertical() && isArrowUp) || isPageUp)\n    ) {\n      return false;\n    }\n    if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n      return undefined;\n    }\n    if (\n      document.activeElement &&\n      document.activeElement.nodeName &&\n      (document.activeElement.nodeName.toLowerCase() === 'input' ||\n        document.activeElement.nodeName.toLowerCase() === 'textarea')\n    ) {\n      return undefined;\n    }\n    if (\n      swiper.params.keyboard.onlyInViewport &&\n      (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)\n    ) {\n      let inView = false;\n      // Check that swiper should be inside of visible area of window\n      if (\n        swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 &&\n        swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0\n      ) {\n        return undefined;\n      }\n\n      const $el = swiper.$el;\n      const swiperWidth = $el[0].clientWidth;\n      const swiperHeight = $el[0].clientHeight;\n      const windowWidth = window.innerWidth;\n      const windowHeight = window.innerHeight;\n      const swiperOffset = swiper.$el.offset();\n      if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n      const swiperCoord = [\n        [swiperOffset.left, swiperOffset.top],\n        [swiperOffset.left + swiperWidth, swiperOffset.top],\n        [swiperOffset.left, swiperOffset.top + swiperHeight],\n        [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight],\n      ];\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();\n        else e.returnValue = false;\n      }\n      if (((isPageDown || isArrowRight) && !rtl) || ((isPageUp || isArrowLeft) && rtl))\n        swiper.slideNext();\n      if (((isPageUp || isArrowLeft) && !rtl) || ((isPageDown || isArrowRight) && rtl))\n        swiper.slidePrev();\n    } else {\n      if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n        if (e.preventDefault) e.preventDefault();\n        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).on('keydown', handle);\n    swiper.keyboard.enabled = true;\n  }\n  function disable() {\n    if (!swiper.keyboard.enabled) return;\n    $(document).off('keydown', handle);\n    swiper.keyboard.enabled = false;\n  }\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\n  Object.assign(swiper.keyboard, {\n    enable,\n    disable,\n  });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now, nextTick } from '../../shared/utils.js';\n\nexport default function Mousewheel({ swiper, extendParams, on, emit }) {\n  const window = getWindow();\n\n  extendParams({\n    mousewheel: {\n      enabled: false,\n      releaseOnEdges: false,\n      invert: false,\n      forceToAxis: false,\n      sensitivity: 1,\n      eventsTarget: 'container',\n      thresholdDelta: null,\n      thresholdTime: null,\n    },\n  });\n\n  swiper.mousewheel = {\n    enabled: false,\n  };\n\n  let timeout;\n  let lastScrollTime = now();\n  let lastEventBeforeSnap;\n  const recentWheelEvents = [];\n\n  function normalize(e) {\n    // Reasonable defaults\n    const PIXEL_STEP = 10;\n    const LINE_HEIGHT = 40;\n    const PAGE_HEIGHT = 800;\n\n    let sX = 0;\n    let sY = 0; // spinX, spinY\n    let pX = 0;\n    let pY = 0; // pixelX, pixelY\n\n    // Legacy\n    if ('detail' in e) {\n      sY = e.detail;\n    }\n    if ('wheelDelta' in e) {\n      sY = -e.wheelDelta / 120;\n    }\n    if ('wheelDeltaY' in e) {\n      sY = -e.wheelDeltaY / 120;\n    }\n    if ('wheelDeltaX' in e) {\n      sX = -e.wheelDeltaX / 120;\n    }\n\n    // side scrolling on FF with DOMMouseScroll\n    if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n      sX = sY;\n      sY = 0;\n    }\n\n    pX = sX * PIXEL_STEP;\n    pY = sY * PIXEL_STEP;\n\n    if ('deltaY' in e) {\n      pY = e.deltaY;\n    }\n    if ('deltaX' in e) {\n      pX = e.deltaX;\n    }\n\n    if (e.shiftKey && !pX) {\n      // if user scrolls with shift he wants horizontal scroll\n      pX = pY;\n      pY = 0;\n    }\n\n    if ((pX || pY) && e.deltaMode) {\n      if (e.deltaMode === 1) {\n        // delta in LINE units\n        pX *= LINE_HEIGHT;\n        pY *= LINE_HEIGHT;\n      } else {\n        // delta in PAGE units\n        pX *= PAGE_HEIGHT;\n        pY *= PAGE_HEIGHT;\n      }\n    }\n\n    // Fall-back if spin cannot be determined\n    if (pX && !sX) {\n      sX = pX < 1 ? -1 : 1;\n    }\n    if (pY && !sY) {\n      sY = pY < 1 ? -1 : 1;\n    }\n\n    return {\n      spinX: sX,\n      spinY: sY,\n      pixelX: pX,\n      pixelY: pY,\n    };\n  }\n  function handleMouseEnter() {\n    if (!swiper.enabled) return;\n    swiper.mouseEntered = true;\n  }\n  function handleMouseLeave() {\n    if (!swiper.enabled) return;\n    swiper.mouseEntered = false;\n  }\n  function animateSlider(newEvent) {\n    if (\n      swiper.params.mousewheel.thresholdDelta &&\n      newEvent.delta < swiper.params.mousewheel.thresholdDelta\n    ) {\n      // Prevent if delta of wheel scroll delta is below configured threshold\n      return false;\n    }\n\n    if (\n      swiper.params.mousewheel.thresholdTime &&\n      now() - lastScrollTime < swiper.params.mousewheel.thresholdTime\n    ) {\n      // Prevent if time between scrolls is below configured threshold\n      return false;\n    }\n\n    // If the movement is NOT big enough and\n    // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):\n    //   Don't go any further (avoid insignificant scroll movement).\n    if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {\n      // Return false as a default\n      return true;\n    }\n    // If user is scrolling towards the end:\n    //   If the slider hasn't hit the latest slide or\n    //   if the slider is a loop and\n    //   if the slider isn't moving right now:\n    //     Go to next slide and\n    //     emit a scroll event.\n    // Else (the user is scrolling towards the beginning) and\n    // if the slider hasn't hit the first slide or\n    // if the slider is a loop and\n    // if the slider isn't moving right now:\n    //   Go to prev slide and\n    //   emit a scroll event.\n    if (newEvent.direction < 0) {\n      if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n        swiper.slideNext();\n        emit('scroll', newEvent.raw);\n      }\n    } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n      swiper.slidePrev();\n      emit('scroll', newEvent.raw);\n    }\n    // If you got here is because an animation has been triggered so store the current time\n    lastScrollTime = new window.Date().getTime();\n    // Return false as a default\n    return false;\n  }\n  function releaseScroll(newEvent) {\n    const params = swiper.params.mousewheel;\n    if (newEvent.direction < 0) {\n      if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {\n        // Return true to animate scroll on edges\n        return true;\n      }\n    } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {\n      // Return true to animate scroll on edges\n      return true;\n    }\n    return false;\n  }\n  function handle(event) {\n    let e = event;\n    let disableParentSwiper = true;\n    if (!swiper.enabled) return;\n    const params = swiper.params.mousewheel;\n\n    if (swiper.params.cssMode) {\n      e.preventDefault();\n    }\n\n    let target = swiper.$el;\n    if (swiper.params.mousewheel.eventsTarget !== 'container') {\n      target = $(swiper.params.mousewheel.eventsTarget);\n    }\n    if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges)\n      return true;\n\n    if (e.originalEvent) e = e.originalEvent; // jquery fix\n    let delta = 0;\n    const rtlFactor = swiper.rtlTranslate ? -1 : 1;\n\n    const data = normalize(e);\n\n    if (params.forceToAxis) {\n      if (swiper.isHorizontal()) {\n        if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;\n        else return true;\n      } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;\n      else return true;\n    } else {\n      delta =\n        Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n    }\n\n    if (delta === 0) return true;\n\n    if (params.invert) delta = -delta;\n\n    // Get the scroll positions\n    let positions = swiper.getTranslate() + delta * params.sensitivity;\n\n    if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();\n    if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();\n\n    // When loop is true:\n    //     the disableParentSwiper will be true.\n    // When loop is false:\n    //     if the scroll positions is not on edge,\n    //     then the disableParentSwiper will be true.\n    //     if the scroll on edge positions,\n    //     then the disableParentSwiper will be false.\n    disableParentSwiper = swiper.params.loop\n      ? true\n      : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());\n\n    if (disableParentSwiper && swiper.params.nested) e.stopPropagation();\n\n    if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {\n      // Register the new event in a variable which stores the relevant data\n      const newEvent = {\n        time: now(),\n        delta: Math.abs(delta),\n        direction: Math.sign(delta),\n        raw: event,\n      };\n\n      // Keep the most recent events\n      if (recentWheelEvents.length >= 2) {\n        recentWheelEvents.shift(); // only store the last N events\n      }\n      const prevEvent = recentWheelEvents.length\n        ? recentWheelEvents[recentWheelEvents.length - 1]\n        : undefined;\n      recentWheelEvents.push(newEvent);\n\n      // If there is at least one previous recorded event:\n      //   If direction has changed or\n      //   if the scroll is quicker than the previous one:\n      //     Animate the slider.\n      // Else (this is the first time the wheel is moved):\n      //     Animate the slider.\n      if (prevEvent) {\n        if (\n          newEvent.direction !== prevEvent.direction ||\n          newEvent.delta > prevEvent.delta ||\n          newEvent.time > prevEvent.time + 150\n        ) {\n          animateSlider(newEvent);\n        }\n      } else {\n        animateSlider(newEvent);\n      }\n\n      // If it's time to release the scroll:\n      //   Return now so you don't hit the preventDefault.\n      if (releaseScroll(newEvent)) {\n        return true;\n      }\n    } else {\n      // Freemode or scrollContainer:\n\n      // If we recently snapped after a momentum scroll, then ignore wheel events\n      // to give time for the deceleration to finish. Stop ignoring after 500 msecs\n      // or if it's a new scroll (larger delta or inverse sign as last event before\n      // an end-of-momentum snap).\n      const newEvent = {\n        time: now(),\n        delta: Math.abs(delta),\n        direction: Math.sign(delta),\n      };\n      const ignoreWheelEvents =\n        lastEventBeforeSnap &&\n        newEvent.time < lastEventBeforeSnap.time + 500 &&\n        newEvent.delta <= lastEventBeforeSnap.delta &&\n        newEvent.direction === lastEventBeforeSnap.direction;\n      if (!ignoreWheelEvents) {\n        lastEventBeforeSnap = undefined;\n\n        if (swiper.params.loop) {\n          swiper.loopFix();\n        }\n        let position = swiper.getTranslate() + delta * params.sensitivity;\n        const wasBeginning = swiper.isBeginning;\n        const wasEnd = swiper.isEnd;\n\n        if (position >= swiper.minTranslate()) position = swiper.minTranslate();\n        if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();\n\n        swiper.setTransition(0);\n        swiper.setTranslate(position);\n        swiper.updateProgress();\n        swiper.updateActiveIndex();\n        swiper.updateSlidesClasses();\n\n        if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n          swiper.updateSlidesClasses();\n        }\n\n        if (swiper.params.freeMode.sticky) {\n          // When wheel scrolling starts with sticky (aka snap) enabled, then detect\n          // the end of a momentum scroll by storing recent (N=15?) wheel events.\n          // 1. do all N events have decreasing or same (absolute value) delta?\n          // 2. did all N events arrive in the last M (M=500?) msecs?\n          // 3. does the earliest event have an (absolute value) delta that's\n          //    at least P (P=1?) larger than the most recent event's delta?\n          // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?\n          // If 1-4 are \"yes\" then we're near the end of a momentum scroll deceleration.\n          // Snap immediately and ignore remaining wheel events in this scroll.\n          // See comment above for \"remaining wheel events in this scroll\" determination.\n          // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.\n          clearTimeout(timeout);\n          timeout = undefined;\n          if (recentWheelEvents.length >= 15) {\n            recentWheelEvents.shift(); // only store the last N events\n          }\n          const prevEvent = recentWheelEvents.length\n            ? recentWheelEvents[recentWheelEvents.length - 1]\n            : undefined;\n          const firstEvent = recentWheelEvents[0];\n          recentWheelEvents.push(newEvent);\n          if (\n            prevEvent &&\n            (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)\n          ) {\n            // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.\n            recentWheelEvents.splice(0);\n          } else if (\n            recentWheelEvents.length >= 15 &&\n            newEvent.time - firstEvent.time < 500 &&\n            firstEvent.delta - newEvent.delta >= 1 &&\n            newEvent.delta <= 6\n          ) {\n            // We're at the end of the deceleration of a momentum scroll, so there's no need\n            // to wait for more events. Snap ASAP on the next tick.\n            // Also, because there's some remaining momentum we'll bias the snap in the\n            // direction of the ongoing scroll because it's better UX for the scroll to snap\n            // in the same direction as the scroll instead of reversing to snap.  Therefore,\n            // if it's already scrolled more than 20% in the current direction, keep going.\n            const snapToThreshold = delta > 0 ? 0.8 : 0.2;\n            lastEventBeforeSnap = newEvent;\n            recentWheelEvents.splice(0);\n            timeout = nextTick(() => {\n              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n            }, 0); // no delay; move on next tick\n          }\n          if (!timeout) {\n            // if we get here, then we haven't detected the end of a momentum scroll, so\n            // we'll consider a scroll \"complete\" when there haven't been any wheel events\n            // for 500ms.\n            timeout = nextTick(() => {\n              const snapToThreshold = 0.5;\n              lastEventBeforeSnap = newEvent;\n              recentWheelEvents.splice(0);\n              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n            }, 500);\n          }\n        }\n\n        // Emit event\n        if (!ignoreWheelEvents) emit('scroll', e);\n\n        // Stop autoplay\n        if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction)\n          swiper.autoplay.stop();\n        // Return page scroll on edge positions\n        if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;\n      }\n    }\n\n    if (e.preventDefault) e.preventDefault();\n    else e.returnValue = false;\n    return false;\n  }\n\n  function events(method) {\n    let target = swiper.$el;\n    if (swiper.params.mousewheel.eventsTarget !== 'container') {\n      target = $(swiper.params.mousewheel.eventsTarget);\n    }\n    target[method]('mouseenter', handleMouseEnter);\n    target[method]('mouseleave', handleMouseLeave);\n    target[method]('wheel', handle);\n  }\n\n  function enable() {\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.removeEventListener('wheel', handle);\n      return true;\n    }\n    if (swiper.mousewheel.enabled) return false;\n    events('on');\n    swiper.mousewheel.enabled = true;\n    return true;\n  }\n  function disable() {\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.addEventListener(event, handle);\n      return true;\n    }\n    if (!swiper.mousewheel.enabled) return false;\n    events('off');\n    swiper.mousewheel.enabled = false;\n    return true;\n  }\n\n  on('init', () => {\n    if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {\n      disable();\n    }\n    if (swiper.params.mousewheel.enabled) enable();\n  });\n  on('destroy', () => {\n    if (swiper.params.cssMode) {\n      enable();\n    }\n    if (swiper.mousewheel.enabled) disable();\n  });\n\n  Object.assign(swiper.mousewheel, {\n    enable,\n    disable,\n  });\n}\n","import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Navigation({ swiper, extendParams, on, emit }) {\n  extendParams({\n    navigation: {\n      nextEl: null,\n      prevEl: null,\n\n      hideOnClick: false,\n      disabledClass: 'swiper-button-disabled',\n      hiddenClass: 'swiper-button-hidden',\n      lockClass: 'swiper-button-lock',\n    },\n  });\n\n  swiper.navigation = {\n    nextEl: null,\n    $nextEl: null,\n    prevEl: null,\n    $prevEl: null,\n  };\n\n  function getEl(el) {\n    let $el;\n    if (el) {\n      $el = $(el);\n      if (\n        swiper.params.uniqueNavElements &&\n        typeof el === 'string' &&\n        $el.length > 1 &&\n        swiper.$el.find(el).length === 1\n      ) {\n        $el = swiper.$el.find(el);\n      }\n    }\n    return $el;\n  }\n\n  function toggleEl($el, disabled) {\n    const params = swiper.params.navigation;\n    if ($el && $el.length > 0) {\n      $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass);\n      if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;\n      if (swiper.params.watchOverflow && swiper.enabled) {\n        $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n      }\n    }\n  }\n  function update() {\n    // Update Navigation Buttons\n    if (swiper.params.loop) return;\n    const { $nextEl, $prevEl } = swiper.navigation;\n\n    toggleEl($prevEl, swiper.isBeginning);\n    toggleEl($nextEl, swiper.isEnd);\n  }\n  function onPrevClick(e) {\n    e.preventDefault();\n    if (swiper.isBeginning && !swiper.params.loop) return;\n    swiper.slidePrev();\n  }\n  function onNextClick(e) {\n    e.preventDefault();\n    if (swiper.isEnd && !swiper.params.loop) return;\n    swiper.slideNext();\n  }\n  function init() {\n    const params = swiper.params.navigation;\n\n    swiper.params.navigation = createElementIfNotDefined(\n      swiper,\n      swiper.originalParams.navigation,\n      swiper.params.navigation,\n      {\n        nextEl: 'swiper-button-next',\n        prevEl: 'swiper-button-prev',\n      },\n    );\n    if (!(params.nextEl || params.prevEl)) return;\n\n    const $nextEl = getEl(params.nextEl);\n    const $prevEl = getEl(params.prevEl);\n\n    if ($nextEl && $nextEl.length > 0) {\n      $nextEl.on('click', onNextClick);\n    }\n    if ($prevEl && $prevEl.length > 0) {\n      $prevEl.on('click', onPrevClick);\n    }\n\n    Object.assign(swiper.navigation, {\n      $nextEl,\n      nextEl: $nextEl && $nextEl[0],\n      $prevEl,\n      prevEl: $prevEl && $prevEl[0],\n    });\n\n    if (!swiper.enabled) {\n      if ($nextEl) $nextEl.addClass(params.lockClass);\n      if ($prevEl) $prevEl.addClass(params.lockClass);\n    }\n  }\n  function destroy() {\n    const { $nextEl, $prevEl } = swiper.navigation;\n    if ($nextEl && $nextEl.length) {\n      $nextEl.off('click', onNextClick);\n      $nextEl.removeClass(swiper.params.navigation.disabledClass);\n    }\n    if ($prevEl && $prevEl.length) {\n      $prevEl.off('click', onPrevClick);\n      $prevEl.removeClass(swiper.params.navigation.disabledClass);\n    }\n  }\n\n  on('init', () => {\n    init();\n    update();\n  });\n  on('toEdge fromEdge lock unlock', () => {\n    update();\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    const { $nextEl, $prevEl } = swiper.navigation;\n    if ($nextEl) {\n      $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n    }\n    if ($prevEl) {\n      $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n    }\n  });\n  on('click', (_s, e) => {\n    const { $nextEl, $prevEl } = swiper.navigation;\n    const targetEl = e.target;\n    if (\n      swiper.params.navigation.hideOnClick &&\n      !$(targetEl).is($prevEl) &&\n      !$(targetEl).is($nextEl)\n    ) {\n      if (\n        swiper.pagination &&\n        swiper.params.pagination &&\n        swiper.params.pagination.clickable &&\n        (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))\n      )\n        return;\n      let isHidden;\n      if ($nextEl) {\n        isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n      } else if ($prevEl) {\n        isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n      }\n      if (isHidden === true) {\n        emit('navigationShow');\n      } else {\n        emit('navigationHide');\n      }\n      if ($nextEl) {\n        $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n      }\n      if ($prevEl) {\n        $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n      }\n    }\n  });\n\n  Object.assign(swiper.navigation, {\n    update,\n    init,\n    destroy,\n  });\n}\n","import $ from '../../shared/dom.js';\nimport classesToSelector from '../../shared/classes-to-selector.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Pagination({ swiper, extendParams, on, emit }) {\n  const pfx = 'swiper-pagination';\n  extendParams({\n    pagination: {\n      el: null,\n      bulletElement: 'span',\n      clickable: false,\n      hideOnClick: false,\n      renderBullet: null,\n      renderProgressbar: null,\n      renderFraction: null,\n      renderCustom: null,\n      progressbarOpposite: false,\n      type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n      dynamicBullets: false,\n      dynamicMainBullets: 1,\n      formatFractionCurrent: (number) => number,\n      formatFractionTotal: (number) => number,\n      bulletClass: `${pfx}-bullet`,\n      bulletActiveClass: `${pfx}-bullet-active`,\n      modifierClass: `${pfx}-`,\n      currentClass: `${pfx}-current`,\n      totalClass: `${pfx}-total`,\n      hiddenClass: `${pfx}-hidden`,\n      progressbarFillClass: `${pfx}-progressbar-fill`,\n      progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n      clickableClass: `${pfx}-clickable`,\n      lockClass: `${pfx}-lock`,\n      horizontalClass: `${pfx}-horizontal`,\n      verticalClass: `${pfx}-vertical`,\n    },\n  });\n\n  swiper.pagination = {\n    el: null,\n    $el: null,\n    bullets: [],\n  };\n\n  let bulletSize;\n  let dynamicBulletIndex = 0;\n\n  function isPaginationDisabled() {\n    return (\n      !swiper.params.pagination.el ||\n      !swiper.pagination.el ||\n      !swiper.pagination.$el ||\n      swiper.pagination.$el.length === 0\n    );\n  }\n\n  function setSideBullets($bulletEl, position) {\n    const { bulletActiveClass } = swiper.params.pagination;\n    $bulletEl[position]()\n      .addClass(`${bulletActiveClass}-${position}`)\n      [position]()\n      .addClass(`${bulletActiveClass}-${position}-${position}`);\n  }\n\n  function update() {\n    // Render || Update Pagination bullets/items\n    const rtl = swiper.rtl;\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength =\n      swiper.virtual && swiper.params.virtual.enabled\n        ? swiper.virtual.slides.length\n        : swiper.slides.length;\n    const $el = swiper.pagination.$el;\n    // Current/Total\n    let current;\n    const total = swiper.params.loop\n      ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n      : swiper.snapGrid.length;\n    if (swiper.params.loop) {\n      current = Math.ceil(\n        (swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup,\n      );\n      if (current > slidesLength - 1 - swiper.loopedSlides * 2) {\n        current -= slidesLength - swiper.loopedSlides * 2;\n      }\n      if (current > total - 1) current -= total;\n      if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;\n    } else if (typeof swiper.snapIndex !== 'undefined') {\n      current = swiper.snapIndex;\n    } else {\n      current = swiper.activeIndex || 0;\n    }\n    // Types\n    if (\n      params.type === 'bullets' &&\n      swiper.pagination.bullets &&\n      swiper.pagination.bullets.length > 0\n    ) {\n      const bullets = swiper.pagination.bullets;\n      let firstIndex;\n      let lastIndex;\n      let midIndex;\n      if (params.dynamicBullets) {\n        bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n        $el.css(\n          swiper.isHorizontal() ? 'width' : 'height',\n          `${bulletSize * (params.dynamicMainBullets + 4)}px`,\n        );\n        if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n          dynamicBulletIndex += current - swiper.previousIndex;\n          if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n            dynamicBulletIndex = params.dynamicMainBullets - 1;\n          } else if (dynamicBulletIndex < 0) {\n            dynamicBulletIndex = 0;\n          }\n        }\n        firstIndex = current - dynamicBulletIndex;\n        lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n        midIndex = (lastIndex + firstIndex) / 2;\n      }\n      bullets.removeClass(\n        ['', '-next', '-next-next', '-prev', '-prev-prev', '-main']\n          .map((suffix) => `${params.bulletActiveClass}${suffix}`)\n          .join(' '),\n      );\n      if ($el.length > 1) {\n        bullets.each((bullet) => {\n          const $bullet = $(bullet);\n          const bulletIndex = $bullet.index();\n          if (bulletIndex === current) {\n            $bullet.addClass(params.bulletActiveClass);\n          }\n          if (params.dynamicBullets) {\n            if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n              $bullet.addClass(`${params.bulletActiveClass}-main`);\n            }\n            if (bulletIndex === firstIndex) {\n              setSideBullets($bullet, 'prev');\n            }\n            if (bulletIndex === lastIndex) {\n              setSideBullets($bullet, 'next');\n            }\n          }\n        });\n      } else {\n        const $bullet = bullets.eq(current);\n        const bulletIndex = $bullet.index();\n        $bullet.addClass(params.bulletActiveClass);\n        if (params.dynamicBullets) {\n          const $firstDisplayedBullet = bullets.eq(firstIndex);\n          const $lastDisplayedBullet = bullets.eq(lastIndex);\n          for (let i = firstIndex; i <= lastIndex; i += 1) {\n            bullets.eq(i).addClass(`${params.bulletActiveClass}-main`);\n          }\n          if (swiper.params.loop) {\n            if (bulletIndex >= bullets.length - params.dynamicMainBullets) {\n              for (let i = params.dynamicMainBullets; i >= 0; i -= 1) {\n                bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`);\n              }\n              bullets\n                .eq(bullets.length - params.dynamicMainBullets - 1)\n                .addClass(`${params.bulletActiveClass}-prev`);\n            } else {\n              setSideBullets($firstDisplayedBullet, 'prev');\n              setSideBullets($lastDisplayedBullet, 'next');\n            }\n          } else {\n            setSideBullets($firstDisplayedBullet, 'prev');\n            setSideBullets($lastDisplayedBullet, 'next');\n          }\n        }\n      }\n      if (params.dynamicBullets) {\n        const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n        const bulletsOffset =\n          (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n        const offsetProp = rtl ? 'right' : 'left';\n        bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`);\n      }\n    }\n    if (params.type === 'fraction') {\n      $el\n        .find(classesToSelector(params.currentClass))\n        .text(params.formatFractionCurrent(current + 1));\n      $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));\n    }\n    if (params.type === 'progressbar') {\n      let progressbarDirection;\n      if (params.progressbarOpposite) {\n        progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n      } else {\n        progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n      }\n      const scale = (current + 1) / total;\n      let scaleX = 1;\n      let scaleY = 1;\n      if (progressbarDirection === 'horizontal') {\n        scaleX = scale;\n      } else {\n        scaleY = scale;\n      }\n      $el\n        .find(classesToSelector(params.progressbarFillClass))\n        .transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`)\n        .transition(swiper.params.speed);\n    }\n    if (params.type === 'custom' && params.renderCustom) {\n      $el.html(params.renderCustom(swiper, current + 1, total));\n      emit('paginationRender', $el[0]);\n    } else {\n      emit('paginationUpdate', $el[0]);\n    }\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n    }\n  }\n  function render() {\n    // Render Container\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength =\n      swiper.virtual && swiper.params.virtual.enabled\n        ? swiper.virtual.slides.length\n        : swiper.slides.length;\n\n    const $el = swiper.pagination.$el;\n    let paginationHTML = '';\n    if (params.type === 'bullets') {\n      let numberOfBullets = swiper.params.loop\n        ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n        : swiper.snapGrid.length;\n      if (\n        swiper.params.freeMode &&\n        swiper.params.freeMode.enabled &&\n        !swiper.params.loop &&\n        numberOfBullets > slidesLength\n      ) {\n        numberOfBullets = slidesLength;\n      }\n      for (let i = 0; i < numberOfBullets; i += 1) {\n        if (params.renderBullet) {\n          paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n        } else {\n          paginationHTML += `<${params.bulletElement} class=\"${params.bulletClass}\"></${params.bulletElement}>`;\n        }\n      }\n      $el.html(paginationHTML);\n\n      swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));\n    }\n    if (params.type === 'fraction') {\n      if (params.renderFraction) {\n        paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n      } else {\n        paginationHTML =\n          `<span class=\"${params.currentClass}\"></span>` +\n          ' / ' +\n          `<span class=\"${params.totalClass}\"></span>`;\n      }\n      $el.html(paginationHTML);\n    }\n    if (params.type === 'progressbar') {\n      if (params.renderProgressbar) {\n        paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n      } else {\n        paginationHTML = `<span class=\"${params.progressbarFillClass}\"></span>`;\n      }\n      $el.html(paginationHTML);\n    }\n    if (params.type !== 'custom') {\n      emit('paginationRender', swiper.pagination.$el[0]);\n    }\n  }\n  function init() {\n    swiper.params.pagination = createElementIfNotDefined(\n      swiper,\n      swiper.originalParams.pagination,\n      swiper.params.pagination,\n      { el: 'swiper-pagination' },\n    );\n    const params = swiper.params.pagination;\n    if (!params.el) return;\n\n    let $el = $(params.el);\n    if ($el.length === 0) return;\n\n    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {\n      $el = swiper.$el.find(params.el);\n      // check if it belongs to another nested Swiper\n      if ($el.length > 1) {\n        $el = $el.filter((el) => {\n          if ($(el).parents('.swiper')[0] !== swiper.el) return false;\n          return true;\n        });\n      }\n    }\n\n    if (params.type === 'bullets' && params.clickable) {\n      $el.addClass(params.clickableClass);\n    }\n\n    $el.addClass(params.modifierClass + params.type);\n    $el.addClass(params.modifierClass + swiper.params.direction);\n\n    if (params.type === 'bullets' && params.dynamicBullets) {\n      $el.addClass(`${params.modifierClass}${params.type}-dynamic`);\n      dynamicBulletIndex = 0;\n      if (params.dynamicMainBullets < 1) {\n        params.dynamicMainBullets = 1;\n      }\n    }\n    if (params.type === 'progressbar' && params.progressbarOpposite) {\n      $el.addClass(params.progressbarOppositeClass);\n    }\n\n    if (params.clickable) {\n      $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {\n        e.preventDefault();\n        let index = $(this).index() * swiper.params.slidesPerGroup;\n        if (swiper.params.loop) index += swiper.loopedSlides;\n        swiper.slideTo(index);\n      });\n    }\n\n    Object.assign(swiper.pagination, {\n      $el,\n      el: $el[0],\n    });\n\n    if (!swiper.enabled) {\n      $el.addClass(params.lockClass);\n    }\n  }\n  function destroy() {\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const $el = swiper.pagination.$el;\n\n    $el.removeClass(params.hiddenClass);\n    $el.removeClass(params.modifierClass + params.type);\n    $el.removeClass(params.modifierClass + swiper.params.direction);\n    if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass)\n      swiper.pagination.bullets.removeClass(params.bulletActiveClass);\n    if (params.clickable) {\n      $el.off('click', classesToSelector(params.bulletClass));\n    }\n  }\n\n  on('init', () => {\n    init();\n    render();\n    update();\n  });\n  on('activeIndexChange', () => {\n    if (swiper.params.loop) {\n      update();\n    } else if (typeof swiper.snapIndex === 'undefined') {\n      update();\n    }\n  });\n  on('snapIndexChange', () => {\n    if (!swiper.params.loop) {\n      update();\n    }\n  });\n  on('slidesLengthChange', () => {\n    if (swiper.params.loop) {\n      render();\n      update();\n    }\n  });\n  on('snapGridLengthChange', () => {\n    if (!swiper.params.loop) {\n      render();\n      update();\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    const { $el } = swiper.pagination;\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);\n    }\n  });\n  on('lock unlock', () => {\n    update();\n  });\n  on('click', (_s, e) => {\n    const targetEl = e.target;\n    const { $el } = swiper.pagination;\n    if (\n      swiper.params.pagination.el &&\n      swiper.params.pagination.hideOnClick &&\n      $el.length > 0 &&\n      !$(targetEl).hasClass(swiper.params.pagination.bulletClass)\n    ) {\n      if (\n        swiper.navigation &&\n        ((swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl) ||\n          (swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl))\n      )\n        return;\n      const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass);\n      if (isHidden === true) {\n        emit('paginationShow');\n      } else {\n        emit('paginationHide');\n      }\n      $el.toggleClass(swiper.params.pagination.hiddenClass);\n    }\n  });\n\n  Object.assign(swiper.pagination, {\n    render,\n    update,\n    init,\n    destroy,\n  });\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Scrollbar({ swiper, extendParams, on, emit }) {\n  const document = getDocument();\n\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\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    },\n  });\n\n  swiper.scrollbar = {\n    el: null,\n    dragEl: null,\n    $el: null,\n    $dragEl: null,\n  };\n\n  function setTranslate() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const { scrollbar, rtlTranslate: rtl, progress } = swiper;\n    const { $dragEl, $el } = scrollbar;\n    const params = swiper.params.scrollbar;\n\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.transform(`translate3d(${newPos}px, 0, 0)`);\n      $dragEl[0].style.width = `${newSize}px`;\n    } else {\n      $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`);\n      $dragEl[0].style.height = `${newSize}px`;\n    }\n    if (params.hide) {\n      clearTimeout(timeout);\n      $el[0].style.opacity = 1;\n      timeout = setTimeout(() => {\n        $el[0].style.opacity = 0;\n        $el.transition(400);\n      }, 1000);\n    }\n  }\n  function setTransition(duration) {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    swiper.scrollbar.$dragEl.transition(duration);\n  }\n  function updateSize() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n\n    const { scrollbar } = swiper;\n    const { $dragEl, $el } = scrollbar;\n\n    $dragEl[0].style.width = '';\n    $dragEl[0].style.height = '';\n    trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n\n    divider =\n      swiper.size /\n      (swiper.virtualSize +\n        swiper.params.slidesOffsetBefore -\n        (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\n    if (swiper.isHorizontal()) {\n      $dragEl[0].style.width = `${dragSize}px`;\n    } else {\n      $dragEl[0].style.height = `${dragSize}px`;\n    }\n\n    if (divider >= 1) {\n      $el[0].style.display = 'none';\n    } else {\n      $el[0].style.display = '';\n    }\n    if (swiper.params.scrollbar.hide) {\n      $el[0].style.opacity = 0;\n    }\n\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](\n        swiper.params.scrollbar.lockClass,\n      );\n    }\n  }\n  function getPointerPosition(e) {\n    if (swiper.isHorizontal()) {\n      return e.type === 'touchstart' || e.type === 'touchmove'\n        ? e.targetTouches[0].clientX\n        : e.clientX;\n    }\n    return e.type === 'touchstart' || e.type === 'touchmove'\n      ? e.targetTouches[0].clientY\n      : e.clientY;\n  }\n  function setDragPosition(e) {\n    const { scrollbar, rtlTranslate: rtl } = swiper;\n    const { $el } = scrollbar;\n\n    let positionRatio;\n    positionRatio =\n      (getPointerPosition(e) -\n        $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] -\n        (dragStartPos !== null ? dragStartPos : dragSize / 2)) /\n      (trackSize - dragSize);\n    positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n    if (rtl) {\n      positionRatio = 1 - positionRatio;\n    }\n\n    const position =\n      swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n\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 { scrollbar, $wrapperEl } = swiper;\n    const { $el, $dragEl } = scrollbar;\n    isTouched = true;\n    dragStartPos =\n      e.target === $dragEl[0] || e.target === $dragEl\n        ? getPointerPosition(e) -\n          e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top']\n        : null;\n    e.preventDefault();\n    e.stopPropagation();\n\n    $wrapperEl.transition(100);\n    $dragEl.transition(100);\n    setDragPosition(e);\n\n    clearTimeout(dragTimeout);\n\n    $el.transition(0);\n    if (params.hide) {\n      $el.css('opacity', 1);\n    }\n    if (swiper.params.cssMode) {\n      swiper.$wrapperEl.css('scroll-snap-type', 'none');\n    }\n    emit('scrollbarDragStart', e);\n  }\n  function onDragMove(e) {\n    const { scrollbar, $wrapperEl } = swiper;\n    const { $el, $dragEl } = scrollbar;\n\n    if (!isTouched) return;\n    if (e.preventDefault) e.preventDefault();\n    else e.returnValue = false;\n    setDragPosition(e);\n    $wrapperEl.transition(0);\n    $el.transition(0);\n    $dragEl.transition(0);\n    emit('scrollbarDragMove', e);\n  }\n  function onDragEnd(e) {\n    const params = swiper.params.scrollbar;\n    const { scrollbar, $wrapperEl } = swiper;\n    const { $el } = scrollbar;\n\n    if (!isTouched) return;\n    isTouched = false;\n    if (swiper.params.cssMode) {\n      swiper.$wrapperEl.css('scroll-snap-type', '');\n      $wrapperEl.transition('');\n    }\n    if (params.hide) {\n      clearTimeout(dragTimeout);\n      dragTimeout = nextTick(() => {\n        $el.css('opacity', 0);\n        $el.transition(400);\n      }, 1000);\n    }\n    emit('scrollbarDragEnd', e);\n    if (params.snapOnRelease) {\n      swiper.slideToClosest();\n    }\n  }\n\n  function events(method) {\n    const { scrollbar, touchEventsTouch, touchEventsDesktop, params, support } = swiper;\n    const $el = scrollbar.$el;\n    const target = $el[0];\n    const activeListener =\n      support.passiveListener && params.passiveListeners\n        ? { passive: false, capture: false }\n        : false;\n    const passiveListener =\n      support.passiveListener && params.passiveListeners\n        ? { passive: true, capture: false }\n        : false;\n    if (!target) return;\n    const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n    if (!support.touch) {\n      target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener);\n      document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener);\n      document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener);\n    } else {\n      target[eventMethod](touchEventsTouch.start, onDragStart, activeListener);\n      target[eventMethod](touchEventsTouch.move, onDragMove, activeListener);\n      target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener);\n    }\n  }\n\n  function enableDraggable() {\n    if (!swiper.params.scrollbar.el) return;\n    events('on');\n  }\n  function disableDraggable() {\n    if (!swiper.params.scrollbar.el) return;\n    events('off');\n  }\n  function init() {\n    const { scrollbar, $el: $swiperEl } = swiper;\n    swiper.params.scrollbar = createElementIfNotDefined(\n      swiper,\n      swiper.originalParams.scrollbar,\n      swiper.params.scrollbar,\n      { el: 'swiper-scrollbar' },\n    );\n    const params = swiper.params.scrollbar;\n    if (!params.el) return;\n\n    let $el = $(params.el);\n    if (\n      swiper.params.uniqueNavElements &&\n      typeof params.el === 'string' &&\n      $el.length > 1 &&\n      $swiperEl.find(params.el).length === 1\n    ) {\n      $el = $swiperEl.find(params.el);\n    }\n\n    let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`);\n    if ($dragEl.length === 0) {\n      $dragEl = $(`<div class=\"${swiper.params.scrollbar.dragClass}\"></div>`);\n      $el.append($dragEl);\n    }\n\n    Object.assign(scrollbar, {\n      $el,\n      el: $el[0],\n      $dragEl,\n      dragEl: $dragEl[0],\n    });\n\n    if (params.draggable) {\n      enableDraggable();\n    }\n\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n    }\n  }\n  function destroy() {\n    disableDraggable();\n  }\n\n  on('init', () => {\n    init();\n    updateSize();\n    setTranslate();\n  });\n  on('update resize observerUpdate lock unlock', () => {\n    updateSize();\n  });\n  on('setTranslate', () => {\n    setTranslate();\n  });\n  on('setTransition', (_s, duration) => {\n    setTransition(duration);\n  });\n  on('enable disable', () => {\n    const { $el } = swiper.scrollbar;\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n\n  Object.assign(swiper.scrollbar, {\n    updateSize,\n    setTranslate,\n    init,\n    destroy,\n  });\n}\n","import $ from '../../shared/dom.js';\n\nexport default function Parallax({ swiper, extendParams, on }) {\n  extendParams({\n    parallax: {\n      enabled: false,\n    },\n  });\n\n  const setTransform = (el, progress) => {\n    const { rtl } = swiper;\n\n    const $el = $(el);\n    const rtlFactor = rtl ? -1 : 1;\n\n    const p = $el.attr('data-swiper-parallax') || '0';\n    let x = $el.attr('data-swiper-parallax-x');\n    let y = $el.attr('data-swiper-parallax-y');\n    const scale = $el.attr('data-swiper-parallax-scale');\n    const opacity = $el.attr('data-swiper-parallax-opacity');\n\n    if (x || y) {\n      x = x || '0';\n      y = y || '0';\n    } else if (swiper.isHorizontal()) {\n      x = p;\n      y = '0';\n    } else {\n      y = p;\n      x = '0';\n    }\n\n    if (x.indexOf('%') >= 0) {\n      x = `${parseInt(x, 10) * progress * rtlFactor}%`;\n    } else {\n      x = `${x * progress * rtlFactor}px`;\n    }\n    if (y.indexOf('%') >= 0) {\n      y = `${parseInt(y, 10) * progress}%`;\n    } else {\n      y = `${y * progress}px`;\n    }\n\n    if (typeof opacity !== 'undefined' && opacity !== null) {\n      const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));\n      $el[0].style.opacity = currentOpacity;\n    }\n    if (typeof scale === 'undefined' || scale === null) {\n      $el.transform(`translate3d(${x}, ${y}, 0px)`);\n    } else {\n      const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));\n      $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`);\n    }\n  };\n\n  const setTranslate = () => {\n    const { $el, slides, progress, snapGrid } = swiper;\n    $el\n      .children(\n        '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n      )\n      .each((el) => {\n        setTransform(el, progress);\n      });\n    slides.each((slideEl, slideIndex) => {\n      let slideProgress = slideEl.progress;\n      if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n        slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);\n      }\n      slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n      $(slideEl)\n        .find(\n          '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n        )\n        .each((el) => {\n          setTransform(el, slideProgress);\n        });\n    });\n  };\n\n  const setTransition = (duration = swiper.params.speed) => {\n    const { $el } = swiper;\n    $el\n      .find(\n        '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n      )\n      .each((parallaxEl) => {\n        const $parallaxEl = $(parallaxEl);\n        let parallaxDuration =\n          parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n        if (duration === 0) parallaxDuration = 0;\n        $parallaxEl.transition(parallaxDuration);\n      });\n  };\n\n  on('beforeInit', () => {\n    if (!swiper.params.parallax.enabled) return;\n    swiper.params.watchSlidesProgress = true;\n    swiper.originalParams.watchSlidesProgress = true;\n  });\n  on('init', () => {\n    if (!swiper.params.parallax.enabled) return;\n    setTranslate();\n  });\n  on('setTranslate', () => {\n    if (!swiper.params.parallax.enabled) return;\n    setTranslate();\n  });\n  on('setTransition', (_swiper, duration) => {\n    if (!swiper.params.parallax.enabled) return;\n    setTransition(duration);\n  });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { getTranslate } from '../../shared/utils.js';\n\nexport default function Zoom({ swiper, extendParams, on, emit }) {\n  const window = getWindow();\n  extendParams({\n    zoom: {\n      enabled: false,\n      maxRatio: 3,\n      minRatio: 1,\n      toggle: true,\n      containerClass: 'swiper-zoom-container',\n      zoomedSlideClass: 'swiper-slide-zoomed',\n    },\n  });\n\n  swiper.zoom = {\n    enabled: false,\n  };\n\n  let currentScale = 1;\n  let isScaling = false;\n  let gesturesEnabled;\n  let fakeGestureTouched;\n  let fakeGestureMoved;\n  const gesture = {\n    $slideEl: undefined,\n    slideWidth: undefined,\n    slideHeight: undefined,\n    $imageEl: undefined,\n    $imageWrapEl: undefined,\n    maxRatio: 3,\n  };\n  const image = {\n    isTouched: undefined,\n    isMoved: undefined,\n    currentX: undefined,\n    currentY: undefined,\n    minX: undefined,\n    minY: undefined,\n    maxX: undefined,\n    maxY: undefined,\n    width: undefined,\n    height: undefined,\n    startX: undefined,\n    startY: undefined,\n    touchesStart: {},\n    touchesCurrent: {},\n  };\n  const velocity = {\n    x: undefined,\n    y: undefined,\n    prevPositionX: undefined,\n    prevPositionY: undefined,\n    prevTime: undefined,\n  };\n\n  let scale = 1;\n  Object.defineProperty(swiper.zoom, 'scale', {\n    get() {\n      return scale;\n    },\n    set(value) {\n      if (scale !== value) {\n        const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined;\n        const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined;\n        emit('zoomChange', value, imageEl, slideEl);\n      }\n      scale = value;\n    },\n  });\n\n  function getDistanceBetweenTouches(e) {\n    if (e.targetTouches.length < 2) return 1;\n    const x1 = e.targetTouches[0].pageX;\n    const y1 = e.targetTouches[0].pageY;\n    const x2 = e.targetTouches[1].pageX;\n    const y2 = e.targetTouches[1].pageY;\n    const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n    return distance;\n  }\n\n  // Events\n  function onGestureStart(e) {\n    const support = swiper.support;\n    const params = swiper.params.zoom;\n    fakeGestureTouched = false;\n    fakeGestureMoved = false;\n    if (!support.gestures) {\n      if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {\n        return;\n      }\n      fakeGestureTouched = true;\n      gesture.scaleStart = getDistanceBetweenTouches(e);\n    }\n    if (!gesture.$slideEl || !gesture.$slideEl.length) {\n      gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n      if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n      gesture.$imageEl = gesture.$slideEl\n        .find(`.${params.containerClass}`)\n        .eq(0)\n        .find('img, svg, canvas, picture, .swiper-zoom-target');\n      gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n      gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n      if (gesture.$imageWrapEl.length === 0) {\n        gesture.$imageEl = undefined;\n        return;\n      }\n    }\n    if (gesture.$imageEl) {\n      gesture.$imageEl.transition(0);\n    }\n    isScaling = true;\n  }\n  function onGestureChange(e) {\n    const support = swiper.support;\n    const params = swiper.params.zoom;\n    const zoom = swiper.zoom;\n    if (!support.gestures) {\n      if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {\n        return;\n      }\n      fakeGestureMoved = true;\n      gesture.scaleMove = getDistanceBetweenTouches(e);\n    }\n\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0) {\n      if (e.type === 'gesturechange') onGestureStart(e);\n      return;\n    }\n    if (support.gestures) {\n      zoom.scale = e.scale * currentScale;\n    } else {\n      zoom.scale = (gesture.scaleMove / gesture.scaleStart) * currentScale;\n    }\n    if (zoom.scale > gesture.maxRatio) {\n      zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;\n    }\n    if (zoom.scale < params.minRatio) {\n      zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;\n    }\n    gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n  }\n  function onGestureEnd(e) {\n    const device = swiper.device;\n    const support = swiper.support;\n    const params = swiper.params.zoom;\n    const zoom = swiper.zoom;\n    if (!support.gestures) {\n      if (!fakeGestureTouched || !fakeGestureMoved) {\n        return;\n      }\n      if (\n        e.type !== 'touchend' ||\n        (e.type === 'touchend' && e.changedTouches.length < 2 && !device.android)\n      ) {\n        return;\n      }\n      fakeGestureTouched = false;\n      fakeGestureMoved = false;\n    }\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n    zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n    gesture.$imageEl\n      .transition(swiper.params.speed)\n      .transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n    currentScale = zoom.scale;\n    isScaling = false;\n    if (zoom.scale === 1) gesture.$slideEl = undefined;\n  }\n  function onTouchStart(e) {\n    const device = swiper.device;\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n    if (image.isTouched) return;\n    if (device.android && e.cancelable) e.preventDefault();\n    image.isTouched = true;\n    image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n    image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n  }\n  function onTouchMove(e) {\n    const zoom = swiper.zoom;\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n    swiper.allowClick = false;\n    if (!image.isTouched || !gesture.$slideEl) return;\n\n    if (!image.isMoved) {\n      image.width = gesture.$imageEl[0].offsetWidth;\n      image.height = gesture.$imageEl[0].offsetHeight;\n      image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0;\n      image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0;\n      gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n      gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n      gesture.$imageWrapEl.transition(0);\n    }\n    // Define if we need image drag\n    const scaledWidth = image.width * zoom.scale;\n    const scaledHeight = image.height * zoom.scale;\n\n    if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;\n\n    image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n    image.maxX = -image.minX;\n    image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n    image.maxY = -image.minY;\n\n    image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n    image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n    if (!image.isMoved && !isScaling) {\n      if (\n        swiper.isHorizontal() &&\n        ((Math.floor(image.minX) === Math.floor(image.startX) &&\n          image.touchesCurrent.x < image.touchesStart.x) ||\n          (Math.floor(image.maxX) === Math.floor(image.startX) &&\n            image.touchesCurrent.x > image.touchesStart.x))\n      ) {\n        image.isTouched = false;\n        return;\n      }\n      if (\n        !swiper.isHorizontal() &&\n        ((Math.floor(image.minY) === Math.floor(image.startY) &&\n          image.touchesCurrent.y < image.touchesStart.y) ||\n          (Math.floor(image.maxY) === Math.floor(image.startY) &&\n            image.touchesCurrent.y > image.touchesStart.y))\n      ) {\n        image.isTouched = false;\n        return;\n      }\n    }\n    if (e.cancelable) {\n      e.preventDefault();\n    }\n    e.stopPropagation();\n\n    image.isMoved = true;\n    image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX;\n    image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY;\n\n    if (image.currentX < image.minX) {\n      image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;\n    }\n    if (image.currentX > image.maxX) {\n      image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;\n    }\n\n    if (image.currentY < image.minY) {\n      image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;\n    }\n    if (image.currentY > image.maxY) {\n      image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;\n    }\n\n    // Velocity\n    if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;\n    if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;\n    if (!velocity.prevTime) velocity.prevTime = Date.now();\n    velocity.x =\n      (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n    velocity.y =\n      (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n    if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;\n    if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;\n    velocity.prevPositionX = image.touchesCurrent.x;\n    velocity.prevPositionY = image.touchesCurrent.y;\n    velocity.prevTime = Date.now();\n\n    gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n  }\n  function onTouchEnd() {\n    const zoom = swiper.zoom;\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n    if (!image.isTouched || !image.isMoved) {\n      image.isTouched = false;\n      image.isMoved = false;\n      return;\n    }\n    image.isTouched = false;\n    image.isMoved = false;\n    let momentumDurationX = 300;\n    let momentumDurationY = 300;\n    const momentumDistanceX = velocity.x * momentumDurationX;\n    const newPositionX = image.currentX + momentumDistanceX;\n    const momentumDistanceY = velocity.y * momentumDurationY;\n    const newPositionY = image.currentY + momentumDistanceY;\n\n    // Fix duration\n    if (velocity.x !== 0)\n      momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);\n    if (velocity.y !== 0)\n      momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);\n    const momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n    image.currentX = newPositionX;\n    image.currentY = newPositionY;\n\n    // Define if we need image drag\n    const scaledWidth = image.width * zoom.scale;\n    const scaledHeight = image.height * zoom.scale;\n    image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n    image.maxX = -image.minX;\n    image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n    image.maxY = -image.minY;\n    image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n    image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n    gesture.$imageWrapEl\n      .transition(momentumDuration)\n      .transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n  }\n  function onTransitionEnd() {\n    const zoom = swiper.zoom;\n    if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n      if (gesture.$imageEl) {\n        gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n      }\n      if (gesture.$imageWrapEl) {\n        gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n      }\n\n      zoom.scale = 1;\n      currentScale = 1;\n\n      gesture.$slideEl = undefined;\n      gesture.$imageEl = undefined;\n      gesture.$imageWrapEl = undefined;\n    }\n  }\n\n  function zoomIn(e) {\n    const zoom = swiper.zoom;\n    const params = swiper.params.zoom;\n\n    if (!gesture.$slideEl) {\n      if (e && e.target) {\n        gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n      }\n      if (!gesture.$slideEl) {\n        if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n          gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n        } else {\n          gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n        }\n      }\n\n      gesture.$imageEl = gesture.$slideEl\n        .find(`.${params.containerClass}`)\n        .eq(0)\n        .find('img, svg, canvas, picture, .swiper-zoom-target');\n      gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n    }\n    if (\n      !gesture.$imageEl ||\n      gesture.$imageEl.length === 0 ||\n      !gesture.$imageWrapEl ||\n      gesture.$imageWrapEl.length === 0\n    )\n      return;\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style.overflow = 'hidden';\n      swiper.wrapperEl.style.touchAction = 'none';\n    }\n\n    gesture.$slideEl.addClass(`${params.zoomedSlideClass}`);\n\n    let touchX;\n    let touchY;\n    let offsetX;\n    let offsetY;\n    let diffX;\n    let diffY;\n    let translateX;\n    let translateY;\n    let imageWidth;\n    let imageHeight;\n    let scaledWidth;\n    let scaledHeight;\n    let translateMinX;\n    let translateMinY;\n    let translateMaxX;\n    let translateMaxY;\n    let slideWidth;\n    let slideHeight;\n\n    if (typeof image.touchesStart.x === 'undefined' && e) {\n      touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n      touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n    } else {\n      touchX = image.touchesStart.x;\n      touchY = image.touchesStart.y;\n    }\n\n    zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n    currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n    if (e) {\n      slideWidth = gesture.$slideEl[0].offsetWidth;\n      slideHeight = gesture.$slideEl[0].offsetHeight;\n      offsetX = gesture.$slideEl.offset().left + window.scrollX;\n      offsetY = gesture.$slideEl.offset().top + window.scrollY;\n      diffX = offsetX + slideWidth / 2 - touchX;\n      diffY = offsetY + slideHeight / 2 - touchY;\n\n      imageWidth = gesture.$imageEl[0].offsetWidth;\n      imageHeight = gesture.$imageEl[0].offsetHeight;\n      scaledWidth = imageWidth * zoom.scale;\n      scaledHeight = imageHeight * zoom.scale;\n\n      translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n      translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n      translateMaxX = -translateMinX;\n      translateMaxY = -translateMinY;\n\n      translateX = diffX * zoom.scale;\n      translateY = diffY * zoom.scale;\n\n      if (translateX < translateMinX) {\n        translateX = translateMinX;\n      }\n      if (translateX > translateMaxX) {\n        translateX = translateMaxX;\n      }\n\n      if (translateY < translateMinY) {\n        translateY = translateMinY;\n      }\n      if (translateY > translateMaxY) {\n        translateY = translateMaxY;\n      }\n    } else {\n      translateX = 0;\n      translateY = 0;\n    }\n    gesture.$imageWrapEl\n      .transition(300)\n      .transform(`translate3d(${translateX}px, ${translateY}px,0)`);\n    gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n  }\n  function zoomOut() {\n    const zoom = swiper.zoom;\n    const params = swiper.params.zoom;\n\n    if (!gesture.$slideEl) {\n      if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n        gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n      } else {\n        gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n      }\n      gesture.$imageEl = gesture.$slideEl\n        .find(`.${params.containerClass}`)\n        .eq(0)\n        .find('img, svg, canvas, picture, .swiper-zoom-target');\n      gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n    }\n    if (\n      !gesture.$imageEl ||\n      gesture.$imageEl.length === 0 ||\n      !gesture.$imageWrapEl ||\n      gesture.$imageWrapEl.length === 0\n    )\n      return;\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style.overflow = '';\n      swiper.wrapperEl.style.touchAction = '';\n    }\n    zoom.scale = 1;\n    currentScale = 1;\n    gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n    gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n    gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`);\n    gesture.$slideEl = undefined;\n  }\n\n  // Toggle Zoom\n  function zoomToggle(e) {\n    const zoom = swiper.zoom;\n\n    if (zoom.scale && zoom.scale !== 1) {\n      // Zoom Out\n      zoomOut();\n    } else {\n      // Zoom In\n      zoomIn(e);\n    }\n  }\n\n  function getListeners() {\n    const support = swiper.support;\n    const passiveListener =\n      swiper.touchEvents.start === 'touchstart' &&\n      support.passiveListener &&\n      swiper.params.passiveListeners\n        ? { passive: true, capture: false }\n        : false;\n    const activeListenerWithCapture = support.passiveListener\n      ? { passive: false, capture: true }\n      : true;\n    return { passiveListener, activeListenerWithCapture };\n  }\n\n  function getSlideSelector() {\n    return `.${swiper.params.slideClass}`;\n  }\n\n  function toggleGestures(method) {\n    const { passiveListener } = getListeners();\n    const slideSelector = getSlideSelector();\n    swiper.$wrapperEl[method]('gesturestart', slideSelector, onGestureStart, passiveListener);\n    swiper.$wrapperEl[method]('gesturechange', slideSelector, onGestureChange, passiveListener);\n    swiper.$wrapperEl[method]('gestureend', slideSelector, onGestureEnd, passiveListener);\n  }\n  function enableGestures() {\n    if (gesturesEnabled) return;\n    gesturesEnabled = true;\n    toggleGestures('on');\n  }\n  function disableGestures() {\n    if (!gesturesEnabled) return;\n    gesturesEnabled = false;\n    toggleGestures('off');\n  }\n\n  // Attach/Detach Events\n  function enable() {\n    const zoom = swiper.zoom;\n    if (zoom.enabled) return;\n    zoom.enabled = true;\n    const support = swiper.support;\n    const { passiveListener, activeListenerWithCapture } = getListeners();\n    const slideSelector = getSlideSelector();\n\n    // Scale image\n    if (support.gestures) {\n      swiper.$wrapperEl.on(swiper.touchEvents.start, enableGestures, passiveListener);\n      swiper.$wrapperEl.on(swiper.touchEvents.end, disableGestures, passiveListener);\n    } else if (swiper.touchEvents.start === 'touchstart') {\n      swiper.$wrapperEl.on(\n        swiper.touchEvents.start,\n        slideSelector,\n        onGestureStart,\n        passiveListener,\n      );\n      swiper.$wrapperEl.on(\n        swiper.touchEvents.move,\n        slideSelector,\n        onGestureChange,\n        activeListenerWithCapture,\n      );\n      swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n      if (swiper.touchEvents.cancel) {\n        swiper.$wrapperEl.on(\n          swiper.touchEvents.cancel,\n          slideSelector,\n          onGestureEnd,\n          passiveListener,\n        );\n      }\n    }\n\n    // Move image\n    swiper.$wrapperEl.on(\n      swiper.touchEvents.move,\n      `.${swiper.params.zoom.containerClass}`,\n      onTouchMove,\n      activeListenerWithCapture,\n    );\n  }\n  function disable() {\n    const zoom = swiper.zoom;\n    if (!zoom.enabled) return;\n    const support = swiper.support;\n    zoom.enabled = false;\n\n    const { passiveListener, activeListenerWithCapture } = getListeners();\n    const slideSelector = getSlideSelector();\n\n    // Scale image\n    if (support.gestures) {\n      swiper.$wrapperEl.off(swiper.touchEvents.start, enableGestures, passiveListener);\n      swiper.$wrapperEl.off(swiper.touchEvents.end, disableGestures, passiveListener);\n    } else if (swiper.touchEvents.start === 'touchstart') {\n      swiper.$wrapperEl.off(\n        swiper.touchEvents.start,\n        slideSelector,\n        onGestureStart,\n        passiveListener,\n      );\n      swiper.$wrapperEl.off(\n        swiper.touchEvents.move,\n        slideSelector,\n        onGestureChange,\n        activeListenerWithCapture,\n      );\n      swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n      if (swiper.touchEvents.cancel) {\n        swiper.$wrapperEl.off(\n          swiper.touchEvents.cancel,\n          slideSelector,\n          onGestureEnd,\n          passiveListener,\n        );\n      }\n    }\n\n    // Move image\n    swiper.$wrapperEl.off(\n      swiper.touchEvents.move,\n      `.${swiper.params.zoom.containerClass}`,\n      onTouchMove,\n      activeListenerWithCapture,\n    );\n  }\n\n  on('init', () => {\n    if (swiper.params.zoom.enabled) {\n      enable();\n    }\n  });\n  on('destroy', () => {\n    disable();\n  });\n  on('touchStart', (_s, e) => {\n    if (!swiper.zoom.enabled) return;\n    onTouchStart(e);\n  });\n  on('touchEnd', (_s, e) => {\n    if (!swiper.zoom.enabled) return;\n    onTouchEnd(e);\n  });\n  on('doubleTap', (_s, e) => {\n    if (\n      !swiper.animating &&\n      swiper.params.zoom.enabled &&\n      swiper.zoom.enabled &&\n      swiper.params.zoom.toggle\n    ) {\n      zoomToggle(e);\n    }\n  });\n  on('transitionEnd', () => {\n    if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n      onTransitionEnd();\n    }\n  });\n  on('slideChange', () => {\n    if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {\n      onTransitionEnd();\n    }\n  });\n\n  Object.assign(swiper.zoom, {\n    enable,\n    disable,\n    in: zoomIn,\n    out: zoomOut,\n    toggle: zoomToggle,\n  });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Lazy({ swiper, extendParams, on, emit }) {\n  extendParams({\n    lazy: {\n      checkInView: false,\n      enabled: false,\n      loadPrevNext: false,\n      loadPrevNextAmount: 1,\n      loadOnTransitionStart: false,\n      scrollingElement: '',\n\n      elementClass: 'swiper-lazy',\n      loadingClass: 'swiper-lazy-loading',\n      loadedClass: 'swiper-lazy-loaded',\n      preloaderClass: 'swiper-lazy-preloader',\n    },\n  });\n\n  swiper.lazy = {};\n\n  let scrollHandlerAttached = false;\n  let initialImageLoaded = false;\n\n  function loadInSlide(index, loadInDuplicate = true) {\n    const params = swiper.params.lazy;\n    if (typeof index === 'undefined') return;\n    if (swiper.slides.length === 0) return;\n    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n    const $slideEl = isVirtual\n      ? swiper.$wrapperEl.children(\n          `.${swiper.params.slideClass}[data-swiper-slide-index=\"${index}\"]`,\n        )\n      : swiper.slides.eq(index);\n\n    const $images = $slideEl.find(\n      `.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`,\n    );\n    if (\n      $slideEl.hasClass(params.elementClass) &&\n      !$slideEl.hasClass(params.loadedClass) &&\n      !$slideEl.hasClass(params.loadingClass)\n    ) {\n      $images.push($slideEl[0]);\n    }\n    if ($images.length === 0) return;\n\n    $images.each((imageEl) => {\n      const $imageEl = $(imageEl);\n      $imageEl.addClass(params.loadingClass);\n\n      const background = $imageEl.attr('data-background');\n      const src = $imageEl.attr('data-src');\n      const srcset = $imageEl.attr('data-srcset');\n      const sizes = $imageEl.attr('data-sizes');\n      const $pictureEl = $imageEl.parent('picture');\n\n      swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, () => {\n        if (\n          typeof swiper === 'undefined' ||\n          swiper === null ||\n          !swiper ||\n          (swiper && !swiper.params) ||\n          swiper.destroyed\n        )\n          return;\n        if (background) {\n          $imageEl.css('background-image', `url(\"${background}\")`);\n          $imageEl.removeAttr('data-background');\n        } else {\n          if (srcset) {\n            $imageEl.attr('srcset', srcset);\n            $imageEl.removeAttr('data-srcset');\n          }\n          if (sizes) {\n            $imageEl.attr('sizes', sizes);\n            $imageEl.removeAttr('data-sizes');\n          }\n          if ($pictureEl.length) {\n            $pictureEl.children('source').each((sourceEl) => {\n              const $source = $(sourceEl);\n\n              if ($source.attr('data-srcset')) {\n                $source.attr('srcset', $source.attr('data-srcset'));\n                $source.removeAttr('data-srcset');\n              }\n            });\n          }\n          if (src) {\n            $imageEl.attr('src', src);\n            $imageEl.removeAttr('data-src');\n          }\n        }\n\n        $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n        $slideEl.find(`.${params.preloaderClass}`).remove();\n        if (swiper.params.loop && loadInDuplicate) {\n          const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n          if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n            const originalSlide = swiper.$wrapperEl.children(\n              `[data-swiper-slide-index=\"${slideOriginalIndex}\"]:not(.${swiper.params.slideDuplicateClass})`,\n            );\n            loadInSlide(originalSlide.index(), false);\n          } else {\n            const duplicatedSlide = swiper.$wrapperEl.children(\n              `.${swiper.params.slideDuplicateClass}[data-swiper-slide-index=\"${slideOriginalIndex}\"]`,\n            );\n            loadInSlide(duplicatedSlide.index(), false);\n          }\n        }\n        emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n        if (swiper.params.autoHeight) {\n          swiper.updateAutoHeight();\n        }\n      });\n\n      emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n    });\n  }\n\n  function load() {\n    const { $wrapperEl, params: swiperParams, slides, activeIndex } = swiper;\n    const isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n    const params = swiperParams.lazy;\n\n    let slidesPerView = swiperParams.slidesPerView;\n    if (slidesPerView === 'auto') {\n      slidesPerView = 0;\n    }\n\n    function slideExist(index) {\n      if (isVirtual) {\n        if (\n          $wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index=\"${index}\"]`)\n            .length\n        ) {\n          return true;\n        }\n      } else if (slides[index]) return true;\n      return false;\n    }\n\n    function slideIndex(slideEl) {\n      if (isVirtual) {\n        return $(slideEl).attr('data-swiper-slide-index');\n      }\n      return $(slideEl).index();\n    }\n\n    if (!initialImageLoaded) initialImageLoaded = true;\n    if (swiper.params.watchSlidesProgress) {\n      $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each((slideEl) => {\n        const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();\n        loadInSlide(index);\n      });\n    } else if (slidesPerView > 1) {\n      for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n        if (slideExist(i)) loadInSlide(i);\n      }\n    } else {\n      loadInSlide(activeIndex);\n    }\n    if (params.loadPrevNext) {\n      if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {\n        const amount = params.loadPrevNextAmount;\n        const spv = slidesPerView;\n        const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n        const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);\n        // Next Slides\n        for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) {\n          if (slideExist(i)) loadInSlide(i);\n        }\n        // Prev Slides\n        for (let i = minIndex; i < activeIndex; i += 1) {\n          if (slideExist(i)) loadInSlide(i);\n        }\n      } else {\n        const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`);\n        if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide));\n\n        const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`);\n        if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide));\n      }\n    }\n  }\n  function checkInViewOnLoad() {\n    const window = getWindow();\n    if (!swiper || swiper.destroyed) return;\n    const $scrollElement = swiper.params.lazy.scrollingElement\n      ? $(swiper.params.lazy.scrollingElement)\n      : $(window);\n    const isWindow = $scrollElement[0] === window;\n    const scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth;\n    const scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight;\n    const swiperOffset = swiper.$el.offset();\n    const { rtlTranslate: rtl } = swiper;\n\n    let inView = false;\n\n    if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n    const swiperCoord = [\n      [swiperOffset.left, swiperOffset.top],\n      [swiperOffset.left + swiper.width, swiperOffset.top],\n      [swiperOffset.left, swiperOffset.top + swiper.height],\n      [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height],\n    ];\n    for (let i = 0; i < swiperCoord.length; i += 1) {\n      const point = swiperCoord[i];\n      if (\n        point[0] >= 0 &&\n        point[0] <= scrollElementWidth &&\n        point[1] >= 0 &&\n        point[1] <= scrollElementHeight\n      ) {\n        if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n        inView = true;\n      }\n    }\n\n    const passiveListener =\n      swiper.touchEvents.start === 'touchstart' &&\n      swiper.support.passiveListener &&\n      swiper.params.passiveListeners\n        ? { passive: true, capture: false }\n        : false;\n\n    if (inView) {\n      load();\n      $scrollElement.off('scroll', checkInViewOnLoad, passiveListener);\n    } else if (!scrollHandlerAttached) {\n      scrollHandlerAttached = true;\n      $scrollElement.on('scroll', checkInViewOnLoad, passiveListener);\n    }\n  }\n\n  on('beforeInit', () => {\n    if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n      swiper.params.preloadImages = false;\n    }\n  });\n  on('init', () => {\n    if (swiper.params.lazy.enabled) {\n      if (swiper.params.lazy.checkInView) {\n        checkInViewOnLoad();\n      } else {\n        load();\n      }\n    }\n  });\n  on('scroll', () => {\n    if (\n      swiper.params.freeMode &&\n      swiper.params.freeMode.enabled &&\n      !swiper.params.freeMode.sticky\n    ) {\n      load();\n    }\n  });\n  on('scrollbarDragMove resize _freeModeNoMomentumRelease', () => {\n    if (swiper.params.lazy.enabled) {\n      if (swiper.params.lazy.checkInView) {\n        checkInViewOnLoad();\n      } else {\n        load();\n      }\n    }\n  });\n  on('transitionStart', () => {\n    if (swiper.params.lazy.enabled) {\n      if (\n        swiper.params.lazy.loadOnTransitionStart ||\n        (!swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded)\n      ) {\n        if (swiper.params.lazy.checkInView) {\n          checkInViewOnLoad();\n        } else {\n          load();\n        }\n      }\n    }\n  });\n  on('transitionEnd', () => {\n    if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n      if (swiper.params.lazy.checkInView) {\n        checkInViewOnLoad();\n      } else {\n        load();\n      }\n    }\n  });\n  on('slideChange', () => {\n    const { lazy, cssMode, watchSlidesProgress, touchReleaseOnEdges, resistanceRatio } =\n      swiper.params;\n    if (\n      lazy.enabled &&\n      (cssMode || (watchSlidesProgress && (touchReleaseOnEdges || resistanceRatio === 0)))\n    ) {\n      load();\n    }\n  });\n\n  Object.assign(swiper.lazy, {\n    load,\n    loadInSlide,\n  });\n}\n","/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Controller({ swiper, extendParams, on }) {\n  extendParams({\n    controller: {\n      control: undefined,\n      inverse: false,\n      by: 'slide', // or 'container'\n    },\n  });\n\n  swiper.controller = {\n    control: undefined,\n  };\n\n  function LinearSpline(x, y) {\n    const binarySearch = (function search() {\n      let maxIndex;\n      let minIndex;\n      let guess;\n      return (array, val) => {\n        minIndex = -1;\n        maxIndex = array.length;\n        while (maxIndex - minIndex > 1) {\n          guess = (maxIndex + minIndex) >> 1;\n          if (array[guess] <= val) {\n            minIndex = guess;\n          } else {\n            maxIndex = guess;\n          }\n        }\n        return maxIndex;\n      };\n    })();\n    this.x = x;\n    this.y = y;\n    this.lastIndex = x.length - 1;\n    // Given an x value (x2), return the expected y2 value:\n    // (x1,y1) is the known point before given value,\n    // (x3,y3) is the known point after given value.\n    let i1;\n    let i3;\n\n    this.interpolate = function interpolate(x2) {\n      if (!x2) return 0;\n\n      // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n      i3 = binarySearch(this.x, x2);\n      i1 = i3 - 1;\n\n      // We have our indexes i1 & i3, so we can calculate already:\n      // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n      return (\n        ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1]\n      );\n    };\n    return this;\n  }\n  // xxx: for now i will just save one spline function to to\n  function getInterpolateFunction(c) {\n    if (!swiper.controller.spline) {\n      swiper.controller.spline = swiper.params.loop\n        ? new LinearSpline(swiper.slidesGrid, c.slidesGrid)\n        : new LinearSpline(swiper.snapGrid, c.snapGrid);\n    }\n  }\n  function setTranslate(_t, byController) {\n    const controlled = swiper.controller.control;\n    let multiplier;\n    let controlledTranslate;\n    const Swiper = swiper.constructor;\n    function setControlledTranslate(c) {\n      // this will create an Interpolate function based on the snapGrids\n      // x is the Grid of the scrolled scroller and y will be the controlled scroller\n      // it makes sense to create this only once and recall it for the interpolation\n      // the function does a lot of value caching for performance\n      const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n      if (swiper.params.controller.by === 'slide') {\n        getInterpolateFunction(c);\n        // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n        // but it did not work out\n        controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n      }\n\n      if (!controlledTranslate || swiper.params.controller.by === 'container') {\n        multiplier =\n          (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n        controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();\n      }\n\n      if (swiper.params.controller.inverse) {\n        controlledTranslate = c.maxTranslate() - controlledTranslate;\n      }\n      c.updateProgress(controlledTranslate);\n      c.setTranslate(controlledTranslate, swiper);\n      c.updateActiveIndex();\n      c.updateSlidesClasses();\n    }\n    if (Array.isArray(controlled)) {\n      for (let i = 0; i < controlled.length; i += 1) {\n        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n          setControlledTranslate(controlled[i]);\n        }\n      }\n    } else if (controlled instanceof Swiper && byController !== controlled) {\n      setControlledTranslate(controlled);\n    }\n  }\n  function setTransition(duration, byController) {\n    const Swiper = swiper.constructor;\n    const controlled = swiper.controller.control;\n    let i;\n    function setControlledTransition(c) {\n      c.setTransition(duration, swiper);\n      if (duration !== 0) {\n        c.transitionStart();\n        if (c.params.autoHeight) {\n          nextTick(() => {\n            c.updateAutoHeight();\n          });\n        }\n        c.$wrapperEl.transitionEnd(() => {\n          if (!controlled) return;\n          if (c.params.loop && swiper.params.controller.by === 'slide') {\n            c.loopFix();\n          }\n          c.transitionEnd();\n        });\n      }\n    }\n    if (Array.isArray(controlled)) {\n      for (i = 0; i < controlled.length; i += 1) {\n        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n          setControlledTransition(controlled[i]);\n        }\n      }\n    } else if (controlled instanceof Swiper && byController !== controlled) {\n      setControlledTransition(controlled);\n    }\n  }\n\n  function removeSpline() {\n    if (!swiper.controller.control) return;\n    if (swiper.controller.spline) {\n      swiper.controller.spline = undefined;\n      delete swiper.controller.spline;\n    }\n  }\n  on('beforeInit', () => {\n    swiper.controller.control = swiper.params.controller.control;\n  });\n  on('update', () => {\n    removeSpline();\n  });\n  on('resize', () => {\n    removeSpline();\n  });\n  on('observerUpdate', () => {\n    removeSpline();\n  });\n  on('setTranslate', (_s, translate, byController) => {\n    if (!swiper.controller.control) return;\n    swiper.controller.setTranslate(translate, byController);\n  });\n  on('setTransition', (_s, duration, byController) => {\n    if (!swiper.controller.control) return;\n    swiper.controller.setTransition(duration, byController);\n  });\n\n  Object.assign(swiper.controller, {\n    setTranslate,\n    setTransition,\n  });\n}\n","import classesToSelector from '../../shared/classes-to-selector.js';\nimport $ from '../../shared/dom.js';\n\nexport default function A11y({ swiper, extendParams, on }) {\n  extendParams({\n    a11y: {\n      enabled: true,\n      notificationClass: 'swiper-notification',\n      prevSlideMessage: 'Previous slide',\n      nextSlideMessage: 'Next slide',\n      firstSlideMessage: 'This is the first slide',\n      lastSlideMessage: 'This is the last slide',\n      paginationBulletMessage: 'Go to slide {{index}}',\n      slideLabelMessage: '{{index}} / {{slidesLength}}',\n      containerMessage: null,\n      containerRoleDescriptionMessage: null,\n      itemRoleDescriptionMessage: null,\n      slideRole: 'group',\n    },\n  });\n\n  let liveRegion = null;\n\n  function notify(message) {\n    const notification = liveRegion;\n    if (notification.length === 0) return;\n    notification.html('');\n    notification.html(message);\n  }\n\n  function getRandomNumber(size = 16) {\n    const randomChar = () => Math.round(16 * Math.random()).toString(16);\n    return 'x'.repeat(size).replace(/x/g, randomChar);\n  }\n  function makeElFocusable($el) {\n    $el.attr('tabIndex', '0');\n  }\n  function makeElNotFocusable($el) {\n    $el.attr('tabIndex', '-1');\n  }\n  function addElRole($el, role) {\n    $el.attr('role', role);\n  }\n  function addElRoleDescription($el, description) {\n    $el.attr('aria-roledescription', description);\n  }\n  function addElControls($el, controls) {\n    $el.attr('aria-controls', controls);\n  }\n  function addElLabel($el, label) {\n    $el.attr('aria-label', label);\n  }\n  function addElId($el, id) {\n    $el.attr('id', id);\n  }\n  function addElLive($el, live) {\n    $el.attr('aria-live', live);\n  }\n  function disableEl($el) {\n    $el.attr('aria-disabled', true);\n  }\n  function enableEl($el) {\n    $el.attr('aria-disabled', false);\n  }\n\n  function onEnterOrSpaceKey(e) {\n    if (e.keyCode !== 13 && e.keyCode !== 32) return;\n    const params = swiper.params.a11y;\n    const $targetEl = $(e.target);\n    if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n      if (!(swiper.isEnd && !swiper.params.loop)) {\n        swiper.slideNext();\n      }\n      if (swiper.isEnd) {\n        notify(params.lastSlideMessage);\n      } else {\n        notify(params.nextSlideMessage);\n      }\n    }\n    if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n      if (!(swiper.isBeginning && !swiper.params.loop)) {\n        swiper.slidePrev();\n      }\n      if (swiper.isBeginning) {\n        notify(params.firstSlideMessage);\n      } else {\n        notify(params.prevSlideMessage);\n      }\n    }\n\n    if (\n      swiper.pagination &&\n      $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))\n    ) {\n      $targetEl[0].click();\n    }\n  }\n\n  function updateNavigation() {\n    if (swiper.params.loop || !swiper.navigation) return;\n    const { $nextEl, $prevEl } = swiper.navigation;\n\n    if ($prevEl && $prevEl.length > 0) {\n      if (swiper.isBeginning) {\n        disableEl($prevEl);\n        makeElNotFocusable($prevEl);\n      } else {\n        enableEl($prevEl);\n        makeElFocusable($prevEl);\n      }\n    }\n    if ($nextEl && $nextEl.length > 0) {\n      if (swiper.isEnd) {\n        disableEl($nextEl);\n        makeElNotFocusable($nextEl);\n      } else {\n        enableEl($nextEl);\n        makeElFocusable($nextEl);\n      }\n    }\n  }\n\n  function hasPagination() {\n    return (\n      swiper.pagination &&\n      swiper.params.pagination.clickable &&\n      swiper.pagination.bullets &&\n      swiper.pagination.bullets.length\n    );\n  }\n\n  function updatePagination() {\n    const params = swiper.params.a11y;\n    if (hasPagination()) {\n      swiper.pagination.bullets.each((bulletEl) => {\n        const $bulletEl = $(bulletEl);\n        makeElFocusable($bulletEl);\n        if (!swiper.params.pagination.renderBullet) {\n          addElRole($bulletEl, 'button');\n          addElLabel(\n            $bulletEl,\n            params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, $bulletEl.index() + 1),\n          );\n        }\n      });\n    }\n  }\n\n  const initNavEl = ($el, wrapperId, message) => {\n    makeElFocusable($el);\n    if ($el[0].tagName !== 'BUTTON') {\n      addElRole($el, 'button');\n      $el.on('keydown', onEnterOrSpaceKey);\n    }\n    addElLabel($el, message);\n    addElControls($el, wrapperId);\n  };\n\n  function init() {\n    const params = swiper.params.a11y;\n\n    swiper.$el.append(liveRegion);\n\n    // Container\n    const $containerEl = swiper.$el;\n    if (params.containerRoleDescriptionMessage) {\n      addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);\n    }\n    if (params.containerMessage) {\n      addElLabel($containerEl, params.containerMessage);\n    }\n\n    // Wrapper\n    const $wrapperEl = swiper.$wrapperEl;\n    const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n    const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n    addElId($wrapperEl, wrapperId);\n    addElLive($wrapperEl, live);\n\n    // Slide\n    if (params.itemRoleDescriptionMessage) {\n      addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage);\n    }\n    addElRole($(swiper.slides), params.slideRole);\n\n    const slidesLength = swiper.params.loop\n      ? swiper.slides.filter((el) => !el.classList.contains(swiper.params.slideDuplicateClass))\n          .length\n      : swiper.slides.length;\n    swiper.slides.each((slideEl, index) => {\n      const $slideEl = $(slideEl);\n      const slideIndex = swiper.params.loop\n        ? parseInt($slideEl.attr('data-swiper-slide-index'), 10)\n        : index;\n      const ariaLabelMessage = params.slideLabelMessage\n        .replace(/\\{\\{index\\}\\}/, slideIndex + 1)\n        .replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n      addElLabel($slideEl, ariaLabelMessage);\n    });\n\n    // Navigation\n    let $nextEl;\n    let $prevEl;\n    if (swiper.navigation && swiper.navigation.$nextEl) {\n      $nextEl = swiper.navigation.$nextEl;\n    }\n    if (swiper.navigation && swiper.navigation.$prevEl) {\n      $prevEl = swiper.navigation.$prevEl;\n    }\n\n    if ($nextEl && $nextEl.length) {\n      initNavEl($nextEl, wrapperId, params.nextSlideMessage);\n    }\n    if ($prevEl && $prevEl.length) {\n      initNavEl($prevEl, wrapperId, params.prevSlideMessage);\n    }\n\n    // Pagination\n    if (hasPagination()) {\n      swiper.pagination.$el.on(\n        'keydown',\n        classesToSelector(swiper.params.pagination.bulletClass),\n        onEnterOrSpaceKey,\n      );\n    }\n  }\n  function destroy() {\n    if (liveRegion && liveRegion.length > 0) liveRegion.remove();\n\n    let $nextEl;\n    let $prevEl;\n    if (swiper.navigation && swiper.navigation.$nextEl) {\n      $nextEl = swiper.navigation.$nextEl;\n    }\n    if (swiper.navigation && swiper.navigation.$prevEl) {\n      $prevEl = swiper.navigation.$prevEl;\n    }\n    if ($nextEl) {\n      $nextEl.off('keydown', onEnterOrSpaceKey);\n    }\n    if ($prevEl) {\n      $prevEl.off('keydown', onEnterOrSpaceKey);\n    }\n\n    // Pagination\n    if (hasPagination()) {\n      swiper.pagination.$el.off(\n        'keydown',\n        classesToSelector(swiper.params.pagination.bulletClass),\n        onEnterOrSpaceKey,\n      );\n    }\n  }\n\n  on('beforeInit', () => {\n    liveRegion = $(\n      `<span class=\"${swiper.params.a11y.notificationClass}\" aria-live=\"assertive\" aria-atomic=\"true\"></span>`,\n    );\n  });\n\n  on('afterInit', () => {\n    if (!swiper.params.a11y.enabled) return;\n    init();\n    updateNavigation();\n  });\n  on('toEdge', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updateNavigation();\n  });\n  on('fromEdge', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updateNavigation();\n  });\n  on('paginationUpdate', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updatePagination();\n  });\n  on('destroy', () => {\n    if (!swiper.params.a11y.enabled) return;\n    destroy();\n  });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function History({ swiper, extendParams, on }) {\n  extendParams({\n    history: {\n      enabled: false,\n      root: '',\n      replaceState: false,\n      key: 'slides',\n    },\n  });\n\n  let initialized = false;\n  let paths = {};\n\n  const slugify = (text) => {\n    return text\n      .toString()\n      .replace(/\\s+/g, '-')\n      .replace(/[^\\w-]+/g, '')\n      .replace(/--+/g, '-')\n      .replace(/^-+/, '')\n      .replace(/-+$/, '');\n  };\n\n  const getPathValues = (urlOverride) => {\n    const window = getWindow();\n    let location;\n    if (urlOverride) {\n      location = new URL(urlOverride);\n    } else {\n      location = window.location;\n    }\n    const pathArray = location.pathname\n      .slice(1)\n      .split('/')\n      .filter((part) => part !== '');\n    const total = pathArray.length;\n    const key = pathArray[total - 2];\n    const value = pathArray[total - 1];\n    return { key, value };\n  };\n  const setHistory = (key, index) => {\n    const window = getWindow();\n    if (!initialized || !swiper.params.history.enabled) return;\n    let location;\n    if (swiper.params.url) {\n      location = new URL(swiper.params.url);\n    } else {\n      location = window.location;\n    }\n    const slide = swiper.slides.eq(index);\n    let value = slugify(slide.attr('data-history'));\n    if (swiper.params.history.root.length > 0) {\n      let root = swiper.params.history.root;\n      if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);\n      value = `${root}/${key}/${value}`;\n    } else if (!location.pathname.includes(key)) {\n      value = `${key}/${value}`;\n    }\n    const currentState = window.history.state;\n    if (currentState && currentState.value === value) {\n      return;\n    }\n    if (swiper.params.history.replaceState) {\n      window.history.replaceState({ value }, null, value);\n    } else {\n      window.history.pushState({ value }, null, value);\n    }\n  };\n\n  const scrollToSlide = (speed, value, runCallbacks) => {\n    if (value) {\n      for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n        const slide = swiper.slides.eq(i);\n        const slideHistory = slugify(slide.attr('data-history'));\n        if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n          const index = slide.index();\n          swiper.slideTo(index, speed, runCallbacks);\n        }\n      }\n    } else {\n      swiper.slideTo(0, speed, runCallbacks);\n    }\n  };\n\n  const setHistoryPopState = () => {\n    paths = getPathValues(swiper.params.url);\n    scrollToSlide(swiper.params.speed, swiper.paths.value, false);\n  };\n\n  const init = () => {\n    const window = getWindow();\n    if (!swiper.params.history) return;\n    if (!window.history || !window.history.pushState) {\n      swiper.params.history.enabled = false;\n      swiper.params.hashNavigation.enabled = true;\n      return;\n    }\n    initialized = true;\n    paths = getPathValues(swiper.params.url);\n    if (!paths.key && !paths.value) return;\n    scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);\n    if (!swiper.params.history.replaceState) {\n      window.addEventListener('popstate', setHistoryPopState);\n    }\n  };\n  const destroy = () => {\n    const window = getWindow();\n    if (!swiper.params.history.replaceState) {\n      window.removeEventListener('popstate', setHistoryPopState);\n    }\n  };\n\n  on('init', () => {\n    if (swiper.params.history.enabled) {\n      init();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.params.history.enabled) {\n      destroy();\n    }\n  });\n  on('transitionEnd _freeModeNoMomentumRelease', () => {\n    if (initialized) {\n      setHistory(swiper.params.history.key, swiper.activeIndex);\n    }\n  });\n  on('slideChange', () => {\n    if (initialized && swiper.params.cssMode) {\n      setHistory(swiper.params.history.key, swiper.activeIndex);\n    }\n  });\n}\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function HashNavigation({ swiper, extendParams, emit, on }) {\n  let initialized = false;\n  const document = getDocument();\n  const window = getWindow();\n  extendParams({\n    hashNavigation: {\n      enabled: false,\n      replaceState: false,\n      watchState: false,\n    },\n  });\n  const onHashChange = () => {\n    emit('hashChange');\n    const newHash = document.location.hash.replace('#', '');\n    const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n    if (newHash !== activeSlideHash) {\n      const newIndex = swiper.$wrapperEl\n        .children(`.${swiper.params.slideClass}[data-hash=\"${newHash}\"]`)\n        .index();\n      if (typeof newIndex === 'undefined') return;\n      swiper.slideTo(newIndex);\n    }\n  };\n  const setHash = () => {\n    if (!initialized || !swiper.params.hashNavigation.enabled) return;\n    if (\n      swiper.params.hashNavigation.replaceState &&\n      window.history &&\n      window.history.replaceState\n    ) {\n      window.history.replaceState(\n        null,\n        null,\n        `#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || '',\n      );\n      emit('hashSet');\n    } else {\n      const slide = swiper.slides.eq(swiper.activeIndex);\n      const hash = slide.attr('data-hash') || slide.attr('data-history');\n      document.location.hash = hash || '';\n      emit('hashSet');\n    }\n  };\n  const init = () => {\n    if (\n      !swiper.params.hashNavigation.enabled ||\n      (swiper.params.history && swiper.params.history.enabled)\n    )\n      return;\n    initialized = true;\n    const hash = document.location.hash.replace('#', '');\n    if (hash) {\n      const speed = 0;\n      for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n        const slide = swiper.slides.eq(i);\n        const slideHash = slide.attr('data-hash') || slide.attr('data-history');\n        if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n          const index = slide.index();\n          swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n        }\n      }\n    }\n    if (swiper.params.hashNavigation.watchState) {\n      $(window).on('hashchange', onHashChange);\n    }\n  };\n  const destroy = () => {\n    if (swiper.params.hashNavigation.watchState) {\n      $(window).off('hashchange', onHashChange);\n    }\n  };\n\n  on('init', () => {\n    if (swiper.params.hashNavigation.enabled) {\n      init();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.params.hashNavigation.enabled) {\n      destroy();\n    }\n  });\n  on('transitionEnd _freeModeNoMomentumRelease', () => {\n    if (initialized) {\n      setHash();\n    }\n  });\n  on('slideChange', () => {\n    if (initialized && swiper.params.cssMode) {\n      setHash();\n    }\n  });\n}\n","/* eslint no-underscore-dangle: \"off\" */\n/* eslint no-use-before-define: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Autoplay({ swiper, extendParams, on, emit }) {\n  let timeout;\n\n  swiper.autoplay = {\n    running: false,\n    paused: false,\n  };\n\n  extendParams({\n    autoplay: {\n      enabled: false,\n      delay: 3000,\n      waitForTransition: true,\n      disableOnInteraction: true,\n      stopOnLastSlide: false,\n      reverseDirection: false,\n      pauseOnMouseEnter: false,\n    },\n  });\n\n  function run() {\n    const $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n    let delay = swiper.params.autoplay.delay;\n    if ($activeSlideEl.attr('data-swiper-autoplay')) {\n      delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n    }\n    clearTimeout(timeout);\n    timeout = nextTick(() => {\n      let autoplayResult;\n      if (swiper.params.autoplay.reverseDirection) {\n        if (swiper.params.loop) {\n          swiper.loopFix();\n          autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.isBeginning) {\n          autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.params.autoplay.stopOnLastSlide) {\n          autoplayResult = swiper.slideTo(\n            swiper.slides.length - 1,\n            swiper.params.speed,\n            true,\n            true,\n          );\n          emit('autoplay');\n        } else {\n          stop();\n        }\n      } else if (swiper.params.loop) {\n        swiper.loopFix();\n        autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n        emit('autoplay');\n      } else if (!swiper.isEnd) {\n        autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n        emit('autoplay');\n      } else if (!swiper.params.autoplay.stopOnLastSlide) {\n        autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);\n        emit('autoplay');\n      } else {\n        stop();\n      }\n      if (swiper.params.cssMode && swiper.autoplay.running) run();\n      else if (autoplayResult === false) {\n        run();\n      }\n    }, delay);\n  }\n  function start() {\n    if (typeof timeout !== 'undefined') return false;\n    if (swiper.autoplay.running) return false;\n    swiper.autoplay.running = true;\n    emit('autoplayStart');\n    run();\n    return true;\n  }\n  function stop() {\n    if (!swiper.autoplay.running) return false;\n    if (typeof timeout === 'undefined') return false;\n\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = undefined;\n    }\n    swiper.autoplay.running = false;\n    emit('autoplayStop');\n    return true;\n  }\n  function pause(speed) {\n    if (!swiper.autoplay.running) return;\n    if (swiper.autoplay.paused) return;\n    if (timeout) clearTimeout(timeout);\n    swiper.autoplay.paused = true;\n    if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n      swiper.autoplay.paused = false;\n      run();\n    } else {\n      ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n        swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd);\n      });\n    }\n  }\n  function onVisibilityChange() {\n    const document = getDocument();\n    if (document.visibilityState === 'hidden' && swiper.autoplay.running) {\n      pause();\n    }\n    if (document.visibilityState === 'visible' && swiper.autoplay.paused) {\n      run();\n      swiper.autoplay.paused = false;\n    }\n  }\n  function onTransitionEnd(e) {\n    if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;\n    if (e.target !== swiper.$wrapperEl[0]) return;\n    ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n      swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n    });\n    swiper.autoplay.paused = false;\n    if (!swiper.autoplay.running) {\n      stop();\n    } else {\n      run();\n    }\n  }\n  function onMouseEnter() {\n    if (swiper.params.autoplay.disableOnInteraction) {\n      stop();\n    } else {\n      pause();\n    }\n\n    ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n      swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n    });\n  }\n  function onMouseLeave() {\n    if (swiper.params.autoplay.disableOnInteraction) {\n      return;\n    }\n    swiper.autoplay.paused = false;\n    run();\n  }\n  function attachMouseEvents() {\n    if (swiper.params.autoplay.pauseOnMouseEnter) {\n      swiper.$el.on('mouseenter', onMouseEnter);\n      swiper.$el.on('mouseleave', onMouseLeave);\n    }\n  }\n  function detachMouseEvents() {\n    swiper.$el.off('mouseenter', onMouseEnter);\n    swiper.$el.off('mouseleave', onMouseLeave);\n  }\n\n  on('init', () => {\n    if (swiper.params.autoplay.enabled) {\n      start();\n      const document = getDocument();\n      document.addEventListener('visibilitychange', onVisibilityChange);\n      attachMouseEvents();\n    }\n  });\n  on('beforeTransitionStart', (_s, speed, internal) => {\n    if (swiper.autoplay.running) {\n      if (internal || !swiper.params.autoplay.disableOnInteraction) {\n        swiper.autoplay.pause(speed);\n      } else {\n        stop();\n      }\n    }\n  });\n  on('sliderFirstMove', () => {\n    if (swiper.autoplay.running) {\n      if (swiper.params.autoplay.disableOnInteraction) {\n        stop();\n      } else {\n        pause();\n      }\n    }\n  });\n  on('touchEnd', () => {\n    if (\n      swiper.params.cssMode &&\n      swiper.autoplay.paused &&\n      !swiper.params.autoplay.disableOnInteraction\n    ) {\n      run();\n    }\n  });\n  on('destroy', () => {\n    detachMouseEvents();\n    if (swiper.autoplay.running) {\n      stop();\n    }\n    const document = getDocument();\n    document.removeEventListener('visibilitychange', onVisibilityChange);\n  });\n\n  Object.assign(swiper.autoplay, {\n    pause,\n    run,\n    start,\n    stop,\n  });\n}\n","import { isObject } from '../../shared/utils.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Thumb({ swiper, extendParams, on }) {\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\n  let initialized = false;\n  let swiperCreated = false;\n\n  swiper.thumbs = {\n    swiper: null,\n  };\n\n  function onThumbClick() {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper) return;\n    const clickedIndex = thumbsSwiper.clickedIndex;\n    const clickedSlide = thumbsSwiper.clickedSlide;\n    if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass))\n      return;\n    if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n    let slideToIndex;\n    if (thumbsSwiper.params.loop) {\n      slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n    } else {\n      slideToIndex = clickedIndex;\n    }\n    if (swiper.params.loop) {\n      let currentIndex = swiper.activeIndex;\n      if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {\n        swiper.loopFix();\n        // eslint-disable-next-line\n        swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n        currentIndex = swiper.activeIndex;\n      }\n      const prevIndex = swiper.slides\n        .eq(currentIndex)\n        .prevAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n        .eq(0)\n        .index();\n      const nextIndex = swiper.slides\n        .eq(currentIndex)\n        .nextAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n        .eq(0)\n        .index();\n      if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;\n      else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;\n      else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;\n      else slideToIndex = prevIndex;\n    }\n    swiper.slideTo(slideToIndex);\n  }\n\n  function init() {\n    const { thumbs: thumbsParams } = 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    } 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.addClass(swiper.params.thumbs.thumbsContainerClass);\n    swiper.thumbs.swiper.on('tap', onThumbClick);\n    return true;\n  }\n\n  function update(initial) {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper) return;\n\n    const slidesPerView =\n      thumbsSwiper.params.slidesPerView === 'auto'\n        ? thumbsSwiper.slidesPerViewDynamic()\n        : thumbsSwiper.params.slidesPerView;\n\n    const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n    const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n    if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n      let currentThumbsIndex = thumbsSwiper.activeIndex;\n      let newThumbsIndex;\n      let direction;\n      if (thumbsSwiper.params.loop) {\n        if (\n          thumbsSwiper.slides\n            .eq(currentThumbsIndex)\n            .hasClass(thumbsSwiper.params.slideDuplicateClass)\n        ) {\n          thumbsSwiper.loopFix();\n          // eslint-disable-next-line\n          thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;\n          currentThumbsIndex = thumbsSwiper.activeIndex;\n        }\n        // Find actual thumbs index to slide to\n        const prevThumbsIndex = thumbsSwiper.slides\n          .eq(currentThumbsIndex)\n          .prevAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n          .eq(0)\n          .index();\n        const nextThumbsIndex = thumbsSwiper.slides\n          .eq(currentThumbsIndex)\n          .nextAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n          .eq(0)\n          .index();\n        if (typeof prevThumbsIndex === 'undefined') {\n          newThumbsIndex = nextThumbsIndex;\n        } else if (typeof nextThumbsIndex === 'undefined') {\n          newThumbsIndex = prevThumbsIndex;\n        } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) {\n          newThumbsIndex =\n            thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex;\n        } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) {\n          newThumbsIndex = nextThumbsIndex;\n        } else {\n          newThumbsIndex = prevThumbsIndex;\n        }\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\n      if (\n        thumbsSwiper.visibleSlidesIndexes &&\n        thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0\n      ) {\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 (\n          newThumbsIndex > currentThumbsIndex &&\n          thumbsSwiper.params.slidesPerGroup === 1\n        ) {\n          // newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n        }\n        thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n      }\n    }\n\n    // Activate thumbs\n    let thumbsToActivate = 1;\n    const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n    if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n      thumbsToActivate = swiper.params.slidesPerView;\n    }\n\n    if (!swiper.params.thumbs.multipleActiveThumbs) {\n      thumbsToActivate = 1;\n    }\n\n    thumbsToActivate = Math.floor(thumbsToActivate);\n\n    thumbsSwiper.slides.removeClass(thumbActiveClass);\n    if (\n      thumbsSwiper.params.loop ||\n      (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)\n    ) {\n      for (let i = 0; i < thumbsToActivate; i += 1) {\n        thumbsSwiper.$wrapperEl\n          .children(`[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`)\n          .addClass(thumbActiveClass);\n      }\n    } else {\n      for (let i = 0; i < thumbsToActivate; i += 1) {\n        thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass);\n      }\n    }\n  }\n\n  on('beforeInit', () => {\n    const { thumbs } = swiper.params;\n    if (!thumbs || !thumbs.swiper) return;\n    init();\n    update(true);\n  });\n  on('slideChange update resize observerUpdate', () => {\n    if (!swiper.thumbs.swiper) return;\n    update();\n  });\n  on('setTransition', (_s, duration) => {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper) return;\n    thumbsSwiper.setTransition(duration);\n  });\n  on('beforeDestroy', () => {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper) return;\n    if (swiperCreated && thumbsSwiper) {\n      thumbsSwiper.destroy();\n    }\n  });\n\n  Object.assign(swiper.thumbs, {\n    init,\n    update,\n  });\n}\n","import { now } from '../../shared/utils.js';\n\nexport default function freeMode({ swiper, extendParams, emit, once }) {\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\n  function onTouchMove() {\n    const { touchEventsData: data, touches } = 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\n  function onTouchEnd({ currentPos }) {\n    const { params, $wrapperEl, rtlTranslate: rtl, snapGrid, touchEventsData: data } = swiper;\n    // Time diff\n    const touchEndTime = now();\n    const timeDiff = touchEndTime - data.touchStartTime;\n\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\n    if (params.freeMode.momentum) {\n      if (data.velocities.length > 1) {\n        const lastMoveEvent = data.velocities.pop();\n        const velocityEvent = data.velocities.pop();\n\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\n      data.velocities.length = 0;\n      let momentumDuration = 1000 * params.freeMode.momentumRatio;\n      const momentumDistance = swiper.velocity * momentumDuration;\n\n      let newPosition = swiper.translate + momentumDistance;\n      if (rtl) newPosition = -newPosition;\n\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\n        if (\n          Math.abs(snapGrid[nextSlide] - newPosition) <\n            Math.abs(snapGrid[nextSlide - 1] - newPosition) ||\n          swiper.swipeDirection === 'next'\n        ) {\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\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        $wrapperEl.transitionEnd(() => {\n          if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n          emit('momentumBounce');\n          swiper.setTransition(params.speed);\n          setTimeout(() => {\n            swiper.setTranslate(afterBouncePosition);\n            $wrapperEl.transitionEnd(() => {\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          $wrapperEl.transitionEnd(() => {\n            if (!swiper || swiper.destroyed) return;\n            swiper.transitionEnd();\n          });\n        }\n      } else {\n        swiper.updateProgress(newPosition);\n      }\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\n    if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n      swiper.updateProgress();\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n  }\n\n  Object.assign(swiper, {\n    freeMode: {\n      onTouchMove,\n      onTouchEnd,\n    },\n  });\n}\n","export default function Grid({ swiper, extendParams }) {\n  extendParams({\n    grid: {\n      rows: 1,\n      fill: 'column',\n    },\n  });\n\n  let slidesNumberEvenToRows;\n  let slidesPerRow;\n  let numFullColumns;\n\n  const initSlides = (slidesLength) => {\n    const { slidesPerView } = swiper.params;\n    const { rows, fill } = swiper.params.grid;\n    slidesPerRow = slidesNumberEvenToRows / rows;\n    numFullColumns = Math.floor(slidesLength / rows);\n    if (Math.floor(slidesLength / rows) === slidesLength / rows) {\n      slidesNumberEvenToRows = slidesLength;\n    } else {\n      slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;\n    }\n    if (slidesPerView !== 'auto' && fill === 'row') {\n      slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);\n    }\n  };\n\n  const updateSlide = (i, slide, slidesLength, getDirectionLabel) => {\n    const { slidesPerGroup, spaceBetween } = swiper.params;\n    const { rows, fill } = swiper.params.grid;\n    // Set slides order\n    let newSlideOrderIndex;\n    let column;\n    let row;\n    if (fill === 'row' && slidesPerGroup > 1) {\n      const groupIndex = Math.floor(i / (slidesPerGroup * rows));\n      const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;\n      const columnsInGroup =\n        groupIndex === 0\n          ? slidesPerGroup\n          : Math.min(\n              Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows),\n              slidesPerGroup,\n            );\n      row = Math.floor(slideIndexInGroup / columnsInGroup);\n      column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;\n\n      newSlideOrderIndex = column + (row * slidesNumberEvenToRows) / rows;\n      slide.css({\n        '-webkit-order': newSlideOrderIndex,\n        order: newSlideOrderIndex,\n      });\n    } else if (fill === 'column') {\n      column = Math.floor(i / rows);\n      row = i - column * rows;\n      if (column > numFullColumns || (column === numFullColumns && row === rows - 1)) {\n        row += 1;\n        if (row >= rows) {\n          row = 0;\n          column += 1;\n        }\n      }\n    } else {\n      row = Math.floor(i / slidesPerRow);\n      column = i - row * slidesPerRow;\n    }\n    slide.css(\n      getDirectionLabel('margin-top'),\n      row !== 0 ? spaceBetween && `${spaceBetween}px` : '',\n    );\n  };\n\n  const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => {\n    const { spaceBetween, centeredSlides, roundLengths } = swiper.params;\n    const { rows } = swiper.params.grid;\n    swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;\n    swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;\n    swiper.$wrapperEl.css({\n      [getDirectionLabel('width')]: `${swiper.virtualSize + spaceBetween}px`,\n    });\n    if (centeredSlides) {\n      snapGrid.splice(0, snapGrid.length);\n      const newSlidesGrid = [];\n      for (let i = 0; i < snapGrid.length; i += 1) {\n        let slidesGridItem = snapGrid[i];\n        if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n        if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);\n      }\n      snapGrid.push(...newSlidesGrid);\n    }\n  };\n\n  swiper.grid = {\n    initSlides,\n    updateSlide,\n    updateWrapperSize,\n  };\n}\n","import appendSlide from './methods/appendSlide.js';\nimport prependSlide from './methods/prependSlide.js';\nimport addSlide from './methods/addSlide.js';\nimport removeSlide from './methods/removeSlide.js';\nimport removeAllSlides from './methods/removeAllSlides.js';\n\nexport default function Manipulation({ swiper }) {\n  Object.assign(swiper, {\n    appendSlide: appendSlide.bind(swiper),\n    prependSlide: prependSlide.bind(swiper),\n    addSlide: addSlide.bind(swiper),\n    removeSlide: removeSlide.bind(swiper),\n    removeAllSlides: removeAllSlides.bind(swiper),\n  });\n}\n","import effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFade({ swiper, extendParams, on }) {\n  extendParams({\n    fadeEffect: {\n      crossFade: false,\n      transformEl: null,\n    },\n  });\n\n  const setTranslate = () => {\n    const { slides } = swiper;\n    const params = swiper.params.fadeEffect;\n    for (let i = 0; i < slides.length; i += 1) {\n      const $slideEl = swiper.slides.eq(i);\n      const offset = $slideEl[0].swiperSlideOffset;\n      let tx = -offset;\n      if (!swiper.params.virtualTranslate) tx -= swiper.translate;\n      let ty = 0;\n      if (!swiper.isHorizontal()) {\n        ty = tx;\n        tx = 0;\n      }\n      const slideOpacity = swiper.params.fadeEffect.crossFade\n        ? Math.max(1 - Math.abs($slideEl[0].progress), 0)\n        : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n\n      const $targetEl = effectTarget(params, $slideEl);\n      $targetEl\n        .css({\n          opacity: slideOpacity,\n        })\n        .transform(`translate3d(${tx}px, ${ty}px, 0px)`);\n    }\n  };\n  const setTransition = (duration) => {\n    const { transformEl } = swiper.params.fadeEffect;\n    const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n    $transitionElements.transition(duration);\n    effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n  };\n\n  effectInit({\n    effect: 'fade',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      spaceBetween: 0,\n      virtualTranslate: !swiper.params.cssMode,\n    }),\n  });\n}\n","import $ from '../../shared/dom.js';\nimport effectInit from '../../shared/effect-init.js';\n\nexport default function EffectCube({ swiper, extendParams, on }) {\n  extendParams({\n    cubeEffect: {\n      slideShadows: true,\n      shadow: true,\n      shadowOffset: 20,\n      shadowScale: 0.94,\n    },\n  });\n\n  const setTranslate = () => {\n    const {\n      $el,\n      $wrapperEl,\n      slides,\n      width: swiperWidth,\n      height: swiperHeight,\n      rtlTranslate: rtl,\n      size: swiperSize,\n      browser,\n    } = swiper;\n    const params = swiper.params.cubeEffect;\n    const isHorizontal = swiper.isHorizontal();\n    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n    let wrapperRotate = 0;\n    let $cubeShadowEl;\n    if (params.shadow) {\n      if (isHorizontal) {\n        $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n        if ($cubeShadowEl.length === 0) {\n          $cubeShadowEl = $('<div class=\"swiper-cube-shadow\"></div>');\n          $wrapperEl.append($cubeShadowEl);\n        }\n        $cubeShadowEl.css({ height: `${swiperWidth}px` });\n      } else {\n        $cubeShadowEl = $el.find('.swiper-cube-shadow');\n        if ($cubeShadowEl.length === 0) {\n          $cubeShadowEl = $('<div class=\"swiper-cube-shadow\"></div>');\n          $el.append($cubeShadowEl);\n        }\n      }\n    }\n    for (let i = 0; i < slides.length; i += 1) {\n      const $slideEl = slides.eq(i);\n      let slideIndex = i;\n      if (isVirtual) {\n        slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n      }\n      let slideAngle = slideIndex * 90;\n      let round = Math.floor(slideAngle / 360);\n      if (rtl) {\n        slideAngle = -slideAngle;\n        round = Math.floor(-slideAngle / 360);\n      }\n      const progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n      let tx = 0;\n      let ty = 0;\n      let tz = 0;\n      if (slideIndex % 4 === 0) {\n        tx = -round * 4 * swiperSize;\n        tz = 0;\n      } else if ((slideIndex - 1) % 4 === 0) {\n        tx = 0;\n        tz = -round * 4 * swiperSize;\n      } else if ((slideIndex - 2) % 4 === 0) {\n        tx = swiperSize + round * 4 * swiperSize;\n        tz = swiperSize;\n      } else if ((slideIndex - 3) % 4 === 0) {\n        tx = -swiperSize;\n        tz = 3 * swiperSize + swiperSize * 4 * round;\n      }\n      if (rtl) {\n        tx = -tx;\n      }\n\n      if (!isHorizontal) {\n        ty = tx;\n        tx = 0;\n      }\n\n      const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${\n        isHorizontal ? slideAngle : 0\n      }deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;\n      if (progress <= 1 && progress > -1) {\n        wrapperRotate = slideIndex * 90 + progress * 90;\n        if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;\n      }\n      $slideEl.transform(transform);\n      if (params.slideShadows) {\n        // Set shadows\n        let shadowBefore = isHorizontal\n          ? $slideEl.find('.swiper-slide-shadow-left')\n          : $slideEl.find('.swiper-slide-shadow-top');\n        let shadowAfter = isHorizontal\n          ? $slideEl.find('.swiper-slide-shadow-right')\n          : $slideEl.find('.swiper-slide-shadow-bottom');\n        if (shadowBefore.length === 0) {\n          shadowBefore = $(\n            `<div class=\"swiper-slide-shadow-${isHorizontal ? 'left' : 'top'}\"></div>`,\n          );\n          $slideEl.append(shadowBefore);\n        }\n        if (shadowAfter.length === 0) {\n          shadowAfter = $(\n            `<div class=\"swiper-slide-shadow-${isHorizontal ? 'right' : 'bottom'}\"></div>`,\n          );\n          $slideEl.append(shadowAfter);\n        }\n        if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n        if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n      }\n    }\n    $wrapperEl.css({\n      '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`,\n      'transform-origin': `50% 50% -${swiperSize / 2}px`,\n    });\n\n    if (params.shadow) {\n      if (isHorizontal) {\n        $cubeShadowEl.transform(\n          `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${\n            -swiperWidth / 2\n          }px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`,\n        );\n      } else {\n        const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n        const multiplier =\n          1.5 -\n          (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2 +\n            Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2);\n        const scale1 = params.shadowScale;\n        const scale2 = params.shadowScale / multiplier;\n        const offset = params.shadowOffset;\n        $cubeShadowEl.transform(\n          `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${\n            -swiperHeight / 2 / scale2\n          }px) rotateX(-90deg)`,\n        );\n      }\n    }\n    const zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0;\n    $wrapperEl.transform(\n      `translate3d(0px,0,${zFactor}px) rotateX(${\n        swiper.isHorizontal() ? 0 : wrapperRotate\n      }deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`,\n    );\n  };\n  const setTransition = (duration) => {\n    const { $el, slides } = swiper;\n    slides\n      .transition(duration)\n      .find(\n        '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n      )\n      .transition(duration);\n    if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n      $el.find('.swiper-cube-shadow').transition(duration);\n    }\n  };\n\n  effectInit({\n    effect: 'cube',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => true,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      resistanceRatio: 0,\n      spaceBetween: 0,\n      centeredSlides: false,\n      virtualTranslate: true,\n    }),\n  });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFlip({ swiper, extendParams, on }) {\n  extendParams({\n    flipEffect: {\n      slideShadows: true,\n      limitRotation: true,\n      transformEl: null,\n    },\n  });\n\n  const setTranslate = () => {\n    const { slides, rtlTranslate: rtl } = swiper;\n    const params = swiper.params.flipEffect;\n    for (let i = 0; i < slides.length; i += 1) {\n      const $slideEl = slides.eq(i);\n      let progress = $slideEl[0].progress;\n      if (swiper.params.flipEffect.limitRotation) {\n        progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n      }\n      const offset = $slideEl[0].swiperSlideOffset;\n      const rotate = -180 * progress;\n      let rotateY = rotate;\n      let rotateX = 0;\n      let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n      let ty = 0;\n      if (!swiper.isHorizontal()) {\n        ty = tx;\n        tx = 0;\n        rotateX = -rotateY;\n        rotateY = 0;\n      } else if (rtl) {\n        rotateY = -rotateY;\n      }\n\n      $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n      if (params.slideShadows) {\n        // Set shadows\n        let shadowBefore = swiper.isHorizontal()\n          ? $slideEl.find('.swiper-slide-shadow-left')\n          : $slideEl.find('.swiper-slide-shadow-top');\n        let shadowAfter = swiper.isHorizontal()\n          ? $slideEl.find('.swiper-slide-shadow-right')\n          : $slideEl.find('.swiper-slide-shadow-bottom');\n        if (shadowBefore.length === 0) {\n          shadowBefore = createShadow(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top');\n        }\n        if (shadowAfter.length === 0) {\n          shadowAfter = createShadow(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom');\n        }\n        if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n        if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n      }\n      const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;\n      const $targetEl = effectTarget(params, $slideEl);\n      $targetEl.transform(transform);\n    }\n  };\n\n  const setTransition = (duration) => {\n    const { transformEl } = swiper.params.flipEffect;\n    const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n    $transitionElements\n      .transition(duration)\n      .find(\n        '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n      )\n      .transition(duration);\n    effectVirtualTransitionEnd({ swiper, duration, transformEl });\n  };\n\n  effectInit({\n    effect: 'flip',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => true,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      spaceBetween: 0,\n      virtualTranslate: !swiper.params.cssMode,\n    }),\n  });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\n\nexport default function EffectCoverflow({ swiper, extendParams, on }) {\n  extendParams({\n    coverflowEffect: {\n      rotate: 50,\n      stretch: 0,\n      depth: 100,\n      scale: 1,\n      modifier: 1,\n      slideShadows: true,\n      transformEl: null,\n    },\n  });\n\n  const setTranslate = () => {\n    const { width: swiperWidth, height: swiperHeight, slides, slidesSizesGrid } = swiper;\n    const params = swiper.params.coverflowEffect;\n    const isHorizontal = swiper.isHorizontal();\n    const transform = swiper.translate;\n    const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;\n    const rotate = isHorizontal ? params.rotate : -params.rotate;\n    const translate = params.depth;\n    // Each slide offset from center\n    for (let i = 0, length = slides.length; i < length; i += 1) {\n      const $slideEl = slides.eq(i);\n      const slideSize = slidesSizesGrid[i];\n      const slideOffset = $slideEl[0].swiperSlideOffset;\n      const offsetMultiplier =\n        ((center - slideOffset - slideSize / 2) / slideSize) * params.modifier;\n\n      let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n      let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n      // var rotateZ = 0\n      let translateZ = -translate * Math.abs(offsetMultiplier);\n\n      let stretch = params.stretch;\n      // Allow percentage to make a relative stretch for responsive sliders\n      if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {\n        stretch = (parseFloat(params.stretch) / 100) * slideSize;\n      }\n      let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;\n      let translateX = isHorizontal ? stretch * offsetMultiplier : 0;\n\n      let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);\n\n      // Fix for ultra small values\n      if (Math.abs(translateX) < 0.001) translateX = 0;\n      if (Math.abs(translateY) < 0.001) translateY = 0;\n      if (Math.abs(translateZ) < 0.001) translateZ = 0;\n      if (Math.abs(rotateY) < 0.001) rotateY = 0;\n      if (Math.abs(rotateX) < 0.001) rotateX = 0;\n      if (Math.abs(scale) < 0.001) scale = 0;\n\n      const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px)  rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;\n      const $targetEl = effectTarget(params, $slideEl);\n      $targetEl.transform(slideTransform);\n\n      $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n\n      if (params.slideShadows) {\n        // Set shadows\n        let $shadowBeforeEl = isHorizontal\n          ? $slideEl.find('.swiper-slide-shadow-left')\n          : $slideEl.find('.swiper-slide-shadow-top');\n        let $shadowAfterEl = isHorizontal\n          ? $slideEl.find('.swiper-slide-shadow-right')\n          : $slideEl.find('.swiper-slide-shadow-bottom');\n        if ($shadowBeforeEl.length === 0) {\n          $shadowBeforeEl = createShadow(params, $slideEl, isHorizontal ? 'left' : 'top');\n        }\n        if ($shadowAfterEl.length === 0) {\n          $shadowAfterEl = createShadow(params, $slideEl, isHorizontal ? 'right' : 'bottom');\n        }\n        if ($shadowBeforeEl.length)\n          $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n        if ($shadowAfterEl.length)\n          $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;\n      }\n    }\n  };\n  const setTransition = (duration) => {\n    const { transformEl } = swiper.params.coverflowEffect;\n    const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n    $transitionElements\n      .transition(duration)\n      .find(\n        '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n      )\n      .transition(duration);\n  };\n\n  effectInit({\n    effect: 'coverflow',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => true,\n    overwriteParams: () => ({\n      watchSlidesProgress: true,\n    }),\n  });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCreative({ swiper, extendParams, on }) {\n  extendParams({\n    creativeEffect: {\n      transformEl: null,\n      limitProgress: 1,\n      shadowPerProgress: false,\n      progressMultiplier: 1,\n      perspective: true,\n      prev: {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        opacity: 1,\n        scale: 1,\n      },\n      next: {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        opacity: 1,\n        scale: 1,\n      },\n    },\n  });\n\n  const getTranslateValue = (value) => {\n    if (typeof value === 'string') return value;\n    return `${value}px`;\n  };\n\n  const setTranslate = () => {\n    const { slides } = swiper;\n    const params = swiper.params.creativeEffect;\n    const { progressMultiplier: multiplier } = params;\n    for (let i = 0; i < slides.length; i += 1) {\n      const $slideEl = slides.eq(i);\n      const slideProgress = $slideEl[0].progress;\n      const progress = Math.min(\n        Math.max($slideEl[0].progress, -params.limitProgress),\n        params.limitProgress,\n      );\n      const offset = $slideEl[0].swiperSlideOffset;\n      const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];\n      const r = [0, 0, 0];\n      let custom = false;\n      if (!swiper.isHorizontal()) {\n        t[1] = t[0];\n        t[0] = 0;\n      }\n      let data = {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        scale: 1,\n        opacity: 1,\n      };\n      if (progress < 0) {\n        data = params.next;\n        custom = true;\n      } else if (progress > 0) {\n        data = params.prev;\n        custom = true;\n      }\n      // set translate\n      t.forEach((value, index) => {\n        t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(\n          progress * multiplier,\n        )}))`;\n      });\n      // set rotates\n      r.forEach((value, index) => {\n        r[index] = data.rotate[index] * Math.abs(progress * multiplier);\n      });\n\n      $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n\n      const translateString = t.join(', ');\n      const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`;\n      const scaleString =\n        progress < 0\n          ? `scale(${1 + (1 - data.scale) * progress * multiplier})`\n          : `scale(${1 - (1 - data.scale) * progress * multiplier})`;\n      const opacityString =\n        progress < 0\n          ? 1 + (1 - data.opacity) * progress * multiplier\n          : 1 - (1 - data.opacity) * progress * multiplier;\n      const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;\n\n      // Set shadows\n      if ((custom && data.shadow) || !custom) {\n        let $shadowEl = $slideEl.children('.swiper-slide-shadow');\n        if ($shadowEl.length === 0 && data.shadow) {\n          $shadowEl = createShadow(params, $slideEl);\n        }\n        if ($shadowEl.length) {\n          const shadowOpacity = params.shadowPerProgress\n            ? progress * (1 / params.limitProgress)\n            : progress;\n          $shadowEl[0].style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);\n        }\n      }\n\n      const $targetEl = effectTarget(params, $slideEl);\n      $targetEl.transform(transform).css({ opacity: opacityString });\n      if (data.origin) {\n        $targetEl.css('transform-origin', data.origin);\n      }\n    }\n  };\n\n  const setTransition = (duration) => {\n    const { transformEl } = swiper.params.creativeEffect;\n    const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n    $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n    effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n  };\n\n  effectInit({\n    effect: 'creative',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => swiper.params.creativeEffect.perspective,\n    overwriteParams: () => ({\n      watchSlidesProgress: true,\n      virtualTranslate: !swiper.params.cssMode,\n    }),\n  });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCards({ swiper, extendParams, on }) {\n  extendParams({\n    cardsEffect: {\n      slideShadows: true,\n      transformEl: null,\n    },\n  });\n\n  const setTranslate = () => {\n    const { slides, activeIndex } = swiper;\n    const params = swiper.params.cardsEffect;\n    const { startTranslate, isTouched } = swiper.touchEventsData;\n    const currentTranslate = swiper.translate;\n    for (let i = 0; i < slides.length; i += 1) {\n      const $slideEl = slides.eq(i);\n      const slideProgress = $slideEl[0].progress;\n      const progress = Math.min(Math.max(slideProgress, -4), 4);\n      let offset = $slideEl[0].swiperSlideOffset;\n      if (swiper.params.centeredSlides && !swiper.params.cssMode) {\n        swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`);\n      }\n      if (swiper.params.centeredSlides && swiper.params.cssMode) {\n        offset -= slides[0].swiperSlideOffset;\n      }\n      let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n      let tY = 0;\n      const tZ = -100 * Math.abs(progress);\n      let scale = 1;\n      let rotate = -2 * progress;\n\n      let tXAdd = 8 - Math.abs(progress) * 0.75;\n\n      const isSwipeToNext =\n        (i === activeIndex || i === activeIndex - 1) &&\n        progress > 0 &&\n        progress < 1 &&\n        (isTouched || swiper.params.cssMode) &&\n        currentTranslate < startTranslate;\n      const isSwipeToPrev =\n        (i === activeIndex || i === activeIndex + 1) &&\n        progress < 0 &&\n        progress > -1 &&\n        (isTouched || swiper.params.cssMode) &&\n        currentTranslate > startTranslate;\n      if (isSwipeToNext || isSwipeToPrev) {\n        const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;\n        rotate += -28 * progress * subProgress;\n        scale += -0.5 * subProgress;\n        tXAdd += 96 * subProgress;\n        tY = `${-25 * subProgress * Math.abs(progress)}%`;\n      }\n\n      if (progress < 0) {\n        // next\n        tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`;\n      } else if (progress > 0) {\n        // prev\n        tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`;\n      } else {\n        tX = `${tX}px`;\n      }\n      if (!swiper.isHorizontal()) {\n        const prevY = tY;\n        tY = tX;\n        tX = prevY;\n      }\n\n      const scaleString =\n        progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;\n      const transform = `\n        translate3d(${tX}, ${tY}, ${tZ}px)\n        rotateZ(${rotate}deg)\n        scale(${scaleString})\n      `;\n\n      if (params.slideShadows) {\n        // Set shadows\n        let $shadowEl = $slideEl.find('.swiper-slide-shadow');\n        if ($shadowEl.length === 0) {\n          $shadowEl = createShadow(params, $slideEl);\n        }\n        if ($shadowEl.length)\n          $shadowEl[0].style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);\n      }\n\n      $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n      const $targetEl = effectTarget(params, $slideEl);\n      $targetEl.transform(transform);\n    }\n  };\n\n  const setTransition = (duration) => {\n    const { transformEl } = swiper.params.cardsEffect;\n    const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n    $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n    effectVirtualTransitionEnd({ swiper, duration, transformEl });\n  };\n\n  effectInit({\n    effect: 'cards',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => true,\n    overwriteParams: () => ({\n      watchSlidesProgress: true,\n      virtualTranslate: !swiper.params.cssMode,\n    }),\n  });\n}\n","'use strict';\n\nconst utils = require('../components/utils');\n\nconst $mainPDPGallery = $('.product-gallery--main');\nconst $modelDescription = $('.js-onmodel-description');\n\n/**\n * Reset (hide) model description\n */\nfunction resetModelDescription() {\n    $modelDescription.removeClass('d-block').addClass('d-none');\n}\n\n/**\n * Initialize model data\n * @param {string} onModelValue: Reference to data model of thumbnail image\n * @returns {boolean} True if no errors occur\n */\nfunction getOnModelData(onModelValue) {\n    let modelKey;\n    let modelValue;\n    let modelObject;\n    const url = $mainPDPGallery.data('model-url');\n    try {\n        const onModelObj = onModelValue && JSON.parse(decodeURIComponent(onModelValue));\n        if (onModelObj) {\n            modelKey = Object.keys(onModelObj)[0];\n            modelValue = onModelObj[modelKey];\n            modelObject = {\n                modelKey: modelKey,\n                modelValue: modelValue\n            };\n            $.ajax({\n                url: utils.setUrlKeyValue(url, 'pid', onModelObj.variantUPC.trim()),\n                type: 'post',\n                dataType: 'json',\n                data: modelObject,\n                success: function (data) {\n                    if (data && data.modelDescription) {\n                        $modelDescription.html(data.modelDescription)\n                            .removeClass('d-none').addClass('d-block');\n                    }\n                },\n                error: function () {\n                    $.spinner().stop();\n                }\n            });\n        }\n    } catch (e) {\n        return false;\n    }\n    return true;\n}\n\n/**\n * Initialize model data\n * @returns {string} modeldataValue on model data value of image\n */\nfunction imageModelData() {\n    let modelImg = $mainPDPGallery.find('.js-model-image');\n    let modelDataValue;\n\n    if (modelImg) {\n        let modelImgArray = Array.from(modelImg);\n        modelDataValue = modelImgArray.find(function (element) {\n            return $(element).data('onmodel') !== null;\n        });\n    }\n    return modelDataValue;\n}\n\n/**\n * Trigger display of OnModel description\n * Dependency: imageModelData()\n */\nfunction triggerOnModelDescription() {\n    const modelValue = imageModelData();\n    const imageclick = $(modelValue).data('onmodel');\n\n    resetModelDescription();\n    getOnModelData(imageclick);\n}\n\nmodule.exports = {\n    getOnModelData: getOnModelData,\n    imageModelData: imageModelData,\n    triggerOnModelDescription: triggerOnModelDescription\n};\n","'use strict';\n\nconst breakpoints = require('../components/breakpoints');\nconst debounce = require('lodash/debounce');\n\n/**\n * Updates the tab and content state for the item that was clicked\n * @param {selector} clickedTabSelector for example: .ofs-item\n */\nfunction updateTabbedContainerContent(clickedTabSelector) {\n    var $clickedTab = $(clickedTabSelector);\n    var $tabbedContainer = $clickedTab.closest('.tabbed-container');\n    var $contentContainer = $tabbedContainer.children('.tabbed-container__content-container');\n    var targetContentSelector = $clickedTab.data('target') || $clickedTab.attr('href');\n    var $targetContent = $(targetContentSelector);\n\n    // Show clicked tab's contents, hide all sibling tabs' contents.\n    // This prevents white space below the footer when very long tab content is hidden\n    $targetContent.show();\n\n    if (breakpoints.isHighRes() || !$targetContent.closest('.responsive-tabs').length) {\n        // only apply this style class when the tabbed container is being rendered as tabs (e.g. hybrid view at desktop width, or tab-only view at any width)\n        $targetContent.siblings().hide();\n    }\n\n    // toggle active class on the content\n    $contentContainer.children('.tabbed-container__content').removeClass('active');\n    $targetContent.addClass('active');\n}\n\n/**\n * Reinitializes any carousels within tabbed content of any variation (e.g. tabs, accordions, hybrid)\n * @param {JQuery<HTMLElement>} $clickedItem for example: .ofs-item or .card-header\n */\nfunction reinitializeCarousels($clickedItem) {\n    var targetContentSelector = $clickedItem.data('target') || $clickedItem.attr('href');\n    $(targetContentSelector).find('.slick-initialized').slick('unslick').slick('reinit');\n}\n\nmodule.exports = {\n    init: function () {\n        // set initial height of all content containers to the size of their active content.\n        $('.tabbed-container__content-container').each(function () {\n            var $this = $(this);\n            var $hybridTabbedContainer = $this.closest('.responsive-tabs'); // may or may not exist depending on which $('.tabbed-container__content-container') we are in\n\n            // wait for window.onLoad and try setting the height again, for those instances that weren't ready the first time.\n            $(window).on('load', function () {\n                if (breakpoints.isHighRes() || !$hybridTabbedContainer.length) {\n                    // only apply this style class when the tabbed container is being rendered as tabs (e.g. hybrid view at desktop width, or tab-only view at any width)\n                    $this.find('.active').siblings().hide();\n                }\n            });\n\n            // make sure that we don't lose content if someone rotates their tablet or phone back and forth and the tabbed container transitions between accordion and tab view\n            $(window).on('resize', debounce(\n                function () {\n                    if ($hybridTabbedContainer.length) {\n                        $this.find('.active').siblings().toggle(breakpoints.isLowRes());\n                    }\n                }, 200));\n        });\n\n        $('.tabbed-container__tabs').on('click', '.ofs__item', function (e) {\n            e.preventDefault();\n            var $thisItem = $(this);\n\n            // toggle active classes on the tabs\n            $thisItem.siblings('.ofs__item').removeClass('active');\n            $thisItem.addClass('active');\n\n            var $ofs = $thisItem.closest('.overflow-slider');\n            $ofs.prop('ofs').slideToItem($ofs, $thisItem);\n\n            // reinitialize the carousels in case they got cut short on initial page load and tab content hiding\n            reinitializeCarousels($thisItem);\n\n            updateTabbedContainerContent($thisItem);\n        });\n\n        $('.accordions').on('click', '.card-header', function () {\n            var $thisItem = $(this);\n\n            // reinitialize the carousels in case they got cut short on initial page load and tab content hiding\n            reinitializeCarousels($thisItem);\n        });\n\n        var hash = location.hash;\n        if (hash) {\n            // check if any of the ofs__items have this href or target.\n            $('.tabbed-container__tabs .ofs__item').each(function () {\n                var $thisItem = $(this);\n                var targetContentSelector = $thisItem.data('target') || $thisItem.attr('href');\n                if (targetContentSelector === hash) {\n                    // go to this item\n                    $thisItem.trigger('click'); // this will call the event handler above to make this item active.\n                    return false; // break out of the .each() loop.\n                }\n                return true;\n            });\n        }\n    }\n};\n","import * as allExports from './index.js';\nimport { mixin } from './index.js';\n\n// Add all of the Underscore functions to the wrapper object.\nvar _ = mixin(allExports);\n// Legacy Node.js API\n_._ = _;\n// Export the Underscore API.\nexport default _;\n","/* global clientData */\n'use strict';\n\n/**\n * Product Base Module\n */\n\nvar utils = require('../components/utils');\nvar onModel = require('../product/onModelDescription');\nvar Badge = require('../product/badge.js');\nvar Overview = require('../product/overview.js');\nconst minicartSaleItemAlertBadge = require('../components/minicartSaleItemAlertBadge');\n\n/*\n * All needed methods from app_storefront_base/cartridge/client/default/js/product/base.js have been overridden here\n */\n\nvar base = require('base/product/base');\nvar breakpoints = require('../components/breakpoints');\n\nconst $mainPDPGallery = $('.product-gallery--main');\nconst oosData = {};\n\n/**\n * method to identify if BISN is enabled at variant level\n * @param {Object} attrValue  color swatch value\n * @param {Object} $productObject Product object\n * @returns {boolean} true if BISN is checked at variant level, else false\n */\nfunction isNotifyMeEnabled(attrValue, $productObject) {\n    var enableNotifyMe;\n    var varKeys = Object.keys($productObject.variantData);\n    varKeys.forEach(function (key) {\n        if ($productObject.variantData[key].color === attrValue.id) {\n            enableNotifyMe = $productObject.variantData[key].bisnflag;\n            return false;\n        }\n        return true;\n    });\n    return enableNotifyMe;\n}\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n    var pid;\n\n    if ($('.quickview-modal').hasClass('show') && !$('.product-set').length) {\n        pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n    } else if ($('.product-set-detail').length || $('.product-set').length) {\n        pid = $($el).closest('.product-detail').find('.product-id').data('pid');\n    } else {\n        pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n    }\n\n    return pid;\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {Object} $productObject product object\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {string} topLevelAttribute - Either 'color' or 'sizeType'\n */\nfunction processSwatchValues(attr, $productObject, $productContainer, topLevelAttribute) {\n    attr.values.forEach(function (attrValue) {\n        const $swatchSpan = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' + attrValue.value + '\"]');\n        const $swatchAnchor = $swatchSpan.parent();\n        const swatchOutOfStockText = $swatchAnchor.closest('.js-color-attribute').data('attr-oos-text');\n\n        // Disable if not selectable\n        $swatchSpan.removeClass('selected selectable unselectable');\n        $swatchAnchor.removeClass('selected selectable unselectable'); // This is only for visual display\n        $swatchAnchor.data('attr-oos', '');\n\n        let url;\n        if (attr.topLevelAttribute) { // Color as top-level\n            /**\n            * The top-level attribute (either color or sizeType) should always be clickable:\n            *\n            * For example, if you selected Standard/Black/M, normally you would not be\n            * able to switch from Standard to Big, because Black/M is not a value combination\n            * for Big.\n            **/\n            url = attrValue.url;\n            if (url === undefined) {\n                // This would be very rare\n                $swatchAnchor.data('attr-url', '');\n                $swatchAnchor.addClass('unselectable');\n                $swatchSpan.addClass('unselectable');\n            } else {\n                // Top level is always selectable... Unless the URL above is empty.\n                $swatchAnchor.data('attr-url', url);\n                $swatchAnchor.addClass('selectable');\n                $swatchSpan.addClass('selectable');\n            }\n        } else { // Color when SizeType is top-level.\n            url = attrValue.url;\n            if (url === undefined) {\n                // This would be very rare\n                $swatchAnchor.data('attr-url', '');\n                $swatchAnchor.addClass('unselectable');\n                $swatchSpan.addClass('unselectable');\n            } else {\n                if (topLevelAttribute === 'sizeType' && attrValue.url === undefined) { // eslint-disable-line\n                    // If there is a SizeType dimension, this will mess up stuff...\n                    $swatchAnchor.data('attr-url', '');\n                    $swatchAnchor.addClass('unselectable');\n                    $swatchSpan.addClass('unselectable');\n                } else {\n                    $swatchAnchor.data('attr-url', url);\n                    $swatchAnchor.addClass('selectable');\n                    $swatchSpan.addClass('selectable');\n                }\n            }\n        }\n        const enableNotifyMe = isNotifyMeEnabled(attrValue, $productObject);\n\n        // Reset aria-label attribute for each color option\n        $swatchAnchor.attr('aria-label', attrValue.displayValue);\n        if (attrValue.selected) {\n            $swatchAnchor.addClass('selected');\n            $swatchAnchor.attr('aria-label', attrValue.displayValue + ' ' + $swatchAnchor.data('selected-label'));\n            $swatchAnchor.trigger('blur').on('focus', (e) => {\n                e.preventDefault();\n                e.target.focus({ preventScroll: true });\n            });\n            $swatchSpan.addClass('selected');\n            $swatchAnchor.trigger('attribute:select', [$swatchAnchor, attrValue]);\n        }\n\n        if (attrValue.masterSelectable === false && enableNotifyMe !== null && !enableNotifyMe) {\n            $swatchAnchor.addClass('not-orderable');\n            $swatchSpan.addClass('not-orderable');\n            if ($swatchAnchor.hasClass('unselectable')) {\n                $swatchAnchor.removeClass('unselectable');\n                $swatchSpan.removeClass('unselectable');\n            }\n        } else if (attrValue.masterSelectable === false && enableNotifyMe) {\n            if (!$swatchAnchor.hasClass('unselectable')) {\n                $swatchAnchor.addClass('unselectable');\n                $swatchSpan.addClass('unselectable');\n            }\n        }\n\n        if (attrValue.pdpUrl === undefined) {\n            $swatchAnchor.removeAttr('href');\n        } else {\n            $swatchAnchor.attr('href', attrValue.pdpUrl);\n        }\n\n        if ($swatchAnchor.hasClass('unselectable')) {\n            $swatchAnchor.attr('data-attr-oos', swatchOutOfStockText); // sets the data attribute to the out of stock text\n        } else {\n            $swatchAnchor.attr('data-attr-oos', '');\n        }\n\n        /*\n        window.console.log('---',\n            'ID:', attr.id,\n            'Value:', attrValue.value,\n            'Selected:', attrValue.selected,\n            'Selectable:', attrValue.selectable, '\\n',\n            'url:', (attrValue.url && attrValue.url.split('?').length ? attrValue.url.split('?')[1] : attrValue.url), '\\n'\n        );\n        */\n    });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n *     selected.  If there is no variant that corresponds to a specific combination of attribute\n *     values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {string} topLevelAttribute - Either 'color' or 'sizeType'\n */\nfunction processNonSwatchValues(attr, $productContainer, topLevelAttribute) { // eslint-disable-line\n    let count = 0;\n    let selectedCount = 0;\n    attr.values.forEach(function (attributeValue) {\n        if (attributeValue.selectable) {\n            count++;\n        }\n        if (attributeValue.selected) {\n            selectedCount++;\n        }\n    });\n    attr.values.forEach(function (attrValue) {\n        const $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' + attrValue.value + '\"]');\n        const attrOutOfStockText = $attrValue.closest('.js-size-attribute, .js-dimension-attribute').data('attr-oos-text');\n\n        // Reset Everything\n        $attrValue.removeClass('selected selectable unselectable');\n        $attrValue.data('attr-oos', '');\n        if (selectedCount === 0) {\n            $attrValue.closest('.js-attribute').find('.js-attr-label-value').removeClass('text-danger').text('');  // reset attribute label\n        }\n\n        let url;\n        if (attr.topLevelAttribute) { // SizeType\n            /**\n            * The top-level attribute (either color or sizeType) should always be clickable:\n            *\n            * For example, if you selected Standard/Black/M, normally you would not be\n            * able to switch from Standard to Big, because Black/M is not a value combination\n            * for Big.\n            **/\n            url = attrValue.url;\n            if (url === undefined) {\n                // This would be very rare\n                $attrValue.data('attr-url', '');\n                $attrValue.addClass('unselectable');\n            } else {\n                // Top level is always selectable... Unless the URL above is empty.\n                $attrValue.data('attr-url', url);\n                $attrValue.addClass('selectable');\n            }\n        } else { // Size or Dimension\n            url = attrValue.url;\n            if (url === undefined) {\n                // This would be very rare\n                $attrValue.data('attr-url', '');\n                $attrValue.addClass('unselectable');\n            } else {\n                $attrValue.data('attr-url', url);\n\n                if (attrValue.selectable) {\n                    $attrValue.addClass('selectable');\n                } else {\n                    $attrValue.addClass('unselectable');\n                }\n            }\n        }\n\n        // Reset aria-label attribute\n        $attrValue.attr('aria-label', $attrValue.data('attr-hover'));\n        if (attrValue.selected) {\n            $attrValue.addClass('selected');\n            $attrValue.attr('aria-label', $attrValue.data('attr-hover') + ' ' + $attrValue.data('selected-label'));\n            $attrValue.trigger('blur').on('focus', (e) => {\n                e.preventDefault();\n                e.target.focus({ preventScroll: true });\n            });\n            $attrValue.trigger('attribute:select', [$attrValue, attrValue]);\n        }\n\n        if (attr.attributeId && attr.attributeId.toLowerCase() === 'dimension') {\n            if (attrValue.selectable) {\n                if (count === 1 && attrValue.selected) {\n                    $attrValue.addClass('selected');\n                } else {\n                    $attrValue.addClass('selectable');\n                }\n            } else {\n                $attrValue.addClass('unselectable');\n            }\n        }\n\n        if (attrValue.masterSelectable === false) {\n            $attrValue.addClass('unselectable');\n        }\n\n        if (attrValue.pdpUrl === undefined) {\n            $attrValue.removeAttr('href');\n        } else {\n            $attrValue.attr('href', attrValue.pdpUrl);\n        }\n\n        if ($attrValue.hasClass('unselectable')) {\n            $attrValue.attr('data-attr-oos', attrOutOfStockText); // sets the HTML data attribute to the out of stock text\n        } else {\n            $attrValue.attr('data-attr-oos', '');\n        }\n\n        /*\n        window.\n        ('---',\n            'ID:', attr.id,\n            'Value:', attrValue.value,\n            'Selected:', attrValue.selected,\n            'Selectable:', attrValue.selectable, '\\n',\n            'url:', (attrValue.url && attrValue.url.split('?').length ? attrValue.url.split('?')[1] : attrValue.url), '\\n'\n        );\n        */\n    });\n}\n\n/**\n * Color swatches can be broken up into price groups. If all the swatches are hidden, also hide the price label.\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction hideColorPriceGroups($productContainer) {\n    $('.priceGroup', $productContainer).each(function () {\n        var groupVisible = false;\n        $(this).find('.color-value').each(function () {\n            if ($(this).hasClass('selectable')\n                && $(this).hasClass('not-orderable') === false\n                && $(this).hasClass('invalid') === false\n            ) {\n                groupVisible = true;\n            }\n        });\n\n        if (groupVisible) {\n            $(this).show();\n        } else {\n            $(this).hide();\n        }\n    });\n}\n\n/**\n * Pass in an array of SKUs, the variantData array, and and Attribute ID\n * Returns an array of unique Attribute Values from the SKUs\n *\n * @param {Object} variantData - Indexed by SKU. See models/product/decorators/variantMatrix.js\n * @param {array} skuArray - Array of skus\n * @param {string} attributeID - Attribute ID\n * @return {array} - Array of unique attribute values\n */\nfunction getSkuValues(variantData, skuArray, attributeID) {\n    var arr = [];\n    for (var i = 0; i < skuArray.length; i++) {\n        var sku = skuArray[i];\n        if (variantData[sku] !== undefined) {\n            var attributeValue = variantData[sku][attributeID];\n            if (arr.indexOf(attributeValue) === -1) {\n                arr.push(attributeValue);\n            }\n        }\n    }\n    return arr; // These are all the valid values\n}\n\n/**\n * For products with 3 dimensions of attributes, we must hide/show swatch combinations\n * that are not valid possibilities. For example, a pant sizes of SizeType \"Big\" and a\n * Size of \"30/30\". Big pants are not available in this size...\n *\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {array} attrs - Attributes from the AJAX productObject.variationAttributes result\n * @param {string} topLevelAttribute - sizeType, color or empty\n * @param {array} allAttributes - Possible values are sizeType, color, size, dimension\n * @param {Object} variantData - Indexed by SKU. See models/product/decorators/variantMatrix.js\n * @param {Object} variantMatrix - Indexed by Attribute. See models/product/decorators/variantMatrix.js\n */\nfunction hideShowValidSwatches($productContainer, attrs, topLevelAttribute, allAttributes, variantData, variantMatrix) {\n    if (topLevelAttribute === '') {\n        return;\n    }\n\n    var hasSizeType = allAttributes.indexOf('sizeType') !== -1;\n    var hasColor = allAttributes.indexOf('color') !== -1;\n    var hasSize = allAttributes.indexOf('size') !== -1;\n    var hasDimension = allAttributes.indexOf('dimension') !== -1;\n\n    // The functionality below only applies in these two scenarios:\n    // 1. A product which SizeType + Color + Size\n    // 2. A product which has Color + Size + Dimension\n    if (!(hasSizeType || hasDimension)) {\n        return;\n    }\n\n    // Get all the currently selected attributes values:\n    var selectedAttributes = {};\n    attrs.forEach(function (attr) {\n        attr.values.forEach(function (attrValue) {\n            if (attrValue.selected) {\n                selectedAttributes[attr.id] = attrValue.value;\n            }\n        });\n    });\n\n    var skuArray;\n    if (topLevelAttribute === 'sizeType' && hasSizeType) {\n        $productContainer.find('.js-attribute-size .js-attribute-value').removeClass('invalid');\n        $productContainer.find('.js-attribute-color .js-attribute-value').removeClass('invalid');\n\n        // There should always be a SizeType selected, otherwise we\n        // cannot determine which color and size swatches are valid.\n        var selectedSizeType = selectedAttributes['sizeType']; // eslint-disable-line dot-notation\n        if (selectedSizeType === undefined) {\n            return;\n        }\n\n        // Array of skus which have the selected SizeType.\n        skuArray = variantMatrix['sizeType'][selectedSizeType]; // eslint-disable-line dot-notation\n\n        // Based on the selected SizeType, show/hide \"valid\" Size swatches.\n        if (hasSize) {\n            var validSizes = getSkuValues(variantData, skuArray, 'size'); // Array of unique \"Size\" values in sku array.\n\n            // Hide all skus with invalid values\n            if (validSizes.length) {\n                $productContainer.find('.js-attribute-size .js-attribute-value').each(function () {\n                    var val = $(this).data('attr-value');\n                    if (val !== undefined && validSizes.indexOf(String(val)) === -1) {\n                        // Value of swatch does not appear in array. Hide swatch.\n                        $(this).addClass('invalid');\n                    }\n                });\n            }\n        }\n\n        // Based on the selected SizeType, show/hide \"valid\" Color swatches.\n        if (hasColor) {\n            var validColors = getSkuValues(variantData, skuArray, 'color'); // Array of unique \"Color\" values in sku array.\n\n            if (validColors.length) {\n                $productContainer.find('.js-attribute-color .js-attribute-value').each(function () {\n                    var val = $(this).data('attr-value');\n                    if (val !== undefined && validColors.indexOf(String(val)) === -1) {\n                        // Value of swatch does not appear in array. Hide swatch.\n                        $(this).addClass('invalid');\n                    }\n                });\n            }\n        }\n    } else if (topLevelAttribute === 'color' && hasDimension) {\n        $productContainer.find('.js-attribute-dimension .js-attribute-value').removeClass('invalid');\n\n        // Dimension is an attribute of the selected Size and Color.\n        var selectedSize = selectedAttributes['size']; // eslint-disable-line dot-notation\n        if (selectedSize === undefined) {\n            return;\n        }\n\n        var skuColorArray = [];\n        var skuSizeArray = [];\n        if (hasColor) {\n            var selectedColor = selectedAttributes['color']; // eslint-disable-line dot-notation\n            if (selectedColor !== undefined) {\n                skuColorArray = variantMatrix['color'][selectedColor]; // eslint-disable-line dot-notation\n            }\n        }\n\n        // Based on the selected Size, show/hide \"valid\" Size swatches.\n        if (hasSize) {\n            // Array of skus which have the selected SizeType.\n            skuSizeArray = variantMatrix['size'][selectedSize]; // eslint-disable-line dot-notation\n\n            // Note: Both Color and Size must be selected to determine which lengths are \"valid\" options.\n            if (skuSizeArray.length && skuColorArray.length) {\n                // If both Size and Color are selected, determine which skus\n                // appear in both arrays via intersection.\n                skuArray = utils.arrayIntersection(skuSizeArray, skuColorArray);\n            } else {\n                skuArray = skuSizeArray;\n            }\n\n            var validDimensions = getSkuValues(variantData, skuArray, 'dimension'); // Array of unique \"dimension\" values in sku array.\n\n            // Hide all skus with invalid values\n            if (validDimensions.length) {\n                $productContainer.find('.js-attribute-dimension .js-attribute-value').each(function () {\n                    var val = $(this).data('attr-value');\n                    if (val !== undefined && validDimensions.indexOf(String(val)) === -1) {\n                        // Value of swatch does not appear in array. Hide swatch.\n                        $(this).addClass('invalid');\n                    }\n                });\n            }\n        }\n    }\n}\n\n/**\n * Get selected size/dimension swatch\n * @param {string} variantID Variant ID to locate in the productCache data\n * @param {Object} swatchArrays Contains arrays of variants, organized by size/dim\n * @param {Array} swatchKeys Array containing swatch key values (eg. 'S', 'M', 'L', etc.)\n * @return {string} Size or dimension that is currently selected\n */\nfunction getSelectedSwatchValue(variantID, swatchArrays, swatchKeys) {\n    var result;\n    for (let i = 0; i < swatchKeys.length; i++) {\n        if (swatchArrays[swatchKeys[i]].includes(variantID)) {\n            result = swatchKeys[i];\n            break;\n        }\n    }\n    return result;\n}\n\n/**\n * Adds 'unselectable' class to color swatches\n * @param {Object} colorVariantArrays Object containing variantID arrays, grouped by color ID\n * @param {Array} colorVariantKeys Array of color ID indices\n * @param {string} variantID Target variant ID\n */\nfunction markOOSColorVariants(colorVariantArrays, colorVariantKeys, variantID) {\n    colorVariantKeys.forEach(colorVarKey => {\n        if (colorVariantArrays[colorVarKey].includes(variantID)) {\n            // Find the matching color swatch span and mark the parent anchor element as 'unselectable'\n            $('.js-attribute-value[data-attr-value=\"' + colorVarKey + '\"]')\n                .closest('.js-color-swatch')\n                .removeClass('selectable')\n                .addClass('unselectable');\n        }\n    });\n}\n\n/**\n *\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateOOSColorVariants($productContainer) {\n    const masterID = String($productContainer.data('master-pid'));\n    const variantID = String($productContainer.data('pid'));\n\n    // Exit function if productCache prerequisites are not met\n    if (!window.productCache || !masterID || !variantID ||\n        !window.productCache[masterID] ||\n        !window.productCache[masterID].variantMatrix ||\n        !window.productCache[masterID].variantMatrix.inventory) {\n        return;\n    }\n\n    if (JSON.stringify(oosData) === '{}') {\n        oosData.colorVariantArrays = window.productCache[masterID].variantMatrix.color || {};\n        oosData.colorVariantKeys = Object.keys(oosData.colorVariantArrays);\n        oosData.sizeVariantArrays = window.productCache[masterID].variantMatrix.size || {};\n        oosData.sizeVariantKeys = Object.keys(oosData.sizeVariantArrays);\n        oosData.dimVariantArrays = window.productCache[masterID].variantMatrix.dimension || {};\n        oosData.dimVariantKeys = Object.keys(oosData.dimVariantArrays);\n    }\n\n    const oosVariants = window.productCache[masterID].variantMatrix.inventory[0];\n    if (oosVariants) {\n        let selectedSize;\n        let selectedDim;\n\n        selectedSize = oosData.sizeVariantArrays ? getSelectedSwatchValue(variantID, oosData.sizeVariantArrays, oosData.sizeVariantKeys) : null;\n        selectedDim = oosData.dimVariantArrays ? getSelectedSwatchValue(variantID, oosData.dimVariantArrays, oosData.dimVariantKeys) : null;\n\n        if (selectedSize) {\n            if (selectedDim) {\n                // Locate variantID that may exist in intersection of size & dimension arrays\n                // and identify which colors are out of stock for this size & dimension combination\n                oosData.dimVariantArrays[selectedDim].forEach(variant => {\n                    if (oosVariants.includes(variant) && oosData.sizeVariantArrays[selectedSize].includes(variant)) {\n                        markOOSColorVariants(oosData.colorVariantArrays, oosData.colorVariantKeys, variant);\n                    }\n                });\n            } else {\n                // Loop through 'size' variants and identify which colors are out of stock for this size\n                oosData.sizeVariantArrays[selectedSize].forEach(variant => {\n                    if (oosVariants.includes(variant)) {\n                        markOOSColorVariants(oosData.colorVariantArrays, oosData.colorVariantKeys, variant);\n                    }\n                });\n            }\n        }\n    }\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n *     swatches or not\n *\n * @param {Object} productObject - Product Data\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAttrs(productObject, $productContainer) {\n    var attrs = productObject.variationAttributes;\n\n    // Currently, the only attribute type that has image swatches is Color.\n    var attrsWithSwatches = ['color'];\n\n    // Find attribute with topLevelAttribute == true\n    var topLevelArray = attrs.filter(function (attr) {\n        return attr.topLevelAttribute;\n    });\n\n    // Possible values are: sizeType, color or empty.\n    var topLevelAttribute = topLevelArray.length ? topLevelArray[0].id : '';\n\n    // Determine all available attributes: sizeType, color, size, dimension\n    var allAttributes = [];\n    attrs.forEach(function (attr) {\n        allAttributes.push(attr.id);\n        if (attrsWithSwatches.indexOf(attr.id) > -1) {\n            processSwatchValues(attr, productObject, $productContainer, topLevelAttribute);\n        } else {\n            processNonSwatchValues(attr, $productContainer, topLevelAttribute);\n        }\n    });\n\n    // variantData and variantMatrix values are set in productDetails.isml and added to the\n    // window object. Values are indexed by the master PID so multiple Quickview windows\n    // are possible without overwriting these values.\n    var pid = productObject.masterId;\n    if (window.productCache && window.productCache[pid]) {\n        var variantData = window.productCache[pid].variantData;\n        var variantMatrix = window.productCache[pid].variantMatrix;\n\n        hideShowValidSwatches($productContainer, attrs, topLevelAttribute, allAttributes, variantData, variantMatrix);\n    }\n\n    hideColorPriceGroups($productContainer);\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n *\n * @param {Object} selectedAttributeID - attribute being updated\n */\nfunction updateAvailability(response, $productContainer, selectedAttributeID) {\n    var availabilityValue = '';\n    var availabilityMessages = response.product.availability.messages;\n    // this boolean is to hide the \"In Stock\" message on PDP page\n    var instockBool = response.product.availability.instock;\n    var velocityValue = '';\n    var velocityMessages = response.product.velocityMessage.messages;\n\n    // Adding the condition if price is null then \"Availability message\" should be disabled\n    if (!instockBool && response.product.readyToOrder && response.product.price.sales && response.product.price.sales.value && availabilityMessages.length) {\n        availabilityValue += '<div class=\"availability-msg__container alert__content\">';\n        availabilityMessages.forEach(function (message) {\n            availabilityValue += '<div class=\"message\">' + message.content + '</div>';\n        });\n        availabilityValue += '</div>';\n    }\n\n    // Reset Notify Me form and messages\n    $('.notifyMeFormMessage').hide();\n    $('.js-notifyMeFormContainer').hide();\n\n    if (velocityMessages.length) {\n        velocityValue += '<div class=\"velocity-msg__container\">';\n        velocityMessages.forEach(function (message) {\n            velocityValue += $('<div/>', {\n                class: message.cssClass ? message.cssClass : '',\n                text: message.text\n            })[0].outerHTML;\n        });\n        velocityValue += '</div>';\n        // Reveal \"Notify Me\" button and update variant ID\n        $('.notify-me.btn').show().data('cta', 'showForm').data('pid', response.product.id);\n    } else {\n        // hide notify me messages and button\n        $('.product__message--velocity').hide();\n        $('.notify-me.btn').hide();\n    }\n\n    // Remove initial loading state class\n    $('.js-attribute').removeClass('loading-opacity');\n\n    $($productContainer).trigger('product:updateAvailability', {\n        product: response.product,\n        $productContainer: $productContainer,\n        selectedAttributeID: selectedAttributeID,\n        message: availabilityValue,\n        availabilityMessages,\n        resources: response.resources,\n        velocityMessage: velocityValue\n    });\n}\n\n/**\n * Make \"notify me\" status visible on variant swatches\n */\nfunction setVariantNotifyMeStatus() {\n    const variantMaster = $('.product-detail').data('master-pid');\n    const colorSwatchID = $('.js-attribute-value.selected').data('attr-value');\n\n    // In checkout, this object does not exist, causing an error to be thrown in the console.\n    if (!window.productCache) {\n        return;\n    }\n\n    const colorSwatchVariantArray = window.productCache[variantMaster].variantMatrix.color[colorSwatchID];\n\n    if (colorSwatchVariantArray) {\n        // Lookup variant sizes\n        colorSwatchVariantArray.forEach(function (variant) {\n            const variantSize = window.productCache[variantMaster].variantData[variant].size;\n            const variantNotifyMe = window.productCache[variantMaster].variantData[variant].bisnflag;\n            const $swatch = $('.js-size-swatch[data-attr-hover=\"' + variantSize + '\"]');\n\n            // Flag swatches to indicate notify me status (see forceOOSNotifyMe)\n            $swatch.toggleClass('js-notifyme-swatch', !!variantNotifyMe);\n        });\n    }\n}\n\n/**\n * Force notify me message to display if all variants are OOS\n */\nfunction forceOOSNotifyMe() {\n    const $notifymeVariant = $('.js-notifyme-swatch.selected');\n    const allOOS = $notifymeVariant.length &&\n                   $('.js-size-swatch.unselectable').length === $('.js-size-swatch').length;\n\n    if (allOOS && $('.js-notifyMeFormContainer').is(':empty')) {\n        const selectedAttributeID = $notifymeVariant.closest('.js-attribute').data('attr');\n        const velocityMessage = $('.selectswatch-size-msg').text();\n        const pid = $('.product-detail').data('pid');\n        let $productContainer = $notifymeVariant.closest('.set-item');\n\n        if (!$productContainer.length) {\n            $productContainer = $notifymeVariant.closest('.product-detail');\n        }\n\n        $(window).trigger('product:triggerNotifyMe', { hideForm: true });\n\n        $($productContainer).trigger('product:updateAvailability', {\n            product: {\n                id: pid,\n                notifyme: true\n            },\n            $productContainer: $productContainer,\n            selectedAttributeID: selectedAttributeID,\n            velocityMessage: velocityMessage\n        });\n    }\n}\n\n/**\n * Generates callout message html for promotions\n *\n * @param {array} promotions - list of promotions\n * @return {string} - Compiled HTML\n */\nfunction getPromotionCalloutHtml(promotions) {\n    if (!promotions) {\n        return '';\n    }\n\n    var html = '';\n\n    promotions.forEach(function (promotion) {\n        // Verify that these are not member exclusive promotions and that calloutMsg has a valid value\n        // promotion.details is optional\n        if (!promotion.isExclusive) {\n            promotion.callOutMessageDisplayPages.forEach(function (displayPage) {\n                if (displayPage.value === 'PDP' && promotion.calloutMsg) {\n                    html += `<div class=\"callout\" title=\"${promotion.details}\">${promotion.calloutMsg}</div>`;\n                }\n            });\n        }\n    });\n\n    return html;\n}\n\n/**\n * Generates callout message html for exclusive member promotions\n *\n * @param {Object} promotion - promotion\n * @return {string} - Compiled HTML\n */\nfunction getExclusivePromotionCalloutHtml(promotion) {\n    if (!promotion || !promotion.callOutMessageDisplayPages) {\n        return '';\n    }\n\n    var html = '';\n\n    // Verify that these are member exclusive promotions and that calloutMsg has a valid value\n    // promotion.details is optional\n    promotion.callOutMessageDisplayPages.forEach(function (displayPage) {\n        if (displayPage.value === 'PDP' && promotion.calloutMsg) {\n            const highlightClass = promotion.messageHighlight ? 'callout--highlight' : '';\n\n            if (promotion.calloutOpenAccount) {\n                html += `\n                    <button class=\"callout ${highlightClass} btn btn-link js-open-account\" title=\"${promotion.details}\">\n                        ${promotion.calloutMsg}\n                    </button>`;\n            } else {\n                html += `<div class=\"callout ${highlightClass}\" title=\"${promotion.details}\">${promotion.calloutMsg}</div>`;\n            }\n        }\n    });\n\n    return html;\n}\n\n/**\n * Change product primary images when user hovers on color swatches\n * @param {Object} images - images to be updated\n * @param {Object} $productContainer - Product Details container reference\n */\nfunction onColorVariantHover(images, $productContainer) {\n    // Update primary images\n    if (images) {\n        const $imageGalleries = $productContainer.find('.js-product-gallery, .js-product-gallery-thumb');\n        const retinaEnabled = window.resources.images.retinaEnabled || false;\n        const hiresImgUrlParams = window.resources.images.hiresImgUrlParams;\n        const pdpImgUrlParams = window.resources.images.pdpProductImgAppend;\n        const badgeData = $productContainer.data('badge');\n        const pdpTechBadgeData = $productContainer.data('pdp-tech-badge');\n        const isQuickView = $productContainer.hasClass('product-quickview');\n        const enableStylitics = window.resources.stylitics && window.resources.stylitics.enabled;\n        const MAX_QV_IMG_COUNT = 8; // Limit number of images on quickview\n\n        $imageGalleries.each(function () {\n            const $imageGallery = $(this);\n            const $swiperWrapper = $imageGallery.find('.swiper-wrapper');\n            const swiperSlideStyle = $swiperWrapper.find('.swiper-slide').first().attr('style') || '';\n            const isThumbnail = $imageGallery.hasClass('js-product-gallery-thumb');\n            let imageAltIdx = 1;\n\n            $swiperWrapper.empty();\n\n            for (let idx = 0; idx < images.length; idx++) {\n                let imageData = images[idx];\n                if (isQuickView && idx === MAX_QV_IMG_COUNT) {\n                    break;\n                }\n\n                if (!imageData) {\n                    continue;\n                }\n\n                let url = imageData.url;\n                const alt = imageData.alt;\n                const width = imageData.width;\n                const height = imageData.height;\n                const badgeHTML = Badge.displayBadge(badgeData);\n                const techBadgeHTML = Badge.displayTechBadge(pdpTechBadgeData);\n                let swiperSlideClass = '';\n                let $swiperSlide;\n                let $swiperImg;\n                let $zoomControls;\n                let $styliticsLink;\n\n                if (url.indexOf('scene7') > 0 && url.indexOf('?') <= 0) {\n                    url += pdpImgUrlParams;\n                }\n\n                if (idx === 0) {\n                    swiperSlideClass = isThumbnail ? 'swiper-slide-thumb-active' : 'swiper-slide-active';\n                } else if (idx === 1) {\n                    swiperSlideClass = 'swiper-slide-next';\n                }\n\n                if (imageData.videoUrl) {\n                    swiperSlideClass += ' swiper-slide-video';\n                } else {\n                    swiperSlideClass += ' js-product-image';\n                }\n\n                $swiperSlide = $(`<li class=\"swiper-slide ${swiperSlideClass}\" style=\"${swiperSlideStyle}\" data-index=\"${idx}\"></li>`);\n\n                if (imageData.videoUrl) {\n                    if (isThumbnail) {\n                        $swiperImg = $(`\n                            <picture>\n                                <img\n                                    src=\"${imageData.url}\"\n                                    alt=\"Thumbnail: ${imageData.productVideoAltText || alt}\"\n                                    itemprop=\"image\" />\n                            </picture>\n                            <svg class=\"svgicon video-icon text-white\"><use href=\"#play\"></use></svg>\n                        `);\n                    } else {\n                        $swiperImg = $(`\n                            <video autoplay loop playsinline muted poster=\"${imageData.posterUrl}\" class=\"img-fluid\" name=\"${imageData.productVideoAltText || alt}\">\n                                <source src=\"${imageData.videoUrl}\" type=\"video/mp4\" />\n                            </video>\n                        `);\n                    }\n                } else {\n                    var onModelAttribute = imageData.modelData ? `data-onmodel=\"${encodeURIComponent(imageData.modelData)}\"` : '';\n\n                    // Do not attach zoom controls for QuickView\n                    $zoomControls = !isQuickView && !isThumbnail ? $(`\n                        <button class=\"swiper-controls__zoom btn-icon js-pdp-gallery-zoom\">\n                            <svg class=\"swiper-controls__icon-zoom--in\" width=\"24\" height=\"24\">\n                                <use href=\"#zoom_in\"></use>\n                            </svg>\n                            <svg class=\"swiper-controls__icon-zoom--out\" width=\"24\" height=\"24\">\n                                <use href=\"#zoom_out\"></use>\n                            </svg>\n                        </button>\n                    `) : null;\n\n                    // Do not attach stylitics jumplink for QuickView\n                    $styliticsLink = enableStylitics && !isQuickView && !isThumbnail ? $(`\n                        <div class=\"stylitics-jumplink js-stylitics-jumplink\">\n                            <span class=\"stylitics-jumplink-text\">\n                                ${window.resources.stylitics.jumplinkCta}\n                            </span>\n                            <svg class=\"svgicon\" width=\"24\" height=\"24\">\n                                <use href=\"#expand_more\"></use>\n                            </svg>\n                        </div>\n                    `) : '';\n\n                    if (isThumbnail) {\n                        $swiperImg = $(`\n                            <img\n                                src=\"${url}\"\n                                srcset=\"${retinaEnabled && imageData.retinaUrl ? imageData.retinaUrl + ' 2x' : ''}\"\n                                alt=\"${'Thumbnail: ' + alt + ', image ' + imageAltIdx++}\"\n                                class=\"js-model-image\"\n                                itemprop=\"image\"\n                                data-lowres=\"${url}\"\n                                data-hires=\"${url.split('?')[0] + hiresImgUrlParams}\"\n                                ${onModelAttribute}\n                                width=\"${width}\"\n                                height=\"${height}\"\n                                onerror=\"window.imageError(this, ${retinaEnabled ? '\\'retina\\'' : '\\'large\\''})\"\n                            />\n                        `);\n                    } else {\n                        $swiperImg = $(`\n                            <div class=\"slide-container\">\n                                ${badgeHTML}\n                                ${techBadgeHTML}\n                                <div class=\"swiper-zoom-container\">\n                                    <img\n                                        src=\"${url}\"\n                                        srcset=\"${retinaEnabled && imageData.retinaUrl ? imageData.retinaUrl + ' 2x' : ''}\"\n                                        alt=\"${alt + ', image ' + imageAltIdx++}\"\n                                        class=\"js-model-image\"\n                                        itemprop=\"image\"\n                                        data-lowres=\"${url}\"\n                                        data-hires=\"${url.split('?')[0] + hiresImgUrlParams}\"\n                                        ${onModelAttribute}\n                                        width=\"${width}\"\n                                        height=\"${height}\"\n                                        onerror=\"window.imageError(this, ${retinaEnabled ? '\\'retina\\'' : '\\'large\\''})\"\n                                    />\n                                </div>\n                            </div>\n                        `);\n                    }\n                }\n\n                $swiperImg.append($zoomControls);\n                $swiperImg.append($styliticsLink);\n                $swiperSlide.append($swiperImg);\n                $swiperSlide.appendTo($swiperWrapper);\n            }\n\n            this.swiper.update();\n            this.swiper.slideTo(0);\n        });\n\n        $('body').trigger('product:afterImageGalleryUpdate');\n    }\n}\n\n/**\n * Create sketchfab asset\n * @param {Object} assetData - assets to be updated\n * @param {boolean} isThumbnail - if asset is a thumbnail\n * @return {jQuery} $asset\n */\nfunction createSketchfabAsset(assetData, isThumbnail) {\n    let $asset;\n\n    if (isThumbnail) {\n        $asset = $(`\n            <li class=\"swiper-slide\">\n                <svg class=\"img-fluid\"><use xlink:href=\"#360icon\"></use></svg>\n            </li>\n        `);\n    } else {\n        $asset = $(`\n            <li id=\"pdp3Dsketch\" class=\"swiper-slide\">\n                <iframe class=\"lazy\" width=\"640\" height=\"480\" src=\"https://sketchfab.com/models/${assetData.modelId}/embed\" frameborder=\"0\" allow=\"autoplay; fullscreen; vr\" mozallowfullscreen=\"true\" webkitallowfullscreen=\"true\"></iframe>\n            </li>\n        `);\n    }\n\n    return $asset;\n}\n\n/**\n * Create video asset\n * @param {Object} assetData - assets to be updated\n * @param {boolean} isThumbnail - if asset is a thumbnail\n * @return {jQuery} $asset\n */\nfunction createVideoAsset(assetData, isThumbnail) {\n    let $asset;\n    let $swiperContent;\n\n    if (isThumbnail) {\n        $asset = $(`\n            <li class=\"swiper-slide swiper-slide-video\">\n                <svg class=\"svgicon video-icon text-white\"><use href=\"#play\"></use></svg>\n            </li>\n        `);\n    } else {\n        $asset = $(`<li class=\"swiper-slide swiper-slide-video js-video-player video-play-button\" data-video-id=\"${assetData.videoID}\" data-host=\"${assetData.videoType}\"></li>`);\n    }\n\n    $swiperContent = $(`\n        <picture>\n            <img\n                src=\"${assetData.productVideoThumbnail}\"\n                alt=\"${assetData.productVideoThumbnailAltText}\"\n                itemprop=\"image\" />\n        </picture>\n    `);\n\n    $asset.prepend($swiperContent);\n\n    return $asset;\n}\n\n/**\n * Create asset slide and thumbnail\n * @param {Object} assetData - assets to be updated\n * @param {string} assetType - Asset type: video or sketchfab\n */\nfunction createSwiperAssets(assetData, assetType) {\n    const $imageGalleries = $mainPDPGallery.closest('.primary-images').find('.js-product-gallery, .js-product-gallery-thumb');\n\n    $imageGalleries.each(function () {\n        const $imageGallery = $(this);\n        const $wrapper = $imageGallery.find('.swiper-wrapper');\n        const isThumbnail = $imageGallery.hasClass('js-product-gallery-thumb');\n        let $swiperSlide;\n\n        if (assetType === 'sketchfab') {\n            $swiperSlide = createSketchfabAsset(assetData, isThumbnail);\n        } else if (assetType === 'video') {\n            $swiperSlide = createVideoAsset(assetData, isThumbnail);\n        } else {\n            return;\n        }\n\n        $wrapper.append($swiperSlide);\n        this.swiper.update();\n    });\n}\n\n/**\n * Create asset element\n * @param {Object} assetData - asset to be updated\n * @param {string} assetType - Asset type: video or sketchfab\n * @param {Object} $productContainer - for product container\n */\nfunction createAssets(assetData, assetType) {\n    if (assetData) {\n        createSwiperAssets(assetData, assetType);\n    }\n}\n\n/**\n * Create image container and hide existing images on products\n * @param {Object} images - images to be updated\n * @param {Object} $productContainer - Product Details container reference\n */\nfunction createImagesAndVideo(images, $productContainer) {\n    // Update primary images\n    if (images) {\n        onColorVariantHover(images, $productContainer);\n    }\n    var altText = window.productThumbnailAltText ? window.productThumbnailAltText : 'null';\n    if (window.product_VideoData) {\n        var productVideoData = window.product_VideoData;\n        var videoData = {\n            videoType: productVideoData.videoType,\n            videoID: productVideoData.videoID,\n            productVideoThumbnail: productVideoData.productVideoThumbnail,\n            productVideoThumbnailAltText: altText\n        };\n        createAssets(videoData, 'video');\n    }\n\n    // re-initialize video player after swiper update\n    $(document).trigger('video:player:update');\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n *     attributes have been selected.  Used partially to\n *     determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n * @param {Object} selectedAttributeID - attribute being updated\n */\nfunction handleVariantResponse(response, $productContainer, selectedAttributeID) {\n    const isChoiceOfBonusProducts = $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n    const $omnibusPrice = $('.omnibus-price');\n    let isVariant;\n\n    if (response.product.variationAttributes) {\n        updateAttrs(response.product, $productContainer);\n        isVariant = response.product.productType === 'variant';\n        if (isChoiceOfBonusProducts && isVariant) {\n            $productContainer.parent('.bonus-product-item')\n                .data('pid', response.product.id);\n\n            $productContainer.parent('.bonus-product-item')\n                .data('ready-to-order', response.product.readyToOrder);\n        }\n    }\n\n    if (selectedAttributeID === 'color' && !window.resources.enableServerSideGallery) {\n        const primaryImage = response.product.images.large;\n\n        // Update quickview/PDP primary images\n        if ($('.quickview-modal').length) {\n            createImagesAndVideo(primaryImage, $('.product-quickview'));\n        } else if ($mainPDPGallery.length) {\n            createImagesAndVideo(primaryImage, $('.product-detail'));\n        }\n\n        // Reset notify me status on variant swatches\n        setVariantNotifyMeStatus();\n    }\n\n    // Store attribute selections in the URL\n    if (!$('.product-quickview').length && selectedAttributeID !== 'inventory' && response.variantUrl) {\n        history.replaceState({ updatedAttr: selectedAttributeID }, '', response.variantUrl);\n    }\n\n    // Update linked sizes URLs with attribute selections\n    if (response.linkedSizesHtml) {\n        $('.js-ext-size-type').replaceWith(response.linkedSizesHtml);\n    }\n\n    // Update pricing\n    if (!isChoiceOfBonusProducts) {\n        const $priceSelector = $('.prices .price', $productContainer).length\n            ? $('.prices .price', $productContainer)\n            : $('.prices .price');\n        $priceSelector.replaceWith(response.product.price.html);\n    }\n\n    // Update Omnibus pricing\n    if (!response.product.lowestPrice30Days) {\n        $omnibusPrice.empty();\n    } else if ($omnibusPrice.length) {\n        $omnibusPrice.html(response.product.lowestPrice30Days.html);\n    }\n\n    // Update promotions\n    $('.promotions').html(getPromotionCalloutHtml(response.product.promotions));\n    $('.promotions').prepend(getExclusivePromotionCalloutHtml(response.product.exclusivePromotion));\n\n    if (isChoiceOfBonusProducts) {\n        const $selectButton = $productContainer.find('.select-bonus-product');\n        $selectButton.trigger('bonusproduct:updateSelectButton', {\n            product: response.product, $productContainer: $productContainer\n        });\n    } else {\n        // Enable \"Add to Cart\" button if all required attributes have been selected\n        $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n            product: response.product, $productContainer: $productContainer\n        }).trigger('product:statusUpdate', response.product);\n    }\n\n    updateAvailability(response, $productContainer, selectedAttributeID);\n}\n\n\n/**\n * Get the selected swatches from the DOM. This data is used as a fallback to\n * retain the current user selections. Exclude the clicked attribute.\n *\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {jQuery} selectedAttributeID - The attribute that was last clicked (so we can exclude it)\n * @return {Object} - The results\n */\nfunction getUserSelectedAttributes($productContainer, selectedAttributeID) {\n    var colorValue = $productContainer.find('.js-color-swatch.selected span').data('attr-value');\n    var sizeValue = $productContainer.find('.js-size-swatch.selected').data('attr-value');\n    var dimensionValue = $productContainer.find('.js-dimension-swatch.selected').data('attr-value');\n    var obj = {};\n    if (colorValue !== undefined || sizeValue !== undefined || dimensionValue !== undefined) {\n        if (colorValue !== undefined && selectedAttributeID !== 'color') {\n            obj['selection.color'] = colorValue;\n        }\n        if (sizeValue !== undefined && selectedAttributeID !== 'size') {\n            obj['selection.size'] = sizeValue;\n        }\n        if (dimensionValue !== undefined && selectedAttributeID !== 'dimension') {\n            obj['selection.dimension'] = dimensionValue;\n        }\n    }\n    return obj;\n}\n\n/**\n * dimension value append in URL parameter\n *\n * @param {string} selectedAttrUrl - the Url for the selected variation value\n * @return {string} - new selected variation value url\n */\nfunction appendDimensionParams(selectedAttrUrl) {\n    var $url = selectedAttrUrl;\n    var $dimensionSwatches = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch');\n    if ($dimensionSwatches.length > 0) {\n        if ($dimensionSwatches.length === 1 && $dimensionSwatches.hasClass('selected')) {\n            $url = $url + '&dwvar_' + $('.product-detail').data('pid') + '_dimension=' + $dimensionSwatches.data('attr-value');\n        } else if ($dimensionSwatches.length > 1) {\n            var $selectedAttr = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch.selectable');\n            if ($selectedAttr.length === 1 && $selectedAttr.hasClass('selected')) {\n                $url = $url + '&dwvar_' + $('.product-detail').data('pid') + '_dimension=' + $selectedAttr.data('attr-value');\n            } else {\n                $selectedAttr = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch.unselectable');\n                var len = $dimensionSwatches.length - $selectedAttr.length;\n                if (len === 1) {\n                    $selectedAttr = $('.product-detail').find('div.js-attribute-dimension .js-dimension-swatch.selected');\n                    if ($selectedAttr.length === 1) {\n                        $url = $url + '&dwvar_' + $('.product-detail').data('pid') + '_dimension=' + $selectedAttr.data('attr-value');\n                    }\n                }\n            }\n        }\n    }\n    return $url;\n}\n\n/**\n * - Appends or removes the old chemistry message on a specific UPC.\n * - Message will be appended right after the Prop 65 message\n * or at the end of the entire bulleted list if there is no Prop 65 message.\n * - Do nothing if the old chemistry message exists in the data object parameter,\n * but the message already exists in the DOM.\n * - If the no old chemistry message exists in the data object parameter,\n * then remove any existing old chemistry message from the DOM.\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction updateOldChemistryMessaging(data) {\n    var $existingOldChemistryListItem = $('.js-old-chemistry');\n\n    if (data.product && data.product.oldChemistryText) {\n        if (!$existingOldChemistryListItem.length) {\n            var $prop65ListItemElement = $('.accordion__details').find('.js-prop-65');\n            var oldChemistryListItemHTMLString = '<li class=\"pdp-list__item js-old-chemistry\">' + data.product.oldChemistryText + '</li>';\n\n            if ($prop65ListItemElement.length) {\n                $prop65ListItemElement.after(oldChemistryListItemHTMLString);\n            } else {\n                $('.pdp-list').append(oldChemistryListItemHTMLString);\n            }\n        }\n    } else {\n        $existingOldChemistryListItem.remove();\n    }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected\n *\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n * @param {string} selectedAttributeID - The ID of the swatch that was clicked (color, size, sizeType, dimension)\n */\nfunction attributeSelect(selectedValueUrl, $productContainer, selectedAttributeID) {\n    if (selectedValueUrl) {\n        const variantData = getUserSelectedAttributes($productContainer, selectedAttributeID);\n        const galleryURL = (selectedAttributeID === 'color' && $('.js-color-swatch[data-attr-url=\"' + selectedValueUrl + '\"]').data('attr-gallery-url')) || null;\n\n        $('body').trigger('product:beforeAttributeSelect', { url: selectedValueUrl, container: $productContainer });\n\n        if (selectedAttributeID === 'color' && window.resources.enableServerSideGallery && galleryURL) {\n            $.ajax({\n                url: galleryURL,\n                method: 'GET',\n                data: variantData,\n                success: function (data) {\n                    const $$productGalleryContainer = $productContainer.find('.primary-images');\n\n                    if (data && $$productGalleryContainer.length) {\n                        const $productGallery = $$productGalleryContainer.find('.js-product-gallery');\n                        const $productGalleryThumb = $$productGalleryContainer.find('.js-product-gallery-thumb');\n\n                        if ($productGallery.length && $productGalleryThumb.length) {\n                            $productGallery[0].swiper.destroy();\n                            $productGalleryThumb[0].swiper.destroy();\n                        }\n\n                        $$productGalleryContainer.replaceWith(data);\n                        $(document).trigger('product:swiper:update');\n                    }\n                }\n            });\n        }\n\n        $.ajax({\n            url: selectedValueUrl,\n            method: 'GET',\n            data: variantData, // This data used as fallback to retain current user selections\n            success: function (data) {\n                if (data) {\n                    handleVariantResponse(data, $productContainer, selectedAttributeID);\n                    if (window.preQuickViewModalDigitalData && 'dtmLayer' in data && 'digitalData' in window) {\n                        // Updating only the product object in the digital data when variations are selected from the quick view modal.\n                        if (data.dtmLayer.page && window.digitalData.page) {\n                            window.digitalData.page.product = data.dtmLayer.page.product;\n                        }\n                    } else if ('dtmLayer' in data && 'digitalData' in window) {\n                        if (data.dtmLayer.page) {\n                            window.digitalData.page = data.dtmLayer.page;\n                        }\n                        if (data.dtmLayer.user) {\n                            window.digitalData.user = data.dtmLayer.user;\n                        }\n                        if (data.dtmLayer.cart) {\n                            window.digitalData.cart = data.dtmLayer.cart;\n                        }\n                    }\n\n                    $('body').trigger('product:afterAttributeSelect', { data: data, container: $productContainer });\n\n                    // using native JS .dispatchEvent() rather than jQuery .trigger()\n                    // so that Adobe Launch can listen for this custom event.\n                    document.body.dispatchEvent(new CustomEvent('product:afterAttributeSelect:dtm', {\n                        detail: {\n                            // data: data, // optionally, we can send the data to Launch rather than have it pull it from digitalData\n                            attributeType: selectedAttributeID\n                        }\n                    }));\n\n                    updateOOSColorVariants($productContainer);\n                    onModel.triggerOnModelDescription();\n\n                    updateOldChemistryMessaging(data);\n                }\n                $.spinner().stop();\n            },\n            error: function () {\n                $.spinner().stop();\n            }\n        });\n    }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n    return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n    var $html = $('<div>').append($.parseHTML(html));\n\n    var body = $html.find('.choice-of-bonus-product');\n    var footer = $html.find('.modal-footer').children();\n\n    return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n    $.spinner().start();\n    $('#chooseBonusProductModal').remove();\n\n    const bonusUrl = data.bonusChoiceRuleBased ? data.showProductsUrlRuleBased : data.showProductsUrlListBased;\n    const htmlString = utils.createModalMarkup('', {\n        modalId: 'chooseBonusProductModal',\n        title: data.labels.selectprods,\n        customClasses: 'choose-bonus-product-dialog'\n    });\n    $('body').append(htmlString);\n    $('#chooseBonusProductModal .modal-dialog').data({\n        'total-qty': data.maxBonusItems,\n        UUID: data.uuid,\n        pliUUID: data.pliUUID,\n        addToCartUrl: data.addToCartUrl,\n        pageStart: 0,\n        pageSize: data.pageSize,\n        moreURL: data.showProductsUrlRuleBased,\n        bonusChoiceRuleBased: data.bonusChoiceRuleBased\n    });\n\n    $.ajax({\n        url: bonusUrl,\n        method: 'GET',\n        dataType: 'html',\n        success: function (html) {\n            var parsedHtml = parseHtml(html);\n            $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n            $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n            $('#chooseBonusProductModal').modal('show');\n            $.spinner().stop();\n        },\n        error: function () {\n            $.spinner().stop();\n        }\n    });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n    if (response && $.isNumeric(response.quantityTotal)) {\n        $(document).trigger('minicart:updatecount', response.quantityTotal);\n    }\n\n    // vars defined to make if/else logic easier to read\n    let isReservable = response.reservableProduct;\n    let hasError = response.error;\n\n    if (isReservable) {\n        // reservation banner\n        let reservationTimerHelper = require('../components/reservationTimer');\n        reservationTimerHelper.updateReservationData(response);\n    } else if (hasError) {\n        if ($('.quickview-modal').length) {\n            // Add to cart errors pop down a banner under the modal header\n            $('.quickview-modal .modal-body').alert({\n                content: `${response.message}`,\n                theme: 'danger',\n                customClass: 'mt-0 text-center',\n                attachment: 'before',\n                icon: '',\n                dismissible: false\n            });\n        }\n    } else {\n        // minicart\n        $(document).trigger('minicart:show');\n\n        var hideMinicartTimeout = setTimeout(function () {\n            $(document).trigger('minicart:hide');\n        }, 7000);\n\n        $('body').one('mouseenter', '.minicart-drawer', function () {\n            clearTimeout(hideMinicartTimeout);\n        });\n    }\n\n    if ('_satellite' in window && 'dtmEvent' in response) {\n        if (!!response.dtmEvent && response.dtmEvent.length) {\n            response.dtmEvent.forEach((action) => {\n                _satellite.track(action.event, action.data); //eslint-disable-line\n            });\n        }\n    }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n    var childProducts = [];\n    $('.bundle-item').each(function () {\n        childProducts.push({\n            pid: $(this).find('.product-id').data('pid'),\n            quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n        });\n    });\n\n    return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n    var options = $productContainer\n        .find('.product-option')\n        .map(function () {\n            var $elOption = $(this).find('.options-select');\n            var urlValue = $elOption.val();\n            var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n                .data('value-id');\n            return {\n                optionId: $(this).data('option-id'),\n                selectedValueId: selectedValueId\n            };\n        }).toArray();\n\n    return JSON.stringify(options);\n}\n\n/**\n * Test to see if all available product attributes have been selected\n *\n * @param {jQuery} $addToCartButton - add to cart button that was clicked\n * @returns {boolean} Have all needed selections been made?\n */\nfunction isEverythingSelected($addToCartButton) {\n    let $swatchAttributes;\n    const commonParentSelector = '.js-product-content';\n    const swatchGroupSelectors = '.js-color-attribute, .js-size-attribute, .js-dimension-attribute';\n\n    if ($addToCartButton) {\n        $swatchAttributes = $addToCartButton.closest(commonParentSelector).find(swatchGroupSelectors);\n    } else {\n        $swatchAttributes = $(swatchGroupSelectors);\n    }\n\n    let allAttributesSelected = true;\n    $swatchAttributes.each(function () {\n        let $thisAttribute = $(this);\n        if (!$thisAttribute.find('.selected').length) {\n            allAttributesSelected = false;\n        }\n    });\n\n    return allAttributesSelected;\n}\n\n/**\n * Add positioning class to popup if necessary.\n * @param {jQuery} $el - DOM element parent element\n * @param {jQuery} $popup - DOM element current popup\n */\nfunction popupAlignment($el, $popup) {\n    var viewportWidth = $(window).width();\n    var positionLeft = $el.offset().left;\n    var elementWidth = $el.outerWidth();\n    var elementCenter = positionLeft + (elementWidth / 2);\n    var popupHalfWidth = $popup.outerWidth() / 2;\n    var left = elementCenter <= popupHalfWidth;\n    var right = popupHalfWidth > (viewportWidth - elementCenter);\n\n    $popup[left ? 'addClass' : 'removeClass']('left-arrow');\n    $popup[right ? 'addClass' : 'removeClass']('right-arrow');\n}\n\n/**\n * Prana Only: Show out of stock popup on size swatch\n * @param {jQuery} $sizeSwatch - DOM element\n * @param {string} eventType - Event type\n */\nfunction showOutOfStockPopup($sizeSwatch, eventType) {\n    // TODO: Needs information about \"Shop Our Partners\" functionality.\n    var $popup = $sizeSwatch.find('.product-outofstock__popup');\n\n    if ($popup.length) { // This only applicable for Prana\n        var thisSwatch = $sizeSwatch;\n\n        if (eventType === 'addToCart') {\n            // Desktop/Mobile: Show \"Sold Out\" popup after clicking these \"Add to Cart/Out of Stock\" button.\n            popupAlignment($sizeSwatch, $popup);\n            $popup.removeClass('invisible');\n            setTimeout(function () {\n                $(thisSwatch).find('.product-outofstock__popup').addClass('invisible');\n            }, 3000);\n        } else if (breakpoints.isLowRes()) {\n            // Mobile: Opens on click.\n            if (eventType === 'click') {\n                popupAlignment($sizeSwatch, $popup);\n                $popup.removeClass('invisible');\n                $(document).one('click', function () {\n                    $(thisSwatch).find('.product-outofstock__popup').addClass('invisible');\n                });\n            }\n        } else {\n            // Desktop: Opens on hover.\n            if (eventType === 'mouseenter') { // eslint-disable-line\n                popupAlignment($sizeSwatch, $popup);\n                $popup.removeClass('invisible');\n            } else if (eventType === 'mouseleave') {\n                popupAlignment($sizeSwatch, $popup);\n                $popup.addClass('invisible');\n            }\n        }\n    }\n}\n\n/**\n * Restores the digitalData object.\n * @param {Object} data The data to set in the digitalData object\n */\nfunction restoreDTM(data) {\n    if (!!data && 'digitalData' in window) {\n        const propsToUpdate = ['pageInstanceID', 'page', 'user'];\n        propsToUpdate.forEach((prop) => {\n            if (data[prop]) {\n                window.digitalData[prop] = data[prop];\n            }\n        });\n        delete window.preQuickViewModalDigitalData;\n    }\n}\n\n/**\n * Handle click on button.add-to-cart when it is disabled\n */\nfunction onClickAddToCartButtonDisabled() {\n    var $productContainer = $(this).closest('.product-detail');\n\n    // Scrolls to the top of the product__attributes section if they are not all set.\n    // offset to view all product attributes after alert disapears.\n    var offset = $('.siteheader').outerHeight();\n    $('.product__attributes').scrollTo(offset, 750); // TODO: GSD-11472 - can we just listen for the alert.closed event?\n\n    // Reveal \"Select a size\" message.\n    var $sizeSwatchSelected = $productContainer.find('.js-attribute-size .selected');\n    var isSizeSwatchSelected = $sizeSwatchSelected.length;\n    if (!isSizeSwatchSelected) {\n        $('.selectswatch-size-msg', $productContainer).removeClass('d-none');\n    }\n\n    // Reveal any \"Sold Out\" messaging.\n    if ($sizeSwatchSelected.find('.product-outofstock__popup').length) {\n        // For Prana reveal the popup \"Sold Out\" message.\n        $('body').trigger('product:showOutOfStockPopup', $sizeSwatchSelected);\n    } else {\n        // For other brands, reveal \"Sold Out\" div if they are not empty\n        $('.product__message--velocity:parent', $productContainer).show();\n        $('.outofstock-combination-msg:parent', $productContainer).show();\n    }\n    $('.accordion').trigger('collapse-changed'); // Refresh hc-sticky to avoid ovelaping content if velocity message appears.\n}\n\n/**\n * Handles disabled add to cart button interactions\n */\nfunction disabledAddToCartHandler() {\n    if ($('.add-to-cart__container .btn-add-to-cart').eq(0).prop('disabled')) { // if add to cart button is disabled\n        var $dimElement = $('.js-dimension-attribute');\n        var $sizeElement = $('.js-size-attribute');\n\n        if ($dimElement.length) {\n            $('.selectswatch-dimension-msg').toggleClass('d-none', !!$dimElement.find('a.selected').length);\n        }\n\n        if ($sizeElement.length) {\n            $('.selectswatch-size-msg').toggleClass('d-none', !!$sizeElement.find('a.selected').length);\n        }\n\n        onClickAddToCartButtonDisabled();\n    }\n}\n\n/**\n * Updates attribute label on swatch interaction\n * @param {jQuery} $swatch swatch element that was interacted with\n */\nfunction updateSwatchAttributeLabel($swatch) {\n    let selectedValue;\n    const attrType = $swatch.closest('.js-attribute').data('attr');\n\n    if (attrType === 'color') {\n        selectedValue = $swatch.find('.color-value').attr('title');\n    } else {\n        selectedValue = $swatch.data('attr-hover');\n    }\n\n    if (selectedValue !== undefined) {\n        $swatch.closest('.js-attribute').find('.js-attr-label-value').text(selectedValue);\n    }\n}\n\nmodule.exports = {\n    initExclusiveEvents: function () {\n        $(document).on('click', '.js-open-account', function (e) {\n            const qvPid = $(e.target).closest('.product-quickview').data('pid');\n\n            if (qvPid) {\n                $(document).on('form:preauth:success.quickview', 'form.authGateway', function () {\n                    sessionStorage.setItem('quickview', qvPid);\n                });\n\n                $(document).on('click.quickview', '.js-loyalty-banner-signup-btn', function () {\n                    sessionStorage.setItem('quickview', qvPid);\n                });\n\n                // if drawer is closed assume user does not want to sign in/join now\n                // remove event listeners and session storage for reopening quickview\n                $(document).on('hide.drawer', function () {\n                    $(document).off('.quickview');\n                    sessionStorage.removeItem('quickview');\n                });\n            }\n\n            $(document).trigger('accountDrawer:show');\n        });\n    },\n    isEverythingSelected: isEverythingSelected,\n    attributeSelect: attributeSelect,\n    updateOOSColorVariants: updateOOSColorVariants,\n    methods: {\n        editBonusProducts: function (data) {\n            chooseBonusProducts(data);\n        }\n    },\n    selectAttribute: function () {\n        $('.product-detail').find('.js-attribute a.selected').each(function () {\n            updateSwatchAttributeLabel($(this));\n        });\n\n        // js event listener that accepts an html swatch element and runs attributeSelect() code to select that swatch\n        document.body.addEventListener('selectAttribute', function (e) {\n            const $swatch = $(e.detail);\n\n            if ($swatch) {\n                const url = $swatch.data('attr-url');\n                const $container = $swatch.closest('.product-detail');\n                const attrType = $swatch.closest('.js-attribute').data('attr');\n\n                attributeSelect(url, $container, attrType);\n            }\n        });\n\n        $(document).on('click touchend', '.product-detail .js-swatch', function (e) {\n            e.preventDefault();\n            const $swatchClicked = $(e.currentTarget);\n\n            if ($swatchClicked.not('.js-notifyme-swatch').hasClass('selected') || $swatchClicked.hasClass('invalid') || $swatchClicked.hasClass('not-orderable')) {\n                return;\n            }\n\n            $swatchClicked.off('mouseleave');\n            $swatchClicked.trigger('attribute:click');\n\n            updateSwatchAttributeLabel($swatchClicked);\n\n            let $productContainer = $swatchClicked.closest('.set-item');\n            if (!$productContainer.length) {\n                $productContainer = $swatchClicked.closest('.product-detail');\n            }\n\n            const selectedAttributeID = $(this).closest('.js-attribute').data('attr');\n\n            let $selectedAttrUrl = $swatchClicked.data('attr-url');\n            if (selectedAttributeID === 'size') {\n                $selectedAttrUrl = appendDimensionParams($selectedAttrUrl);\n            }\n\n            attributeSelect($selectedAttrUrl, $productContainer, selectedAttributeID);\n        });\n\n        // Color Swatch hover effects\n        $(document).off('mouseenter').on('mouseenter', '.product-detail .js-swatch', function (e) {\n            if (breakpoints.isHighRes()) {\n                const $swatchEntered = $(e.currentTarget);\n\n                // do not reload selected swatch\n                if ($swatchEntered.hasClass('selected')) return;\n\n                const currentLabelText = $swatchEntered.closest('.js-attribute').find('.js-attr-label-value').text();\n\n                updateSwatchAttributeLabel($swatchEntered);\n\n                $swatchEntered.one('mouseleave', function () {\n                    $swatchEntered.closest('.js-attribute').find('.js-attr-label-value').text(currentLabelText);\n                });\n            }\n        });\n\n        // Prana only: \"Sold Out\" popup which appears when hovering/clicking on an out of stock size/dimension swatch.\n        $(document).on('mouseenter mouseleave click', '.product-detail .js-size-swatch.unselectable, .product-detail .js-dimension-swatch.unselectable', function (e) {\n            showOutOfStockPopup($(this), e.type);\n        });\n\n        $('body').on('product:showOutOfStockPopup', function (e, sizeSwatch) {\n            showOutOfStockPopup($(sizeSwatch), 'addToCart');\n        });\n    },\n    quickViewSwatchFunctionality: function () {\n        // On Page Load if a color/size/dimension is selected display the Swatch value in the label\n        $('.quickview-modal .product-detail .js-attribute a.selected').each(function () {\n            updateSwatchAttributeLabel($(this));\n        });\n    },\n    availability: function () {\n        /**\n         * Quantity change event for the productlineitems\n         * extended with pickupinstore\n         */\n        $(document).on('change', '.quantity-select', function (e) {\n            e.preventDefault();\n\n            var searchPID = $(this).closest('.product-detail').attr('data-pid');\n            var selectorPrefix = '.product-detail[data-pid=\"' + searchPID + '\"]';\n\n            if ($(selectorPrefix + ' .selected-store-with-inventory').is(':visible')) {\n                return;\n            }\n\n            var $productContainer = $(this).closest('.product-detail');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n            }\n\n            if ($('.bundle-items', $productContainer).length === 0) {\n                base.attributeSelect($(e.currentTarget).find('option:selected').data('url'), $productContainer);\n            }\n        });\n    },\n\n    addToCart: function () {\n        $(document).off('click', 'button.add-to-cart, button.add-to-cart-global').on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n            var addToCartUrl;\n            var pid;\n            var pidsObj;\n            var setPids;\n            var $addToCartButton = $(this);\n\n            if (!isEverythingSelected($addToCartButton)) {\n                $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').attr('disabled', true);\n                disabledAddToCartHandler();\n                $.spinner().stop();\n            } else {\n                $('body').trigger('product:beforeAddToCart', this);\n\n                if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n                    setPids = [];\n\n                    $('.product-detail').each(function () {\n                        if (!$(this).hasClass('product-set-detail')) {\n                            setPids.push({\n                                pid: $(this).find('.product-id').data('pid'),\n                                qty: 1,\n                                options: getOptions($(this))\n                            });\n                        }\n                    });\n                    pidsObj = JSON.stringify(setPids);\n                }\n\n                pid = getPidValue($(this));\n\n                var $productContainer = $(this).closest('.product-detail');\n                if (!$productContainer.length) {\n                    $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n                }\n\n                addToCartUrl = getAddToCartUrl();\n\n                var form = {\n                    pid: pid,\n                    pidsObj: pidsObj,\n                    childProducts: getChildProducts(),\n                    quantity: 1\n                };\n\n                if (!$('.bundle-item').length) {\n                    form.options = getOptions($productContainer);\n                }\n\n                $(this).trigger('updateAddToCartFormData', form);\n                if (addToCartUrl) {\n                    $.ajax({\n                        url: addToCartUrl,\n                        method: 'POST',\n                        data: form,\n                        success: function (data) {\n                            $.spinner().stop();\n                            handlePostCartAdd(data);\n                            if (!data.error) {\n                                $('body').trigger('product:afterAddToCart', data);\n                                window.dispatchEvent(new Event('cart:updated:dtm'));\n                            }\n                            if (window.preQuickViewModalDigitalData) {\n                                // Restoring the digital data back to that of CLP page before opening the quick view modal.\n                                window.preQuickViewModalDigitalData = JSON.parse(window.preQuickViewModalDigitalData);\n                                setTimeout(function () {\n                                    restoreDTM(window.preQuickViewModalDigitalData);\n                                }, 1000);\n                            } else if (data.dtmLayer && 'digitalData' in window) {\n                                if (data.dtmLayer.page) {\n                                    window.digitalData.page = data.dtmLayer.page;\n                                }\n                                if (data.dtmLayer.user) {\n                                    window.digitalData.user = data.dtmLayer.user;\n                                }\n                            }\n                            if (data.dtmLayer && data.dtmLayer.cart && 'digitalData' in window) {\n                                window.digitalData.cart = data.dtmLayer.cart;\n                                minicartSaleItemAlertBadge.toggleAlertBadge();\n                            }\n                        },\n                        error: function () {\n                            $.spinner().stop();\n                        }\n                    });\n                }\n            }\n        });\n    },\n    getPidValue: getPidValue,\n    setVariantNotifyMeStatus: setVariantNotifyMeStatus,\n    forceOOSNotifyMe: forceOOSNotifyMe,\n    overviewInit: Overview.init()\n};\n","'use strict';\n\nmodule.exports = function (include) {\n    if (typeof include === 'function') {\n        include();\n    } else if (typeof include === 'object') {\n        Object.keys(include).forEach(function (key) {\n            if (typeof include[key] === 'function') {\n                include[key]();\n            }\n        });\n    }\n};\n","'use strict';\n\nconst Swiper = require('swiper/swiper-bundle.min.js');\nconst breakpoints = require('../components/breakpoints');\nconst utils = require('../components/utils');\nconst onModel = require('./onModelDescription');\n\nlet $mainGallery;\nlet $thumbnailGallery;\n\n// swiper instances\nlet swiperMain;\nlet swiperThumb;\n\n// video player instance\nlet player;\n\n/**\n * Initialize Swiper Gallery\n * @param {jQuery} $main jQuery reference to main gallery element\n * @param {jQuery|undefined} $thumbnail jQuery reference to thumbnail gallery element\n */\nfunction initSwiperGallery($main, $thumbnail) {\n    const swiperGalleryMain = $main[0];\n    const swiperConfigMain = {\n        centeredSlides: true,\n        slidesPerView: 1,\n        zoom: { toggle: false },\n        navigation: {\n            nextEl: '.swiper-button-next',\n            prevEl: '.swiper-button-prev',\n            disabledClass: 'd-none'\n        },\n        loop: false\n    };\n    const removeSlideSelectors = [\n        '.product-quickview .video-slide'\n    ];\n\n    if ($thumbnail.length) {\n        const swiperGalleryThumb = $thumbnail[0];\n\n        swiperThumb = new Swiper(swiperGalleryThumb, {\n            width: 44,\n            slidesPerView: 'auto',\n            loop: false,\n            threshold: 1000 // arbitrary high value to prevent cancellation of click event\n        });\n\n        swiperConfigMain.thumbs = {\n            swiper: swiperThumb\n        };\n\n        // Prevent screenreader from reading all alt tags whenever the gallery is updated\n        $thumbnail.find('.swiper-wrapper').removeAttr('aria-live');\n    }\n\n    $(removeSlideSelectors.join(',')).each(function (i, slide) {\n        $(slide).remove();\n    });\n\n    swiperMain = new Swiper(swiperGalleryMain, swiperConfigMain);\n\n    // Prevent screenreader from reading all alt tags whenever the gallery is updated\n    $main.find('.swiper-wrapper').removeAttr('aria-live');\n}\n\n/**\n * Initialize zoom container\n * @param {Object} $zoomModal: Reference to zoom container\n * @param {number} zoomIndex: The index to zoom on init\n */\nfunction initZoom($zoomModal, zoomIndex) {\n    const $zoomViewer = $zoomModal.find('.js-product-zoom-viewer');\n    const $bigImg = $zoomViewer.find('img');\n\n    // On thumbnail click inside zoom viewer, change to the zoomed view of the clicked image\n    $zoomModal\n        .on('click', '.js-product-thumb', function (e) {\n            e.preventDefault();\n            const $elem = $(this);\n            const hiResImage = $elem.data('img-hi-res');\n            const altZoomThumbSubstring = 'Zoom thumbnail:';\n            const altZoomSubstring = 'Zoom:';\n\n            // Get alt description from thumbnail and modify for zoom image\n            let alt = $elem.find('img').attr('alt');\n\n            if (alt.substring(altZoomThumbSubstring)) {\n                alt = alt.replace(altZoomThumbSubstring, altZoomSubstring);\n            }\n\n            $zoomModal.find('.js-product-thumb').removeClass('active');\n            $elem.addClass('active');\n            $bigImg.attr('src', hiResImage);\n            $bigImg.attr('alt', alt);\n        })\n        // Move around the zoomed image with mouse\n        .on('mousemove', '.js-product-zoom-viewer', function (e) {\n            const viewerWidth = $zoomViewer.outerWidth();\n            const viewerHeight = $zoomViewer.outerHeight();\n            const difWidth = viewerWidth - $bigImg.outerWidth();\n            const difHeight = viewerHeight - $bigImg.outerHeight();\n            const viewerOffset = $zoomViewer.offset();\n            // Track mouse movement on desktop\n            let x = 0;\n            let y = 0;\n            let imgX;\n            let imgY;\n            if (difWidth < 0) {\n                x = e.pageX - viewerOffset.left;\n                imgX = difWidth * ((x / viewerWidth) - 0.5);\n            } else {\n                imgX = 0;\n            }\n            if (difHeight < 0) {\n                y = e.pageY - viewerOffset.top;\n                imgY = difHeight * ((y / viewerHeight) - 0.5);\n            } else {\n                imgY = 0;\n            }\n            $bigImg.css('transform', `translate3d(${imgX}px, ${imgY}px, 0)`);\n        })\n        .on('hide.bs.modal', function () {\n            // slide swiper gallery to image that was open in zoom\n            const activeIndex = $zoomModal.find('.js-product-thumb.active').data('index');\n            swiperMain.slideTo(activeIndex);\n        })\n        .on('hidden.bs.modal', function () {\n            // remove the modal markup completely\n            $(this).remove();\n        });\n\n    // On init, open the last image that was being viewed in the product gallery\n    const $activeThumb = $zoomModal.find('.js-product-thumb[data-index=\"' + zoomIndex + '\"]');\n    if ($activeThumb.length) {\n        $activeThumb.trigger('click');\n    }\n}\n\n/**\n * Initialize video player\n */\nfunction initVideoPlayer() {\n    const $videoSlide = $mainGallery.find('.js-video-player');\n\n    // exit if no video player exists\n    if (!$videoSlide.length) return;\n\n    const playerHost = $videoSlide.data('host');\n    const videoId = $videoSlide.data('video-id');\n    const playerId = playerHost === 'youtube' ? 'ytPlayer_' + videoId : 'vimeoPlayer_' + videoId;\n\n    // preload youtube video player dependency\n    if (playerHost === 'youtube') {\n        const tagId = 'youtube-api-script';\n        const tagExists = document.getElementById(tagId);\n        if (!tagExists) {\n            const tag = document.createElement('script');\n            tag.src = 'https://www.youtube.com/iframe_api';\n            tag.id = tagId;\n            const firstScriptTag = document.getElementsByTagName('script')[0];\n            firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n        }\n    }\n\n    // wait for video player node to be created\n    const videoPlayerObserver = new MutationObserver(function () {\n        player = window.videoPlayers[playerId];\n        if (player) {\n            videoPlayerObserver.disconnect();\n        }\n    });\n    videoPlayerObserver.observe($videoSlide[0], { childList: true, subtree: true });\n\n    // pause product video on slide change\n    swiperMain.on('slideChange', function () {\n        if (player) {\n            if (playerHost === 'youtube') {\n                player.pauseVideo();\n            } else {\n                player.pause();\n            }\n        }\n    });\n}\n\n/**\n * Initialize product gallery events\n */\nfunction initGalleryEvents() {\n    $mainGallery\n        .off('.zoom')\n        // prevent swiping when zoom icon is being interacted with\n        .on('mousedown.zoom', '.js-pdp-gallery-zoom', function () {\n            if (swiperMain.allowTouchMove) {\n                swiperMain.allowTouchMove = false;\n\n                setTimeout(() => {\n                    swiperMain.allowTouchMove = true;\n                }, 500);\n            }\n        })\n        // When zoom button is clicked, enable zoom\n        .on('click.zoom', '.js-pdp-gallery-zoom', function () {\n            if (breakpoints.isLowRes()) {\n                swiperMain.zoom.toggle();\n            } else {\n                const $imageClicked = $(this).closest('.js-product-image');\n                let url = $imageClicked.closest('.js-product-gallery').data('zoom-url');\n\n                // If a color swatch has been selected\n                const $selectedColorSwatch = $('[data-attr=\"color\"] .color-value.selected');\n                if ($selectedColorSwatch.length && url) {\n                    const pid = $('.product-detail').data('pid').toString();\n                    const color = $selectedColorSwatch.data('attr-value');\n                    const urlPid = utils.getParamsFromURL(url).pid;\n\n                    if (pid !== urlPid) {\n                        url = utils.updateURLParam(url, 'pid', pid);\n                    }\n                    if (color && pid) {\n                        // get base pid without appended _S\n                        const basePid = pid.split('_')[0];\n                        url = utils.appendParamToURL(url, 'dwvar_' + basePid + '_color', color);\n                    }\n                }\n\n                if (!url) { return; }\n\n                $.spinner().start();\n                $.ajax({\n                    url: url,\n                    method: 'GET',\n                    dataType: 'html',\n                    success: function (html) {\n                        $.spinner().stop();\n\n                        const modalHTML = utils.createModalMarkup(html, { modalSizeClass: 'modal-fluid' });\n                        let $zoomModal = $(modalHTML).modal();\n\n                        let imageIndexToZoom = 0;\n                        if ($imageClicked.data('index')) {\n                            imageIndexToZoom = $imageClicked.data('index');\n                        }\n\n                        // fix for IE:\n                        const ua = window.navigator.userAgent;\n                        if (ua.indexOf('MSIE ') > -1 || ua.indexOf('Trident/') > -1) {\n                            $zoomModal.one('shown.bs.modal', function () {\n                                const $modalBody = $zoomModal.find('.modal-body');\n                                const zoomViewerHeight = $modalBody.find('.js-product-zoom-viewer').outerHeight();\n                                const modalBodyPadding = parseFloat($modalBody.css('padding-top')) + parseFloat($modalBody.css('padding-bottom'));\n                                $modalBody.css('height', zoomViewerHeight + modalBodyPadding);\n                            });\n                        }\n\n                        initZoom($zoomModal, imageIndexToZoom);\n                    },\n                    error: function () {\n                        $.spinner().stop();\n                    }\n                });\n            }\n        });\n\n    // use to swap image low/high resolution when zoom button is clicked\n    swiperMain.on('zoomChange', function (swiper, scale, imageEl) {\n        // zoomChange fires with these params: swiper, scale, imageEl, slideEl\n        let setImageUrl = $(imageEl).data('lowres');\n        if (scale !== 1) {\n            setImageUrl = $(imageEl).data('hires');\n        }\n        $(imageEl).attr('src', setImageUrl);\n    });\n\n    // re-initialize video player when swatch interaction refreshes gallery\n    $(document).on('video:player:update', function () {\n        initVideoPlayer();\n    });\n}\n\n/**\n * Disable/hide zoom button\n */\nfunction disableZoom() {\n    $('.js-pdp-gallery-zoom').addClass('d-none');\n}\n\n/**\n * Get jQuery elements required to build image gallery via configuration\n * @param {Object} config allowable options specified in configDefault\n * @returns {Object} jQuery elements required to build image gallery\n */\nfunction getGalleryElements(config) {\n    const configDefault = {\n        hasThumbnails: true,\n        isQuickview: false,\n        gallerySelector: '.js-product-gallery',\n        thumbnailSelector: '.js-product-gallery-thumb',\n        galleryContainerSelector: '.primary-images'\n    };\n\n    const options = $.extend({}, configDefault, config);\n\n    const galleryElements = {};\n    const $galleryContainer = $(options.galleryContainerSelector).first();\n\n    if ($galleryContainer.length) {\n        const $gallery = $galleryContainer.find(options.gallerySelector).first();\n\n        if ($gallery.length) {\n            galleryElements.$gallery = $gallery;\n            galleryElements.$galleryContainer = $galleryContainer;\n            galleryElements.isQuickview = !!options.isQuickview;\n\n            if (options.hasThumbnails) {\n                const $thumbnail = $galleryContainer.find(options.thumbnailSelector).first();\n\n                if ($thumbnail.length) {\n                    galleryElements.$thumbnail = $thumbnail;\n                    galleryElements.hasThumbnails = true;\n                }\n            }\n        }\n    }\n\n    return galleryElements;\n}\n\nmodule.exports = function (galleryConfig) {\n    const galleryElements = getGalleryElements(galleryConfig);\n\n    $mainGallery = galleryElements.$gallery;\n    $thumbnailGallery = galleryElements.$thumbnail;\n    const hasThumbnails = galleryElements.hasThumbnails;\n    const isQuickview = galleryElements.isQuickview;\n\n    if (!$mainGallery || !$mainGallery.length || $mainGallery[0].swiper) {\n        return {\n            init: function () {}\n        };\n    }\n\n    this.$gallery = $mainGallery;\n\n    if (hasThumbnails) {\n        this.$thumbnailGallery = $thumbnailGallery;\n    }\n\n    this.init = function () {\n        initSwiperGallery($mainGallery, $thumbnailGallery);\n\n        if (!isQuickview) {\n            initVideoPlayer();\n            initGalleryEvents();\n            onModel.triggerOnModelDescription();\n        } else {\n            disableZoom();\n        }\n    };\n\n    return this;\n};\n","'use strict';\n\n/**\n * When a promotion multiplier is in effect, highlight the bonus reward\n * if a strikeout price (sibling element) is detected\n */\nfunction highlightMultiplierReward() {\n    if ($('.js-rewards-highlight + s').length) {\n        $('.js-rewards-highlight').addClass('forecasted-loyalty-rewards__text--highlight');\n    }\n}\n\n/**\n * Displays the Loyalty points forecast on PDP\n * @param {HTML} html Product data passed on attribute selection\n */\nfunction updateLoyaltyForecastPoints(html) {\n    const $rewardsContainer = $('.js-rewards-container');\n    $rewardsContainer.html(html);\n    highlightMultiplierReward();\n}\n\nmodule.exports = {\n    init: function () {\n        // Attribute Select Event\n        $('body').on('product:afterAttributeSelect', function (e, response) {\n            var rewardsData = response.data.product.rewardsHtml;\n            if (rewardsData) {\n                updateLoyaltyForecastPoints(rewardsData);\n            }\n        });\n        highlightMultiplierReward();\n    }\n};\n","'use strict';\n\n/**\n * Display badge based on product variant response\n * @param {Object} badgeData from product data\n * @return {string} HTML Output\n */\nfunction displayBadge(badgeData) {\n    let result = '';\n\n    if (!(badgeData && badgeData.gridBadge)) {\n        return result;\n    }\n\n    const gridBadgeValue = badgeData.gridBadge.value || null;\n    const gridBadgeDisplay = badgeData.gridBadge.display || null;\n    const hasSaleSwatchSelected = $('.js-color-swatch.js-onsale.selected').length;\n    const hideDynamicBadges = !!badgeData.gridBadge.hideDynamicBadges;\n    // In contrast with the grid tile, the PDP 'Sale' badge will be omitted from this static type array and handled dynamically\n    const staticTypes = ['BestSeller', 'New', 'Coming Soon'];\n    const isStaticType = staticTypes.includes(badgeData.gridBadge.value);\n\n    let badgeType;\n\n    if (badgeData.svg) {\n        result = `\n            <div class=\"product-badge product-badge--pdp product-badge--icon\">\n                <svg class=\"svgicon\"><use href=\"${'#' + badgeData.svg}\"></use></svg>\n            </div>\n        `;\n    } else if (gridBadgeValue && gridBadgeDisplay && gridBadgeValue.toLowerCase() !== 'sale') {\n        badgeType = gridBadgeValue.toLowerCase();\n    } else if (!hideDynamicBadges && hasSaleSwatchSelected && !isStaticType) {\n        badgeType = 'sale';\n    }\n\n    if (badgeType) {\n        result = `\n            <div class=\"product-badge product-badge--pdp product-badge--${badgeType}\">\n                ${gridBadgeDisplay}\n            </div>`;\n    }\n\n    return result;\n}\n\n/**\n * Display PDP image gallery tech badge based on product technology\n * @param {Object} badgeData from pdp data\n * @return {string} HTML Output\n */\nfunction displayTechBadge(badgeData) {\n    let result = '';\n\n    if (!badgeData) {\n        return result;\n    }\n\n    result = `\n        <div class=\"product-tech-badge ${badgeData.svgClass}\">\n            <svg viewbox=\"0 0 ${badgeData.svgWidth} ${badgeData.svgHeight}\">\n                <use xlink:href=\"${'#' + badgeData.svgID}\"></use>\n            </svg>\n        </div>`;\n\n    return result;\n}\n\nmodule.exports = {\n    displayBadge,\n    displayTechBadge\n};\n","'use strict';\n\n/**\n * Remove overview modal and backdrop\n */\nfunction closeModal() {\n    $('.overview-modal, .modal-backdrop').remove();\n\n    // Account for scrollbars to prevent CLS\n    $.enableScroll();\n    $('body').removeClass('modal-open').css('padding-right', '');\n    $(window).trigger('scroll');\n}\n\n/**\n * Builds HTML element that will display the overview benefit modal contents\n * @param {HTML} html response used render modal content\n * @returns {HTMLElement} Reference to modal JQuery object\n */\nfunction buildModal(html) {\n    const $modal = $.modal({\n        content: html,\n        customClasses: 'overview-modal',\n        modalSizeClass: 'modal-lg'\n    }).on('hidden.bs.modal', () => {\n        closeModal();\n    });\n\n    return $modal;\n}\n\n/**\n * Fetches overview html from server and launches modal\n * @param {string} url  - Overview controller endpoint url\n * @param {HTMLElement} $modal - Reference to modal JQuery object\n */\nfunction launchModal(url) {\n    if (!url) {\n        return;\n    }\n\n    $.ajax({\n        url: url,\n        method: 'GET',\n        dataType: 'html',\n        success: (data) => {\n            buildModal(data);\n        },\n        complete: () => {\n            $.spinner().stop();\n            $.disableScroll();\n        },\n        error: () => {\n            closeModal();\n        }\n    });\n}\n\nmodule.exports = {\n    init: function () {\n        $('body')\n            .off('click.overview', '.js-overview-modal')\n            .on('click.overview', '.js-overview-modal', (e) => {\n                e.preventDefault();\n                let $this = $(e.currentTarget);\n                let link = $this.data('link') || $this.attr('href');\n\n                launchModal(link);\n            });\n    },\n    buildModal,\n    launchModal,\n    closeModal\n};\n","'use strict';\nvar breakpoints = require('../components/breakpoints');\nvar tabbedContainer = require('../aem/tabbedContainer');\n\n/**\n * Show unit toggle control if .js-no-unit-toggle class is not present\n */\nfunction showUnitToggle() {\n    if ($('.tabbed-container__tabs .js-no-unit-toggle.active').is(':visible')) {\n        $('.js-unit-toggle').addClass('d-none');\n    } else {\n        $('.js-unit-toggle').removeClass('d-none');\n    }\n}\n\n/**\n *\n * @param {string} categorySuffix - the category to be shown\n * @param {string} sectionDiv - the section to be shown\n * @param {string} buttonText - the text to be replace the top accordion\n * @param {string} gender - text containing the gender option to show on the top most accordion upon selection\n */\nfunction toggleCategorySizeFit(categorySuffix, sectionDiv, buttonText, gender) {\n    if (typeof categorySuffix === 'undefined' || typeof sectionDiv === 'undefined') {\n        return;\n    }\n\n    var $categorySelected = $('div.size-guides-' + categorySuffix);\n    var $divSelected = $('div.' + sectionDiv);\n    var $activeCategory = $('.category-shown');\n    var $activeSection = $('.section-shown');\n\n    if ($activeCategory) {\n        $activeCategory.addClass('d-none').removeClass('category-shown');\n    }\n\n    if ($activeSection) {\n        $activeSection.addClass('d-none').removeClass('section-shown');\n    }\n\n    $categorySelected.removeClass('d-none').addClass('category-shown');\n    $divSelected.removeClass('d-none').addClass('section-shown');\n    var menuText = gender + ' > ' + buttonText;\n    var $menu = $('a.selectedCategory div.accordion__title__text');\n    $menu.html(menuText);\n\n    // Determine if unit toggle control should display\n    showUnitToggle();\n\n    // Click tab to ensure proper tabbed content height\n    $('.ofs__item.active:visible').trigger('click');\n\n    var genderCategory = gender.replace(/[^\\w ]+/g, '').toLowerCase();\n\n    $('#selectionCategory-' + genderCategory).collapse('toggle');\n    $('#selectionAccordion').collapse('toggle');\n}\n\n/**\n * to select a category from the list\n * @param {Object} $element category id value\n */\nfunction selectCategory($element) {\n    var elementIdParts = $element.id.split('-');\n    var categorySuffix = elementIdParts[0] + '-' + $element.dataset.subcat;\n    var genderToShow = $element.dataset.gendershow;\n    var sectionDiv = elementIdParts[1];\n    var buttonText = $element.innerText;\n    toggleCategorySizeFit(categorySuffix, sectionDiv, buttonText, genderToShow);\n}\n\n/**\n * convert inches-to-centimeters and vice-versa\n * @param {boolean} useCentimeters if true then convert to centimeters, else convert to inches\n * @param {string} value value to convert\n * @returns {string} converted value\n */\nfunction unitConversion(useCentimeters, value) {\n    var result;\n    var radix = 10;\n    var unit = (useCentimeters) ? 2.54 : 0.3937;\n    if (value.indexOf('-') > -1) {\n        var values = value.split('-');\n        values.forEach(function (size) {\n            if (!isNaN(size)) {\n                result = (result == null) ? parseFloat((Number(size) * unit).toFixed(1), radix) : result + '-' + parseFloat((Number(size) * unit).toFixed(1), radix);\n            }\n        });\n    } else if (!isNaN(value)) {\n        result = parseFloat((Number(value) * unit).toFixed(1), radix);\n    }\n\n    return result;\n}\n\n/**\n * function to read the measurement values and set respective converted value\n * @param {boolean} useCentimeters if true then convert to centimeters, else convert to inches\n */\nfunction toggleMeasurements(useCentimeters) {\n    const $toggleTables = $('.size-chart-asset table');\n\n    $toggleTables.each(function () {\n        const $toggleTable = $(this);\n        const $columnHeaders = $toggleTable.find('thead th'); // get table column headers\n\n        $toggleTable.find('.js-convert-column').each(function () {\n            const nthIndex = $columnHeaders.index(this) + 1; // index of .js-convert-column element relative to it's siblings\n            const $toggleCells = $toggleTable.find('tbody td:nth-child(' + nthIndex + ')'); // get table cells in the same column as .js-convert-column\n\n            $toggleCells.each(function () {\n                const $toggleCell = $(this);\n                const convertedValue = unitConversion(useCentimeters, $toggleCell.text()); // convert values on relevant table cells\n\n                if (convertedValue) {\n                    $toggleCell.text(convertedValue);\n                }\n            });\n        });\n    });\n}\n\n/**\n * Clear table of all styling classes\n * @param {Object} $tableElement - the table that will have the styling removed from its elements\n */\nfunction clearTableClasses($tableElement) {\n    $tableElement.find('th, td').removeClass('selected-table-element cross-section-header cross-section-data');\n}\n\n/** Adds the appropriate styling to the table element being passed\n * @param {Object} $tableElement - element to be styled, based of th/td tag\n */\nfunction applyTableElementStyle($tableElement) {\n    var className;\n    className = $tableElement.is('th') ? 'cross-section-header' : 'cross-section-data';\n    $tableElement.addClass(className);\n}\n\n/** For the table in the measurement section\n * @param {Object} tableElement - table element to be focussed on for cross section\n * @returns {boolean} - false to break the loop, true to move on to the next iteration in the each loop.\n */\nfunction tableCrossSection(tableElement) {\n    var $tdElement = $(tableElement);\n    var $trElement = $tdElement.closest('tr');\n    var containsTdElement = $trElement.has('td').length;\n    var elementIndex = $tdElement.index();\n    var $tableElement = $tdElement.closest('table');\n    clearTableClasses($tableElement);\n    $tdElement.addClass('selected-table-element');\n\n    // Check if row contains td element, if not it is the header row and\n    // cross section doesn't need to be calculated\n    if (containsTdElement && elementIndex) {\n        // Loop through each table row and apply cross section styling\n        $tableElement.find('tr').each(function (iterator, rowElement) {\n            var $rowElement = $(rowElement);\n\n            // If table row does not contain the moused over cell,\n            // apply styling to the cell in the same column\n            if (!$rowElement.has('td.selected-table-element').length) {\n                var $rowCell = $($rowElement.find('th, td')[elementIndex]);\n                applyTableElementStyle($rowCell);\n            } else {\n                // Apply styling to the entire row, prior to the moused over element\n                $rowElement.children().each(function (columnIndex, childElement) {\n                    var $childElement = $(childElement);\n                    if (columnIndex < elementIndex) {\n                        applyTableElementStyle($childElement);\n                    }\n                });\n                return false;\n            }\n            return true;\n        });\n    }\n    return true;\n}\n\n/**\n * Create scroll buttons when the table is larger than the size of the screen\n * TODO: Tech Debt: https://columbia.atlassian.net/browse/GSD-18362 - Remove createScrollButtons()\n */\nfunction createScrollButtons() {\n    var $activeContent = $('.js-sizefit-content:visible .tabbed-container__content.active');\n    var overflow = $activeContent.find('table.size-chart-asset__table').outerWidth() - $activeContent.outerWidth();\n    if (overflow > 0 && breakpoints.isLowRes()) {\n        $('.js-scroll-button').remove(); // remove old instances\n        var tableHeaderHeight = $activeContent.find('table.size-chart-asset__table th').css('height');\n        var marginLeft = parseInt($activeContent.find('table.size-chart-asset__table th').css('width'), 10) + 1 + 'px'; // Adds extra pixel for outline\n        var $rightScrollButton = `<button class=\"btn btn-icon scroll-table-right js-scroll-button\" data-overflow=\"${overflow}\" style=\"height: ${tableHeaderHeight}\">\n        <svg class=\"svgicon\" aria-hidden=\"true\"><use href=\"#chevron_right\"></use></svg><span class=\"aria-offscreen\">Scroll right</span></button>`;\n        var $leftScrollButton = `<button class=\"btn btn-icon scroll-table-left js-scroll-button d-none\" data-overflow=\"0\" style=\"height: ${tableHeaderHeight}; left: ${marginLeft};\"><svg class=\"svgicon\" aria-hidden=\"true\"><use href=\"#chevron_left\"></use></svg><span class=\"aria-offscreen\">Scroll left</span></button>`;\n        $activeContent.append($leftScrollButton);\n        $activeContent.append($rightScrollButton);\n    }\n}\n\n/**\n * Switches position of scroll buttons\n * @param {Object} $container - jQuery element of table element\n */\nfunction scrollButtonPosition($container) {\n    var $table = $container.find('table.size-chart-asset__table');\n    var tableOverflow = $table.outerWidth() - $container.outerWidth();\n    var $tableOffset = $table.offset();\n    var offsetLeft = $tableOffset.left - 48; // remove 3rem offset\n\n    if (tableOverflow + offsetLeft < 2) {\n        $('.scroll-table-right').addClass('d-none');\n        $('.js-scroll-button.scroll-table-left.d-none').removeClass('d-none');\n    } else if (offsetLeft < 2 && offsetLeft > 0) {\n        $('.scroll-table-left').addClass('d-none');\n        $('.js-scroll-button.scroll-table-right.d-none').removeClass('d-none');\n    }\n}\n\n/**\n * Highlights fit selection in Fit Guide content asset\n */\nfunction highlightFitSelection() {\n    const $sizeFitModal = $('.sizefit-modal');\n    const fitAsset = $('.js-apparel-fit').data('fit-asset');\n    const selection = $sizeFitModal.find('[id*=\"' + fitAsset + '\"]');\n\n    // Adds outline to content asset wrapper\n    selection.addClass('outline');\n}\n\nmodule.exports = {\n    initSizeFit: function () {\n        const $unitToggles = $('.js-unit-toggle');\n\n        createScrollButtons();\n        highlightFitSelection(); // Highlight apparel fit in content asset\n\n        // TODO: Add event delegation / investigate if needed.\n        $('.js-sizefit-option').on('click', function () {\n            selectCategory(this);\n            $(window).trigger('resize'); // this fixes the height of the overflow slider tabs\n        });\n\n        // inches/cm toggle\n        $unitToggles.on('click', function () {\n            var $element = $(this);\n            var useCentimeters = false;\n            if ($element.hasClass('inches')) {\n                $unitToggles.addClass('centi').removeClass('inches');\n                useCentimeters = true;\n            } else {\n                $unitToggles.addClass('inches').removeClass('centi');\n            }\n\n            toggleMeasurements(useCentimeters);\n        });\n\n        $('body').on('click', '.ofs__item', function () {\n            createScrollButtons();\n        });\n\n        $('body').on('click', '.js-no-unit-toggle', function () {\n            showUnitToggle();\n        });\n\n        $('.js-sizefit-content').on('shown.bs.collapse', function () {\n            $(window).trigger('resize'); // this fixes the height of the overflow slider tabs\n            // and this fixes the height of the active content container which was hidden, so had a height of 0:\n            $(this).find('.tabbed-container__content-container').each((index, container) => {\n                var $container = $(container);\n                return $container.css('height', $container.find('.active').outerHeight());\n            });\n            createScrollButtons();\n        });\n\n        $('body').on('click', '.js-scroll-button', function () {\n            var $activeTable = $('.js-sizefit-content:visible .tabbed-container__content.active .size-chart-asset');\n            var $currentScrollButton = $(this);\n            $activeTable.animate({ scrollLeft: $currentScrollButton.data('overflow') }, 200, function () {\n                scrollButtonPosition($activeTable);\n            });\n        });\n        $('body').on('mouseover', '.size-chart-asset__table td, .size-chart-asset__table th', function () {\n            tableCrossSection(this);\n        });\n        $('body').on('mouseleave', 'table', function () {\n            var $tableElement = $(this);\n            clearTableClasses($tableElement);\n        });\n        $('.size-chart-asset').on('scroll', function () {\n            var $container = $(this);\n            scrollButtonPosition($container);\n        });\n    },\n    getSizeFitGuideContent: function ($modalContentWrapper, url) {\n        var successHandler = (html) => {\n            // append the template HTML of the interactive size/fit guide to the '.modal-body'\n            $modalContentWrapper.find('.modal-body').html(html);\n\n            // initialize the event handlers and interactive behavior\n            $modalContentWrapper.find('.overflow-slider').overflowSlider();\n            tabbedContainer.init();\n            $modalContentWrapper.find('.tabbed-container__content-container .active').siblings().hide(); // full page load already happened so we need to do this explicitly\n            this.initSizeFit();\n        };\n\n        // fetch the HTML content for the interactive size/fit guide and\n        $.ajax({\n            url: url,\n            method: 'GET',\n            dataType: 'json',\n            success: (data) => {\n                if (!$modalContentWrapper[0].parentElement) {\n                    // success was called before the modal is shown.\n                    $modalContentWrapper.on('shown.bs.modal', () => {\n                        successHandler(data.renderedTemplate);\n                    });\n                } else {\n                    successHandler(data.renderedTemplate);\n                }\n            },\n            error: () => {\n                $modalContentWrapper.modal('hide');\n            }\n        });\n    }\n};\n","'use strict';\n\nmodule.exports = function () {\n    /**\n     * overflowSlider - a jQuery plugin that allows for content to be dragged by\n     * the mouse or by touch if it overflows the container.\n     *\n     * Struction of the markup:\n     *     <div class=\"overflow-slider\">\n     *         <div class=\"ofs__container\">\n     *             <div class=\"ofs__slider\">\n     *                 <div>Item</div>\n     *                 <div>Item</div>\n     *                 <div>...</div>\n     *             </div>\n     *         </div>\n     *     </div>\n     *\n     * @param {Object} options JSON object containing optional settings.\n     * @return {Object} jQuery object of the selected element.\n     */\n    $.fn.overflowSlider = function (options) {\n        var settings = $.extend({}, $.fn.overflowSlider.defaults, options);\n\n        var collection = this;\n\n        // TODO: define these per instance, not on the collection.\n        var containerSelector = '.' + settings.containerClass;\n        var sliderSelector = '.' + settings.sliderClass;\n        var arrowLeftSelector = '.' + settings.arrowLeftClass;\n        var arrowRightSelector = '.' + settings.arrowRightClass;\n\n        // functions (avoid no-use-before-define lint errors)\n        var slideByAmount;\n        var slideToItem;\n        var slideToX;\n        var dragStart;\n        var dragging;\n        var dragEnd;\n        var toggleArrows;\n        var listenForArrowClicks;\n        var setHeight;\n        var init;\n        var clamp;\n\n        /**\n         * Slides the slider by the given percentage of the overflow-slider.\n         * @param {Object} $ofs This instance of the overflow slider.\n         * @param {number} percentToSlide The amount to slide the slider within the container. 0 - 1.\n         */\n        slideByAmount = function ($ofs, percentToSlide) {\n            var newXPos = 0;\n            var endX = $ofs.prop('ofs').endX;\n            var startXPos = parseFloat($ofs.find(sliderSelector).css('left')) || 0; // parse float to drop the 'px'\n            var containerSize = $ofs.find(containerSelector).innerWidth();\n            var sliderSize = $ofs.find(sliderSelector).outerWidth(true);\n            if ($ofs.prop('ofs').settings.centered && containerSize > sliderSize) {\n                // center the slider within the container\n                newXPos = (containerSize - sliderSize) / 2;\n                $ofs.find(sliderSelector).stop().animate({ left: newXPos }, {\n                    always: function () {\n                        toggleArrows($ofs, newXPos, 0, endX);\n                    }\n                });\n            } else {\n                var slideSize = $ofs.innerWidth() * percentToSlide;\n                newXPos = startXPos + slideSize;\n                slideToX($ofs, newXPos);\n            }\n        };\n\n        /**\n         * Slide the slider to the specified item if it is overflowing the slider.\n         * @param {Object} $ofs This instance of the overflow slider.\n         * @param {Object} $item jQuery object of the item within the slider.\n         */\n        slideToItem = function ($ofs, $item) {\n            var itemLeft = $item.position().left;\n            var $slider = $ofs.find(sliderSelector);\n            var currentSliderXPos = parseFloat($slider.css('left')) || 0;\n            var sliderMargin = parseFloat($slider.css('margin-left'));\n            var endX = $ofs.prop('ofs').endX;\n            var arrowSize = 0;\n            if ($ofs.prop('ofs').settings.showArrows) {\n                // add the width of the arrows\n                arrowSize = $ofs.find(arrowRightSelector).outerWidth(true) || $ofs.find(arrowLeftSelector).outerWidth(true) || 0;\n            }\n\n            var containerSize = $ofs.find(containerSelector).innerWidth();\n            var sliderSize = $ofs.find(sliderSelector).outerWidth(true);\n            if (containerSize > sliderSize) {\n                // there's enough space to show the entire slider\n                if ($ofs.prop('ofs').settings.centered) {\n                    // center the slider within the container\n                    var newXPos = (containerSize - sliderSize) / 2;\n                    $ofs.find(sliderSelector).stop().animate({ left: newXPos }, {\n                        always: function () {\n                            toggleArrows($ofs, newXPos, 0, endX);\n                        }\n                    });\n                } else {\n                    slideToX($ofs, 0);\n                }\n            } else if (itemLeft + currentSliderXPos < 0 + arrowSize) {\n                // the active item is off to the left\n                slideToX($ofs, (itemLeft * -1) - (sliderMargin - arrowSize));\n            } else {\n                var itemRight = itemLeft + $item.outerWidth(true);\n                var ofsWidth = $ofs.find(containerSelector).innerWidth();\n                if (itemRight + currentSliderXPos + sliderMargin > ofsWidth - arrowSize) {\n                    // the active item is off to the right\n                    slideToX($ofs, (ofsWidth - itemRight - sliderMargin - arrowSize));\n                } else {\n                    // the slider is wider than the container, but the active item is in view.\n                    toggleArrows($ofs, currentSliderXPos, 0, endX);\n                }\n            }\n        };\n\n        /**\n         * Slide the slider to the specified x position.\n         * @param {Object} $ofs This instance of the overflow slider.\n         * @param {number} x The slider left position to slide to.\n         */\n        slideToX = function ($ofs, x) {\n            var endX = $ofs.prop('ofs').endX;\n            var newXPos = clamp(x, endX, 0);\n            $ofs.find(sliderSelector).stop().animate({ left: newXPos }, {\n                always: function () {\n                    toggleArrows($ofs, newXPos, 0, endX);\n                }\n            });\n        };\n\n        /**\n         * when the user initiates a mouse click or touch dragging event\n         * @param {Event} e The event that triggered the start of a drag.\n         */\n        dragStart = function (e) {\n            // 'this' is the .overflow-slider element\n            var $ofs = $(this);\n\n            if ($ofs.prop('ofs').settings.preventDefault && e.type !== 'touchstart') {\n                e.preventDefault();\n            }\n\n            if ($ofs.prop('ofs').settings.centered) {\n                var containerSize = $ofs.find(containerSelector).innerWidth();\n                var sliderSize = $ofs.find(sliderSelector).outerWidth(true);\n                if (containerSize > sliderSize) {\n                    // The slider fits within the container. No dragging needed.\n                    return;\n                }\n            }\n\n            // mouse is down on the slider. get data.\n            if (e.type === 'touchstart') {\n                this.ofs.mouseX = e.touches[0].clientX;\n            } else {\n                this.ofs.mouseX = e.clientX;\n            }\n            this.ofs.sliderX = parseFloat($ofs.find(sliderSelector).css('left')) || 0;\n\n            // start listening for movement\n            $ofs.on('mousemove.ofs', dragging);\n            $ofs.on('touchmove.ofs', dragging);\n            // $ofs.on('pointermove.ofs', dragging); // for IE\n\n            // start listening for a mouse up anywhere on the page\n            $(document).one('mouseup.ofs', dragEnd);\n            $(document).one('touchend.ofs', dragEnd);\n            // $(document).one('pointerup.ofs', dragEnd); // for IE\n        };\n\n        /**\n         * \"on dragging\" functionality that takes in either touch event or on click event types and updates the x position of the slider within the container.\n         * @param {Event} e The event triggering the drag.\n         */\n        dragging = function (e) {\n            // 'this' is the .overflow-slider element\n            var $ofs = $(this);\n\n            if ($ofs.prop('ofs').settings.preventDefault) {\n                e.preventDefault();\n            }\n\n            this.ofs.isDragging = true;\n            var clientX;\n            if (e.type === 'touchmove') {\n                clientX = e.touches[0].clientX;\n            } else {\n                clientX = e.clientX;\n            }\n            // update the left postion\n            var currentSliderXPos = this.ofs.sliderX;\n            var mouseDownXPos = this.ofs.mouseX;\n            var endX = this.ofs.endX;\n            var newXPos = currentSliderXPos + (clientX - mouseDownXPos);\n            newXPos = clamp(newXPos, endX, 0);\n            $ofs.find(sliderSelector).css('left', newXPos);\n        };\n\n        /**\n         * This is called when the user releases the mouse click or touch dragging event\n         * @param {Event} e The mouseup/touchend event.\n         */\n        dragEnd = function () {\n            // 'this' is document\n            // stop listening for movement\n            $(collection).off('mousemove.ofs');\n            $(collection).off('touchmove.ofs');\n            // $ofs.off('pointermove.ofs'); // for IE\n\n            $(collection).each(function () {\n                if (this.ofs.isDragging) {\n                    this.ofs.isDragging = false;\n                    var newXPos = parseFloat($(this).find(sliderSelector).css('left')) || 0;\n                    var endX = this.ofs.endX;\n                    // this.ofs.sliderX = newXPos;\n                    toggleArrows($(this), newXPos, 0, endX);\n                } else {\n                    // mouse did not move. this is a regular click.\n                    this.ofs.isDragging = false;\n                }\n            });\n        };\n\n        /**\n         * Uses the x position of the slider to hide or show the left and right arrows.\n         * If we're within 3px (see threshold) of the left or right position, the arrow will be hidden.\n         * @param {Object} $ofs This instance of the overflow slider.\n         * @param {number} x The current x position of the slider.\n         * @param {number} left The minimum x position of the slider.\n         * @param {number} right The maximum x position of the slider.\n         */\n        toggleArrows = function ($ofs, x, left, right) {\n            // threshold is an arbitrary minimum distance the slider must travel\n            // before the arrows will show. If the slider is within 3px of the min\n            // or max, the arrow will not show.\n            var threshold = 3;\n            $ofs.find(arrowLeftSelector).toggle(x < left - threshold);\n            $ofs.find(arrowRightSelector).toggle(x > right + threshold);\n        };\n\n        /**\n         * this binds a click event to the arrows. The settings for slideAmount are defined in the .overflowSlider.defaults\n         * @param {Object} $ofs This instance of the overflow slider.\n         */\n        listenForArrowClicks = function ($ofs) {\n            var slideAmount = $ofs.prop('ofs').settings.slideAmount;\n            $ofs.on('click.ofs', arrowLeftSelector, function () {\n                slideByAmount($ofs, slideAmount); // slide 75% of the swiper width to the right (positive is right)\n            });\n            $ofs.on('click.ofs', arrowRightSelector, function () {\n                slideByAmount($ofs, (-1 * slideAmount)); // slide 75% of the swiper width to the left (negative is left)\n            });\n        };\n\n        /**\n         * Set the height of the slider container.\n         * @param {Object} $ofs This instance of the overflow slider.\n         * @param {Object} instanceSettings Options this instance of the overflow slider; if undefined, $.extend will be ignore it\n         */\n        setHeight = function ($ofs, instanceSettings) {\n            var sliderHeight = $ofs.find(sliderSelector).outerHeight();\n            var $sliderContainer = $ofs.find(containerSelector);\n            settings = $.extend({}, $.fn.overflowSlider.defaults, instanceSettings);\n\n            if (settings.expectedHeight && parseInt(settings.expectedHeight, 10) > 0) {\n                $sliderContainer.css('height', settings.expectedHeight);\n            } else if (sliderHeight) {\n                $sliderContainer.css('height', sliderHeight);\n            } else {\n                // oh well, we tried.\n                // the height is still 0 and we don't have an expectedHeight. Is the slider hidden?\n            }\n        };\n\n        /**\n         * Initialiizing function that establishes defaults for each instance of selected colletion.\n         * @param {Object} $ofs This instance of the overflow slider.\n         */\n        init = function ($ofs) {\n            var instanceSettings = settings;\n            // get settings from a data attribute\n            // this will override any settings set in JS.\n            if ($ofs.data('ofs-options')) {\n                // var attrOptions = JSON.parse($ofs.data('ofs-options')); // TODO: error handling\n                var attrOptions = $ofs.data('ofs-options');\n                instanceSettings = $.extend({}, settings, attrOptions);\n            }\n\n            var elem = $ofs[0]; // this is needed to avoid the no-param-reassign eslint error.\n\n            // var itemSelector = '.' + instanceSettings.itemClass;\n            elem.containerSelector = '.' + instanceSettings.containerClass;\n            elem.sliderSelector = '.' + instanceSettings.sliderClass;\n            elem.arrowLeftSelector = '.' + instanceSettings.arrowLeftClass;\n            elem.arrowRightSelector = '.' + instanceSettings.arrowRightClass;\n\n            var endX = $ofs.find(elem.containerSelector).innerWidth() - $ofs.find(elem.sliderSelector).outerWidth(true); // had to place this value here because endX was diplaying the incorrect value or NaN value\n\n            $ofs.addClass('overflow-slider'); // in case a different selector was used.\n\n            // the slider is positioned absolutely, so the $ofs has a height of 0.\n            // it should match the height of the slider.\n            setHeight($ofs, instanceSettings);\n            var $imgsInSlider = $ofs.find(elem.sliderSelector).find('img');\n            var imgLoadedTimeoutID;\n            $imgsInSlider.each(function () {\n                if (!this.complete) {\n                    // the image has not finished loading.\n                    $(this).one('load', function () {\n                        clearTimeout(imgLoadedTimeoutID);\n                        imgLoadedTimeoutID = setTimeout(function () {\n                            elem.ofs.setHeight($ofs);\n                        }, 100);\n                    });\n                }\n            });\n\n            // elem.ofs = $.extend({}, $ofs.prop('ofs'), {\n            elem.ofs = {\n                settings: instanceSettings,\n                isDragging: false,\n                sliderX: 0, // keep track of the x position of the slider\n                mouseX: null, // the x position of the mouse at the time of the last mouseDown\n                endX: endX, // the x position of the slider when it is slid to the left. 0 is the start, the right position.\n                clickedTab: null, // record clicked tab, so we can activate it if we don't drag.\n                init: init,\n                setHeight: setHeight,\n                toggleArrows: toggleArrows,\n                slideToX: slideToX,\n                slideToItem: slideToItem\n            };\n\n            var $items = $ofs.find(elem.sliderSelector).children();\n            $items.addClass(instanceSettings.itemClass);\n\n            if (instanceSettings.showArrows) {\n                // check for arrows, add if not found.\n                if ($ofs.find(elem.arrowRightSelector).length < 1) {\n                    var arrowBtns = `\n                        <button aria-label=\"${instanceSettings.arrowLeftLabel}\" class=\"${instanceSettings.arrowClass} ${instanceSettings.arrowLeftClass}\"></button>\n                        <button aria-label=\"${instanceSettings.arrowRightLabel}\" class=\"${instanceSettings.arrowClass} ${instanceSettings.arrowRightClass}\"></button>\n                    `;\n                    $ofs.append(arrowBtns);\n                }\n                listenForArrowClicks($ofs);\n\n                if (instanceSettings.alignArrowsToImgs) {\n                    // try to center the left/right arrows on the images\n                    var firstImg = $ofs.find('img:first');\n                    if (firstImg) {\n                        var imgHeight = firstImg.height();\n                        $ofs.find('.' + instanceSettings.arrowClass).css('top', imgHeight / 2);\n                    }\n                }\n            }\n\n            setTimeout(function () {\n                // ensure the slider is properly positioned at the start.\n                var $activeItem = $ofs.find('.' + instanceSettings.activeItemClass);\n                if ($activeItem.length) {\n                    slideToItem($ofs, $activeItem);\n                } else {\n                    slideByAmount($ofs, 0);\n                }\n            }, 0);\n        };\n\n        /**\n         * Resize listener to re-initalize the sliders, and to adjust position if necessary.\n         */\n        var windowResizeTimeoutId;\n        var resizeHandler = function () {\n            clearTimeout(windowResizeTimeoutId);\n            windowResizeTimeoutId = setTimeout(function () {\n                $(collection).each(function () {\n                    var $ofs = $(this);\n                    init($ofs);\n                });\n            }, 500);\n        };\n        $(window).on('resize.ofs', resizeHandler);\n\n        /**\n         * This constrains x btween two numbers. min <= x <= max\n         * @param {number} x The number to clamp within the min and max\n         * @param {number} min The minimum allowed value\n         * @param {number} max The maximum allowed value\n         * @return {number} x, clamped between min and max. This will be equal to min, x, or max.\n         */\n        clamp = function (x, min, max) {\n            var c = Math.min(Math.max(x, min), max);\n            return c;\n        };\n\n        /**\n         * This is the start of the functionality which supports multiple instances of .overflowSlider.\n         * \"this\" is a jQuery object containing one or more matching element. For each element, an overflow slider is created.\n         */\n        return this.each(function () {\n            // \"this\" is one of the selected elements\n            var $ofs = $(this);\n\n            init($ofs); // why is this miscalculating the endX?\n            // setTimeout(init($ofs), 0); // why do I need to init twice?!\n\n            // on mouse down within the overflowSlider...\n            $ofs.on('mousedown.ofs', dragStart);\n            $ofs.on('touchstart.ofs', dragStart);\n            // $ofs.on('pointerdown.ofs', dragStart); // for IE\n\n            var itemSelector = '.' + $ofs.prop('ofs').settings.itemClass;\n            $ofs.on('focus', itemSelector, function () {\n                slideToItem($ofs, $(this));\n            });\n\n            return this;\n        });\n    };\n\n    /**\n     * Default settings for the overflow sliders.\n     */\n    $.fn.overflowSlider.defaults = {\n        arrowClass: 'ofs__arrow',\n        arrowLeftClass: 'ofs__arrow--left',\n        arrowRightClass: 'ofs__arrow--right',\n        arrowLeftLabel: 'Slide Right',\n        arrowRightLabel: 'Slide Left',\n        containerClass: 'ofs__container',\n        sliderClass: 'ofs__slider',\n        itemClass: 'ofs__item',\n        showArrows: true,\n        alignArrowsToImgs: false, // attempt to align left/right arrows to the images\n        slideAmount: 0.75, // slide up to 75% of the container width when left/right buttons are clicked\n        centered: true, // when the slider fits within the container, should it be centered or left-aligned?\n        activeItemClass: 'active', // active and selected item at overflowSlider\n        expectedHeight: 0, // set to the approximate height of the slider content, to prevent a 0 height slider when the height is measured before content has finished loading.\n        preventDefault: true // should be prevented default events?\n    };\n\n    /**\n     * For each element having the \"overflow-slider\" class, initialize the overflowSlider\n     * with the default settings.\n     */\n    $(function () {\n        // set up the overflow sliders\n        // this one line will initialize multiple sliders all having the same settings.\n        $('.overflow-slider').overflowSlider();\n    });\n};\n\n","'use strict';\n\n/**\n* Checks if the current bootstrap UI breakpoint matches the breakpoint abbreviation.\n* @param {string} breakpointAbbreviation Breakpoint abbreviations. Options are: xs, sm, md, lg, xl\n* @returns {boolean} True if the breakpoint abbreviation is the current breakpoint.\n*/\nfunction isCurrentBreakpointAbbreviation(breakpointAbbreviation) {\n    if (\n        breakpointAbbreviation !== 'xs' &&\n        breakpointAbbreviation !== 'sm' &&\n        breakpointAbbreviation !== 'md' &&\n        breakpointAbbreviation !== 'lg' &&\n        breakpointAbbreviation !== 'xl') {\n        throw new Error('Invalid breakpoint abbreviation: ' + breakpointAbbreviation);\n    }\n\n    var selector = '.bootstrap-breakpoints-' + breakpointAbbreviation;\n    var $breakpointIndicator = $(selector);\n\n    if ($breakpointIndicator.length === 0) {\n        throw new Error('Breakpoint indicator not found for: ' + breakpointAbbreviation);\n    }\n    return $breakpointIndicator.css('display') === 'block';\n}\n\n/**\n * Finds the current breakpoint from the hidden .bootstrap-breakpoints element.\n * @returns {string} The currently active breakpoint abbreviation. ('xs', 'sm', 'md', 'lg', or 'xl')\n */\nfunction getCurrentBreakpoint() {\n    var $breakpointIndicators = $('.bootstrap-breakpoints > div');\n    var currentBP;\n    $breakpointIndicators.each(function () {\n        var $bpIndicator = $(this);\n        if ($bpIndicator.css('display') === 'block') {\n            currentBP = $bpIndicator.data('bp');\n            return false; // break out of the each loop\n        }\n        return true; // continue to next item in loop\n    });\n    return currentBP;\n}\n\nmodule.exports = {\n    /**\n     * This check is only for the resolution of the screen, it should\n     * not be used to infer device type or user interaction (touch/click).\n     * @returns {boolean} True if the screen is low resolution.\n     */\n    isLowRes: function () {\n        return this.isCurrentBreakpoint('xs', 'sm', 'md');\n    },\n    /**\n     * This check is only for the resolution of the screen, it should\n     * not be used to infer device type or user interaction (touch/click).\n     * @returns {boolean} True if the screen is high resolution.\n     */\n    isHighRes: function () {\n        return this.isCurrentBreakpoint('lg', 'xl');\n    },\n\n    /**\n     * Checks if the current bootstrap UI breakpoint matches a parameter.\n     * @example isCurrentBreakpoint('xs', 'sm')\n     * @param {arguments} breakpointAbbreviations One of more comma separated string breakpoint parameters. Options are: xs, sm, md, lg, xl\n     * @returns {boolean} True if any of the breakpoint abbreviations are the current breakpoint.\n     */\n    isCurrentBreakpoint: function () {\n        if (arguments.length === 0) {\n            throw new Error('No breakpoint abbreviations specified.');\n        }\n\n        for (var i = 0, len = arguments.length; i < len; i++) {\n            var abbreviation = arguments[i];\n\n            if (isCurrentBreakpointAbbreviation(abbreviation)) {\n                return true;\n            }\n        }\n\n        /**\n        * NOTE: it is explicitly intentional that this function accepts the breakpoint abbreviations and returns a boolean.\n        * If the function was instead 'getCurrentBreakpoint' where it returns the breakpoint abbreviation...\n        * then it might make future refactors and bootstrap updates more difficult if the abbreviations change\n        * because the return value may not be consumed near the function call (difficult to track/update).\n        */\n        return false;\n    },\n\n    getCurrentBreakpoint: getCurrentBreakpoint\n};\n","//     Underscore.js 1.10.2\n//     https://underscorejs.org\n//     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n// Baseline setup\n// --------------\n\n// Establish the root object, `window` (`self`) in the browser, `global`\n// on the server, or `this` in some virtual machines. We use `self`\n// instead of `window` for `WebWorker` support.\nvar root = typeof self == 'object' && self.self === self && self ||\n          typeof global == 'object' && global.global === global && global ||\n          Function('return this')() ||\n          {};\n\n// Save bytes in the minified (but not gzipped) version:\nvar ArrayProto = Array.prototype, ObjProto = Object.prototype;\nvar SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n// Create quick reference variables for speed access to core prototypes.\nvar push = ArrayProto.push,\n    slice = ArrayProto.slice,\n    toString = ObjProto.toString,\n    hasOwnProperty = ObjProto.hasOwnProperty;\n\n// All **ECMAScript 5** native function implementations that we hope to use\n// are declared here.\nvar nativeIsArray = Array.isArray,\n    nativeKeys = Object.keys,\n    nativeCreate = Object.create;\n\n// Create references to these builtin functions because we override them.\nvar _isNaN = root.isNaN,\n    _isFinite = root.isFinite;\n\n// Naked function reference for surrogate-prototype-swapping.\nvar Ctor = function(){};\n\n// The Underscore object. All exported functions below are added to it in the\n// modules/index-all.js using the mixin function.\nexport default function _(obj) {\n  if (obj instanceof _) return obj;\n  if (!(this instanceof _)) return new _(obj);\n  this._wrapped = obj;\n}\n\n// Current version.\nexport var VERSION = _.VERSION = '1.10.2';\n\n// Internal function that returns an efficient (for current engines) version\n// of the passed-in callback, to be repeatedly applied in other Underscore\n// functions.\nfunction optimizeCb(func, context, argCount) {\n  if (context === void 0) return func;\n  switch (argCount == null ? 3 : argCount) {\n    case 1: return function(value) {\n      return func.call(context, value);\n    };\n    // The 2-argument case is omitted because we’re not using it.\n    case 3: return function(value, index, collection) {\n      return func.call(context, value, index, collection);\n    };\n    case 4: return function(accumulator, value, index, collection) {\n      return func.call(context, accumulator, value, index, collection);\n    };\n  }\n  return function() {\n    return func.apply(context, arguments);\n  };\n}\n\n// An internal function to generate callbacks that can be applied to each\n// element in a collection, returning the desired result — either `identity`,\n// an arbitrary callback, a property matcher, or a property accessor.\nfunction baseIteratee(value, context, argCount) {\n  if (value == null) return identity;\n  if (isFunction(value)) return optimizeCb(value, context, argCount);\n  if (isObject(value) && !isArray(value)) return matcher(value);\n  return property(value);\n}\n\n// External wrapper for our callback generator. Users may customize\n// `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n// This abstraction hides the internal-only argCount argument.\n_.iteratee = iteratee;\nexport function iteratee(value, context) {\n  return baseIteratee(value, context, Infinity);\n}\n\n// The function we actually call internally. It invokes _.iteratee if\n// overridden, otherwise baseIteratee.\nfunction cb(value, context, argCount) {\n  if (_.iteratee !== iteratee) return _.iteratee(value, context);\n  return baseIteratee(value, context, argCount);\n}\n\n// Some functions take a variable number of arguments, or a few expected\n// arguments at the beginning and then a variable number of values to operate\n// on. This helper accumulates all remaining arguments past the function’s\n// argument length (or an explicit `startIndex`), into an array that becomes\n// the last argument. Similar to ES6’s \"rest parameter\".\nexport function restArguments(func, startIndex) {\n  startIndex = startIndex == null ? func.length - 1 : +startIndex;\n  return function() {\n    var length = Math.max(arguments.length - startIndex, 0),\n        rest = Array(length),\n        index = 0;\n    for (; index < length; index++) {\n      rest[index] = arguments[index + startIndex];\n    }\n    switch (startIndex) {\n      case 0: return func.call(this, rest);\n      case 1: return func.call(this, arguments[0], rest);\n      case 2: return func.call(this, arguments[0], arguments[1], rest);\n    }\n    var args = Array(startIndex + 1);\n    for (index = 0; index < startIndex; index++) {\n      args[index] = arguments[index];\n    }\n    args[startIndex] = rest;\n    return func.apply(this, args);\n  };\n}\n\n// An internal function for creating a new object that inherits from another.\nfunction baseCreate(prototype) {\n  if (!isObject(prototype)) return {};\n  if (nativeCreate) return nativeCreate(prototype);\n  Ctor.prototype = prototype;\n  var result = new Ctor;\n  Ctor.prototype = null;\n  return result;\n}\n\nfunction shallowProperty(key) {\n  return function(obj) {\n    return obj == null ? void 0 : obj[key];\n  };\n}\n\nfunction _has(obj, path) {\n  return obj != null && hasOwnProperty.call(obj, path);\n}\n\nfunction deepGet(obj, path) {\n  var length = path.length;\n  for (var i = 0; i < length; i++) {\n    if (obj == null) return void 0;\n    obj = obj[path[i]];\n  }\n  return length ? obj : void 0;\n}\n\n// Helper for collection methods to determine whether a collection\n// should be iterated as an array or as an object.\n// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\nvar MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\nvar getLength = shallowProperty('length');\nfunction isArrayLike(collection) {\n  var length = getLength(collection);\n  return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n}\n\n// Collection Functions\n// --------------------\n\n// The cornerstone, an `each` implementation, aka `forEach`.\n// Handles raw objects in addition to array-likes. Treats all\n// sparse array-likes as if they were dense.\nexport function each(obj, iteratee, context) {\n  iteratee = optimizeCb(iteratee, context);\n  var i, length;\n  if (isArrayLike(obj)) {\n    for (i = 0, length = obj.length; i < length; i++) {\n      iteratee(obj[i], i, obj);\n    }\n  } else {\n    var _keys = keys(obj);\n    for (i = 0, length = _keys.length; i < length; i++) {\n      iteratee(obj[_keys[i]], _keys[i], obj);\n    }\n  }\n  return obj;\n}\nexport { each as forEach };\n\n// Return the results of applying the iteratee to each element.\nexport function map(obj, iteratee, context) {\n  iteratee = cb(iteratee, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length,\n      results = Array(length);\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    results[index] = iteratee(obj[currentKey], currentKey, obj);\n  }\n  return results;\n}\nexport { map as collect };\n\n// Create a reducing function iterating left or right.\nfunction createReduce(dir) {\n  // Wrap code that reassigns argument variables in a separate function than\n  // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n  var reducer = function(obj, iteratee, memo, initial) {\n    var _keys = !isArrayLike(obj) && keys(obj),\n        length = (_keys || obj).length,\n        index = dir > 0 ? 0 : length - 1;\n    if (!initial) {\n      memo = obj[_keys ? _keys[index] : index];\n      index += dir;\n    }\n    for (; index >= 0 && index < length; index += dir) {\n      var currentKey = _keys ? _keys[index] : index;\n      memo = iteratee(memo, obj[currentKey], currentKey, obj);\n    }\n    return memo;\n  };\n\n  return function(obj, iteratee, memo, context) {\n    var initial = arguments.length >= 3;\n    return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n  };\n}\n\n// **Reduce** builds up a single result from a list of values, aka `inject`,\n// or `foldl`.\nexport var reduce = createReduce(1);\nexport { reduce as foldl, reduce as inject };\n\n// The right-associative version of reduce, also known as `foldr`.\nexport var reduceRight = createReduce(-1);\nexport { reduceRight as foldr };\n\n// Return the first value which passes a truth test.\nexport function find(obj, predicate, context) {\n  var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n  var key = keyFinder(obj, predicate, context);\n  if (key !== void 0 && key !== -1) return obj[key];\n}\nexport { find as detect };\n\n// Return all the elements that pass a truth test.\nexport function filter(obj, predicate, context) {\n  var results = [];\n  predicate = cb(predicate, context);\n  each(obj, function(value, index, list) {\n    if (predicate(value, index, list)) results.push(value);\n  });\n  return results;\n}\nexport { filter as select };\n\n// Return all the elements for which a truth test fails.\nexport function reject(obj, predicate, context) {\n  return filter(obj, negate(cb(predicate)), context);\n}\n\n// Determine whether all of the elements match a truth test.\nexport function every(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length;\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    if (!predicate(obj[currentKey], currentKey, obj)) return false;\n  }\n  return true;\n}\nexport { every as all };\n\n// Determine if at least one element in the object matches a truth test.\nexport function some(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length;\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    if (predicate(obj[currentKey], currentKey, obj)) return true;\n  }\n  return false;\n}\nexport { some as any };\n\n// Determine if the array or object contains a given item (using `===`).\nexport function contains(obj, item, fromIndex, guard) {\n  if (!isArrayLike(obj)) obj = values(obj);\n  if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n  return indexOf(obj, item, fromIndex) >= 0;\n}\nexport { contains as includes, contains as include };\n\n// Invoke a method (with arguments) on every item in a collection.\nexport var invoke = restArguments(function(obj, path, args) {\n  var contextPath, func;\n  if (isFunction(path)) {\n    func = path;\n  } else if (isArray(path)) {\n    contextPath = path.slice(0, -1);\n    path = path[path.length - 1];\n  }\n  return map(obj, function(context) {\n    var method = func;\n    if (!method) {\n      if (contextPath && contextPath.length) {\n        context = deepGet(context, contextPath);\n      }\n      if (context == null) return void 0;\n      method = context[path];\n    }\n    return method == null ? method : method.apply(context, args);\n  });\n});\n\n// Convenience version of a common use case of `map`: fetching a property.\nexport function pluck(obj, key) {\n  return map(obj, property(key));\n}\n\n// Convenience version of a common use case of `filter`: selecting only objects\n// containing specific `key:value` pairs.\nexport function where(obj, attrs) {\n  return filter(obj, matcher(attrs));\n}\n\n// Convenience version of a common use case of `find`: getting the first object\n// containing specific `key:value` pairs.\nexport function findWhere(obj, attrs) {\n  return find(obj, matcher(attrs));\n}\n\n// Return the maximum element (or element-based computation).\nexport function max(obj, iteratee, context) {\n  var result = -Infinity, lastComputed = -Infinity,\n      value, computed;\n  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n    obj = isArrayLike(obj) ? obj : values(obj);\n    for (var i = 0, length = obj.length; i < length; i++) {\n      value = obj[i];\n      if (value != null && value > result) {\n        result = value;\n      }\n    }\n  } else {\n    iteratee = cb(iteratee, context);\n    each(obj, function(v, index, list) {\n      computed = iteratee(v, index, list);\n      if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n        result = v;\n        lastComputed = computed;\n      }\n    });\n  }\n  return result;\n}\n\n// Return the minimum element (or element-based computation).\nexport function min(obj, iteratee, context) {\n  var result = Infinity, lastComputed = Infinity,\n      value, computed;\n  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n    obj = isArrayLike(obj) ? obj : values(obj);\n    for (var i = 0, length = obj.length; i < length; i++) {\n      value = obj[i];\n      if (value != null && value < result) {\n        result = value;\n      }\n    }\n  } else {\n    iteratee = cb(iteratee, context);\n    each(obj, function(v, index, list) {\n      computed = iteratee(v, index, list);\n      if (computed < lastComputed || computed === Infinity && result === Infinity) {\n        result = v;\n        lastComputed = computed;\n      }\n    });\n  }\n  return result;\n}\n\n// Shuffle a collection.\nexport function shuffle(obj) {\n  return sample(obj, Infinity);\n}\n\n// Sample **n** random values from a collection using the modern version of the\n// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n// If **n** is not specified, returns a single random element.\n// The internal `guard` argument allows it to work with `map`.\nexport function sample(obj, n, guard) {\n  if (n == null || guard) {\n    if (!isArrayLike(obj)) obj = values(obj);\n    return obj[random(obj.length - 1)];\n  }\n  var sample = isArrayLike(obj) ? clone(obj) : values(obj);\n  var length = getLength(sample);\n  n = Math.max(Math.min(n, length), 0);\n  var last = length - 1;\n  for (var index = 0; index < n; index++) {\n    var rand = random(index, last);\n    var temp = sample[index];\n    sample[index] = sample[rand];\n    sample[rand] = temp;\n  }\n  return sample.slice(0, n);\n}\n\n// Sort the object's values by a criterion produced by an iteratee.\nexport function sortBy(obj, iteratee, context) {\n  var index = 0;\n  iteratee = cb(iteratee, context);\n  return pluck(map(obj, function(value, key, list) {\n    return {\n      value: value,\n      index: index++,\n      criteria: iteratee(value, key, list)\n    };\n  }).sort(function(left, right) {\n    var a = left.criteria;\n    var b = right.criteria;\n    if (a !== b) {\n      if (a > b || a === void 0) return 1;\n      if (a < b || b === void 0) return -1;\n    }\n    return left.index - right.index;\n  }), 'value');\n}\n\n// An internal function used for aggregate \"group by\" operations.\nfunction group(behavior, partition) {\n  return function(obj, iteratee, context) {\n    var result = partition ? [[], []] : {};\n    iteratee = cb(iteratee, context);\n    each(obj, function(value, index) {\n      var key = iteratee(value, index, obj);\n      behavior(result, value, key);\n    });\n    return result;\n  };\n}\n\n// Groups the object's values by a criterion. Pass either a string attribute\n// to group by, or a function that returns the criterion.\nexport var groupBy = group(function(result, value, key) {\n  if (_has(result, key)) result[key].push(value); else result[key] = [value];\n});\n\n// Indexes the object's values by a criterion, similar to `groupBy`, but for\n// when you know that your index values will be unique.\nexport var indexBy = group(function(result, value, key) {\n  result[key] = value;\n});\n\n// Counts instances of an object that group by a certain criterion. Pass\n// either a string attribute to count by, or a function that returns the\n// criterion.\nexport var countBy = group(function(result, value, key) {\n  if (_has(result, key)) result[key]++; else result[key] = 1;\n});\n\nvar reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\n// Safely create a real, live array from anything iterable.\nexport function toArray(obj) {\n  if (!obj) return [];\n  if (isArray(obj)) return slice.call(obj);\n  if (isString(obj)) {\n    // Keep surrogate pair characters together\n    return obj.match(reStrSymbol);\n  }\n  if (isArrayLike(obj)) return map(obj, identity);\n  return values(obj);\n}\n\n// Return the number of elements in an object.\nexport function size(obj) {\n  if (obj == null) return 0;\n  return isArrayLike(obj) ? obj.length : keys(obj).length;\n}\n\n// Split a collection into two arrays: one whose elements all satisfy the given\n// predicate, and one whose elements all do not satisfy the predicate.\nexport var partition = group(function(result, value, pass) {\n  result[pass ? 0 : 1].push(value);\n}, true);\n\n// Array Functions\n// ---------------\n\n// Get the first element of an array. Passing **n** will return the first N\n// values in the array. The **guard** check allows it to work with `map`.\nexport function first(array, n, guard) {\n  if (array == null || array.length < 1) return n == null ? void 0 : [];\n  if (n == null || guard) return array[0];\n  return initial(array, array.length - n);\n}\nexport { first as head, first as take };\n\n// Returns everything but the last entry of the array. Especially useful on\n// the arguments object. Passing **n** will return all the values in\n// the array, excluding the last N.\nexport function initial(array, n, guard) {\n  return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n\n// Get the last element of an array. Passing **n** will return the last N\n// values in the array.\nexport function last(array, n, guard) {\n  if (array == null || array.length < 1) return n == null ? void 0 : [];\n  if (n == null || guard) return array[array.length - 1];\n  return rest(array, Math.max(0, array.length - n));\n}\n\n// Returns everything but the first entry of the array. Especially useful on\n// the arguments object. Passing an **n** will return the rest N values in the\n// array.\nexport function rest(array, n, guard) {\n  return slice.call(array, n == null || guard ? 1 : n);\n}\nexport { rest as tail, rest as drop };\n\n// Trim out all falsy values from an array.\nexport function compact(array) {\n  return filter(array, Boolean);\n}\n\n// Internal implementation of a recursive `flatten` function.\nfunction _flatten(input, shallow, strict, output) {\n  output = output || [];\n  var idx = output.length;\n  for (var i = 0, length = getLength(input); i < length; i++) {\n    var value = input[i];\n    if (isArrayLike(value) && (isArray(value) || isArguments(value))) {\n      // Flatten current level of array or arguments object.\n      if (shallow) {\n        var j = 0, len = value.length;\n        while (j < len) output[idx++] = value[j++];\n      } else {\n        _flatten(value, shallow, strict, output);\n        idx = output.length;\n      }\n    } else if (!strict) {\n      output[idx++] = value;\n    }\n  }\n  return output;\n}\n\n// Flatten out an array, either recursively (by default), or just one level.\nexport function flatten(array, shallow) {\n  return _flatten(array, shallow, false);\n}\n\n// Return a version of the array that does not contain the specified value(s).\nexport var without = restArguments(function(array, otherArrays) {\n  return difference(array, otherArrays);\n});\n\n// Produce a duplicate-free version of the array. If the array has already\n// been sorted, you have the option of using a faster algorithm.\n// The faster algorithm will not work with an iteratee if the iteratee\n// is not a one-to-one function, so providing an iteratee will disable\n// the faster algorithm.\nexport function uniq(array, isSorted, iteratee, context) {\n  if (!isBoolean(isSorted)) {\n    context = iteratee;\n    iteratee = isSorted;\n    isSorted = false;\n  }\n  if (iteratee != null) iteratee = cb(iteratee, context);\n  var result = [];\n  var seen = [];\n  for (var i = 0, length = getLength(array); i < length; i++) {\n    var value = array[i],\n        computed = iteratee ? iteratee(value, i, array) : value;\n    if (isSorted && !iteratee) {\n      if (!i || seen !== computed) result.push(value);\n      seen = computed;\n    } else if (iteratee) {\n      if (!contains(seen, computed)) {\n        seen.push(computed);\n        result.push(value);\n      }\n    } else if (!contains(result, value)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\nexport { uniq as unique };\n\n// Produce an array that contains the union: each distinct element from all of\n// the passed-in arrays.\nexport var union = restArguments(function(arrays) {\n  return uniq(_flatten(arrays, true, true));\n});\n\n// Produce an array that contains every item shared between all the\n// passed-in arrays.\nexport function intersection(array) {\n  var result = [];\n  var argsLength = arguments.length;\n  for (var i = 0, length = getLength(array); i < length; i++) {\n    var item = array[i];\n    if (contains(result, item)) continue;\n    var j;\n    for (j = 1; j < argsLength; j++) {\n      if (!contains(arguments[j], item)) break;\n    }\n    if (j === argsLength) result.push(item);\n  }\n  return result;\n}\n\n// Take the difference between one array and a number of other arrays.\n// Only the elements present in just the first array will remain.\nexport var difference = restArguments(function(array, rest) {\n  rest = _flatten(rest, true, true);\n  return filter(array, function(value){\n    return !contains(rest, value);\n  });\n});\n\n// Complement of zip. Unzip accepts an array of arrays and groups\n// each array's elements on shared indices.\nexport function unzip(array) {\n  var length = array && max(array, getLength).length || 0;\n  var result = Array(length);\n\n  for (var index = 0; index < length; index++) {\n    result[index] = pluck(array, index);\n  }\n  return result;\n}\n\n// Zip together multiple lists into a single array -- elements that share\n// an index go together.\nexport var zip = restArguments(unzip);\n\n// Converts lists into objects. Pass either a single array of `[key, value]`\n// pairs, or two parallel arrays of the same length -- one of keys, and one of\n// the corresponding values. Passing by pairs is the reverse of pairs.\nexport function object(list, values) {\n  var result = {};\n  for (var i = 0, length = getLength(list); i < length; i++) {\n    if (values) {\n      result[list[i]] = values[i];\n    } else {\n      result[list[i][0]] = list[i][1];\n    }\n  }\n  return result;\n}\n\n// Generator function to create the findIndex and findLastIndex functions.\nfunction createPredicateIndexFinder(dir) {\n  return function(array, predicate, context) {\n    predicate = cb(predicate, context);\n    var length = getLength(array);\n    var index = dir > 0 ? 0 : length - 1;\n    for (; index >= 0 && index < length; index += dir) {\n      if (predicate(array[index], index, array)) return index;\n    }\n    return -1;\n  };\n}\n\n// Returns the first index on an array-like that passes a predicate test.\nexport var findIndex = createPredicateIndexFinder(1);\nexport var findLastIndex = createPredicateIndexFinder(-1);\n\n// Use a comparator function to figure out the smallest index at which\n// an object should be inserted so as to maintain order. Uses binary search.\nexport function sortedIndex(array, obj, iteratee, context) {\n  iteratee = cb(iteratee, context, 1);\n  var value = iteratee(obj);\n  var low = 0, high = getLength(array);\n  while (low < high) {\n    var mid = Math.floor((low + high) / 2);\n    if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n  }\n  return low;\n}\n\n// Generator function to create the indexOf and lastIndexOf functions.\nfunction createIndexFinder(dir, predicateFind, sortedIndex) {\n  return function(array, item, idx) {\n    var i = 0, length = getLength(array);\n    if (typeof idx == 'number') {\n      if (dir > 0) {\n        i = idx >= 0 ? idx : Math.max(idx + length, i);\n      } else {\n        length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n      }\n    } else if (sortedIndex && idx && length) {\n      idx = sortedIndex(array, item);\n      return array[idx] === item ? idx : -1;\n    }\n    if (item !== item) {\n      idx = predicateFind(slice.call(array, i, length), isNaN);\n      return idx >= 0 ? idx + i : -1;\n    }\n    for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n      if (array[idx] === item) return idx;\n    }\n    return -1;\n  };\n}\n\n// Return the position of the first occurrence of an item in an array,\n// or -1 if the item is not included in the array.\n// If the array is large and already in sort order, pass `true`\n// for **isSorted** to use binary search.\nexport var indexOf = createIndexFinder(1, findIndex, sortedIndex);\nexport var lastIndexOf = createIndexFinder(-1, findLastIndex);\n\n// Generate an integer Array containing an arithmetic progression. A port of\n// the native Python `range()` function. See\n// [the Python documentation](https://docs.python.org/library/functions.html#range).\nexport function range(start, stop, step) {\n  if (stop == null) {\n    stop = start || 0;\n    start = 0;\n  }\n  if (!step) {\n    step = stop < start ? -1 : 1;\n  }\n\n  var length = Math.max(Math.ceil((stop - start) / step), 0);\n  var range = Array(length);\n\n  for (var idx = 0; idx < length; idx++, start += step) {\n    range[idx] = start;\n  }\n\n  return range;\n}\n\n// Chunk a single array into multiple arrays, each containing `count` or fewer\n// items.\nexport function chunk(array, count) {\n  if (count == null || count < 1) return [];\n  var result = [];\n  var i = 0, length = array.length;\n  while (i < length) {\n    result.push(slice.call(array, i, i += count));\n  }\n  return result;\n}\n\n// Function (ahem) Functions\n// ------------------\n\n// Determines whether to execute a function as a constructor\n// or a normal function with the provided arguments.\nfunction executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n  if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n  var self = baseCreate(sourceFunc.prototype);\n  var result = sourceFunc.apply(self, args);\n  if (isObject(result)) return result;\n  return self;\n}\n\n// Create a function bound to a given object (assigning `this`, and arguments,\n// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n// available.\nexport var bind = restArguments(function(func, context, args) {\n  if (!isFunction(func)) throw new TypeError('Bind must be called on a function');\n  var bound = restArguments(function(callArgs) {\n    return executeBound(func, bound, context, this, args.concat(callArgs));\n  });\n  return bound;\n});\n\n// Partially apply a function by creating a version that has had some of its\n// arguments pre-filled, without changing its dynamic `this` context. _ acts\n// as a placeholder by default, allowing any combination of arguments to be\n// pre-filled. Set `partial.placeholder` for a custom placeholder argument.\nexport var partial = restArguments(function(func, boundArgs) {\n  var placeholder = partial.placeholder;\n  var bound = function() {\n    var position = 0, length = boundArgs.length;\n    var args = Array(length);\n    for (var i = 0; i < length; i++) {\n      args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n    }\n    while (position < arguments.length) args.push(arguments[position++]);\n    return executeBound(func, bound, this, this, args);\n  };\n  return bound;\n});\n\npartial.placeholder = _;\n\n// Bind a number of an object's methods to that object. Remaining arguments\n// are the method names to be bound. Useful for ensuring that all callbacks\n// defined on an object belong to it.\nexport var bindAll = restArguments(function(obj, _keys) {\n  _keys = _flatten(_keys, false, false);\n  var index = _keys.length;\n  if (index < 1) throw new Error('bindAll must be passed function names');\n  while (index--) {\n    var key = _keys[index];\n    obj[key] = bind(obj[key], obj);\n  }\n});\n\n// Memoize an expensive function by storing its results.\nexport function memoize(func, hasher) {\n  var memoize = function(key) {\n    var cache = memoize.cache;\n    var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n    if (!_has(cache, address)) cache[address] = func.apply(this, arguments);\n    return cache[address];\n  };\n  memoize.cache = {};\n  return memoize;\n}\n\n// Delays a function for the given number of milliseconds, and then calls\n// it with the arguments supplied.\nexport var delay = restArguments(function(func, wait, args) {\n  return setTimeout(function() {\n    return func.apply(null, args);\n  }, wait);\n});\n\n// Defers a function, scheduling it to run after the current call stack has\n// cleared.\nexport var defer = partial(delay, _, 1);\n\n// Returns a function, that, when invoked, will only be triggered at most once\n// during a given window of time. Normally, the throttled function will run\n// as much as it can, without ever going more than once per `wait` duration;\n// but if you'd like to disable the execution on the leading edge, pass\n// `{leading: false}`. To disable execution on the trailing edge, ditto.\nexport function throttle(func, wait, options) {\n  var timeout, context, args, result;\n  var previous = 0;\n  if (!options) options = {};\n\n  var later = function() {\n    previous = options.leading === false ? 0 : now();\n    timeout = null;\n    result = func.apply(context, args);\n    if (!timeout) context = args = null;\n  };\n\n  var throttled = function() {\n    var _now = now();\n    if (!previous && options.leading === false) previous = _now;\n    var remaining = wait - (_now - previous);\n    context = this;\n    args = arguments;\n    if (remaining <= 0 || remaining > wait) {\n      if (timeout) {\n        clearTimeout(timeout);\n        timeout = null;\n      }\n      previous = _now;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    } else if (!timeout && options.trailing !== false) {\n      timeout = setTimeout(later, remaining);\n    }\n    return result;\n  };\n\n  throttled.cancel = function() {\n    clearTimeout(timeout);\n    previous = 0;\n    timeout = context = args = null;\n  };\n\n  return throttled;\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.\nexport function debounce(func, wait, immediate) {\n  var timeout, result;\n\n  var later = function(context, args) {\n    timeout = null;\n    if (args) result = func.apply(context, args);\n  };\n\n  var debounced = restArguments(function(args) {\n    if (timeout) clearTimeout(timeout);\n    if (immediate) {\n      var callNow = !timeout;\n      timeout = setTimeout(later, wait);\n      if (callNow) result = func.apply(this, args);\n    } else {\n      timeout = delay(later, wait, this, args);\n    }\n\n    return result;\n  });\n\n  debounced.cancel = function() {\n    clearTimeout(timeout);\n    timeout = null;\n  };\n\n  return debounced;\n}\n\n// Returns the first function passed as an argument to the second,\n// allowing you to adjust arguments, run code before and after, and\n// conditionally execute the original function.\nexport function wrap(func, wrapper) {\n  return partial(wrapper, func);\n}\n\n// Returns a negated version of the passed-in predicate.\nexport function negate(predicate) {\n  return function() {\n    return !predicate.apply(this, arguments);\n  };\n}\n\n// Returns a function that is the composition of a list of functions, each\n// consuming the return value of the function that follows.\nexport function compose() {\n  var args = arguments;\n  var start = args.length - 1;\n  return function() {\n    var i = start;\n    var result = args[start].apply(this, arguments);\n    while (i--) result = args[i].call(this, result);\n    return result;\n  };\n}\n\n// Returns a function that will only be executed on and after the Nth call.\nexport function after(times, func) {\n  return function() {\n    if (--times < 1) {\n      return func.apply(this, arguments);\n    }\n  };\n}\n\n// Returns a function that will only be executed up to (but not including) the Nth call.\nexport function before(times, func) {\n  var memo;\n  return function() {\n    if (--times > 0) {\n      memo = func.apply(this, arguments);\n    }\n    if (times <= 1) func = null;\n    return memo;\n  };\n}\n\n// Returns a function that will be executed at most one time, no matter how\n// often you call it. Useful for lazy initialization.\nexport var once = partial(before, 2);\n\n// Object Functions\n// ----------------\n\n// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\nvar hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n  'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\nfunction collectNonEnumProps(obj, _keys) {\n  var nonEnumIdx = nonEnumerableProps.length;\n  var constructor = obj.constructor;\n  var proto = isFunction(constructor) && constructor.prototype || ObjProto;\n\n  // Constructor is a special case.\n  var prop = 'constructor';\n  if (_has(obj, prop) && !contains(_keys, prop)) _keys.push(prop);\n\n  while (nonEnumIdx--) {\n    prop = nonEnumerableProps[nonEnumIdx];\n    if (prop in obj && obj[prop] !== proto[prop] && !contains(_keys, prop)) {\n      _keys.push(prop);\n    }\n  }\n}\n\n// Retrieve the names of an object's own properties.\n// Delegates to **ECMAScript 5**'s native `Object.keys`.\nexport function keys(obj) {\n  if (!isObject(obj)) return [];\n  if (nativeKeys) return nativeKeys(obj);\n  var _keys = [];\n  for (var key in obj) if (_has(obj, key)) _keys.push(key);\n  // Ahem, IE < 9.\n  if (hasEnumBug) collectNonEnumProps(obj, _keys);\n  return _keys;\n}\n\n// Retrieve all the property names of an object.\nexport function allKeys(obj) {\n  if (!isObject(obj)) return [];\n  var _keys = [];\n  for (var key in obj) _keys.push(key);\n  // Ahem, IE < 9.\n  if (hasEnumBug) collectNonEnumProps(obj, _keys);\n  return _keys;\n}\n\n// Retrieve the values of an object's properties.\nexport function values(obj) {\n  var _keys = keys(obj);\n  var length = _keys.length;\n  var values = Array(length);\n  for (var i = 0; i < length; i++) {\n    values[i] = obj[_keys[i]];\n  }\n  return values;\n}\n\n// Returns the results of applying the iteratee to each element of the object.\n// In contrast to map it returns an object.\nexport function mapObject(obj, iteratee, context) {\n  iteratee = cb(iteratee, context);\n  var _keys = keys(obj),\n      length = _keys.length,\n      results = {};\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys[index];\n    results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n  }\n  return results;\n}\n\n// Convert an object into a list of `[key, value]` pairs.\n// The opposite of object.\nexport function pairs(obj) {\n  var _keys = keys(obj);\n  var length = _keys.length;\n  var pairs = Array(length);\n  for (var i = 0; i < length; i++) {\n    pairs[i] = [_keys[i], obj[_keys[i]]];\n  }\n  return pairs;\n}\n\n// Invert the keys and values of an object. The values must be serializable.\nexport function invert(obj) {\n  var result = {};\n  var _keys = keys(obj);\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    result[obj[_keys[i]]] = _keys[i];\n  }\n  return result;\n}\n\n// Return a sorted list of the function names available on the object.\nexport function functions(obj) {\n  var names = [];\n  for (var key in obj) {\n    if (isFunction(obj[key])) names.push(key);\n  }\n  return names.sort();\n}\nexport { functions as methods };\n\n// An internal function for creating assigner functions.\nfunction createAssigner(keysFunc, defaults) {\n  return function(obj) {\n    var length = arguments.length;\n    if (defaults) obj = Object(obj);\n    if (length < 2 || obj == null) return obj;\n    for (var index = 1; index < length; index++) {\n      var source = arguments[index],\n          _keys = keysFunc(source),\n          l = _keys.length;\n      for (var i = 0; i < l; i++) {\n        var key = _keys[i];\n        if (!defaults || obj[key] === void 0) obj[key] = source[key];\n      }\n    }\n    return obj;\n  };\n}\n\n// Extend a given object with all the properties in passed-in object(s).\nexport var extend = createAssigner(allKeys);\n\n// Assigns a given object with all the own properties in the passed-in object(s).\n// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\nexport var extendOwn = createAssigner(keys);\nexport { extendOwn as assign };\n\n// Returns the first key on an object that passes a predicate test.\nexport function findKey(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = keys(obj), key;\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    key = _keys[i];\n    if (predicate(obj[key], key, obj)) return key;\n  }\n}\n\n// Internal pick helper function to determine if `obj` has key `key`.\nfunction keyInObj(value, key, obj) {\n  return key in obj;\n}\n\n// Return a copy of the object only containing the whitelisted properties.\nexport var pick = restArguments(function(obj, _keys) {\n  var result = {}, iteratee = _keys[0];\n  if (obj == null) return result;\n  if (isFunction(iteratee)) {\n    if (_keys.length > 1) iteratee = optimizeCb(iteratee, _keys[1]);\n    _keys = allKeys(obj);\n  } else {\n    iteratee = keyInObj;\n    _keys = _flatten(_keys, false, false);\n    obj = Object(obj);\n  }\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    var key = _keys[i];\n    var value = obj[key];\n    if (iteratee(value, key, obj)) result[key] = value;\n  }\n  return result;\n});\n\n// Return a copy of the object without the blacklisted properties.\nexport var omit = restArguments(function(obj, _keys) {\n  var iteratee = _keys[0], context;\n  if (isFunction(iteratee)) {\n    iteratee = negate(iteratee);\n    if (_keys.length > 1) context = _keys[1];\n  } else {\n    _keys = map(_flatten(_keys, false, false), String);\n    iteratee = function(value, key) {\n      return !contains(_keys, key);\n    };\n  }\n  return pick(obj, iteratee, context);\n});\n\n// Fill in a given object with default properties.\nexport var defaults = createAssigner(allKeys, true);\n\n// Creates an object that inherits from the given prototype object.\n// If additional properties are provided then they will be added to the\n// created object.\nexport function create(prototype, props) {\n  var result = baseCreate(prototype);\n  if (props) extendOwn(result, props);\n  return result;\n}\n\n// Create a (shallow-cloned) duplicate of an object.\nexport function clone(obj) {\n  if (!isObject(obj)) return obj;\n  return isArray(obj) ? obj.slice() : extend({}, obj);\n}\n\n// Invokes interceptor with the obj, and then returns obj.\n// The primary purpose of this method is to \"tap into\" a method chain, in\n// order to perform operations on intermediate results within the chain.\nexport function tap(obj, interceptor) {\n  interceptor(obj);\n  return obj;\n}\n\n// Returns whether an object has a given set of `key:value` pairs.\nexport function isMatch(object, attrs) {\n  var _keys = keys(attrs), length = _keys.length;\n  if (object == null) return !length;\n  var obj = Object(object);\n  for (var i = 0; i < length; i++) {\n    var key = _keys[i];\n    if (attrs[key] !== obj[key] || !(key in obj)) return false;\n  }\n  return true;\n}\n\n\n// Internal recursive comparison function for `isEqual`.\nfunction eq(a, b, aStack, bStack) {\n  // Identical objects are equal. `0 === -0`, but they aren't identical.\n  // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n  if (a === b) return a !== 0 || 1 / a === 1 / b;\n  // `null` or `undefined` only equal to itself (strict comparison).\n  if (a == null || b == null) return false;\n  // `NaN`s are equivalent, but non-reflexive.\n  if (a !== a) return b !== b;\n  // Exhaust primitive checks\n  var type = typeof a;\n  if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n  return deepEq(a, b, aStack, bStack);\n}\n\n// Internal recursive comparison function for `isEqual`.\nfunction deepEq(a, b, aStack, bStack) {\n  // Unwrap any wrapped objects.\n  if (a instanceof _) a = a._wrapped;\n  if (b instanceof _) b = b._wrapped;\n  // Compare `[[Class]]` names.\n  var className = toString.call(a);\n  if (className !== toString.call(b)) return false;\n  switch (className) {\n    // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n    case '[object RegExp]':\n    // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n    case '[object String]':\n      // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n      // equivalent to `new String(\"5\")`.\n      return '' + a === '' + b;\n    case '[object Number]':\n      // `NaN`s are equivalent, but non-reflexive.\n      // Object(NaN) is equivalent to NaN.\n      if (+a !== +a) return +b !== +b;\n      // An `egal` comparison is performed for other numeric values.\n      return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n    case '[object Date]':\n    case '[object Boolean]':\n      // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n      // millisecond representations. Note that invalid dates with millisecond representations\n      // of `NaN` are not equivalent.\n      return +a === +b;\n    case '[object Symbol]':\n      return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);\n  }\n\n  var areArrays = className === '[object Array]';\n  if (!areArrays) {\n    if (typeof a != 'object' || typeof b != 'object') return false;\n\n    // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n    // from different frames are.\n    var aCtor = a.constructor, bCtor = b.constructor;\n    if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&\n                             isFunction(bCtor) && bCtor instanceof bCtor)\n                        && ('constructor' in a && 'constructor' in b)) {\n      return false;\n    }\n  }\n  // Assume equality for cyclic structures. The algorithm for detecting cyclic\n  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n  // Initializing stack of traversed objects.\n  // It's done here since we only need them for objects and arrays comparison.\n  aStack = aStack || [];\n  bStack = bStack || [];\n  var length = aStack.length;\n  while (length--) {\n    // Linear search. Performance is inversely proportional to the number of\n    // unique nested structures.\n    if (aStack[length] === a) return bStack[length] === b;\n  }\n\n  // Add the first object to the stack of traversed objects.\n  aStack.push(a);\n  bStack.push(b);\n\n  // Recursively compare objects and arrays.\n  if (areArrays) {\n    // Compare array lengths to determine if a deep comparison is necessary.\n    length = a.length;\n    if (length !== b.length) return false;\n    // Deep compare the contents, ignoring non-numeric properties.\n    while (length--) {\n      if (!eq(a[length], b[length], aStack, bStack)) return false;\n    }\n  } else {\n    // Deep compare objects.\n    var _keys = keys(a), key;\n    length = _keys.length;\n    // Ensure that both objects contain the same number of properties before comparing deep equality.\n    if (keys(b).length !== length) return false;\n    while (length--) {\n      // Deep compare each member\n      key = _keys[length];\n      if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n    }\n  }\n  // Remove the first object from the stack of traversed objects.\n  aStack.pop();\n  bStack.pop();\n  return true;\n}\n\n// Perform a deep comparison to check if two objects are equal.\nexport function isEqual(a, b) {\n  return eq(a, b);\n}\n\n// Is a given array, string, or object empty?\n// An \"empty\" object has no enumerable own-properties.\nexport function isEmpty(obj) {\n  if (obj == null) return true;\n  if (isArrayLike(obj) && (isArray(obj) || isString(obj) || isArguments(obj))) return obj.length === 0;\n  return keys(obj).length === 0;\n}\n\n// Is a given value a DOM element?\nexport function isElement(obj) {\n  return !!(obj && obj.nodeType === 1);\n}\n\n// Internal function for creating a toString-based type tester.\nfunction tagTester(name) {\n  return function(obj) {\n    return toString.call(obj) === '[object ' + name + ']';\n  };\n}\n\n// Is a given value an array?\n// Delegates to ECMA5's native Array.isArray\nexport var isArray = nativeIsArray || tagTester('Array');\n\n// Is a given variable an object?\nexport function isObject(obj) {\n  var type = typeof obj;\n  return type === 'function' || type === 'object' && !!obj;\n}\n\n// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet.\nexport var isArguments = tagTester('Arguments');\nexport var isFunction = tagTester('Function');\nexport var isString = tagTester('String');\nexport var isNumber = tagTester('Number');\nexport var isDate = tagTester('Date');\nexport var isRegExp = tagTester('RegExp');\nexport var isError = tagTester('Error');\nexport var isSymbol = tagTester('Symbol');\nexport var isMap = tagTester('Map');\nexport var isWeakMap = tagTester('WeakMap');\nexport var isSet = tagTester('Set');\nexport var isWeakSet = tagTester('WeakSet');\n\n// Define a fallback version of the method in browsers (ahem, IE < 9), where\n// there isn't any inspectable \"Arguments\" type.\n(function() {\n  if (!isArguments(arguments)) {\n    isArguments = function(obj) {\n      return _has(obj, 'callee');\n    };\n  }\n}());\n\n// Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n// IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\nvar nodelist = root.document && root.document.childNodes;\nif (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n  isFunction = function(obj) {\n    return typeof obj == 'function' || false;\n  };\n}\n\n// Is a given object a finite number?\nexport function isFinite(obj) {\n  return !isSymbol(obj) && _isFinite(obj) && !_isNaN(parseFloat(obj));\n}\n\n// Is the given value `NaN`?\nexport function isNaN(obj) {\n  return isNumber(obj) && _isNaN(obj);\n}\n\n// Is a given value a boolean?\nexport function isBoolean(obj) {\n  return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n}\n\n// Is a given value equal to null?\nexport function isNull(obj) {\n  return obj === null;\n}\n\n// Is a given variable undefined?\nexport function isUndefined(obj) {\n  return obj === void 0;\n}\n\n// Shortcut function for checking if an object has a given property directly\n// on itself (in other words, not on a prototype).\nexport function has(obj, path) {\n  if (!isArray(path)) {\n    return _has(obj, path);\n  }\n  var length = path.length;\n  for (var i = 0; i < length; i++) {\n    var key = path[i];\n    if (obj == null || !hasOwnProperty.call(obj, key)) {\n      return false;\n    }\n    obj = obj[key];\n  }\n  return !!length;\n}\n\n// Utility Functions\n// -----------------\n\n// Keep the identity function around for default iteratees.\nexport function identity(value) {\n  return value;\n}\n\n// Predicate-generating functions. Often useful outside of Underscore.\nexport function constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nexport function noop(){}\n\n// Creates a function that, when passed an object, will traverse that object’s\n// properties down the given `path`, specified as an array of keys or indexes.\nexport function property(path) {\n  if (!isArray(path)) {\n    return shallowProperty(path);\n  }\n  return function(obj) {\n    return deepGet(obj, path);\n  };\n}\n\n// Generates a function for a given object that returns a given property.\nexport function propertyOf(obj) {\n  if (obj == null) {\n    return function(){};\n  }\n  return function(path) {\n    return !isArray(path) ? obj[path] : deepGet(obj, path);\n  };\n}\n\n// Returns a predicate for checking whether an object has a given set of\n// `key:value` pairs.\nexport function matcher(attrs) {\n  attrs = extendOwn({}, attrs);\n  return function(obj) {\n    return isMatch(obj, attrs);\n  };\n}\nexport { matcher as matches };\n\n// Run a function **n** times.\nexport function times(n, iteratee, context) {\n  var accum = Array(Math.max(0, n));\n  iteratee = optimizeCb(iteratee, context, 1);\n  for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n  return accum;\n}\n\n// Return a random integer between min and max (inclusive).\nexport function random(min, max) {\n  if (max == null) {\n    max = min;\n    min = 0;\n  }\n  return min + Math.floor(Math.random() * (max - min + 1));\n}\n\n// A (possibly faster) way to get the current timestamp as an integer.\nexport var now = Date.now || function() {\n  return new Date().getTime();\n};\n\n// List of HTML entities for escaping.\nvar escapeMap = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#x27;',\n  '`': '&#x60;'\n};\nvar unescapeMap = invert(escapeMap);\n\n// Functions for escaping and unescaping strings to/from HTML interpolation.\nfunction createEscaper(map) {\n  var escaper = function(match) {\n    return map[match];\n  };\n  // Regexes for identifying a key that needs to be escaped.\n  var source = '(?:' + keys(map).join('|') + ')';\n  var testRegexp = RegExp(source);\n  var replaceRegexp = RegExp(source, 'g');\n  return function(string) {\n    string = string == null ? '' : '' + string;\n    return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n  };\n}\nexport var escape = createEscaper(escapeMap);\nexport var unescape = createEscaper(unescapeMap);\n\n// Traverses the children of `obj` along `path`. If a child is a function, it\n// is invoked with its parent as context. Returns the value of the final\n// child, or `fallback` if any child is undefined.\nexport function result(obj, path, fallback) {\n  if (!isArray(path)) path = [path];\n  var length = path.length;\n  if (!length) {\n    return isFunction(fallback) ? fallback.call(obj) : fallback;\n  }\n  for (var i = 0; i < length; i++) {\n    var prop = obj == null ? void 0 : obj[path[i]];\n    if (prop === void 0) {\n      prop = fallback;\n      i = length; // Ensure we don't continue iterating.\n    }\n    obj = isFunction(prop) ? prop.call(obj) : prop;\n  }\n  return obj;\n}\n\n// Generate a unique integer id (unique within the entire client session).\n// Useful for temporary DOM ids.\nvar idCounter = 0;\nexport function uniqueId(prefix) {\n  var id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n// By default, Underscore uses ERB-style template delimiters, change the\n// following template settings to use alternative delimiters.\nexport var templateSettings = _.templateSettings = {\n  evaluate: /<%([\\s\\S]+?)%>/g,\n  interpolate: /<%=([\\s\\S]+?)%>/g,\n  escape: /<%-([\\s\\S]+?)%>/g\n};\n\n// When customizing `templateSettings`, if you don't want to define an\n// interpolation, evaluation or escaping regex, we need one that is\n// guaranteed not to match.\nvar noMatch = /(.)^/;\n\n// Certain characters need to be escaped so that they can be put into a\n// string literal.\nvar escapes = {\n  \"'\": \"'\",\n  '\\\\': '\\\\',\n  '\\r': 'r',\n  '\\n': 'n',\n  '\\u2028': 'u2028',\n  '\\u2029': 'u2029'\n};\n\nvar escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\nvar escapeChar = function(match) {\n  return '\\\\' + escapes[match];\n};\n\n// JavaScript micro-templating, similar to John Resig's implementation.\n// Underscore templating handles arbitrary delimiters, preserves whitespace,\n// and correctly escapes quotes within interpolated code.\n// NB: `oldSettings` only exists for backwards compatibility.\nexport function template(text, settings, oldSettings) {\n  if (!settings && oldSettings) settings = oldSettings;\n  settings = defaults({}, settings, _.templateSettings);\n\n  // Combine delimiters into one regular expression via alternation.\n  var matcher = RegExp([\n    (settings.escape || noMatch).source,\n    (settings.interpolate || noMatch).source,\n    (settings.evaluate || noMatch).source\n  ].join('|') + '|$', 'g');\n\n  // Compile the template source, escaping string literals appropriately.\n  var index = 0;\n  var source = \"__p+='\";\n  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n    source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n    index = offset + match.length;\n\n    if (escape) {\n      source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n    } else if (interpolate) {\n      source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n    } else if (evaluate) {\n      source += \"';\\n\" + evaluate + \"\\n__p+='\";\n    }\n\n    // Adobe VMs need the match returned to produce the correct offset.\n    return match;\n  });\n  source += \"';\\n\";\n\n  // If a variable is not specified, place data values in local scope.\n  if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n  source = \"var __t,__p='',__j=Array.prototype.join,\" +\n    \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n    source + 'return __p;\\n';\n\n  var render;\n  try {\n    render = new Function(settings.variable || 'obj', '_', source);\n  } catch (e) {\n    e.source = source;\n    throw e;\n  }\n\n  var template = function(data) {\n    return render.call(this, data, _);\n  };\n\n  // Provide the compiled source as a convenience for precompilation.\n  var argument = settings.variable || 'obj';\n  template.source = 'function(' + argument + '){\\n' + source + '}';\n\n  return template;\n}\n\n// Add a \"chain\" function. Start chaining a wrapped Underscore object.\nexport function chain(obj) {\n  var instance = _(obj);\n  instance._chain = true;\n  return instance;\n}\n\n// OOP\n// ---------------\n// If Underscore is called as a function, it returns a wrapped object that\n// can be used OO-style. This wrapper holds altered versions of all the\n// underscore functions. Wrapped objects may be chained.\n\n// Helper function to continue chaining intermediate results.\nfunction chainResult(instance, obj) {\n  return instance._chain ? _(obj).chain() : obj;\n}\n\n// Add your own custom functions to the Underscore object.\nexport function mixin(obj) {\n  each(functions(obj), function(name) {\n    var func = _[name] = obj[name];\n    _.prototype[name] = function() {\n      var args = [this._wrapped];\n      push.apply(args, arguments);\n      return chainResult(this, func.apply(_, args));\n    };\n  });\n  return _;\n}\n\n// Add all mutator Array functions to the wrapper.\neach(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n  var method = ArrayProto[name];\n  _.prototype[name] = function() {\n    var obj = this._wrapped;\n    method.apply(obj, arguments);\n    if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n    return chainResult(this, obj);\n  };\n});\n\n// Add all accessor Array functions to the wrapper.\neach(['concat', 'join', 'slice'], function(name) {\n  var method = ArrayProto[name];\n  _.prototype[name] = function() {\n    return chainResult(this, method.apply(this._wrapped, arguments));\n  };\n});\n\n// Extracts the result from a wrapped and chained object.\n_.prototype.value = function() {\n  return this._wrapped;\n};\n\n// Provide unwrapping proxy for some methods used in engine operations\n// such as arithmetic and JSON stringification.\n_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n_.prototype.toString = function() {\n  return String(this._wrapped);\n};\n","'use strict';\n\n/**\n * Product Details Module\n */\n\nvar ImageGallery = require('./imageGallery');\nvar loyalty = require('./loyalty');\nvar breakpoints = require('../components/breakpoints');\nvar utils = require('../components/utils');\nvar base = require('./base');\nvar sizefitJs = require('../sizefit/sizefit');\nvar tabbedContainer = require('../aem/tabbedContainer');\nvar overflowSlider = require('../aem/overflowSlider');\nvar _ = require('underscore');\nvar pollWriteAReviewButtonInterval = 250;\nvar pollCountMax = 5;\nvar initialPageLoad = true;\n\n/**\n * Make the Add to Cart Button Sticky\n */\nfunction stickyAddToCart() {\n    var $stickyButton = $('.add-to-cart__container');\n\n    if ($stickyButton.length === 0 || breakpoints.isHighRes()) {\n        return;\n    }\n\n    var stickyButtonOffsetTop = $stickyButton.offset().top;\n\n    $(window)\n        .off('scroll.stickyAddToCart')\n        .on('scroll.stickyAddToCart', _.throttle(function () {\n            var $discountPercentage = $stickyButton.find('.js-discount-percent');\n            var $pranaRating = $stickyButton.find('.js-prana-rating');\n            if ($(this).scrollTop() > stickyButtonOffsetTop) {\n                $('html').addClass('is-addToCart-sticky');\n                $discountPercentage.addClass('d-none');\n                $pranaRating.removeClass('d-none d-lg-inline-block');\n                $('.footer-container__copyright').addClass('mb-8');\n            } else {\n                $('html').removeClass('is-addToCart-sticky');\n                $discountPercentage.removeClass('d-none');\n                $pranaRating.addClass('d-none d-lg-inline-block');\n                $('.footer-container__copyright').removeClass('mb-8');\n            }\n        }, 100));\n}\n\n/**\n * Klarna Placements\n * The data.price object does not always contain the price that is displayed on the page,\n * So to get the displayed price, we'll scrape it from the page.\n */\nfunction refreshKlarnaPlacements() {\n    var displayedPrice = $('.prices .value:first').attr('content'); // content attribute is the unformatted value.\n    var klarnaPriceValue = displayedPrice ? Math.round(displayedPrice * 100) : 1;\n    $('klarna-placement').attr('data-purchase-amount', klarnaPriceValue); // CAN NOT USE .data() HERE. Gotta update the attribute directly.\n    if (window.Klarna && window.Klarna.OnsiteMessaging) {\n        window.Klarna.OnsiteMessaging.refresh();\n    }\n}\n\n/**\n * Update Product Attributes and Details\n */\nfunction updateAttributesAndDetails() {\n    $('body').on('product:statusUpdate', function (e, data) {\n        /**\n         * Get a reference to the product container\n         */\n        var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\n\n        /**\n         * Product Description and Details\n         */\n        $productContainer.find('.description-and-detail .product-attributes')\n            .empty()\n            .html(data.attributesHtml);\n\n        if (data.shortDescription) {\n            $productContainer.find('.description-and-detail .description')\n                .removeClass('hidden-xl-down');\n            $productContainer.find('.description-and-detail .description .content')\n                .empty()\n                .html(data.shortDescription);\n        } else {\n            $productContainer.find('.description-and-detail .description')\n                .addClass('hidden-xl-down');\n        }\n\n        if (data.longDescription) {\n            $productContainer.find('.description-and-detail .details')\n                .removeClass('hidden-xl-down');\n            $productContainer.find('.description-and-detail .details .content')\n                .empty()\n                .html(data.longDescription);\n        } else {\n            $productContainer.find('.description-and-detail .details')\n                .addClass('hidden-xl-down');\n        }\n\n        /**\n         * Product In-Store Pickup\n         */\n        var $inStorePickupContainer = $('.product-detail .product-instore__inventory');\n\n        if ($inStorePickupContainer.length > 0) {\n            if (data.availableForInStorePickup) {\n                $inStorePickupContainer.removeClass('d-none');\n            } else {\n                $inStorePickupContainer.addClass('d-none');\n            }\n        }\n\n        /**\n         * Klarna Placements\n         */\n        refreshKlarnaPlacements();\n    });\n}\n\n/**\n * Show the Spinner\n */\nfunction showSpinner() {\n    if (window.resources.enableServerSideGallery) {\n        $('body').on('product:beforeAddToCart', function () {\n            $.spinner().start();\n        });\n    } else {\n        $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\n            $.spinner().start();\n        });\n    }\n}\n\n/**\n * Update Product Attributes\n */\nfunction updateAttribute() {\n    $('body').on('product:afterAttributeSelect', function (e, response) {\n        if ($('.product-detail>.bundle-items').length) {\n            $(response.container).data('pid', response.data.product.id);\n            $(response.container).find('.product-id')\n                .data('pid', response.data.product.id)\n                .text(response.data.product.masterId);\n        } else if ($('.product-set-detail').eq(0)) {\n            $(response.container).data('pid', response.data.product.id);\n            $(response.container).find('.product-id')\n                .data('pid', response.data.product.id)\n                .text(response.data.product.masterId);\n        } else {\n            $('.product-id').data('pid', response.data.product.id)\n                .text(response.data.product.masterId);\n            $('.product-detail:not(\".bundle-item\")').data('pid', response.data.product.id);\n        }\n    });\n}\n\n/**\n * Update the Add To Cart Button\n */\nfunction updateAddToCart() {\n    $('body').on('product:updateAddToCart', function (e, response) {\n        // update local add to cart (for sets)\n        if (response.product.readyToOrder && !response.product.available) {\n            $('.js-product__message--partners').show();\n        }\n\n        if (base.isEverythingSelected()) {\n            $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').attr('disabled', false);\n        }\n\n        // Upon initial load, products are not ready for order because a size isn't selected (unless O/S or only one size in stock).\n        // At that time, the button to add to cart should be enabled until the customer clicks it.\n        // After that, the button should disabled and the customer should follow displayed messaging regarding making a selection.\n        const disableAddToCart = !response.product.available || (!response.product.readyToOrder && !initialPageLoad);\n        $('button.add-to-cart, button.update-cart-product-global', response.$productContainer)\n            .attr('disabled', disableAddToCart)\n            .text(response.product.buttonText);\n\n        if (disableAddToCart) {\n            initialPageLoad = false;\n        }\n\n        let enable = $('.product-availability').toArray().every(function (item) {\n            return $(item).data('available') && $(item).data('ready-to-order');\n        });\n\n        if (enable) {\n            $('.js-product__message--partners').hide();\n        }\n    });\n}\n\n/**\n * Update Product Availability\n */\nfunction updateAvailability() {\n    $('body').on('product:updateAvailability', function (e, response) {\n        $('div.availability', response.$productContainer)\n            .data('ready-to-order', response.product.readyToOrder)\n            .data('available', response.product.available);\n\n        // Might need to preface with div.availability\n        const $availabilityMsgContainer = $('.availability-msg', response.$productContainer).toggleClass('d-none', !response.message);\n\n        if (response.availabilityMessages && response.availabilityMessages.length) {\n            response.availabilityMessages.forEach(message => {\n                $availabilityMsgContainer.alert({\n                    content: message.content,\n                    theme: message.theme,\n                    dismissible: false,\n                    autoClose: false\n                });\n            });\n        }\n\n        $('.product__message--velocity', response.$productContainer)\n            .empty()\n            .html(response.velocityMessage);\n\n        $('.selectswatch-' + response.selectedAttributeID + '-msg', response.$productContainer).removeClass('d-inline').addClass('d-none');\n\n        $('.outofstock-combination-msg', response.$productContainer);\n\n        if (response.product.notifyme && !response.product.isMaster) {\n            $('.product__add-to-cart', response.$productContainer).hide();\n            $('.product__notify-me', response.$productContainer).show();\n            $('.product__message--velocity', response.$productContainer).addClass('product__message--velocity--notifyme').show();\n            $('.outofstock-combination-msg', response.$productContainer).show();\n            $('input[name=variantPID]', response.$productContainer).val(response.product.id);\n        } else {\n            $('.product__add-to-cart', response.$productContainer).show();\n            $('.product__notify-me', response.$productContainer).hide();\n            $('input[name=variantPID]', response.$productContainer).val('');\n\n            // Display inventory threshold message\n            if (response.velocityMessage !== '') {\n                $('.product__message--velocity', response.$productContainer).removeClass('product__message--velocity--notifyme').show();\n            }\n        }\n\n        if ($('.global-availability').length) {\n            // This is used for a Product Bundles and Product Sets. Checks all the\n            // sub-products for Available and Ready. If all selected variants are\n            // selected, then update the global-availability data.\n            var allAvailable = $('.product-availability').toArray()\n                .every(function (item) { return $(item).data('available'); });\n\n            var allReady = $('.product-availability').toArray()\n                .every(function (item) { return $(item).data('ready-to-order'); });\n\n            $('.global-availability')\n                .data('ready-to-order', allReady)\n                .data('available', allAvailable);\n\n            $('.global-availability .availability-msg').empty(); // response.resources.info_selectforstock\n\n            if (response.availabilityMessages && response.availabilityMessages.length) {\n                response.availabilityMessages.forEach(message => {\n                    $availabilityMsgContainer.alert({\n                        content: message.content,\n                        theme: message.theme,\n                        dismissible: false,\n                        autoClose: false\n                    });\n                });\n            }\n        }\n        $('.accordion').trigger('collapse-changed'); // Refresh hc-sticky to avoid ovelaping content\n        $('body').trigger('product:checkOutOfStock', response);\n    });\n}\n\n/**\n * Scroll the viewport to the a given accordion section\n *\n * @param {string} sectionSelector - Accordian Section to scroll to\n * @param {JQuery} $productDetailsContainer - Reference to product detail container\n */\nfunction scrollToAccordionSection(sectionSelector, $productDetailsContainer) {\n    var $productAccordianDrawer = $productDetailsContainer.find(sectionSelector);\n\n    if ($productAccordianDrawer.length) {\n        $productAccordianDrawer.collapse('show');\n\n        var headerHeight = $('.js-site-header').height();\n\n        $('html, body').animate({\n            scrollTop: $productAccordianDrawer.closest('.accordion__section').offset().top - headerHeight - 10\n        }, 300);\n    }\n}\n\n/**\n * Initialize the Image Gallery\n */\nfunction initGallery() {\n    const swiperImageGallery = new ImageGallery();\n    swiperImageGallery.init();\n}\n\n/**\n * Hide Size Fit Modal\n */\nvar hideSizeFitModal = () => {\n    $('.sizefit-modal').remove(); // this class is added to the modal when it is created, in createQVModal().\n    // also remove the backdrop\n    $('.modal-backdrop').remove();\n    $('body').removeClass('modal-open').css('padding-right', '');\n    $.enableScroll();\n    $(window).trigger('scroll');\n};\n\n/**\n * Create Modal for SizeFIt Guide\n * @returns {HTMLElement} $modal - Reference to modal JQuery object\n */\nvar createSizeFitModal = () => {\n    var isMobile = breakpoints.isLowRes();\n    var modalConfig = {\n        customClasses: 'sizefit-modal'\n    };\n    if (isMobile) {\n        modalConfig.centeredClass = 'modal-dialog-scrollable banner-size-fit';\n    }\n    let modalMarkup = utils.createModalMarkup('', modalConfig);\n    let $modal = $(modalMarkup).modal();\n    $modal.on('hidden.bs.modal', () => {\n        hideSizeFitModal();\n    });\n    return $modal;\n};\n\n/**\n * Fetches sizefitguide html from server and launches modal\n * @param {string} sizeGuideUrl  - SizeFit Guide view controller endpoint url\n * @param {HTMLElement} $modal - Reference to modal JQuery object\n */\nvar launchSizeGuide = (sizeGuideUrl, $modal) => {\n    if (!sizeGuideUrl) {\n        return;\n    }\n\n    if (!$modal) {\n        $modal = createSizeFitModal(); // eslint-disable-line no-param-reassign\n    }\n\n    $modal.modal('show');\n    $.spinner().start();\n\n    let successHandler = (html, unitType) => {\n        $modal.find('.modal-body').html(html);\n        tabbedContainer.init();\n        overflowSlider();\n        if (window.ssp) {\n            window.ssp('start', 'fitpredictor');\n        }\n        if (sizeGuideUrl.indexOf('GarmentGuide') > -1) {\n            var sizefitSwitch = $modal.find('.js-garment-sizefit');\n            var toggleHTML = `<div class=\"d-block\">\n                <div class=\"d-flex justify-content-end\">\n                    <button class=\"js-unit-toggle toggle-btn px-3 pb-3 pt-0 ${unitType} btn\">\n                        <span>\n                            IN\n                            <svg class=\"toggle-in align-bottom\" width=\"24\" height=\"24\"><use href=\"${'#'}toggle_off\"></use></svg>\n                            <svg class=\"toggle-cm align-bottom\" width=\"24\" height=\"24\"><use href=\"${'#'}toggle_on\"></use></svg>\n                            CM\n                        </span>\n                    </button>\n                </div>\n            </div>`;\n            sizefitSwitch.html(toggleHTML);\n        }\n        sizefitJs.initSizeFit();\n    };\n\n    $.ajax({\n        url: sizeGuideUrl,\n        method: 'GET',\n        dataType: 'json',\n        success: (data) => {\n            if (!$modal[0].parentElement) {\n                // success was called before the modal is shown.\n                $modal.on('shown.bs.modal', () => {\n                    successHandler(data.renderedTemplate, data.unitType);\n                });\n            } else {\n                successHandler(data.renderedTemplate, data.unitType);\n            }\n        },\n        complete: () => {\n            $.spinner().stop();\n            $.disableScroll();\n        },\n        error: () => {\n            hideSizeFitModal();\n        }\n    });\n};\n\n/**\n * Sets Out of Stock status text based on the selectable/unselectable state of the attribute\n * @param {jQuery} $swatchEntered  - targeted swatch on click/hover\n * @param {string} selectedValue - selected text value\n * @param {jQuery} $attributeLabelValue - selected text element\n * @param {jQuery} $auxSwatch optional parameter that indicates an auxiliary swatch should be updated\n */\nfunction setSelectedInventoryStatus($swatchEntered, selectedValue, $attributeLabelValue, $auxSwatch) {\n    const outOfStockText = $swatchEntered.closest('[data-attr-oos-text]').data('attr-oos-text');\n\n    if (selectedValue !== undefined) {\n        if ($swatchEntered.hasClass('unselectable')) {\n            $attributeLabelValue.text(selectedValue + ' ' + outOfStockText).addClass('text-danger');\n            if ($auxSwatch) {\n                $auxSwatch.attr('data-attr-oos', outOfStockText);\n            } else {\n                $swatchEntered.attr('data-attr-oos', outOfStockText);\n            }\n        } else {\n            $attributeLabelValue.text(selectedValue).removeClass('text-danger');\n            if ($auxSwatch) {\n                $auxSwatch.attr('data-attr-oos', '');\n            } else {\n                $swatchEntered.attr('data-attr-oos', '');\n            }\n        }\n    }\n}\n\n/**\n * Custom events on Attribute click and hover\n */\nfunction onSelectAttribute() {\n    // Color Attribute click event to display selected/selectable status\n    $('.js-product-content').on('attribute:click', '.js-color-swatch, .js-size-swatch, .js-dimension-swatch', function (e) {\n        const $swatchClicked = $(e.currentTarget);\n        const attrType = $swatchClicked.closest('.js-attribute').data('attr');\n        const $attrValue = $swatchClicked.closest('.js-attribute').find('.js-attr-label-value');\n        let selectedValue;\n\n        if (attrType === 'color') {\n            selectedValue = $swatchClicked.find('.color-value').attr('title');\n        } else {\n            const $selectedColorSwatch = $('.js-attribute-color .js-color-swatch.selected');\n            const $colorValue = $selectedColorSwatch.closest('.js-attribute').find('.js-attr-label-value');\n            const colorSelected = $selectedColorSwatch.find('.color-value').attr('title');\n            selectedValue = $swatchClicked.data('attr-hover');\n\n            // Color label may also need to be updated to reflect inventory status when a size/dimension swatchis selected\n            setSelectedInventoryStatus($swatchClicked, colorSelected, $colorValue, $selectedColorSwatch);\n        }\n\n        setSelectedInventoryStatus($swatchClicked, selectedValue, $attrValue);\n    });\n\n    // Attribute Select event to get the new attribute selected/selectable status for Size/Dimension attributes\n    $(document).on('attribute:select', '.product-detail .js-size-swatch, .product-detail .js-dimension-swatch', function (e, $attrValue, attrValue) {\n        const outOfStockText = $attrValue.closest('[data-attr-oos-text]').data('attr-oos-text');\n        const attributeLabelValue = $attrValue.closest('.js-attribute').find('.js-attr-label-value');\n        attributeLabelValue.text($attrValue.data('attr-hover'));\n        if (!attrValue.selectable) {\n            attributeLabelValue.addClass('text-danger').text($attrValue.data('attr-hover') + ' ' + outOfStockText);\n            $attrValue.attr('data-attr-oos', outOfStockText);\n        } else {\n            attributeLabelValue.removeClass('text-danger').text($attrValue.data('attr-hover'));\n            $attrValue.attr('data-attr-oos', '');\n        }\n    });\n}\n\n/**\n * Poll to see when the write a review button loads in the ratings and reviews accordion section.\n *  - activate by setting url param: bvOpenWriteReview=true\n */\nfunction onWriteReviewButtonPoll() {\n    var pollCallback = function () {\n        var queryString = utils.getParamsFromURL(window.location.search);\n\n        if (queryString && queryString.bvOpenWriteReview && queryString.bvOpenWriteReview === 'true') {\n            if (pollCountMax > 0) {\n                pollCountMax -= 1;\n                var $button = $('.bv-write-review.bv-submission-button:button');\n                if ($button.length === 1) {\n                    $button.click();\n                } else {\n                    setTimeout(pollCallback, pollWriteAReviewButtonInterval);\n                }\n            }\n        }\n    };\n\n    setTimeout(pollCallback, pollWriteAReviewButtonInterval);\n}\n\n/**\n * Method to observe review drawer and check if any comments are added\n */\nfunction observeReviewDrawer() {\n    const $targetNode = $('.js-review-drawer')[0];\n    const config = { attributes: true, childList: true, subtree: true };\n    const observer = new MutationObserver(function (mutationsList) {\n        for (const mutation of mutationsList) {\n            if (mutation.type === 'childList') {\n                if ($('.js-review-drawer').find('ol li').length >= 1) {\n                    var $bvReviewRatings = $('.js-true-to-size');\n                    if ($bvReviewRatings.length) {\n                        $bvReviewRatings.removeClass('d-none');\n                        observer.disconnect();\n                    }\n                }\n            }\n        }\n    });\n    // Start observing the target node for configured mutations\n    if ($targetNode) {\n        observer.observe($targetNode, config);\n    }\n}\n\n/**\n * Ensure proper formatting of global process variable\n */\nfunction enforceGlobalProcessFormatting() {\n    let internalProcessValue;\n    let processCopy = window.process; // get initial process value if it exists\n\n    /**\n     * Checks if param is an object\n     * @param {*} param to check type of\n     * @returns {boolean} if param is an object\n     */\n    function isObject(param) {\n        return typeof param === 'object' && param !== null && !Array.isArray(param);\n    }\n\n    Object.defineProperty(window, 'process', {\n        get: function () {\n            if (typeof internalProcessValue === 'undefined') { // if value not previously set\n                const processValue = isObject(processCopy) ? processCopy : {}; // process must be an object\n                processValue.env = isObject(processValue.env) ? processValue.env : {}; // process.env must be an object\n\n                internalProcessValue = processValue;\n            }\n\n            return internalProcessValue;\n        },\n        set: function (param) {\n            processCopy = isObject(processCopy) ? processCopy : {}; // process must be an object\n            const processParam = isObject(param) ? param : {}; // process must be an object\n            const processValue = Object.assign({}, processCopy, processParam); // combine existing and new process properties\n            processValue.env = isObject(processValue.env) ? processValue.env : {}; // process.env must be an object\n\n            processCopy = processValue; // update copied process value\n            internalProcessValue = processValue;\n        }\n    });\n}\n\n/**\n * PLEASE NOTE\n * THE FOLLOWING METHODS HAVE BEEN INCLUDED GLOBALLY IN product/pdpActions.js FOR QUICKVIEW,\n * SO NO NEED TO INCLUDE THEM HERE\n *\n * selectAttribute: base.selectAttribute,\n * availabilty: base.avaliability,\n * addToCart: base.addToCart,\n **/\n\nmodule.exports = {\n    /**\n     * This is necessary for page load if the product variant is already selected.\n     *\n     * Edit productDetails.isml to add the master ID\n     *\n     *\n     * Check Quick View\n     *\n     *\n     * Also check to make sure everything is selected\n     *\n     * Check Gift Card\n     *\n     * * Check to see if the data-pid is the same as the master id, if it is do the following:\n     *\n     * may only need to call attributeSelect once, pick the first and then fire\n     *\n     */\n    init: function () {\n        const $productContainer = $('.product-detail');\n        const $dimensionSwatchSelected = $('.product__attributes .js-dimension-swatch.selected.selectable');\n        const $sizeSwatchSelected = $('.product__attributes .js-size-swatch.selected');\n        const $selectedColorSwatch = $('.js-attribute-color .js-color-swatch.selected');\n        const $colorValue = $selectedColorSwatch.closest('.js-attribute').find('.js-attr-label-value');\n        const colorSelected = $selectedColorSwatch.find('.color-value').attr('title');\n        const queryScOnLoad = utils.getParamsFromURL(window.location.search);\n\n        observeReviewDrawer();\n\n        if (queryScOnLoad && queryScOnLoad.scOnLoad && queryScOnLoad.scOnLoad.toUpperCase() === 'Y') {\n            launchSizeGuide($('.js-sizeguide-modal').attr('data-link'), '');\n        }\n\n        if ($productContainer.data('pid') === $productContainer.data('master-pid')) {\n            if (base.isEverythingSelected()) {\n                const $swatchSelected = $('.product__attributes a.selected').first();\n                const selectedAttributeID = $swatchSelected.closest('.js-attribute').data('attr');\n\n                base.attributeSelect($swatchSelected.data('attr-url'), $productContainer, selectedAttributeID);\n            } else if ($dimensionSwatchSelected.length && !$sizeSwatchSelected.length) {\n                base.attributeSelect($dimensionSwatchSelected.data('attr-url'), $productContainer, 'dimension');\n            }\n        }\n\n        // Refresh Product-Variation data based on initial selection\n        if ($productContainer.data('availability-refresh')) {\n            var customValueUrl = $('.js-color-swatch.selected').data('attr-url');\n            base.attributeSelect(customValueUrl, $productContainer, 'inventory');\n        }\n\n        base.updateOOSColorVariants($productContainer);\n        setSelectedInventoryStatus($sizeSwatchSelected, colorSelected, $colorValue, $selectedColorSwatch);\n        refreshKlarnaPlacements();\n\n        // Flag swatches to indicate notify me status (see base.forceOOSNotifyMe)\n        base.setVariantNotifyMeStatus();\n    },\n    initProcess: enforceGlobalProcessFormatting,\n    stickyAddToCart: stickyAddToCart,\n    updateAttributesAndDetails: updateAttributesAndDetails,\n    showSpinner: showSpinner,\n    updateAttribute: updateAttribute,\n    updateAddToCart: updateAddToCart,\n    updateAvailability: updateAvailability,\n    onScrollToDetails: () => {\n        $(document).on('click', '.js-view-details-jumplink', function (e) {\n            e.preventDefault();\n            var $productDetailsContainer = $(this).closest('.product-detail');\n            scrollToAccordionSection('#product-accordion-details', $productDetailsContainer);\n        });\n    },\n    initGallery: function () {\n        initGallery();\n\n        $(document).on('product:swiper:update', function () {\n            initGallery();\n        });\n    },\n    initLoyalty: loyalty.init,\n    onClickReviewStars: function () {\n        $(window).on('load', function () {\n            $(document).on('click', '.product-detail .ratings, .js-accordion-reviews, .true-to-size, .bv_modal_component_container .bv_button_buttonFull', function (e) {\n                e.preventDefault();\n                var $productDetailsContainer = $(this).closest('.product-detail');\n                if (!$productDetailsContainer.length) {\n                    $productDetailsContainer = $('.product-detail');\n                }\n                scrollToAccordionSection('#product-accordion-reviews', $productDetailsContainer);\n            });\n            // Reviews Drawer should be open on page load while clicking review rating from product list page.\n            var queryParamProductReviews = utils.getParamsFromURL(window.location.search);\n            if (queryParamProductReviews && queryParamProductReviews.bvOpen && queryParamProductReviews.bvOpen.toUpperCase() === 'TRUE') {\n                scrollToAccordionSection('#product-accordion-reviews', $('.product-detail'));\n            }\n        });\n    },\n    launchOmnibusReviewModal: function () {\n        $('body')\n            .off('click', '.js-omnibus-review-msg')\n            .on('click', '.js-omnibus-review-msg', (e) => {\n                e.preventDefault();\n                const $this = $(e.currentTarget);\n                const modalTitle = $this.data('message-title');\n                const modalContent = $this.data('message-content');\n                $.modal({\n                    title: modalTitle,\n                    content: modalContent,\n                    modalSizeClass: 'modal-md modal-pad-fix'\n                });\n            });\n    },\n    launchSizeGuideModal: function () {\n        $('body')\n            .off('click', '.js-sizeguide-modal')\n            .on('click', '.js-sizeguide-modal', (e) => {\n                e.preventDefault();\n                let $this = $(e.currentTarget);\n                let $modal = createSizeFitModal();\n                launchSizeGuide($this.data('link'), $modal);\n            });\n    },\n    onSelectAttribute: onSelectAttribute,\n    onWriteReviewButtonPoll: onWriteReviewButtonPoll,\n    forceOOSNotifyMe: base.forceOOSNotifyMe\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 */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","'use strict';\n/**\n * File includes the ajax call to submit the notifyMe form\n */\nlet formValidation = require('../components/formValidation');\n\n/**\n * Add error message to invalid feedback container\n * @param  {string} message validation error message\n * @return {void}\n */\nfunction showValidationFeedback(message) {\n    $('.invalid-feedback').text(message).show();\n}\n\n/**\n * Clears and hides the invalid feedback container\n * @return {void}\n */\nfunction clearValidationFeedback() {\n    $('.is-invalid').removeClass('is-invalid');\n    $('.invalid-feedback').empty().hide();\n}\n\n/**\n * Validates HTML input fields\n * @param  {HTMLElement} inputElem HTML input element to be validated\n * @return {array} is input valid, validation message\n */\nfunction checkValidInput(inputElem) {\n    inputElem.setCustomValidity('');\n    if (!inputElem.checkValidity()) { // if input is invalid\n        $(inputElem).addClass('is-invalid').closest('.form-group').addClass('is-invalid');\n        return [false, inputElem.validationMessage];\n    }\n    return [true, ''];\n}\n\n/**\n * Validates form by checking each input\n * @return {boolean} is form valid\n */\nfunction validateNotifyMeForm() {\n    clearValidationFeedback();\n    if ($('.notifyMeForm')[0] && !$('.notifyMeForm')[0].checkValidity()) { // if form invalid\n        let errors = '';\n        $('.notifyMeForm div.material-text-input').find('input').each(function () { // loop through inputs\n            let [validationResult, validationResponse] = checkValidInput(this);\n            if (!validationResult) { // if input is invalid\n                errors += validationResponse + ' '; // add error message\n            }\n        });\n        if (errors) {\n            showValidationFeedback(errors); // display error messages\n            return false;\n        }\n    }\n    return true;\n}\n\n/**\n * If the form is valid submit it\n * @return {boolean} is form valid\n */\nfunction submitNotifyMeForm() {\n    let isValid = validateNotifyMeForm();\n    if (isValid) { // if form is valid\n        $('.notifyMeForm').trigger('submit');\n        $('.notify-me.btn').hide();\n    }\n    return isValid;\n}\n\n/**\n * Handles AJAX success response\n * @param  {Object} data AJAX return data\n * @return {void}\n */\nfunction handleNotifyMeSuccess(data) {\n    // hide velocity message and form (prevent duplicate submission)\n    $('.product__message--velocity').removeClass('product__message--velocity--notifyme').hide();\n    $('.notifyMeForm').hide();\n    // show response message\n    $('.notifyMeFormMessage').html(data.message).show();\n}\n\n/**\n * Changes form submit to make AJAX call\n * @return {void}\n */\nfunction registerNotifyMeForm() {\n    $(document).on('submit', '.notifyMeForm', function (e) {\n        let form = $(this);\n        e.preventDefault();\n        let url = form.attr('action');\n\n        if (!this.elements.variantPID.value) {\n            throw new Error('Notify Me: product variant not selected, invalid request.');\n        }\n\n        $.spinner().start();\n        $.ajax({\n            url: url,\n            type: 'POST',\n            dataType: 'json',\n            data: form.serialize(),\n            success: function (data) {\n                if (!data.success && data.success === false && 'fields' in data) {\n                    formValidation(form, data);\n                } else {\n                    handleNotifyMeSuccess(data);\n                }\n                $.spinner().stop();\n            },\n            error: function () {\n                $.spinner().stop();\n            }\n        });\n    });\n}\n\n/**\n * Builds the Notify Me form\n * @param {boolean|undefined} hideForm create notify me form without unhiding it\n * @return {void}\n */\nfunction createNotifyMeForm(hideForm) {\n    var $formContainer = $('.js-notifyMeFormContainer');\n    var $button = $('.notify-me.btn');\n\n    if ($button.data('cta') === 'showForm') {\n        /**\n         * Instead of remote including the Notify Me form\n         * when the page is loaded, only make the call\n         * when the form is requested (lazy load)\n         */\n        if ($button.data('is-loading')) {\n            return;\n        }\n\n        var lazyLoadUrl = $button.data('lazy-load-url');\n\n        if (!hideForm) {\n            // show form\n            $formContainer.show();\n        }\n\n        if ($formContainer.is(':empty')) {\n            /**\n             * Mark as loading before the call returns so rapid clicks by the user\n             * doesn't load the form multiple times.\n             */\n            $button.data('is-loading', true);\n\n            $.ajax({\n                url: lazyLoadUrl,\n                method: 'GET',\n                success: function (responseHTML) {\n                    $formContainer.append(responseHTML);\n\n                    // form creation event will prep form for validation\n                    $formContainer.find('form').trigger('form:created');\n\n                    // add variant ID to variant form input\n                    $formContainer.find('#variantPID').val($button.data('pid'));\n\n                    // hide response message\n                    $formContainer.find('.notifyMeFormMessage').empty().hide();\n\n                    // register listener for form submission\n                    $button.data('cta', 'submitForm');\n                    registerNotifyMeForm();\n                },\n                complete: function () {\n                    $button.data('is-loading', false);\n                }\n            });\n        } else {\n            // show form in case it is hidden\n            $formContainer.find('.notifyMeForm').show();\n            $button.data('cta', 'submitForm');\n        }\n    } else if ($button.data('cta') === 'submitForm') {\n        submitNotifyMeForm();\n    }\n}\n\nmodule.exports = {\n    init: function () {\n        $(document).on('click', '.notify-me.btn', function () {\n            createNotifyMeForm();\n        });\n\n        $(window).on('product:triggerNotifyMe', function (e, options) {\n            const hideForm = options && options.hideForm;\n            createNotifyMeForm(hideForm);\n        });\n\n        $(document).on('change blur', '.notifyMeForm input', function (e) {\n            clearValidationFeedback();\n\n            let [validationResult, validationResponse] = checkValidInput(this);\n\n            if (!$(e.target).val()) {\n                $(e.target).closest('.focus-fill').removeClass('focus-fill');\n            }\n            if (!validationResult) {\n                showValidationFeedback(validationResponse);\n            }\n        });\n\n        $(document).on('focus', '.notifyMeForm input', function (e) {\n            $(e.target).closest('.form-group').addClass('focus-fill');\n        });\n    }\n};\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n"],"sourceRoot":""}