{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"{\\\"$xs\\\":\\\"0\\\",\\\"$sm\\\":\\\"576px\\\",\\\"$md\\\":\\\"768px\\\",\\\"$lg\\\":\\\"992px\\\",\\\"$very-lg\\\":\\\"1280px\\\",\\\"$xl\\\":\\\"1440px\\\",\\\"$xxl\\\":\\\"1650px\\\"}\"","webpack:///./sitecore/Feature/Calculator/code/Assets/Calculator/js/lib/noUiSlider.js","webpack:///./sitecore/Feature/Calculator/code/Assets/Calculator/js/lib/popper.js","webpack:///(webpack)/buildin/global.js","webpack:///./sitecore/Feature/Calculator/code/Assets/Calculator/js/lib/swipe.js","webpack:///./sitecore/Feature/Calculator/code/Assets/Calculator/js/lib/steps-storage.js","webpack:///./sitecore/Feature/Calculator/code/Assets/Calculator/js/lib/calc-manager.js","webpack:///./sitecore/Feature/Calculator/code/Assets/Calculator/js/lib/utils.js","webpack:///./sitecore/Feature/Calculator/code/Assets/Calculator/js/lib/tippy.js","webpack:///./sitecore/Feature/Calculator/code/Assets/Calculator/js/lib/throttle-debounce.js","webpack:///./sitecore/Feature/Calculator/code/Assets/Calculator/js/lib/tooltips.js","webpack:///./sitecore/Feature/Calculator/code/Assets/Calculator/js/calc-manager.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","VERSION","removeElement","el","parentElement","removeChild","isSet","preventDefault","e","isNumeric","a","isNaN","isFinite","addClassFor","element","className","duration","addClass","setTimeout","removeClass","limit","Math","max","min","asArray","Array","isArray","countDecimals","numStr","pieces","String","split","length","classList","add","remove","replace","RegExp","join","getPageOffset","doc","supportPageOffset","undefined","window","pageXOffset","isCSS1Compat","compatMode","x","documentElement","scrollLeft","body","y","pageYOffset","scrollTop","subRangeRatio","pa","pb","fromPercentage","range","getJ","arr","j","toStepping","xVal","xPct","slice","va","vb","abs","toPercentage","getStep","xSteps","snap","b","to","round","closest","handleEntryPoint","index","that","percentage","Error","parseFloat","push","xHighestCompleteStep","handleStepPoint","totalSteps","xNumSteps","highestStep","ceil","Number","toFixed","step","Spectrum","entry","singleStep","this","ordered","sort","getMargin","fromStepping","isPercentage","getDefaultStep","isDown","size","getNearbySteps","stepBefore","startValue","thisStep","stepAfter","countStepDecimals","stepDecimals","map","apply","convert","defaultFormatter","from","validateFormat","isValidFormatter","testStep","parsed","testRange","spectrum","testStart","handles","start","testSnap","testAnimate","animate","testAnimationDuration","animationDuration","testConnect","connect","testOrientation","ort","testMargin","margin","testLimit","testPadding","padding","testDirection","dir","testBehaviour","tap","indexOf","drag","fixed","hover","unconstrained","events","testTooltips","tooltips","forEach","formatter","testAriaFormat","ariaFormat","testFormat","format","testKeyboardSupport","keyboardSupport","testDocumentElement","testCssPrefix","cssPrefix","testCssClasses","cssClasses","testOptions","options","tests","direction","orientation","behaviour","defaults","target","base","origin","handle","handleLower","handleUpper","touchArea","horizontal","vertical","background","connects","ltr","rtl","draggable","active","tooltip","pips","pipsHorizontal","pipsVertical","marker","markerHorizontal","markerVertical","markerNormal","markerLarge","markerSub","valueHorizontal","valueVertical","valueNormal","valueLarge","valueSub","keys","document","createElement","msPrefix","style","msTransform","noPrefix","transform","transformRule","scope","originalOptions","scope_Base","scope_Handles","scope_Connects","scope_Pips","scope_Tooltips","scope_Self","addTarget","actions","navigator","pointerEnabled","move","end","msPointerEnabled","supportsPassive","CSS","supports","opts","addEventListener","getSupportsPassive","scope_Target","scope_Spectrum","scope_Values","scope_Locations","scope_HandleNumbers","scope_ActiveHandlesCount","scope_Events","scope_Document","ownerDocument","scope_DocumentElement","scope_Body","scope_DirOffset","addNodeTo","div","appendChild","addOrigin","handleNumber","setAttribute","event","isSliderDisabled","isHandleDisabled","horizontalKeys","verticalKeys","reverse","isUp","getNextStepsForHandle","valueSetHandle","eventKeydown","addConnect","addTooltip","firstChild","hasAttribute","removeTooltips","removeEvent","bindEvent","values","unencoded","formattedValue","innerHTML","addMarking","spread","filterFunc","valueSizeClasses","markerSizeClasses","valueOrientationClasses","markerOrientationClasses","getClasses","type","source","sizeClasses","offset","node","addSpread","removePips","grid","density","filter","group","stepped","interval","getGroup","array","indexes","firstInRange","lastInRange","ignoreFirst","ignoreLast","prevPct","unshift","current","q","newPct","pctDifference","pctPos","steps","realSteps","stepSize","low","high","isSteps","generateSpread","baseSize","rect","getBoundingClientRect","alt","width","height","attachEvent","callback","data","method","pageOffset","eventTarget","touch","mouse","pointer","isTouchOnTarget","checkTouch","contains","targetTouches","touches","pageX","pageY","targetTouch","find","changedTouches","clientX","clientY","points","cursor","fixEvent","doNotReject","test","buttons","calcPoint","methods","eventName","passive","calcPointToPercentage","elem","docElem","proposal","userAgent","top","clientTop","left","clientLeft","documentLeave","nodeName","relatedTarget","eventEnd","eventMove","appVersion","buttonsProperty","movement","startCalcPoint","moveHandles","locations","handleNumbers","listeners","removeEventListener","setZindex","fireEvent","eventStart","some","children","stopPropagation","moveEvent","endEvent","outEvent","concat","getComputedStyle","eventTap","pos","getClosestHandle","setHandle","eventHover","targetEvent","namespacedEvent","namespace","substring","tEvent","tNamespace","eventType","checkHandlePosition","reference","lookBackward","lookForward","getValue","inRuleOrder","v","upward","proposals","f","state","transformDirection","zIndex","rule","updateConnect","updateHandlePosition","h","connectWidth","translateRule","scaleRule","resolveToValue","valueSet","input","fireSetEvent","isInit","valueGet","location","nearbySteps","increment","decrement","connectOptions","connectBase","addElements","handleBefore","handleAfter","eventHolders","eventHolder","positions","now","text","destroy","noUiSlider","on","off","set","reset","__moveHandles","updateOptions","optionsToUpdate","updateAble","newOptions","__spectrum","version","api","isBrowser","longerTimeoutBrowsers","timeoutDuration","debounce","Promise","fn","called","resolve","then","scheduled","isFunction","functionToCheck","toString","getStyleComputedProperty","nodeType","css","defaultView","getParentNode","parentNode","host","getScrollParent","_getStyleComputedProp","overflow","overflowX","overflowY","isIE11","MSInputMethodContext","documentMode","isIE10","isIE","getOffsetParent","noOffsetParent","offsetParent","nextElementSibling","getRoot","findCommonOffsetParent","element1","element2","order","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","createRange","setStart","setEnd","commonAncestorContainer","firstElementChild","element1root","getScroll","side","arguments","upperSide","html","scrollingElement","includeScroll","subtract","modifier","bottom","right","getBordersSize","styles","axis","sideA","sideB","getSize","computedStyle","parseInt","getWindowSizes","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","props","descriptor","configurable","writable","protoProps","staticProps","obj","_extends","assign","getClientRect","offsets","result","sizes","clientWidth","clientHeight","horizScrollbar","offsetWidth","vertScrollbar","offsetHeight","getOffsetRectRelativeToArbitraryNode","parent","fixedPosition","isHTML","childrenRect","parentRect","scrollParent","borderTopWidth","borderLeftWidth","marginTop","marginLeft","getViewportOffsetRectRelativeToArtbitraryNode","excludeScroll","relativeOffset","innerWidth","innerHeight","isFixed","getFixedPositionOffsetParent","getBoundaries","popper","boundariesElement","boundaries","boundariesNode","_getWindowSizes","isPaddingNumber","getArea","_ref","computeAutoPlacement","placement","refRect","rects","sortedAreas","area","filteredAreas","_ref2","computedPlacement","variation","getReferenceOffsets","commonOffsetParent","getOuterSizes","marginBottom","marginRight","getOppositePlacement","hash","matched","getPopperOffsets","referenceOffsets","popperRect","popperOffsets","isHoriz","mainSide","secondarySide","measurement","secondaryMeasurement","check","runModifiers","modifiers","ends","prop","findIndex","cur","match","console","warn","enabled","update","isDestroyed","arrowStyles","attributes","flipped","positionFixed","flip","originalPlacement","position","isCreated","onUpdate","onCreate","isModifierEnabled","modifierName","getSupportedPropertyName","prefixes","upperProp","charAt","toUpperCase","prefix","toCheck","removeAttribute","willChange","disableEventListeners","removeOnDestroy","getWindow","setupEventListeners","updateBound","scrollElement","attachToScrollParents","scrollParents","isBody","eventsEnabled","enableEventListeners","scheduleUpdate","cancelAnimationFrame","setStyles","unit","isFirefox","isModifierRequired","requestingName","requestedName","requesting","isRequired","_requesting","requested","placements","validPlacements","clockwise","counter","BEHAVIORS","parseOffset","basePlacement","useHeight","fragments","frag","trim","divider","search","splitRegex","ops","op","mergeWithPrevious","reduce","str","toValue","index2","Defaults","shift","shiftvariation","_data$offsets","isVertical","shiftOffsets","preventOverflow","transformProp","popperStyles","priority","primary","escapeWithReference","secondary","keepTogether","floor","opSide","arrow","_data$offsets$arrow","arrowElement","querySelector","len","sideCapitalized","toLowerCase","altSide","arrowElementSize","center","popperMarginSide","popperBorderSide","sideValue","placementOpposite","flipOrder","behavior","refOffsets","overlapsRef","overflowsLeft","overflowsRight","overflowsTop","overflowsBottom","overflowsBoundaries","flippedVariation","flipVariations","getOppositeVariation","inner","subtractLength","hide","bound","computeStyle","legacyGpuAccelerationOption","gpuAcceleration","offsetParentRect","shouldRound","noRound","referenceWidth","popperWidth","isVariation","horizontalToInteger","verticalToInteger","getRoundedOffsets","devicePixelRatio","prefixedProperty","invertTop","invertLeft","applyStyle","onLoad","modifierOptions","Popper","_this","requestAnimationFrame","jquery","Utils","global","PopperUtils","g","Function","SwipeDetect","threshold","enable","recordTouchStartValues","detectSwipeDirection","startX","startY","startTime","Date","getTime","distX","distY","absX","absY","StepsStorage","dom","ls","sessionStorage","init","setItem","JSON","stringify","parse","getItem","thisCalc","$window","$","$stickyFooter","$thisCac","language","attr","btest","isDip","hasClass","$offerNo","$DigStorage","$amountName","$prodidName","$termName","$calcDataName","$formDataName","$DipStorage","$Storage","$calcFormContainer","$dccCalcFormContainer","$calcOfferSummaryRO","$calcPhoto","$rangeSlider","$offersWrap","$sliderRangeMin","$sliderRangeMax","$calcMonthWrapper","$submit","$calcOffers","$arrowSlider","$navigation","$insuranceSelect","insuranceSelected","$calcDetails","$STLprodDetails","$calcOfferDetails","$calcProdDetails","$calcInsurance","$calcOfferCollect","electonicallyCollected","$prodDataInput","calcObj","amountArray","termArray","amountList1","amountList2","termList","amount","term","loanType","rrso","interestRate","totalInterest","issueFee","homeCollectionFee","rate","lia","ProductFeatureId","isOffer1","isOffer2","Offer1","RV","val","RT","RR","ReqType","MOV","MOT","MOR","FMOV","FMOT","FMOR","Type","FinalOfferID","FinalOfferType","Code","OfferType","NRV","repayPeriod","DigitalOfferID","Offer2","isFinalOfferRO","repayAmount","substr","trackIsScrolledMobile","storage","eventSubmitDCCForm","clearForm","loadImage","getBuildTermButtons","getCalculatorData","toggleSwitchOffersMobile","eventSelectInsurance","eventSwitchOffers","eventMonthScroll","eventMonthOfferChange","eventSliderMobile","eventScroll","eventSubmitForm","eventSwipeOffersMobile","eventNavigationClick","eventCollectClick","eventSetCalcClick","downloadPDFDIPClick","thisDom","which","currentTarget","trigger","inputVal","inArray","select","createApplicationForReserveOfferClick","eq","$activeTab","clear","save","toggle","each","_","slider","id","photoObj","$termTemplate","thisStorage","weeklyTerms","prodTab","productTerms","show","termVal","STLtermText","STLttipText","$STLtermText","clone","next","append","$this","prodDataInput","grep","ProductConfigurations","thisProd","ProductCalculator","ProductCalculatorType","PricingTier","IsBallonProduct","IsBalloonProduct","ProductClassification","ProductTermType","ProductElectonicallyCollected","ProductElectonicallyIssued","ProductWithInsurance","PromotionType","ProductId","ProductType","ProductInsuranceCost","ProductMinAmount","ProductMaxAmount","OfferId","cLog","query","getAjaxData","getCalculatorDataCallBack","calcMXjson","calcPLjson","InstallmentTable","amountId","amountObj","productId","productObj","termId","termObj","serviceId","serviceObj","packageId","packageObj","recordId","recordObj","tempObj","Amount","Term","PRD","InstalmentAmount","RRSO","AIN","LastInstalmentAmount","InterestCV","HomeIssueFeeCV","HomeCollectionFeeCV","TotalAmountPayable","TAP","InterestRate","APR","IsElectonicallyCollected","IsElectonicallyIssued","IsWithInsurance","Output","InstalmentTable","cData","calcDataOp","IsSuccess","ErrorCode","ErrorMessage","calcData","dataMonthArray","dataWeekArray","maxMonthlyAmount","thisObj","productType","adjustedAmount","ComfortFee","TotalCreditCost","ProvisionFee","PenaltyFee","PaymentHolidays","jQuery","AmountValue","termValue","getNRV","getUpsellData","toLocaleString","minimumFractionDigits","maxSTLvalue","leftSTLval","appendTo","AmountObj","returnNRV","nValue","nObject","offerObj","SV","ST","isBPP","PV","PR","PT","prepareResultObj","rValue","isEmptyObject","thisAmount","thisTerm","minLoanAmount","minLoanTerm","maxLoanAmount","maxLoanTerm","appendMainSlider","siblings","startVal","newVal","valUp","activeProdType","activeProdCode","toggleClass","newOffer","goToOffer","is","valText","revTermArray","thisVal","displayResults","scrollToCalcMobile","slideMobileOffer","offerID","$allOffers","$allPhotos","$active","setCalcValue","$w","defaultAmount","defaultTerm","stop","scrollOffset","headerH","barH","$slideActive","oldTerm","revSliderArray","activeProd","activeCode","thisSelection","dataObj","dataLayer","$offerBox","showPH","isSTL","cih","maximumFractionDigits","repay","$phPopup","insertAfter","insertBefore","finalOffer","$next","updateOffer","clearMobileArrows","$thisTab","printInformationForm","formData","item","serializeToJSON","serializeArray","isMonthly","isMoneyTransfer","isInsuranceChecked","sessionDataInput","analysisFee","cbData","status","applicationType","DashboardTAP","ajax","url","contentType","cache","async","success","complete","requestedAmount","$slides","$arrow","click","$btn","medicalcheckboxstatus","totalPaybaleAmount","productFeatureID","random","href","dDate","filename","getDate","getMonth","getFullYear","xhr","XMLHttpRequest","open","responseType","onload","blob","response","msSaveBlob","blobUrl","URL","createObjectURL","Blob","download","revokeObjectURL","send","parentControlId","prodData","model","productCalculator","productTier","productIsballoon","productClassification","productTermType","productElectronicallycollected","productElectronicallyissued","productInsurance","productPromotionType","ua","isUCBrowser","isIOS","platform","MSStream","defaultProps","a11y","allowHTML","animateFill","animation","aria","arrowType","boundary","content","delay","distance","flipBehavior","flipOnUpdate","followCursor","hideOnClick","ignoreAttributes","inertia","interactive","interactiveBorder","interactiveDebounce","lazy","maxWidth","multiple","onHidden","onHide","onMount","onShow","onShown","popperOptions","role","showOnInit","sticky","theme","touchHold","updateDuration","wait","POPPER_INSTANCE_DEPENDENCIES","Selectors","elementProto","Element","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","arrayFrom","parentSelector","selector","closestCallback","PASSIVE","defaultValue","ms","timeoutId","_arguments","clearTimeout","getModifier","includes","isSingular","evaluateValue","args","setFlipModifierEnabled","evaluateProps","out","acc","valueAsString","getAttribute","getDataAttributeOptions","validateOptions","option","setInnerHTML","setContent","contentEl","getChildren","backdrop","addInertia","createArrowElement","createBackdropElement","addInteractive","applyTransitionDuration","els","transitionDuration","toggleTransitionEndListener","action","listener","webkitTransition","getPopperPlacement","fullPlacement","setVisibilityState","toggleTheme","themeName","hideAll","checkHideOnClick","exclude","querySelectorAll","_tippy","isUsingTouch","onDocumentTouch","performance","onDocumentMouseMove","lastMouseMoveTime","onDocumentClick","isClickTrigger","clearDelayTimeouts","onWindowBlur","activeElement","blur","idCounter","createTippy","collectionProps","lastTriggerEventType","lastMouseMoveEvent","showTimeoutId","hideTimeoutId","transitionEndListener","isScheduledToShow","debouncedOnMouseMove","onMouseMove","createPopperElement","popperChildren","popperInstance","isEnabled","isVisible","isMounted","isShown","disable","addTriggersToReference","createPopperInstance","scheduleShow","positionVirtualReferenceNearCursor","_lastMouseMoveEvent","isVerticalPlacement","isHorizontalPlacement","isHorizontal","removeFollowCursorListener","targetEl","createDelegateChildTippy","hasFollowCursorBehavior","scheduleHide","cleanupOldMouseListeners","onTrigger","isEventListenerStopped","MouseEvent","referenceTheCursorIsOver","isCursorOverPopper","isCursorOverReference","popperPlacement","exceedsTop","exceedsBottom","exceedsLeft","exceedsRight","isCursorOutsideInteractiveBorder","onMouseLeave","onBlur","onDelegateShow","onDelegateHide","supportsTouch","isTouchEvent","_instance$popperChild","preventOverflowModifier","applyMutations","computedPadding","config","mount","shouldEnableListeners","reflow","afterPopperPositionUpdates","makeSticky","updatePosition","onTransitionedOut","onTransitionEnd","onTransitionedIn","handler","removeTriggersFromReference","getInnerElements","animationFrameId","prevProps","nextProps","_getChildren","replaceChild","removeInteractive","removeInertia","updatePopperElement","visibility","transitionDelay","destroyTargetInstances","child","globalEventListenersBound","tippy","targets","virtualReference","polyfills","isVirtual","classNames","polyfillElementPrototypeProperties","instances","NodeList","getArrayOfElements","setDefaults","partialDefaults","_ref$delay","_ref$duration","isAnyTippyOpen","_originalProps","updateInstances","setIsAnyTippyOpen","throttle","noTrailing","debounceMode","timeoutID","cancelled","lastExec","clearExistingTimeout","wrapper","self","elapsed","exec","cancel","$body","$trigger","appendTooltips","onResizeCallback","tt","getHtml","class","atBegin","$calc","calcId"],"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,G,gBClFrDhC,EAAOD,QAAU,CAAC,IAAM,IAAI,IAAM,QAAQ,IAAM,QAAQ,IAAM,QAAQ,WAAW,SAAS,IAAM,SAAS,KAAO,W,gBCAhH,gDAIQ,EAAO,QAAW,0BAAP,EAQhB,WACC,aAEA,IAAIkC,EAAU,SAQd,SAASC,EAAcC,GACnBA,EAAGC,cAAcC,YAAYF,GAGjC,SAASG,EAAMpB,GACX,OAAOA,QAIX,SAASqB,EAAeC,GACpBA,EAAED,iBAmCN,SAASE,EAAUC,GACf,MAAoB,iBAANA,IAAmBC,MAAMD,IAAME,SAASF,GAI1D,SAASG,EAAYC,EAASC,EAAWC,GACjCA,EAAW,IACXC,EAASH,EAASC,GAClBG,YAAW,WACPC,EAAYL,EAASC,KACtBC,IAKX,SAASI,EAAMV,GACX,OAAOW,KAAKC,IAAID,KAAKE,IAAIb,EAAG,KAAM,GAKtC,SAASc,EAAQd,GACb,OAAOe,MAAMC,QAAQhB,GAAKA,EAAI,CAACA,GAInC,SAASiB,EAAcC,GAEnB,IAAIC,GADJD,EAASE,OAAOF,IACIG,MAAM,KAC1B,OAAOF,EAAOG,OAAS,EAAIH,EAAO,GAAGG,OAAS,EAIlD,SAASf,EAASd,EAAIY,GACdZ,EAAG8B,UACH9B,EAAG8B,UAAUC,IAAInB,GAEjBZ,EAAGY,WAAa,IAAMA,EAK9B,SAASI,EAAYhB,EAAIY,GACjBZ,EAAG8B,UACH9B,EAAG8B,UAAUE,OAAOpB,GAEpBZ,EAAGY,UAAYZ,EAAGY,UAAUqB,QACxB,IAAIC,OAAO,UAAYtB,EAAUgB,MAAM,KAAKO,KAAK,KAAO,UAAW,MACnE,KAaZ,SAASC,EAAcC,GACnB,IAAIC,OAA2CC,IAAvBC,OAAOC,YAC3BC,EAA0C,gBAA1BL,EAAIM,YAAc,IAYtC,MAAO,CACHC,EAZIN,EACFE,OAAOC,YACPC,EACIL,EAAIQ,gBAAgBC,WACpBT,EAAIU,KAAKD,WASfE,EARIV,EACFE,OAAOS,YACPP,EACIL,EAAIQ,gBAAgBK,UACpBb,EAAIU,KAAKG,WA8DvB,SAASC,EAAcC,EAAIC,GACvB,OAAO,KAAOA,EAAKD,GAIvB,SAASE,EAAeC,EAAOxE,GAC3B,OAAgB,IAARA,GAAgBwE,EAAM,GAAKA,EAAM,IAa7C,SAASC,EAAKzE,EAAO0E,GAGjB,IAFA,IAAIC,EAAI,EAED3E,GAAS0E,EAAIC,IAChBA,GAAK,EAGT,OAAOA,EAIX,SAASC,EAAWC,EAAMC,EAAM9E,GAC5B,GAAIA,GAAS6E,EAAKE,OAAO,GAAG,GACxB,OAAO,IAGX,IAAIJ,EAAIF,EAAKzE,EAAO6E,GAChBG,EAAKH,EAAKF,EAAI,GACdM,EAAKJ,EAAKF,GACVN,EAAKS,EAAKH,EAAI,GACdL,EAAKQ,EAAKH,GAEd,OAAON,EA/BX,SAAsBG,EAAOxE,GACzB,OAAOuE,EAAeC,EAAOA,EAAM,GAAK,EAAIxE,EAAQmC,KAAK+C,IAAIV,EAAM,IAAMxE,EAAQwE,EAAM,IA8B3EW,CAAa,CAACH,EAAIC,GAAKjF,GAASoE,EAAcC,EAAIC,GAoBlE,SAASc,EAAQN,EAAMO,EAAQC,EAAMtF,GACjC,GAAc,MAAVA,EACA,OAAOA,EAGX,IAAI2E,EAAIF,EAAKzE,EAAO8E,GAChBtD,EAAIsD,EAAKH,EAAI,GACbY,EAAIT,EAAKH,GAGb,OAAIW,EAEItF,EAAQwB,GAAK+D,EAAI/D,GAAK,EACf+D,EAGJ/D,EAGN6D,EAAOV,EAAI,GAITG,EAAKH,EAAI,GAnPpB,SAAiB3E,EAAOwF,GACpB,OAAOrD,KAAKsD,MAAMzF,EAAQwF,GAAMA,EAkPXE,CAAQ1F,EAAQ8E,EAAKH,EAAI,GAAIU,EAAOV,EAAI,IAHlD3E,EAMf,SAAS2F,EAAiBC,EAAO5F,EAAO6F,GACpC,IAAIC,EAQJ,GALqB,iBAAV9F,IACPA,EAAQ,CAACA,KAIRuC,MAAMC,QAAQxC,GACf,MAAM,IAAI+F,MAAM,wDAapB,IAAKxE,EARDuE,EADU,QAAVF,EACa,EACI,QAAVA,EACM,IAEAI,WAAWJ,MAIGrE,EAAUvB,EAAM,IAC3C,MAAM,IAAI+F,MAAM,qDAIpBF,EAAKf,KAAKmB,KAAKH,GACfD,EAAKhB,KAAKoB,KAAKjG,EAAM,IAKhB8F,EAKDD,EAAKR,OAAOY,MAAKxE,MAAMzB,EAAM,KAAcA,EAAM,IAJ5CyB,MAAMzB,EAAM,MACb6F,EAAKR,OAAO,GAAKrF,EAAM,IAM/B6F,EAAKK,qBAAqBD,KAAK,GAGnC,SAASE,EAAgBpH,EAAGyB,EAAGqF,GAE3B,GAAKrF,EAKL,GAAIqF,EAAKhB,KAAK9F,KAAO8G,EAAKhB,KAAK9F,EAAI,GAAnC,CAOA8G,EAAKR,OAAOtG,GACRwF,EAAe,CAACsB,EAAKhB,KAAK9F,GAAI8G,EAAKhB,KAAK9F,EAAI,IAAKyB,GAAK4D,EAAcyB,EAAKf,KAAK/F,GAAI8G,EAAKf,KAAK/F,EAAI,IAEpG,IAAIqH,GAAcP,EAAKhB,KAAK9F,EAAI,GAAK8G,EAAKhB,KAAK9F,IAAM8G,EAAKQ,UAAUtH,GAChEuH,EAAcnE,KAAKoE,KAAKC,OAAOJ,EAAWK,QAAQ,IAAM,GACxDC,EAAOb,EAAKhB,KAAK9F,GAAK8G,EAAKQ,UAAUtH,GAAKuH,EAE9CT,EAAKK,qBAAqBnH,GAAK2H,OAb3Bb,EAAKR,OAAOtG,GAAK8G,EAAKK,qBAAqBnH,GAAK8G,EAAKhB,KAAK9F,GAoBlE,SAAS4H,EAASC,EAAOtB,EAAMuB,GAS3B,IAAIjB,EARJkB,KAAKhC,KAAO,GACZgC,KAAKjC,KAAO,GACZiC,KAAKzB,OAAS,CAACwB,IAAc,GAC7BC,KAAKT,UAAY,EAAC,GAClBS,KAAKZ,qBAAuB,GAE5BY,KAAKxB,KAAOA,EAGZ,IAAIyB,EAAU,GAGd,IAAKnB,KAASgB,EACNA,EAAMhG,eAAegF,IACrBmB,EAAQd,KAAK,CAACW,EAAMhB,GAAQA,IAgBpC,IAXImB,EAAQjE,QAAmC,iBAAlBiE,EAAQ,GAAG,GACpCA,EAAQC,MAAK,SAASxF,EAAG+D,GACrB,OAAO/D,EAAE,GAAG,GAAK+D,EAAE,GAAG,MAG1BwB,EAAQC,MAAK,SAASxF,EAAG+D,GACrB,OAAO/D,EAAE,GAAK+D,EAAE,MAKnBK,EAAQ,EAAGA,EAAQmB,EAAQjE,OAAQ8C,IACpCD,EAAiBoB,EAAQnB,GAAO,GAAImB,EAAQnB,GAAO,GAAIkB,MAQ3D,IAHAA,KAAKT,UAAYS,KAAKzB,OAAON,MAAM,GAG9Ba,EAAQ,EAAGA,EAAQkB,KAAKT,UAAUvD,OAAQ8C,IAC3CO,EAAgBP,EAAOkB,KAAKT,UAAUT,GAAQkB,MAItDH,EAAShG,UAAUsG,UAAY,SAASjH,GACpC,IAAI0G,EAAOI,KAAKT,UAAU,GAE1B,GAAIK,GAAS1G,EAAQ0G,EAAQ,GAAM,EAC/B,MAAM,IAAIX,MAAM,mFAGpB,OAA4B,IAArBe,KAAKhC,KAAKhC,QAAeyB,EAAeuC,KAAKjC,KAAM7E,IAG9D2G,EAAShG,UAAUiE,WAAa,SAAS5E,GAGrC,OAFAA,EAAQ4E,EAAWkC,KAAKjC,KAAMiC,KAAKhC,KAAM9E,IAK7C2G,EAAShG,UAAUuG,aAAe,SAASlH,GACvC,OAjLJ,SAAsB6E,EAAMC,EAAM9E,GAE9B,GAAIA,GAAS,IACT,OAAO6E,EAAKE,OAAO,GAAG,GAG1B,IAAIJ,EAAIF,EAAKzE,EAAO8E,GAChBE,EAAKH,EAAKF,EAAI,GACdM,EAAKJ,EAAKF,GACVN,EAAKS,EAAKH,EAAI,GAGlB,OA1CJ,SAAsBH,EAAOxE,GACzB,OAAQA,GAASwE,EAAM,GAAKA,EAAM,IAAO,IAAMA,EAAM,GAyC9C2C,CAAa,CAACnC,EAAIC,IAAMjF,EAAQqE,GAAMD,EAAcC,EAFlDS,EAAKH,KAuKPuC,CAAaJ,KAAKjC,KAAMiC,KAAKhC,KAAM9E,IAG9C2G,EAAShG,UAAUyE,QAAU,SAASpF,GAGlC,OAFAA,EAAQoF,EAAQ0B,KAAKhC,KAAMgC,KAAKzB,OAAQyB,KAAKxB,KAAMtF,IAKvD2G,EAAShG,UAAUyG,eAAiB,SAASpH,EAAOqH,EAAQC,GACxD,IAAI3C,EAAIF,EAAKzE,EAAO8G,KAAKhC,MAOzB,OAJc,MAAV9E,GAAkBqH,GAAUrH,IAAU8G,KAAKhC,KAAKH,EAAI,MACpDA,EAAIxC,KAAKC,IAAIuC,EAAI,EAAG,KAGhBmC,KAAKjC,KAAKF,GAAKmC,KAAKjC,KAAKF,EAAI,IAAM2C,GAG/CX,EAAShG,UAAU4G,eAAiB,SAASvH,GACzC,IAAI2E,EAAIF,EAAKzE,EAAO8G,KAAKhC,MAEzB,MAAO,CACH0C,WAAY,CACRC,WAAYX,KAAKjC,KAAKF,EAAI,GAC1B+B,KAAMI,KAAKT,UAAU1B,EAAI,GACzB2B,YAAaQ,KAAKZ,qBAAqBvB,EAAI,IAE/C+C,SAAU,CACND,WAAYX,KAAKjC,KAAKF,EAAI,GAC1B+B,KAAMI,KAAKT,UAAU1B,EAAI,GACzB2B,YAAaQ,KAAKZ,qBAAqBvB,EAAI,IAE/CgD,UAAW,CACPF,WAAYX,KAAKjC,KAAKF,GACtB+B,KAAMI,KAAKT,UAAU1B,GACrB2B,YAAaQ,KAAKZ,qBAAqBvB,MAKnDgC,EAAShG,UAAUiH,kBAAoB,WACnC,IAAIC,EAAef,KAAKT,UAAUyB,IAAIrF,GACtC,OAAON,KAAKC,IAAI2F,MAAM,KAAMF,IAIhClB,EAAShG,UAAUqH,QAAU,SAAShI,GAClC,OAAO8G,KAAK1B,QAAQ0B,KAAKlC,WAAW5E,KAoBxC,IAAIiI,EAAmB,CACnBzC,GAAI,SAASxF,GACT,YAAiBwD,IAAVxD,GAAuBA,EAAMyG,QAAQ,IAEhDyB,KAAM1B,QAGV,SAAS2B,EAAevB,GAEpB,GApeJ,SAA0BA,GACtB,MAAwB,iBAAVA,GAA0C,mBAAbA,EAAMpB,IAA2C,mBAAfoB,EAAMsB,KAme/EE,CAAiBxB,GACjB,OAAO,EAGX,MAAM,IAAIb,MAAM,mEAGpB,SAASsC,EAASC,EAAQ1B,GACtB,IAAKrF,EAAUqF,GACX,MAAM,IAAIb,MAAM,+CAKpBuC,EAAOzB,WAAaD,EAGxB,SAAS2B,EAAUD,EAAQ1B,GAEvB,GAAqB,iBAAVA,GAAsBrE,MAAMC,QAAQoE,GAC3C,MAAM,IAAIb,MAAM,kDAIpB,QAAkBvC,IAAdoD,EAAMvE,UAAmCmB,IAAdoD,EAAMxE,IACjC,MAAM,IAAI2D,MAAM,2DAIpB,GAAIa,EAAMvE,MAAQuE,EAAMxE,IACpB,MAAM,IAAI2D,MAAM,iEAGpBuC,EAAOE,SAAW,IAAI7B,EAASC,EAAO0B,EAAOhD,KAAMgD,EAAOzB,YAG9D,SAAS4B,EAAUH,EAAQ1B,GAKvB,GAJAA,EAAQtE,EAAQsE,IAIXrE,MAAMC,QAAQoE,KAAWA,EAAM9D,OAChC,MAAM,IAAIiD,MAAM,qDAIpBuC,EAAOI,QAAU9B,EAAM9D,OAIvBwF,EAAOK,MAAQ/B,EAGnB,SAASgC,EAASN,EAAQ1B,GAItB,GAFA0B,EAAOhD,KAAOsB,EAEO,kBAAVA,EACP,MAAM,IAAIb,MAAM,yDAIxB,SAAS8C,EAAYP,EAAQ1B,GAIzB,GAFA0B,EAAOQ,QAAUlC,EAEI,kBAAVA,EACP,MAAM,IAAIb,MAAM,4DAIxB,SAASgD,EAAsBT,EAAQ1B,GAGnC,GAFA0B,EAAOU,kBAAoBpC,EAEN,iBAAVA,EACP,MAAM,IAAIb,MAAM,qEAIxB,SAASkD,EAAYX,EAAQ1B,GACzB,IACI7H,EADAmK,EAAU,EAAC,GAWf,GAPc,UAAVtC,EACAA,EAAQ,EAAC,GAAM,GACE,UAAVA,IACPA,EAAQ,EAAC,GAAO,KAIN,IAAVA,IAA4B,IAAVA,EAAiB,CACnC,IAAK7H,EAAI,EAAGA,EAAIuJ,EAAOI,QAAS3J,IAC5BmK,EAAQjD,KAAKW,GAGjBsC,EAAQjD,MAAK,OAIZ,KAAK1D,MAAMC,QAAQoE,KAAWA,EAAM9D,QAAU8D,EAAM9D,SAAWwF,EAAOI,QAAU,EACjF,MAAM,IAAI3C,MAAM,qEAEhBmD,EAAUtC,EAGd0B,EAAOY,QAAUA,EAGrB,SAASC,EAAgBb,EAAQ1B,GAG7B,OAAQA,GACJ,IAAK,aACD0B,EAAOc,IAAM,EACb,MACJ,IAAK,WACDd,EAAOc,IAAM,EACb,MACJ,QACI,MAAM,IAAIrD,MAAM,0DAI5B,SAASsD,EAAWf,EAAQ1B,GACxB,IAAKrF,EAAUqF,GACX,MAAM,IAAIb,MAAM,yDAIpB,GAAc,IAAVa,IAIJ0B,EAAOgB,OAAShB,EAAOE,SAASvB,UAAUL,IAErC0B,EAAOgB,QACR,MAAM,IAAIvD,MAAM,6EAIxB,SAASwD,EAAUjB,EAAQ1B,GACvB,IAAKrF,EAAUqF,GACX,MAAM,IAAIb,MAAM,wDAKpB,GAFAuC,EAAOpG,MAAQoG,EAAOE,SAASvB,UAAUL,IAEpC0B,EAAOpG,OAASoG,EAAOI,QAAU,EAClC,MAAM,IAAI3C,MACN,mGAOZ,SAASyD,EAAYlB,EAAQ1B,GACzB,IAAKrF,EAAUqF,KAAWrE,MAAMC,QAAQoE,GACpC,MAAM,IAAIb,MACN,wFAIR,GAAIxD,MAAMC,QAAQoE,IAA6B,IAAjBA,EAAM9D,SAAgBvB,EAAUqF,EAAM,MAAOrF,EAAUqF,EAAM,IACvF,MAAM,IAAIb,MACN,wFAIR,GAAc,IAAVa,EAAJ,CAWA,GAPKrE,MAAMC,QAAQoE,KACfA,EAAQ,CAACA,EAAOA,IAIpB0B,EAAOmB,QAAU,CAACnB,EAAOE,SAASvB,UAAUL,EAAM,IAAK0B,EAAOE,SAASvB,UAAUL,EAAM,MAE7D,IAAtB0B,EAAOmB,QAAQ,KAAsC,IAAtBnB,EAAOmB,QAAQ,GAC9C,MAAM,IAAI1D,MAAM,8EAGpB,GAAIuC,EAAOmB,QAAQ,GAAK,GAAKnB,EAAOmB,QAAQ,GAAK,EAC7C,MAAM,IAAI1D,MAAM,uEAGpB,GAAIuC,EAAOmB,QAAQ,GAAKnB,EAAOmB,QAAQ,IAAM,IACzC,MAAM,IAAI1D,MAAM,6EAIxB,SAAS2D,EAAcpB,EAAQ1B,GAI3B,OAAQA,GACJ,IAAK,MACD0B,EAAOqB,IAAM,EACb,MACJ,IAAK,MACDrB,EAAOqB,IAAM,EACb,MACJ,QACI,MAAM,IAAI5D,MAAM,gEAI5B,SAAS6D,EAActB,EAAQ1B,GAE3B,GAAqB,iBAAVA,EACP,MAAM,IAAIb,MAAM,yEAKpB,IAAI8D,EAAMjD,EAAMkD,QAAQ,QAAU,EAC9BC,EAAOnD,EAAMkD,QAAQ,SAAW,EAChCE,EAAQpD,EAAMkD,QAAQ,UAAY,EAClCxE,EAAOsB,EAAMkD,QAAQ,SAAW,EAChCG,EAAQrD,EAAMkD,QAAQ,UAAY,EAClCI,EAAgBtD,EAAMkD,QAAQ,kBAAoB,EAEtD,GAAIE,EAAO,CACP,GAAuB,IAAnB1B,EAAOI,QACP,MAAM,IAAI3C,MAAM,sEAIpBsD,EAAWf,EAAQA,EAAOK,MAAM,GAAKL,EAAOK,MAAM,IAGtD,GAAIuB,IAAkB5B,EAAOgB,QAAUhB,EAAOpG,OAC1C,MAAM,IAAI6D,MACN,sFAIRuC,EAAO6B,OAAS,CACZN,IAAKA,GAAOvE,EACZyE,KAAMA,EACNC,MAAOA,EACP1E,KAAMA,EACN2E,MAAOA,EACPC,cAAeA,GAIvB,SAASE,EAAa9B,EAAQ1B,GAC1B,IAAc,IAAVA,EAIJ,IAAc,IAAVA,EAAgB,CAChB0B,EAAO+B,SAAW,GAElB,IAAK,IAAItL,EAAI,EAAGA,EAAIuJ,EAAOI,QAAS3J,IAChCuJ,EAAO+B,SAASpE,MAAK,OAEtB,CAGH,GAFAqC,EAAO+B,SAAW/H,EAAQsE,GAEtB0B,EAAO+B,SAASvH,SAAWwF,EAAOI,QAClC,MAAM,IAAI3C,MAAM,+DAGpBuC,EAAO+B,SAASC,SAAQ,SAASC,GAC7B,GACyB,kBAAdA,IACe,iBAAdA,GAAkD,mBAAjBA,EAAU/E,IAEnD,MAAM,IAAIO,MAAM,8EAMhC,SAASyE,EAAelC,EAAQ1B,GAC5B0B,EAAOmC,WAAa7D,EACpBuB,EAAevB,GAGnB,SAAS8D,EAAWpC,EAAQ1B,GACxB0B,EAAOqC,OAAS/D,EAChBuB,EAAevB,GAGnB,SAASgE,EAAoBtC,EAAQ1B,GAGjC,GAFA0B,EAAOuC,gBAAkBjE,EAEJ,kBAAVA,EACP,MAAM,IAAIb,MAAM,oEAIxB,SAAS+E,EAAoBxC,EAAQ1B,GAEjC0B,EAAOxE,gBAAkB8C,EAG7B,SAASmE,EAAczC,EAAQ1B,GAC3B,GAAqB,iBAAVA,IAAgC,IAAVA,EAC7B,MAAM,IAAIb,MAAM,iEAGpBuC,EAAO0C,UAAYpE,EAGvB,SAASqE,EAAe3C,EAAQ1B,GAC5B,GAAqB,iBAAVA,EACP,MAAM,IAAIb,MAAM,wDAGpB,GAAgC,iBAArBuC,EAAO0C,UAGd,IAAK,IAAI1K,KAFTgI,EAAO4C,WAAa,GAEJtE,EACPA,EAAMhG,eAAeN,KAI1BgI,EAAO4C,WAAW5K,GAAOgI,EAAO0C,UAAYpE,EAAMtG,SAGtDgI,EAAO4C,WAAatE,EAK5B,SAASuE,EAAYC,GAKjB,IAAI9C,EAAS,CACTgB,OAAQ,EACRpH,MAAO,EACPuH,QAAS,EACTX,SAAS,EACTE,kBAAmB,IACnByB,WAAYxC,EACZ0C,OAAQ1C,GAIRoD,EAAQ,CACR3E,KAAM,CAAE7G,GAAG,EAAOI,EAAGoI,GACrBM,MAAO,CAAE9I,GAAG,EAAMI,EAAGwI,GACrBS,QAAS,CAAErJ,GAAG,EAAMI,EAAGgJ,GACvBqC,UAAW,CAAEzL,GAAG,EAAMI,EAAGyJ,GACzBpE,KAAM,CAAEzF,GAAG,EAAOI,EAAG2I,GACrBE,QAAS,CAAEjJ,GAAG,EAAOI,EAAG4I,GACxBG,kBAAmB,CAAEnJ,GAAG,EAAOI,EAAG8I,GAClCvE,MAAO,CAAE3E,GAAG,EAAMI,EAAGsI,GACrBgD,YAAa,CAAE1L,GAAG,EAAOI,EAAGkJ,GAC5BG,OAAQ,CAAEzJ,GAAG,EAAOI,EAAGoJ,GACvBnH,MAAO,CAAErC,GAAG,EAAOI,EAAGsJ,GACtBE,QAAS,CAAE5J,GAAG,EAAOI,EAAGuJ,GACxBgC,UAAW,CAAE3L,GAAG,EAAMI,EAAG2J,GACzBa,WAAY,CAAE5K,GAAG,EAAOI,EAAGuK,GAC3BG,OAAQ,CAAE9K,GAAG,EAAOI,EAAGyK,GACvBL,SAAU,CAAExK,GAAG,EAAOI,EAAGmK,GACzBS,gBAAiB,CAAEhL,GAAG,EAAMI,EAAG2K,GAC/B9G,gBAAiB,CAAEjE,GAAG,EAAOI,EAAG6K,GAChCE,UAAW,CAAEnL,GAAG,EAAMI,EAAG8K,GACzBG,WAAY,CAAErL,GAAG,EAAMI,EAAGgL,IAG1BQ,EAAW,CACXvC,SAAS,EACToC,UAAW,MACXE,UAAW,MACXD,YAAa,aACbV,iBAAiB,EACjBG,UAAW,QACXE,WAAY,CACRQ,OAAQ,SACRC,KAAM,OACNC,OAAQ,SACRC,OAAQ,SACRC,YAAa,eACbC,YAAa,eACbC,UAAW,aACXC,WAAY,aACZC,SAAU,WACVC,WAAY,aACZjD,QAAS,UACTkD,SAAU,WACVC,IAAK,MACLC,IAAK,MACLC,UAAW,YACXxC,KAAM,aACNF,IAAK,YACL2C,OAAQ,SACRC,QAAS,UACTC,KAAM,OACNC,eAAgB,kBAChBC,aAAc,gBACdC,OAAQ,SACRC,iBAAkB,oBAClBC,eAAgB,kBAChBC,aAAc,gBACdC,YAAa,eACbC,UAAW,aACXlN,MAAO,QACPmN,gBAAiB,mBACjBC,cAAe,iBACfC,YAAa,eACbC,WAAY,cACZC,SAAU,cAKdnC,EAAQT,SAAWS,EAAQX,aAC3BW,EAAQX,WAAaW,EAAQT,QAMjClL,OAAO+N,KAAKnC,GAAOf,SAAQ,SAAShL,GAEhC,IAAK8B,EAAMgK,EAAQ9L,UAA6BkE,IAAnBiI,EAASnM,GAAqB,CACvD,GAAI+L,EAAM/L,GAAMO,EACZ,MAAM,IAAIkG,MAAM,yBAAoCzG,EAAO,kBAG/D,OAAO,EAGX+L,EAAM/L,GAAMW,EAAEqI,EAASlH,EAAMgK,EAAQ9L,IAA0B8L,EAAQ9L,GAAzBmM,EAASnM,OAI3DgJ,EAAOoE,KAAOtB,EAAQsB,KAMtB,IAAIrN,EAAIoO,SAASC,cAAc,OAC3BC,OAAmCnK,IAAxBnE,EAAEuO,MAAMC,YACnBC,OAAiCtK,IAAtBnE,EAAEuO,MAAMG,UASvB,OAPAzF,EAAO0F,cAAgBF,EAAW,YAAcH,EAAW,cAAgB,kBAK3ErF,EAAOsF,MAFM,CAAC,CAAC,OAAQ,OAAQ,CAAC,QAAS,WAEnBtF,EAAOqB,KAAKrB,EAAOc,KAElCd,EAKX,SAAS2F,EAAMvC,EAAQN,EAAS8C,GAC5B,IAQIC,EACAC,EACAC,EACAC,EACAC,EAWAC,EA0FeC,EA0vBOjD,EA32BtBkD,EAxyBGjL,OAAOkL,UAAUC,eAClB,CACIjG,MAAO,cACPkG,KAAM,cACNC,IAAK,aAETrL,OAAOkL,UAAUI,iBACb,CACIpG,MAAO,gBACPkG,KAAM,gBACNC,IAAK,eAET,CACInG,MAAO,uBACPkG,KAAM,sBACNC,IAAK,oBA2xBfE,EAlwBGvL,OAAOwL,KAAOA,IAAIC,UAAYD,IAAIC,SAAS,eAAgB,SAnBtE,WACI,IAAIF,GAAkB,EAGtB,IACI,IAAIG,EAAO1P,OAAOC,eAAe,GAAI,UAAW,CAC5CE,IAAK,WACDoP,GAAkB,KAI1BvL,OAAO2L,iBAAiB,OAAQ,KAAMD,GACxC,MAAO7N,IAGT,OAAO0N,EAswB0CK,GAK7CC,EAAe5D,EAQf6D,EAAiBnE,EAAQ5C,SACzBgH,EAAe,GACfC,EAAkB,GAClBC,EAAsB,GACtBC,EAA2B,EAC3BC,EAAe,GAMfC,EAAiBnE,EAAOoE,cACxBC,EAAwB3E,EAAQtH,iBAAmB+L,EAAe/L,gBAClEkM,EAAaH,EAAe7L,KAU5BiM,EAAyC,QAAvBJ,EAAelG,KAAiC,IAAhByB,EAAQhC,IAAY,EAAI,IAG9E,SAAS8G,EAAUzB,EAAW5M,GAC1B,IAAIsO,EAAMN,EAAenC,cAAc,OAQvC,OANI7L,GACAE,EAASoO,EAAKtO,GAGlB4M,EAAU2B,YAAYD,GAEfA,EAIX,SAASE,EAAU1E,EAAM2E,GACrB,IAAI1E,EAASsE,EAAUvE,EAAMP,EAAQF,WAAWU,QAC5CC,EAASqE,EAAUtE,EAAQR,EAAQF,WAAWW,QAwBlD,OAtBAqE,EAAUrE,EAAQT,EAAQF,WAAWc,WAErCH,EAAO0E,aAAa,cAAeD,GAE/BlF,EAAQP,kBAGRgB,EAAO0E,aAAa,WAAY,KAChC1E,EAAOuD,iBAAiB,WAAW,SAASoB,GACxC,OAmvBZ,SAAsBA,EAAOF,GACzB,GAAIG,KAAsBC,EAAiBJ,GACvC,OAAO,EAGX,IAAIK,EAAiB,CAAC,OAAQ,SAC1BC,EAAe,CAAC,OAAQ,MAExBxF,EAAQzB,MAAQyB,EAAQhC,IAExBuH,EAAeE,UACRzF,EAAQhC,MAAQgC,EAAQzB,KAE/BiH,EAAaC,UAIjB,IAAIvQ,EAAMkQ,EAAMlQ,IAAI4C,QAAQ,QAAS,IACjCmE,EAAS/G,IAAQsQ,EAAa,IAAMtQ,IAAQqQ,EAAe,GAC3DG,EAAOxQ,IAAQsQ,EAAa,IAAMtQ,IAAQqQ,EAAe,GAE7D,IAAKtJ,IAAWyJ,EACZ,OAAO,EAGXN,EAAMnP,iBAEN,IAAIiK,EAAYjE,EAAS,EAAI,EAEzBX,EADQqK,GAAsBT,GACjBhF,GAGjB,OAAa,OAAT5E,KAKS,IAATA,IACAA,EAAO6I,EAAenI,eAAeqI,EAAgBa,GAAejJ,EAAQ,KAIhFX,EAAOvE,KAAKC,IAAIsE,EAAM,MAGtBA,GAAQW,GAAU,EAAI,EAEtB2J,GAAeV,EAAcd,EAAac,GAAgB5J,GAAM,KAdrD,EApxBIuK,CAAaT,EAAOF,OAInCzE,EAAO0E,aAAa,OAAQ,UAC5B1E,EAAO0E,aAAa,mBAAoBnF,EAAQhC,IAAM,WAAa,cAE9C,IAAjBkH,EACAvO,EAAS8J,EAAQT,EAAQF,WAAWY,aAC7BwE,IAAiBlF,EAAQ1C,QAAU,GAC1C3G,EAAS8J,EAAQT,EAAQF,WAAWa,aAGjCH,EAIX,SAASsF,EAAWvF,EAAM3I,GACtB,QAAKA,GAIEkN,EAAUvE,EAAMP,EAAQF,WAAWhC,SA2C9C,SAASiI,EAAWtF,EAAQyE,GACxB,QAAKlF,EAAQf,SAASiG,IAIfJ,EAAUrE,EAAOuF,WAAYhG,EAAQF,WAAWuB,SAG3D,SAASgE,IACL,OAAOnB,EAAa+B,aAAa,YAIrC,SAASX,EAAiBJ,GAEtB,OADmBlC,EAAckC,GACbe,aAAa,YAGrC,SAASC,IACD/C,IACAgD,GAAY,mBACZhD,EAAejE,SAAQ,SAASmC,GACxBA,GACAzL,EAAcyL,MAGtB8B,EAAiB,MAKzB,SAASlE,IACLiH,IAGA/C,EAAiBH,EAActG,IAAIqJ,GAEnCK,EAAU,mBAAmB,SAASC,EAAQnB,EAAcoB,GACxD,GAAKnD,EAAe+B,GAApB,CAIA,IAAIqB,EAAiBF,EAAOnB,IAEW,IAAnClF,EAAQf,SAASiG,KACjBqB,EAAiBvG,EAAQf,SAASiG,GAAc9K,GAAGkM,EAAUpB,KAGjE/B,EAAe+B,GAAcsB,UAAYD,MAmMjD,SAASE,EAAWC,EAAQC,EAAYxH,GACpC,IAAI3I,EAAUiO,EAAenC,cAAc,OAEvCsE,EAAmB,GACvBA,EA3VgB,GA2VkB5G,EAAQF,WAAWmC,YACrD2E,EA3VmB,GA2VkB5G,EAAQF,WAAWoC,WACxD0E,EA3VmB,GA2VkB5G,EAAQF,WAAWqC,SAExD,IAAI0E,EAAoB,GACxBA,EAhWgB,GAgWmB7G,EAAQF,WAAW8B,aACtDiF,EAhWmB,GAgWmB7G,EAAQF,WAAW+B,YACzDgF,EAhWmB,GAgWmB7G,EAAQF,WAAWgC,UAEzD,IAAIgF,EAA0B,CAAC9G,EAAQF,WAAWiC,gBAAiB/B,EAAQF,WAAWkC,eAClF+E,EAA2B,CAAC/G,EAAQF,WAAW4B,iBAAkB1B,EAAQF,WAAW6B,gBAKxF,SAASqF,EAAWC,EAAMC,GACtB,IAAI9Q,EAAI8Q,IAAWlH,EAAQF,WAAWlL,MAElCuS,EAAc/Q,EAAIwQ,EAAmBC,EAEzC,OAAOK,EAAS,KAHS9Q,EAAI0Q,EAA0BC,GAGd/G,EAAQhC,KAAO,IAAMmJ,EAAYF,GA+B9E,OAvCAtQ,EAASH,EAASwJ,EAAQF,WAAWwB,MACrC3K,EAASH,EAAyB,IAAhBwJ,EAAQhC,IAAYgC,EAAQF,WAAWyB,eAAiBvB,EAAQF,WAAW0B,cAkC7FnN,OAAO+N,KAAKsE,GAAQxH,SAAQ,SAASkI,IAxBrC,SAAmBA,EAAQxS,EAAOqS,GAI9B,IAvXQ,KAqXRA,EAAON,EAAaA,EAAW/R,EAAOqS,GAAQA,GAE9C,CAKA,IAAII,EAAOvC,EAAUtO,GAAS,GAC9B6Q,EAAK5Q,UAAYuQ,EAAWC,EAAMjH,EAAQF,WAAW2B,QACrD4F,EAAK7E,MAAMxC,EAAQwC,OAAS4E,EAAS,IAGjCH,EAhYQ,KAiYRI,EAAOvC,EAAUtO,GAAS,IACrBC,UAAYuQ,EAAWC,EAAMjH,EAAQF,WAAWlL,OACrDyS,EAAKlC,aAAa,aAAcvQ,GAChCyS,EAAK7E,MAAMxC,EAAQwC,OAAS4E,EAAS,IACrCC,EAAKb,UAAYrH,EAAU/E,GAAGxF,KAMlC0S,CAAUF,EAAQV,EAAOU,GAAQ,GAAIV,EAAOU,GAAQ,OAGjD5Q,EAGX,SAAS+Q,IACDrE,IACAtN,EAAcsN,GACdA,EAAa,MAIrB,SAAS5B,EAAKkG,GAEVD,IAEA,IAAIzS,EAAO0S,EAAK1S,KACZ2S,EAAUD,EAAKC,SAAW,EAC1BC,EAASF,EAAKE,SAAU,EAGxBC,EA9OR,SAAkB7S,EAAMuR,EAAQuB,GAE5B,GAAa,UAAT9S,GAA6B,UAATA,EACpB,OAAOqP,EAAe1K,KAG1B,GAAa,UAAT3E,EAAkB,CAClB,GAAIuR,EAAS,EACT,MAAM,IAAI1L,MAAM,mEAIpB,IAAIkN,EAAWxB,EAAS,EACpBK,EAAS,IAAMmB,EAKnB,IAHAxB,EAAS,GAGFwB,KACHxB,EAAOwB,GAAYA,EAAWnB,EAGlCL,EAAOxL,KAAK,KAEZ/F,EAAO,YAGX,MAAa,cAATA,EAEOuR,EAAO3J,KAAI,SAAS9H,GACvB,OAAOuP,EAAerI,aAAa8L,EAAUzD,EAAenK,QAAQpF,GAASA,MAIxE,WAATE,EAEI8S,EACOvB,EAAO3J,KAAI,SAAS9H,GAEvB,OAAOuP,EAAerI,aAAaqI,EAAenK,QAAQmK,EAAe3K,WAAW5E,QAKrFyR,OAVX,EA4MYyB,CAAShT,EAFR0S,EAAKnB,SAAU,EACdmB,EAAKI,UAAW,GAE1BlB,EA/LR,SAAwBe,EAAS3S,EAAM6S,GAMnC,IAvqCQI,EAuqCJC,EAAU,GACVC,EAAe9D,EAAe1K,KAAK,GACnCyO,EAAc/D,EAAe1K,KAAK0K,EAAe1K,KAAK/B,OAAS,GAC/DyQ,GAAc,EACdC,GAAa,EACbC,EAAU,EAsGd,OAlxCQN,EAgrCJJ,EAAMhO,QAAQiC,MAAK,SAASxF,EAAG+D,GAC3B,OAAO/D,EAAI+D,MAFnBwN,EA9qCGI,EAAML,QAAO,SAAStR,GACzB,OAAQsF,KAAKtF,KAAMsF,KAAKtF,IAAK,KAC9B,KAmrCW,KAAO6R,IACbN,EAAMW,QAAQL,GACdE,GAAc,GAIdR,EAAMA,EAAMjQ,OAAS,KAAOwQ,IAC5BP,EAAM9M,KAAKqN,GACXE,GAAa,GAGjBT,EAAMzI,SAAQ,SAASqJ,EAAS/N,GAE5B,IAAIc,EACA3H,EACA6U,EAGAC,EACAC,EACAC,EACA1B,EACA2B,EACAC,EACAC,EARAC,EAAMR,EACNS,EAAOrB,EAAMnN,EAAQ,GAQrByO,EAAmB,UAATnU,EAed,GAXImU,IACA3N,EAAO6I,EAAelJ,UAAUT,IAI/Bc,IACDA,EAAO0N,EAAOD,IAKN,IAARA,QAA0B3Q,IAAT4Q,EAQrB,IAHA1N,EAAOvE,KAAKC,IAAIsE,EAAM,MAGjB3H,EAAIoV,EAAKpV,GAAKqV,EAAMrV,GAAkBA,EAAG2H,GAlEnBD,QAAQ,GAAK,EAkEa,CAiBjD,IAXAuN,GAFAF,GADAD,EAAStE,EAAe3K,WAAW7F,IACV0U,GAEDZ,EAOxBqB,EAAWJ,GANXG,EAAY9R,KAAKsD,MAAMuO,IAUlBJ,EAAI,EAAGA,GAAKK,EAAWL,GAAK,EAM7BR,GADAW,EAASN,EAAUG,EAAIM,GACRzN,QAAQ,IAAM,CAAC8I,EAAerI,aAAa6M,GAAS,GAIvE1B,EAAOU,EAAMjJ,QAAQ/K,IAAM,EAlUhB,EAkUuCsV,EAjUvC,EAFH,GAsUHzO,GAAS2N,IACVlB,EAAO,GAGLtT,IAAMqV,GAAQZ,IAEhBJ,EAAQS,EAAOpN,QAAQ,IAAM,CAAC1H,EAAGsT,IAIrCoB,EAAUI,MAIXT,EA8EMkB,CAAezB,EAAS3S,EAAM6S,GACvCpI,EAASiI,EAAKjI,QAAU,CACxBnF,GAAIrD,KAAKsD,OAKb,OAFA6I,EAAagB,EAAac,YAAYyB,EAAWC,EAAQgB,EAAQnI,IAMrE,SAAS4J,IACL,IAAIC,EAAOrG,EAAWsG,wBAClBC,EAAM,SAAW,CAAC,QAAS,UAAUtJ,EAAQhC,KACjD,OAAuB,IAAhBgC,EAAQhC,IAAYoL,EAAKG,OAASxG,EAAWuG,GAAOF,EAAKI,QAAUzG,EAAWuG,GAIzF,SAASG,EAAY1K,EAAQvI,EAASkT,EAAUC,GAI5C,IAAIC,EAAS,SAAS1T,GAKlB,SAJAA,EAwDR,SAAkBA,EAAG2T,EAAYC,GAI7B,IAIIrR,EACAI,EALAkR,EAAoC,IAA5B7T,EAAE+Q,KAAKvI,QAAQ,SACvBsL,EAAoC,IAA5B9T,EAAE+Q,KAAKvI,QAAQ,SACvBuL,EAAwC,IAA9B/T,EAAE+Q,KAAKvI,QAAQ,WAW7B,GALoC,IAAhCxI,EAAE+Q,KAAKvI,QAAQ,eACfuL,GAAU,GAIVF,EAAO,CAEP,IAAIG,EAAkB,SAASC,GAC3B,OAAOA,EAAW7J,SAAWwJ,GAAeA,EAAYM,SAASD,EAAW7J,SAKhF,GAAe,eAAXpK,EAAE+Q,KAAuB,CACzB,IAAIoD,EAAgBlT,MAAM5B,UAAUmS,OAAO5T,KAAKoC,EAAEoU,QAASJ,GAG3D,GAAIG,EAAc3S,OAAS,EACvB,OAAO,EAGXe,EAAI4R,EAAc,GAAGE,MACrB1R,EAAIwR,EAAc,GAAGG,UAClB,CAEH,IAAIC,EAActT,MAAM5B,UAAUmV,KAAK5W,KAAKoC,EAAEyU,eAAgBT,GAG9D,IAAKO,EACD,OAAO,EAGXhS,EAAIgS,EAAYF,MAChB1R,EAAI4R,EAAYD,OAexB,OAXAX,EAAaA,GAAc5R,EAAcwM,IAErCuF,GAASC,KACTxR,EAAIvC,EAAE0U,QAAUf,EAAWpR,EAC3BI,EAAI3C,EAAE2U,QAAUhB,EAAWhR,GAG/B3C,EAAE2T,WAAaA,EACf3T,EAAE4U,OAAS,CAACrS,EAAGI,GACf3C,EAAE6U,OAASf,GAASC,EAEb/T,EApHC8U,CAAS9U,EAAGyT,EAAKE,WAAYF,EAAKrJ,QAAU9J,OAU5C6O,MAAuBsE,EAAKsB,eA5yC1BpV,EAizCOqO,EAjzCHzN,EAizCiBuJ,EAAQF,WAAWrB,OAhzC/C5I,EAAG8B,UACJ9B,EAAG8B,UAAUyS,SAAS3T,GACtB,IAAIsB,OAAO,MAAQtB,EAAY,OAAOyU,KAAKrV,EAAGY,cA8yCWkT,EAAKsB,gBAKxDlM,IAAWuE,EAAQ/F,YAAuBnF,IAAdlC,EAAEiV,SAAyBjV,EAAEiV,QAAU,MAKnExB,EAAK9K,QAAS3I,EAAEiV,WASfvH,GACD1N,EAAED,iBAGNC,EAAEkV,UAAYlV,EAAE4U,OAAO9K,EAAQhC,UAG/B0L,EAASxT,EAAGyT,KA30CxB,IAAkB9T,EAAIY,GA80CV4U,EAAU,GAQd,OALAtM,EAAOtH,MAAM,KAAKyH,SAAQ,SAASoM,GAC/B9U,EAAQwN,iBAAiBsH,EAAW1B,IAAQhG,GAAkB,CAAE2H,SAAS,IACzEF,EAAQxQ,KAAK,CAACyQ,EAAW1B,OAGtByB,EAoEX,SAASG,EAAsBJ,GAC3B,IAp+CQK,EAAMtL,EACdiJ,EACAlR,EACAwT,EACA7B,EAi+CI8B,EAAuB,KADZP,GAp+CPK,EAo+C0B1I,EAp+CpB5C,EAo+CgCH,EAAQhC,IAn+CtDoL,EAAOqC,EAAKpC,wBACZnR,EAAMuT,EAAK/G,cACXgH,EAAUxT,EAAIQ,gBACdmR,EAAa5R,EAAcC,GAK3B,0BAA0BgT,KAAK3H,UAAUqI,aACzC/B,EAAWpR,EAAI,GAGZ0H,EACDiJ,EAAKyC,IAAMhC,EAAWhR,EAAI6S,EAAQI,UAClC1C,EAAK2C,KAAOlC,EAAWpR,EAAIiT,EAAQM,aAs9CH7C,IAOlC,OAFAwC,EAAW7U,EAAM6U,GAEV3L,EAAQzB,IAAM,IAAMoN,EAAWA,EA0B1C,SAASM,EAAc7G,EAAOuE,GACP,aAAfvE,EAAM6B,MAAiD,SAA1B7B,EAAM9E,OAAO4L,UAA+C,OAAxB9G,EAAM+G,eACvEC,EAAShH,EAAOuE,GAKxB,SAAS0C,EAAUjH,EAAOuE,GAMtB,IAAgD,IAA5CpG,UAAU+I,WAAW5N,QAAQ,WAAsC,IAAlB0G,EAAM+F,SAA0C,IAAzBxB,EAAK4C,gBAC7E,OAAOH,EAAShH,EAAOuE,GAI3B,IAAI6C,GAAYxM,EAAQzB,KAAO,EAAI,IAAM6G,EAAMgG,UAAYzB,EAAK8C,gBAKhEC,GAAYF,EAAW,EAFI,IAAXA,EAAkB7C,EAAKR,SAEHQ,EAAKgD,UAAWhD,EAAKiD,eAI7D,SAASR,EAAShH,EAAOuE,GAEjBA,EAAKlJ,SACL5J,EAAY8S,EAAKlJ,OAAQT,EAAQF,WAAWsB,QAC5CmD,GAA4B,GAIhCoF,EAAKkD,UAAU3N,SAAQ,SAASlL,GAC5B2Q,EAAsBmI,oBAAoB9Y,EAAE,GAAIA,EAAE,OAGrB,IAA7BuQ,IAEA1N,EAAYqN,EAAclE,EAAQF,WAAWnB,MAC7CoO,KAGI3H,EAAM2F,SACNnG,EAAWpC,MAAMuI,OAAS,GAC1BnG,EAAWkI,oBAAoB,cAAe7W,KAItD0T,EAAKiD,cAAc1N,SAAQ,SAASgG,GAChC8H,GAAU,SAAU9H,GACpB8H,GAAU,MAAO9H,GACjB8H,GAAU,MAAO9H,MAKzB,SAAS+H,EAAW7H,EAAOuE,GAEvB,GAAIA,EAAKiD,cAAcM,KAAK5H,GACxB,OAAO,EAGX,IAAI7E,EAE8B,IAA9BkJ,EAAKiD,cAAclV,SAGnB+I,EAFmBuC,EAAc2G,EAAKiD,cAAc,IAE9BO,SAAS,GAC/B5I,GAA4B,EAG5B5N,EAAS8J,EAAQT,EAAQF,WAAWsB,SAIxCgE,EAAMgI,kBAGN,IAAIP,EAAY,GAGZQ,EAAY5D,EAAYnG,EAAQG,KAAMkB,EAAuB0H,EAAW,CAGxE/L,OAAQ8E,EAAM9E,OACdG,OAAQA,EACRoM,UAAWA,EACXJ,eAAgBrH,EAAMgG,UACtBjC,SAAUA,IACVU,WAAYzE,EAAMyE,WAClB+C,cAAejD,EAAKiD,cACpBL,gBAAiBnH,EAAM+F,QACvBwB,UAAWtI,EAAgB1K,UAG3B2T,EAAW7D,EAAYnG,EAAQI,IAAKiB,EAAuByH,EAAU,CACrE9L,OAAQ8E,EAAM9E,OACdG,OAAQA,EACRoM,UAAWA,EACX5B,aAAa,EACb2B,cAAejD,EAAKiD,gBAGpBW,EAAW9D,EAAY,WAAY9E,EAAuBsH,EAAe,CACzE3L,OAAQ8E,EAAM9E,OACdG,OAAQA,EACRoM,UAAWA,EACX5B,aAAa,EACb2B,cAAejD,EAAKiD,gBAKxBC,EAAUhS,KAAK8B,MAAMkQ,EAAWQ,EAAUG,OAAOF,EAAUC,IAIvDnI,EAAM2F,SAENnG,EAAWpC,MAAMuI,OAAS0C,iBAAiBrI,EAAM9E,QAAQyK,OAGrD/H,EAActL,OAAS,GACvBf,EAASuN,EAAclE,EAAQF,WAAWnB,MAS9CiG,EAAWZ,iBAAiB,cAAe/N,GAAgB,IAG/D0T,EAAKiD,cAAc1N,SAAQ,SAASgG,GAChC8H,GAAU,QAAS9H,MAK3B,SAASwI,EAAStI,GAEdA,EAAMgI,kBAEN,IAAIzB,EAAWH,EAAsBpG,EAAMgG,WACvClG,EA3KR,SAA0ByG,GACtB,IAAIrR,EAAU,IACV4K,GAAe,EAgBnB,OAdAlC,EAAc9D,SAAQ,SAASuB,EAAQjG,GAEnC,IAAI8K,EAAiB9K,GAArB,CAIA,IAAImT,EAAM5W,KAAK+C,IAAIuK,EAAgB7J,GAASmR,IAExCgC,EAAMrT,GAAoB,MAARqT,GAA2B,MAAZrT,KACjC4K,EAAe1K,EACfF,EAAUqT,OAIXzI,EAyJY0I,CAAiBjC,GAGpC,IAAqB,IAAjBzG,EACA,OAAO,EAKNlF,EAAQjB,OAAO7E,MAChB3D,EAAY2N,EAAclE,EAAQF,WAAWrB,IAAKuB,EAAQpC,mBAG9DiQ,GAAU3I,EAAcyG,GAAU,GAAM,GAExCoB,KAEAC,GAAU,QAAS9H,GAAc,GACjC8H,GAAU,SAAU9H,GAAc,GAClC8H,GAAU,SAAU9H,GAAc,GAClC8H,GAAU,MAAO9H,GAAc,GAE3BlF,EAAQjB,OAAO7E,MACf+S,EAAW7H,EAAO,CAAEwH,cAAe,CAAC1H,KAK5C,SAAS4I,EAAW1I,GAChB,IAAIuG,EAAWH,EAAsBpG,EAAMgG,WAEvChR,EAAK+J,EAAenK,QAAQ2R,GAC5B/W,EAAQuP,EAAerI,aAAa1B,GAExC/F,OAAO+N,KAAKoC,GAActF,SAAQ,SAAS6O,GACnC,UAAYA,EAAYtW,MAAM,KAAK,IACnC+M,EAAauJ,GAAa7O,SAAQ,SAASwK,GACvCA,EAAS5V,KAAKsP,EAAYxO,SAsH1C,SAASwR,EAAU4H,EAAiBtE,GAChClF,EAAawJ,GAAmBxJ,EAAawJ,IAAoB,GACjExJ,EAAawJ,GAAiBnT,KAAK6O,GAGG,WAAlCsE,EAAgBvW,MAAM,KAAK,IAC3BuL,EAAc9D,SAAQ,SAAS9I,EAAGoE,GAC9BwS,GAAU,SAAUxS,MAMhC,SAAS2L,GAAY6H,GACjB,IAAI5I,EAAQ4I,GAAmBA,EAAgBvW,MAAM,KAAK,GACtDwW,EAAY7I,GAAS4I,EAAgBE,UAAU9I,EAAM1N,QAEzDrD,OAAO+N,KAAKoC,GAActF,SAAQ,SAAS/J,GACvC,IAAIgZ,EAAShZ,EAAKsC,MAAM,KAAK,GACzB2W,EAAajZ,EAAK+Y,UAAUC,EAAOzW,QAEjC0N,GAASA,IAAU+I,GAAaF,GAAaA,IAAcG,UACtD5J,EAAarP,MAMhC,SAAS6X,GAAU1B,EAAWpG,EAAczG,GACxCpK,OAAO+N,KAAKoC,GAActF,SAAQ,SAAS6O,GACvC,IAAIM,EAAYN,EAAYtW,MAAM,KAAK,GAEnC6T,IAAc+C,GACd7J,EAAauJ,GAAa7O,SAAQ,SAASwK,GACvCA,EAAS5V,KAELsP,EAEAgB,EAAa1H,IAAIsD,EAAQT,OAAOnF,IAEhC8K,EAEAd,EAAazK,QAEb8E,IAAO,EAEP4F,EAAgB1K,eAQpC,SAAS2U,GAAoBC,EAAWrJ,EAAc9K,EAAIoU,EAAcC,EAAaC,GA4CjF,OAzCI1L,EAActL,OAAS,IAAMsI,EAAQjB,OAAOD,gBACxC0P,GAAgBtJ,EAAe,IAC/B9K,EAAKrD,KAAKC,IAAIoD,EAAImU,EAAUrJ,EAAe,GAAKlF,EAAQ9B,SAGxDuQ,GAAevJ,EAAelC,EAActL,OAAS,IACrD0C,EAAKrD,KAAKE,IAAImD,EAAImU,EAAUrJ,EAAe,GAAKlF,EAAQ9B,UAO5D8E,EAActL,OAAS,GAAKsI,EAAQlJ,QAChC0X,GAAgBtJ,EAAe,IAC/B9K,EAAKrD,KAAKE,IAAImD,EAAImU,EAAUrJ,EAAe,GAAKlF,EAAQlJ,QAGxD2X,GAAevJ,EAAelC,EAActL,OAAS,IACrD0C,EAAKrD,KAAKC,IAAIoD,EAAImU,EAAUrJ,EAAe,GAAKlF,EAAQlJ,SAM5DkJ,EAAQ3B,UACa,IAAjB6G,IACA9K,EAAKrD,KAAKC,IAAIoD,EAAI4F,EAAQ3B,QAAQ,KAGlC6G,IAAiBlC,EAActL,OAAS,IACxC0C,EAAKrD,KAAKE,IAAImD,EAAI,IAAM4F,EAAQ3B,QAAQ,SAOhDjE,EAAKtD,EAHLsD,EAAK+J,EAAenK,QAAQI,OAMjBmU,EAAUrJ,KAAkBwJ,IAIhCtU,EAIX,SAASuU,GAAYC,EAAGxY,GACpB,IAAIhC,EAAI4L,EAAQhC,IAChB,OAAQ5J,EAAIgC,EAAIwY,GAAK,MAAQxa,EAAIwa,EAAIxY,GAKzC,SAASsW,GAAYmC,EAAQlD,EAAUgB,EAAWC,GAC9C,IAAIkC,EAAYnC,EAAUhT,QAEtBQ,EAAI,EAAE0U,EAAQA,GACdE,EAAI,CAACF,GAASA,GAGlBjC,EAAgBA,EAAcjT,QAI1BkV,GACAjC,EAAcnH,UAIdmH,EAAclV,OAAS,EACvBkV,EAAc1N,SAAQ,SAASgG,EAAc9Q,GACzC,IAAIgG,EAAKkU,GACLQ,EACA5J,EACA4J,EAAU5J,GAAgByG,EAC1BxR,EAAE/F,GACF2a,EAAE3a,IACF,IAIO,IAAPgG,EACAuR,EAAW,GAEXA,EAAWvR,EAAK0U,EAAU5J,GAC1B4J,EAAU5J,GAAgB9K,MAOlCD,EAAI4U,EAAI,EAAC,GAGb,IAAIC,GAAQ,EAGZpC,EAAc1N,SAAQ,SAASgG,EAAc9Q,GACzC4a,EAAQnB,GAAU3I,EAAcyH,EAAUzH,GAAgByG,EAAUxR,EAAE/F,GAAI2a,EAAE3a,KAAO4a,KAInFA,GACApC,EAAc1N,SAAQ,SAASgG,GAC3B8H,GAAU,SAAU9H,GACpB8H,GAAU,QAAS9H,MAS/B,SAAS+J,GAAmB7Y,EAAG+D,GAC3B,OAAO6F,EAAQzB,IAAM,IAAMnI,EAAI+D,EAAI/D,EAqBvC,SAAS2W,KACLzI,EAAoBpF,SAAQ,SAASgG,GACjC,IAAI3G,EAAM8F,EAAgBa,GAAgB,IAAM,EAAI,EAChDgK,EAAS,GAAKlM,EAActL,OAAS6G,EAAM2G,GAC/ClC,EAAckC,GAAc1C,MAAM0M,OAASA,KAKnD,SAASrB,GAAU3I,EAAc9K,EAAIoU,EAAcC,GAG/C,OAAW,KAFXrU,EAAKkU,GAAoBjK,EAAiBa,EAAc9K,EAAIoU,EAAcC,GAAa,MA3B3F,SAA8BvJ,EAAc9K,GAExCiK,EAAgBa,GAAgB9K,EAGhCgK,EAAac,GAAgBf,EAAerI,aAAa1B,GAEzD,IAAI+U,EAAO,aAAeR,GAAYM,GAAmB7U,EAAI,GAAKyK,EAAkB,IAAK,KAAO,IAChG7B,EAAckC,GAAc1C,MAAMxC,EAAQ4C,eAAiBuM,EAE3DC,GAAclK,GACdkK,GAAclK,EAAe,GAsB7BmK,CAAqBnK,EAAc9K,IAE5B,GAIX,SAASgV,GAAc5U,GAEnB,GAAKyI,EAAezI,GAApB,CAIA,IAAI5G,EAAI,EACJ0b,EAAI,IAEM,IAAV9U,IACA5G,EAAIyQ,EAAgB7J,EAAQ,IAG5BA,IAAUyI,EAAevL,OAAS,IAClC4X,EAAIjL,EAAgB7J,IAOxB,IAAI+U,EAAeD,EAAI1b,EACnB4b,EAAgB,aAAeb,GAAYM,GAAmBrb,EAAG2b,GAAgB,IAAK,KAAO,IAC7FE,EAAY,SAAWd,GAAYY,EAAe,IAAK,KAAO,IAElEtM,EAAezI,GAAOgI,MAAMxC,EAAQ4C,eAAiB4M,EAAgB,IAAMC,GAI/E,SAASC,GAAetV,EAAI8K,GAGxB,OAAW,OAAP9K,IAAsB,IAAPA,QAAuBhC,IAAPgC,EACxBiK,EAAgBa,IAIT,iBAAP9K,IACPA,EAAK5C,OAAO4C,IAGhBA,EAAK4F,EAAQT,OAAOzC,KAAK1C,IAId,KAHXA,EAAK+J,EAAe3K,WAAWY,KAGX/D,MAAM+D,GACfiK,EAAgBa,GAGpB9K,GAIX,SAASuV,GAASC,EAAOC,GACrB,IAAIxJ,EAASnP,EAAQ0Y,GACjBE,OAAgC1X,IAAvBiM,EAAgB,GAG7BwL,OAAgCzX,IAAjByX,KAAsCA,EAIjD7P,EAAQtC,UAAYoS,GACpBvZ,EAAY2N,EAAclE,EAAQF,WAAWrB,IAAKuB,EAAQpC,mBAI9D0G,EAAoBpF,SAAQ,SAASgG,GACjC2I,GAAU3I,EAAcwK,GAAerJ,EAAOnB,GAAeA,IAAe,GAAM,MAItFZ,EAAoBpF,SAAQ,SAASgG,GACjC2I,GAAU3I,EAAcb,EAAgBa,IAAe,GAAM,MAGjE6H,KAEAzI,EAAoBpF,SAAQ,SAASgG,GACjC8H,GAAU,SAAU9H,GAGS,OAAzBmB,EAAOnB,IAA0B2K,GACjC7C,GAAU,MAAO9H,MAW7B,SAASU,GAAeV,EAActQ,EAAOib,GAIzC,MAFA3K,EAAe9J,OAAO8J,KAEA,GAAKA,EAAeZ,EAAoB5M,QAC1D,MAAM,IAAIiD,MAAM,oDAA+DuK,GAInF2I,GAAU3I,EAAcwK,GAAe9a,EAAOsQ,IAAe,GAAM,GAEnE8H,GAAU,SAAU9H,GAEhB2K,GACA7C,GAAU,MAAO9H,GAKzB,SAAS6K,KACL,IAAI1J,EAASjC,EAAa1H,IAAIsD,EAAQT,OAAOnF,IAG7C,OAAsB,IAAlBiM,EAAO3O,OACA2O,EAAO,GAGXA,EAmBX,SAASV,GAAsBT,GAC3B,IAAI8K,EAAW3L,EAAgBa,GAC3B+K,EAAc9L,EAAehI,eAAe6T,GAC5Cpb,EAAQwP,EAAac,GACrBgL,EAAYD,EAAY3T,SAAShB,KACjC6U,EAAY,KAGhB,GAAInQ,EAAQ9F,KACR,MAAO,CACHtF,EAAQqb,EAAY7T,WAAWC,YAAc,KAC7C4T,EAAY1T,UAAUF,WAAazH,GAAS,OAMlC,IAAdsb,GACItb,EAAQsb,EAAYD,EAAY1T,UAAUF,aAC1C6T,EAAYD,EAAY1T,UAAUF,WAAazH,GAMnDub,EADAvb,EAAQqb,EAAY3T,SAASD,WACjB4T,EAAY3T,SAAShB,MACM,IAAhC2U,EAAY7T,WAAWd,MAMlB1G,EAAQqb,EAAY7T,WAAWlB,YAI9B,MAAb8U,EACAE,EAAY,KACQ,IAAbF,IACPG,EAAY,MAIhB,IAAI1T,EAAe0H,EAAe3H,oBAWlC,OARkB,OAAd0T,IAAoC,IAAdA,IACtBA,EAAY9U,OAAO8U,EAAU7U,QAAQoB,KAGvB,OAAd0T,IAAoC,IAAdA,IACtBA,EAAY/U,OAAO+U,EAAU9U,QAAQoB,KAGlC,CAAC0T,EAAWD,GAwHvB,OAt0CIvZ,EAFe0M,EA2xCQa,EAzxCHlE,EAAQF,WAAWQ,QAEnB,IAAhBN,EAAQzB,IACR5H,EAAS0M,EAAWrD,EAAQF,WAAWmB,KAEvCtK,EAAS0M,EAAWrD,EAAQF,WAAWoB,KAGvB,IAAhBlB,EAAQhC,IACRrH,EAAS0M,EAAWrD,EAAQF,WAAWe,YAEvClK,EAAS0M,EAAWrD,EAAQF,WAAWgB,UA8wC3CiC,EA3wCO+B,EAAUzB,EAAWrD,EAAQF,WAAWS,MApCnD,SAAqB6P,EAAgB7P,GACjC,IAAI8P,EAAcvL,EAAUvE,EAAMP,EAAQF,WAAWkB,UAErDgC,EAAgB,IAChBC,EAAiB,IAEFpI,KAAKiL,EAAWuK,EAAaD,EAAe,KAK3D,IAAK,IAAIzc,EAAI,EAAGA,EAAIqM,EAAQ1C,QAAS3J,IAEjCqP,EAAcnI,KAAKoK,EAAU1E,EAAM5M,IACnC2Q,EAAoB3Q,GAAKA,EACzBsP,EAAepI,KAAKiL,EAAWuK,EAAaD,EAAezc,EAAI,KAkyCnE2c,CAAYtQ,EAAQlC,QAASiF,IAniBP3C,EAsiBLJ,EAAQjB,QApiBVH,OACXoE,EAAc9D,SAAQ,SAASuB,EAAQjG,GAGnCiP,EAAYnG,EAAQ/F,MAAOkD,EAAO0M,SAAS,GAAIF,EAAY,CACvDL,cAAe,CAACpS,QAMxB4F,EAAU3B,KACVgL,EAAYnG,EAAQ/F,MAAOwF,EAAY2K,EAAU,IAIjDtN,EAAUvB,OACV4K,EAAYnG,EAAQG,KAAMV,EAAY+K,EAAY,CAC9CjP,OAAO,IAKXuB,EAAUzB,MACVsE,EAAe/D,SAAQ,SAASpB,EAAStD,GACrC,IAAgB,IAAZsD,GAA+B,IAAVtD,GAAeA,IAAUyI,EAAevL,OAAS,EAA1E,CAIA,IAAI6Y,EAAevN,EAAcxI,EAAQ,GACrCgW,EAAcxN,EAAcxI,GAC5BiW,EAAe,CAAC3S,GAEpBnH,EAASmH,EAASkC,EAAQF,WAAWqB,WAMjCf,EAAUxB,QACV6R,EAAa5V,KAAK0V,EAAapD,SAAS,IACxCsD,EAAa5V,KAAK2V,EAAYrD,SAAS,KAG3CsD,EAAavR,SAAQ,SAASwR,GAC1BjH,EAAYnG,EAAQ/F,MAAOmT,EAAazD,EAAY,CAChD3P,QAAS,CAACiT,EAAcC,GACxB5D,cAAe,CAACpS,EAAQ,EAAGA,YAwf3CmV,GAAS3P,EAAQzC,OAEbyC,EAAQsB,MACRA,EAAKtB,EAAQsB,MAGbtB,EAAQf,UACRA,IAluCJmH,EAAU,UAAU,SAASC,EAAQnB,EAAcoB,EAAW7H,EAAKkS,GAE/DrM,EAAoBpF,SAAQ,SAAS1E,GACjC,IAAIiG,EAASuC,EAAcxI,GAEvBvD,EAAMqX,GAAoBjK,EAAiB7J,EAAO,GAAG,GAAM,GAAM,GACjExD,EAAMsX,GAAoBjK,EAAiB7J,EAAO,KAAK,GAAM,GAAM,GAEnEoW,EAAMD,EAAUnW,GAGhBqW,EAAO7Q,EAAQX,WAAWjF,GAAGkM,EAAU9L,IAG3CvD,EAAMkN,EAAerI,aAAa7E,GAAKoE,QAAQ,GAC/CrE,EAAMmN,EAAerI,aAAa9E,GAAKqE,QAAQ,GAC/CuV,EAAMzM,EAAerI,aAAa8U,GAAKvV,QAAQ,GAE/CoF,EAAO0M,SAAS,GAAGhI,aAAa,gBAAiBlO,GACjDwJ,EAAO0M,SAAS,GAAGhI,aAAa,gBAAiBnO,GACjDyJ,EAAO0M,SAAS,GAAGhI,aAAa,gBAAiByL,GACjDnQ,EAAO0M,SAAS,GAAGhI,aAAa,iBAAkB0L,SAstC9DzN,EAAa,CACT0N,QAzKJ,WACI,IAAK,IAAI5b,KAAO8K,EAAQF,WACfE,EAAQF,WAAWtK,eAAeN,IAGvC2B,EAAYqN,EAAclE,EAAQF,WAAW5K,IAGjD,KAAOgP,EAAa8B,YAChB9B,EAAanO,YAAYmO,EAAa8B,mBAGnC9B,EAAa6M,YA8JpBnI,MAjGJ,WACI,OAAOtE,EAAoB5H,IAAIiJ,KAiG/BqL,GAAI5K,EACJ6K,IAAK9K,GACL3R,IAAKub,GACLmB,IAAKvB,GACL9B,UAAWjI,GACXuL,MApNJ,SAAoBtB,GAChBF,GAAS3P,EAAQzC,MAAOsS,IAqNxBuB,cAAe,SAAShb,EAAG+D,EAAGnG,GAC1B0Y,GAAYtW,EAAG+D,EAAGkK,EAAiBrQ,IAEvCgM,QAAS8C,EACTuO,cAxGJ,SAAuBC,EAAiBzB,GAIpC,IAAIjB,EAAImB,KAEJwB,EAAa,CACb,SACA,QACA,UACA,QACA,UACA,OACA,OACA,SACA,OACA,YAIJA,EAAWrS,SAAQ,SAAShL,QAEMkE,IAA1BkZ,EAAgBpd,KAChB4O,EAAgB5O,GAAQod,EAAgBpd,OAIhD,IAAIsd,EAAazR,EAAY+C,GAG7ByO,EAAWrS,SAAQ,SAAShL,QACMkE,IAA1BkZ,EAAgBpd,KAChB8L,EAAQ9L,GAAQsd,EAAWtd,OAInCiQ,EAAiBqN,EAAWpU,SAG5B4C,EAAQ9B,OAASsT,EAAWtT,OAC5B8B,EAAQlJ,MAAQ0a,EAAW1a,MAC3BkJ,EAAQ3B,QAAUmT,EAAWnT,QAGzB2B,EAAQsB,KACRA,EAAKtB,EAAQsB,MAEbiG,IAIAvH,EAAQf,SACRA,IAEAiH,IAIJ7B,EAAkB,GAClBsL,GAAS2B,EAAgB/T,OAASqR,EAAGiB,IA8CrCvP,OAAQ4D,EACRqD,WAAYA,EACZrB,eAAgBA,EAChB5E,KAAMA,GA2Bd,MAAO,CAEHmQ,WAAYlW,EACZmW,QAAS/b,EACTV,OAxBJ,SAAoBqL,EAAQwC,GACxB,IAAKxC,IAAWA,EAAO4L,SACnB,MAAM,IAAIvR,MAAM,+DAA0E2F,GAI9F,GAAIA,EAAOyQ,WACP,MAAM,IAAIpW,MAAM,wDAIpB,IACIgX,EAAM9O,EAAMvC,EADFP,EAAY+C,GACOA,GAIjC,OAFAxC,EAAOyQ,WAAaY,EAEbA,MA54EW,gC,8BCJ1B,YA4BA;;;;;;;;;;;;;;;;;;;;;;;;;AAJA,IAAIC,EAA8B,oBAAXvZ,QAA8C,oBAAbgK,SAEpDwP,EAAwB,CAAC,OAAQ,UAAW,WAC5CC,EAAkB,EACbne,EAAI,EAAGA,EAAIke,EAAsBna,OAAQ/D,GAAK,EACrD,GAAIie,GAAarO,UAAUqI,UAAUlN,QAAQmT,EAAsBle,KAAO,EAAG,CAC3Eme,EAAkB,EAClB,MA+BJ,IAWIC,EAXqBH,GAAavZ,OAAO2Z,QA3B7C,SAA2BC,GACzB,IAAIC,GAAS,EACb,OAAO,WACDA,IAGJA,GAAS,EACT7Z,OAAO2Z,QAAQG,UAAUC,MAAK,WAC5BF,GAAS,EACTD,UAKN,SAAsBA,GACpB,IAAII,GAAY,EAChB,OAAO,WACAA,IACHA,GAAY,EACZzb,YAAW,WACTyb,GAAY,EACZJ,MACCH,MAyBT,SAASQ,EAAWC,GAElB,OAAOA,GAA8D,sBADvD,GACoBC,SAAS1e,KAAKye,GAUlD,SAASE,EAAyBjc,EAASlB,GACzC,GAAyB,IAArBkB,EAAQkc,SACV,MAAO,GAGT,IACIC,EADSnc,EAAQkO,cAAckO,YAClBnF,iBAAiBjX,EAAS,MAC3C,OAAOlB,EAAWqd,EAAIrd,GAAYqd,EAUpC,SAASE,EAAcrc,GACrB,MAAyB,SAArBA,EAAQ0V,SACH1V,EAEFA,EAAQsc,YAActc,EAAQuc,KAUvC,SAASC,EAAgBxc,GAEvB,IAAKA,EACH,OAAO6L,SAASzJ,KAGlB,OAAQpC,EAAQ0V,UACd,IAAK,OACL,IAAK,OACH,OAAO1V,EAAQkO,cAAc9L,KAC/B,IAAK,YACH,OAAOpC,EAAQoC,KAKnB,IAAIqa,EAAwBR,EAAyBjc,GACjD0c,EAAWD,EAAsBC,SACjCC,EAAYF,EAAsBE,UAClCC,EAAYH,EAAsBG,UAEtC,MAAI,wBAAwBlI,KAAKgI,EAAWE,EAAYD,GAC/C3c,EAGFwc,EAAgBH,EAAcrc,IAGvC,IAAI6c,EAASzB,MAAgBvZ,OAAOib,uBAAwBjR,SAASkR,cACjEC,EAAS5B,GAAa,UAAU1G,KAAK3H,UAAUqI,WASnD,SAAS6H,EAAK/B,GACZ,OAAgB,KAAZA,EACK2B,EAEO,KAAZ3B,EACK8B,EAEFH,GAAUG,EAUnB,SAASE,EAAgBld,GACvB,IAAKA,EACH,OAAO6L,SAAS3J,gBAQlB,IALA,IAAIib,EAAiBF,EAAK,IAAMpR,SAASzJ,KAAO,KAG5Cgb,EAAepd,EAAQod,cAAgB,KAEpCA,IAAiBD,GAAkBnd,EAAQqd,oBAChDD,GAAgBpd,EAAUA,EAAQqd,oBAAoBD,aAGxD,IAAI1H,EAAW0H,GAAgBA,EAAa1H,SAE5C,OAAKA,GAAyB,SAAbA,GAAoC,SAAbA,GAMsB,IAA1D,CAAC,KAAM,KAAM,SAASxN,QAAQkV,EAAa1H,WAA2E,WAAvDuG,EAAyBmB,EAAc,YACjGF,EAAgBE,GAGlBA,EATEpd,EAAUA,EAAQkO,cAAchM,gBAAkB2J,SAAS3J,gBA4BtE,SAASob,EAAQzM,GACf,OAAwB,OAApBA,EAAKyL,WACAgB,EAAQzM,EAAKyL,YAGfzL,EAWT,SAAS0M,EAAuBC,EAAUC,GAExC,KAAKD,GAAaA,EAAStB,UAAauB,GAAaA,EAASvB,UAC5D,OAAOrQ,SAAS3J,gBAIlB,IAAIwb,EAAQF,EAASG,wBAAwBF,GAAYG,KAAKC,4BAC1D9W,EAAQ2W,EAAQF,EAAWC,EAC3BvQ,EAAMwQ,EAAQD,EAAWD,EAGzB5a,EAAQiJ,SAASiS,cACrBlb,EAAMmb,SAAShX,EAAO,GACtBnE,EAAMob,OAAO9Q,EAAK,GAClB,IA/CyBlN,EACrB0V,EA8CAuI,EAA0Brb,EAAMqb,wBAIpC,GAAIT,IAAaS,GAA2BR,IAAaQ,GAA2BlX,EAAM6M,SAAS1G,GACjG,MAjDe,UAFbwI,GADqB1V,EAoDDie,GAnDDvI,WAKH,SAAbA,GAAuBwH,EAAgBld,EAAQke,qBAAuBle,EAkDpEkd,EAAgBe,GAHdA,EAOX,IAAIE,EAAeb,EAAQE,GAC3B,OAAIW,EAAa5B,KACRgB,EAAuBY,EAAa5B,KAAMkB,GAE1CF,EAAuBC,EAAUF,EAAQG,GAAUlB,MAY9D,SAAS6B,EAAUpe,GACjB,IAAIqe,EAAOC,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,GAAmBA,UAAU,GAAK,MAE3EC,EAAqB,QAATF,EAAiB,YAAc,aAC3C3I,EAAW1V,EAAQ0V,SAEvB,GAAiB,SAAbA,GAAoC,SAAbA,EAAqB,CAC9C,IAAI8I,EAAOxe,EAAQkO,cAAchM,gBAC7Buc,EAAmBze,EAAQkO,cAAcuQ,kBAAoBD,EACjE,OAAOC,EAAiBF,GAG1B,OAAOve,EAAQue,GAYjB,SAASG,EAAc9L,EAAM5S,GAC3B,IAAI2e,EAAWL,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,IAAmBA,UAAU,GAE1E/b,EAAY6b,EAAUpe,EAAS,OAC/BmC,EAAaic,EAAUpe,EAAS,QAChC4e,EAAWD,GAAY,EAAI,EAK/B,OAJA/L,EAAKyC,KAAO9S,EAAYqc,EACxBhM,EAAKiM,QAAUtc,EAAYqc,EAC3BhM,EAAK2C,MAAQpT,EAAayc,EAC1BhM,EAAKkM,OAAS3c,EAAayc,EACpBhM,EAaT,SAASmM,EAAeC,EAAQC,GAC9B,IAAIC,EAAiB,MAATD,EAAe,OAAS,MAChCE,EAAkB,SAAVD,EAAmB,QAAU,SAEzC,OAAO9a,WAAW4a,EAAO,SAAWE,EAAQ,SAAU,IAAM9a,WAAW4a,EAAO,SAAWG,EAAQ,SAAU,IAG7G,SAASC,EAAQH,EAAM7c,EAAMoc,EAAMa,GACjC,OAAO9e,KAAKC,IAAI4B,EAAK,SAAW6c,GAAO7c,EAAK,SAAW6c,GAAOT,EAAK,SAAWS,GAAOT,EAAK,SAAWS,GAAOT,EAAK,SAAWS,GAAOhC,EAAK,IAAMqC,SAASd,EAAK,SAAWS,IAASK,SAASD,EAAc,UAAqB,WAATJ,EAAoB,MAAQ,UAAYK,SAASD,EAAc,UAAqB,WAATJ,EAAoB,SAAW,WAAa,GAG5U,SAASM,EAAe1T,GACtB,IAAIzJ,EAAOyJ,EAASzJ,KAChBoc,EAAO3S,EAAS3J,gBAChBmd,EAAgBpC,EAAK,KAAOhG,iBAAiBuH,GAEjD,MAAO,CACLxL,OAAQoM,EAAQ,SAAUhd,EAAMoc,EAAMa,GACtCtM,MAAOqM,EAAQ,QAAShd,EAAMoc,EAAMa,IAIxC,IAAIG,EAAiB,SAAUC,EAAUC,GACvC,KAAMD,aAAoBC,GACxB,MAAM,IAAIC,UAAU,sCAIpBC,EAAc,WAChB,SAASC,EAAiB/V,EAAQgW,GAChC,IAAK,IAAI3iB,EAAI,EAAGA,EAAI2iB,EAAM5e,OAAQ/D,IAAK,CACrC,IAAI4iB,EAAaD,EAAM3iB,GACvB4iB,EAAWhiB,WAAagiB,EAAWhiB,aAAc,EACjDgiB,EAAWC,cAAe,EACtB,UAAWD,IAAYA,EAAWE,UAAW,GACjDpiB,OAAOC,eAAegM,EAAQiW,EAAWrhB,IAAKqhB,IAIlD,OAAO,SAAUL,EAAaQ,EAAYC,GAGxC,OAFID,GAAYL,EAAiBH,EAAY3gB,UAAWmhB,GACpDC,GAAaN,EAAiBH,EAAaS,GACxCT,GAdO,GAsBd5hB,EAAiB,SAAUsiB,EAAK1hB,EAAKN,GAYvC,OAXIM,KAAO0hB,EACTviB,OAAOC,eAAesiB,EAAK1hB,EAAK,CAC9BN,MAAOA,EACPL,YAAY,EACZiiB,cAAc,EACdC,UAAU,IAGZG,EAAI1hB,GAAON,EAGNgiB,GAGLC,EAAWxiB,OAAOyiB,QAAU,SAAUxW,GACxC,IAAK,IAAI3M,EAAI,EAAGA,EAAImhB,UAAUpd,OAAQ/D,IAAK,CACzC,IAAIuT,EAAS4N,UAAUnhB,GAEvB,IAAK,IAAIuB,KAAOgS,EACV7S,OAAOkB,UAAUC,eAAe1B,KAAKoT,EAAQhS,KAC/CoL,EAAOpL,GAAOgS,EAAOhS,IAK3B,OAAOoL,GAUT,SAASyW,EAAcC,GACrB,OAAOH,EAAS,GAAIG,EAAS,CAC3B1B,MAAO0B,EAAQjL,KAAOiL,EAAQzN,MAC9B8L,OAAQ2B,EAAQnL,IAAMmL,EAAQxN,SAWlC,SAASH,EAAsB7S,GAC7B,IAAI4S,EAAO,GAKX,IACE,GAAIqK,EAAK,IAAK,CACZrK,EAAO5S,EAAQ6S,wBACf,IAAItQ,EAAY6b,EAAUpe,EAAS,OAC/BmC,EAAaic,EAAUpe,EAAS,QACpC4S,EAAKyC,KAAO9S,EACZqQ,EAAK2C,MAAQpT,EACbyQ,EAAKiM,QAAUtc,EACfqQ,EAAKkM,OAAS3c,OAEdyQ,EAAO5S,EAAQ6S,wBAEjB,MAAOnT,IAET,IAAI+gB,EAAS,CACXlL,KAAM3C,EAAK2C,KACXF,IAAKzC,EAAKyC,IACVtC,MAAOH,EAAKkM,MAAQlM,EAAK2C,KACzBvC,OAAQJ,EAAKiM,OAASjM,EAAKyC,KAIzBqL,EAA6B,SAArB1gB,EAAQ0V,SAAsB6J,EAAevf,EAAQkO,eAAiB,GAC9E6E,EAAQ2N,EAAM3N,OAAS/S,EAAQ2gB,aAAeF,EAAO3B,MAAQ2B,EAAOlL,KACpEvC,EAAS0N,EAAM1N,QAAUhT,EAAQ4gB,cAAgBH,EAAO5B,OAAS4B,EAAOpL,IAExEwL,EAAiB7gB,EAAQ8gB,YAAc/N,EACvCgO,EAAgB/gB,EAAQghB,aAAehO,EAI3C,GAAI6N,GAAkBE,EAAe,CACnC,IAAI/B,EAAS/C,EAAyBjc,GACtC6gB,GAAkB9B,EAAeC,EAAQ,KACzC+B,GAAiBhC,EAAeC,EAAQ,KAExCyB,EAAO1N,OAAS8N,EAChBJ,EAAOzN,QAAU+N,EAGnB,OAAOR,EAAcE,GAGvB,SAASQ,EAAqCtK,EAAUuK,GACtD,IAAIC,EAAgB7C,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,IAAmBA,UAAU,GAE/EtB,EAASC,EAAK,IACdmE,EAA6B,SAApBF,EAAOxL,SAChB2L,EAAexO,EAAsB8D,GACrC2K,EAAazO,EAAsBqO,GACnCK,EAAe/E,EAAgB7F,GAE/BqI,EAAS/C,EAAyBiF,GAClCM,EAAiBpd,WAAW4a,EAAOwC,eAAgB,IACnDC,EAAkBrd,WAAW4a,EAAOyC,gBAAiB,IAGrDN,GAAiBC,IACnBE,EAAWjM,IAAM9U,KAAKC,IAAI8gB,EAAWjM,IAAK,GAC1CiM,EAAW/L,KAAOhV,KAAKC,IAAI8gB,EAAW/L,KAAM,IAE9C,IAAIiL,EAAUD,EAAc,CAC1BlL,IAAKgM,EAAahM,IAAMiM,EAAWjM,IAAMmM,EACzCjM,KAAM8L,EAAa9L,KAAO+L,EAAW/L,KAAOkM,EAC5C1O,MAAOsO,EAAatO,MACpBC,OAAQqO,EAAarO,SASvB,GAPAwN,EAAQkB,UAAY,EACpBlB,EAAQmB,WAAa,GAMhB3E,GAAUoE,EAAQ,CACrB,IAAIM,EAAYtd,WAAW4a,EAAO0C,UAAW,IACzCC,EAAavd,WAAW4a,EAAO2C,WAAY,IAE/CnB,EAAQnL,KAAOmM,EAAiBE,EAChClB,EAAQ3B,QAAU2C,EAAiBE,EACnClB,EAAQjL,MAAQkM,EAAkBE,EAClCnB,EAAQ1B,OAAS2C,EAAkBE,EAGnCnB,EAAQkB,UAAYA,EACpBlB,EAAQmB,WAAaA,EAOvB,OAJI3E,IAAWmE,EAAgBD,EAAOtN,SAAS2N,GAAgBL,IAAWK,GAA0C,SAA1BA,EAAa7L,YACrG8K,EAAU9B,EAAc8B,EAASU,IAG5BV,EAGT,SAASoB,EAA8C5hB,GACrD,IAAI6hB,EAAgBvD,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,IAAmBA,UAAU,GAE/EE,EAAOxe,EAAQkO,cAAchM,gBAC7B4f,EAAiBb,EAAqCjhB,EAASwe,GAC/DzL,EAAQxS,KAAKC,IAAIge,EAAKmC,YAAa9e,OAAOkgB,YAAc,GACxD/O,EAASzS,KAAKC,IAAIge,EAAKoC,aAAc/e,OAAOmgB,aAAe,GAE3Dzf,EAAasf,EAAkC,EAAlBzD,EAAUI,GACvCrc,EAAc0f,EAA0C,EAA1BzD,EAAUI,EAAM,QAE9C5N,EAAS,CACXyE,IAAK9S,EAAYuf,EAAezM,IAAMyM,EAAeJ,UACrDnM,KAAMpT,EAAa2f,EAAevM,KAAOuM,EAAeH,WACxD5O,MAAOA,EACPC,OAAQA,GAGV,OAAOuN,EAAc3P,GAWvB,SAASqR,EAAQjiB,GACf,IAAI0V,EAAW1V,EAAQ0V,SACvB,GAAiB,SAAbA,GAAoC,SAAbA,EACzB,OAAO,EAET,GAAsD,UAAlDuG,EAAyBjc,EAAS,YACpC,OAAO,EAET,IAAIsc,EAAaD,EAAcrc,GAC/B,QAAKsc,GAGE2F,EAAQ3F,GAWjB,SAAS4F,EAA6BliB,GAEpC,IAAKA,IAAYA,EAAQV,eAAiB2d,IACxC,OAAOpR,SAAS3J,gBAGlB,IADA,IAAI7C,EAAKW,EAAQV,cACVD,GAAoD,SAA9C4c,EAAyB5c,EAAI,cACxCA,EAAKA,EAAGC,cAEV,OAAOD,GAAMwM,SAAS3J,gBAcxB,SAASigB,EAAcC,EAAQrK,EAAWlQ,EAASwa,GACjD,IAAIlB,EAAgB7C,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,IAAmBA,UAAU,GAI/EgE,EAAa,CAAEjN,IAAK,EAAGE,KAAM,GAC7B6H,EAAe+D,EAAgBe,EAA6BE,GAAU7E,EAAuB6E,EAAQrK,GAGzG,GAA0B,aAAtBsK,EACFC,EAAaV,EAA8CxE,EAAc+D,OACpE,CAEL,IAAIoB,OAAiB,EACK,iBAAtBF,EAE8B,UADhCE,EAAiB/F,EAAgBH,EAActE,KAC5BrC,WACjB6M,EAAiBH,EAAOlU,cAAchM,iBAGxCqgB,EAD+B,WAAtBF,EACQD,EAAOlU,cAAchM,gBAErBmgB,EAGnB,IAAI7B,EAAUS,EAAqCsB,EAAgBnF,EAAc+D,GAGjF,GAAgC,SAA5BoB,EAAe7M,UAAwBuM,EAAQ7E,GAWjDkF,EAAa9B,MAXmD,CAChE,IAAIgC,EAAkBjD,EAAe6C,EAAOlU,eACxC8E,EAASwP,EAAgBxP,OACzBD,EAAQyP,EAAgBzP,MAE5BuP,EAAWjN,KAAOmL,EAAQnL,IAAMmL,EAAQkB,UACxCY,EAAWzD,OAAS7L,EAASwN,EAAQnL,IACrCiN,EAAW/M,MAAQiL,EAAQjL,KAAOiL,EAAQmB,WAC1CW,EAAWxD,MAAQ/L,EAAQyN,EAAQjL,MASvC,IAAIkN,EAAqC,iBADzC5a,EAAUA,GAAW,GAOrB,OALAya,EAAW/M,MAAQkN,EAAkB5a,EAAUA,EAAQ0N,MAAQ,EAC/D+M,EAAWjN,KAAOoN,EAAkB5a,EAAUA,EAAQwN,KAAO,EAC7DiN,EAAWxD,OAAS2D,EAAkB5a,EAAUA,EAAQiX,OAAS,EACjEwD,EAAWzD,QAAU4D,EAAkB5a,EAAUA,EAAQgX,QAAU,EAE5DyD,EAGT,SAASI,EAAQC,GAIf,OAHYA,EAAK5P,MACJ4P,EAAK3P,OAcpB,SAAS4P,EAAqBC,EAAWC,EAASV,EAAQrK,EAAWsK,GACnE,IAAIxa,EAAUyW,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,GAAmBA,UAAU,GAAK,EAElF,IAAmC,IAA/BuE,EAAU3a,QAAQ,QACpB,OAAO2a,EAGT,IAAIP,EAAaH,EAAcC,EAAQrK,EAAWlQ,EAASwa,GAEvDU,EAAQ,CACV1N,IAAK,CACHtC,MAAOuP,EAAWvP,MAClBC,OAAQ8P,EAAQzN,IAAMiN,EAAWjN,KAEnCyJ,MAAO,CACL/L,MAAOuP,EAAWxD,MAAQgE,EAAQhE,MAClC9L,OAAQsP,EAAWtP,QAErB6L,OAAQ,CACN9L,MAAOuP,EAAWvP,MAClBC,OAAQsP,EAAWzD,OAASiE,EAAQjE,QAEtCtJ,KAAM,CACJxC,MAAO+P,EAAQvN,KAAO+M,EAAW/M,KACjCvC,OAAQsP,EAAWtP,SAInBgQ,EAAcnlB,OAAO+N,KAAKmX,GAAO7c,KAAI,SAAUxH,GACjD,OAAO2hB,EAAS,CACd3hB,IAAKA,GACJqkB,EAAMrkB,GAAM,CACbukB,KAAMP,EAAQK,EAAMrkB,SAErB0G,MAAK,SAAUxF,EAAG+D,GACnB,OAAOA,EAAEsf,KAAOrjB,EAAEqjB,QAGhBC,EAAgBF,EAAY9R,QAAO,SAAUiS,GAC/C,IAAIpQ,EAAQoQ,EAAMpQ,MACdC,EAASmQ,EAAMnQ,OACnB,OAAOD,GAASqP,EAAOzB,aAAe3N,GAAUoP,EAAOxB,gBAGrDwC,EAAoBF,EAAchiB,OAAS,EAAIgiB,EAAc,GAAGxkB,IAAMskB,EAAY,GAAGtkB,IAErF2kB,EAAYR,EAAU5hB,MAAM,KAAK,GAErC,OAAOmiB,GAAqBC,EAAY,IAAMA,EAAY,IAa5D,SAASC,EAAoB9K,EAAO4J,EAAQrK,GAC1C,IAAIoJ,EAAgB7C,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,GAAmBA,UAAU,GAAK,KAEpFiF,EAAqBpC,EAAgBe,EAA6BE,GAAU7E,EAAuB6E,EAAQrK,GAC/G,OAAOkJ,EAAqClJ,EAAWwL,EAAoBpC,GAU7E,SAASqC,EAAcxjB,GACrB,IACIgf,EADShf,EAAQkO,cAAckO,YACfnF,iBAAiBjX,GACjCiC,EAAImC,WAAW4a,EAAO0C,WAAa,GAAKtd,WAAW4a,EAAOyE,cAAgB,GAC1EphB,EAAI+B,WAAW4a,EAAO2C,YAAc,GAAKvd,WAAW4a,EAAO0E,aAAe,GAK9E,MAJa,CACX3Q,MAAO/S,EAAQ8gB,YAAcze,EAC7B2Q,OAAQhT,EAAQghB,aAAe/e,GAYnC,SAAS0hB,EAAqBd,GAC5B,IAAIe,EAAO,CAAErO,KAAM,QAASuJ,MAAO,OAAQD,OAAQ,MAAOxJ,IAAK,UAC/D,OAAOwN,EAAUvhB,QAAQ,0BAA0B,SAAUuiB,GAC3D,OAAOD,EAAKC,MAchB,SAASC,EAAiB1B,EAAQ2B,EAAkBlB,GAClDA,EAAYA,EAAU5hB,MAAM,KAAK,GAGjC,IAAI+iB,EAAaR,EAAcpB,GAG3B6B,EAAgB,CAClBlR,MAAOiR,EAAWjR,MAClBC,OAAQgR,EAAWhR,QAIjBkR,GAAoD,IAA1C,CAAC,QAAS,QAAQhc,QAAQ2a,GACpCsB,EAAWD,EAAU,MAAQ,OAC7BE,EAAgBF,EAAU,OAAS,MACnCG,EAAcH,EAAU,SAAW,QACnCI,EAAwBJ,EAAqB,QAAX,SAStC,OAPAD,EAAcE,GAAYJ,EAAiBI,GAAYJ,EAAiBM,GAAe,EAAIL,EAAWK,GAAe,EAEnHJ,EAAcG,GADZvB,IAAcuB,EACeL,EAAiBK,GAAiBJ,EAAWM,GAE7CP,EAAiBJ,EAAqBS,IAGhEH,EAYT,SAAS/P,EAAKpR,EAAKyhB,GAEjB,OAAI5jB,MAAM5B,UAAUmV,KACXpR,EAAIoR,KAAKqQ,GAIXzhB,EAAIoO,OAAOqT,GAAO,GAqC3B,SAASC,EAAaC,EAAWtR,EAAMuR,GAoBrC,YAnB8B9iB,IAAT8iB,EAAqBD,EAAYA,EAAUthB,MAAM,EA1BxE,SAAmBL,EAAK6hB,EAAMvmB,GAE5B,GAAIuC,MAAM5B,UAAU6lB,UAClB,OAAO9hB,EAAI8hB,WAAU,SAAUC,GAC7B,OAAOA,EAAIF,KAAUvmB,KAKzB,IAAI0mB,EAAQ5Q,EAAKpR,GAAK,SAAUsd,GAC9B,OAAOA,EAAIuE,KAAUvmB,KAEvB,OAAO0E,EAAIoF,QAAQ4c,GAcsDF,CAAUH,EAAW,OAAQC,KAEvFhc,SAAQ,SAAUkW,GAC3BA,EAAmB,UAErBmG,QAAQC,KAAK,yDAEf,IAAIvJ,EAAKmD,EAAmB,UAAKA,EAASnD,GACtCmD,EAASqG,SAAWnJ,EAAWL,KAIjCtI,EAAKqN,QAAQ4B,OAAS7B,EAAcpN,EAAKqN,QAAQ4B,QACjDjP,EAAKqN,QAAQzI,UAAYwI,EAAcpN,EAAKqN,QAAQzI,WAEpD5E,EAAOsI,EAAGtI,EAAMyL,OAIbzL,EAUT,SAAS+R,IAEP,IAAIhgB,KAAKsT,MAAM2M,YAAf,CAIA,IAAIhS,EAAO,CACTsM,SAAUva,KACV8Z,OAAQ,GACRoG,YAAa,GACbC,WAAY,GACZC,SAAS,EACT9E,QAAS,IAIXrN,EAAKqN,QAAQzI,UAAYuL,EAAoBpe,KAAKsT,MAAOtT,KAAKkd,OAAQld,KAAK6S,UAAW7S,KAAKsE,QAAQ+b,eAKnGpS,EAAK0P,UAAYD,EAAqB1d,KAAKsE,QAAQqZ,UAAW1P,EAAKqN,QAAQzI,UAAW7S,KAAKkd,OAAQld,KAAK6S,UAAW7S,KAAKsE,QAAQib,UAAUe,KAAKnD,kBAAmBnd,KAAKsE,QAAQib,UAAUe,KAAK3d,SAG9LsL,EAAKsS,kBAAoBtS,EAAK0P,UAE9B1P,EAAKoS,cAAgBrgB,KAAKsE,QAAQ+b,cAGlCpS,EAAKqN,QAAQ4B,OAAS0B,EAAiB5e,KAAKkd,OAAQjP,EAAKqN,QAAQzI,UAAW5E,EAAK0P,WAEjF1P,EAAKqN,QAAQ4B,OAAOsD,SAAWxgB,KAAKsE,QAAQ+b,cAAgB,QAAU,WAGtEpS,EAAOqR,EAAatf,KAAKuf,UAAWtR,GAI/BjO,KAAKsT,MAAMmN,UAIdzgB,KAAKsE,QAAQoc,SAASzS,IAHtBjO,KAAKsT,MAAMmN,WAAY,EACvBzgB,KAAKsE,QAAQqc,SAAS1S,KAY1B,SAAS2S,EAAkBrB,EAAWsB,GACpC,OAAOtB,EAAU/N,MAAK,SAAUiM,GAC9B,IAAIjlB,EAAOilB,EAAKjlB,KAEhB,OADcilB,EAAKsC,SACDvnB,IAASqoB,KAW/B,SAASC,EAAyBlnB,GAIhC,IAHA,IAAImnB,EAAW,EAAC,EAAO,KAAM,SAAU,MAAO,KAC1CC,EAAYpnB,EAASqnB,OAAO,GAAGC,cAAgBtnB,EAASqE,MAAM,GAEzDhG,EAAI,EAAGA,EAAI8oB,EAAS/kB,OAAQ/D,IAAK,CACxC,IAAIkpB,EAASJ,EAAS9oB,GAClBmpB,EAAUD,EAAS,GAAKA,EAASH,EAAYpnB,EACjD,QAA4C,IAAjC+M,SAASzJ,KAAK4J,MAAMsa,GAC7B,OAAOA,EAGX,OAAO,KAQT,SAAShM,IAsBP,OArBApV,KAAKsT,MAAM2M,aAAc,EAGrBW,EAAkB5gB,KAAKuf,UAAW,gBACpCvf,KAAKkd,OAAOmE,gBAAgB,eAC5BrhB,KAAKkd,OAAOpW,MAAM0Z,SAAW,GAC7BxgB,KAAKkd,OAAOpW,MAAMqJ,IAAM,GACxBnQ,KAAKkd,OAAOpW,MAAMuJ,KAAO,GACzBrQ,KAAKkd,OAAOpW,MAAM8S,MAAQ,GAC1B5Z,KAAKkd,OAAOpW,MAAM6S,OAAS,GAC3B3Z,KAAKkd,OAAOpW,MAAMwa,WAAa,GAC/BthB,KAAKkd,OAAOpW,MAAMga,EAAyB,cAAgB,IAG7D9gB,KAAKuhB,wBAIDvhB,KAAKsE,QAAQkd,iBACfxhB,KAAKkd,OAAO9F,WAAW/c,YAAY2F,KAAKkd,QAEnCld,KAQT,SAASyhB,EAAU3mB,GACjB,IAAIkO,EAAgBlO,EAAQkO,cAC5B,OAAOA,EAAgBA,EAAckO,YAAcva,OAoBrD,SAAS+kB,EAAoB7O,EAAWvO,EAASgP,EAAOqO,GAEtDrO,EAAMqO,YAAcA,EACpBF,EAAU5O,GAAWvK,iBAAiB,SAAUgL,EAAMqO,YAAa,CAAE9R,SAAS,IAG9E,IAAI+R,EAAgBtK,EAAgBzE,GAKpC,OA5BF,SAASgP,EAAsBxF,EAAc3S,EAAOsE,EAAU8T,GAC5D,IAAIC,EAAmC,SAA1B1F,EAAa7L,SACtB5L,EAASmd,EAAS1F,EAAarT,cAAckO,YAAcmF,EAC/DzX,EAAO0D,iBAAiBoB,EAAOsE,EAAU,CAAE6B,SAAS,IAE/CkS,GACHF,EAAsBvK,EAAgB1S,EAAOwS,YAAa1N,EAAOsE,EAAU8T,GAE7EA,EAAc3iB,KAAKyF,GAgBnBid,CAAsBD,EAAe,SAAUtO,EAAMqO,YAAarO,EAAMwO,eACxExO,EAAMsO,cAAgBA,EACtBtO,EAAM0O,eAAgB,EAEf1O,EAST,SAAS2O,IACFjiB,KAAKsT,MAAM0O,gBACdhiB,KAAKsT,MAAQoO,EAAoB1hB,KAAK6S,UAAW7S,KAAKsE,QAAStE,KAAKsT,MAAOtT,KAAKkiB,iBAkCpF,SAASX,IAxBT,IAA8B1O,EAAWS,EAyBnCtT,KAAKsT,MAAM0O,gBACbG,qBAAqBniB,KAAKkiB,gBAC1BliB,KAAKsT,OA3BqBT,EA2BQ7S,KAAK6S,UA3BFS,EA2BatT,KAAKsT,MAzBzDmO,EAAU5O,GAAWzB,oBAAoB,SAAUkC,EAAMqO,aAGzDrO,EAAMwO,cAActe,SAAQ,SAAUoB,GACpCA,EAAOwM,oBAAoB,SAAUkC,EAAMqO,gBAI7CrO,EAAMqO,YAAc,KACpBrO,EAAMwO,cAAgB,GACtBxO,EAAMsO,cAAgB,KACtBtO,EAAM0O,eAAgB,EACf1O,IAwBT,SAAS7Y,EAAUf,GACjB,MAAa,KAANA,IAAaiB,MAAMuE,WAAWxF,KAAOkB,SAASlB,GAWvD,SAAS0oB,EAAUtnB,EAASgf,GAC1BnhB,OAAO+N,KAAKoT,GAAQtW,SAAQ,SAAUic,GACpC,IAAI4C,EAAO,IAEkE,IAAzE,CAAC,QAAS,SAAU,MAAO,QAAS,SAAU,QAAQrf,QAAQyc,IAAgBhlB,EAAUqf,EAAO2F,MACjG4C,EAAO,MAETvnB,EAAQgM,MAAM2Y,GAAQ3F,EAAO2F,GAAQ4C,KAgIzC,IAAIC,EAAYpM,GAAa,WAAW1G,KAAK3H,UAAUqI,WA8GvD,SAASqS,EAAmBhD,EAAWiD,EAAgBC,GACrD,IAAIC,EAAa1T,EAAKuQ,GAAW,SAAU9B,GAEzC,OADWA,EAAKjlB,OACAgqB,KAGdG,IAAeD,GAAcnD,EAAU/N,MAAK,SAAUkI,GACxD,OAAOA,EAASlhB,OAASiqB,GAAiB/I,EAASqG,SAAWrG,EAASlB,MAAQkK,EAAWlK,SAG5F,IAAKmK,EAAY,CACf,IAAIC,EAAc,IAAMJ,EAAiB,IACrCK,EAAY,IAAMJ,EAAgB,IACtC5C,QAAQC,KAAK+C,EAAY,4BAA8BD,EAAc,4DAA8DA,EAAc,KAEnJ,OAAOD,EAoIT,IAAIG,EAAa,CAAC,aAAc,OAAQ,WAAY,YAAa,MAAO,UAAW,cAAe,QAAS,YAAa,aAAc,SAAU,eAAgB,WAAY,OAAQ,cAGhLC,GAAkBD,EAAW7kB,MAAM,GAYvC,SAAS+kB,GAAUrF,GACjB,IAAIsF,EAAU7J,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,IAAmBA,UAAU,GAEzEta,EAAQikB,GAAgB/f,QAAQ2a,GAChC/f,EAAMmlB,GAAgB9kB,MAAMa,EAAQ,GAAGgT,OAAOiR,GAAgB9kB,MAAM,EAAGa,IAC3E,OAAOmkB,EAAUrlB,EAAImM,UAAYnM,EAGnC,IAAIslB,GACI,OADJA,GAES,YAFTA,GAGgB,mBA0LpB,SAASC,GAAYzX,EAAQqT,EAAeF,EAAkBuE,GAC5D,IAAI9H,EAAU,CAAC,EAAG,GAKd+H,GAA0D,IAA9C,CAAC,QAAS,QAAQrgB,QAAQogB,GAItCE,EAAY5X,EAAO3P,MAAM,WAAWiF,KAAI,SAAUuiB,GACpD,OAAOA,EAAKC,UAKVC,EAAUH,EAAUtgB,QAAQgM,EAAKsU,GAAW,SAAUC,GACxD,OAAgC,IAAzBA,EAAKG,OAAO,YAGjBJ,EAAUG,KAAiD,IAArCH,EAAUG,GAASzgB,QAAQ,MACnD6c,QAAQC,KAAK,gFAKf,IAAI6D,EAAa,cACbC,GAAmB,IAAbH,EAAiB,CAACH,EAAUrlB,MAAM,EAAGwlB,GAAS3R,OAAO,CAACwR,EAAUG,GAAS1nB,MAAM4nB,GAAY,KAAM,CAACL,EAAUG,GAAS1nB,MAAM4nB,GAAY,IAAI7R,OAAOwR,EAAUrlB,MAAMwlB,EAAU,KAAO,CAACH,GAqC9L,OAlCAM,EAAMA,EAAI5iB,KAAI,SAAU6iB,EAAI/kB,GAE1B,IAAIqgB,GAAyB,IAAVrgB,GAAeukB,EAAYA,GAAa,SAAW,QAClES,GAAoB,EACxB,OAAOD,EAGNE,QAAO,SAAUrpB,EAAG+D,GACnB,MAAwB,KAApB/D,EAAEA,EAAEsB,OAAS,KAAwC,IAA3B,CAAC,IAAK,KAAKgH,QAAQvE,IAC/C/D,EAAEA,EAAEsB,OAAS,GAAKyC,EAClBqlB,GAAoB,EACbppB,GACEopB,GACTppB,EAAEA,EAAEsB,OAAS,IAAMyC,EACnBqlB,GAAoB,EACbppB,GAEAA,EAAEoX,OAAOrT,KAEjB,IAEFuC,KAAI,SAAUgjB,GACb,OAxGN,SAAiBA,EAAK7E,EAAaJ,EAAeF,GAEhD,IAAI9iB,EAAQioB,EAAIpE,MAAM,6BAClB1mB,GAAS6C,EAAM,GACfsmB,EAAOtmB,EAAM,GAGjB,IAAK7C,EACH,OAAO8qB,EAGT,GAA0B,IAAtB3B,EAAKrf,QAAQ,KAAY,CAC3B,IAAIlI,OAAU,EACd,OAAQunB,GACN,IAAK,KACHvnB,EAAUikB,EACV,MACF,IAAK,IACL,IAAK,KACL,QACEjkB,EAAU+jB,EAId,OADWxD,EAAcvgB,GACbqkB,GAAe,IAAMjmB,EAC5B,GAAa,OAATmpB,GAA0B,OAATA,EAAe,CAQzC,OALa,OAATA,EACKhnB,KAAKC,IAAIqL,SAAS3J,gBAAgB0e,aAAc/e,OAAOmgB,aAAe,GAEtEzhB,KAAKC,IAAIqL,SAAS3J,gBAAgBye,YAAa9e,OAAOkgB,YAAc,IAE/D,IAAM3jB,EAIpB,OAAOA,EAmEE+qB,CAAQD,EAAK7E,EAAaJ,EAAeF,UAKhDrb,SAAQ,SAAUqgB,EAAI/kB,GACxB+kB,EAAGrgB,SAAQ,SAAU+f,EAAMW,GACrBzpB,EAAU8oB,KACZjI,EAAQxc,IAAUykB,GAA2B,MAAnBM,EAAGK,EAAS,IAAc,EAAI,UAIvD5I,EA2OT,IAkVI6I,GAAW,CAKbxG,UAAW,SAMX0C,eAAe,EAMf2B,eAAe,EAOfR,iBAAiB,EAQjBb,SAAU,aAUVD,SAAU,aAOVnB,UAnYc,CASd6E,MAAO,CAEL5L,MAAO,IAEPuH,SAAS,EAETxJ,GA9HJ,SAAetI,GACb,IAAI0P,EAAY1P,EAAK0P,UACjByF,EAAgBzF,EAAU5hB,MAAM,KAAK,GACrCsoB,EAAiB1G,EAAU5hB,MAAM,KAAK,GAG1C,GAAIsoB,EAAgB,CAClB,IAAIC,EAAgBrW,EAAKqN,QACrBzI,EAAYyR,EAAczR,UAC1BqK,EAASoH,EAAcpH,OAEvBqH,GAA2D,IAA9C,CAAC,SAAU,OAAOvhB,QAAQogB,GACvCjK,EAAOoL,EAAa,OAAS,MAC7BpF,EAAcoF,EAAa,QAAU,SAErCC,EAAe,CACjB3iB,MAAOjJ,EAAe,GAAIugB,EAAMtG,EAAUsG,IAC1CnR,IAAKpP,EAAe,GAAIugB,EAAMtG,EAAUsG,GAAQtG,EAAUsM,GAAejC,EAAOiC,KAGlFlR,EAAKqN,QAAQ4B,OAAS/B,EAAS,GAAI+B,EAAQsH,EAAaH,IAG1D,OAAOpW,IAgJPvC,OAAQ,CAEN8M,MAAO,IAEPuH,SAAS,EAETxJ,GA7RJ,SAAgBtI,EAAMwP,GACpB,IAAI/R,EAAS+R,EAAK/R,OACdiS,EAAY1P,EAAK0P,UACjB2G,EAAgBrW,EAAKqN,QACrB4B,EAASoH,EAAcpH,OACvBrK,EAAYyR,EAAczR,UAE1BuQ,EAAgBzF,EAAU5hB,MAAM,KAAK,GAErCuf,OAAU,EAsBd,OApBEA,EADE7gB,GAAWiR,GACH,EAAEA,EAAQ,GAEVyX,GAAYzX,EAAQwR,EAAQrK,EAAWuQ,GAG7B,SAAlBA,GACFlG,EAAO/M,KAAOmL,EAAQ,GACtB4B,EAAO7M,MAAQiL,EAAQ,IACI,UAAlB8H,GACTlG,EAAO/M,KAAOmL,EAAQ,GACtB4B,EAAO7M,MAAQiL,EAAQ,IACI,QAAlB8H,GACTlG,EAAO7M,MAAQiL,EAAQ,GACvB4B,EAAO/M,KAAOmL,EAAQ,IACK,WAAlB8H,IACTlG,EAAO7M,MAAQiL,EAAQ,GACvB4B,EAAO/M,KAAOmL,EAAQ,IAGxBrN,EAAKiP,OAASA,EACPjP,GAkQLvC,OAAQ,GAoBV+Y,gBAAiB,CAEfjM,MAAO,IAEPuH,SAAS,EAETxJ,GAlRJ,SAAyBtI,EAAM3J,GAC7B,IAAI6Y,EAAoB7Y,EAAQ6Y,mBAAqBnF,EAAgB/J,EAAKsM,SAAS2C,QAK/EjP,EAAKsM,SAAS1H,YAAcsK,IAC9BA,EAAoBnF,EAAgBmF,IAMtC,IAAIuH,EAAgB5D,EAAyB,aACzC6D,EAAe1W,EAAKsM,SAAS2C,OAAOpW,MACpCqJ,EAAMwU,EAAaxU,IACnBE,EAAOsU,EAAatU,KACpBpJ,EAAY0d,EAAaD,GAE7BC,EAAaxU,IAAM,GACnBwU,EAAatU,KAAO,GACpBsU,EAAaD,GAAiB,GAE9B,IAAItH,EAAaH,EAAchP,EAAKsM,SAAS2C,OAAQjP,EAAKsM,SAAS1H,UAAWvO,EAAQ3B,QAASwa,EAAmBlP,EAAKoS,eAIvHsE,EAAaxU,IAAMA,EACnBwU,EAAatU,KAAOA,EACpBsU,EAAaD,GAAiBzd,EAE9B3C,EAAQ8Y,WAAaA,EAErB,IAAI5E,EAAQlU,EAAQsgB,SAChB1H,EAASjP,EAAKqN,QAAQ4B,OAEtBmC,EAAQ,CACVwF,QAAS,SAAiBlH,GACxB,IAAIzkB,EAAQgkB,EAAOS,GAInB,OAHIT,EAAOS,GAAaP,EAAWO,KAAerZ,EAAQwgB,sBACxD5rB,EAAQmC,KAAKC,IAAI4hB,EAAOS,GAAYP,EAAWO,KAE1C/kB,EAAe,GAAI+kB,EAAWzkB,IAEvC6rB,UAAW,SAAmBpH,GAC5B,IAAIsB,EAAyB,UAAdtB,EAAwB,OAAS,MAC5CzkB,EAAQgkB,EAAO+B,GAInB,OAHI/B,EAAOS,GAAaP,EAAWO,KAAerZ,EAAQwgB,sBACxD5rB,EAAQmC,KAAKE,IAAI2hB,EAAO+B,GAAW7B,EAAWO,IAA4B,UAAdA,EAAwBT,EAAOrP,MAAQqP,EAAOpP,UAErGlV,EAAe,GAAIqmB,EAAU/lB,KAWxC,OAPAsf,EAAMhV,SAAQ,SAAUma,GACtB,IAAIxE,GAA+C,IAAxC,CAAC,OAAQ,OAAOnW,QAAQ2a,GAAoB,UAAY,YACnET,EAAS/B,EAAS,GAAI+B,EAAQmC,EAAMlG,GAAMwE,OAG5C1P,EAAKqN,QAAQ4B,OAASA,EAEfjP,GA2NL2W,SAAU,CAAC,OAAQ,QAAS,MAAO,UAOnCjiB,QAAS,EAMTwa,kBAAmB,gBAYrB6H,aAAc,CAEZxM,MAAO,IAEPuH,SAAS,EAETxJ,GAlgBJ,SAAsBtI,GACpB,IAAIqW,EAAgBrW,EAAKqN,QACrB4B,EAASoH,EAAcpH,OACvBrK,EAAYyR,EAAczR,UAE1B8K,EAAY1P,EAAK0P,UAAU5hB,MAAM,KAAK,GACtCkpB,EAAQ5pB,KAAK4pB,MACbV,GAAuD,IAA1C,CAAC,MAAO,UAAUvhB,QAAQ2a,GACvCxE,EAAOoL,EAAa,QAAU,SAC9BW,EAASX,EAAa,OAAS,MAC/BpF,EAAcoF,EAAa,QAAU,SASzC,OAPIrH,EAAO/D,GAAQ8L,EAAMpS,EAAUqS,MACjCjX,EAAKqN,QAAQ4B,OAAOgI,GAAUD,EAAMpS,EAAUqS,IAAWhI,EAAOiC,IAE9DjC,EAAOgI,GAAUD,EAAMpS,EAAUsG,MACnClL,EAAKqN,QAAQ4B,OAAOgI,GAAUD,EAAMpS,EAAUsG,KAGzClL,IA4fPkX,MAAO,CAEL3M,MAAO,IAEPuH,SAAS,EAETxJ,GA7wBJ,SAAetI,EAAM3J,GACnB,IAAI8gB,EAGJ,IAAK7C,EAAmBtU,EAAKsM,SAASgF,UAAW,QAAS,gBACxD,OAAOtR,EAGT,IAAIoX,EAAe/gB,EAAQxJ,QAG3B,GAA4B,iBAAjBuqB,GAIT,KAHAA,EAAepX,EAAKsM,SAAS2C,OAAOoI,cAAcD,IAIhD,OAAOpX,OAKT,IAAKA,EAAKsM,SAAS2C,OAAOxO,SAAS2W,GAEjC,OADAxF,QAAQC,KAAK,iEACN7R,EAIX,IAAI0P,EAAY1P,EAAK0P,UAAU5hB,MAAM,KAAK,GACtCuoB,EAAgBrW,EAAKqN,QACrB4B,EAASoH,EAAcpH,OACvBrK,EAAYyR,EAAczR,UAE1B0R,GAAuD,IAA1C,CAAC,OAAQ,SAASvhB,QAAQ2a,GAEvC4H,EAAMhB,EAAa,SAAW,QAC9BiB,EAAkBjB,EAAa,MAAQ,OACvCpL,EAAOqM,EAAgBC,cACvBC,EAAUnB,EAAa,OAAS,MAChCW,EAASX,EAAa,SAAW,QACjCoB,EAAmBrH,EAAc+G,GAAcE,GAQ/C1S,EAAUqS,GAAUS,EAAmBzI,EAAO/D,KAChDlL,EAAKqN,QAAQ4B,OAAO/D,IAAS+D,EAAO/D,IAAStG,EAAUqS,GAAUS,IAG/D9S,EAAUsG,GAAQwM,EAAmBzI,EAAOgI,KAC9CjX,EAAKqN,QAAQ4B,OAAO/D,IAAStG,EAAUsG,GAAQwM,EAAmBzI,EAAOgI,IAE3EjX,EAAKqN,QAAQ4B,OAAS7B,EAAcpN,EAAKqN,QAAQ4B,QAGjD,IAAI0I,EAAS/S,EAAUsG,GAAQtG,EAAU0S,GAAO,EAAII,EAAmB,EAInE1O,EAAMF,EAAyB9I,EAAKsM,SAAS2C,QAC7C2I,EAAmB3mB,WAAW+X,EAAI,SAAWuO,GAAkB,IAC/DM,EAAmB5mB,WAAW+X,EAAI,SAAWuO,EAAkB,SAAU,IACzEO,EAAYH,EAAS3X,EAAKqN,QAAQ4B,OAAO/D,GAAQ0M,EAAmBC,EAQxE,OALAC,EAAY1qB,KAAKC,IAAID,KAAKE,IAAI2hB,EAAOqI,GAAOI,EAAkBI,GAAY,GAE1E9X,EAAKoX,aAAeA,EACpBpX,EAAKqN,QAAQ6J,OAAmCvsB,EAA1BwsB,EAAsB,GAAwCjM,EAAM9d,KAAKsD,MAAMonB,IAAantB,EAAewsB,EAAqBM,EAAS,IAAKN,GAE7JnX,GAusBLnT,QAAS,aAcXwlB,KAAM,CAEJ9H,MAAO,IAEPuH,SAAS,EAETxJ,GAroBJ,SAActI,EAAM3J,GAElB,GAAIsc,EAAkB3S,EAAKsM,SAASgF,UAAW,SAC7C,OAAOtR,EAGT,GAAIA,EAAKmS,SAAWnS,EAAK0P,YAAc1P,EAAKsS,kBAE1C,OAAOtS,EAGT,IAAImP,EAAaH,EAAchP,EAAKsM,SAAS2C,OAAQjP,EAAKsM,SAAS1H,UAAWvO,EAAQ3B,QAAS2B,EAAQ6Y,kBAAmBlP,EAAKoS,eAE3H1C,EAAY1P,EAAK0P,UAAU5hB,MAAM,KAAK,GACtCiqB,EAAoBvH,EAAqBd,GACzCQ,EAAYlQ,EAAK0P,UAAU5hB,MAAM,KAAK,IAAM,GAE5CkqB,EAAY,GAEhB,OAAQ3hB,EAAQ4hB,UACd,KAAKhD,GACH+C,EAAY,CAACtI,EAAWqI,GACxB,MACF,KAAK9C,GACH+C,EAAYjD,GAAUrF,GACtB,MACF,KAAKuF,GACH+C,EAAYjD,GAAUrF,GAAW,GACjC,MACF,QACEsI,EAAY3hB,EAAQ4hB,SAkDxB,OA/CAD,EAAUziB,SAAQ,SAAU5D,EAAMd,GAChC,GAAI6e,IAAc/d,GAAQqmB,EAAUjqB,SAAW8C,EAAQ,EACrD,OAAOmP,EAGT0P,EAAY1P,EAAK0P,UAAU5hB,MAAM,KAAK,GACtCiqB,EAAoBvH,EAAqBd,GAEzC,IAAIoB,EAAgB9Q,EAAKqN,QAAQ4B,OAC7BiJ,EAAalY,EAAKqN,QAAQzI,UAG1BoS,EAAQ5pB,KAAK4pB,MACbmB,EAA4B,SAAdzI,GAAwBsH,EAAMlG,EAAcnF,OAASqL,EAAMkB,EAAW9V,OAAuB,UAAdsN,GAAyBsH,EAAMlG,EAAc1O,MAAQ4U,EAAMkB,EAAWvM,QAAwB,QAAd+D,GAAuBsH,EAAMlG,EAAcpF,QAAUsL,EAAMkB,EAAWhW,MAAsB,WAAdwN,GAA0BsH,EAAMlG,EAAc5O,KAAO8U,EAAMkB,EAAWxM,QAEjU0M,EAAgBpB,EAAMlG,EAAc1O,MAAQ4U,EAAM7H,EAAW/M,MAC7DiW,EAAiBrB,EAAMlG,EAAcnF,OAASqL,EAAM7H,EAAWxD,OAC/D2M,EAAetB,EAAMlG,EAAc5O,KAAO8U,EAAM7H,EAAWjN,KAC3DqW,EAAkBvB,EAAMlG,EAAcpF,QAAUsL,EAAM7H,EAAWzD,QAEjE8M,EAAoC,SAAd9I,GAAwB0I,GAA+B,UAAd1I,GAAyB2I,GAAgC,QAAd3I,GAAuB4I,GAA8B,WAAd5I,GAA0B6I,EAG3KjC,GAAuD,IAA1C,CAAC,MAAO,UAAUvhB,QAAQ2a,GACvC+I,IAAqBpiB,EAAQqiB,iBAAmBpC,GAA4B,UAAdpG,GAAyBkI,GAAiB9B,GAA4B,QAAdpG,GAAuBmI,IAAmB/B,GAA4B,UAAdpG,GAAyBoI,IAAiBhC,GAA4B,QAAdpG,GAAuBqI,IAE7PJ,GAAeK,GAAuBC,KAExCzY,EAAKmS,SAAU,GAEXgG,GAAeK,KACjB9I,EAAYsI,EAAUnnB,EAAQ,IAG5B4nB,IACFvI,EAhJR,SAA8BA,GAC5B,MAAkB,QAAdA,EACK,QACgB,UAAdA,EACF,MAEFA,EA0IWyI,CAAqBzI,IAGnClQ,EAAK0P,UAAYA,GAAaQ,EAAY,IAAMA,EAAY,IAI5DlQ,EAAKqN,QAAQ4B,OAAS/B,EAAS,GAAIlN,EAAKqN,QAAQ4B,OAAQ0B,EAAiB3Q,EAAKsM,SAAS2C,OAAQjP,EAAKqN,QAAQzI,UAAW5E,EAAK0P,YAE5H1P,EAAOqR,EAAarR,EAAKsM,SAASgF,UAAWtR,EAAM,YAGhDA,GA4jBLiY,SAAU,OAKVvjB,QAAS,EAOTwa,kBAAmB,YAUrB0J,MAAO,CAELrO,MAAO,IAEPuH,SAAS,EAETxJ,GArPJ,SAAetI,GACb,IAAI0P,EAAY1P,EAAK0P,UACjByF,EAAgBzF,EAAU5hB,MAAM,KAAK,GACrCuoB,EAAgBrW,EAAKqN,QACrB4B,EAASoH,EAAcpH,OACvBrK,EAAYyR,EAAczR,UAE1BmM,GAAwD,IAA9C,CAAC,OAAQ,SAAShc,QAAQogB,GAEpC0D,GAA6D,IAA5C,CAAC,MAAO,QAAQ9jB,QAAQogB,GAO7C,OALAlG,EAAO8B,EAAU,OAAS,OAASnM,EAAUuQ,IAAkB0D,EAAiB5J,EAAO8B,EAAU,QAAU,UAAY,GAEvH/Q,EAAK0P,UAAYc,EAAqBd,GACtC1P,EAAKqN,QAAQ4B,OAAS7B,EAAc6B,GAE7BjP,IAkPP8Y,KAAM,CAEJvO,MAAO,IAEPuH,SAAS,EAETxJ,GA9SJ,SAActI,GACZ,IAAKsU,EAAmBtU,EAAKsM,SAASgF,UAAW,OAAQ,mBACvD,OAAOtR,EAGT,IAAI2P,EAAU3P,EAAKqN,QAAQzI,UACvBmU,EAAQhY,EAAKf,EAAKsM,SAASgF,WAAW,SAAU7F,GAClD,MAAyB,oBAAlBA,EAASlhB,QACf4kB,WAEH,GAAIQ,EAAQjE,OAASqN,EAAM7W,KAAOyN,EAAQvN,KAAO2W,EAAMpN,OAASgE,EAAQzN,IAAM6W,EAAMrN,QAAUiE,EAAQhE,MAAQoN,EAAM3W,KAAM,CAExH,IAAkB,IAAdpC,EAAK8Y,KACP,OAAO9Y,EAGTA,EAAK8Y,MAAO,EACZ9Y,EAAKkS,WAAW,uBAAyB,OACpC,CAEL,IAAkB,IAAdlS,EAAK8Y,KACP,OAAO9Y,EAGTA,EAAK8Y,MAAO,EACZ9Y,EAAKkS,WAAW,wBAAyB,EAG3C,OAAOlS,IAoSPgZ,aAAc,CAEZzO,MAAO,IAEPuH,SAAS,EAETxJ,GA/+BJ,SAAsBtI,EAAM3J,GAC1B,IAAIvH,EAAIuH,EAAQvH,EACZI,EAAImH,EAAQnH,EACZ+f,EAASjP,EAAKqN,QAAQ4B,OAItBgK,EAA8BlY,EAAKf,EAAKsM,SAASgF,WAAW,SAAU7F,GACxE,MAAyB,eAAlBA,EAASlhB,QACf2uB,qBACiCzqB,IAAhCwqB,GACFrH,QAAQC,KAAK,iIAEf,IAAIqH,OAAkDzqB,IAAhCwqB,EAA4CA,EAA8B5iB,EAAQ6iB,gBAEpGjP,EAAeF,EAAgB/J,EAAKsM,SAAS2C,QAC7CkK,EAAmBzZ,EAAsBuK,GAGzC4B,EAAS,CACX0G,SAAUtD,EAAOsD,UAGflF,EA9DN,SAA2BrN,EAAMoZ,GAC/B,IAAI/C,EAAgBrW,EAAKqN,QACrB4B,EAASoH,EAAcpH,OACvBrK,EAAYyR,EAAczR,UAC1BlU,EAAQtD,KAAKsD,MACbsmB,EAAQ5pB,KAAK4pB,MAEbqC,EAAU,SAAiBpU,GAC7B,OAAOA,GAGLqU,EAAiB5oB,EAAMkU,EAAUhF,OACjC2Z,EAAc7oB,EAAMue,EAAOrP,OAE3B0W,GAA4D,IAA/C,CAAC,OAAQ,SAASvhB,QAAQiL,EAAK0P,WAC5C8J,GAA+C,IAAjCxZ,EAAK0P,UAAU3a,QAAQ,KAIrC0kB,EAAuBL,EAAwB9C,GAAckD,GAH3CF,EAAiB,GAAMC,EAAc,EAGuC7oB,EAAQsmB,EAAjEqC,EACrCK,EAAqBN,EAAwB1oB,EAAV2oB,EAEvC,MAAO,CACLjX,KAAMqX,EANWH,EAAiB,GAAM,GAAKC,EAAc,GAAM,IAMtBC,GAAeJ,EAAcnK,EAAO7M,KAAO,EAAI6M,EAAO7M,MACjGF,IAAKwX,EAAkBzK,EAAO/M,KAC9BwJ,OAAQgO,EAAkBzK,EAAOvD,QACjCC,MAAO8N,EAAoBxK,EAAOtD,QAoCtBgO,CAAkB3Z,EAAMtR,OAAOkrB,iBAAmB,IAAMvF,GAElEtI,EAAc,WAANjd,EAAiB,MAAQ,SACjCkd,EAAc,UAAN9c,EAAgB,OAAS,QAKjC2qB,EAAmBhH,EAAyB,aAW5CzQ,OAAO,EACPF,OAAM,EAqBV,GAhBIA,EAJU,WAAV6J,EAG4B,SAA1B9B,EAAa1H,UACR0H,EAAawD,aAAeJ,EAAQ3B,QAEpCyN,EAAiBtZ,OAASwN,EAAQ3B,OAGrC2B,EAAQnL,IAIZE,EAFU,UAAV4J,EAC4B,SAA1B/B,EAAa1H,UACP0H,EAAauD,YAAcH,EAAQ1B,OAEnCwN,EAAiBvZ,MAAQyN,EAAQ1B,MAGpC0B,EAAQjL,KAEb8W,GAAmBW,EACrBhO,EAAOgO,GAAoB,eAAiBzX,EAAO,OAASF,EAAM,SAClE2J,EAAOE,GAAS,EAChBF,EAAOG,GAAS,EAChBH,EAAOwH,WAAa,gBACf,CAEL,IAAIyG,EAAsB,WAAV/N,GAAsB,EAAI,EACtCgO,EAAuB,UAAV/N,GAAqB,EAAI,EAC1CH,EAAOE,GAAS7J,EAAM4X,EACtBjO,EAAOG,GAAS5J,EAAO2X,EACvBlO,EAAOwH,WAAatH,EAAQ,KAAOC,EAIrC,IAAIkG,EAAa,CACf,cAAelS,EAAK0P,WAQtB,OAJA1P,EAAKkS,WAAahF,EAAS,GAAIgF,EAAYlS,EAAKkS,YAChDlS,EAAK6L,OAASqB,EAAS,GAAIrB,EAAQ7L,EAAK6L,QACxC7L,EAAKiS,YAAc/E,EAAS,GAAIlN,EAAKqN,QAAQ6J,MAAOlX,EAAKiS,aAElDjS,GA65BLkZ,iBAAiB,EAMjBpqB,EAAG,SAMHI,EAAG,SAkBL8qB,WAAY,CAEVzP,MAAO,IAEPuH,SAAS,EAETxJ,GAloCJ,SAAoBtI,GApBpB,IAAuBnT,EAASqlB,EAoC9B,OAXAiC,EAAUnU,EAAKsM,SAAS2C,OAAQjP,EAAK6L,QAzBhBhf,EA6BPmT,EAAKsM,SAAS2C,OA7BEiD,EA6BMlS,EAAKkS,WA5BzCxnB,OAAO+N,KAAKyZ,GAAY3c,SAAQ,SAAUic,IAE1B,IADFU,EAAWV,GAErB3kB,EAAQ2O,aAAagW,EAAMU,EAAWV,IAEtC3kB,EAAQumB,gBAAgB5B,MA0BxBxR,EAAKoX,cAAgB1sB,OAAO+N,KAAKuH,EAAKiS,aAAalkB,QACrDomB,EAAUnU,EAAKoX,aAAcpX,EAAKiS,aAG7BjS,GAonCLia,OAvmCJ,SAA0BrV,EAAWqK,EAAQ5Y,EAAS6jB,EAAiB7U,GAErE,IAAIuL,EAAmBT,EAAoB9K,EAAO4J,EAAQrK,EAAWvO,EAAQ+b,eAKzE1C,EAAYD,EAAqBpZ,EAAQqZ,UAAWkB,EAAkB3B,EAAQrK,EAAWvO,EAAQib,UAAUe,KAAKnD,kBAAmB7Y,EAAQib,UAAUe,KAAK3d,SAQ9J,OANAua,EAAOzT,aAAa,cAAekU,GAInCyE,EAAUlF,EAAQ,CAAEsD,SAAUlc,EAAQ+b,cAAgB,QAAU,aAEzD/b,GA+lCL6iB,qBAAiBzqB,KAuGjB0rB,GAAS,WASX,SAASA,EAAOvV,EAAWqK,GACzB,IAAImL,EAAQroB,KAERsE,EAAU8U,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,GAAmBA,UAAU,GAAK,GAClFkB,EAAeta,KAAMooB,GAErBpoB,KAAKkiB,eAAiB,WACpB,OAAOoG,sBAAsBD,EAAMrI,SAIrChgB,KAAKggB,OAAS3J,EAASrW,KAAKggB,OAAOvmB,KAAKuG,OAGxCA,KAAKsE,QAAU6W,EAAS,GAAIiN,EAAOjE,SAAU7f,GAG7CtE,KAAKsT,MAAQ,CACX2M,aAAa,EACbQ,WAAW,EACXqB,cAAe,IAIjB9hB,KAAK6S,UAAYA,GAAaA,EAAU0V,OAAS1V,EAAU,GAAKA,EAChE7S,KAAKkd,OAASA,GAAUA,EAAOqL,OAASrL,EAAO,GAAKA,EAGpDld,KAAKsE,QAAQib,UAAY,GACzB5mB,OAAO+N,KAAKyU,EAAS,GAAIiN,EAAOjE,SAAS5E,UAAWjb,EAAQib,YAAY/b,SAAQ,SAAUhL,GACxF6vB,EAAM/jB,QAAQib,UAAU/mB,GAAQ2iB,EAAS,GAAIiN,EAAOjE,SAAS5E,UAAU/mB,IAAS,GAAI8L,EAAQib,UAAYjb,EAAQib,UAAU/mB,GAAQ,OAIpIwH,KAAKuf,UAAY5mB,OAAO+N,KAAK1G,KAAKsE,QAAQib,WAAWve,KAAI,SAAUxI,GACjE,OAAO2iB,EAAS,CACd3iB,KAAMA,GACL6vB,EAAM/jB,QAAQib,UAAU/mB,OAG5B0H,MAAK,SAAUxF,EAAG+D,GACjB,OAAO/D,EAAE8d,MAAQ/Z,EAAE+Z,SAOrBxY,KAAKuf,UAAU/b,SAAQ,SAAU2kB,GAC3BA,EAAgBpI,SAAWnJ,EAAWuR,EAAgBD,SACxDC,EAAgBD,OAAOG,EAAMxV,UAAWwV,EAAMnL,OAAQmL,EAAM/jB,QAAS6jB,EAAiBE,EAAM/U,UAKhGtT,KAAKggB,SAEL,IAAIgC,EAAgBhiB,KAAKsE,QAAQ0d,cAC7BA,GAEFhiB,KAAKiiB,uBAGPjiB,KAAKsT,MAAM0O,cAAgBA,EAqD7B,OA9CAtH,EAAY0N,EAAQ,CAAC,CACnB5uB,IAAK,SACLN,MAAO,WACL,OAAO8mB,EAAO5nB,KAAK4H,QAEpB,CACDxG,IAAK,UACLN,MAAO,WACL,OAAOkc,EAAQhd,KAAK4H,QAErB,CACDxG,IAAK,uBACLN,MAAO,WACL,OAAO+oB,EAAqB7pB,KAAK4H,QAElC,CACDxG,IAAK,wBACLN,MAAO,WACL,OAAOqoB,EAAsBnpB,KAAK4H,UA4B/BooB,EA7HI,GAqJbA,GAAOI,OAA2B,oBAAX7rB,OAAyBA,OAAS8rB,GAAQC,YACjEN,GAAOtF,WAAaA,EACpBsF,GAAOjE,SAAWA,GAEH,S,+BCnhFf,IAAIwE,EAGJA,EAAI,WACH,OAAO3oB,KADJ,GAIJ,IAEC2oB,EAAIA,GAAK,IAAIC,SAAS,cAAb,GACR,MAAOpuB,GAEc,iBAAXmC,SAAqBgsB,EAAIhsB,QAOrC3E,EAAOD,QAAU4wB,G,wECXjB,MAAME,EACF,YAAYjkB,EAAQoJ,EAAU8a,EAAY,IACtC9oB,KAAK4E,OAASA,EACd5E,KAAKgO,SAAWA,EAChBhO,KAAK8oB,UAAYA,EAEjB9oB,KAAK+oB,SAQT,SACI/oB,KAAK4E,OAAO0D,iBAAiB,aAActI,KAAKgpB,uBAAuBvvB,KAAKuG,OAC5EA,KAAK4E,OAAO0D,iBAAiB,WAAYtI,KAAKipB,qBAAqBxvB,KAAKuG,OAS5E,UACIA,KAAK4E,OAAOwM,oBAAoB,aAAcpR,KAAKgpB,uBAAuBvvB,KAAKuG,OAC/EA,KAAK4E,OAAOwM,oBAAoB,WAAYpR,KAAKipB,qBAAqBxvB,KAAKuG,OAU/E,uBAAuBxF,GACnB,MAAM6T,EAAQ7T,EAAEyU,eAAe,GAE/BjP,KAAKkpB,OAAS7a,EAAMQ,MACpB7O,KAAKmpB,OAAS9a,EAAMS,MACpB9O,KAAKopB,WAAY,IAAIC,MAAOC,UAUhC,qBAAqB9uB,GACjB,MAAM6T,EAAQ7T,EAAEyU,eAAe,GACzBsa,EAAQlb,EAAMQ,MAAQ7O,KAAKkpB,OAC3BM,EAAQnb,EAAMS,MAAQ9O,KAAKmpB,OAC3BM,EAAOpuB,KAAK+C,IAAImrB,GAChBG,EAAOruB,KAAK+C,IAAIorB,GAGtB,MAFoB,IAAIH,MAAOC,UAAYtpB,KAAKopB,UA5D7B,KAgEnB,QAAO,GACH,KAAKK,GAAQzpB,KAAK8oB,WAAaW,EAAOC,GAAQH,EAAQ,EAClDvpB,KAAKgO,SAAS,QACd,MACJ,KAAKyb,GAAQzpB,KAAK8oB,WAAaW,EAAOC,GAAQH,EAAQ,EAClDvpB,KAAKgO,SAAS,SACd,MACJ,KAAK0b,GAAQ1pB,KAAK8oB,WAAaY,EAAOD,GAAQD,EAAQ,EAClDxpB,KAAKgO,SAAS,MACd,MACJ,KAAK0b,GAAQ1pB,KAAK8oB,WAAaY,EAAOD,GAAQD,EAAQ,EAClDxpB,KAAKgO,SAAS,UCjFf,MAAM2b,EACjB,cACI3pB,KAAK4pB,IAAM,GAIX5pB,KAAK6pB,GAAKltB,OAAOmtB,eAEjB9pB,KAAK+pB,OAGT,QAIA,KAAKvwB,EAAKyU,GACNjO,KAAK6pB,GAAGG,QAAQxwB,EAAKywB,KAAKC,UAAUjc,IAGxC,IAAIzU,GACA,OAAOywB,KAAKE,MAAMnqB,KAAK6pB,GAAGO,QAAQ5wB,KCd3B,MAAM,EACjB,YAAY6wB,GACRrqB,KAAK4pB,IAAM,CACPU,QAASC,EAAE5tB,QACX6tB,cAAeD,EAAE,kBACjBE,SAAUF,EAAEF,GACZK,SAAUH,EAAE,QAAQI,KAAK,QACzBC,MAAOL,EAAE,UAAUvuB,OAAS,EAC5B6uB,MAAON,EAAEF,GAAUS,SAAS,YAC5BC,SAAUR,EAAEF,GAAUzrB,QAAQ,gBAAgBqP,KAAK,SACnD+c,YAAa,CACTC,YAAkFvuB,MAArE6tB,EAAEF,GAAUrb,KAAK,iBAAiBf,KAAK,2BAA0C,YAAcsc,EAAEF,GAAUrb,KAAK,iBAAiBf,KAAK,2BACnJid,YAAkFxuB,MAArE6tB,EAAEF,GAAUrb,KAAK,iBAAiBf,KAAK,2BAA0C,YAAcsc,EAAEF,GAAUrb,KAAK,iBAAiBf,KAAK,2BACnJkd,UAA8EzuB,MAAnE6tB,EAAEF,GAAUrb,KAAK,iBAAiBf,KAAK,yBAAwC,UAAYsc,EAAEF,GAAUrb,KAAK,iBAAiBf,KAAK,yBAC7Imd,cAAkF1uB,MAAnE6tB,EAAEF,GAAUrb,KAAK,iBAAiBf,KAAK,yBAAwC,cAAgBsc,EAAEF,GAAUrb,KAAK,iBAAiBf,KAAK,yBACrJod,cAAsF3uB,MAAvE6tB,EAAEF,GAAUrb,KAAK,iBAAiBf,KAAK,6BAA4C,cAAgBsc,EAAEF,GAAUrb,KAAK,iBAAiBf,KAAK,8BAE7Jqd,YAAa,CACTL,YAAa,YACbC,YAAa,YACbC,UAAW,UACXC,cAAe,cACfC,cAAe,eAEnBE,SAAU,GACVC,mBAAoBjB,EAAEF,GAAUrb,KAAK,cACrCyc,sBAAuBlB,EAAEF,GAAUrb,KAAK,kBACxC0c,oBAAqBnB,EAAE,0BACvBoB,WAAYpB,EAAEF,GAAUrb,KAAK,eAC7B4c,aAAcrB,EAAEF,GAAUrb,KAAK,sBAC/B6c,YAAatB,EAAEF,GAAUrb,KAAK,qBAC9B8c,gBAAiBvB,EAAEF,GAAUrb,KAAK,wCAClC+c,gBAAiBxB,EAAEF,GAAUrb,KAAK,wCAClCgd,kBAAmBzB,EAAEF,GAAUrb,KAAK,sBACpCid,QAAS1B,EAAEF,GAAUrb,KAAK,mBAC1Bkd,YAAa3B,EAAEF,GAAUrb,KAAK,uBAC9Bmd,aAAc5B,EAAEF,GAAUrb,KAAK,wCAC/Bod,YAAa7B,EAAEF,GAAUrb,KAAK,mBAC9Bqd,iBAAkB9B,EAAE,2BACpB+B,mBAAmB,EACnBjX,WAAY,GACZkX,aAAchC,EAAEF,GAAUrb,KAAK,iBAC/Bwd,gBAAiBjC,EAAEF,GAAUrO,SAAShN,KAAK,8DAC3Cyd,kBAAmBlC,EAAEF,GAAUrO,SAAShN,KAAK,uBAC7C0d,iBAAkBnC,EAAEF,GAAUrO,SAAShN,KAAK,yBAC5C2d,eAAgBpC,EAAEF,GAAUrb,KAAK,mBACjC4d,kBAAmBrC,EAAEF,GAAUrb,KAAK,uBACpC6d,wBAAwB,EACxBC,eAAgB,GAChBC,QAAS,GACTC,YAAa,GACbC,UAAW,GACXC,YAAa,GACbC,YAAa,GACbC,SAAU,GACVC,OAAQ,OACRC,KAAM,KACNC,SAAU,iBACVC,KAAM,GACNC,aAAc,GACdC,cAAe,GACfC,SAAU,GACVC,kBAAmB,GACnBC,KAAM,GACN9qB,IAAK,GACL+qB,IAAK,GACLC,iBAAkB,GAClBC,UAAU,EACVC,UAAU,EACVC,OAAQ,CACJC,GAAI/T,SAASmQ,EAAE,mBAAmB6D,OAClCC,GAAIjU,SAASmQ,EAAE,mBAAmB6D,OAClCE,GAAIlU,SAASmQ,EAAE,mBAAmB6D,OAClCG,QAAShE,EAAE,wBAAwB6D,MACnCI,IAAKpU,SAASmQ,EAAE,oBAAoB6D,OACpCK,IAAKrU,SAASmQ,EAAE,oBAAoB6D,OACpCM,IAAKxvB,WAAWqrB,EAAE,oBAAoB6D,OAAS7D,EAAE,6BAA6B6D,OAC9EO,KAAMvU,SAAS,IAAMmQ,EAAE,oBAAoB6D,OAC3CQ,KAAMxU,SAAS,IAAMmQ,EAAE,oBAAoB6D,OAC3CS,KAAM3vB,WAAW,IAAMqrB,EAAE,oBAAoB6D,OAC7CU,KAAMvE,EAAE,0BAA0B6D,OAAS7D,EAAE,4BAA4B6D,MACzEW,aAAcxE,EAAE,wBAAwB6D,MACxCY,eAAgBzE,EAAE,0BAA0B6D,MAC5Ca,KAAM1E,EAAE,0BAA0B6D,OAAS7D,EAAE,4BAA4B6D,MACzEc,UAAW3E,EAAE,mCAAmC6D,MAChDe,IAAK/U,SAASmQ,EAAE,mBAAmB6D,OACnCgB,YAA+C,GAAjC7E,EAAE,qBAAqBvuB,OAAe,IAAMuuB,EAAE,8BAA8B6D,MAC1FpY,QAASuU,EAAE,yCAAyC6D,MACpDd,KAAM/C,EAAE,6BAA6B6D,MACrCP,KAAMtD,EAAE,mCAAmC6D,MAC3CiB,eAAgB9E,EAAE,+BAA+B6D,OAErDkB,OAAQ,CACJnB,GAAI/T,SAASmQ,EAAE,mBAAmB6D,OAClCC,GAAIjU,SAASmQ,EAAE,mBAAmB6D,OAClCE,GAAIlU,SAASmQ,EAAE,mBAAmB6D,OAClCG,QAASnU,SAASmQ,EAAE,wBAAwB6D,OAC5CI,IAAKpU,SAASmQ,EAAE,oBAAoB6D,OACpCK,IAAKrU,SAASmQ,EAAE,oBAAoB6D,OACpCM,IAAKxvB,WAAWqrB,EAAE,oBAAoB6D,OAAS7D,EAAE,6BAA6B6D,OAC9EU,KAAMvE,EAAE,0BAA0B6D,OAAS7D,EAAE,4BAA4B6D,MACzEa,KAAM1E,EAAE,0BAA0B6D,OAAS7D,EAAE,4BAA4B6D,MACzEc,UAAW3E,EAAE,mCAAmC6D,MAChDe,IAAK/U,SAASmQ,EAAE,mBAAmB6D,OACnCgB,YAA+C,GAAjC7E,EAAE,qBAAqBvuB,OAAe,IAAMuuB,EAAE,8BAA8B6D,MAC1FpY,QAASuU,EAAE,yCAAyC6D,MACpDd,KAAM/C,EAAE,6BAA6B6D,MACrCP,KAAMtD,EAAE,mCAAmC6D,MAC3CiB,eAAgB9E,EAAE,+BAA+B6D,OAErDmB,eAAyD,GAAxChF,EAAE,4BAA4BvuB,QAAuBuuB,EAAE,4BAA4B6D,MACpGoB,YAAcjF,EAAEF,GAAUrb,KAAK,eAAehT,OAAS,EAAIkD,WAAW,IAAMqrB,EAAEF,GAAUrb,KAAK,eAAef,KAAK,UAAY,GAIjIjO,KAAK4pB,IAAIoE,SAAyCtxB,MAA7BsD,KAAK4pB,IAAIsE,OAAOgB,YAAqE,QAA1ClvB,KAAK4pB,IAAIsE,OAAOgB,UAAUO,OAAO,EAAG,IAA0D,UAA1CzvB,KAAK4pB,IAAIsE,OAAOgB,UAAUO,OAAO,EAAG,IACxJzvB,KAAK4pB,IAAIqE,SAAyCvxB,MAA7BsD,KAAK4pB,IAAI0F,OAAOJ,YAAqE,QAA1ClvB,KAAK4pB,IAAI0F,OAAOJ,UAAUO,OAAO,EAAG,IAA0D,UAA1CzvB,KAAK4pB,IAAI0F,OAAOJ,UAAUO,OAAO,EAAG,IAEhH,GAApCzvB,KAAK4pB,IAAI8C,iBAAiB1wB,QAAagE,KAAK4pB,IAAI6C,kBAAkB1F,OAEtE/mB,KAAK0vB,uBAAwB,EAC7B1vB,KAAK4pB,IAAI2B,SAAYvrB,KAAK4pB,IAAIiB,MAAQ7qB,KAAK4pB,IAAI0B,YAActrB,KAAK4pB,IAAIoB,YACtEhrB,KAAK2vB,QAAU,IAAIhG,EAGMjtB,MAArBsD,KAAK4pB,IAAImB,WACT/qB,KAAK4pB,IAAI2B,SAASN,YAAcjrB,KAAK4pB,IAAI2B,SAASN,YAAcjrB,KAAK4pB,IAAImB,SACzE/qB,KAAK4pB,IAAI2B,SAASL,YAAclrB,KAAK4pB,IAAI2B,SAASL,YAAclrB,KAAK4pB,IAAImB,SACzE/qB,KAAK4pB,IAAI2B,SAASJ,UAAYnrB,KAAK4pB,IAAI2B,SAASJ,UAAYnrB,KAAK4pB,IAAImB,SACrE/qB,KAAK4pB,IAAI2B,SAASH,cAAgBprB,KAAK4pB,IAAI2B,SAASH,cAAgBprB,KAAK4pB,IAAImB,SAC7E/qB,KAAK4pB,IAAI2B,SAASF,cAAgBrrB,KAAK4pB,IAAI2B,SAASF,cAAgBrrB,KAAK4pB,IAAImB,UAG7E/qB,KAAK4pB,IAAI4B,mBAAmBxvB,QAC5BgE,KAAK+pB,OAIgB,MAArB/pB,KAAK4pB,IAAIc,UAAoB1qB,KAAK4pB,IAAI6B,sBAAsBzvB,SAC5DgE,KAAK4pB,IAAIqC,QAAU1B,EAAEF,GAAUrb,KAAK,uBACpChP,KAAK4vB,sBAIb,OACI5vB,KAAK6vB,YACL7vB,KAAK8vB,YACL9vB,KAAK+vB,sBACL/vB,KAAKgwB,oBAELhwB,KAAKiwB,2BACLjwB,KAAKkwB,uBACAlwB,KAAK4pB,IAAIgB,OACV5qB,KAAKmwB,oBAETnwB,KAAKowB,mBACLpwB,KAAKqwB,wBACLrwB,KAAKswB,oBACLtwB,KAAKuwB,cACLvwB,KAAKwwB,kBACLxwB,KAAKywB,yBACLzwB,KAAK0wB,uBACL1wB,KAAK2wB,oBACL3wB,KAAK4wB,oBACL5wB,KAAK6wB,sBAGL,IAAIC,EAAU9wB,KAAK4pB,IACnBW,EAAEuG,EAAQrG,UAAUzb,KAAK,qBAAqBsG,GAAG,WAAa9a,IAE1D,GAAW,IADDA,EAAEu2B,MAGR,OADAxG,EAAE/vB,EAAEw2B,eAAeC,QAAQ,WACpB,IAGf1G,EAAEuG,EAAQrG,UAAUzb,KAAK,qBAAqBsG,GAAG,SAAW9a,IACxD,IAAI02B,EAA4E,IAAhE71B,KAAK4pB,MAAMsF,EAAE/vB,EAAEw2B,eAAe5C,MAAMhyB,QAAQ,MAAO,IAAM,KACzE00B,EAAQzD,OAAShyB,KAAKE,IAAI21B,EAAU9W,SAAS0W,EAAQ9D,YAAY8D,EAAQ9D,YAAYhxB,OAAS,KAAK8a,WACnGga,EAAQzb,WAAWG,IAAI+U,EAAE4G,QAAQL,EAAQzD,OAAQyD,EAAQ9D,gBAE7DzC,EAAEuG,EAAQrG,UAAUzb,KAAK,qBAAqBsG,GAAG,QAAU9a,IACvD+vB,EAAE/vB,EAAEw2B,eAAeI,WAGE,MAArBpxB,KAAK4pB,IAAIc,UACT1qB,KAAKqxB,wCAIb,YACI,IAAIP,EAAU9wB,KAAK4pB,IAEnBkH,EAAQtF,mBAAmB,GAAG/V,QAEuC,GAAjEqb,EAAQrE,kBAAkBzd,KAAK,wBAAwBhT,QACvD80B,EAAQrE,kBAAkBzd,KAAK,iBAAiBsiB,GAAG,GAAGr2B,SAAS,UAEnE,IAAIs2B,EAAaT,EAAQrE,kBAAkBzd,KAAK,wBACL,SAAvCuiB,EAAWtjB,KAAK,oBAA+B6b,eAAe0H,QAGZ,MAAlDxxB,KAAK2vB,QAAQ72B,IAAIg4B,EAAQvF,SAASL,cAAsD,GAA9BX,EAAE,kBAAkBvuB,OAC9EgE,KAAK2vB,QAAQ8B,KAAKX,EAAQvF,SAASL,YAAa4F,EAAQvE,aAAate,KAAK,gBAAkB,KAGpE,KAApB6iB,EAAQ/F,WACRwG,EAAWp2B,YAAY,UACvB21B,EAAQrE,kBAAkBzd,KAAK,gBAAgBhP,KAAK2vB,QAAQ72B,IAAIg4B,EAAQvF,SAASL,iBAAiBjwB,SAAS,WAInH61B,EAAQrG,SAASzb,KAAK,qBAAqBpQ,QAAQ,MAAM1C,IAAI40B,EAAQrG,SAASzb,KAAK,iBAAiB0iB,OAA2F,MAApFZ,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,sBACvK6iB,EAAQrG,SAASzb,KAAK,oBAAoBpQ,QAAQ,MAAM1C,IAAI40B,EAAQrG,SAASzb,KAAK,gBAAgB0iB,OAA2F,MAApFZ,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,sBAErK6iB,EAAQlF,aAAa+F,KAAK,CAACC,EAAGC,KAC1B,IAAWt4B,OAAOs4B,EAAQ,CACtBhwB,MAAO,EACPO,QAAS,EAAC,GAAM,GAChBxC,KAAM,EACN+C,QAAS,EACTjF,MAAO,CACHnC,IAAK,EACLD,IAAK,OAMrB,YACI0E,KAAK4pB,IAAIa,SAASzb,KAAK,oCAAoC2iB,KAAK,CAACG,EAAIC,KAAexH,EAAEwH,GAAU9a,IAAI,mBAAoB,OAASsT,EAAEwH,GAAU9jB,KAAK,cAAgB,OAGtK,sBACI,IAGI+jB,EAHAlB,EAAU9wB,KAAK4pB,IACfqI,EAAcjyB,KAAK2vB,QAInBuC,EAAc,GAElBpB,EAAQpE,iBAAiBiF,KAAK,CAACn4B,EAAK24B,KAChC,IAAIC,EAAe,GAAK7H,EAAE4H,GAASlkB,KAAK,yBACI,MAAxCsc,EAAE4H,GAASlkB,KAAK,uBAChBikB,EAAcE,EAAar2B,MAAM,KAC7BwuB,EAAE4H,GAASrH,SAAS,YACpBgG,EAAQrG,SAASzb,KAAK,0BAA0B+X,OAChD+J,EAAQrG,SAASzb,KAAK,0BAA0BqjB,SAKxD9H,EAAEoH,KAAKS,EAAar2B,MAAM,MAAM,SAAU+C,EAAOwzB,IACC,GAA1C/H,EAAE4G,QAAQmB,EAASxB,EAAQ7D,YAC3B6D,EAAQ7D,UAAU9tB,KAAKmzB,QAMnCxB,EAAQ7D,UAAU/sB,MAAK,SAAUxF,EAAG+D,GAChC,OAAO2b,SAAS1f,GAAK0f,SAAS3b,MAGlC,IAAI8zB,EAAc,GACdC,EAAc,GAClB,GAAI1B,EAAQtE,gBAAgBxwB,OAAS,EAAG,CACpC,IAAIy2B,EAAelI,EAAE,IAAMuG,EAAQtE,gBAAgBve,KAAK,0BAA0BwhB,OAAO,EAAG,GAAK,QAC7FgD,EAAaz2B,OAAS,GAA2B,IAAtBy2B,EAAarE,QACxCmE,EAAcE,EAAarE,MAC3BoE,EAAcC,EAAaxkB,KAAK,YAAc,IAKtDsc,EAAEoH,KAAKb,EAAQ7D,WAAW,SAAUzzB,EAAK84B,GAErCN,EAAgBlB,EAAQrG,SAASzb,MAAyC,GAApCub,EAAE4G,QAAQmB,EAASJ,GAAqB,yBAA2B,0BAA0BZ,GAAG,GAAGoB,QAC1H,KAAXJ,GAAiC,IAAfC,GAClBP,EAAchjB,KAAK,SAASof,IAAIkE,GAASK,OAAOxd,KAAKod,GAClC,IAAfC,GAAmBR,EAAchjB,KAAK,SAAS2jB,OAAO13B,SAAS,oBAAoB0vB,KAAK,CAAE,eAAgB6H,EAAa,eAAiB,iBAAkB7rB,SAAS3J,gBAAmB,QAAU,sBAEpMg1B,EAAchjB,KAAK,SAASof,IAAIkE,GAASK,OAAOxd,KAAKmd,GAGzDxB,EAAQ9E,kBAAkBhd,KAAK,uBAAuB4jB,OAAOZ,MAIjE,IAAIT,EAAaT,EAAQrE,kBAAkBzd,KAAK,wBAEG,MAA/CijB,EAAYn5B,IAAIg4B,EAAQvF,SAASJ,YAAoD,GAA9BZ,EAAE,kBAAkBvuB,QAC3E80B,EAAQxD,KAAOiE,EAAWtjB,KAAK,wBAAwBtO,QAAQ,GAC/DsyB,EAAYR,KAAKX,EAAQvF,SAASJ,UAAW2F,EAAQxD,MACrD2E,EAAYR,KAAK,OAAQX,EAAQxD,OAEjCwD,EAAQxD,KAAO2E,EAAYn5B,IAAIg4B,EAAQvF,SAASJ,WAEpD2F,EAAQ9E,kBAAkBhd,KAAK,UAAU8hB,EAAQxD,SAAS7N,KAAK,WAAW,GAG9E,oBACI,IAAIqR,EAAU9wB,KAAK4pB,IACfiJ,EAAQ7yB,KACRiyB,EAAcjyB,KAAK2vB,QACnBmD,EAAgB,CACpB,sBAAsC,IAiDtC,GA9CAhC,EAAQpE,iBAAiBiF,KAAK,CAACn4B,EAAK24B,KAkBN,GAfR5H,EAAEwI,KAAKD,EAAcE,sBAAuB,CAACC,EAAUz5B,IAC9Dy5B,EAASC,oBAAsB3I,EAAE4H,GAASlkB,KAAK,uBAClDglB,EAASE,wBAA0B5I,EAAE4H,GAASlkB,KAAK,uBACnDglB,EAASG,cAAgB7I,EAAE4H,GAASlkB,KAAK,iBACzCglB,EAASI,kBAAoB9I,EAAE4H,GAASlkB,KAAK,qBAAqBiT,eAClE+R,EAASK,mBAAqB/I,EAAE4H,GAASlkB,KAAK,qBAAqBiT,eACnE+R,EAASM,wBAA0BhJ,EAAE4H,GAASlkB,KAAK,0BAA0B6I,YAC7Emc,EAASO,kBAAoBjJ,EAAE4H,GAASlkB,KAAK,sBAC7CglB,EAASQ,gCAAkClJ,EAAE4H,GAASlkB,KAAK,mCAAmCiT,eAC9F+R,EAASS,6BAA+BnJ,EAAE4H,GAASlkB,KAAK,gCAAgCiT,eACxF+R,EAASU,uBAAyBpJ,EAAE4H,GAASlkB,KAAK,qBAAqBiT,eACvE+R,EAASW,gBAAkBrJ,EAAE4H,GAASlkB,KAAK,2BAInCjS,QACZ82B,EAAcE,sBAAsB7zB,KAAK,CACrC00B,UAAWtJ,EAAE4H,GAASlkB,KAAK,UAC3B6lB,YAAavJ,EAAE4H,GAASlkB,KAAK,gBAC7BilB,kBAAmB3I,EAAE4H,GAASlkB,KAAK,sBACnCklB,sBAAuB5I,EAAE4H,GAASlkB,KAAK,sBACvCmlB,YAAa7I,EAAE4H,GAASlkB,KAAK,gBAC7BolB,gBAAiB9I,EAAE4H,GAASlkB,KAAK,qBAAqBiT,cACtDoS,iBAAkB/I,EAAE4H,GAASlkB,KAAK,qBAAqBiT,cACvDqS,sBAAuBhJ,EAAE4H,GAASlkB,KAAK,0BAA0B6I,WACjE0c,gBAAiBjJ,EAAE4H,GAASlkB,KAAK,qBACjCwlB,8BAA+BlJ,EAAE4H,GAASlkB,KAAK,mCAAmCiT,cAClFwS,2BAA4BnJ,EAAE4H,GAASlkB,KAAK,gCAAgCiT,cAC5EyS,qBAAsBpJ,EAAE4H,GAASlkB,KAAK,qBAAqBiT,cAC3D6S,qBAAsBxJ,EAAE4H,GAASlkB,KAAK,0BACtC2lB,cAAerJ,EAAE4H,GAASlkB,KAAK,0BAC/B+lB,iBAA4D,IAAzCzJ,EAAE4H,GAASlkB,KAAK,sBAA8B,EAAImM,SAASmQ,EAAE4H,GAASlkB,KAAK,uBAAyB,KACvHgmB,iBAA4D,IAAzC1J,EAAE4H,GAASlkB,KAAK,sBAA8B,MAAQmM,SAASmQ,EAAE4H,GAASlkB,KAAK,uBAAyB,SAC3HimB,QAAU3J,EAAE4H,GAASlkB,KAAK,qBAAuB,KAIzDjO,KAAK4pB,IAAIkD,eAAiBgG,IAIO,MAAjChC,EAAQpG,SAAS+E,OAAO,EAAG,KAAYqB,EAAQpG,SAAW,SAEP,MAAnDuH,EAAYn5B,IAAIg4B,EAAQvF,SAASH,gBAAwD,GAA9Bb,EAAE,kBAAkBvuB,QAAeuuB,EAAE,SAASvuB,OAAS,EAAG,CACrHm4B,KAAK,gBACL,IAAIC,EAAQtD,EAAQ9C,UAAY8C,EAAQ7C,SAAW,qBAAuB,GAE1E,OAAQ6C,EAAQpG,SAAS+E,OAAO,EAAG,IAC/B,IAAK,KACD4E,YAAY,wBAA0BD,EAAO,QAAQ,EAAMtD,EAAQhE,eAAgBwH,GACnF,MACJ,IAAK,KACDD,YAAY,+BAAiCD,EAAO,QAAQ,EAAMtD,EAAQhE,eAAgBwH,GAC1F,MACJ,IAAK,KACDD,YAAY,2BAA6BD,EAAO,QAAQ,EAAMtD,EAAQhE,gBAEtE,SAAuByH,GAEnB,IAAIC,EAAa,CAAE,SAAW,EAAM,aAAgB,GAAI,UAAa,GAAI,OAAU,CAAE,gBAAmB,GAAI,WAAa,EAAM,UAAa,KAAM,aAAgB,KAAM,MAAS,OAIjLjK,EAAEoH,KAAK4C,EAAWE,kBAAkB,SAAUC,EAAUC,GAEpDpK,EAAEoH,KAAKgD,GAAW,SAAUC,EAAWC,GAEnCtK,EAAEoH,KAAKkD,GAAY,SAAUC,EAAQC,GAEjCxK,EAAEoH,KAAKoD,GAAS,SAAUC,EAAWC,GAEjC1K,EAAEoH,KAAKsD,GAAY,SAAUC,EAAWC,GAEpC5K,EAAEoH,KAAKwD,GAAY,SAAUC,EAAUC,GACnC,IAAIC,EAAU,GACdA,EAAQC,OAASnb,SAASsa,GAC1BY,EAAQE,KAAOpb,SAASib,EAAUI,KAClCH,EAAQI,iBAAmBx2B,WAAWm2B,EAAU/G,IAChDgH,EAAQK,KAAOz2B,WAAWm2B,EAAUO,KACpCN,EAAQO,qBAAuB,EAC/BP,EAAQQ,WAAa,EACrBR,EAAQS,eAAiB,EACzBT,EAAQU,oBAAsB,EAC9BV,EAAQW,mBAAqB/2B,WAAWm2B,EAAUa,KAClDZ,EAAQa,aAAej3B,WAAWm2B,EAAUe,KAC5Cd,EAAQjC,iBAAkB,EAC1BiC,EAAQ/B,sBAAwBqB,EAClB,KAAVE,IAAeQ,EAAQ9B,gBAAkB,MAC/B,KAAVsB,IAAeQ,EAAQ9B,gBAAkB,MAC7C8B,EAAQe,yBAAyC,MAAbrB,EACpCM,EAAQgB,sBAAsC,MAAbtB,EACjCM,EAAQiB,gBAAgC,KAAbrB,EAC3BI,EAAQlC,YAAc,KACtBkC,EAAQ1B,cAAgB,GACxBY,EAAWgC,OAAOC,gBAAgBt3B,KAAKm2B,qBAO/DhB,EAA0BrK,KAAKC,UAAUsK,aASrDL,KAAK,oBACLG,EAA0BrC,EAAYn5B,IAAIg4B,EAAQvF,SAASH,gBAG/D,SAASkJ,EAA0BoC,GAC3BnM,EAAE,yBAAyBvuB,OAAS,GACpCuuB,EAAE,yBAAyBxD,OAIwB,MAAnDkL,EAAYn5B,IAAIg4B,EAAQvF,SAASH,gBAA0Bb,EAAE,kBAAkBvuB,OAAS,GACxFi2B,EAAYR,KAAKX,EAAQvF,SAASH,cAAesL,GAErD,IAAIC,EAAa1M,KAAKE,MAAMuM,GAAOF,OACnC,IAAKG,EAAWC,UAEZ,OADAzC,KAAKwC,EAAWE,UAAY,KAAOF,EAAWG,eACvC,EAEX,IAAIC,EAAWJ,EAAWF,gBACtBO,EAAiB,GACjBC,EAAgB,GAChBC,EAAmB,EAwJvB,GAtJA3M,EAAEoH,KAAKoF,GAAU,SAAUj4B,EAAOq4B,GAE9B,GAAqC,MAAjCrG,EAAQpG,SAAS+E,OAAO,EAAG,KACtB0H,EAAQd,0BAAwD,OAA5Bc,EAAQ3D,kBAA+B2D,EAAQd,0BAAwD,OAA5Bc,EAAQ3D,iBACxH,OAAO,EAIf,IAAI4D,EAAc7M,EAAEwI,KAAKjC,EAAQhE,eAAekG,sBAAuB,CAACC,EAAUz5B,KAC9E,IAAI69B,EAAiBF,EAAQ5B,OAI7B,MAHqC,MAAjCzE,EAAQpG,SAAS+E,OAAO,EAAG,IAAc0H,EAAQZ,kBACjDc,EAAiBF,EAAQ5B,OAAS4B,EAAQ3B,KAAOvC,EAASc,sBAEvDd,EAASG,cAAgB+D,EAAQ/D,aACN,SAA7BH,EAASI,kBAAgC8D,EAAQ9D,iBACnB,SAA9BJ,EAASK,mBAAiC6D,EAAQ9D,iBACnDJ,EAASM,wBAA0B4D,EAAQ5D,uBAC3CN,EAASO,kBAAoB2D,EAAQ3D,kBACO,SAA3CP,EAASQ,+BAAwF,SAA3CR,EAASQ,gCAA8C0D,EAAQd,4BAC7E,SAAxCpD,EAASS,4BAAkF,SAAxCT,EAASS,6BAA2CyD,EAAQb,yBAC7E,SAAlCrD,EAASU,sBAAsE,SAAlCV,EAASU,uBAAqCwD,EAAQZ,mBACzE,MAA1BtD,EAASW,cAAwB,GAAKX,EAASW,kBAA6C,MAAzBuD,EAAQvD,cAAwB,GAAKuD,EAAQvD,gBACjHxZ,SAAS6Y,EAASe,mBAAqBqD,GACvCjd,SAAS6Y,EAASgB,mBAAqBoD,IAC5C,IAAM,KAGT,GAAmB,MAAfD,EACA,OAAO,EAMX,GAJID,EAAQrD,YAAcsD,EAAYtD,aAIwB,GAA1DvJ,EAAE4G,QAAQgG,EAAQ3B,KAAK71B,QAAQ,GAAImxB,EAAQ7D,WAC3C,OAAO,EAIX,GAAqC,MAAjC6D,EAAQpG,SAAS+E,OAAO,EAAG,GAAY,CAMvC,GALI0H,EAAQZ,kBACRY,EAAQ5B,OAAS4B,EAAQ5B,OAAU4B,EAAQ3B,KAAO4B,EAAYrD,sBAI9DoD,EAAQ5B,OAAS,KAAO,EACxB,OAAO,EAUwB,MAA/B6B,EAAY5D,iBAA2B2D,EAAQ5B,OAAS2B,IACxDA,EAAmBC,EAAQ5B,QAInC,IAAKzE,EAAQ9C,UACR8C,EAAQ9C,UAAiC,KAApB8C,EAAQ/F,UAAqBoM,EAAQrD,aAAehD,EAAQ5C,OAAOY,MACxFgC,EAAQ7C,UAAiC,KAApB6C,EAAQ/F,UAAqBoM,EAAQrD,aAAehD,EAAQxB,OAAOR,KAAQ,CAErDpyB,MAAxCo0B,EAAQ/D,QAAQoK,EAAQrD,eACxBhD,EAAQ/D,QAAQoK,EAAQrD,aAAe,IAGiBp3B,MAAxDo0B,EAAQ/D,QAAQoK,EAAQrD,aAAaqD,EAAQ5B,UAC7CzE,EAAQ/D,QAAQoK,EAAQrD,aAAaqD,EAAQ5B,QAAU,IAG3D,IAAID,EAAU,CAAE,iBAAoB6B,EAAQzB,iBAAkB,KAAQyB,EAAQxB,KAAM,qBAAwBwB,EAAQtB,qBAAsB,mBAAsBsB,EAAQlB,mBAAoB,WAAckB,EAAQG,WAAY,aAAgBH,EAAQhB,aAAc,gBAAmBgB,EAAQI,gBAAiB,aAAgBJ,EAAQK,aAAc,WAAcL,EAAQM,WAAY,gBAAmBN,EAAQO,gBAAiB,iBAAoBP,EAAQpJ,iBAAkB,WAAcoJ,EAAQrB,WAAY,eAAkBqB,EAAQpB,eAAgB,oBAAuBoB,EAAQnB,qBAE7jB,OAAQlF,EAAQpG,SAAS+E,OAAO,EAAG,IAC/B,IAAK,KACL,IAAK,KAEDqB,EAAQ/D,QAAQoK,EAAQrD,aAAaqD,EAAQ5B,QAAQ4B,EAAQ3B,MAAQ2B,EAAQZ,gBAAkB,IAAM,KAAOjB,EAC5G,MACJ,IAAK,KAEDxE,EAAQ/D,QAAQoK,EAAQrD,aAAaqD,EAAQ5B,QAAQ4B,EAAQ3B,MAAS1E,EAAQlE,kBAAkB5wB,OAAS,GAAKm7B,EAAQb,sBAAyB,KAAO,KAAOhB,EAOrK,GAAI/K,EAAE4G,QAAQgG,EAAQ3B,KAAK71B,QAAQ,GAAImxB,EAAQ7D,YAAc,EACzD,OAAQkK,EAAQ3D,iBACZ,IAAK,MAC0D,GAAvDjJ,EAAE4G,QAAQgG,EAAQ3B,KAAK71B,QAAQ,GAAIq3B,IACnCA,EAAe73B,KAAKg4B,EAAQ3B,KAAK71B,QAAQ,IAE7C,MACJ,IAAK,MACyD,GAAtD4qB,EAAE4G,QAAQgG,EAAQ3B,KAAK71B,QAAQ,GAAIs3B,IACnCA,EAAc93B,KAAKg4B,EAAQ3B,KAAK71B,QAAQ,KASU,GAA9D4qB,EAAE4G,QAAQgG,EAAQ5B,OAAO51B,QAAQ,GAAImxB,EAAQ9D,cAAsBzC,EAAE4G,QAAQgG,EAAQ3B,KAAK71B,QAAQ,GAAImxB,EAAQ7D,YAAc,GAC5H6D,EAAQ9D,YAAY7tB,KAAKg4B,EAAQ5B,OAAO51B,QAAQ,QAIvB,MAAjCmxB,EAAQpG,SAAS+E,OAAO,EAAG,KAE3BqB,EAAQ9D,YAAc2K,OAAO5E,KAAKjC,EAAQ9D,aAAa,SAAU4K,GAC7D,OAAOxd,SAASwd,IAAgBV,MAKxC3M,EAAEoH,KAAKb,EAAQ7D,WAAW,SAAUnuB,EAAO+4B,GACnCb,EAAeh7B,OAAS,IAA8C,GAAzCuuB,EAAE4G,QAAQ0G,EAAWb,IAClDzM,EAAE,6CAA+CsN,EAAY,MAAMj5B,QAAQ,MAAMzC,SAEjF86B,EAAcj7B,OAAS,IAA6C,GAAxCuuB,EAAE4G,QAAQ0G,EAAWZ,IACjD1M,EAAE,4CAA8CsN,EAAY,MAAMj5B,QAAQ,MAAMzC,YAKpF20B,EAAQ9C,UAAgC,KAApB8C,EAAQ/F,WAC5B+F,EAAQ5C,OAAOiB,IAAM2I,EAAOhH,EAAQ/D,QAAQ+D,EAAQ5C,OAAOY,MAAOgC,EAAQ5C,OAAOG,GAAIyC,EAAQ5C,OAAOQ,KACpGoC,EAAQ/D,QAAQ+D,EAAQ5C,OAAOY,MAAQiJ,EAAcjH,EAAQ/D,QAAQ+D,EAAQ5C,OAAOY,MAAOgC,EAAQ5C,SAGnG4C,EAAQ7C,UAAgC,KAApB6C,EAAQ/F,WAC5B+F,EAAQxB,OAAOH,IAAM2I,EAAOhH,EAAQ/D,QAAQ+D,EAAQxB,OAAOR,MAAOgC,EAAQxB,OAAOjB,GAAIyC,EAAQxB,OAAOZ,KACpGoC,EAAQ/D,QAAQ+D,EAAQxB,OAAOR,MAAQiJ,EAAcjH,EAAQ/D,QAAQ+D,EAAQxB,OAAOR,MAAOgC,EAAQxB,SAIvGwB,EAAQ9D,YAAY9sB,MAAK,SAAUxF,EAAG+D,GAClC,OAAO2b,SAAS1f,GAAK0f,SAAS3b,MAGlCqyB,EAAQhF,gBAAgB3W,KAAKiF,SAAS0W,EAAQ9D,YAAY,IAAIgL,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAuB,KACxHnH,EAAQ/E,gBAAgB5W,KAAKiF,SAAS0W,EAAQ9D,YAAY8D,EAAQ9D,YAAYhxB,OAAS,IAAIg8B,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAuB,KAGvHv7B,MAA1Bo0B,EAAQ/D,QAAa,KAA4CrwB,MAA1Bo0B,EAAQ/D,QAAa,IAAgB,CAC5E,IAAImL,EAAcv/B,OAAO+N,KAAKoqB,EAAQ/D,QAAa,KAAGp0B,OAAO+N,KAAKoqB,EAAQ/D,QAAa,KAAG/wB,OAAS,GAC/Fm8B,GAAc,IAAM/d,SAAS8d,EAAc9d,SAAS0W,EAAQ9D,YAAY,MAAQ5S,SAAS0W,EAAQ9D,YAAY8D,EAAQ9D,YAAYhxB,OAAS,IAAMoe,SAAS0W,EAAQ9D,YAAY,MAAMrtB,QAAQ,GAC/L4qB,EAAE,iDAAmD4N,EAAWrhB,WAAa,eAAeshB,SAAS,sBAMzG,SAASN,EAAOO,EAAWhK,EAAIK,GAC3B,IAAI4J,EAAY,EAShB,OAPA/N,EAAEoH,KAAK0G,GAAW,SAAUE,EAAQC,GAChC,GAAmB97B,MAAf87B,EAAQnK,IAAoBnvB,WAAWs5B,EAAQnK,GAAIqH,kBAAoBhH,EACvE,OAAO,EAEX4J,EAAYle,SAASme,MAGlBD,EAGX,SAASP,EAAchB,EAAU0B,GAC7B,IAAIld,EAAS,GACT4S,EAAKsK,EAAStK,GACdE,EAAKoK,EAASpK,GACdC,EAAKmK,EAASnK,GACdE,EAAMiK,EAASjK,IACfC,EAAMgK,EAAShK,IACfC,EAAM+J,EAAS/J,IACfS,EAAM9zB,KAAKE,IAAI4yB,EAAIsK,EAAStJ,KAC5BuJ,EAAK,EACLC,EAAK,EACLC,EAA8D,OAArDH,EAAS3J,KAAKW,OAAOgJ,EAAS3J,KAAK9yB,OAAS,EAAG,IAA6C,OAA9By8B,EAAS3J,KAAKW,OAAO,EAAG,GAEnG,GAAuC,QAAnCgJ,EAASvJ,UAAUO,OAAO,EAAG,GAC7BlF,EAAEoH,KAAKoF,GAAU,SAAU8B,EAAIluB,GAE3B,GAAU,MADVkuB,EAAKze,SAASye,IACC,OAAO,EACtB,IAAIC,EAEJvO,EAAEoH,KAAKhnB,GAAQ,SAAUouB,EAAI7/B,GAGnB0/B,GAASG,GAAMtK,IAEjBqK,EAAK55B,WAAWhG,EAAMw8B,kBACtBqD,EAAK3e,SAAS2e,GAEVF,GAAMrK,GACNuK,GAAMtK,GACNqK,GAAMpK,IAEFmK,GAAM1K,GACN4K,GAAM19B,KAAKE,IAAI8yB,EAAII,IACb,GAANiK,IACAA,EAAKG,EACLF,EAAKI,GAETxd,EAASyd,EAAiBzd,EAAQwd,EAAIF,EAAI3/B,gBAKvD,GAAuC,UAAnCu/B,EAASvJ,UAAUO,OAAO,EAAG,GAAgB,CACpD,GAAIgJ,EAAStK,IAAMK,EAGf,OADA2F,KAAK,cACE5Y,EAEPgP,EAAEoH,KAAKoF,GAAU,SAAU8B,EAAIluB,GAE3B,GAAU,MADVkuB,EAAKze,SAASye,IACC,OAAO,EACtB,IAAIC,EAEJvO,EAAEoH,KAAKhnB,GAAQ,SAAUouB,EAAI7/B,GAGnB0/B,GAASG,GAAMtK,IAEjBqK,EAAK55B,WAAWhG,EAAMw8B,kBACtBqD,EAAK3e,SAAS2e,GAETzK,GAAMI,GAAQkK,EAEXC,GAAM1K,GAAM0K,GAAMrK,GAClBuK,GAAMtK,GACNqK,GAAMpK,IACNnT,EAASyd,EAAiBzd,EAAQwd,EAAIF,EAAI3/B,IAI1C2/B,GAAM1J,GAAO0J,GAAMrK,GACnBuK,GAAM1K,GAAM0K,GAAMtK,GAClBqK,GAAMpK,IACNnT,EAASyd,EAAiBzd,EAAQwd,EAAIF,EAAI3/B,WAStE,SAAS8/B,EAAiBzd,EAAQ+R,EAAM2L,EAAQt/B,GAK5C,OAJK4hB,EAAO0d,KACR1d,EAAO0d,GAAU,IAErB1d,EAAO0d,GAAQ3L,GAAQ3zB,EAChB4hB,EAGX,IAAKgP,EAAE2O,cAAc3d,GAAS,CAE1BuV,EAAQ9D,YAAc,GACtB,IAAIC,EAAY,GAGhB1C,EAAEoH,KAAKpW,GAAQ,SAAU4d,EAAYxE,GACjC7D,EAAQ9D,YAAY7tB,KAAKg6B,GACzB5O,EAAEoH,KAAKgD,GAAW,SAAUyE,EAAUjC,IACM,GAAnC5M,EAAE4G,QAAQiI,EAAUnM,IAAsB1C,EAAE4G,QAAQiI,EAAUtI,EAAQ7D,YAAc,GACrFA,EAAU9tB,KAAKi6B,SAK3BnM,EAAU/sB,MAAK,SAAUxF,EAAG+D,GACxB,OAAO2b,SAAS1f,GAAK0f,SAAS3b,MAIlCqyB,EAAQ9E,kBAAkBhd,KAAK,qBAAqB2iB,MAAK,YACT,GAAxCpH,EAAE4G,QAAQ5G,EAAEvqB,MAAMouB,MAAOnB,IACzB1C,EAAEvqB,MAAMpB,QAAQ,MAAMzC,YAK9B20B,EAAQuI,cAAgBvI,EAAQ9D,YAAY,GAC5C8D,EAAQwI,YAAcrM,EAAU,GAGhC6D,EAAQyI,cAAgBzI,EAAQ9D,YAAY8D,EAAQ9D,YAAYhxB,OAAS,GACzE80B,EAAQ0I,YAAcvM,EAAUA,EAAUjxB,OAAS,GAEzB,eAAtBy8B,EAASvJ,WAA4CxyB,MAAd6e,EAAOmd,IAE9C5H,EAAQzD,OAASqL,EAAG5hB,WACcpa,MAA9B6e,EAAOuV,EAAQzD,QAAQsL,KAAkB7H,EAAQxD,KAAOqL,KAIvBj8B,MAAjC6e,EAAOuV,EAAQyI,iBAA6BzI,EAAQzD,OAASyD,EAAQyI,eACtB78B,MAA/C6e,EAAOuV,EAAQzD,QAAQyD,EAAQ0I,eAA2B1I,EAAQxD,KAAOwD,EAAQ0I,cAGzF1I,EAAQ9E,kBAAkBhd,KAAK,UAAU8hB,EAAQxD,SAAS7N,KAAK,WAAW,GAwB9E,MArBuC,QAAnCgZ,EAASvJ,UAAUO,OAAO,EAAG,IAAiD,MAAjCqB,EAAQpG,SAAS+E,OAAO,EAAG,KACzC,SAA3BqB,EAAQvB,gBACJnV,SAAS0W,EAAQyI,eAAiBnf,SAASqe,EAAStK,KACpD5D,EAAE,0BAA0B8H,OAG5BjY,SAAS0W,EAAQuI,eAAiBjf,SAASqe,EAAStK,KACpD5D,EAAE,sBAAsB8H,SAGxBjY,SAAS0W,EAAQzD,QAAUjT,SAASqe,EAAStK,KAC7C5D,EAAE,0BAA0B8H,OAG5BjY,SAAS0W,EAAQzD,QAAUjT,SAASqe,EAAStK,KAC7C5D,EAAE,sBAAsB8H,SAKpC0E,EAAWxb,EA9KfsX,EAAM4G,oBAoLd,mBACI,IAAI3I,EAAU9wB,KAAK4pB,IACfiJ,EAAQ7yB,KACRiyB,EAAcjyB,KAAK2vB,QAInB4B,EAAaT,EAAQrE,kBAAkBzd,KAAK,wBAC3C8hB,EAAQlG,OACTkG,EAAQ9E,kBAAkBhd,KAAK,uBAAuBpQ,QAAQ,MAAM3D,SAAS,YAAYy+B,WAAWv+B,YAAY,YAG/G6E,KAAK4pB,IAAIoE,UAAahuB,KAAK4pB,IAAIqE,WAEqB,MAAjDgE,EAAYn5B,IAAIg4B,EAAQvF,SAASN,cACjC6F,EAAQzD,OAASkE,EAAWtjB,KAAK,0BAA0BtO,QAAQ,GAEnEsyB,EAAYR,KAAKX,EAAQvF,SAASN,YAAa6F,EAAQzD,QACvD4E,EAAYR,KAAK,SAAUX,EAAQzD,SAEnCyD,EAAQzD,OAAS4E,EAAYn5B,IAAIg4B,EAAQvF,SAASN,cAKrB,MAAjC6F,EAAQpG,SAAS+E,OAAO,EAAG,IAAcqB,EAAQ5C,OAAOC,GAAK/T,SAAS0W,EAAQzD,UAC1EyD,EAAQ9C,UAAgC,KAApB8C,EAAQ/F,UAA4D,QAAzC+F,EAAQ5C,OAAOgB,UAAUO,OAAO,EAAG,IAClFqB,EAAQzD,OAASyD,EAAQ5C,OAAOC,GAAGrX,WACnCmb,EAAYR,KAAKX,EAAQvF,SAASN,YAAa6F,EAAQzD,QACvD4E,EAAYR,KAAK,SAAUX,EAAQzD,SAC5ByD,EAAQ7C,UAAgC,KAApB6C,EAAQ/F,UAA4D,QAAzC+F,EAAQxB,OAAOJ,UAAUO,OAAO,EAAG,KACzFqB,EAAQzD,OAASyD,EAAQxB,OAAOnB,GAAGrX,WACnCmb,EAAYR,KAAKX,EAAQvF,SAASN,YAAa6F,EAAQzD,QACvD4E,EAAYR,KAAK,SAAUX,EAAQzD,UAI3C,IAAIsM,EAAWpP,EAAE4G,QAAQL,EAAQzD,OAAQyD,EAAQ9D,aAEf,GAA9B8D,EAAQ9D,YAAYhxB,QAEpB80B,EAAQ9D,YAAY7tB,KAAK2xB,EAAQ9D,YAAY,IAEjD8D,EAAQlF,aAAa+F,KAAK,CAACC,EAAGC,KAC1BA,EAAOxc,WAAWM,cAAc,CAC5B9T,MAAO83B,EACPj8B,MAAO,CACHnC,IAAK,EACLD,IAAKw1B,EAAQ9D,YAAYhxB,OAAS,KAI1C61B,EAAOxc,WAAWC,GAAG,SAAU,CAACpc,EAAO6L,KACnC,IAAI60B,GAAU9I,EAAQ9D,YAAY5S,SAASlhB,EAAM6L,KAC7C80B,EAASD,GAAUxf,SAAS0W,EAAQzD,QACxCyD,EAAQzD,OAASuM,EAAOj6B,QAAQ,GAChCsyB,EAAYR,KAAKX,EAAQvF,SAASN,YAAa2O,EAAOj6B,QAAQ,IAC9DsyB,EAAYR,KAAK,SAAUmI,EAAOj6B,QAAQ,IAE1C,IAAI4xB,EAAaT,EAAQrE,kBAAkBzd,KAAK,wBAC5C8qB,EAAiBvI,EAAWtjB,KAAK,gBACjC8rB,EAAiBxI,EAAWtjB,KAAK,gBAYrC,GAVAsc,EAAEoH,KAAKb,EAAQrE,kBAAkBzd,KAAK,kBAAkB,SAAUlQ,EAAOm0B,GACZv2B,MAArDo0B,EAAQ/D,QAAQxC,EAAE0I,GAAUhlB,KAAK,mBACjCsc,EAAE0I,GAAU+G,YAAY,WAAW,GACnC7F,KAAK5J,EAAE0I,GAAUhlB,KAAK,gBAAkB,uBAOOvR,MAAnDo0B,EAAQ/D,QAAQ+M,GAAgBhJ,EAAQzD,QAAsB,CAC1C,KAAhByD,EAAQxD,MAA+B,KAAhBwD,EAAQxD,OAC/BwD,EAAQxD,KAAO,KAEnB/C,EAAEoH,KAAKb,EAAQ/D,SAAS,SAAUkG,EAAUkE,GACxC,GAAiDz6B,MAA7Co0B,EAAQ/D,QAAQkG,GAAUnC,EAAQzD,QASlC,OARAyM,EAAiB7G,EAE8Cv2B,MAA3Do0B,EAAQ/D,QAAQkG,GAAUnC,EAAQzD,QAAQyD,EAAQxD,QAClDwD,EAAQxD,KAAO30B,OAAO+N,KAAKoqB,EAAQ/D,QAAQkG,GAAUnC,EAAQzD,SAAS,IAG1EkE,EAAaT,EAAQrE,kBAAkBzd,KAAK,sBAAsBikB,MAAa3B,GAAG,GAClFW,EAAYR,KAAKX,EAAQvF,SAASL,YAAaqG,EAAWtjB,KAAK,YACxD,KAGf,IAAIgsB,EAAWnJ,EAAQrE,kBAAkBzd,KAAK,sBAAsB8qB,MAAmB7rB,KAAK,UAC5FjO,KAAKk6B,UAAUD,GACX1P,EAAE,iBAAiB4P,GAAG,aAAa5P,EAAE,QAAQ0G,QAAQ,cAEtD,GAAsB,OAAlB6I,GAAqDp9B,MAA1Bo0B,EAAQ/D,QAAa,KAA4DrwB,MAA1Co0B,EAAQ/D,QAAa,IAAE+D,EAAQzD,QAAsB,CAE9H,GAAe,KADDrtB,KAAK2vB,QAAQ72B,IAAI,WACX,CAChBghC,EAAiB,MACjB,IAAIG,EAAWnJ,EAAQrE,kBAAkBzd,KAAK,sBAAsB8qB,MAAmB7rB,KAAK,UAC5FjO,KAAKk6B,UAAUD,GACfnJ,EAAQtF,mBAAmBxc,KAAK,2BAA2B2jB,KAAK,wBAAwB1B,QAAQ,UAIxGH,EAAQtF,mBAAmBxc,KAAK,4BAA4BsK,KAAKiY,EAAWtjB,KAAK,uBAEjF,IAAImsB,EAAUR,EAAO5B,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAuB,IAC/EnH,EAAQtF,mBAAmBxc,KAAK,qDAAqDsK,KAAK,GAAG8gB,GAC7FtJ,EAAQtF,mBAAmBxc,KAAK,kCAAkCof,IAAI,GAAGgM,GACzEtJ,EAAQtF,mBAAmBxc,KAAK,oBAAoBof,IAAIwL,GAExDrP,EAAE,4BAA4B6D,IAAIwL,GAElC,IAAIS,EAAe5+B,MAAM2F,KAAK0vB,EAAQ7D,WAAWljB,UAGoBrN,MAAjEo0B,EAAQ/D,QAAQ+M,GAAgBhJ,EAAQzD,QAAQyD,EAAQxD,OAGxD/C,EAAEoH,KAAKkI,EAAQ/I,EAAQ7D,UAAYoN,GAAc,SAAUv7B,EAAOw7B,GAC9D,GAAgE59B,MAA5Do0B,EAAQ/D,QAAQ+M,GAAgBhJ,EAAQzD,QAAQiN,GAMhD,OALAxJ,EAAQxD,KAAOgN,EAEfrI,EAAYR,KAAKX,EAAQvF,SAASJ,UAAWmP,GAC7CrI,EAAYR,KAAK,OAAQ6I,GACzBxJ,EAAQ9E,kBAAkBhd,KAAK,UAAUsrB,MAAY7a,KAAK,WAAW,IAC9D,KAMnBoT,EAAM0H,eAAeT,EAAgBC,KAGzClI,EAAOxc,WAAWC,GAAG,SAAWpc,IAG5B8G,KAAK0vB,uBAAwB,EAC7B1vB,KAAKw6B,uBAMT1J,EAAQzb,WAAawc,EAAOxc,aAIpC,mBACkBrV,KAAK4pB,IAEX6Q,mBAGZ,UAAUC,GACN,IAAI5J,EAAU9wB,KAAK4pB,IAEf+Q,EAAa7J,EAAQjF,YAAYpa,WACjCmpB,EAAa9J,EAAQnF,WAAWla,WAEpC,GAAIkpB,EAAW3+B,OAAS,EAAG,CACvB,IAAI6+B,EAAUF,EAAWz+B,IAAI0+B,GAAYz/B,YAAY,UAAU6Q,OAAO,gBAAgB0uB,MAEtFG,EAAQ5/B,SAAS,UAEjB+E,KAAKy6B,iBAAiBI,EAAQ7uB,OAAO,wBAAwB,GAE7DhM,KAAK86B,aAAaD,EAAQ7uB,OAAO,4BAC9B,CACH,IAAI6uB,EAAU/J,EAAQpE,iBAAiB1gB,OAAO,gBAAgB0uB,MAE9D16B,KAAK86B,aAAaD,IAI1B,aAAaA,GACT,IAAI/J,EAAU9wB,KAAK4pB,IACfqI,EAAcjyB,KAAK2vB,QACnBoL,EAAKjK,EAAQxG,QACbwH,GAAM+I,EAAQ5sB,KAAK,UACnBsjB,EAAaT,EAAQrE,kBAAkBzd,KAAK,gBAAgB8iB,MAC5DgI,EAAiBvI,EAAWtjB,KAAK,gBACjC+sB,EAAgBzJ,EAAWtjB,KAAK,0BAA0BtO,QAAQ,GAClEs7B,EAAc1J,EAAWtjB,KAAK,wBAAwBtO,QAAQ,GAkBlE,GAfI4xB,EAAWv1B,OAAS,EACpBu1B,EAAWt2B,SAAS,UAAU+gB,SAAS0d,WAAW1qB,KAAK,wBAAwB7T,YAAY,UAE3F21B,EAAQrE,kBAAkBzd,KAAK,wBAAwB7T,YAAY,UAGvE21B,EAAQrG,SAASzb,KAAK,qBAAqBpQ,QAAQ,MAAM1C,IAAI40B,EAAQrG,SAASzb,KAAK,iBAAiB0iB,OAA2F,MAApFZ,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,sBACvK6iB,EAAQrG,SAASzb,KAAK,oBAAoBpQ,QAAQ,MAAM1C,IAAI40B,EAAQrG,SAASzb,KAAK,gBAAgB0iB,OAA2F,MAApFZ,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,sBAG9GvR,MAAnDo0B,EAAQ/D,QAAQ+M,GAAgBhJ,EAAQzD,UACxCyD,EAAQzD,OAAS2N,EACjBlK,EAAQzb,WAAWG,IAAI+U,EAAE4G,QAAQ6J,EAAelK,EAAQ9D,eAGStwB,MAAjEo0B,EAAQ/D,QAAQ+M,GAAgBhJ,EAAQzD,QAAQyD,EAAQxD,MAAoB,CAC5E,IAAIuM,GAAQ,EAEZtP,EAAEoH,KAAKkI,EAAQ/I,EAAQ7D,UAAYoN,cAAc,SAAUv7B,EAAOw7B,GAC9D,GAAgE59B,MAA5Do0B,EAAQ/D,QAAQ+M,GAAgBhJ,EAAQzD,QAAQiN,GAMhD,OALAxJ,EAAQxD,KAAOgN,EAEfrI,EAAYR,KAAKX,EAAQvF,SAASJ,UAAWmP,GAC7CrI,EAAYR,KAAK,OAAQ6I,GACzBxJ,EAAQ9E,kBAAkBhd,KAAK,UAAUsrB,MAAY7a,KAAK,WAAW,IAC9D,KA0CnB,GApCmB,KAAfwb,GAAqC,KAAfA,GAAwC,MAAlBnB,GAA2C,KAAhBhJ,EAAQxD,MAAkF5wB,MAAjEo0B,EAAQ/D,QAAQ+M,GAAgBhJ,EAAQzD,QAAQyD,EAAQxD,QACxJwD,EAAQxD,KAAO2N,EAEfhJ,EAAYR,KAAKX,EAAQvF,SAASJ,UAAW2F,EAAQxD,MACrD2E,EAAYR,KAAK,OAAQX,EAAQxD,OAGrCwD,EAAQ9E,kBAAkBhd,KAAK,UAAU8hB,EAAQxD,SAAS7N,KAAK,WAAW,GACrEqR,EAAQlG,QACU,KAAfqQ,GAAqC,KAAfA,GAAwC,MAAlBnB,EAC5ChJ,EAAQ9E,kBAAkBhd,KAAK,UAAUisB,MAAgBr8B,QAAQ,MAAMzD,YAAY,YAAYu+B,WAAWz+B,SAAS,YAEnH61B,EAAQ9E,kBAAkBhd,KAAK,uBAAuBpQ,QAAQ,MAAM3D,SAAS,YAAYy+B,WAAWv+B,YAAY,aAInDuB,MAAjEo0B,EAAQ/D,QAAQ+M,GAAgBhJ,EAAQzD,QAAQyD,EAAQxD,OAGxD/C,EAAEoH,KAAKb,EAAQ9D,aAAa,SAAUluB,EAAOw7B,GACzC,GAAgD59B,MAA5Co0B,EAAQ/D,QAAQ+M,GAAgBQ,IAAmF59B,MAA1Do0B,EAAQ/D,QAAQ+M,GAAgBQ,GAASxJ,EAAQxD,MAO1G,OANAwD,EAAQzD,OAASiN,EAEjBrI,EAAYR,KAAKX,EAAQvF,SAASN,YAAaqP,GAC/CrI,EAAYR,KAAK,SAAU6I,GAE3BxJ,EAAQzb,WAAWG,IAAI+U,EAAE4G,QAAQmJ,EAASxJ,EAAQ9D,eAC3C,KASf+N,EAAGltB,SAAWuM,SAAS,IAAU,KAAI,CAErC,IAAIxa,EAAOkxB,EAAQrE,kBAAkBzd,KAAK,wBAAwBtD,SAAS2E,KAAO,GAClFygB,EAAQrE,kBAAkByO,OAAOl5B,QAAQ,CAAE/E,WAAY,GAAG2C,GAAU,MAI5E,2BACI,IAAIkxB,EAAU9wB,KAAK4pB,IACfmR,EAAKjK,EAAQxG,QAMjB,GAJIwG,EAAQtG,cAAcxuB,OAAS,GAAK80B,EAAQtF,mBAAmB2O,GAAG,aAClErJ,EAAQtG,cAAcwP,YAAY,UAAWe,EAAG19B,YAAcyzB,EAAQtF,mBAAmB1d,UAGzFitB,EAAGltB,SAAWuM,SAAS,IAAU,KAEjC,YADA0W,EAAQrE,kBAAkBtxB,YAAY,WAI1C,IAAIggC,EAAe5Q,EAAE,gBAAgBzc,SAAWyc,EAAE,2BAA2Bzc,SACzEstB,EAAU7Q,EAAE,mBAAmBzc,SAAWqtB,EAAe,GACzDE,EAAO9Q,EAAE,gBAAgBzc,SAE7BgjB,EAAQrE,kBAAkBuN,YAAY,UAAWe,EAAG19B,aAAe+c,SAASghB,EAAUC,IAG1F,uBACI,IAAIvK,EAAU9wB,KAAK4pB,IACfiJ,EAAQ7yB,KAER8wB,EAAQzE,iBAAiBrwB,OAAS,GAClC80B,EAAQzE,iBAAiB/W,GAAG,SAAW9a,IACnCA,EAAED,iBACFu2B,EAAQxE,kBAAoB/B,EAAE/vB,EAAEw2B,eAAemJ,GAAG,YAClD,IAAI5I,EAAaT,EAAQrE,kBAAkBzd,KAAK,wBAC5C8qB,EAAiBvI,EAAWtjB,KAAK,gBACjC8rB,EAAiBxI,EAAWtjB,KAAK,gBAGrC4kB,EAAM0H,eAAeT,EAAgBC,KAKjD,qBAII,GAHc/5B,KAAK4pB,IACFU,QAEVzc,QAAUuM,SAAS,IAAU,MAAMpa,KAAK0vB,uBAAuD,GAA9BnF,EAAE,kBAAkBvuB,OACxF,OAGJ,IAAIm/B,EAAe5Q,EAAE,gBAAgBzc,SAAWyc,EAAE,2BAA2Bzc,SAC/Dyc,EAAE,mBAAmBzc,SACxByc,EAAE,gBAAgBzc,SAC7B9N,KAAK0vB,uBAAwB,EAKjC,oBACI,IAAIoB,EAAU9wB,KAAK4pB,IACf0R,EAAexK,EAAQjF,YAAYpa,SAAS,WAEhDqf,EAAQ3E,aAAahxB,YAAY,UAE7BmgC,EAAanB,GAAG,gBAChBrJ,EAAQ3E,aAAangB,OAAO,qBAAqB/Q,SAAS,UACnDqgC,EAAanB,GAAG,gBACvBrJ,EAAQ3E,aAAangB,OAAO,qBAAqB/Q,SAAS,UAIlE,mBACkB+E,KAAK4pB,IAEXoC,kBAAkB1W,GAAG,QAAS,wBAAyB,KAC3DtV,KAAK0vB,uBAAwB,EAC7B1vB,KAAKw6B,uBAIb,wBACI,IAAI1J,EAAU9wB,KAAK4pB,IACfqI,EAAcjyB,KAAK2vB,QACnBkD,EAAQ7yB,KAEZ8wB,EAAQ9E,kBAAkB1W,GAAG,SAAU,4BAA8B9a,IACjE,IAAIo/B,EAASxf,SAASmQ,EAAE/vB,EAAEw2B,eAAe5C,OACrCmD,EAAaT,EAAQrE,kBAAkBzd,KAAK,wBAC5C8qB,EAAiBvI,EAAWtjB,KAAK,gBACjC8rB,EAAiBxI,EAAWtjB,KAAK,gBAGjC4rB,GAFctI,EAAWtjB,KAAK,wBAAwBtO,QAAQ,GAErDi6B,GAAUxf,SAAS0W,EAAQxD,OACpCiO,EAAUzK,EAAQxD,KACtB2E,EAAYR,KAAK,UAAW8J,GAC5BzK,EAAQxD,KAAOsM,EAEf3H,EAAYR,KAAKX,EAAQvF,SAASJ,UAAWyO,EAAOj6B,QAAQ,IAC5DsyB,EAAYR,KAAK,OAAQmI,EAAOj6B,QAAQ,IAExC,IAAI67B,EAAiB//B,MAAM2F,KAAK0vB,EAAQ9D,aAAajjB,UAkBrD,GAhBqErN,MAAjEo0B,EAAQ/D,QAAQ+M,GAAgBhJ,EAAQzD,QAAQyD,EAAQxD,OAGxD/C,EAAEoH,KAAKkI,EAAQ/I,EAAQ9D,YAAcwO,GAAgB,SAAU18B,EAAOw7B,GAClE,GAAgD59B,MAA5Co0B,EAAQ/D,QAAQ+M,GAAgBQ,IAAmF59B,MAA1Do0B,EAAQ/D,QAAQ+M,GAAgBQ,GAASxJ,EAAQxD,MAO1G,OANAwD,EAAQzD,OAASiN,EAEjBrI,EAAYR,KAAKX,EAAQvF,SAASN,YAAaqP,GAC/CrI,EAAYR,KAAK,SAAU6I,GAE3BxJ,EAAQzb,WAAWG,IAAI+U,EAAE4G,QAAQmJ,EAASxJ,EAAQ9D,eAC3C,KAKJ,KAAXuO,GAA6B,KAAXA,GAAqE7+B,MAAnDo0B,EAAQ/D,QAAQ+M,GAAgBhJ,EAAQzD,SAAyF3wB,MAAjEo0B,EAAQ/D,QAAQ+M,GAAgBhJ,EAAQzD,QAAQyD,EAAQxD,MAAoB,CAEhL/C,EAAEoH,KAAKb,EAAQ/D,SAAS,SAAUkG,EAAUkE,GACxC,GAAIlE,GAAY6G,EAAgB,CAC5B,GAAiDp9B,MAA7Co0B,EAAQ/D,QAAQkG,GAAUnC,EAAQzD,SAAmF3wB,MAA3Do0B,EAAQ/D,QAAQkG,GAAUnC,EAAQzD,QAAQyD,EAAQxD,MAI5G,OAHAwM,EAAiB7G,EAEjBhB,EAAYR,KAAKX,EAAQvF,SAASL,YAAa4F,EAAQrE,kBAAkBzd,KAAK,sBAAsBikB,MAAa3B,GAAG,GAAGrjB,KAAK,YACrH,EAgBP,GAbAsc,EAAEoH,KAAKkI,EAAQ/I,EAAQ9D,YAAcwO,GAAgB,SAAU18B,EAAOw7B,GAClE,GAA0C59B,MAAtCo0B,EAAQ/D,QAAQkG,GAAUqH,IAA6E59B,MAApDo0B,EAAQ/D,QAAQkG,GAAUqH,GAASxJ,EAAQxD,MAS9F,OARAwM,EAAiB7G,EACjBnC,EAAQzD,OAASiN,EAEjBrI,EAAYR,KAAKX,EAAQvF,SAASL,YAAa4F,EAAQrE,kBAAkBzd,KAAK,sBAAsBikB,MAAa3B,GAAG,GAAGrjB,KAAK,WAC5HgkB,EAAYR,KAAKX,EAAQvF,SAASN,YAAaqP,GAC/CrI,EAAYR,KAAK,SAAU6I,IAGpB,KAGXR,GAAkB7G,EAAU,OAAO,MAInD,IAAIgH,EAAWnJ,EAAQrE,kBAAkBzd,KAAK,sBAAsB8qB,MAAmB7rB,KAAK,UAC5FjO,KAAKk6B,UAAUD,GACfnJ,EAAQzb,WAAWG,IAAI+U,EAAE4G,QAAQL,EAAQzD,OAAQyD,EAAQ9D,cAI7D6F,EAAM0H,eAAeT,EAAgBC,KAS7C,eAAe0B,EAAYC,GACvB,IAEIC,EAFA7K,EAAU9wB,KAAK4pB,IACfwP,EAAWtI,EAAQxD,KAGvB,OAAQwD,EAAQpG,SAAS+E,OAAO,EAAG,IAC/B,IAAK,KACL,IAAK,KACGqB,EAAQnE,eAAe3wB,OAAS,IACuCU,MAAnEo0B,EAAQ/D,QAAQ0O,GAAY3K,EAAQzD,QAAQyD,EAAQxD,KAAO,KACM5wB,MAA7Do0B,EAAQ/D,QAAQ0O,GAAY3K,EAAQzD,QAAQyD,EAAQxD,OACpD8L,GAAsB,IACtBtI,EAAQzE,iBAAiB5M,KAAK,WAAW,GACzCqR,EAAQnE,eAAe1xB,SAAS,aAEhC61B,EAAQzE,iBAAiB5M,KAAK,UAAWqR,EAAQxE,mBACjD8M,GAAuBtI,EAAQxE,kBAAoB,IAAM,GACzDwE,EAAQnE,eAAexxB,YAAY,aAGvC21B,EAAQzE,iBAAiB5M,KAAK,WAAW,GACzCqR,EAAQnE,eAAe1xB,SAAS,aAGxC0gC,EAAgB7K,EAAQ/D,QAAQ0O,GAAY3K,EAAQzD,QAAQ+L,GAC5D,MACJ,IAAK,KAmBD,GAlBItI,EAAQlE,kBAAkB5wB,OAAS,IACqCU,MAApEo0B,EAAQ/D,QAAQ0O,GAAY3K,EAAQzD,QAAQyD,EAAQxD,KAAO,OAC3DwD,EAAQlE,kBAAkB5d,KAAK,0BAA0BgrB,YAAY,SAAUlJ,EAAQjE,wBACvFiE,EAAQlE,kBAAkB5d,KAAK,0BAA0BgrB,YAAY,UAAWlJ,EAAQjE,wBACxFiE,EAAQtF,mBAAmBxc,KAAK,6BAA6BpQ,QAAQ,KAAK8yB,OAAwE,MAAjEZ,EAAQlE,kBAAkB5d,KAAK,YAAYf,KAAK,eACjI6iB,EAAQtF,mBAAmBxc,KAAK,kBAAkB0iB,OAAwE,MAAjEZ,EAAQlE,kBAAkB5d,KAAK,YAAYf,KAAK,eACzGmrB,GAAuBtI,EAAQjE,uBAAyB,KAAO,GAC/DiE,EAAQlE,kBAAkB5d,KAAK,KAAK7T,YAAY,aAEqB,MAAjE21B,EAAQlE,kBAAkB5d,KAAK,YAAYf,KAAK,gBAChD6iB,EAAQlE,kBAAkB5d,KAAK,KAAKgrB,YAAY,UAChDlJ,EAAQtF,mBAAmBxc,KAAK,6BAA6BpQ,QAAQ,KAAK8yB,QAAO,IAErFZ,EAAQlE,kBAAkB5d,KAAK,0BAA0B/T,SAAS,YAEtE61B,EAAQvD,SAA4E,MAAjEuD,EAAQlE,kBAAkB5d,KAAK,YAAYf,KAAK,cAAwB,iBAAmB,gBAElH0tB,EAAgB7K,EAAQ/D,QAAQ0O,GAAY3K,EAAQzD,QAAQ+L,GAClC,oBAAf,UAA4B,CACnC,IAAIwC,EAAU,CACV,MAAS,4BACT,mBAAyG,MAApF9K,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,qBAA+B,UAAY,SAC5H,qBAAsB0tB,EAAcjG,iBACpC,cAAe,GAAK5E,EAAQzD,OAC5B,YAAayD,EAAQxD,KACrB,aAAc,GACd,YAAawD,EAAQvD,SACrB,eAAgBoO,EAAc1F,oBAG9BhM,KAAKC,UAAU2R,UAAUA,UAAU7/B,OAAS,KAAOiuB,KAAKC,UAAU0R,IAClEC,UAAU18B,KAAKy8B,IAQ/B,IAAIE,EAAYhL,EAAQtF,mBAAmB5sB,QAAQ,gBAC/Cm9B,EAA0B,KAAhBjL,EAAQxD,MAA+B,KAAhBwD,EAAQxD,MAA+B,KAAhBwD,EAAQxD,KAChEsL,EAAwD,OAA/C6C,EAAWhM,OAAOgM,EAAWz/B,OAAS,EAAG,GAClDggC,EAAoC,OAA3BP,EAAWhM,OAAO,EAAG,IAAiBgM,EAAWz4B,QAAQ,UAAY,GAAOy4B,EAAWz4B,QAAQ,UAAY,EAExH8tB,EAAQtD,KAAOmO,EAAchG,KAAKqC,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAuB,IAC5FnH,EAAQrD,aAAekO,EAAcxF,aAAa6B,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAuB,IAC5GnH,EAAQjD,KAAO8N,EAAcjG,iBAAiBsC,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAwB+D,GAA+B,GAAtBL,EAAchG,KAAa,EAAI,IACjJ7E,EAAQ/tB,IAAM44B,EAAc1F,mBAAmB+B,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAwB+D,GAA+B,GAAtBL,EAAchG,KAAa,EAAI,IAClJ7E,EAAQhD,IAAM6N,EAAc9F,qBAAqBmC,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAuB,IAC3GnH,EAAQ/C,iBAAmB4N,EAAc5N,iBACzC+C,EAAQmL,KAAO/8B,WAAW4xB,EAAQzD,QAAUyD,EAAQtB,aAAawI,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAuB,EAAGiE,sBAAuB,IACrJpL,EAAQqL,MAAQrL,EAAQtB,YAAYwI,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAuB,EAAGiE,sBAAuB,IACxHpL,EAAQpD,cAAiBiO,EAAwB,WAAE3D,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAuB,IAC7GnH,EAAQnD,SAAYgO,EAA4B,eAAE3D,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAuB,IAC5GnH,EAAQlD,kBAAqB+N,EAAiC,oBAAE3D,eAAelH,EAAQpG,SAAU,CAAEuN,sBAAuB,IAE1HnH,EAAQtF,mBAAmBxc,KAAK,kCAAkCgrB,YAAY,WAAkC,GAAtB2B,EAAchG,MACxG7E,EAAQtF,mBAAmBxc,KAAK,eAAeof,IAAIuN,EAAchG,MACjE7E,EAAQtF,mBAAmBxc,KAAK,iEAAiEsK,KAAKwX,EAAQjD,MAC9GiD,EAAQjF,YAAY7c,KAAK,kCAAkCsK,KAAKwX,EAAQjD,MACxEiD,EAAQtF,mBAAmBxc,KAAK,eAAeof,IAAIuN,EAAcjG,kBACjE5E,EAAQtF,mBAAmBxc,KAAK,4BAA4BsK,KAAKc,SAASgf,IAC1EtI,EAAQtF,mBAAmBxc,KAAK,wBAAwBsK,KAAKwX,EAAQpD,eACrEoD,EAAQtF,mBAAmBxc,KAAK,wCAAwCsK,KAAKwX,EAAQrD,cACrFqD,EAAQtF,mBAAmBxc,KAAK,6BAA6BsK,KAAKwX,EAAQlD,mBAC1EkD,EAAQtF,mBAAmBxc,KAAK,aAAasK,KAAKwX,EAAQmL,KAC1DnL,EAAQtF,mBAAmBxc,KAAK,eAAesK,KAAKwX,EAAQqL,OAC5DrL,EAAQtF,mBAAmBxc,KAAK,sCAAsCsK,KAAKwX,EAAQhD,KAEnFgD,EAAQtF,mBAAmBxc,KAAK,kDAAkDsK,KAAKwX,EAAQtD,MAC/FsD,EAAQtF,mBAAmBxc,KAAK,kCAAkCsK,KAAKwX,EAAQ/tB,KAC/E+tB,EAAQtF,mBAAmBxc,KAAK,mBAAmBsK,KAAKwX,EAAQnD,UAChEmD,EAAQtF,mBAAmBxc,KAAK,wBAAwBsK,KAAKwX,EAAQpD,eAEhC,MAAjCoD,EAAQpG,SAAS+E,OAAO,EAAG,IAAcqB,EAAQpF,oBAAoB1vB,OAAS,IAC9E80B,EAAQpF,oBAAoB1c,KAAK,aAAasK,KAAKwX,EAAQtD,MAC3DsD,EAAQpF,oBAAoB1c,KAAK,wBAAwBsK,KAAKwX,EAAQpD,eACtEoD,EAAQpF,oBAAoB1c,KAAK,mBAAmBsK,KAAKwX,EAAQnD,UACjEmD,EAAQpF,oBAAoB1c,KAAK,aAAasK,KAAKwX,EAAQ/tB,KAC3D+tB,EAAQpF,oBAAoB1c,KAAK,aAAasK,KAAKwX,EAAQmL,MAE3DD,GACAzR,EAAE,wBAAwBxD,OAC1B+J,EAAQtF,mBAAmBxc,KAAK,oBAAoB0iB,QAAO,IAG3DZ,EAAQtF,mBAAmBxc,KAAK,oBAAoB0iB,QAAO,GAE/DoK,EAAU9sB,KAAK,0BAA0BsK,KAAKwX,EAAQ/tB,KAItD+4B,EAAU9sB,KAAK,SAASpQ,QAAQ,KAAK8yB,OAAOqK,GAC5C,IAAIK,EAAWN,EAAU9sB,KAAK,cAAcpQ,QAAQ,UAiCpD,GAhCKm9B,GAAQxR,EAAE6R,GAAUrV,OACzBwD,EAAE,2BAA6BA,EAAE6R,GAAUzR,KAAK,MAAQ,MAAM+G,OAAOqK,GACrEjL,EAAQtF,mBAAmBxc,KAAK,2BAA2B0iB,OAAOsK,GAClElL,EAAQtF,mBAAmBxc,KAAK,2BAA2B0iB,QAAQsK,GACnElL,EAAQtF,mBAAmBxc,KAAK,2BAA2B0iB,OAAOsK,GAClElL,EAAQtF,mBAAmBxc,KAAK,2BAA2B0iB,QAAQsK,GACnElL,EAAQtF,mBAAmBxc,KAAK,iCAAiC0iB,OAAOsK,IAAUpD,GAClF9H,EAAQtF,mBAAmBxc,KAAK,iCAAiC0iB,OAAOkH,IAAUoD,GAClFlL,EAAQtF,mBAAmBxc,KAAK,iCAAiC0iB,QAAQkH,IAAUoD,GAC/EpD,EACA9H,EAAQtF,mBAAmBxc,KAAK,qBAAqBqjB,OAAOgK,YAAYvL,EAAQtF,mBAAmBxc,KAAK,uBAExG8hB,EAAQtF,mBAAmBxc,KAAK,qBAAqB+X,OAAOuV,aAAaxL,EAAQtF,mBAAmBxc,KAAK,uBAE7Gub,EAAE,uBAAuB6D,IAAIuN,EAAc5N,kBAC3CxD,EAAE,yBAAyB6D,IAAIuN,EAAc1F,oBAEzCnF,EAAQ9C,WACR8N,EAAU9sB,KAAK,iDAAiDof,IAAI0C,EAAQzD,QAC5EyO,EAAU9sB,KAAK,iDAAiDof,IAAI0C,EAAQxD,MAC5EwO,EAAU9sB,KAAK,uDAAuDof,IAAI0C,EAAQ/C,kBAClF+N,EAAU9sB,KAAK,sBAAsBof,IAAIsN,GACzCI,EAAU9sB,KAAK,eAAeof,IAAI0C,EAAQjD,OAE1CiD,EAAQ7C,WACR6N,EAAU9sB,KAAK,iDAAiDof,IAAI0C,EAAQzD,QAC5EyO,EAAU9sB,KAAK,iDAAiDof,IAAI0C,EAAQxD,MAC5EwO,EAAU9sB,KAAK,uDAAuDof,IAAI0C,EAAQ/C,kBAClF+N,EAAU9sB,KAAK,sBAAsBof,IAAIsN,GACzCI,EAAU9sB,KAAK,eAAeof,IAAI0C,EAAQjD,OAG1C7tB,KAAK4pB,IAAIsE,OAAOS,KAAO,EAAG,CAC1B,IAAI4N,EAAcniB,SAAS0W,EAAQzD,SAAWrtB,KAAK4pB,IAAIsE,OAAOS,MAAQvU,SAAS0W,EAAQxD,OAASttB,KAAK4pB,IAAIsE,OAAOU,MAAQxU,SAAS0W,EAAQjD,OAAS7tB,KAAK4pB,IAAIsE,OAAOW,KAClKtE,EAAE,qBAAqBmH,OAAO6K,GAC9BhS,EAAE,qBAAqBmH,QAAQ6K,GACK7/B,MAAhCsD,KAAK4pB,IAAIsE,OAAOa,cAA2BxE,EAAE,aAAa6D,IAAImO,EAAav8B,KAAK4pB,IAAIsE,OAAOa,aAAe/uB,KAAK4pB,IAAIsE,OAAOmB,gBACxF3yB,MAAlCsD,KAAK4pB,IAAIsE,OAAOc,gBAA6BzE,EAAE,eAAe6D,IAAImO,EAAav8B,KAAK4pB,IAAIsE,OAAOc,eAAiBhvB,KAAK4pB,IAAIsE,OAAOgB,WACpI3E,EAAE,sBAAsB6D,IAAImO,EAAa,QAAU,SAI3D,iBAAiBC,EAAOC,GAAc,GAClC,IAAI3L,EAAU9wB,KAAK4pB,IACfhqB,EAAO,EAEP68B,GACAz8B,KAAKk6B,UAAUsC,EAAM7R,KAAK,gBAG9B3qB,KAAK08B,oBAGD98B,EADA48B,EAAMrC,GAAG,gBACF,EAEA,GAAKqC,EAAM19B,QAGtBgyB,EAAQjF,YAAY5U,IAAI,YAAa,gBAAgBrX,aAGzD,oBACI,IAAIkxB,EAAU9wB,KAAK4pB,IACfqI,EAAcjyB,KAAK2vB,QAEvBmB,EAAQrE,kBAAkBzd,KAAK,iBAAiBsG,GAAG,QAAU9a,IACzDA,EAAED,iBACF,IAAIoiC,EAAWpS,EAAE/vB,EAAEw2B,eACfc,EAAK6K,EAAS1uB,KAAK,UACnB+sB,EAAgB2B,EAAS1uB,KAAK,0BAA0BtO,QAAQ,GAChEs7B,EAAc0B,EAAS1uB,KAAK,wBAAwBtO,QAAQ,GAChEg9B,EAAS1hC,SAAS,UAAU+gB,SAAS0d,WAAW1qB,KAAK,WAAW7T,YAAY,UAEvC,MAAjC21B,EAAQpG,SAAS+E,OAAO,EAAG,KAE3BqB,EAAQzD,OAAS2N,EACjBlK,EAAQxD,KAAO2N,GAGnBnK,EAAQzb,WAAWG,IAAI+U,EAAE4G,QAAQL,EAAQzD,OAAQyD,EAAQ9D,cACzD8D,EAAQ9E,kBAAkBhd,KAAK,UAAU8hB,EAAQxD,SAAS7N,KAAK,WAAW,GAG1EwS,EAAYR,KAAKX,EAAQvF,SAASL,YAAa4G,GAC/CG,EAAYR,KAAKX,EAAQvF,SAASN,YAAa6F,EAAQzD,QACvD4E,EAAYR,KAAK,SAAUX,EAAQzD,QACnC4E,EAAYR,KAAKX,EAAQvF,SAASJ,UAAW2F,EAAQxD,MACrD2E,EAAYR,KAAK,OAAQX,EAAQxD,MAE7BwD,EAAQjF,YAAY7vB,OAAS,GAAK80B,EAAQxG,QAAQzc,QAAUuM,SAAS,IAAU,MAC/Epa,KAAK0vB,uBAAwB,EAC7B1vB,KAAKw6B,qBACLx6B,KAAKy6B,iBAAiB3J,EAAQjF,YAAYpa,SAAS,gBAAgBqgB,QAEnE9xB,KAAKk6B,UAAUpI,KAKvBvH,EAAE,+BAA+BhV,IAAI,SAASD,GAAG,QAAU9a,IACvD+vB,EAAE,eAAemH,WAIzB,sBACI,IAAI3yB,EAAOiB,KACXuqB,EAAE,2BAA2BjV,GAAG,QAAU9a,IACtCA,EAAED,iBACFwE,EAAK69B,yBAIb,kBACI,IAAI9L,EAAU9wB,KAAK4pB,IACfqI,EAAcjyB,KAAK2vB,QAEvBmB,EAAQ7E,QAAQ3W,GAAG,QAAU9a,IACzBA,EAAED,iBACF,IAAIsiC,ECn6Ce,CAACj/B,IAC5B,IAAI2d,EAAS,GAMb,OAJA3d,EAAI4F,QAASs5B,IACTvhB,EAAOuhB,EAAKtkC,MAAQskC,EAAK5jC,QAGtBqiB,GD45CgBwhB,CAAgBjM,EAAQtF,mBAAmBwR,kBACtDC,EAAuE,GAA1DnM,EAAQrE,kBAAkBzd,KAAK,iBAAiBhT,QAAmG,MAApF80B,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,qBACxIivB,EAAuD,GAApCpM,EAAQlE,kBAAkB5wB,QAAgF,MAAjE80B,EAAQlE,kBAAkB5d,KAAK,YAAYf,KAAK,cAC5GkvB,EAAoI,GAA9GrM,EAAQtF,mBAAmBxc,KAAK,oEAAoEhT,OAC9Hi2B,EAAYR,KAAKX,EAAQvF,SAASF,cAAewR,GACjDtS,EAAE,mBAAmB8H,OACrB,IAAI+K,EAAmB,CACnB,OAAUtM,EAAQzD,OAClB,gBAAmByD,EAAQzD,OAC3B,OAAUyD,EAAQxD,KAClB,cAAiBwD,EAAQxD,KACzB,IAAOwD,EAAQtD,KACf,IAAOsD,EAAQ/tB,IACf,WAAek6B,EAAYnM,EAAQjD,KAAO,GAC1C,UAAeoP,EAA2B,GAAfnM,EAAQjD,KACnC,qBAAyBoP,EAAY,UAAY,SACjD,iBAAqBC,EAAkB,iBAAmB,eAC1D,YAAepM,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,gBAC3E,YAAe6iB,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,gBAC3E,kBAAqB6iB,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,sBACjF,YAAe6iB,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,gBAC3E,gBAAmB6iB,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,qBAC/E,sBAAyB6iB,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,0BACrF,gBAAmB6iB,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,qBAC/E,8BAAiC6iB,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,mCAC7F,2BAA8B6iB,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,gCAC1F,qBAAwB6iB,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,qBACpF,cAAiB6iB,EAAQrE,kBAAkBzd,KAAK,wBAAwBf,KAAK,0BAC7E,aAAgB6iB,EAAQrD,aACxB,cAAiBqD,EAAQpD,cACzB,aAAgBoD,EAAQuM,YACxB,iBAAoBvM,EAAQ/C,iBAC5B,mBAAuBoP,EAAqB,EAAI,GAgBpD,GAZA9I,YAAY,wBAAyB,QAAQ,EAAO+I,GAEpD,SAAiCE,EAAQC,GACrCpJ,KAAK,SAAWlK,KAAKC,UAAUkT,OASA,GAA/B7S,EAAE,mBAAmBvuB,OAAa,CAGlC,GAAwD,GAApDuuB,EAAE,wCAAwCvuB,OAAa,CACvD,IAAIwhC,EAAkBjT,EAAE/vB,EAAEw2B,eAAepyB,QAAQ,cAAcoQ,KAAK,wCAAwCof,MACxGqP,EAAe3M,EAAQ/tB,IAC3BwnB,EAAEmT,KAAK,CACHC,IAAK,iDACLpyB,KAAM,OACN0C,KAAM,0BAA4BuvB,EAAkB,qBAAuBC,EAAe,KAC1FG,YAAa,kCACbC,OAAO,EACPC,OAAO,EACPC,QAAS,SAAUxiB,KAEnByiB,SAAU,SAAU/vB,OAQ5BtR,OAAO2X,SAAWiW,EAAE/vB,EAAEw2B,eAAerG,KAAK,WAMtD,qBACI,IAAImG,EAAU9wB,KAAK4pB,IAGfyD,GAFcrtB,KAAK2vB,aAEiBjzB,IAA3B6tB,EAAE,eAAe6D,OAAuB7D,EAAE,eAAe6D,MAAMpyB,OAAS,EAAIuuB,EAAE,eAAe6D,MAAmB,SACzH6P,OAAuDvhC,IAArC6tB,EAAE,yBAAyB6D,OAAuB7D,EAAE,yBAAyB6D,MAAMpyB,OAAS,EAAIuuB,EAAE,yBAAyB6D,MAAmB,QAIpK0C,EAAQ7E,QAAQ3W,GAAG,QAAU9a,IACzBA,EAAED,iBACFgwB,EAAE,mBAAmB8H,OACrB,IAAI+K,EAAmB,CACnB,OAAU/P,EACV,gBAAmB4Q,EACnB,OAAU,KACV,cAAiB,KACjB,IAAO,GACP,IAAO,GACP,WAAc,GACd,UAAa,GACb,qBAAwB,GACxB,iBAAoB,GACpB,YAAe,GACf,YAAe,GACf,kBAAqB,QACrB,YAAe,KACf,gBAAmB,QACnB,sBAAyB,KACzB,gBAAmB,KACnB,8BAAiC,OACjC,2BAA8B,OAC9B,qBAAwB,QACxB,cAAiB,KACjB,aAAgB,GAChB,cAAiB,GACjB,mBAAsB,GAI1B5J,YAAY,wBAAyB,QAAQ,EAAO+I,GAEpD,SAAiCE,EAAQC,GACrCpJ,KAAK,SAAWlK,KAAKC,UAAUkT,OAGnCzgC,OAAO2X,SAAWiW,EAAE/vB,EAAEw2B,eAAerG,KAAK,UAIlD,oBACI,IAAImG,EAAU9wB,KAAK4pB,IACfqI,EAAcjyB,KAAK2vB,QAEvBmB,EAAQ3E,aAAa7W,GAAG,QAAU9a,IAC9BA,EAAED,iBACF,IAAI2jC,EAAUpN,EAAQjF,YAAYpa,WAC9BjN,EAAY+lB,EAAE/vB,EAAEw2B,eAAelG,SAAS,oBAAsB,OAAS,OACvE0R,EAAQ0B,EAAQ5M,GAAiB,SAAd9sB,EAAuB05B,EAAQlyB,OAAO,WAAWlN,QAAU,EAAIo/B,EAAQlyB,OAAO,WAAWlN,QAAU,GAEtHgzB,EAAK0K,EAAMvuB,KAAK,UAChB0uB,EAAW7L,EAAQpE,iBAAiB1gB,OAAO,gBAAgB8lB,MAC3DkJ,EAAgB2B,EAAS1uB,KAAK,0BAA0BtO,QAAQ,GAChEs7B,EAAc0B,EAAS1uB,KAAK,wBAAwBtO,QAAQ,GAChEg9B,EAAS1hC,SAAS,UAAU+gB,SAAS0d,WAAW1qB,KAAK,WAAW7T,YAAY,UAE5E21B,EAAQzD,OAAS2N,EACjBlK,EAAQxD,KAAO2N,EACfhJ,EAAYR,KAAK,UAAWwJ,GAC5BnK,EAAQzb,WAAWG,IAAI+U,EAAE4G,QAAQ6J,EAAelK,EAAQ9D,cACxD8D,EAAQ9E,kBAAkBhd,KAAK,UAAUisB,MAAgBxb,KAAK,WAAW,GAGzEwS,EAAYR,KAAKX,EAAQvF,SAASL,YAAa4G,GAC/CG,EAAYR,KAAKX,EAAQvF,SAASN,YAAa+P,GAC/C/I,EAAYR,KAAKX,EAAQvF,SAASJ,UAAW8P,GAC7ChJ,EAAYR,KAAK,OAAQwJ,GAEzBj7B,KAAKy6B,iBAAiB+B,KAI9B,yBACI,IAAI1L,EAAU9wB,KAAK4pB,IACfW,EAAE,mBAAmBvuB,OAAS,GFn+C3B,oBACJ,IAAI6sB,EAAYjkB,EAAQoJ,EAAU8a,GEm+CjC,CAAYyB,EAAE,mBAAmB,GAAK/lB,IAClC,IAAI25B,EAASrN,EAAQ3E,aAAangB,OAAO,iBAA8B,UAAdxH,EAAwB,OAAS,SAErF25B,EAAOrT,SAAS,WACjBqT,EAAOC,SAEZ,IAIX,uBACI,IAAItN,EAAU9wB,KAAK4pB,IAEnBkH,EAAQ1E,YAAY9W,GAAG,QAAU9a,IAC7BA,EAAED,iBACF,IAAI8jC,EAAO9T,EAAE/vB,EAAEw2B,eACX93B,GAAS43B,EAAQzb,WAAWvc,MAEhCI,GAAiBmlC,EAAKvT,SAAS,YAAc,GAAK,EAElDgG,EAAQzb,WAAWG,IAAItc,KAI/B,cACI,IAAI43B,EAAU9wB,KAAK4pB,IACfkH,EAAQxG,QAAQzc,QAAUuM,SAAS,IAAU,MAAMmQ,EAAE,kBAAkBvuB,OAAS,GAAqC,GAAhCuuB,EAAE,oBAAoBvuB,QAC3GuuB,EAAE,6CAA6CtvB,SAAS,aAG5D61B,EAAQxG,QAAQhV,GAAG,SAAU,KACzBtV,KAAKiwB,6BAKb,oBACI,IAAIa,EAAU9wB,KAAK4pB,IACfiJ,EAAQ7yB,KAEZ8wB,EAAQlE,kBAAkBtX,GAAG,QAAS,kBAAoB9a,IACtDA,EAAED,iBACF,IAAI8jC,EAAO9T,EAAE/vB,EAAEw2B,eACfF,EAAQjE,uBAAqD,MAA3BwR,EAAKpwB,KAAK,cAE5CowB,EAAKpjC,SAAS,UAAU+gB,SAAS0d,WAAW1qB,KAAK,WAAW7T,YAAY,UAExE,IAAIo2B,EAAaT,EAAQrE,kBAAkBzd,KAAK,wBAC5C8qB,EAAiBvI,EAAWtjB,KAAK,gBACjC8rB,EAAiBxI,EAAWtjB,KAAK,gBAGrC4kB,EAAM0H,eAAeT,EAAgBC,KAK7C,oBACIxP,EAAE,mBAAmBjV,GAAG,QAAU9a,IAC9B,IAAIo/B,EAASrP,EAAE/vB,EAAEw2B,eAAe/iB,KAAK,WAAW6I,WACjCyT,EAAE4G,QAAQyI,EAAQ55B,KAAK4pB,IAAIoD,cAC1B,GACZhtB,KAAK4pB,IAAIvU,WAAWG,IAAI+U,EAAE4G,QAAQyI,EAAQ55B,KAAK4pB,IAAIoD,gBAK/D,uBACI,IAAIsR,EAAwB/T,EAAE,qBAAqBvb,KAAK,SAASyQ,KAAK,WAClE8e,EAAqBhU,EAAE,yBAAyB6D,MAChDoQ,EAAmBjU,EAAE,uBAAuB6D,MAE5CuP,EAAM,+CAAiDW,EAAwB,qCAAuCjjC,KAAKojC,SAArH,2CAAkLF,EAAqB,uBAAyBC,EACtO9jC,EAAIiM,SAASC,cAAc,KAE/B,GAAI,yBAAyB4I,KAAK3H,UAAUqI,WACxCxV,EAAEgkC,KAAOf,EACTjjC,EAAEkK,OAAS,SACXlK,EAAEoM,MAAQ,gBACVH,SAASzJ,KAAKoM,YAAY5O,GAC1BQ,YAAW,WAAcR,EAAE0jC,UAAY,SACpC,CACH,IAAIO,EAAQ,IAAItV,KAEZuV,EAAW,kBADHD,EAAME,UAAY,KAAOF,EAAMG,WAAa,GAAK,IAAMH,EAAMI,eAC/B,OACtCC,EAAM,IAAIC,eACdD,EAAIE,KAAK,MAAOvB,GAAK,GACrBqB,EAAIG,aAAe,OAEnBH,EAAII,OAAS,SAAU5kC,GACnB,GAAmB,KAAfwF,KAAKu9B,OAAe,CACpB,IAAI8B,EAAOr/B,KAAKs/B,SAChB,GAAIz3B,UAAU+I,WAAWkG,WAAW9T,QAAQ,QAAU,EAElDrG,OAAOkL,UAAU03B,WAAWF,EAAMT,OAE/B,CAEH,IAAIY,EAAU7iC,OAAO8iC,IAAIC,gBAAgB,IAAIC,KAAK,CAACN,GAAO,CAAE9zB,KAAM8zB,EAAK9zB,QACvE7Q,EAAEgkC,KAAOc,EACT9kC,EAAEklC,SAAWhB,EACblkC,EAAEoM,MAAQ,gBAKVpM,EAAE0jC,QACFzhC,OAAO8iC,IAAII,gBAAgBL,EAASZ,MAIhDI,EAAIc,QAIZ,wCACI9/B,KAAK4pB,IAAIa,SAASzb,KAAK,mDAAmDsG,GAAG,QAAU9a,IACnFA,EAAED,iBACFgwB,EAAE,mBAAmB8H,OACrB,IAAI0N,EAAkBxV,EAAEA,EAAE/vB,GAAG,GAAGoK,QAAQoX,SAASA,SAC7CgkB,EAAWD,EAAgB/wB,KAAK,yBAAyBf,OAEzDgyB,EAAQ,CACR,IAAOF,EAAgB/wB,KAAK,qBAAqBof,MACjD,gBAAmB2R,EAAgB/wB,KAAK,6BAA6Bof,MAAQ,MAAQ,MACrF,UAAa7D,EAAE,2BAA2B6D,MAC1C,oBAAuB,GACvB,eAAkB,CACd,gBAAmBhU,SAAS2lB,EAAgB/wB,KAAK,sBAAsBof,OACvE,cAAiBhU,SAAS2lB,EAAgB/wB,KAAK,+BAA+Bof,OAC9E,kBAAqB4R,EAASE,kBAAkBppB,WAChD,YAAekpB,EAASG,YACxB,gBAAmBH,EAASI,iBAAiBlf,cAC7C,sBAAyB8e,EAASK,sBAClC,gBAAmBL,EAASM,gBAC5B,8BAAiCN,EAASO,+BAA+Brf,cACzE,2BAA8B8e,EAASQ,4BAA4Btf,cACnE,qBAAwB8e,EAASS,iBAAiBvf,cAClD,cAAiB8e,EAASU,qBAAqB5pB,aAIvDud,YAAY,mCAAoC,QAAQ,EAAM4L,GAAO,SAAU1kB,GAC3EgP,EAAE,mBAAmBxD,OACjBxL,EAAOwiB,QACPxT,EAAEjW,UAAUqW,KAAK,OAAQoV,EAAgB/wB,KAAK,mCAAmCof,OAE5D,YAAjB7S,EAAOgiB,OACPhT,EAAEjW,UAAUqW,KAAK,OAAQoV,EAAgB/wB,KAAK,+BAA+Bof,OAG7E7D,EAAEjW,UAAUqW,KAAK,OAAQoV,EAAgB/wB,KAAK,gCAAgCof,a;;;;;EEntDtG,SAASjT,IAeP,OAdAA,EAAWxiB,OAAOyiB,QAAU,SAAUxW,GACpC,IAAK,IAAI3M,EAAI,EAAGA,EAAImhB,UAAUpd,OAAQ/D,IAAK,CACzC,IAAIuT,EAAS4N,UAAUnhB,GAEvB,IAAK,IAAIuB,KAAOgS,EACV7S,OAAOkB,UAAUC,eAAe1B,KAAKoT,EAAQhS,KAC/CoL,EAAOpL,GAAOgS,EAAOhS,IAK3B,OAAOoL,IAGO3D,MAAMjB,KAAMoZ,WAG9B,IAEIlD,EAA8B,oBAAXvZ,QAA8C,oBAAbgK,SACpDg6B,EAAKzqB,EAAYrO,UAAUqI,UAAY,GACvC6H,EAAO,kBAAkBvI,KAAKmxB,GAC9BC,EAAc,cAAcpxB,KAAKmxB,GACjCE,EAAQ3qB,GAAa,mBAAmB1G,KAAK3H,UAAUi5B,YAAcnkC,OAAOokC,SAE5EC,EAAe,CACjBC,MAAM,EACNC,WAAW,EACXC,aAAa,EACbC,UAAW,aACXhJ,SAAU,WACR,OAAOzxB,SAASzJ,MAElBmkC,KAAM,cACNlc,OAAO,EACPmc,UAAW,QACXC,SAAU,eACVC,QAAS,GACTC,MAAO,EACPC,SAAU,GACV1mC,SAAU,CAAC,IAAK,KAChBslB,MAAM,EACNqhB,aAAc,OACdC,cAAc,EACdC,cAAc,EACdC,aAAa,EACbC,kBAAkB,EAClBC,SAAS,EACTC,aAAa,EACbC,kBAAmB,EACnBC,oBAAqB,EACrBC,MAAM,EACNC,SAAU,IACVC,UAAU,EACV52B,OAAQ,EACR62B,SAAU,aACVC,OAAQ,aACRC,QAAS,aACTC,OAAQ,aACRC,QAAS,aACThlB,UAAW,MACXilB,cAAe,GACfC,KAAM,UACNC,YAAY,EACZtiC,KAAM,UACNuiC,QAAQ,EACRn+B,OAAQ,GACRo+B,MAAO,OACP30B,OAAO,EACP40B,WAAW,EACXhS,QAAS,mBACTiS,eAAgB,EAChBC,KAAM,KACN3vB,OAAQ,OAON4vB,EAA+B,CAAC,QAAS,YAAa,WAAY,WAAY,OAAQ,eAAgB,eAAgB,SAAU,YAAa,iBAE7IC,EACM,gBADNA,EAEO,iBAFPA,EAGO,iBAHPA,EAIQ,kBAJRA,EAKK,eALLA,EAMW,oBAGXC,EAAeptB,EAAYqtB,QAAQ1pC,UAAY,GAC/C2pC,EAAUF,EAAaE,SAAWF,EAAaG,iBAAmBH,EAAaI,uBAAyBJ,EAAaK,oBAAsBL,EAAaM,kBAK5J,SAASC,EAAU3qC,GACjB,MAAO,GAAG+E,MAAM7F,KAAKc,GAMvB,SAAS0F,EAAQ9D,EAASgpC,GACxB,OAAQR,EAAa1kC,SAAW,SAAUmlC,GAIxC,IAFA,IAAI5pC,EAAK6F,KAEF7F,GAAI,CACT,GAAIqpC,EAAQprC,KAAK+B,EAAI4pC,GACnB,OAAO5pC,EAGTA,EAAKA,EAAGC,iBAEThC,KAAK0C,EAASgpC,GAMnB,SAASE,EAAgBlpC,EAASkT,GAChC,KAAOlT,GAAS,CACd,GAAIkT,EAASlT,GACX,OAAOA,EAGTA,EAAUA,EAAQV,eAItB,IAAI6pC,EAAU,CACZp0B,SAAS,GAIPnJ,EAAO/N,OAAO+N,KAAKs6B,GAkFvB,SAAS,EAAe9lB,EAAK1hB,GAC3B,MAAO,GAAGM,eAAe1B,KAAK8iB,EAAK1hB,GA8BrC,SAASwZ,EAAS9Z,EAAO4F,EAAOolC,GAC9B,GAAIzoC,MAAMC,QAAQxC,GAAQ,CACxB,IAAIga,EAAIha,EAAM4F,GACd,OAAY,MAALoU,EAAYgxB,EAAehxB,EAGpC,OAAOha,EAMT,SAASmd,EAASE,EAAI4tB,GACpB,IAAIC,EACJ,OAAO,WACL,IAAI/b,EAAQroB,KACVqkC,EAAajrB,UAEfkrB,aAAaF,GAEbA,EAAYlpC,YAAW,WACrB,OAAOqb,EAAGtV,MAAMonB,EAAOgc,KACtBF,IAQP,SAASI,EAAYrpB,EAAK1hB,GACxB,OAAO0hB,GAAOA,EAAIqE,WAAarE,EAAIqE,UAAU/lB,GAM/C,SAASgrC,EAAS9pC,EAAG+D,GACnB,OAAO/D,EAAEsI,QAAQvE,IAAM,EAMzB,SAASgmC,EAAWvrC,GAClB,SAAUA,IAAS,EAAeA,EAAO,eAAiBA,aAAiBqqC,QAa7E,SAASmB,EAAcxrC,EAAOyrC,GAC5B,MAAwB,mBAAVzrC,EAAuBA,EAAM+H,MAAM,KAAM0jC,GAAQzrC,EAMjE,SAAS0rC,EAAuBrlB,EAAWrmB,GACzCqmB,EAAUvT,QAAO,SAAU3T,GACzB,MAAkB,SAAXA,EAAEG,QACR,GAAGunB,QAAU7mB,EAclB,SAASmQ,IACP,OAAO1C,SAASC,cAAc,OAOhC,SAASi+B,EAAchyB,EAAW+H,GAChC,IAAIkqB,EAAM3pB,EAAS,GAAIP,EAAO,CAC5B4mB,QAASkD,EAAc9pB,EAAM4mB,QAAS,CAAC3uB,KACtC+H,EAAMmnB,iBAAmB,GAzM9B,SAAiClvB,GAC/B,OAAOnM,EAAKqd,QAAO,SAAUghB,EAAKvrC,GAChC,IAAIwrC,GAAiBnyB,EAAUoyB,aAAa,cAAcnzB,OAAOtY,KAAS,IAAIgqB,OAE9E,IAAKwhB,EACH,OAAOD,EAGT,GAAY,YAARvrC,EACFurC,EAAIvrC,GAAOwrC,OAEX,IACED,EAAIvrC,GAAOywB,KAAKE,MAAM6a,GACtB,MAAOxqC,GACPuqC,EAAIvrC,GAAOwrC,EAIf,OAAOD,IACN,IAsL8BG,CAAwBryB,IAMzD,OAJIiyB,EAAI3f,OAASyb,KACfkE,EAAI3D,aAAc,GAGb2D,EAMT,SAASK,EAAgB7gC,EAAS08B,GAChCroC,OAAO+N,KAAKpC,GAASd,SAAQ,SAAU4hC,GACrC,IAAK,EAAepE,EAAcoE,GAChC,MAAM,IAAInmC,MAAM,aAAa6S,OAAOszB,EAAQ,+BASlD,SAASC,EAAavqC,EAASwe,GAC7Bxe,EAAmB,UAAIwe,aAAgBiqB,QAAUjqB,EAAgB,UAAIA,EAMvE,SAASgsB,EAAWC,EAAW3qB,GAC7B,GAAIA,EAAM4mB,mBAAmB+B,QAC3B8B,EAAaE,EAAW,IACxBA,EAAUj8B,YAAYsR,EAAM4mB,cACvB,GAA6B,mBAAlB5mB,EAAM4mB,QAAwB,CAE9C+D,EADU3qB,EAAMsmB,UAAY,YAAc,eACzBtmB,EAAM4mB,SAO3B,SAASgE,EAAYtoB,GACnB,MAAO,CACLvX,QAASuX,EAAOoI,cAAc+d,GAC9BoC,SAAUvoB,EAAOoI,cAAc+d,GAC/B7B,QAAStkB,EAAOoI,cAAc+d,GAC9Ble,MAAOjI,EAAOoI,cAAc+d,IAAoBnmB,EAAOoI,cAAc+d,IAOzE,SAASqC,EAAW//B,GAClBA,EAAQ8D,aAAa,eAAgB,IAavC,SAASk8B,EAAmBrE,GAC1B,IAAInc,EAAQ9b,IASZ,MAPkB,UAAdi4B,GACFnc,EAAMpqB,UAAY,mBAClBsqC,EAAalgB,EAAO,oMAEpBA,EAAMpqB,UAAY,cAGboqB,EAMT,SAASygB,IACP,IAAIH,EAAWp8B,IAGf,OAFAo8B,EAAS1qC,UAAY,iBACrB0qC,EAASh8B,aAAa,aAAc,UAC7Bg8B,EAMT,SAASI,EAAe3oB,EAAQvX,GAC9BuX,EAAOzT,aAAa,WAAY,MAChC9D,EAAQ8D,aAAa,mBAAoB,IAc3C,SAASq8B,EAAwBC,EAAK7sC,GACpC6sC,EAAIviC,SAAQ,SAAUrJ,GAChBA,IACFA,EAAG2M,MAAMk/B,mBAAqB,GAAGl0B,OAAO5Y,EAAO,UAQrD,SAAS+sC,EAA4BtgC,EAASugC,EAAQC,GAGpD,IAAIv2B,EAAYgxB,QAAwDlkC,IAAzCiK,SAASzJ,KAAK4J,MAAMs/B,iBAAiC,sBAAwB,gBAC5GzgC,EAAQugC,EAAS,iBAAiBt2B,EAAWu2B,GAM/C,SAASE,EAAmBnpB,GAC1B,IAAIopB,EAAgBppB,EAAO+nB,aAAa,eACxC,OAAOqB,EAAgBA,EAAcvqC,MAAM,KAAK,GAAK,GAMvD,SAASwqC,GAAmBR,EAAKzyB,GAC/ByyB,EAAIviC,SAAQ,SAAUrJ,GAChBA,GACFA,EAAGsP,aAAa,aAAc6J,MAepC,SAASkzB,GAAY7gC,EAASugC,EAAQlD,GACpCA,EAAMjnC,MAAM,KAAKyH,SAAQ,SAAUijC,GACjC9gC,EAAQ1J,UAAUiqC,GAAQO,EAAY,aAiJ1C,SAASC,KACP,IAAIjpB,EAAOrE,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,GAAmBA,UAAU,GAAK,GAC7EutB,EAAmBlpB,EAAKkpB,iBACxBC,EAAUnpB,EAAKmpB,QACf5rC,EAAWyiB,EAAKziB,SAElB6oC,EAAUl9B,SAASkgC,iBAAiBxD,IAAmB7/B,SAAQ,SAAU0Z,GACvE,IAAI3C,EAAW2C,EAAO4pB,QAElBvsB,GAAaosB,IAAkD,IAA/BpsB,EAASK,MAAMknB,aAAkC8E,GAAW1pB,IAAW0pB,EAAQ1pB,QACjH3C,EAASwM,KAAK/rB,MAiCpB,IAAI+rC,IAAe,EACnB,SAASC,KACHD,KAIJA,IAAe,EAEXlG,GACFl6B,SAASzJ,KAAKjB,UAAUC,IAAI,aAG1BS,OAAOsqC,aACTtgC,SAAS2B,iBAAiB,YAAa4+B,KAG3C,IAAIC,GAAoB,EACxB,SAASD,KACP,IAAIhyB,EAAM+xB,YAAY/xB,MAElBA,EAAMiyB,GAAoB,KAC5BJ,IAAe,EACfpgC,SAASyK,oBAAoB,YAAa81B,IAErCrG,GACHl6B,SAASzJ,KAAKjB,UAAUE,OAAO,cAInCgrC,GAAoBjyB,EAEtB,SAASkyB,GAAgB19B,GAEvB,KAAMA,EAAM9E,kBAAkB2+B,SAC5B,OAAOmD,KAIT,IAAIxpB,EAASte,EAAQ8K,EAAM9E,OAAQy+B,GAEnC,KAAInmB,GAAUA,EAAO4pB,QAAU5pB,EAAO4pB,OAAOlsB,MAAMqnB,aAAnD,CAKA,IAAIpvB,EAAYmxB,EAAgBt6B,EAAM9E,QAAQ,SAAUzK,GACtD,OAAOA,EAAG2sC,QAAU3sC,EAAG2sC,OAAOj0B,YAAc1Y,KAG9C,GAAI0Y,EAAW,CACb,IAAI0H,EAAW1H,EAAUi0B,OAEzB,GAAIvsB,EAAU,CACZ,IAAI8sB,EAAiB7C,EAASjqB,EAASK,MAAMqW,SAAW,GAAI,SAE5D,GAAI8V,IAAgBM,EAClB,OAAOX,GAAQ,CACbE,QAASrsB,EACTosB,kBAAkB,IAItB,IAAmC,IAA/BpsB,EAASK,MAAMknB,aAAwBuF,EACzC,OAGF9sB,EAAS+sB,sBAIbZ,GAAQ,CACNC,kBAAkB,KAGtB,SAASY,KACP,IACEC,EADc7gC,SACY6gC,cAExBA,GAAiBA,EAAcC,MAAQD,EAAcV,QACvDU,EAAcC,OAalB,IAAIC,GAAY,EAOhB,SAASC,GAAY90B,EAAW+0B,GAC9B,IASIC,EAEAC,EAEAC,EAEAC,EAfAptB,EAAQiqB,EAAchyB,EAAW+0B,GAErC,IAAKhtB,EAAM0nB,UAAYzvB,EAAUi0B,OAC/B,OAAO,KAgBT,IAEImB,EAMA7wB,EA9emBtc,EAsenBotC,GAAoB,EAIpB/2B,EAAY,GAEZg3B,EAAuBvtB,EAAMunB,oBAAsB,EAAI9rB,EAAS+xB,EAAaxtB,EAAMunB,qBAAuBiG,EAM1GtW,EAAK4V,KAELxqB,EA1TN,SAA6B4U,EAAIlX,GAC/B,IAAIsC,EAAS7T,IACb6T,EAAOniB,UAAY,eACnBmiB,EAAO4U,GAAK,SAAShgB,OAAOggB,GAC5B5U,EAAOpW,MAAM0M,OAAS,GAAKoH,EAAMpH,OAE7BoH,EAAMioB,MACR3lB,EAAOzT,aAAa,OAAQmR,EAAMioB,MAGpC,IAAIl9B,EAAU0D,IACd1D,EAAQ5K,UAAY,gBACpB4K,EAAQmB,MAAMu7B,SAAWznB,EAAMynB,UAAsC,iBAAnBznB,EAAMynB,SAAwB,KAAO,IACvF18B,EAAQ8D,aAAa,YAAamR,EAAMpa,MACxCmF,EAAQ8D,aAAa,iBAAkBmR,EAAMwmB,WAC7Cz7B,EAAQ8D,aAAa,aAAc,UACnC+8B,GAAY7gC,EAAS,MAAOiV,EAAMooB,OAClC,IAAIxB,EAAUn4B,IAwBd,OAvBAm4B,EAAQzmC,UAAY,gBACpBymC,EAAQ/3B,aAAa,aAAc,UAE/BmR,EAAMqnB,aACR4D,EAAe3oB,EAAQvX,GAGrBiV,EAAMuK,OACRxf,EAAQ2D,YAAYq8B,EAAmB/qB,EAAM0mB,YAG3C1mB,EAAMumB,cACRx7B,EAAQ2D,YAAYs8B,KACpBjgC,EAAQ8D,aAAa,mBAAoB,KAGvCmR,EAAMonB,SACR0D,EAAW//B,GAGb2/B,EAAW9D,EAAS5mB,GACpBjV,EAAQ2D,YAAYk4B,GACpBtkB,EAAO5T,YAAY3D,GACZuX,EAiRMmrB,CAAoBvW,EAAIlX,GAiBjCL,EAAW,CAEbuX,GAAIA,EACJjf,UAAWA,EACXqK,OAAQA,EACRorB,eApBmB9C,EAAYtoB,GAqB/BqrB,eAPmB,KAQnB3tB,MAAOA,EACPtH,MAtBU,CAEVk1B,WAAW,EAEXC,WAAW,EAEXxoB,aAAa,EAEbyoB,WAAW,EAEXC,SAAS,GAcTrB,mBAAoBA,GACpB9xB,IAAKA,GACL8vB,WA0sBF,SAAuB9D,GACrBhsB,GAAI,CACFgsB,QAASA,KA3sBXnP,KAAMA,GACNtL,KAAMA,GACNgC,OA6nBF,WACExO,EAASjH,MAAMk1B,WAAY,GA7nB3BI,QAooBF,WACEruB,EAASjH,MAAMk1B,WAAY,GApoB3BpzB,QAASA,IAiCX,OA/BAyzB,KAEKjuB,EAAMwnB,OACT0G,KACAvuB,EAASguB,eAAehnB,yBAGtB3G,EAAMkoB,YACRiG,IAIEnuB,EAAMqmB,OAASrmB,EAAMhW,UApiBF9J,EAoiB6B+X,aAniB1B0wB,WAAUC,EAAQprC,KAAK0C,EAAS,8EAAiFA,EAAQyP,aAAa,eAoiB9JsI,EAAUpJ,aAAa,WAAY,KAKrCyT,EAAO5U,iBAAiB,cAAc,SAAUoB,GAC1C6Q,EAASK,MAAMqnB,aAAe1nB,EAASjH,MAAMm1B,WAAsC,eAAzBZ,GAC5DkB,EAAar/B,MAGjBwT,EAAO5U,iBAAiB,cAAc,WAChCiS,EAASK,MAAMqnB,aAAwC,eAAzB4F,GAChClhC,SAAS2B,iBAAiB,YAAa6/B,MAI3Ct1B,EAAUi0B,OAASvsB,EACnB2C,EAAO4pB,OAASvsB,EACTA,EAOP,SAASyuB,EAAmCt/B,GAC1C,IAAIu/B,EAAsBnB,EAAqBp+B,EAC7CwF,EAAU+5B,EAAoB/5B,QAC9BC,EAAU85B,EAAoB95B,QAEhC,GAAKoL,EAASguB,eAAd,CAMA,IAAI5qB,EAAY0oB,EAAmB9rB,EAAS2C,QACxCva,EAAU4X,EAASK,MAAMuK,MAxwBnB,GAwwBmE,UAA7B5K,EAASK,MAAM0mB,UAAwB,GAAK,IAxwBlF,EAywBN4H,EAAsB1E,EAAS,CAAC,MAAO,UAAW7mB,GAClDwrB,EAAwB3E,EAAS,CAAC,OAAQ,SAAU7mB,GAEpD5gB,EAAImsC,EAAsB7tC,KAAKC,IAAIqH,EAASuM,GAAWA,EACvD/R,EAAIgsC,EAAwB9tC,KAAKC,IAAIqH,EAASwM,GAAWA,EAEzD+5B,GAAuBnsC,EAAI4F,IAC7B5F,EAAI1B,KAAKE,IAAI2T,EAASvS,OAAOkgB,WAAala,IAGxCwmC,GAAyBhsC,EAAIwF,IAC/BxF,EAAI9B,KAAKE,IAAI4T,EAASxS,OAAOmgB,YAAcna,IAG7C,IAAI+K,EAAO6M,EAAS1H,UAAUlF,wBAC1Bk0B,EAAetnB,EAASK,MAAMinB,aAC9BuH,EAAgC,eAAjBvH,EACftd,EAA8B,aAAjBsd,EACjBtnB,EAASguB,eAAe11B,UAAYsI,EAAS,GAAIZ,EAASguB,eAAe11B,UAAW,CAClFlF,sBAAuB,WACrB,MAAO,CACLE,MAAO,EACPC,OAAQ,EACRqC,IAAKi5B,EAAe17B,EAAKyC,IAAMhT,EAC/Bwc,OAAQyvB,EAAe17B,EAAKiM,OAASxc,EACrCkT,KAAMkU,EAAa7W,EAAK2C,KAAOtT,EAC/B6c,MAAO2K,EAAa7W,EAAKkM,MAAQ7c,IAGrC0e,YAAa,EACbC,aAAc,IAEhBnB,EAASguB,eAAermB,iBAEH,YAAjB2f,GAA8BtnB,EAASjH,MAAMm1B,WAC/CY,KA4BJ,SAASN,EAAar/B,GAGpB,GAFA49B,MAEI/sB,EAASjH,MAAMm1B,UAAnB,CAKA,GAAIluB,EAASK,MAAMhW,OACjB,OA7BJ,SAAkC8E,GAChC,GAAIA,EAAO,CACT,IAAI4/B,EAAW1qC,EAAQ8K,EAAM9E,OAAQ2V,EAASK,MAAMhW,QAEhD0kC,IAAaA,EAASxC,SACxBa,GAAY2B,EAAUnuB,EAAS,GAAIZ,EAASK,MAAO,CACjD4mB,QAASkD,EAAckD,EAAgBpG,QAAS,CAAC8H,IACjDlR,SAAUwP,EAAgBxP,SAC1BxzB,OAAQ,GACRk+B,YAAY,KAEdiG,EAAar/B,KAkBR6/B,CAAyB7/B,GAKlC,GAFAw+B,GAAoB,EAEhB3tB,EAASK,MAAMuoB,KACjB,OAAO5oB,EAASK,MAAMuoB,KAAK5oB,EAAU7Q,GAQnC8/B,OAA8BjvB,EAASjH,MAAMo1B,WAC/C/hC,SAAS2B,iBAAiB,YAAa0gC,GAGzC,IAAIvH,EAAQzuB,EAASuH,EAASK,MAAM6mB,MAAO,EAAGT,EAAaS,OAEvDA,EACFsG,EAAgB7sC,YAAW,WACzBm3B,OACCoP,GAEHpP,MAQJ,SAASoX,IAGP,GAFAnC,MAEK/sB,EAASjH,MAAMm1B,UAClB,OAAOY,IAGTnB,GAAoB,EACpB,IAAIzG,EAAQzuB,EAASuH,EAASK,MAAM6mB,MAAO,EAAGT,EAAaS,OAEvDA,IACFuG,EAAgB9sC,YAAW,WACrBqf,EAASjH,MAAMm1B,WACjB1hB,OAED0a,IAcP,SAAS4H,IACP1iC,SAASyK,oBAAoB,YAAa43B,GAO5C,SAASU,IACP/iC,SAASzJ,KAAKkU,oBAAoB,aAAcq4B,GAChD9iC,SAASyK,oBAAoB,YAAa+2B,GAO5C,SAASwB,EAAUjgC,GACZ6Q,EAASjH,MAAMk1B,YAAaoB,GAAuBlgC,KAInD6Q,EAASjH,MAAMm1B,YAClBZ,EAAuBn+B,EAAM6B,KAEzB7B,aAAiBmgC,aACnB/B,EAAqBp+B,IAKN,UAAfA,EAAM6B,OAAmD,IAA/BgP,EAASK,MAAMknB,aAAyBvnB,EAASjH,MAAMm1B,UACnFgB,IAEAV,EAAar/B,IASjB,SAAS0+B,EAAY1+B,GACnB,IAAIogC,EAA2B9F,EAAgBt6B,EAAM9E,QAAQ,SAAUzK,GACrE,OAAOA,EAAG2sC,UAERiD,EAAqBnrC,EAAQ8K,EAAM9E,OAAQy+B,KAAsB9oB,EAAS2C,OAC1E8sB,EAAwBF,IAA6BvvB,EAAS1H,UAE9Dk3B,GAAsBC,GA5a9B,SAA0CC,EAAiBnrB,EAAYpV,EAAOkR,GAC5E,IAAKqvB,EACH,OAAO,EAGT,IAAIltC,EAAI2M,EAAMwF,QACZ/R,EAAIuM,EAAMyF,QACR+yB,EAAoBtnB,EAAMsnB,kBAC5BR,EAAW9mB,EAAM8mB,SACfwI,EAAaprB,EAAW3O,IAAMhT,GAAyB,QAApB8sC,EAA4B/H,EAAoBR,EAAWQ,GAC9FiI,EAAgBhtC,EAAI2hB,EAAWnF,QAA8B,WAApBswB,EAA+B/H,EAAoBR,EAAWQ,GACvGkI,EAActrB,EAAWzO,KAAOtT,GAAyB,SAApBktC,EAA6B/H,EAAoBR,EAAWQ,GACjGmI,EAAettC,EAAI+hB,EAAWlF,OAA6B,UAApBqwB,EAA8B/H,EAAoBR,EAAWQ,GACxG,OAAOgI,GAAcC,GAAiBC,GAAeC,EAma/CC,CAAiCjE,EAAmB9rB,EAAS2C,QAAS3C,EAAS2C,OAAOvP,wBAAyBjE,EAAO6Q,EAASK,SACjI8uB,IACAD,KAQJ,SAASc,EAAa7gC,GACpB,IAAIkgC,GAAuBlgC,GAI3B,OAAI6Q,EAASK,MAAMqnB,aACjBt7B,SAASzJ,KAAKoL,iBAAiB,aAAcmhC,QAC7C9iC,SAAS2B,iBAAiB,YAAa6/B,SAIzCsB,IAOF,SAASe,GAAO9gC,GACVA,EAAM9E,SAAW2V,EAAS1H,YAI1B0H,EAASK,MAAMqnB,aAAev4B,EAAM+G,eAAiB8J,EAAS2C,OAAOxO,SAAShF,EAAM+G,gBAIxFg5B,KAOF,SAASgB,GAAe/gC,GAClB9K,EAAQ8K,EAAM9E,OAAQ2V,EAASK,MAAMhW,SACvCmkC,EAAar/B,GAQjB,SAASghC,GAAehhC,GAClB9K,EAAQ8K,EAAM9E,OAAQ2V,EAASK,MAAMhW,SACvC6kC,IASJ,SAASG,GAAuBlgC,GAC9B,IAAIihC,EAAgB,iBAAkBhuC,OAClCiuC,EAAepG,EAAS96B,EAAM6B,KAAM,SACpC03B,EAAY1oB,EAASK,MAAMqoB,UAC/B,OAAO0H,GAAiB5D,IAAgB9D,IAAc2H,GAAgB7D,KAAiB9D,GAAa2H,EAOtG,SAAS9B,KACP,IAAIlG,EAAgBroB,EAASK,MAAMgoB,cAC/BiI,EAAwBtwB,EAAS+tB,eACnC3iC,EAAUklC,EAAsBllC,QAChCwf,EAAQ0lB,EAAsB1lB,MAC5B2lB,EAA0BvG,EAAY3B,EAAe,mBAEzD,SAASmI,EAAe98B,GAClBsM,EAASK,MAAM0F,OAAS/F,EAASK,MAAMgnB,eACrC3zB,EAAKmS,UACP7F,EAASguB,eAAejkC,QAAQqZ,UAAY1P,EAAK0P,WAGnDinB,EAAuBrqB,EAASguB,eAAehpB,WAAW,IAG5D5Z,EAAQ8D,aAAa,cAAewE,EAAK0P,WACzC,IAAIyF,EAAgBijB,EAAmB9rB,EAAS2C,QAC5CpD,EAASnU,EAAQmB,MAErBgT,EAAO3J,IAAM2J,EAAOH,OAASG,EAAOzJ,KAAOyJ,EAAOF,MAAQ,GAC1DE,EAAOsJ,KAAuC7I,EAASK,MAAM8mB,SA5f7C,IAAM,KA6ftB,IAAI/+B,EAAUmoC,QAA+DpuC,IAApCouC,EAAwBnoC,QAAwBmoC,EAAwBnoC,QAviCzG,EAwiCJ4a,EAAqC,iBAAZ5a,EAEzBqoC,EAAkB7vB,EAAS,CAC7BhL,IAAKoN,EAAkB5a,EAAUA,EAAQwN,IACzCwJ,OAAQ4D,EAAkB5a,EAAUA,EAAQgX,OAC5CtJ,KAAMkN,EAAkB5a,EAAUA,EAAQ0N,KAC1CuJ,MAAO2D,EAAkB5a,EAAUA,EAAQiX,QACzC2D,GAAmB5a,GAEvBqoC,EAAgB5nB,GAAiB7F,EAAkB5a,EAAU4X,EAASK,MAAM8mB,UAAY/+B,EAAQygB,IAAkB,GAAK7I,EAASK,MAAM8mB,SACtInnB,EAASguB,eAAehpB,UAAUvT,QAAO,SAAU3T,GACjD,MAAkB,oBAAXA,EAAEG,QACR,GAAGmK,QAAUqoC,EAGlB,IAAIC,EAAS9vB,EAAS,CACpBwC,UAAWpD,EAASK,MAAM+C,WACzBilB,EAAe,CAChBrjB,UAAWpE,EAAS,GAAIynB,EAAgBA,EAAcrjB,UAAY,GAAI,CACpEkF,gBAAiBtJ,EAAS,CACxBgC,kBAAmB5C,EAASK,MAAM2mB,SAClC5+B,QA7jCI,GA8jCHmoC,GACH3lB,MAAOhK,EAAS,CACdrgB,QAASqqB,EACTpF,UAAWoF,GACVof,EAAY3B,EAAe,UAC9BtiB,KAAMnF,EAAS,CACb4E,QAASxF,EAASK,MAAM0F,KAGxB3d,QAAS4X,EAASK,MAAM8mB,SAvkCpB,EAwkCJxb,SAAU3L,EAASK,MAAM+mB,cACxB4C,EAAY3B,EAAe,SAC9Bl3B,OAAQyP,EAAS,CACfzP,OAAQ6O,EAASK,MAAMlP,QACtB64B,EAAY3B,EAAe,aAIhCjiB,SAAU,SAAkB1S,GAC1B88B,EAAe98B,GAEX20B,GAAiBA,EAAcjiB,UACjCiiB,EAAcjiB,SAAS1S,IAM3ByS,SAAU,SAAkBzS,GAC1B88B,EAAe98B,GAEX20B,GAAiBA,EAAcliB,UACjCkiB,EAAcliB,SAASzS,MAK7BsM,EAASguB,eAAiB,IAAI,IAAOhuB,EAAS1H,UAAW0H,EAAS2C,OAAQ+tB,GAQ5E,SAASC,GAAMl9B,GACb,IAAIm9B,IAAyB3B,MAA+D,YAAhCjvB,EAASK,MAAMinB,cAA8BkF,IAEpGxsB,EAASguB,gBAOPiB,OACHjvB,EAASguB,eAAermB,iBAEpBipB,GACF5wB,EAASguB,eAAetmB,wBAI5B2iB,EAAuBrqB,EAASguB,eAAehpB,UAAWhF,EAASK,MAAM0F,QAdzEwoB,KAEKqC,GACH5wB,EAASguB,eAAehnB,yBAiB5BhH,EAASguB,eAAe11B,UAAY0H,EAAS1H,UAC7C,IAAIsS,EAAQ5K,EAAS+tB,eAAenjB,MAEhCqkB,MACErkB,IACFA,EAAMre,MAAMtE,OAAS,KAGnBslC,GACFkB,EAAmClB,IAE5B3iB,IACTA,EAAMre,MAAMtE,OAAS,IAInBukC,IAAgBe,GAAsD,YAAhCvtB,EAASK,MAAMinB,eACvDmH,EAAmClB,GAE/B3iB,IACFA,EAAMre,MAAMtE,OAAS,MA3qB7B,SAAoC+lC,EAAgBv6B,GAClD,IAAIkP,EAASqrB,EAAerrB,OAC1B5Y,EAAUikC,EAAejkC,QACvBqc,EAAWrc,EAAQqc,SACrBD,EAAWpc,EAAQoc,SAErBpc,EAAQqc,SAAWrc,EAAQoc,SAAW,SAAUzS,IA1IlD,SAAgBiP,GACTA,EAAOpB,aA0IVsvB,CAAOluB,GACPlP,IAEI0S,GACFA,EAASzS,GAGX3J,EAAQqc,SAAWA,EACnBrc,EAAQoc,SAAWA,GAgqBnB2qB,CAA2B9wB,EAASguB,eAAgBv6B,GACpD,IAAIoqB,EAAW7d,EAASK,MAAMwd,UAC9BhhB,EAA0B,WAAbghB,EAAwB7d,EAAS1H,UAAUuE,WAAastB,EAActM,EAAU,CAAC7d,EAAS1H,aAEvFnE,SAAS6L,EAAS2C,UAChC9F,EAAW9N,YAAYiR,EAAS2C,QAChC3C,EAASK,MAAM6nB,QAAQloB,GACvBA,EAASjH,MAAMo1B,WAAY,GAQ/B,SAASc,KACP,OAAOjvB,EAASK,MAAMinB,eAAiBkF,IAAyC,UAAzBc,EAOzD,SAASyD,KACPxF,EAAwB,CAACvrB,EAAS2C,QAASnF,EAAO,EAAIwC,EAASK,MAAMsoB,gBAErE,SAASqI,IACHhxB,EAASguB,gBACXhuB,EAASguB,eAAermB,iBAGtB3H,EAASjH,MAAMo1B,UACjBpgB,sBAAsBijB,GAEtBzF,EAAwB,CAACvrB,EAAS2C,QAAS,GAI/CquB,GAOF,SAASC,GAAkBxwC,EAAUgT,GACnCy9B,GAAgBzwC,GAAU,YACnBuf,EAASjH,MAAMm1B,WAAarxB,GAAcA,EAAW1I,SAAS6L,EAAS2C,SAC1ElP,OASN,SAAS09B,GAAiB1wC,EAAUgT,GAClCy9B,GAAgBzwC,EAAUgT,GAO5B,SAASy9B,GAAgBzwC,EAAUgT,GACjC,IAAIrI,EAAU4U,EAAS+tB,eAAe3iC,QAKtC,SAASwgC,EAASz8B,GACZA,EAAM9E,SAAWe,IACnBsgC,EAA4BtgC,EAAS,SAAUwgC,GAC/Cn4B,KAMJ,GAAiB,IAAbhT,EACF,OAAOgT,IAGTi4B,EAA4BtgC,EAAS,SAAUsiC,GAC/ChC,EAA4BtgC,EAAS,MAAOwgC,GAC5C8B,EAAwB9B,EAO1B,SAAS7wB,GAAG3C,EAAWg5B,GACrB,IAAIrnC,EAAU8U,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,IAAmBA,UAAU,GAC7EmB,EAAS1H,UAAUvK,iBAAiBqK,EAAWg5B,EAASrnC,GACxD6M,EAAUhS,KAAK,CACbwT,UAAWA,EACXg5B,QAASA,EACTrnC,QAASA,IAQb,SAASukC,KACHtuB,EAASK,MAAMqoB,YAAc1oB,EAASK,MAAMhW,SAC9C0Q,GAAG,aAAcq0B,EAAW1F,GAC5B3uB,GAAG,WAAYi1B,EAActG,IAG/B1pB,EAASK,MAAMqW,QAAQzN,OAAOznB,MAAM,KAAKyH,SAAQ,SAAUmP,GACzD,GAAkB,WAAdA,EAKJ,GAAK4H,EAASK,MAAMhW,OAclB,OAAQ+N,GACN,IAAK,aACH2C,GAAG,YAAam1B,IAChBn1B,GAAG,WAAYo1B,IACf,MAEF,IAAK,QACHp1B,GAAG,UAAWm1B,IACdn1B,GAAG,WAAYo1B,IACf,MAEF,IAAK,QACHp1B,GAAG3C,EAAW83B,SAvBlB,OAFAn1B,GAAG3C,EAAWg3B,GAENh3B,GACN,IAAK,aACH2C,GAAG,aAAci1B,GACjB,MAEF,IAAK,QACHj1B,GAAGyC,EAAO,WAAa,OAAQyyB,QA4BzC,SAASoB,KACPz6B,EAAU3N,SAAQ,SAAUia,GAC1B,IAAI9K,EAAY8K,EAAK9K,UACnBg5B,EAAUluB,EAAKkuB,QACfrnC,EAAUmZ,EAAKnZ,QACjBiW,EAAS1H,UAAUzB,oBAAoBuB,EAAWg5B,EAASrnC,MAE7D6M,EAAY,GAOd,SAAS06B,KACP,MAAO,CAACtxB,EAAS+tB,eAAe3iC,QAAS4U,EAAS+tB,eAAe7C,SAAUlrB,EAAS+tB,eAAe9G,SAyBrG,SAAS8F,KACPhD,aAAayD,GACbzD,aAAa0D,GACb7lB,0BAhsBE2pB,GAusBJ,SAASt2B,GAAIlR,GAGX6gC,EADA7gC,EAAUA,GAAW,GACI08B,GACzB,IAAI+K,EAAYxxB,EAASK,MACrBoxB,EAAYnH,EAActqB,EAAS1H,UAAWsI,EAAS,GAAIZ,EAASK,MAAOtW,EAAS,CACtFy9B,kBAAkB,KAEpBiK,EAAUjK,iBAAmB,EAAez9B,EAAS,oBAAsBA,EAAQy9B,mBAAoB,EAAQgK,EAAUhK,iBACzHxnB,EAASK,MAAQoxB,GAEb,EAAe1nC,EAAS,YAAc,EAAeA,EAAS,gBAChEsnC,KACA/C,MAGE,EAAevkC,EAAS,yBAC1BolC,IACAvB,EAAuB9xB,EAAS+xB,EAAa9jC,EAAQ69B,qBAAuB,IAp9BlF,SAA6BjlB,EAAQ6uB,EAAWC,GAC9C,IAAIC,EAAezG,EAAYtoB,GAC7BvX,EAAUsmC,EAAatmC,QACvB67B,EAAUyK,EAAazK,QACvBiE,EAAWwG,EAAaxG,SACxBtgB,EAAQ8mB,EAAa9mB,MAEvBjI,EAAOpW,MAAM0M,OAAS,GAAKw4B,EAAUx4B,OACrC7N,EAAQ8D,aAAa,YAAauiC,EAAUxrC,MAC5CmF,EAAQ8D,aAAa,iBAAkBuiC,EAAU5K,WACjDz7B,EAAQmB,MAAMu7B,SAAW2J,EAAU3J,UAA0C,iBAAvB2J,EAAU3J,SAAwB,KAAO,IAE3F2J,EAAUnJ,KACZ3lB,EAAOzT,aAAa,OAAQuiC,EAAUnJ,MAEtC3lB,EAAOmE,gBAAgB,QAGrB0qB,EAAUvK,UAAYwK,EAAUxK,SAClC8D,EAAW9D,EAASwK,IAIjBD,EAAU5K,aAAe6K,EAAU7K,aACtCx7B,EAAQ2D,YAAYs8B,KACpBjgC,EAAQ8D,aAAa,mBAAoB,KAChCsiC,EAAU5K,cAAgB6K,EAAU7K,cAC7Cx7B,EAAQtL,YAAYorC,GACpB9/B,EAAQ0b,gBAAgB,sBAIrB0qB,EAAU5mB,OAAS6mB,EAAU7mB,MAChCxf,EAAQ2D,YAAYq8B,EAAmBqG,EAAU1K,YACxCyK,EAAU5mB,QAAU6mB,EAAU7mB,OACvCxf,EAAQtL,YAAY8qB,GAIlB4mB,EAAU5mB,OAAS6mB,EAAU7mB,OAAS4mB,EAAUzK,YAAc0K,EAAU1K,WAC1E37B,EAAQumC,aAAavG,EAAmBqG,EAAU1K,WAAYnc,IAI3D4mB,EAAU9J,aAAe+J,EAAU/J,YACtC4D,EAAe3oB,EAAQvX,GACdomC,EAAU9J,cAAgB+J,EAAU/J,aA7JjD,SAA2B/kB,EAAQvX,GACjCuX,EAAOmE,gBAAgB,YACvB1b,EAAQ0b,gBAAgB,oBA4JtB8qB,CAAkBjvB,EAAQvX,IAIvBomC,EAAU/J,SAAWgK,EAAUhK,QAClC0D,EAAW//B,GACFomC,EAAU/J,UAAYgK,EAAUhK,SA7M7C,SAAuBr8B,GACrBA,EAAQ0b,gBAAgB,gBA6MtB+qB,CAAczmC,GAIZomC,EAAU/I,QAAUgJ,EAAUhJ,QAChCwD,GAAY7gC,EAAS,SAAUomC,EAAU/I,OACzCwD,GAAY7gC,EAAS,MAAOqmC,EAAUhJ,QA25BtCqJ,CAAoB9xB,EAAS2C,OAAQ6uB,EAAWC,GAChDzxB,EAAS+tB,eAAiB9C,EAAYjrB,EAAS2C,QAE3C3C,EAASguB,iBACXhuB,EAASguB,eAAevoB,SAEpBojB,EAA6B5xB,MAAK,SAAUiO,GAC9C,OAAO,EAAenb,EAASmb,QAE/BlF,EAASguB,eAAenzB,UACxB0zB,KAEKvuB,EAASjH,MAAMm1B,WAClBluB,EAASguB,eAAehnB,wBAGtBhH,EAASK,MAAMinB,cAAgBiG,GACjCkB,EAAmClB,KAoB3C,SAASzV,KACP,IAAIr3B,EAAWoe,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,GAAmBA,UAAU,GAAKpG,EAASuH,EAASK,MAAM5f,SAAU,EAAGgmC,EAAahmC,SAAS,IAE9I,IAAIuf,EAASjH,MAAM2M,aAAgB1F,EAASjH,MAAMk1B,aAAazB,IAAiBxsB,EAASK,MAAMvM,OAK/F,OAAK,EAAekM,EAAS1H,UAAW,cAAiBlM,SAAS3J,gBAAgB0R,SAAS6L,EAAS1H,gBAKhG0H,EAAS1H,UAAUtI,aAAa,cAII,IAApCgQ,EAASK,MAAM8nB,OAAOnoB,KAI1BA,EAAS2C,OAAOpW,MAAMwlC,WAAa,UACnC/xB,EAASjH,MAAMm1B,WAAY,EAEvBluB,EAASK,MAAMqnB,aACjB1nB,EAAS1H,UAAU5W,UAAUC,IAAI,gBAInC4pC,EAAwB,CAACvrB,EAAS2C,OAAQ3C,EAAS+tB,eAAe3iC,QAAS4U,EAAS+tB,eAAe7C,UAAW,GAC9GyF,IAAM,WACC3wB,EAASjH,MAAMm1B,YAKfe,MACHjvB,EAASguB,eAAevoB,SAG1B8lB,EAAwB,CAACvrB,EAAS2C,QAAStC,EAAMsoB,gBACjD4C,EAAwB+F,KAAoB7wC,GAExCuf,EAAS+tB,eAAe7C,WAC1BlrB,EAAS+tB,eAAe9G,QAAQ16B,MAAMylC,gBAAkBlxC,KAAKsD,MAAM3D,EAAW,IAAM,MAGlFuf,EAASK,MAAMmoB,QACjBuI,KAGF/E,GAAmBsF,KAAoB,WACvCH,GAAiB1wC,GAAU,WACzBuf,EAAS+tB,eAAe3iC,QAAQ1J,UAAUC,IAAI,sBAE1Cqe,EAASK,MAAMymB,MACjB9mB,EAAS1H,UAAUpJ,aAAa,QAAQqI,OAAOyI,EAASK,MAAMymB,MAAO9mB,EAAS2C,OAAO4U,IAGvFvX,EAASK,MAAM+nB,QAAQpoB,GACvBA,EAASjH,MAAMq1B,SAAU,WAnDpBvzB,KA4DX,SAAS2R,KACP,IAAI/rB,EAAWoe,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,GAAmBA,UAAU,GAAKpG,EAASuH,EAASK,MAAM5f,SAAU,EAAGgmC,EAAahmC,SAAS,KAE1Iuf,EAASjH,MAAM2M,aAAgB1F,EAASjH,MAAMk1B,YAIV,IAApCjuB,EAASK,MAAM4nB,OAAOjoB,KAI1BA,EAAS+tB,eAAe3iC,QAAQ1J,UAAUE,OAAO,sBAE7Coe,EAASK,MAAMqnB,aACjB1nB,EAAS1H,UAAU5W,UAAUE,OAAO,gBAGtCoe,EAAS2C,OAAOpW,MAAMwlC,WAAa,SACnC/xB,EAASjH,MAAMm1B,WAAY,EAC3BluB,EAASjH,MAAMq1B,SAAU,EACzB7C,EAAwB+F,KAAoB7wC,GAC5CurC,GAAmBsF,KAAoB,UACvCL,GAAkBxwC,GAAU,WACrBktC,GACHmB,IAGE9uB,EAASK,MAAMymB,MACjB9mB,EAAS1H,UAAUwO,gBAAgB,QAAQvP,OAAOyI,EAASK,MAAMymB,OAGnE9mB,EAASguB,eAAehnB,wBACxBhH,EAASguB,eAAejkC,QAAQqZ,UAAYpD,EAASK,MAAM+C,UAC3DvG,EAAW/c,YAAYkgB,EAAS2C,QAChC3C,EAASK,MAAM2nB,SAAShoB,GACxBA,EAASjH,MAAMo1B,WAAY,MAQ/B,SAAStzB,GAAQo3B,GACXjyB,EAASjH,MAAM2M,cAMf1F,EAASjH,MAAMo1B,WACjB3hB,GAAK,GAGP6kB,YACOrxB,EAAS1H,UAAUi0B,OAEtBvsB,EAASK,MAAMhW,QAAU4nC,GAC3B3I,EAAUtpB,EAAS1H,UAAUg0B,iBAAiBtsB,EAASK,MAAMhW,SAASpB,SAAQ,SAAUipC,GAClFA,EAAM3F,QACR2F,EAAM3F,OAAO1xB,aAKfmF,EAASguB,gBACXhuB,EAASguB,eAAenzB,UAG1BmF,EAASjH,MAAM2M,aAAc,IA2EjC,IAAIysB,IAA4B,EAKhC,SAASC,GAAMC,EAAStoC,GACtB6gC,EAAgB7gC,GAAW,GAAI08B,GAE1B0L,KA5/BL/lC,SAAS2B,iBAAiB,QAAS8+B,IAAiB,GACpDzgC,SAAS2B,iBAAiB,aAAc0+B,GAAiB/C,GACzDtnC,OAAO2L,iBAAiB,OAAQi/B,IA4/B9BmF,IAA4B,GAG9B,IAxjD4BxzC,EAwjDxB0hB,EAAQO,EAAS,GAAI6lB,EAAc18B,GAxjDXpL,EA4jDH0zC,EA3jDU,oBAA5B,GAAG91B,SAAS1e,KAAKc,IAAiCA,EAAMoP,kBA7CjE,SAA4CukC,GAC1C,IAAIC,EAAY,CACdC,WAAW,EACX5sB,WAAY0sB,EAAiB1sB,YAAc,GAC3C1W,aAAc,SAAsBjQ,EAAKN,GACvC2zC,EAAiB1sB,WAAW3mB,GAAON,GAErC+rC,aAAc,SAAsBzrC,GAClC,OAAOqzC,EAAiB1sB,WAAW3mB,IAErC6nB,gBAAiB,SAAyB7nB,UACjCqzC,EAAiB1sB,WAAW3mB,IAErC+Q,aAAc,SAAsB/Q,GAClC,OAAOA,KAAOqzC,EAAiB1sB,YAEjC7X,iBAAkB,aAClB8I,oBAAqB,aACrBnV,UAAW,CACT+wC,WAAY,GACZ9wC,IAAK,SAAa1C,GAChBqzC,EAAiB5wC,UAAU+wC,WAAWxzC,IAAO,GAE/C2C,OAAQ,SAAgB3C,UACfqzC,EAAiB5wC,UAAU+wC,WAAWxzC,IAE/CkV,SAAU,SAAkBlV,GAC1B,OAAOA,KAAOqzC,EAAiB5wC,UAAU+wC,cAK/C,IAAK,IAAIxzC,KAAOszC,EACdD,EAAiBrzC,GAAOszC,EAAUtzC,GAwkDlCyzC,CAAmCL,GAGrC,IAAIM,EAljDN,SAA4Bh0C,GAC1B,GAAIurC,EAAWvrC,GAEb,MAAO,CAACA,GAGV,GAAIA,aAAiBi0C,SACnB,OAAOtJ,EAAU3qC,GAGnB,GAAIuC,MAAMC,QAAQxC,GAChB,OAAOA,EAGT,IACE,OAAO2qC,EAAUl9B,SAASkgC,iBAAiB3tC,IAC3C,MAAOsB,GACP,MAAO,IAiiDO4yC,CAAmBR,GAAS7oB,QAAO,SAAUghB,EAAKlyB,GAChE,IAAI0H,EAAW1H,GAAa80B,GAAY90B,EAAW+H,GAMnD,OAJIL,GACFwqB,EAAI5lC,KAAKob,GAGJwqB,IACN,IACH,OAAON,EAAWmI,GAAWM,EAAU,GAAKA,EAO9CP,GAAM32B,QAnxDQ,QAoxDd22B,GAAMhoC,SAAWq8B,EAKjB2L,GAAMU,YAAc,SAAUC,GAC5B30C,OAAO+N,KAAK4mC,GAAiB9pC,SAAQ,SAAUhK,GAE7CwnC,EAAaxnC,GAAO8zC,EAAgB9zC,OAIxCmzC,GAAMjG,QAAUA,GAChBiG,GAAM1gC,MArHN,SAAeihC,GACb,IAAIzvB,EAAOrE,UAAUpd,OAAS,QAAsBU,IAAjB0c,UAAU,GAAmBA,UAAU,GAAK,GAC7Em0B,EAAa9vB,EAAKgkB,MAClBA,OAAuB,IAAf8L,EAAwBL,EAAU,GAAGtyB,MAAM6mB,MAAQ8L,EAC3DC,EAAgB/vB,EAAKziB,SACrBA,OAA6B,IAAlBwyC,EAA2B,EAAIA,EAI5C,IAAIN,EAAU17B,MAAK,SAAU+I,GAC3B,OAAO,EAAeA,EAAU,qBADlC,CAMA,IAAIkzB,GAAiB,EACrBP,EAAU1pC,SAAQ,SAAU+W,GAC1BA,EAASmzB,eAAiBvyB,EAAS,GAAIZ,EAASK,UA8ClD+yB,IA3CA,SAASC,EAAkB10C,GACzBu0C,EAAiBv0C,EACjBy0C,IAGF,SAASjL,EAAOnoB,GACdA,EAASmzB,eAAehL,OAAOnoB,GAE/B2yB,EAAU1pC,SAAQ,SAAU+W,GAC1BA,EAAS/E,IAAI,CACXxa,SAAUA,IAEZuf,EAASwM,UAEX6mB,GAAkB,GAGpB,SAASpL,EAAOjoB,GACdA,EAASmzB,eAAelL,OAAOjoB,GAE/BqzB,GAAkB,GAGpB,SAASjL,EAAQpoB,GACfA,EAASmzB,eAAe/K,QAAQpoB,GAEhCA,EAAS/E,IAAI,CACXxa,SAAUuf,EAASmzB,eAAe1yC,WAItC,SAAS2yC,IACPT,EAAU1pC,SAAQ,SAAU+W,GAC1BA,EAAS/E,IAAI,CACXktB,OAAQA,EACRC,QAASA,EACTH,OAAQA,EACRf,MAAOgM,EAAiB,CAAC,EAAGhyC,MAAMC,QAAQ+lC,GAASA,EAAM,GAAKA,GAASA,EACvEzmC,SAAUyyC,EAAiBzyC,EAAWuf,EAASmzB,eAAe1yC,gBA4ElEkb,GACFhb,YAbF,WACE2oC,EAAUl9B,SAASkgC,iBAAiB,iBAAiBrjC,SAAQ,SAAUrJ,GACrE,IAAIqnC,EAAUrnC,EAAG8qC,aAAa,cAE1BzD,GACFmL,GAAMxyC,EAAI,CACRqnC,QAASA,UAgCF,UCr1Df,SAASqM,GAAUpM,EAAOqM,EAAY9/B,EAAU+/B,GAM9C,IAAIC,EACAC,GAAY,EAEZC,EAAW,EAEf,SAASC,IACHH,GACF1J,aAAa0J,GAuBjB,SAASI,IACP,IAAIC,EAAOruC,KACPsuC,EAAUjlB,KAAKnU,MAAQg5B,EACvBvJ,EAAOvrB,UAOX,SAASm1B,IACPL,EAAW7kB,KAAKnU,MAChBlH,EAAS/M,MAAMotC,EAAM1J,GAQvB,SAASnT,IACPwc,OAAYtxC,EAhBVuxC,IAmBAF,IAAiBC,GAKnBO,IAGFJ,SAEqBzxC,IAAjBqxC,GAA8BO,EAAU7M,EAK1C8M,KACwB,IAAfT,IAYTE,EAAY9yC,WAAW6yC,EAAevc,EAAQ+c,OAAuB7xC,IAAjBqxC,EAA6BtM,EAAQ6M,EAAU7M,KAMvG,MAtE0B,kBAAfqM,IACTC,EAAe//B,EACfA,EAAW8/B,EACXA,OAAapxC,GAiEf0xC,EAAQI,OA1ER,WACEL,IACAF,GAAY,GA0EPG,EC5GM,MAAM,GACjB,cACIpuC,KAAK4pB,IAAM,CACPW,EAAG5tB,OAAO4tB,EACVoN,OAAQh7B,OAAO4tB,EACfD,QAASC,EAAE5tB,QACX8xC,MAAOlkB,EAAE,QACTmkB,SAAUnkB,EAAE,qBAGhBvqB,KAAKktC,UAAY,GAEjBltC,KAAK+pB,OAGT,OACI/pB,KAAK2uC,iBACL3uC,KAAKqD,SACLrD,KAAK4uC,mBAGT,iBACI5uC,KAAK4pB,IAAI8kB,SAAS/c,KAAK,CAACC,EAAGid,KACvB,IAAIt0B,EAAW,GAAMs0B,EAAI,CACrB5d,QAAU1G,EAAEskB,GAAI5gC,KAAK,YAAc,aACnC+0B,MAAO,eACPrlB,UAAW,MACXwH,OAAO,EACPzZ,OAAQ,OACR81B,QAASxhC,KAAK8uC,QAAQD,GACtBpN,MAAO,IACP,aAAalnB,GACLgQ,EAAE,iCAAiCvuB,OAAS,GAAGuuB,EAAE,iCAAiC,GAAGuc,OAAO/f,UAIxG/mB,KAAKktC,UAAU/tC,KAAKob,KAI5B,QAAQuiB,GAQJ,OAPcvS,EAAE,WAAWI,KAAK,CAC5BokB,MAAO,oBACRz1B,KAAK,2EAEGiR,EAAEuS,GAAM7uB,KAAK,8BAGT,GAGnB,mBACIjO,KAAKktC,UAAU1pC,QAAS+W,IACM,GAAtBgQ,EAAE,UAAUvuB,QAAegE,KAAK4pB,IAAIU,QAAQzc,QAAUuM,SAAS,IAAK,cACpEG,EAAS/E,IAAI,CACTmI,UAAW,QACXjS,OAAQ,aAMxB,SDiEJ,IAAmB+1B,EAAOuN,EAAShhC,EChE3BhO,KAAK4pB,IAAI6kB,MAAMn5B,GAAG,QAAS,iBAAmB9a,IAC1CA,EAAED,iBACEgwB,EAAE,iCAAiCvuB,OAAS,GAAGuuB,EAAE,iCAAiC,GAAGuc,OAAO/f,SAGpG/mB,KAAK4pB,IAAIU,QAAQhV,GAAG,UD2DTmsB,EC3D4B,ID2DrBuN,EC3D0BhvC,KAAK4uC,iBAAiBn1C,KAAKuG,WD4DzDtD,IAAbsR,EAAyB6/B,GAASpM,EAAOuN,GAAS,GAASnB,GAASpM,EAAOzzB,GAAsB,IAAZghC,MEjI9F,MAAM,GACF,cACIhvC,KAAK4pB,IAAM,CACPW,EAAG5tB,OAAO4tB,EACVD,QAASC,EAAE5tB,QACXsyC,MAAO1kB,EAAE,UAGTvqB,KAAK4pB,IAAIqlB,MAAMjzC,QACfgE,KAAK+pB,OAIb,OACI/pB,KAAK4pB,IAAIqlB,MAAMtd,KAAK,CAACud,EAAQniB,IAAY,IAAI,EAAYA,IACzD,IAAI,IAIZpmB,SAAS2B,iBAAiB,mBAAoB,IAAM,IAAI","file":"calc-manager.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 = 4);\n","module.exports = {\"$xs\":\"0\",\"$sm\":\"576px\",\"$md\":\"768px\",\"$lg\":\"992px\",\"$very-lg\":\"1280px\",\"$xl\":\"1440px\",\"$xxl\":\"1650px\"};","/*! nouislider - 13.1.4 - 3/20/2019 */\n(function(factory) {\r\n if (typeof define === \"function\" && define.amd) {\r\n // AMD. Register as an anonymous module.\r\n define([], factory);\r\n } else if (typeof exports === \"object\") {\r\n // Node/CommonJS\r\n module.exports = factory();\r\n } else {\r\n // Browser globals\r\n window.noUiSlider = factory();\r\n }\r\n})(function() {\r\n \"use strict\";\r\n\r\n var VERSION = \"13.1.4\";\r\n\r\n //region Helper Methods\r\n\r\n function isValidFormatter(entry) {\r\n return typeof entry === \"object\" && typeof entry.to === \"function\" && typeof entry.from === \"function\";\r\n }\r\n\r\n function removeElement(el) {\r\n el.parentElement.removeChild(el);\r\n }\r\n\r\n function isSet(value) {\r\n return value !== null && value !== undefined;\r\n }\r\n\r\n // Bindable version\r\n function preventDefault(e) {\r\n e.preventDefault();\r\n }\r\n\r\n // Removes duplicates from an array.\r\n function unique(array) {\r\n return array.filter(function(a) {\r\n return !this[a] ? (this[a] = true) : false;\r\n }, {});\r\n }\r\n\r\n // Round a value to the closest 'to'.\r\n function closest(value, to) {\r\n return Math.round(value / to) * to;\r\n }\r\n\r\n // Current position of an element relative to the document.\r\n function offset(elem, orientation) {\r\n var rect = elem.getBoundingClientRect();\r\n var doc = elem.ownerDocument;\r\n var docElem = doc.documentElement;\r\n var pageOffset = getPageOffset(doc);\r\n\r\n // getBoundingClientRect contains left scroll in Chrome on Android.\r\n // I haven't found a feature detection that proves this. Worst case\r\n // scenario on mis-match: the 'tap' feature on horizontal sliders breaks.\r\n if (/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)) {\r\n pageOffset.x = 0;\r\n }\r\n\r\n return orientation\r\n ? rect.top + pageOffset.y - docElem.clientTop\r\n : rect.left + pageOffset.x - docElem.clientLeft;\r\n }\r\n\r\n // Checks whether a value is numerical.\r\n function isNumeric(a) {\r\n return typeof a === \"number\" && !isNaN(a) && isFinite(a);\r\n }\r\n\r\n // Sets a class and removes it after [duration] ms.\r\n function addClassFor(element, className, duration) {\r\n if (duration > 0) {\r\n addClass(element, className);\r\n setTimeout(function() {\r\n removeClass(element, className);\r\n }, duration);\r\n }\r\n }\r\n\r\n // Limits a value to 0 - 100\r\n function limit(a) {\r\n return Math.max(Math.min(a, 100), 0);\r\n }\r\n\r\n // Wraps a variable as an array, if it isn't one yet.\r\n // Note that an input array is returned by reference!\r\n function asArray(a) {\r\n return Array.isArray(a) ? a : [a];\r\n }\r\n\r\n // Counts decimals\r\n function countDecimals(numStr) {\r\n numStr = String(numStr);\r\n var pieces = numStr.split(\".\");\r\n return pieces.length > 1 ? pieces[1].length : 0;\r\n }\r\n\r\n // http://youmightnotneedjquery.com/#add_class\r\n function addClass(el, className) {\r\n if (el.classList) {\r\n el.classList.add(className);\r\n } else {\r\n el.className += \" \" + className;\r\n }\r\n }\r\n\r\n // http://youmightnotneedjquery.com/#remove_class\r\n function removeClass(el, className) {\r\n if (el.classList) {\r\n el.classList.remove(className);\r\n } else {\r\n el.className = el.className.replace(\r\n new RegExp(\"(^|\\\\b)\" + className.split(\" \").join(\"|\") + \"(\\\\b|$)\", \"gi\"),\r\n \" \"\r\n );\r\n }\r\n }\r\n\r\n // https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/\r\n function hasClass(el, className) {\r\n return el.classList\r\n ? el.classList.contains(className)\r\n : new RegExp(\"\\\\b\" + className + \"\\\\b\").test(el.className);\r\n }\r\n\r\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes\r\n function getPageOffset(doc) {\r\n var supportPageOffset = window.pageXOffset !== undefined;\r\n var isCSS1Compat = (doc.compatMode || \"\") === \"CSS1Compat\";\r\n var x = supportPageOffset\r\n ? window.pageXOffset\r\n : isCSS1Compat\r\n ? doc.documentElement.scrollLeft\r\n : doc.body.scrollLeft;\r\n var y = supportPageOffset\r\n ? window.pageYOffset\r\n : isCSS1Compat\r\n ? doc.documentElement.scrollTop\r\n : doc.body.scrollTop;\r\n\r\n return {\r\n x: x,\r\n y: y\r\n };\r\n }\r\n\r\n // we provide a function to compute constants instead\r\n // of accessing window.* as soon as the module needs it\r\n // so that we do not compute anything if not needed\r\n function getActions() {\r\n // Determine the events to bind. IE11 implements pointerEvents without\r\n // a prefix, which breaks compatibility with the IE10 implementation.\r\n return window.navigator.pointerEnabled\r\n ? {\r\n start: \"pointerdown\",\r\n move: \"pointermove\",\r\n end: \"pointerup\"\r\n }\r\n : window.navigator.msPointerEnabled\r\n ? {\r\n start: \"MSPointerDown\",\r\n move: \"MSPointerMove\",\r\n end: \"MSPointerUp\"\r\n }\r\n : {\r\n start: \"mousedown touchstart\",\r\n move: \"mousemove touchmove\",\r\n end: \"mouseup touchend\"\r\n };\r\n }\r\n\r\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n // Issue #785\r\n function getSupportsPassive() {\r\n var supportsPassive = false;\r\n\r\n /* eslint-disable */\r\n try {\r\n var opts = Object.defineProperty({}, \"passive\", {\r\n get: function() {\r\n supportsPassive = true;\r\n }\r\n });\r\n\r\n window.addEventListener(\"test\", null, opts);\r\n } catch (e) {}\r\n /* eslint-enable */\r\n\r\n return supportsPassive;\r\n }\r\n\r\n function getSupportsTouchActionNone() {\r\n return window.CSS && CSS.supports && CSS.supports(\"touch-action\", \"none\");\r\n }\r\n\r\n //endregion\r\n\r\n //region Range Calculation\r\n\r\n // Determine the size of a sub-range in relation to a full range.\r\n function subRangeRatio(pa, pb) {\r\n return 100 / (pb - pa);\r\n }\r\n\r\n // (percentage) How many percent is this value of this range?\r\n function fromPercentage(range, value) {\r\n return (value * 100) / (range[1] - range[0]);\r\n }\r\n\r\n // (percentage) Where is this value on this range?\r\n function toPercentage(range, value) {\r\n return fromPercentage(range, range[0] < 0 ? value + Math.abs(range[0]) : value - range[0]);\r\n }\r\n\r\n // (value) How much is this percentage on this range?\r\n function isPercentage(range, value) {\r\n return (value * (range[1] - range[0])) / 100 + range[0];\r\n }\r\n\r\n function getJ(value, arr) {\r\n var j = 1;\r\n\r\n while (value >= arr[j]) {\r\n j += 1;\r\n }\r\n\r\n return j;\r\n }\r\n\r\n // (percentage) Input a value, find where, on a scale of 0-100, it applies.\r\n function toStepping(xVal, xPct, value) {\r\n if (value >= xVal.slice(-1)[0]) {\r\n return 100;\r\n }\r\n\r\n var j = getJ(value, xVal);\r\n var va = xVal[j - 1];\r\n var vb = xVal[j];\r\n var pa = xPct[j - 1];\r\n var pb = xPct[j];\r\n\r\n return pa + toPercentage([va, vb], value) / subRangeRatio(pa, pb);\r\n }\r\n\r\n // (value) Input a percentage, find where it is on the specified range.\r\n function fromStepping(xVal, xPct, value) {\r\n // There is no range group that fits 100\r\n if (value >= 100) {\r\n return xVal.slice(-1)[0];\r\n }\r\n\r\n var j = getJ(value, xPct);\r\n var va = xVal[j - 1];\r\n var vb = xVal[j];\r\n var pa = xPct[j - 1];\r\n var pb = xPct[j];\r\n\r\n return isPercentage([va, vb], (value - pa) * subRangeRatio(pa, pb));\r\n }\r\n\r\n // (percentage) Get the step that applies at a certain value.\r\n function getStep(xPct, xSteps, snap, value) {\r\n if (value === 100) {\r\n return value;\r\n }\r\n\r\n var j = getJ(value, xPct);\r\n var a = xPct[j - 1];\r\n var b = xPct[j];\r\n\r\n // If 'snap' is set, steps are used as fixed points on the slider.\r\n if (snap) {\r\n // Find the closest position, a or b.\r\n if (value - a > (b - a) / 2) {\r\n return b;\r\n }\r\n\r\n return a;\r\n }\r\n\r\n if (!xSteps[j - 1]) {\r\n return value;\r\n }\r\n\r\n return xPct[j - 1] + closest(value - xPct[j - 1], xSteps[j - 1]);\r\n }\r\n\r\n function handleEntryPoint(index, value, that) {\r\n var percentage;\r\n\r\n // Wrap numerical input in an array.\r\n if (typeof value === \"number\") {\r\n value = [value];\r\n }\r\n\r\n // Reject any invalid input, by testing whether value is an array.\r\n if (!Array.isArray(value)) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'range' contains invalid value.\");\r\n }\r\n\r\n // Covert min/max syntax to 0 and 100.\r\n if (index === \"min\") {\r\n percentage = 0;\r\n } else if (index === \"max\") {\r\n percentage = 100;\r\n } else {\r\n percentage = parseFloat(index);\r\n }\r\n\r\n // Check for correct input.\r\n if (!isNumeric(percentage) || !isNumeric(value[0])) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'range' value isn't numeric.\");\r\n }\r\n\r\n // Store values.\r\n that.xPct.push(percentage);\r\n that.xVal.push(value[0]);\r\n\r\n // NaN will evaluate to false too, but to keep\r\n // logging clear, set step explicitly. Make sure\r\n // not to override the 'step' setting with false.\r\n if (!percentage) {\r\n if (!isNaN(value[1])) {\r\n that.xSteps[0] = value[1];\r\n }\r\n } else {\r\n that.xSteps.push(isNaN(value[1]) ? false : value[1]);\r\n }\r\n\r\n that.xHighestCompleteStep.push(0);\r\n }\r\n\r\n function handleStepPoint(i, n, that) {\r\n // Ignore 'false' stepping.\r\n if (!n) {\r\n return;\r\n }\r\n\r\n // Step over zero-length ranges (#948);\r\n if (that.xVal[i] === that.xVal[i + 1]) {\r\n that.xSteps[i] = that.xHighestCompleteStep[i] = that.xVal[i];\r\n\r\n return;\r\n }\r\n\r\n // Factor to range ratio\r\n that.xSteps[i] =\r\n fromPercentage([that.xVal[i], that.xVal[i + 1]], n) / subRangeRatio(that.xPct[i], that.xPct[i + 1]);\r\n\r\n var totalSteps = (that.xVal[i + 1] - that.xVal[i]) / that.xNumSteps[i];\r\n var highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1);\r\n var step = that.xVal[i] + that.xNumSteps[i] * highestStep;\r\n\r\n that.xHighestCompleteStep[i] = step;\r\n }\r\n\r\n //endregion\r\n\r\n //region Spectrum\r\n\r\n function Spectrum(entry, snap, singleStep) {\r\n this.xPct = [];\r\n this.xVal = [];\r\n this.xSteps = [singleStep || false];\r\n this.xNumSteps = [false];\r\n this.xHighestCompleteStep = [];\r\n\r\n this.snap = snap;\r\n\r\n var index;\r\n var ordered = []; // [0, 'min'], [1, '50%'], [2, 'max']\r\n\r\n // Map the object keys to an array.\r\n for (index in entry) {\r\n if (entry.hasOwnProperty(index)) {\r\n ordered.push([entry[index], index]);\r\n }\r\n }\r\n\r\n // Sort all entries by value (numeric sort).\r\n if (ordered.length && typeof ordered[0][0] === \"object\") {\r\n ordered.sort(function(a, b) {\r\n return a[0][0] - b[0][0];\r\n });\r\n } else {\r\n ordered.sort(function(a, b) {\r\n return a[0] - b[0];\r\n });\r\n }\r\n\r\n // Convert all entries to subranges.\r\n for (index = 0; index < ordered.length; index++) {\r\n handleEntryPoint(ordered[index][1], ordered[index][0], this);\r\n }\r\n\r\n // Store the actual step values.\r\n // xSteps is sorted in the same order as xPct and xVal.\r\n this.xNumSteps = this.xSteps.slice(0);\r\n\r\n // Convert all numeric steps to the percentage of the subrange they represent.\r\n for (index = 0; index < this.xNumSteps.length; index++) {\r\n handleStepPoint(index, this.xNumSteps[index], this);\r\n }\r\n }\r\n\r\n Spectrum.prototype.getMargin = function(value) {\r\n var step = this.xNumSteps[0];\r\n\r\n if (step && (value / step) % 1 !== 0) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'limit', 'margin' and 'padding' must be divisible by step.\");\r\n }\r\n\r\n return this.xPct.length === 2 ? fromPercentage(this.xVal, value) : false;\r\n };\r\n\r\n Spectrum.prototype.toStepping = function(value) {\r\n value = toStepping(this.xVal, this.xPct, value);\r\n\r\n return value;\r\n };\r\n\r\n Spectrum.prototype.fromStepping = function(value) {\r\n return fromStepping(this.xVal, this.xPct, value);\r\n };\r\n\r\n Spectrum.prototype.getStep = function(value) {\r\n value = getStep(this.xPct, this.xSteps, this.snap, value);\r\n\r\n return value;\r\n };\r\n\r\n Spectrum.prototype.getDefaultStep = function(value, isDown, size) {\r\n var j = getJ(value, this.xPct);\r\n\r\n // When at the top or stepping down, look at the previous sub-range\r\n if (value === 100 || (isDown && value === this.xPct[j - 1])) {\r\n j = Math.max(j - 1, 1);\r\n }\r\n\r\n return (this.xVal[j] - this.xVal[j - 1]) / size;\r\n };\r\n\r\n Spectrum.prototype.getNearbySteps = function(value) {\r\n var j = getJ(value, this.xPct);\r\n\r\n return {\r\n stepBefore: {\r\n startValue: this.xVal[j - 2],\r\n step: this.xNumSteps[j - 2],\r\n highestStep: this.xHighestCompleteStep[j - 2]\r\n },\r\n thisStep: {\r\n startValue: this.xVal[j - 1],\r\n step: this.xNumSteps[j - 1],\r\n highestStep: this.xHighestCompleteStep[j - 1]\r\n },\r\n stepAfter: {\r\n startValue: this.xVal[j],\r\n step: this.xNumSteps[j],\r\n highestStep: this.xHighestCompleteStep[j]\r\n }\r\n };\r\n };\r\n\r\n Spectrum.prototype.countStepDecimals = function() {\r\n var stepDecimals = this.xNumSteps.map(countDecimals);\r\n return Math.max.apply(null, stepDecimals);\r\n };\r\n\r\n // Outside testing\r\n Spectrum.prototype.convert = function(value) {\r\n return this.getStep(this.toStepping(value));\r\n };\r\n\r\n //endregion\r\n\r\n //region Options\r\n\r\n /*\tEvery input option is tested and parsed. This'll prevent\r\n endless validation in internal methods. These tests are\r\n structured with an item for every option available. An\r\n option can be marked as required by setting the 'r' flag.\r\n The testing function is provided with three arguments:\r\n - The provided value for the option;\r\n - A reference to the options object;\r\n - The name for the option;\r\n\r\n The testing function returns false when an error is detected,\r\n or true when everything is OK. It can also modify the option\r\n object, to make sure all values can be correctly looped elsewhere. */\r\n\r\n var defaultFormatter = {\r\n to: function(value) {\r\n return value !== undefined && value.toFixed(2);\r\n },\r\n from: Number\r\n };\r\n\r\n function validateFormat(entry) {\r\n // Any object with a to and from method is supported.\r\n if (isValidFormatter(entry)) {\r\n return true;\r\n }\r\n\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'format' requires 'to' and 'from' methods.\");\r\n }\r\n\r\n function testStep(parsed, entry) {\r\n if (!isNumeric(entry)) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'step' is not numeric.\");\r\n }\r\n\r\n // The step option can still be used to set stepping\r\n // for linear sliders. Overwritten if set in 'range'.\r\n parsed.singleStep = entry;\r\n }\r\n\r\n function testRange(parsed, entry) {\r\n // Filter incorrect input.\r\n if (typeof entry !== \"object\" || Array.isArray(entry)) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'range' is not an object.\");\r\n }\r\n\r\n // Catch missing start or end.\r\n if (entry.min === undefined || entry.max === undefined) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): Missing 'min' or 'max' in 'range'.\");\r\n }\r\n\r\n // Catch equal start or end.\r\n if (entry.min === entry.max) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'range' 'min' and 'max' cannot be equal.\");\r\n }\r\n\r\n parsed.spectrum = new Spectrum(entry, parsed.snap, parsed.singleStep);\r\n }\r\n\r\n function testStart(parsed, entry) {\r\n entry = asArray(entry);\r\n\r\n // Validate input. Values aren't tested, as the public .val method\r\n // will always provide a valid location.\r\n if (!Array.isArray(entry) || !entry.length) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'start' option is incorrect.\");\r\n }\r\n\r\n // Store the number of handles.\r\n parsed.handles = entry.length;\r\n\r\n // When the slider is initialized, the .val method will\r\n // be called with the start options.\r\n parsed.start = entry;\r\n }\r\n\r\n function testSnap(parsed, entry) {\r\n // Enforce 100% stepping within subranges.\r\n parsed.snap = entry;\r\n\r\n if (typeof entry !== \"boolean\") {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'snap' option must be a boolean.\");\r\n }\r\n }\r\n\r\n function testAnimate(parsed, entry) {\r\n // Enforce 100% stepping within subranges.\r\n parsed.animate = entry;\r\n\r\n if (typeof entry !== \"boolean\") {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'animate' option must be a boolean.\");\r\n }\r\n }\r\n\r\n function testAnimationDuration(parsed, entry) {\r\n parsed.animationDuration = entry;\r\n\r\n if (typeof entry !== \"number\") {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'animationDuration' option must be a number.\");\r\n }\r\n }\r\n\r\n function testConnect(parsed, entry) {\r\n var connect = [false];\r\n var i;\r\n\r\n // Map legacy options\r\n if (entry === \"lower\") {\r\n entry = [true, false];\r\n } else if (entry === \"upper\") {\r\n entry = [false, true];\r\n }\r\n\r\n // Handle boolean options\r\n if (entry === true || entry === false) {\r\n for (i = 1; i < parsed.handles; i++) {\r\n connect.push(entry);\r\n }\r\n\r\n connect.push(false);\r\n }\r\n\r\n // Reject invalid input\r\n else if (!Array.isArray(entry) || !entry.length || entry.length !== parsed.handles + 1) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'connect' option doesn't match handle count.\");\r\n } else {\r\n connect = entry;\r\n }\r\n\r\n parsed.connect = connect;\r\n }\r\n\r\n function testOrientation(parsed, entry) {\r\n // Set orientation to an a numerical value for easy\r\n // array selection.\r\n switch (entry) {\r\n case \"horizontal\":\r\n parsed.ort = 0;\r\n break;\r\n case \"vertical\":\r\n parsed.ort = 1;\r\n break;\r\n default:\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'orientation' option is invalid.\");\r\n }\r\n }\r\n\r\n function testMargin(parsed, entry) {\r\n if (!isNumeric(entry)) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'margin' option must be numeric.\");\r\n }\r\n\r\n // Issue #582\r\n if (entry === 0) {\r\n return;\r\n }\r\n\r\n parsed.margin = parsed.spectrum.getMargin(entry);\r\n\r\n if (!parsed.margin) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'margin' option is only supported on linear sliders.\");\r\n }\r\n }\r\n\r\n function testLimit(parsed, entry) {\r\n if (!isNumeric(entry)) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'limit' option must be numeric.\");\r\n }\r\n\r\n parsed.limit = parsed.spectrum.getMargin(entry);\r\n\r\n if (!parsed.limit || parsed.handles < 2) {\r\n throw new Error(\r\n \"noUiSlider (\" +\r\n VERSION +\r\n \"): 'limit' option is only supported on linear sliders with 2 or more handles.\"\r\n );\r\n }\r\n }\r\n\r\n function testPadding(parsed, entry) {\r\n if (!isNumeric(entry) && !Array.isArray(entry)) {\r\n throw new Error(\r\n \"noUiSlider (\" + VERSION + \"): 'padding' option must be numeric or array of exactly 2 numbers.\"\r\n );\r\n }\r\n\r\n if (Array.isArray(entry) && !(entry.length === 2 || isNumeric(entry[0]) || isNumeric(entry[1]))) {\r\n throw new Error(\r\n \"noUiSlider (\" + VERSION + \"): 'padding' option must be numeric or array of exactly 2 numbers.\"\r\n );\r\n }\r\n\r\n if (entry === 0) {\r\n return;\r\n }\r\n\r\n if (!Array.isArray(entry)) {\r\n entry = [entry, entry];\r\n }\r\n\r\n // 'getMargin' returns false for invalid values.\r\n parsed.padding = [parsed.spectrum.getMargin(entry[0]), parsed.spectrum.getMargin(entry[1])];\r\n\r\n if (parsed.padding[0] === false || parsed.padding[1] === false) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option is only supported on linear sliders.\");\r\n }\r\n\r\n if (parsed.padding[0] < 0 || parsed.padding[1] < 0) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be a positive number(s).\");\r\n }\r\n\r\n if (parsed.padding[0] + parsed.padding[1] >= 100) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must not exceed 100% of the range.\");\r\n }\r\n }\r\n\r\n function testDirection(parsed, entry) {\r\n // Set direction as a numerical value for easy parsing.\r\n // Invert connection for RTL sliders, so that the proper\r\n // handles get the connect/background classes.\r\n switch (entry) {\r\n case \"ltr\":\r\n parsed.dir = 0;\r\n break;\r\n case \"rtl\":\r\n parsed.dir = 1;\r\n break;\r\n default:\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'direction' option was not recognized.\");\r\n }\r\n }\r\n\r\n function testBehaviour(parsed, entry) {\r\n // Make sure the input is a string.\r\n if (typeof entry !== \"string\") {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'behaviour' must be a string containing options.\");\r\n }\r\n\r\n // Check if the string contains any keywords.\r\n // None are required.\r\n var tap = entry.indexOf(\"tap\") >= 0;\r\n var drag = entry.indexOf(\"drag\") >= 0;\r\n var fixed = entry.indexOf(\"fixed\") >= 0;\r\n var snap = entry.indexOf(\"snap\") >= 0;\r\n var hover = entry.indexOf(\"hover\") >= 0;\r\n var unconstrained = entry.indexOf(\"unconstrained\") >= 0;\r\n\r\n if (fixed) {\r\n if (parsed.handles !== 2) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'fixed' behaviour must be used with 2 handles\");\r\n }\r\n\r\n // Use margin to enforce fixed state\r\n testMargin(parsed, parsed.start[1] - parsed.start[0]);\r\n }\r\n\r\n if (unconstrained && (parsed.margin || parsed.limit)) {\r\n throw new Error(\r\n \"noUiSlider (\" + VERSION + \"): 'unconstrained' behaviour cannot be used with margin or limit\"\r\n );\r\n }\r\n\r\n parsed.events = {\r\n tap: tap || snap,\r\n drag: drag,\r\n fixed: fixed,\r\n snap: snap,\r\n hover: hover,\r\n unconstrained: unconstrained\r\n };\r\n }\r\n\r\n function testTooltips(parsed, entry) {\r\n if (entry === false) {\r\n return;\r\n }\r\n\r\n if (entry === true) {\r\n parsed.tooltips = [];\r\n\r\n for (var i = 0; i < parsed.handles; i++) {\r\n parsed.tooltips.push(true);\r\n }\r\n } else {\r\n parsed.tooltips = asArray(entry);\r\n\r\n if (parsed.tooltips.length !== parsed.handles) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): must pass a formatter for all handles.\");\r\n }\r\n\r\n parsed.tooltips.forEach(function(formatter) {\r\n if (\r\n typeof formatter !== \"boolean\" &&\r\n (typeof formatter !== \"object\" || typeof formatter.to !== \"function\")\r\n ) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'tooltips' must be passed a formatter or 'false'.\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n function testAriaFormat(parsed, entry) {\r\n parsed.ariaFormat = entry;\r\n validateFormat(entry);\r\n }\r\n\r\n function testFormat(parsed, entry) {\r\n parsed.format = entry;\r\n validateFormat(entry);\r\n }\r\n\r\n function testKeyboardSupport(parsed, entry) {\r\n parsed.keyboardSupport = entry;\r\n\r\n if (typeof entry !== \"boolean\") {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'keyboardSupport' option must be a boolean.\");\r\n }\r\n }\r\n\r\n function testDocumentElement(parsed, entry) {\r\n // This is an advanced option. Passed values are used without validation.\r\n parsed.documentElement = entry;\r\n }\r\n\r\n function testCssPrefix(parsed, entry) {\r\n if (typeof entry !== \"string\" && entry !== false) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'cssPrefix' must be a string or `false`.\");\r\n }\r\n\r\n parsed.cssPrefix = entry;\r\n }\r\n\r\n function testCssClasses(parsed, entry) {\r\n if (typeof entry !== \"object\") {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'cssClasses' must be an object.\");\r\n }\r\n\r\n if (typeof parsed.cssPrefix === \"string\") {\r\n parsed.cssClasses = {};\r\n\r\n for (var key in entry) {\r\n if (!entry.hasOwnProperty(key)) {\r\n continue;\r\n }\r\n\r\n parsed.cssClasses[key] = parsed.cssPrefix + entry[key];\r\n }\r\n } else {\r\n parsed.cssClasses = entry;\r\n }\r\n }\r\n\r\n // Test all developer settings and parse to assumption-safe values.\r\n function testOptions(options) {\r\n // To prove a fix for #537, freeze options here.\r\n // If the object is modified, an error will be thrown.\r\n // Object.freeze(options);\r\n\r\n var parsed = {\r\n margin: 0,\r\n limit: 0,\r\n padding: 0,\r\n animate: true,\r\n animationDuration: 300,\r\n ariaFormat: defaultFormatter,\r\n format: defaultFormatter\r\n };\r\n\r\n // Tests are executed in the order they are presented here.\r\n var tests = {\r\n step: { r: false, t: testStep },\r\n start: { r: true, t: testStart },\r\n connect: { r: true, t: testConnect },\r\n direction: { r: true, t: testDirection },\r\n snap: { r: false, t: testSnap },\r\n animate: { r: false, t: testAnimate },\r\n animationDuration: { r: false, t: testAnimationDuration },\r\n range: { r: true, t: testRange },\r\n orientation: { r: false, t: testOrientation },\r\n margin: { r: false, t: testMargin },\r\n limit: { r: false, t: testLimit },\r\n padding: { r: false, t: testPadding },\r\n behaviour: { r: true, t: testBehaviour },\r\n ariaFormat: { r: false, t: testAriaFormat },\r\n format: { r: false, t: testFormat },\r\n tooltips: { r: false, t: testTooltips },\r\n keyboardSupport: { r: true, t: testKeyboardSupport },\r\n documentElement: { r: false, t: testDocumentElement },\r\n cssPrefix: { r: true, t: testCssPrefix },\r\n cssClasses: { r: true, t: testCssClasses }\r\n };\r\n\r\n var defaults = {\r\n connect: false,\r\n direction: \"ltr\",\r\n behaviour: \"tap\",\r\n orientation: \"horizontal\",\r\n keyboardSupport: true,\r\n cssPrefix: \"noUi-\",\r\n cssClasses: {\r\n target: \"target\",\r\n base: \"base\",\r\n origin: \"origin\",\r\n handle: \"handle\",\r\n handleLower: \"handle-lower\",\r\n handleUpper: \"handle-upper\",\r\n touchArea: \"touch-area\",\r\n horizontal: \"horizontal\",\r\n vertical: \"vertical\",\r\n background: \"background\",\r\n connect: \"connect\",\r\n connects: \"connects\",\r\n ltr: \"ltr\",\r\n rtl: \"rtl\",\r\n draggable: \"draggable\",\r\n drag: \"state-drag\",\r\n tap: \"state-tap\",\r\n active: \"active\",\r\n tooltip: \"tooltip\",\r\n pips: \"pips\",\r\n pipsHorizontal: \"pips-horizontal\",\r\n pipsVertical: \"pips-vertical\",\r\n marker: \"marker\",\r\n markerHorizontal: \"marker-horizontal\",\r\n markerVertical: \"marker-vertical\",\r\n markerNormal: \"marker-normal\",\r\n markerLarge: \"marker-large\",\r\n markerSub: \"marker-sub\",\r\n value: \"value\",\r\n valueHorizontal: \"value-horizontal\",\r\n valueVertical: \"value-vertical\",\r\n valueNormal: \"value-normal\",\r\n valueLarge: \"value-large\",\r\n valueSub: \"value-sub\"\r\n }\r\n };\r\n\r\n // AriaFormat defaults to regular format, if any.\r\n if (options.format && !options.ariaFormat) {\r\n options.ariaFormat = options.format;\r\n }\r\n\r\n // Run all options through a testing mechanism to ensure correct\r\n // input. It should be noted that options might get modified to\r\n // be handled properly. E.g. wrapping integers in arrays.\r\n Object.keys(tests).forEach(function(name) {\r\n // If the option isn't set, but it is required, throw an error.\r\n if (!isSet(options[name]) && defaults[name] === undefined) {\r\n if (tests[name].r) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): '\" + name + \"' is required.\");\r\n }\r\n\r\n return true;\r\n }\r\n\r\n tests[name].t(parsed, !isSet(options[name]) ? defaults[name] : options[name]);\r\n });\r\n\r\n // Forward pips options\r\n parsed.pips = options.pips;\r\n\r\n // All recent browsers accept unprefixed transform.\r\n // We need -ms- for IE9 and -webkit- for older Android;\r\n // Assume use of -webkit- if unprefixed and -ms- are not supported.\r\n // https://caniuse.com/#feat=transforms2d\r\n var d = document.createElement(\"div\");\r\n var msPrefix = d.style.msTransform !== undefined;\r\n var noPrefix = d.style.transform !== undefined;\r\n\r\n parsed.transformRule = noPrefix ? \"transform\" : msPrefix ? \"msTransform\" : \"webkitTransform\";\r\n\r\n // Pips don't move, so we can place them using left/top.\r\n var styles = [[\"left\", \"top\"], [\"right\", \"bottom\"]];\r\n\r\n parsed.style = styles[parsed.dir][parsed.ort];\r\n\r\n return parsed;\r\n }\r\n\r\n //endregion\r\n\r\n function scope(target, options, originalOptions) {\r\n var actions = getActions();\r\n var supportsTouchActionNone = getSupportsTouchActionNone();\r\n var supportsPassive = supportsTouchActionNone && getSupportsPassive();\r\n\r\n // All variables local to 'scope' are prefixed with 'scope_'\r\n\r\n // Slider DOM Nodes\r\n var scope_Target = target;\r\n var scope_Base;\r\n var scope_Handles;\r\n var scope_Connects;\r\n var scope_Pips;\r\n var scope_Tooltips;\r\n\r\n // Slider state values\r\n var scope_Spectrum = options.spectrum;\r\n var scope_Values = [];\r\n var scope_Locations = [];\r\n var scope_HandleNumbers = [];\r\n var scope_ActiveHandlesCount = 0;\r\n var scope_Events = {};\r\n\r\n // Exposed API\r\n var scope_Self;\r\n\r\n // Document Nodes\r\n var scope_Document = target.ownerDocument;\r\n var scope_DocumentElement = options.documentElement || scope_Document.documentElement;\r\n var scope_Body = scope_Document.body;\r\n\r\n // Pips constants\r\n var PIPS_NONE = -1;\r\n var PIPS_NO_VALUE = 0;\r\n var PIPS_LARGE_VALUE = 1;\r\n var PIPS_SMALL_VALUE = 2;\r\n\r\n // For horizontal sliders in standard ltr documents,\r\n // make .noUi-origin overflow to the left so the document doesn't scroll.\r\n var scope_DirOffset = scope_Document.dir === \"rtl\" || options.ort === 1 ? 0 : 100;\r\n\r\n // Creates a node, adds it to target, returns the new node.\r\n function addNodeTo(addTarget, className) {\r\n var div = scope_Document.createElement(\"div\");\r\n\r\n if (className) {\r\n addClass(div, className);\r\n }\r\n\r\n addTarget.appendChild(div);\r\n\r\n return div;\r\n }\r\n\r\n // Append a origin to the base\r\n function addOrigin(base, handleNumber) {\r\n var origin = addNodeTo(base, options.cssClasses.origin);\r\n var handle = addNodeTo(origin, options.cssClasses.handle);\r\n\r\n addNodeTo(handle, options.cssClasses.touchArea);\r\n\r\n handle.setAttribute(\"data-handle\", handleNumber);\r\n\r\n if (options.keyboardSupport) {\r\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\r\n // 0 = focusable and reachable\r\n handle.setAttribute(\"tabindex\", \"0\");\r\n handle.addEventListener(\"keydown\", function(event) {\r\n return eventKeydown(event, handleNumber);\r\n });\r\n }\r\n\r\n handle.setAttribute(\"role\", \"slider\");\r\n handle.setAttribute(\"aria-orientation\", options.ort ? \"vertical\" : \"horizontal\");\r\n\r\n if (handleNumber === 0) {\r\n addClass(handle, options.cssClasses.handleLower);\r\n } else if (handleNumber === options.handles - 1) {\r\n addClass(handle, options.cssClasses.handleUpper);\r\n }\r\n\r\n return origin;\r\n }\r\n\r\n // Insert nodes for connect elements\r\n function addConnect(base, add) {\r\n if (!add) {\r\n return false;\r\n }\r\n\r\n return addNodeTo(base, options.cssClasses.connect);\r\n }\r\n\r\n // Add handles to the slider base.\r\n function addElements(connectOptions, base) {\r\n var connectBase = addNodeTo(base, options.cssClasses.connects);\r\n\r\n scope_Handles = [];\r\n scope_Connects = [];\r\n\r\n scope_Connects.push(addConnect(connectBase, connectOptions[0]));\r\n\r\n // [::::O====O====O====]\r\n // connectOptions = [0, 1, 1, 1]\r\n\r\n for (var i = 0; i < options.handles; i++) {\r\n // Keep a list of all added handles.\r\n scope_Handles.push(addOrigin(base, i));\r\n scope_HandleNumbers[i] = i;\r\n scope_Connects.push(addConnect(connectBase, connectOptions[i + 1]));\r\n }\r\n }\r\n\r\n // Initialize a single slider.\r\n function addSlider(addTarget) {\r\n // Apply classes and data to the target.\r\n addClass(addTarget, options.cssClasses.target);\r\n\r\n if (options.dir === 0) {\r\n addClass(addTarget, options.cssClasses.ltr);\r\n } else {\r\n addClass(addTarget, options.cssClasses.rtl);\r\n }\r\n\r\n if (options.ort === 0) {\r\n addClass(addTarget, options.cssClasses.horizontal);\r\n } else {\r\n addClass(addTarget, options.cssClasses.vertical);\r\n }\r\n\r\n return addNodeTo(addTarget, options.cssClasses.base);\r\n }\r\n\r\n function addTooltip(handle, handleNumber) {\r\n if (!options.tooltips[handleNumber]) {\r\n return false;\r\n }\r\n\r\n return addNodeTo(handle.firstChild, options.cssClasses.tooltip);\r\n }\r\n\r\n function isSliderDisabled() {\r\n return scope_Target.hasAttribute(\"disabled\");\r\n }\r\n\r\n // Disable the slider dragging if any handle is disabled\r\n function isHandleDisabled(handleNumber) {\r\n var handleOrigin = scope_Handles[handleNumber];\r\n return handleOrigin.hasAttribute(\"disabled\");\r\n }\r\n\r\n function removeTooltips() {\r\n if (scope_Tooltips) {\r\n removeEvent(\"update.tooltips\");\r\n scope_Tooltips.forEach(function(tooltip) {\r\n if (tooltip) {\r\n removeElement(tooltip);\r\n }\r\n });\r\n scope_Tooltips = null;\r\n }\r\n }\r\n\r\n // The tooltips option is a shorthand for using the 'update' event.\r\n function tooltips() {\r\n removeTooltips();\r\n\r\n // Tooltips are added with options.tooltips in original order.\r\n scope_Tooltips = scope_Handles.map(addTooltip);\r\n\r\n bindEvent(\"update.tooltips\", function(values, handleNumber, unencoded) {\r\n if (!scope_Tooltips[handleNumber]) {\r\n return;\r\n }\r\n\r\n var formattedValue = values[handleNumber];\r\n\r\n if (options.tooltips[handleNumber] !== true) {\r\n formattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]);\r\n }\r\n\r\n scope_Tooltips[handleNumber].innerHTML = formattedValue;\r\n });\r\n }\r\n\r\n function aria() {\r\n bindEvent(\"update\", function(values, handleNumber, unencoded, tap, positions) {\r\n // Update Aria Values for all handles, as a change in one changes min and max values for the next.\r\n scope_HandleNumbers.forEach(function(index) {\r\n var handle = scope_Handles[index];\r\n\r\n var min = checkHandlePosition(scope_Locations, index, 0, true, true, true);\r\n var max = checkHandlePosition(scope_Locations, index, 100, true, true, true);\r\n\r\n var now = positions[index];\r\n\r\n // Formatted value for display\r\n var text = options.ariaFormat.to(unencoded[index]);\r\n\r\n // Map to slider range values\r\n min = scope_Spectrum.fromStepping(min).toFixed(1);\r\n max = scope_Spectrum.fromStepping(max).toFixed(1);\r\n now = scope_Spectrum.fromStepping(now).toFixed(1);\r\n\r\n handle.children[0].setAttribute(\"aria-valuemin\", min);\r\n handle.children[0].setAttribute(\"aria-valuemax\", max);\r\n handle.children[0].setAttribute(\"aria-valuenow\", now);\r\n handle.children[0].setAttribute(\"aria-valuetext\", text);\r\n });\r\n });\r\n }\r\n\r\n function getGroup(mode, values, stepped) {\r\n // Use the range.\r\n if (mode === \"range\" || mode === \"steps\") {\r\n return scope_Spectrum.xVal;\r\n }\r\n\r\n if (mode === \"count\") {\r\n if (values < 2) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): 'values' (>= 2) required for mode 'count'.\");\r\n }\r\n\r\n // Divide 0 - 100 in 'count' parts.\r\n var interval = values - 1;\r\n var spread = 100 / interval;\r\n\r\n values = [];\r\n\r\n // List these parts and have them handled as 'positions'.\r\n while (interval--) {\r\n values[interval] = interval * spread;\r\n }\r\n\r\n values.push(100);\r\n\r\n mode = \"positions\";\r\n }\r\n\r\n if (mode === \"positions\") {\r\n // Map all percentages to on-range values.\r\n return values.map(function(value) {\r\n return scope_Spectrum.fromStepping(stepped ? scope_Spectrum.getStep(value) : value);\r\n });\r\n }\r\n\r\n if (mode === \"values\") {\r\n // If the value must be stepped, it needs to be converted to a percentage first.\r\n if (stepped) {\r\n return values.map(function(value) {\r\n // Convert to percentage, apply step, return to value.\r\n return scope_Spectrum.fromStepping(scope_Spectrum.getStep(scope_Spectrum.toStepping(value)));\r\n });\r\n }\r\n\r\n // Otherwise, we can simply use the values.\r\n return values;\r\n }\r\n }\r\n\r\n function generateSpread(density, mode, group) {\r\n function safeIncrement(value, increment) {\r\n // Avoid floating point variance by dropping the smallest decimal places.\r\n return (value + increment).toFixed(7) / 1;\r\n }\r\n\r\n var indexes = {};\r\n var firstInRange = scope_Spectrum.xVal[0];\r\n var lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length - 1];\r\n var ignoreFirst = false;\r\n var ignoreLast = false;\r\n var prevPct = 0;\r\n\r\n // Create a copy of the group, sort it and filter away all duplicates.\r\n group = unique(\r\n group.slice().sort(function(a, b) {\r\n return a - b;\r\n })\r\n );\r\n\r\n // Make sure the range starts with the first element.\r\n if (group[0] !== firstInRange) {\r\n group.unshift(firstInRange);\r\n ignoreFirst = true;\r\n }\r\n\r\n // Likewise for the last one.\r\n if (group[group.length - 1] !== lastInRange) {\r\n group.push(lastInRange);\r\n ignoreLast = true;\r\n }\r\n\r\n group.forEach(function(current, index) {\r\n // Get the current step and the lower + upper positions.\r\n var step;\r\n var i;\r\n var q;\r\n var low = current;\r\n var high = group[index + 1];\r\n var newPct;\r\n var pctDifference;\r\n var pctPos;\r\n var type;\r\n var steps;\r\n var realSteps;\r\n var stepSize;\r\n var isSteps = mode === \"steps\";\r\n\r\n // When using 'steps' mode, use the provided steps.\r\n // Otherwise, we'll step on to the next subrange.\r\n if (isSteps) {\r\n step = scope_Spectrum.xNumSteps[index];\r\n }\r\n\r\n // Default to a 'full' step.\r\n if (!step) {\r\n step = high - low;\r\n }\r\n\r\n // Low can be 0, so test for false. If high is undefined,\r\n // we are at the last subrange. Index 0 is already handled.\r\n if (low === false || high === undefined) {\r\n return;\r\n }\r\n\r\n // Make sure step isn't 0, which would cause an infinite loop (#654)\r\n step = Math.max(step, 0.0000001);\r\n\r\n // Find all steps in the subrange.\r\n for (i = low; i <= high; i = safeIncrement(i, step)) {\r\n // Get the percentage value for the current step,\r\n // calculate the size for the subrange.\r\n newPct = scope_Spectrum.toStepping(i);\r\n pctDifference = newPct - prevPct;\r\n\r\n steps = pctDifference / density;\r\n realSteps = Math.round(steps);\r\n\r\n // This ratio represents the amount of percentage-space a point indicates.\r\n // For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-divided.\r\n // Round the percentage offset to an even number, then divide by two\r\n // to spread the offset on both sides of the range.\r\n stepSize = pctDifference / realSteps;\r\n\r\n // Divide all points evenly, adding the correct number to this subrange.\r\n // Run up to <= so that 100% gets a point, event if ignoreLast is set.\r\n for (q = 1; q <= realSteps; q += 1) {\r\n // The ratio between the rounded value and the actual size might be ~1% off.\r\n // Correct the percentage offset by the number of points\r\n // per subrange. density = 1 will result in 100 points on the\r\n // full range, 2 for 50, 4 for 25, etc.\r\n pctPos = prevPct + q * stepSize;\r\n indexes[pctPos.toFixed(5)] = [scope_Spectrum.fromStepping(pctPos), 0];\r\n }\r\n\r\n // Determine the point type.\r\n type = group.indexOf(i) > -1 ? PIPS_LARGE_VALUE : isSteps ? PIPS_SMALL_VALUE : PIPS_NO_VALUE;\r\n\r\n // Enforce the 'ignoreFirst' option by overwriting the type for 0.\r\n if (!index && ignoreFirst) {\r\n type = 0;\r\n }\r\n\r\n if (!(i === high && ignoreLast)) {\r\n // Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value.\r\n indexes[newPct.toFixed(5)] = [i, type];\r\n }\r\n\r\n // Update the percentage count.\r\n prevPct = newPct;\r\n }\r\n });\r\n\r\n return indexes;\r\n }\r\n\r\n function addMarking(spread, filterFunc, formatter) {\r\n var element = scope_Document.createElement(\"div\");\r\n\r\n var valueSizeClasses = [];\r\n valueSizeClasses[PIPS_NO_VALUE] = options.cssClasses.valueNormal;\r\n valueSizeClasses[PIPS_LARGE_VALUE] = options.cssClasses.valueLarge;\r\n valueSizeClasses[PIPS_SMALL_VALUE] = options.cssClasses.valueSub;\r\n\r\n var markerSizeClasses = [];\r\n markerSizeClasses[PIPS_NO_VALUE] = options.cssClasses.markerNormal;\r\n markerSizeClasses[PIPS_LARGE_VALUE] = options.cssClasses.markerLarge;\r\n markerSizeClasses[PIPS_SMALL_VALUE] = options.cssClasses.markerSub;\r\n\r\n var valueOrientationClasses = [options.cssClasses.valueHorizontal, options.cssClasses.valueVertical];\r\n var markerOrientationClasses = [options.cssClasses.markerHorizontal, options.cssClasses.markerVertical];\r\n\r\n addClass(element, options.cssClasses.pips);\r\n addClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical);\r\n\r\n function getClasses(type, source) {\r\n var a = source === options.cssClasses.value;\r\n var orientationClasses = a ? valueOrientationClasses : markerOrientationClasses;\r\n var sizeClasses = a ? valueSizeClasses : markerSizeClasses;\r\n\r\n return source + \" \" + orientationClasses[options.ort] + \" \" + sizeClasses[type];\r\n }\r\n\r\n function addSpread(offset, value, type) {\r\n // Apply the filter function, if it is set.\r\n type = filterFunc ? filterFunc(value, type) : type;\r\n\r\n if (type === PIPS_NONE) {\r\n return;\r\n }\r\n\r\n // Add a marker for every point\r\n var node = addNodeTo(element, false);\r\n node.className = getClasses(type, options.cssClasses.marker);\r\n node.style[options.style] = offset + \"%\";\r\n\r\n // Values are only appended for points marked '1' or '2'.\r\n if (type > PIPS_NO_VALUE) {\r\n node = addNodeTo(element, false);\r\n node.className = getClasses(type, options.cssClasses.value);\r\n node.setAttribute(\"data-value\", value);\r\n node.style[options.style] = offset + \"%\";\r\n node.innerHTML = formatter.to(value);\r\n }\r\n }\r\n\r\n // Append all points.\r\n Object.keys(spread).forEach(function(offset) {\r\n addSpread(offset, spread[offset][0], spread[offset][1]);\r\n });\r\n\r\n return element;\r\n }\r\n\r\n function removePips() {\r\n if (scope_Pips) {\r\n removeElement(scope_Pips);\r\n scope_Pips = null;\r\n }\r\n }\r\n\r\n function pips(grid) {\r\n // Fix #669\r\n removePips();\r\n\r\n var mode = grid.mode;\r\n var density = grid.density || 1;\r\n var filter = grid.filter || false;\r\n var values = grid.values || false;\r\n var stepped = grid.stepped || false;\r\n var group = getGroup(mode, values, stepped);\r\n var spread = generateSpread(density, mode, group);\r\n var format = grid.format || {\r\n to: Math.round\r\n };\r\n\r\n scope_Pips = scope_Target.appendChild(addMarking(spread, filter, format));\r\n\r\n return scope_Pips;\r\n }\r\n\r\n // Shorthand for base dimensions.\r\n function baseSize() {\r\n var rect = scope_Base.getBoundingClientRect();\r\n var alt = \"offset\" + [\"Width\", \"Height\"][options.ort];\r\n return options.ort === 0 ? rect.width || scope_Base[alt] : rect.height || scope_Base[alt];\r\n }\r\n\r\n // Handler for attaching events trough a proxy.\r\n function attachEvent(events, element, callback, data) {\r\n // This function can be used to 'filter' events to the slider.\r\n // element is a node, not a nodeList\r\n\r\n var method = function(e) {\r\n e = fixEvent(e, data.pageOffset, data.target || element);\r\n\r\n // fixEvent returns false if this event has a different target\r\n // when handling (multi-) touch events;\r\n if (!e) {\r\n return false;\r\n }\r\n\r\n // doNotReject is passed by all end events to make sure released touches\r\n // are not rejected, leaving the slider \"stuck\" to the cursor;\r\n if (isSliderDisabled() && !data.doNotReject) {\r\n return false;\r\n }\r\n\r\n // Stop if an active 'tap' transition is taking place.\r\n if (hasClass(scope_Target, options.cssClasses.tap) && !data.doNotReject) {\r\n return false;\r\n }\r\n\r\n // Ignore right or middle clicks on start #454\r\n if (events === actions.start && e.buttons !== undefined && e.buttons > 1) {\r\n return false;\r\n }\r\n\r\n // Ignore right or middle clicks on start #454\r\n if (data.hover && e.buttons) {\r\n return false;\r\n }\r\n\r\n // 'supportsPassive' is only true if a browser also supports touch-action: none in CSS.\r\n // iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support\r\n // touch-action: manipulation, but that allows panning, which breaks\r\n // sliders after zooming/on non-responsive pages.\r\n // See: https://bugs.webkit.org/show_bug.cgi?id=133112\r\n if (!supportsPassive) {\r\n e.preventDefault();\r\n }\r\n\r\n e.calcPoint = e.points[options.ort];\r\n\r\n // Call the event handler with the event [ and additional data ].\r\n callback(e, data);\r\n };\r\n\r\n var methods = [];\r\n\r\n // Bind a closure on the target for every event type.\r\n events.split(\" \").forEach(function(eventName) {\r\n element.addEventListener(eventName, method, supportsPassive ? { passive: true } : false);\r\n methods.push([eventName, method]);\r\n });\r\n\r\n return methods;\r\n }\r\n\r\n // Provide a clean event with standardized offset values.\r\n function fixEvent(e, pageOffset, eventTarget) {\r\n // Filter the event to register the type, which can be\r\n // touch, mouse or pointer. Offset changes need to be\r\n // made on an event specific basis.\r\n var touch = e.type.indexOf(\"touch\") === 0;\r\n var mouse = e.type.indexOf(\"mouse\") === 0;\r\n var pointer = e.type.indexOf(\"pointer\") === 0;\r\n\r\n var x;\r\n var y;\r\n\r\n // IE10 implemented pointer events with a prefix;\r\n if (e.type.indexOf(\"MSPointer\") === 0) {\r\n pointer = true;\r\n }\r\n\r\n // The only thing one handle should be concerned about is the touches that originated on top of it.\r\n if (touch) {\r\n // Returns true if a touch originated on the target.\r\n var isTouchOnTarget = function(checkTouch) {\r\n return checkTouch.target === eventTarget || eventTarget.contains(checkTouch.target);\r\n };\r\n\r\n // In the case of touchstart events, we need to make sure there is still no more than one\r\n // touch on the target so we look amongst all touches.\r\n if (e.type === \"touchstart\") {\r\n var targetTouches = Array.prototype.filter.call(e.touches, isTouchOnTarget);\r\n\r\n // Do not support more than one touch per handle.\r\n if (targetTouches.length > 1) {\r\n return false;\r\n }\r\n\r\n x = targetTouches[0].pageX;\r\n y = targetTouches[0].pageY;\r\n } else {\r\n // In the other cases, find on changedTouches is enough.\r\n var targetTouch = Array.prototype.find.call(e.changedTouches, isTouchOnTarget);\r\n\r\n // Cancel if the target touch has not moved.\r\n if (!targetTouch) {\r\n return false;\r\n }\r\n\r\n x = targetTouch.pageX;\r\n y = targetTouch.pageY;\r\n }\r\n }\r\n\r\n pageOffset = pageOffset || getPageOffset(scope_Document);\r\n\r\n if (mouse || pointer) {\r\n x = e.clientX + pageOffset.x;\r\n y = e.clientY + pageOffset.y;\r\n }\r\n\r\n e.pageOffset = pageOffset;\r\n e.points = [x, y];\r\n e.cursor = mouse || pointer; // Fix #435\r\n\r\n return e;\r\n }\r\n\r\n // Translate a coordinate in the document to a percentage on the slider\r\n function calcPointToPercentage(calcPoint) {\r\n var location = calcPoint - offset(scope_Base, options.ort);\r\n var proposal = (location * 100) / baseSize();\r\n\r\n // Clamp proposal between 0% and 100%\r\n // Out-of-bound coordinates may occur when .noUi-base pseudo-elements\r\n // are used (e.g. contained handles feature)\r\n proposal = limit(proposal);\r\n\r\n return options.dir ? 100 - proposal : proposal;\r\n }\r\n\r\n // Find handle closest to a certain percentage on the slider\r\n function getClosestHandle(proposal) {\r\n var closest = 100;\r\n var handleNumber = false;\r\n\r\n scope_Handles.forEach(function(handle, index) {\r\n // Disabled handles are ignored\r\n if (isHandleDisabled(index)) {\r\n return;\r\n }\r\n\r\n var pos = Math.abs(scope_Locations[index] - proposal);\r\n\r\n if (pos < closest || (pos === 100 && closest === 100)) {\r\n handleNumber = index;\r\n closest = pos;\r\n }\r\n });\r\n\r\n return handleNumber;\r\n }\r\n\r\n // Fire 'end' when a mouse or pen leaves the document.\r\n function documentLeave(event, data) {\r\n if (event.type === \"mouseout\" && event.target.nodeName === \"HTML\" && event.relatedTarget === null) {\r\n eventEnd(event, data);\r\n }\r\n }\r\n\r\n // Handle movement on document for handle and range drag.\r\n function eventMove(event, data) {\r\n // Fix #498\r\n // Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty).\r\n // https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero\r\n // IE9 has .buttons and .which zero on mousemove.\r\n // Firefox breaks the spec MDN defines.\r\n if (navigator.appVersion.indexOf(\"MSIE 9\") === -1 && event.buttons === 0 && data.buttonsProperty !== 0) {\r\n return eventEnd(event, data);\r\n }\r\n\r\n // Check if we are moving up or down\r\n var movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint);\r\n\r\n // Convert the movement into a percentage of the slider width/height\r\n var proposal = (movement * 100) / data.baseSize;\r\n\r\n moveHandles(movement > 0, proposal, data.locations, data.handleNumbers);\r\n }\r\n\r\n // Unbind move events on document, call callbacks.\r\n function eventEnd(event, data) {\r\n // The handle is no longer active, so remove the class.\r\n if (data.handle) {\r\n removeClass(data.handle, options.cssClasses.active);\r\n scope_ActiveHandlesCount -= 1;\r\n }\r\n\r\n // Unbind the move and end events, which are added on 'start'.\r\n data.listeners.forEach(function(c) {\r\n scope_DocumentElement.removeEventListener(c[0], c[1]);\r\n });\r\n\r\n if (scope_ActiveHandlesCount === 0) {\r\n // Remove dragging class.\r\n removeClass(scope_Target, options.cssClasses.drag);\r\n setZindex();\r\n\r\n // Remove cursor styles and text-selection events bound to the body.\r\n if (event.cursor) {\r\n scope_Body.style.cursor = \"\";\r\n scope_Body.removeEventListener(\"selectstart\", preventDefault);\r\n }\r\n }\r\n\r\n data.handleNumbers.forEach(function(handleNumber) {\r\n fireEvent(\"change\", handleNumber);\r\n fireEvent(\"set\", handleNumber);\r\n fireEvent(\"end\", handleNumber);\r\n });\r\n }\r\n\r\n // Bind move events on document.\r\n function eventStart(event, data) {\r\n // Ignore event if any handle is disabled\r\n if (data.handleNumbers.some(isHandleDisabled)) {\r\n return false;\r\n }\r\n\r\n var handle;\r\n\r\n if (data.handleNumbers.length === 1) {\r\n var handleOrigin = scope_Handles[data.handleNumbers[0]];\r\n\r\n handle = handleOrigin.children[0];\r\n scope_ActiveHandlesCount += 1;\r\n\r\n // Mark the handle as 'active' so it can be styled.\r\n addClass(handle, options.cssClasses.active);\r\n }\r\n\r\n // A drag should never propagate up to the 'tap' event.\r\n event.stopPropagation();\r\n\r\n // Record the event listeners.\r\n var listeners = [];\r\n\r\n // Attach the move and end events.\r\n var moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, {\r\n // The event target has changed so we need to propagate the original one so that we keep\r\n // relying on it to extract target touches.\r\n target: event.target,\r\n handle: handle,\r\n listeners: listeners,\r\n startCalcPoint: event.calcPoint,\r\n baseSize: baseSize(),\r\n pageOffset: event.pageOffset,\r\n handleNumbers: data.handleNumbers,\r\n buttonsProperty: event.buttons,\r\n locations: scope_Locations.slice()\r\n });\r\n\r\n var endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, {\r\n target: event.target,\r\n handle: handle,\r\n listeners: listeners,\r\n doNotReject: true,\r\n handleNumbers: data.handleNumbers\r\n });\r\n\r\n var outEvent = attachEvent(\"mouseout\", scope_DocumentElement, documentLeave, {\r\n target: event.target,\r\n handle: handle,\r\n listeners: listeners,\r\n doNotReject: true,\r\n handleNumbers: data.handleNumbers\r\n });\r\n\r\n // We want to make sure we pushed the listeners in the listener list rather than creating\r\n // a new one as it has already been passed to the event handlers.\r\n listeners.push.apply(listeners, moveEvent.concat(endEvent, outEvent));\r\n\r\n // Text selection isn't an issue on touch devices,\r\n // so adding cursor styles can be skipped.\r\n if (event.cursor) {\r\n // Prevent the 'I' cursor and extend the range-drag cursor.\r\n scope_Body.style.cursor = getComputedStyle(event.target).cursor;\r\n\r\n // Mark the target with a dragging state.\r\n if (scope_Handles.length > 1) {\r\n addClass(scope_Target, options.cssClasses.drag);\r\n }\r\n\r\n // Prevent text selection when dragging the handles.\r\n // In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move,\r\n // which is scroll blocking. The selectstart event is supported by FireFox starting from version 52,\r\n // meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there.\r\n // The 'cursor' flag is false.\r\n // See: http://caniuse.com/#search=selectstart\r\n scope_Body.addEventListener(\"selectstart\", preventDefault, false);\r\n }\r\n\r\n data.handleNumbers.forEach(function(handleNumber) {\r\n fireEvent(\"start\", handleNumber);\r\n });\r\n }\r\n\r\n // Move closest handle to tapped location.\r\n function eventTap(event) {\r\n // The tap event shouldn't propagate up\r\n event.stopPropagation();\r\n\r\n var proposal = calcPointToPercentage(event.calcPoint);\r\n var handleNumber = getClosestHandle(proposal);\r\n\r\n // Tackle the case that all handles are 'disabled'.\r\n if (handleNumber === false) {\r\n return false;\r\n }\r\n\r\n // Flag the slider as it is now in a transitional state.\r\n // Transition takes a configurable amount of ms (default 300). Re-enable the slider after that.\r\n if (!options.events.snap) {\r\n addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\r\n }\r\n\r\n setHandle(handleNumber, proposal, true, true);\r\n\r\n setZindex();\r\n\r\n fireEvent(\"slide\", handleNumber, true);\r\n fireEvent(\"update\", handleNumber, true);\r\n fireEvent(\"change\", handleNumber, true);\r\n fireEvent(\"set\", handleNumber, true);\r\n\r\n if (options.events.snap) {\r\n eventStart(event, { handleNumbers: [handleNumber] });\r\n }\r\n }\r\n\r\n // Fires a 'hover' event for a hovered mouse/pen position.\r\n function eventHover(event) {\r\n var proposal = calcPointToPercentage(event.calcPoint);\r\n\r\n var to = scope_Spectrum.getStep(proposal);\r\n var value = scope_Spectrum.fromStepping(to);\r\n\r\n Object.keys(scope_Events).forEach(function(targetEvent) {\r\n if (\"hover\" === targetEvent.split(\".\")[0]) {\r\n scope_Events[targetEvent].forEach(function(callback) {\r\n callback.call(scope_Self, value);\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Handles keydown on focused handles\r\n // Don't move the document when pressing arrow keys on focused handles\r\n function eventKeydown(event, handleNumber) {\r\n if (isSliderDisabled() || isHandleDisabled(handleNumber)) {\r\n return false;\r\n }\r\n\r\n var horizontalKeys = [\"Left\", \"Right\"];\r\n var verticalKeys = [\"Down\", \"Up\"];\r\n\r\n if (options.dir && !options.ort) {\r\n // On an right-to-left slider, the left and right keys act inverted\r\n horizontalKeys.reverse();\r\n } else if (options.ort && !options.dir) {\r\n // On a top-to-bottom slider, the up and down keys act inverted\r\n verticalKeys.reverse();\r\n }\r\n\r\n // Strip \"Arrow\" for IE compatibility. https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key\r\n var key = event.key.replace(\"Arrow\", \"\");\r\n var isDown = key === verticalKeys[0] || key === horizontalKeys[0];\r\n var isUp = key === verticalKeys[1] || key === horizontalKeys[1];\r\n\r\n if (!isDown && !isUp) {\r\n return true;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n var direction = isDown ? 0 : 1;\r\n var steps = getNextStepsForHandle(handleNumber);\r\n var step = steps[direction];\r\n\r\n // At the edge of a slider, do nothing\r\n if (step === null) {\r\n return false;\r\n }\r\n\r\n // No step set, use the default of 10% of the sub-range\r\n if (step === false) {\r\n step = scope_Spectrum.getDefaultStep(scope_Locations[handleNumber], isDown, 10);\r\n }\r\n\r\n // Step over zero-length ranges (#948);\r\n step = Math.max(step, 0.0000001);\r\n\r\n // Decrement for down steps\r\n step = (isDown ? -1 : 1) * step;\r\n\r\n valueSetHandle(handleNumber, scope_Values[handleNumber] + step, true);\r\n\r\n return false;\r\n }\r\n\r\n // Attach events to several slider parts.\r\n function bindSliderEvents(behaviour) {\r\n // Attach the standard drag event to the handles.\r\n if (!behaviour.fixed) {\r\n scope_Handles.forEach(function(handle, index) {\r\n // These events are only bound to the visual handle\r\n // element, not the 'real' origin element.\r\n attachEvent(actions.start, handle.children[0], eventStart, {\r\n handleNumbers: [index]\r\n });\r\n });\r\n }\r\n\r\n // Attach the tap event to the slider base.\r\n if (behaviour.tap) {\r\n attachEvent(actions.start, scope_Base, eventTap, {});\r\n }\r\n\r\n // Fire hover events\r\n if (behaviour.hover) {\r\n attachEvent(actions.move, scope_Base, eventHover, {\r\n hover: true\r\n });\r\n }\r\n\r\n // Make the range draggable.\r\n if (behaviour.drag) {\r\n scope_Connects.forEach(function(connect, index) {\r\n if (connect === false || index === 0 || index === scope_Connects.length - 1) {\r\n return;\r\n }\r\n\r\n var handleBefore = scope_Handles[index - 1];\r\n var handleAfter = scope_Handles[index];\r\n var eventHolders = [connect];\r\n\r\n addClass(connect, options.cssClasses.draggable);\r\n\r\n // When the range is fixed, the entire range can\r\n // be dragged by the handles. The handle in the first\r\n // origin will propagate the start event upward,\r\n // but it needs to be bound manually on the other.\r\n if (behaviour.fixed) {\r\n eventHolders.push(handleBefore.children[0]);\r\n eventHolders.push(handleAfter.children[0]);\r\n }\r\n\r\n eventHolders.forEach(function(eventHolder) {\r\n attachEvent(actions.start, eventHolder, eventStart, {\r\n handles: [handleBefore, handleAfter],\r\n handleNumbers: [index - 1, index]\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n // Attach an event to this slider, possibly including a namespace\r\n function bindEvent(namespacedEvent, callback) {\r\n scope_Events[namespacedEvent] = scope_Events[namespacedEvent] || [];\r\n scope_Events[namespacedEvent].push(callback);\r\n\r\n // If the event bound is 'update,' fire it immediately for all handles.\r\n if (namespacedEvent.split(\".\")[0] === \"update\") {\r\n scope_Handles.forEach(function(a, index) {\r\n fireEvent(\"update\", index);\r\n });\r\n }\r\n }\r\n\r\n // Undo attachment of event\r\n function removeEvent(namespacedEvent) {\r\n var event = namespacedEvent && namespacedEvent.split(\".\")[0];\r\n var namespace = event && namespacedEvent.substring(event.length);\r\n\r\n Object.keys(scope_Events).forEach(function(bind) {\r\n var tEvent = bind.split(\".\")[0];\r\n var tNamespace = bind.substring(tEvent.length);\r\n\r\n if ((!event || event === tEvent) && (!namespace || namespace === tNamespace)) {\r\n delete scope_Events[bind];\r\n }\r\n });\r\n }\r\n\r\n // External event handling\r\n function fireEvent(eventName, handleNumber, tap) {\r\n Object.keys(scope_Events).forEach(function(targetEvent) {\r\n var eventType = targetEvent.split(\".\")[0];\r\n\r\n if (eventName === eventType) {\r\n scope_Events[targetEvent].forEach(function(callback) {\r\n callback.call(\r\n // Use the slider public API as the scope ('this')\r\n scope_Self,\r\n // Return values as array, so arg_1[arg_2] is always valid.\r\n scope_Values.map(options.format.to),\r\n // Handle index, 0 or 1\r\n handleNumber,\r\n // Un-formatted slider values\r\n scope_Values.slice(),\r\n // Event is fired by tap, true or false\r\n tap || false,\r\n // Left offset of the handle, in relation to the slider\r\n scope_Locations.slice()\r\n );\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Split out the handle positioning logic so the Move event can use it, too\r\n function checkHandlePosition(reference, handleNumber, to, lookBackward, lookForward, getValue) {\r\n // For sliders with multiple handles, limit movement to the other handle.\r\n // Apply the margin option by adding it to the handle positions.\r\n if (scope_Handles.length > 1 && !options.events.unconstrained) {\r\n if (lookBackward && handleNumber > 0) {\r\n to = Math.max(to, reference[handleNumber - 1] + options.margin);\r\n }\r\n\r\n if (lookForward && handleNumber < scope_Handles.length - 1) {\r\n to = Math.min(to, reference[handleNumber + 1] - options.margin);\r\n }\r\n }\r\n\r\n // The limit option has the opposite effect, limiting handles to a\r\n // maximum distance from another. Limit must be > 0, as otherwise\r\n // handles would be unmovable.\r\n if (scope_Handles.length > 1 && options.limit) {\r\n if (lookBackward && handleNumber > 0) {\r\n to = Math.min(to, reference[handleNumber - 1] + options.limit);\r\n }\r\n\r\n if (lookForward && handleNumber < scope_Handles.length - 1) {\r\n to = Math.max(to, reference[handleNumber + 1] - options.limit);\r\n }\r\n }\r\n\r\n // The padding option keeps the handles a certain distance from the\r\n // edges of the slider. Padding must be > 0.\r\n if (options.padding) {\r\n if (handleNumber === 0) {\r\n to = Math.max(to, options.padding[0]);\r\n }\r\n\r\n if (handleNumber === scope_Handles.length - 1) {\r\n to = Math.min(to, 100 - options.padding[1]);\r\n }\r\n }\r\n\r\n to = scope_Spectrum.getStep(to);\r\n\r\n // Limit percentage to the 0 - 100 range\r\n to = limit(to);\r\n\r\n // Return false if handle can't move\r\n if (to === reference[handleNumber] && !getValue) {\r\n return false;\r\n }\r\n\r\n return to;\r\n }\r\n\r\n // Uses slider orientation to create CSS rules. a = base value;\r\n function inRuleOrder(v, a) {\r\n var o = options.ort;\r\n return (o ? a : v) + \", \" + (o ? v : a);\r\n }\r\n\r\n // Moves handle(s) by a percentage\r\n // (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...])\r\n function moveHandles(upward, proposal, locations, handleNumbers) {\r\n var proposals = locations.slice();\r\n\r\n var b = [!upward, upward];\r\n var f = [upward, !upward];\r\n\r\n // Copy handleNumbers so we don't change the dataset\r\n handleNumbers = handleNumbers.slice();\r\n\r\n // Check to see which handle is 'leading'.\r\n // If that one can't move the second can't either.\r\n if (upward) {\r\n handleNumbers.reverse();\r\n }\r\n\r\n // Step 1: get the maximum percentage that any of the handles can move\r\n if (handleNumbers.length > 1) {\r\n handleNumbers.forEach(function(handleNumber, o) {\r\n var to = checkHandlePosition(\r\n proposals,\r\n handleNumber,\r\n proposals[handleNumber] + proposal,\r\n b[o],\r\n f[o],\r\n false\r\n );\r\n\r\n // Stop if one of the handles can't move.\r\n if (to === false) {\r\n proposal = 0;\r\n } else {\r\n proposal = to - proposals[handleNumber];\r\n proposals[handleNumber] = to;\r\n }\r\n });\r\n }\r\n\r\n // If using one handle, check backward AND forward\r\n else {\r\n b = f = [true];\r\n }\r\n\r\n var state = false;\r\n\r\n // Step 2: Try to set the handles with the found percentage\r\n handleNumbers.forEach(function(handleNumber, o) {\r\n state = setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o]) || state;\r\n });\r\n\r\n // Step 3: If a handle moved, fire events\r\n if (state) {\r\n handleNumbers.forEach(function(handleNumber) {\r\n fireEvent(\"update\", handleNumber);\r\n fireEvent(\"slide\", handleNumber);\r\n });\r\n }\r\n }\r\n\r\n // Takes a base value and an offset. This offset is used for the connect bar size.\r\n // In the initial design for this feature, the origin element was 1% wide.\r\n // Unfortunately, a rounding bug in Chrome makes it impossible to implement this feature\r\n // in this manner: https://bugs.chromium.org/p/chromium/issues/detail?id=798223\r\n function transformDirection(a, b) {\r\n return options.dir ? 100 - a - b : a;\r\n }\r\n\r\n // Updates scope_Locations and scope_Values, updates visual state\r\n function updateHandlePosition(handleNumber, to) {\r\n // Update locations.\r\n scope_Locations[handleNumber] = to;\r\n\r\n // Convert the value to the slider stepping/range.\r\n scope_Values[handleNumber] = scope_Spectrum.fromStepping(to);\r\n\r\n var rule = \"translate(\" + inRuleOrder(transformDirection(to, 0) - scope_DirOffset + \"%\", \"0\") + \")\";\r\n scope_Handles[handleNumber].style[options.transformRule] = rule;\r\n\r\n updateConnect(handleNumber);\r\n updateConnect(handleNumber + 1);\r\n }\r\n\r\n // Handles before the slider middle are stacked later = higher,\r\n // Handles after the middle later is lower\r\n // [[7] [8] .......... | .......... [5] [4]\r\n function setZindex() {\r\n scope_HandleNumbers.forEach(function(handleNumber) {\r\n var dir = scope_Locations[handleNumber] > 50 ? -1 : 1;\r\n var zIndex = 3 + (scope_Handles.length + dir * handleNumber);\r\n scope_Handles[handleNumber].style.zIndex = zIndex;\r\n });\r\n }\r\n\r\n // Test suggested values and apply margin, step.\r\n function setHandle(handleNumber, to, lookBackward, lookForward) {\r\n to = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false);\r\n\r\n if (to === false) {\r\n return false;\r\n }\r\n\r\n updateHandlePosition(handleNumber, to);\r\n\r\n return true;\r\n }\r\n\r\n // Updates style attribute for connect nodes\r\n function updateConnect(index) {\r\n // Skip connects set to false\r\n if (!scope_Connects[index]) {\r\n return;\r\n }\r\n\r\n var l = 0;\r\n var h = 100;\r\n\r\n if (index !== 0) {\r\n l = scope_Locations[index - 1];\r\n }\r\n\r\n if (index !== scope_Connects.length - 1) {\r\n h = scope_Locations[index];\r\n }\r\n\r\n // We use two rules:\r\n // 'translate' to change the left/top offset;\r\n // 'scale' to change the width of the element;\r\n // As the element has a width of 100%, a translation of 100% is equal to 100% of the parent (.noUi-base)\r\n var connectWidth = h - l;\r\n var translateRule = \"translate(\" + inRuleOrder(transformDirection(l, connectWidth) + \"%\", \"0\") + \")\";\r\n var scaleRule = \"scale(\" + inRuleOrder(connectWidth / 100, \"1\") + \")\";\r\n\r\n scope_Connects[index].style[options.transformRule] = translateRule + \" \" + scaleRule;\r\n }\r\n\r\n // Parses value passed to .set method. Returns current value if not parse-able.\r\n function resolveToValue(to, handleNumber) {\r\n // Setting with null indicates an 'ignore'.\r\n // Inputting 'false' is invalid.\r\n if (to === null || to === false || to === undefined) {\r\n return scope_Locations[handleNumber];\r\n }\r\n\r\n // If a formatted number was passed, attempt to decode it.\r\n if (typeof to === \"number\") {\r\n to = String(to);\r\n }\r\n\r\n to = options.format.from(to);\r\n to = scope_Spectrum.toStepping(to);\r\n\r\n // If parsing the number failed, use the current value.\r\n if (to === false || isNaN(to)) {\r\n return scope_Locations[handleNumber];\r\n }\r\n\r\n return to;\r\n }\r\n\r\n // Set the slider value.\r\n function valueSet(input, fireSetEvent) {\r\n var values = asArray(input);\r\n var isInit = scope_Locations[0] === undefined;\r\n\r\n // Event fires by default\r\n fireSetEvent = fireSetEvent === undefined ? true : !!fireSetEvent;\r\n\r\n // Animation is optional.\r\n // Make sure the initial values were set before using animated placement.\r\n if (options.animate && !isInit) {\r\n addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\r\n }\r\n\r\n // First pass, without lookAhead but with lookBackward. Values are set from left to right.\r\n scope_HandleNumbers.forEach(function(handleNumber) {\r\n setHandle(handleNumber, resolveToValue(values[handleNumber], handleNumber), true, false);\r\n });\r\n\r\n // Second pass. Now that all base values are set, apply constraints\r\n scope_HandleNumbers.forEach(function(handleNumber) {\r\n setHandle(handleNumber, scope_Locations[handleNumber], true, true);\r\n });\r\n\r\n setZindex();\r\n\r\n scope_HandleNumbers.forEach(function(handleNumber) {\r\n fireEvent(\"update\", handleNumber);\r\n\r\n // Fire the event only for handles that received a new value, as per #579\r\n if (values[handleNumber] !== null && fireSetEvent) {\r\n fireEvent(\"set\", handleNumber);\r\n }\r\n });\r\n }\r\n\r\n // Reset slider to initial values\r\n function valueReset(fireSetEvent) {\r\n valueSet(options.start, fireSetEvent);\r\n }\r\n\r\n // Set value for a single handle\r\n function valueSetHandle(handleNumber, value, fireSetEvent) {\r\n // Ensure numeric input\r\n handleNumber = Number(handleNumber);\r\n\r\n if (!(handleNumber >= 0 && handleNumber < scope_HandleNumbers.length)) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): invalid handle number, got: \" + handleNumber);\r\n }\r\n\r\n // Look both backward and forward, since we don't want this handle to \"push\" other handles (#960);\r\n setHandle(handleNumber, resolveToValue(value, handleNumber), true, true);\r\n\r\n fireEvent(\"update\", handleNumber);\r\n\r\n if (fireSetEvent) {\r\n fireEvent(\"set\", handleNumber);\r\n }\r\n }\r\n\r\n // Get the slider value.\r\n function valueGet() {\r\n var values = scope_Values.map(options.format.to);\r\n\r\n // If only one handle is used, return a single value.\r\n if (values.length === 1) {\r\n return values[0];\r\n }\r\n\r\n return values;\r\n }\r\n\r\n // Removes classes from the root and empties it.\r\n function destroy() {\r\n for (var key in options.cssClasses) {\r\n if (!options.cssClasses.hasOwnProperty(key)) {\r\n continue;\r\n }\r\n removeClass(scope_Target, options.cssClasses[key]);\r\n }\r\n\r\n while (scope_Target.firstChild) {\r\n scope_Target.removeChild(scope_Target.firstChild);\r\n }\r\n\r\n delete scope_Target.noUiSlider;\r\n }\r\n\r\n function getNextStepsForHandle(handleNumber) {\r\n var location = scope_Locations[handleNumber];\r\n var nearbySteps = scope_Spectrum.getNearbySteps(location);\r\n var value = scope_Values[handleNumber];\r\n var increment = nearbySteps.thisStep.step;\r\n var decrement = null;\r\n\r\n // If snapped, directly use defined step value\r\n if (options.snap) {\r\n return [\r\n value - nearbySteps.stepBefore.startValue || null,\r\n nearbySteps.stepAfter.startValue - value || null\r\n ];\r\n }\r\n\r\n // If the next value in this step moves into the next step,\r\n // the increment is the start of the next step - the current value\r\n if (increment !== false) {\r\n if (value + increment > nearbySteps.stepAfter.startValue) {\r\n increment = nearbySteps.stepAfter.startValue - value;\r\n }\r\n }\r\n\r\n // If the value is beyond the starting point\r\n if (value > nearbySteps.thisStep.startValue) {\r\n decrement = nearbySteps.thisStep.step;\r\n } else if (nearbySteps.stepBefore.step === false) {\r\n decrement = false;\r\n }\r\n\r\n // If a handle is at the start of a step, it always steps back into the previous step first\r\n else {\r\n decrement = value - nearbySteps.stepBefore.highestStep;\r\n }\r\n\r\n // Now, if at the slider edges, there is no in/decrement\r\n if (location === 100) {\r\n increment = null;\r\n } else if (location === 0) {\r\n decrement = null;\r\n }\r\n\r\n // As per #391, the comparison for the decrement step can have some rounding issues.\r\n var stepDecimals = scope_Spectrum.countStepDecimals();\r\n\r\n // Round per #391\r\n if (increment !== null && increment !== false) {\r\n increment = Number(increment.toFixed(stepDecimals));\r\n }\r\n\r\n if (decrement !== null && decrement !== false) {\r\n decrement = Number(decrement.toFixed(stepDecimals));\r\n }\r\n\r\n return [decrement, increment];\r\n }\r\n\r\n // Get the current step size for the slider.\r\n function getNextSteps() {\r\n return scope_HandleNumbers.map(getNextStepsForHandle);\r\n }\r\n\r\n // Updateable: margin, limit, padding, step, range, animate, snap\r\n function updateOptions(optionsToUpdate, fireSetEvent) {\r\n // Spectrum is created using the range, snap, direction and step options.\r\n // 'snap' and 'step' can be updated.\r\n // If 'snap' and 'step' are not passed, they should remain unchanged.\r\n var v = valueGet();\r\n\r\n var updateAble = [\r\n \"margin\",\r\n \"limit\",\r\n \"padding\",\r\n \"range\",\r\n \"animate\",\r\n \"snap\",\r\n \"step\",\r\n \"format\",\r\n \"pips\",\r\n \"tooltips\"\r\n ];\r\n\r\n // Only change options that we're actually passed to update.\r\n updateAble.forEach(function(name) {\r\n // Check for undefined. null removes the value.\r\n if (optionsToUpdate[name] !== undefined) {\r\n originalOptions[name] = optionsToUpdate[name];\r\n }\r\n });\r\n\r\n var newOptions = testOptions(originalOptions);\r\n\r\n // Load new options into the slider state\r\n updateAble.forEach(function(name) {\r\n if (optionsToUpdate[name] !== undefined) {\r\n options[name] = newOptions[name];\r\n }\r\n });\r\n\r\n scope_Spectrum = newOptions.spectrum;\r\n\r\n // Limit, margin and padding depend on the spectrum but are stored outside of it. (#677)\r\n options.margin = newOptions.margin;\r\n options.limit = newOptions.limit;\r\n options.padding = newOptions.padding;\r\n\r\n // Update pips, removes existing.\r\n if (options.pips) {\r\n pips(options.pips);\r\n } else {\r\n removePips();\r\n }\r\n\r\n // Update tooltips, removes existing.\r\n if (options.tooltips) {\r\n tooltips();\r\n } else {\r\n removeTooltips();\r\n }\r\n\r\n // Invalidate the current positioning so valueSet forces an update.\r\n scope_Locations = [];\r\n valueSet(optionsToUpdate.start || v, fireSetEvent);\r\n }\r\n\r\n // Initialization steps\r\n function setupSlider() {\r\n // Create the base element, initialize HTML and set classes.\r\n // Add handles and connect elements.\r\n scope_Base = addSlider(scope_Target);\r\n\r\n addElements(options.connect, scope_Base);\r\n\r\n // Attach user events.\r\n bindSliderEvents(options.events);\r\n\r\n // Use the public value method to set the start values.\r\n valueSet(options.start);\r\n\r\n if (options.pips) {\r\n pips(options.pips);\r\n }\r\n\r\n if (options.tooltips) {\r\n tooltips();\r\n }\r\n\r\n aria();\r\n }\r\n\r\n setupSlider();\r\n\r\n // noinspection JSUnusedGlobalSymbols\r\n scope_Self = {\r\n destroy: destroy,\r\n steps: getNextSteps,\r\n on: bindEvent,\r\n off: removeEvent,\r\n get: valueGet,\r\n set: valueSet,\r\n setHandle: valueSetHandle,\r\n reset: valueReset,\r\n // Exposed for unit testing, don't use this in your application.\r\n __moveHandles: function(a, b, c) {\r\n moveHandles(a, b, scope_Locations, c);\r\n },\r\n options: originalOptions, // Issue #600, #678\r\n updateOptions: updateOptions,\r\n target: scope_Target, // Issue #597\r\n removePips: removePips,\r\n removeTooltips: removeTooltips,\r\n pips: pips // Issue #594\r\n };\r\n\r\n return scope_Self;\r\n }\r\n\r\n // Run the standard initializer\r\n function initialize(target, originalOptions) {\r\n if (!target || !target.nodeName) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): create requires a single element, got: \" + target);\r\n }\r\n\r\n // Throw an error if the slider was already initialized.\r\n if (target.noUiSlider) {\r\n throw new Error(\"noUiSlider (\" + VERSION + \"): Slider was already initialized.\");\r\n }\r\n\r\n // Test the options and create the slider environment;\r\n var options = testOptions(originalOptions, target);\r\n var api = scope(target, options, originalOptions);\r\n\r\n target.noUiSlider = api;\r\n\r\n return api;\r\n }\r\n\r\n // Use an object instead of a function for future expandability;\r\n return {\r\n // Exposed for unit testing, don't use this in your application.\r\n __spectrum: Spectrum,\r\n version: VERSION,\r\n create: initialize\r\n };\r\n});\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/noUiSlider/distribute/nouislider.js\n// module id = 34\n// module chunks = 0","/**!\r\n * @fileOverview Kickass library to create and place poppers near their reference elements.\r\n * @version 1.14.7\r\n * @license\r\n * Copyright (c) 2016 Federico Zivolo and contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n */\r\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\r\n\r\nvar longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\r\nvar timeoutDuration = 0;\r\nfor (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\r\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\r\n timeoutDuration = 1;\r\n break;\r\n }\r\n}\r\n\r\nfunction microtaskDebounce(fn) {\r\n var called = false;\r\n return function () {\r\n if (called) {\r\n return;\r\n }\r\n called = true;\r\n window.Promise.resolve().then(function () {\r\n called = false;\r\n fn();\r\n });\r\n };\r\n}\r\n\r\nfunction taskDebounce(fn) {\r\n var scheduled = false;\r\n return function () {\r\n if (!scheduled) {\r\n scheduled = true;\r\n setTimeout(function () {\r\n scheduled = false;\r\n fn();\r\n }, timeoutDuration);\r\n }\r\n };\r\n}\r\n\r\nvar supportsMicroTasks = isBrowser && window.Promise;\r\n\r\n/**\r\n* Create a debounced version of a method, that's asynchronously deferred\r\n* but called in the minimum time possible.\r\n*\r\n* @method\r\n* @memberof Popper.Utils\r\n* @argument {Function} fn\r\n* @returns {Function}\r\n*/\r\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\r\n\r\n/**\r\n * Check if the given variable is a function\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Any} functionToCheck - variable to check\r\n * @returns {Boolean} answer to: is a function?\r\n */\r\nfunction isFunction(functionToCheck) {\r\n var getType = {};\r\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\r\n}\r\n\r\n/**\r\n * Get CSS computed property of the given element\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Eement} element\r\n * @argument {String} property\r\n */\r\nfunction getStyleComputedProperty(element, property) {\r\n if (element.nodeType !== 1) {\r\n return [];\r\n }\r\n // NOTE: 1 DOM access here\r\n var window = element.ownerDocument.defaultView;\r\n var css = window.getComputedStyle(element, null);\r\n return property ? css[property] : css;\r\n}\r\n\r\n/**\r\n * Returns the parentNode or the host of the element\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Element} element\r\n * @returns {Element} parent\r\n */\r\nfunction getParentNode(element) {\r\n if (element.nodeName === 'HTML') {\r\n return element;\r\n }\r\n return element.parentNode || element.host;\r\n}\r\n\r\n/**\r\n * Returns the scrolling parent of the given element\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Element} element\r\n * @returns {Element} scroll parent\r\n */\r\nfunction getScrollParent(element) {\r\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\r\n if (!element) {\r\n return document.body;\r\n }\r\n\r\n switch (element.nodeName) {\r\n case 'HTML':\r\n case 'BODY':\r\n return element.ownerDocument.body;\r\n case '#document':\r\n return element.body;\r\n }\r\n\r\n // Firefox want us to check `-x` and `-y` variations as well\r\n\r\n var _getStyleComputedProp = getStyleComputedProperty(element),\r\n overflow = _getStyleComputedProp.overflow,\r\n overflowX = _getStyleComputedProp.overflowX,\r\n overflowY = _getStyleComputedProp.overflowY;\r\n\r\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\r\n return element;\r\n }\r\n\r\n return getScrollParent(getParentNode(element));\r\n}\r\n\r\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\r\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\r\n\r\n/**\r\n * Determines if the browser is Internet Explorer\r\n * @method\r\n * @memberof Popper.Utils\r\n * @param {Number} version to check\r\n * @returns {Boolean} isIE\r\n */\r\nfunction isIE(version) {\r\n if (version === 11) {\r\n return isIE11;\r\n }\r\n if (version === 10) {\r\n return isIE10;\r\n }\r\n return isIE11 || isIE10;\r\n}\r\n\r\n/**\r\n * Returns the offset parent of the given element\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Element} element\r\n * @returns {Element} offset parent\r\n */\r\nfunction getOffsetParent(element) {\r\n if (!element) {\r\n return document.documentElement;\r\n }\r\n\r\n var noOffsetParent = isIE(10) ? document.body : null;\r\n\r\n // NOTE: 1 DOM access here\r\n var offsetParent = element.offsetParent || null;\r\n // Skip hidden elements which don't have an offsetParent\r\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\r\n offsetParent = (element = element.nextElementSibling).offsetParent;\r\n }\r\n\r\n var nodeName = offsetParent && offsetParent.nodeName;\r\n\r\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\r\n return element ? element.ownerDocument.documentElement : document.documentElement;\r\n }\r\n\r\n // .offsetParent will return the closest TH, TD or TABLE in case\r\n // no offsetParent is present, I hate this job...\r\n if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\r\n return getOffsetParent(offsetParent);\r\n }\r\n\r\n return offsetParent;\r\n}\r\n\r\nfunction isOffsetContainer(element) {\r\n var nodeName = element.nodeName;\r\n\r\n if (nodeName === 'BODY') {\r\n return false;\r\n }\r\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\r\n}\r\n\r\n/**\r\n * Finds the root node (document, shadowDOM root) of the given element\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Element} node\r\n * @returns {Element} root node\r\n */\r\nfunction getRoot(node) {\r\n if (node.parentNode !== null) {\r\n return getRoot(node.parentNode);\r\n }\r\n\r\n return node;\r\n}\r\n\r\n/**\r\n * Finds the offset parent common to the two provided nodes\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Element} element1\r\n * @argument {Element} element2\r\n * @returns {Element} common offset parent\r\n */\r\nfunction findCommonOffsetParent(element1, element2) {\r\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\r\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\r\n return document.documentElement;\r\n }\r\n\r\n // Here we make sure to give as \"start\" the element that comes first in the DOM\r\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\r\n var start = order ? element1 : element2;\r\n var end = order ? element2 : element1;\r\n\r\n // Get common ancestor container\r\n var range = document.createRange();\r\n range.setStart(start, 0);\r\n range.setEnd(end, 0);\r\n var commonAncestorContainer = range.commonAncestorContainer;\r\n\r\n // Both nodes are inside #document\r\n\r\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\r\n if (isOffsetContainer(commonAncestorContainer)) {\r\n return commonAncestorContainer;\r\n }\r\n\r\n return getOffsetParent(commonAncestorContainer);\r\n }\r\n\r\n // one of the nodes is inside shadowDOM, find which one\r\n var element1root = getRoot(element1);\r\n if (element1root.host) {\r\n return findCommonOffsetParent(element1root.host, element2);\r\n } else {\r\n return findCommonOffsetParent(element1, getRoot(element2).host);\r\n }\r\n}\r\n\r\n/**\r\n * Gets the scroll value of the given element in the given side (top and left)\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Element} element\r\n * @argument {String} side `top` or `left`\r\n * @returns {number} amount of scrolled pixels\r\n */\r\nfunction getScroll(element) {\r\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\r\n\r\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\r\n var nodeName = element.nodeName;\r\n\r\n if (nodeName === 'BODY' || nodeName === 'HTML') {\r\n var html = element.ownerDocument.documentElement;\r\n var scrollingElement = element.ownerDocument.scrollingElement || html;\r\n return scrollingElement[upperSide];\r\n }\r\n\r\n return element[upperSide];\r\n}\r\n\r\n/*\r\n * Sum or subtract the element scroll values (left and top) from a given rect object\r\n * @method\r\n * @memberof Popper.Utils\r\n * @param {Object} rect - Rect object you want to change\r\n * @param {HTMLElement} element - The element from the function reads the scroll values\r\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\r\n * @return {Object} rect - The modifier rect object\r\n */\r\nfunction includeScroll(rect, element) {\r\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\r\n\r\n var scrollTop = getScroll(element, 'top');\r\n var scrollLeft = getScroll(element, 'left');\r\n var modifier = subtract ? -1 : 1;\r\n rect.top += scrollTop * modifier;\r\n rect.bottom += scrollTop * modifier;\r\n rect.left += scrollLeft * modifier;\r\n rect.right += scrollLeft * modifier;\r\n return rect;\r\n}\r\n\r\n/*\r\n * Helper to detect borders of a given element\r\n * @method\r\n * @memberof Popper.Utils\r\n * @param {CSSStyleDeclaration} styles\r\n * Result of `getStyleComputedProperty` on the given element\r\n * @param {String} axis - `x` or `y`\r\n * @return {number} borders - The borders size of the given axis\r\n */\r\n\r\nfunction getBordersSize(styles, axis) {\r\n var sideA = axis === 'x' ? 'Left' : 'Top';\r\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\r\n\r\n return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\r\n}\r\n\r\nfunction getSize(axis, body, html, computedStyle) {\r\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\r\n}\r\n\r\nfunction getWindowSizes(document) {\r\n var body = document.body;\r\n var html = document.documentElement;\r\n var computedStyle = isIE(10) && getComputedStyle(html);\r\n\r\n return {\r\n height: getSize('Height', body, html, computedStyle),\r\n width: getSize('Width', body, html, computedStyle)\r\n };\r\n}\r\n\r\nvar classCallCheck = function (instance, Constructor) {\r\n if (!(instance instanceof Constructor)) {\r\n throw new TypeError(\"Cannot call a class as a function\");\r\n }\r\n};\r\n\r\nvar createClass = function () {\r\n function defineProperties(target, props) {\r\n for (var i = 0; i < props.length; i++) {\r\n var descriptor = props[i];\r\n descriptor.enumerable = descriptor.enumerable || false;\r\n descriptor.configurable = true;\r\n if (\"value\" in descriptor) descriptor.writable = true;\r\n Object.defineProperty(target, descriptor.key, descriptor);\r\n }\r\n }\r\n\r\n return function (Constructor, protoProps, staticProps) {\r\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\r\n if (staticProps) defineProperties(Constructor, staticProps);\r\n return Constructor;\r\n };\r\n}();\r\n\r\n\r\n\r\n\r\n\r\nvar defineProperty = function (obj, key, value) {\r\n if (key in obj) {\r\n Object.defineProperty(obj, key, {\r\n value: value,\r\n enumerable: true,\r\n configurable: true,\r\n writable: true\r\n });\r\n } else {\r\n obj[key] = value;\r\n }\r\n\r\n return obj;\r\n};\r\n\r\nvar _extends = Object.assign || function (target) {\r\n for (var i = 1; i < arguments.length; i++) {\r\n var source = arguments[i];\r\n\r\n for (var key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n\r\n return target;\r\n};\r\n\r\n/**\r\n * Given element offsets, generate an output similar to getBoundingClientRect\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Object} offsets\r\n * @returns {Object} ClientRect like output\r\n */\r\nfunction getClientRect(offsets) {\r\n return _extends({}, offsets, {\r\n right: offsets.left + offsets.width,\r\n bottom: offsets.top + offsets.height\r\n });\r\n}\r\n\r\n/**\r\n * Get bounding client rect of given element\r\n * @method\r\n * @memberof Popper.Utils\r\n * @param {HTMLElement} element\r\n * @return {Object} client rect\r\n */\r\nfunction getBoundingClientRect(element) {\r\n var rect = {};\r\n\r\n // IE10 10 FIX: Please, don't ask, the element isn't\r\n // considered in DOM in some circumstances...\r\n // This isn't reproducible in IE10 compatibility mode of IE11\r\n try {\r\n if (isIE(10)) {\r\n rect = element.getBoundingClientRect();\r\n var scrollTop = getScroll(element, 'top');\r\n var scrollLeft = getScroll(element, 'left');\r\n rect.top += scrollTop;\r\n rect.left += scrollLeft;\r\n rect.bottom += scrollTop;\r\n rect.right += scrollLeft;\r\n } else {\r\n rect = element.getBoundingClientRect();\r\n }\r\n } catch (e) {}\r\n\r\n var result = {\r\n left: rect.left,\r\n top: rect.top,\r\n width: rect.right - rect.left,\r\n height: rect.bottom - rect.top\r\n };\r\n\r\n // subtract scrollbar size from sizes\r\n var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\r\n var width = sizes.width || element.clientWidth || result.right - result.left;\r\n var height = sizes.height || element.clientHeight || result.bottom - result.top;\r\n\r\n var horizScrollbar = element.offsetWidth - width;\r\n var vertScrollbar = element.offsetHeight - height;\r\n\r\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\r\n // we make this check conditional for performance reasons\r\n if (horizScrollbar || vertScrollbar) {\r\n var styles = getStyleComputedProperty(element);\r\n horizScrollbar -= getBordersSize(styles, 'x');\r\n vertScrollbar -= getBordersSize(styles, 'y');\r\n\r\n result.width -= horizScrollbar;\r\n result.height -= vertScrollbar;\r\n }\r\n\r\n return getClientRect(result);\r\n}\r\n\r\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\r\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\r\n\r\n var isIE10 = isIE(10);\r\n var isHTML = parent.nodeName === 'HTML';\r\n var childrenRect = getBoundingClientRect(children);\r\n var parentRect = getBoundingClientRect(parent);\r\n var scrollParent = getScrollParent(children);\r\n\r\n var styles = getStyleComputedProperty(parent);\r\n var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\r\n var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\r\n\r\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\r\n if (fixedPosition && isHTML) {\r\n parentRect.top = Math.max(parentRect.top, 0);\r\n parentRect.left = Math.max(parentRect.left, 0);\r\n }\r\n var offsets = getClientRect({\r\n top: childrenRect.top - parentRect.top - borderTopWidth,\r\n left: childrenRect.left - parentRect.left - borderLeftWidth,\r\n width: childrenRect.width,\r\n height: childrenRect.height\r\n });\r\n offsets.marginTop = 0;\r\n offsets.marginLeft = 0;\r\n\r\n // Subtract margins of documentElement in case it's being used as parent\r\n // we do this only on HTML because it's the only element that behaves\r\n // differently when margins are applied to it. The margins are included in\r\n // the box of the documentElement, in the other cases not.\r\n if (!isIE10 && isHTML) {\r\n var marginTop = parseFloat(styles.marginTop, 10);\r\n var marginLeft = parseFloat(styles.marginLeft, 10);\r\n\r\n offsets.top -= borderTopWidth - marginTop;\r\n offsets.bottom -= borderTopWidth - marginTop;\r\n offsets.left -= borderLeftWidth - marginLeft;\r\n offsets.right -= borderLeftWidth - marginLeft;\r\n\r\n // Attach marginTop and marginLeft because in some circumstances we may need them\r\n offsets.marginTop = marginTop;\r\n offsets.marginLeft = marginLeft;\r\n }\r\n\r\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\r\n offsets = includeScroll(offsets, parent);\r\n }\r\n\r\n return offsets;\r\n}\r\n\r\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\r\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n\r\n var html = element.ownerDocument.documentElement;\r\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\r\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\r\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\r\n\r\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\r\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\r\n\r\n var offset = {\r\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\r\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\r\n width: width,\r\n height: height\r\n };\r\n\r\n return getClientRect(offset);\r\n}\r\n\r\n/**\r\n * Check if the given element is fixed or is inside a fixed parent\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Element} element\r\n * @argument {Element} customContainer\r\n * @returns {Boolean} answer to \"isFixed?\"\r\n */\r\nfunction isFixed(element) {\r\n var nodeName = element.nodeName;\r\n if (nodeName === 'BODY' || nodeName === 'HTML') {\r\n return false;\r\n }\r\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\r\n return true;\r\n }\r\n var parentNode = getParentNode(element);\r\n if (!parentNode) {\r\n return false;\r\n }\r\n return isFixed(parentNode);\r\n}\r\n\r\n/**\r\n * Finds the first parent of an element that has a transformed property defined\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Element} element\r\n * @returns {Element} first transformed parent or documentElement\r\n */\r\n\r\nfunction getFixedPositionOffsetParent(element) {\r\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\r\n if (!element || !element.parentElement || isIE()) {\r\n return document.documentElement;\r\n }\r\n var el = element.parentElement;\r\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\r\n el = el.parentElement;\r\n }\r\n return el || document.documentElement;\r\n}\r\n\r\n/**\r\n * Computed the boundaries limits and return them\r\n * @method\r\n * @memberof Popper.Utils\r\n * @param {HTMLElement} popper\r\n * @param {HTMLElement} reference\r\n * @param {number} padding\r\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\r\n * @param {Boolean} fixedPosition - Is in fixed position mode\r\n * @returns {Object} Coordinates of the boundaries\r\n */\r\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\r\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\r\n\r\n // NOTE: 1 DOM access here\r\n\r\n var boundaries = { top: 0, left: 0 };\r\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\r\n\r\n // Handle viewport case\r\n if (boundariesElement === 'viewport') {\r\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\r\n } else {\r\n // Handle other cases based on DOM element used as boundaries\r\n var boundariesNode = void 0;\r\n if (boundariesElement === 'scrollParent') {\r\n boundariesNode = getScrollParent(getParentNode(reference));\r\n if (boundariesNode.nodeName === 'BODY') {\r\n boundariesNode = popper.ownerDocument.documentElement;\r\n }\r\n } else if (boundariesElement === 'window') {\r\n boundariesNode = popper.ownerDocument.documentElement;\r\n } else {\r\n boundariesNode = boundariesElement;\r\n }\r\n\r\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\r\n\r\n // In case of HTML, we need a different computation\r\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\r\n var _getWindowSizes = getWindowSizes(popper.ownerDocument),\r\n height = _getWindowSizes.height,\r\n width = _getWindowSizes.width;\r\n\r\n boundaries.top += offsets.top - offsets.marginTop;\r\n boundaries.bottom = height + offsets.top;\r\n boundaries.left += offsets.left - offsets.marginLeft;\r\n boundaries.right = width + offsets.left;\r\n } else {\r\n // for all the other DOM elements, this one is good\r\n boundaries = offsets;\r\n }\r\n }\r\n\r\n // Add paddings\r\n padding = padding || 0;\r\n var isPaddingNumber = typeof padding === 'number';\r\n boundaries.left += isPaddingNumber ? padding : padding.left || 0;\r\n boundaries.top += isPaddingNumber ? padding : padding.top || 0;\r\n boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\r\n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\r\n\r\n return boundaries;\r\n}\r\n\r\nfunction getArea(_ref) {\r\n var width = _ref.width,\r\n height = _ref.height;\r\n\r\n return width * height;\r\n}\r\n\r\n/**\r\n * Utility used to transform the `auto` placement to the placement with more\r\n * available space.\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Object} data - The data object generated by update method\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @returns {Object} The data object, properly modified\r\n */\r\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\r\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\r\n\r\n if (placement.indexOf('auto') === -1) {\r\n return placement;\r\n }\r\n\r\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\r\n\r\n var rects = {\r\n top: {\r\n width: boundaries.width,\r\n height: refRect.top - boundaries.top\r\n },\r\n right: {\r\n width: boundaries.right - refRect.right,\r\n height: boundaries.height\r\n },\r\n bottom: {\r\n width: boundaries.width,\r\n height: boundaries.bottom - refRect.bottom\r\n },\r\n left: {\r\n width: refRect.left - boundaries.left,\r\n height: boundaries.height\r\n }\r\n };\r\n\r\n var sortedAreas = Object.keys(rects).map(function (key) {\r\n return _extends({\r\n key: key\r\n }, rects[key], {\r\n area: getArea(rects[key])\r\n });\r\n }).sort(function (a, b) {\r\n return b.area - a.area;\r\n });\r\n\r\n var filteredAreas = sortedAreas.filter(function (_ref2) {\r\n var width = _ref2.width,\r\n height = _ref2.height;\r\n return width >= popper.clientWidth && height >= popper.clientHeight;\r\n });\r\n\r\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\r\n\r\n var variation = placement.split('-')[1];\r\n\r\n return computedPlacement + (variation ? '-' + variation : '');\r\n}\r\n\r\n/**\r\n * Get offsets to the reference element\r\n * @method\r\n * @memberof Popper.Utils\r\n * @param {Object} state\r\n * @param {Element} popper - the popper element\r\n * @param {Element} reference - the reference element (the popper will be relative to this)\r\n * @param {Element} fixedPosition - is in fixed position mode\r\n * @returns {Object} An object containing the offsets which will be applied to the popper\r\n */\r\nfunction getReferenceOffsets(state, popper, reference) {\r\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\r\n\r\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\r\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\r\n}\r\n\r\n/**\r\n * Get the outer sizes of the given element (offset size + margins)\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Element} element\r\n * @returns {Object} object containing width and height properties\r\n */\r\nfunction getOuterSizes(element) {\r\n var window = element.ownerDocument.defaultView;\r\n var styles = window.getComputedStyle(element);\r\n var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\r\n var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\r\n var result = {\r\n width: element.offsetWidth + y,\r\n height: element.offsetHeight + x\r\n };\r\n return result;\r\n}\r\n\r\n/**\r\n * Get the opposite placement of the given one\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {String} placement\r\n * @returns {String} flipped placement\r\n */\r\nfunction getOppositePlacement(placement) {\r\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\r\n return placement.replace(/left|right|bottom|top/g, function (matched) {\r\n return hash[matched];\r\n });\r\n}\r\n\r\n/**\r\n * Get offsets to the popper\r\n * @method\r\n * @memberof Popper.Utils\r\n * @param {Object} position - CSS position the Popper will get applied\r\n * @param {HTMLElement} popper - the popper element\r\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\r\n * @param {String} placement - one of the valid placement options\r\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\r\n */\r\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\r\n placement = placement.split('-')[0];\r\n\r\n // Get popper node sizes\r\n var popperRect = getOuterSizes(popper);\r\n\r\n // Add position, width and height to our offsets object\r\n var popperOffsets = {\r\n width: popperRect.width,\r\n height: popperRect.height\r\n };\r\n\r\n // depending by the popper placement we have to compute its offsets slightly differently\r\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\r\n var mainSide = isHoriz ? 'top' : 'left';\r\n var secondarySide = isHoriz ? 'left' : 'top';\r\n var measurement = isHoriz ? 'height' : 'width';\r\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\r\n\r\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\r\n if (placement === secondarySide) {\r\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\r\n } else {\r\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\r\n }\r\n\r\n return popperOffsets;\r\n}\r\n\r\n/**\r\n * Mimics the `find` method of Array\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Array} arr\r\n * @argument prop\r\n * @argument value\r\n * @returns index or -1\r\n */\r\nfunction find(arr, check) {\r\n // use native find if supported\r\n if (Array.prototype.find) {\r\n return arr.find(check);\r\n }\r\n\r\n // use `filter` to obtain the same behavior of `find`\r\n return arr.filter(check)[0];\r\n}\r\n\r\n/**\r\n * Return the index of the matching object\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Array} arr\r\n * @argument prop\r\n * @argument value\r\n * @returns index or -1\r\n */\r\nfunction findIndex(arr, prop, value) {\r\n // use native findIndex if supported\r\n if (Array.prototype.findIndex) {\r\n return arr.findIndex(function (cur) {\r\n return cur[prop] === value;\r\n });\r\n }\r\n\r\n // use `find` + `indexOf` if `findIndex` isn't supported\r\n var match = find(arr, function (obj) {\r\n return obj[prop] === value;\r\n });\r\n return arr.indexOf(match);\r\n}\r\n\r\n/**\r\n * Loop trough the list of modifiers and run them in order,\r\n * each of them will then edit the data object.\r\n * @method\r\n * @memberof Popper.Utils\r\n * @param {dataObject} data\r\n * @param {Array} modifiers\r\n * @param {String} ends - Optional modifier name used as stopper\r\n * @returns {dataObject}\r\n */\r\nfunction runModifiers(modifiers, data, ends) {\r\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\r\n\r\n modifiersToRun.forEach(function (modifier) {\r\n if (modifier['function']) {\r\n // eslint-disable-line dot-notation\r\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\r\n }\r\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\r\n if (modifier.enabled && isFunction(fn)) {\r\n // Add properties to offsets to make them a complete clientRect object\r\n // we do this before each modifier to make sure the previous one doesn't\r\n // mess with these values\r\n data.offsets.popper = getClientRect(data.offsets.popper);\r\n data.offsets.reference = getClientRect(data.offsets.reference);\r\n\r\n data = fn(data, modifier);\r\n }\r\n });\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * Updates the position of the popper, computing the new offsets and applying\r\n * the new style.
\r\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\r\n * @method\r\n * @memberof Popper\r\n */\r\nfunction update() {\r\n // if popper is destroyed, don't perform any further update\r\n if (this.state.isDestroyed) {\r\n return;\r\n }\r\n\r\n var data = {\r\n instance: this,\r\n styles: {},\r\n arrowStyles: {},\r\n attributes: {},\r\n flipped: false,\r\n offsets: {}\r\n };\r\n\r\n // compute reference element offsets\r\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\r\n\r\n // compute auto placement, store placement inside the data object,\r\n // modifiers will be able to edit `placement` if needed\r\n // and refer to originalPlacement to know the original value\r\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\r\n\r\n // store the computed placement inside `originalPlacement`\r\n data.originalPlacement = data.placement;\r\n\r\n data.positionFixed = this.options.positionFixed;\r\n\r\n // compute the popper offsets\r\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\r\n\r\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\r\n\r\n // run the modifiers\r\n data = runModifiers(this.modifiers, data);\r\n\r\n // the first `update` will call `onCreate` callback\r\n // the other ones will call `onUpdate` callback\r\n if (!this.state.isCreated) {\r\n this.state.isCreated = true;\r\n this.options.onCreate(data);\r\n } else {\r\n this.options.onUpdate(data);\r\n }\r\n}\r\n\r\n/**\r\n * Helper used to know if the given modifier is enabled.\r\n * @method\r\n * @memberof Popper.Utils\r\n * @returns {Boolean}\r\n */\r\nfunction isModifierEnabled(modifiers, modifierName) {\r\n return modifiers.some(function (_ref) {\r\n var name = _ref.name,\r\n enabled = _ref.enabled;\r\n return enabled && name === modifierName;\r\n });\r\n}\r\n\r\n/**\r\n * Get the prefixed supported property name\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {String} property (camelCase)\r\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\r\n */\r\nfunction getSupportedPropertyName(property) {\r\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\r\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\r\n\r\n for (var i = 0; i < prefixes.length; i++) {\r\n var prefix = prefixes[i];\r\n var toCheck = prefix ? '' + prefix + upperProp : property;\r\n if (typeof document.body.style[toCheck] !== 'undefined') {\r\n return toCheck;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Destroys the popper.\r\n * @method\r\n * @memberof Popper\r\n */\r\nfunction destroy() {\r\n this.state.isDestroyed = true;\r\n\r\n // touch DOM only if `applyStyle` modifier is enabled\r\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\r\n this.popper.removeAttribute('x-placement');\r\n this.popper.style.position = '';\r\n this.popper.style.top = '';\r\n this.popper.style.left = '';\r\n this.popper.style.right = '';\r\n this.popper.style.bottom = '';\r\n this.popper.style.willChange = '';\r\n this.popper.style[getSupportedPropertyName('transform')] = '';\r\n }\r\n\r\n this.disableEventListeners();\r\n\r\n // remove the popper if user explicity asked for the deletion on destroy\r\n // do not use `remove` because IE11 doesn't support it\r\n if (this.options.removeOnDestroy) {\r\n this.popper.parentNode.removeChild(this.popper);\r\n }\r\n return this;\r\n}\r\n\r\n/**\r\n * Get the window associated with the element\r\n * @argument {Element} element\r\n * @returns {Window}\r\n */\r\nfunction getWindow(element) {\r\n var ownerDocument = element.ownerDocument;\r\n return ownerDocument ? ownerDocument.defaultView : window;\r\n}\r\n\r\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\r\n var isBody = scrollParent.nodeName === 'BODY';\r\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\r\n target.addEventListener(event, callback, { passive: true });\r\n\r\n if (!isBody) {\r\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\r\n }\r\n scrollParents.push(target);\r\n}\r\n\r\n/**\r\n * Setup needed event listeners used to update the popper position\r\n * @method\r\n * @memberof Popper.Utils\r\n * @private\r\n */\r\nfunction setupEventListeners(reference, options, state, updateBound) {\r\n // Resize event listener on window\r\n state.updateBound = updateBound;\r\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\r\n\r\n // Scroll event listener on scroll parents\r\n var scrollElement = getScrollParent(reference);\r\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\r\n state.scrollElement = scrollElement;\r\n state.eventsEnabled = true;\r\n\r\n return state;\r\n}\r\n\r\n/**\r\n * It will add resize/scroll events and start recalculating\r\n * position of the popper element when they are triggered.\r\n * @method\r\n * @memberof Popper\r\n */\r\nfunction enableEventListeners() {\r\n if (!this.state.eventsEnabled) {\r\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\r\n }\r\n}\r\n\r\n/**\r\n * Remove event listeners used to update the popper position\r\n * @method\r\n * @memberof Popper.Utils\r\n * @private\r\n */\r\nfunction removeEventListeners(reference, state) {\r\n // Remove resize event listener on window\r\n getWindow(reference).removeEventListener('resize', state.updateBound);\r\n\r\n // Remove scroll event listener on scroll parents\r\n state.scrollParents.forEach(function (target) {\r\n target.removeEventListener('scroll', state.updateBound);\r\n });\r\n\r\n // Reset state\r\n state.updateBound = null;\r\n state.scrollParents = [];\r\n state.scrollElement = null;\r\n state.eventsEnabled = false;\r\n return state;\r\n}\r\n\r\n/**\r\n * It will remove resize/scroll events and won't recalculate popper position\r\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\r\n * unless you call `update` method manually.\r\n * @method\r\n * @memberof Popper\r\n */\r\nfunction disableEventListeners() {\r\n if (this.state.eventsEnabled) {\r\n cancelAnimationFrame(this.scheduleUpdate);\r\n this.state = removeEventListeners(this.reference, this.state);\r\n }\r\n}\r\n\r\n/**\r\n * Tells if a given input is a number\r\n * @method\r\n * @memberof Popper.Utils\r\n * @param {*} input to check\r\n * @return {Boolean}\r\n */\r\nfunction isNumeric(n) {\r\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\r\n}\r\n\r\n/**\r\n * Set the style to the given popper\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Element} element - Element to apply the style to\r\n * @argument {Object} styles\r\n * Object with a list of properties and values which will be applied to the element\r\n */\r\nfunction setStyles(element, styles) {\r\n Object.keys(styles).forEach(function (prop) {\r\n var unit = '';\r\n // add unit if the value is numeric and is one of the following\r\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\r\n unit = 'px';\r\n }\r\n element.style[prop] = styles[prop] + unit;\r\n });\r\n}\r\n\r\n/**\r\n * Set the attributes to the given popper\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {Element} element - Element to apply the attributes to\r\n * @argument {Object} styles\r\n * Object with a list of properties and values which will be applied to the element\r\n */\r\nfunction setAttributes(element, attributes) {\r\n Object.keys(attributes).forEach(function (prop) {\r\n var value = attributes[prop];\r\n if (value !== false) {\r\n element.setAttribute(prop, attributes[prop]);\r\n } else {\r\n element.removeAttribute(prop);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * @function\r\n * @memberof Modifiers\r\n * @argument {Object} data - The data object generated by `update` method\r\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\r\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @returns {Object} The same data object\r\n */\r\nfunction applyStyle(data) {\r\n // any property present in `data.styles` will be applied to the popper,\r\n // in this way we can make the 3rd party modifiers add custom styles to it\r\n // Be aware, modifiers could override the properties defined in the previous\r\n // lines of this modifier!\r\n setStyles(data.instance.popper, data.styles);\r\n\r\n // any property present in `data.attributes` will be applied to the popper,\r\n // they will be set as HTML attributes of the element\r\n setAttributes(data.instance.popper, data.attributes);\r\n\r\n // if arrowElement is defined and arrowStyles has some properties\r\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\r\n setStyles(data.arrowElement, data.arrowStyles);\r\n }\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * Set the x-placement attribute before everything else because it could be used\r\n * to add margins to the popper margins needs to be calculated to get the\r\n * correct popper offsets.\r\n * @method\r\n * @memberof Popper.modifiers\r\n * @param {HTMLElement} reference - The reference element used to position the popper\r\n * @param {HTMLElement} popper - The HTML element used as popper\r\n * @param {Object} options - Popper.js options\r\n */\r\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\r\n // compute reference element offsets\r\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\r\n\r\n // compute auto placement, store placement inside the data object,\r\n // modifiers will be able to edit `placement` if needed\r\n // and refer to originalPlacement to know the original value\r\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\r\n\r\n popper.setAttribute('x-placement', placement);\r\n\r\n // Apply `position` to popper before anything else because\r\n // without the position applied we can't guarantee correct computations\r\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\r\n\r\n return options;\r\n}\r\n\r\n/**\r\n * @function\r\n * @memberof Popper.Utils\r\n * @argument {Object} data - The data object generated by `update` method\r\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\r\n * @returns {Object} The popper's position offsets rounded\r\n *\r\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\r\n * good as it can be within reason.\r\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\r\n *\r\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\r\n * as well on High DPI screens).\r\n *\r\n * Firefox prefers no rounding for positioning and does not have blurriness on\r\n * high DPI screens.\r\n *\r\n * Only horizontal placement and left/right values need to be considered.\r\n */\r\nfunction getRoundedOffsets(data, shouldRound) {\r\n var _data$offsets = data.offsets,\r\n popper = _data$offsets.popper,\r\n reference = _data$offsets.reference;\r\n var round = Math.round,\r\n floor = Math.floor;\r\n\r\n var noRound = function noRound(v) {\r\n return v;\r\n };\r\n\r\n var referenceWidth = round(reference.width);\r\n var popperWidth = round(popper.width);\r\n\r\n var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\r\n var isVariation = data.placement.indexOf('-') !== -1;\r\n var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\r\n var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\r\n\r\n var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\r\n var verticalToInteger = !shouldRound ? noRound : round;\r\n\r\n return {\r\n left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\r\n top: verticalToInteger(popper.top),\r\n bottom: verticalToInteger(popper.bottom),\r\n right: horizontalToInteger(popper.right)\r\n };\r\n}\r\n\r\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\r\n\r\n/**\r\n * @function\r\n * @memberof Modifiers\r\n * @argument {Object} data - The data object generated by `update` method\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @returns {Object} The data object, properly modified\r\n */\r\nfunction computeStyle(data, options) {\r\n var x = options.x,\r\n y = options.y;\r\n var popper = data.offsets.popper;\r\n\r\n // Remove this legacy support in Popper.js v2\r\n\r\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\r\n return modifier.name === 'applyStyle';\r\n }).gpuAcceleration;\r\n if (legacyGpuAccelerationOption !== undefined) {\r\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\r\n }\r\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\r\n\r\n var offsetParent = getOffsetParent(data.instance.popper);\r\n var offsetParentRect = getBoundingClientRect(offsetParent);\r\n\r\n // Styles\r\n var styles = {\r\n position: popper.position\r\n };\r\n\r\n var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\r\n\r\n var sideA = x === 'bottom' ? 'top' : 'bottom';\r\n var sideB = y === 'right' ? 'left' : 'right';\r\n\r\n // if gpuAcceleration is set to `true` and transform is supported,\r\n // we use `translate3d` to apply the position to the popper we\r\n // automatically use the supported prefixed version if needed\r\n var prefixedProperty = getSupportedPropertyName('transform');\r\n\r\n // now, let's make a step back and look at this code closely (wtf?)\r\n // If the content of the popper grows once it's been positioned, it\r\n // may happen that the popper gets misplaced because of the new content\r\n // overflowing its reference element\r\n // To avoid this problem, we provide two options (x and y), which allow\r\n // the consumer to define the offset origin.\r\n // If we position a popper on top of a reference element, we can set\r\n // `x` to `top` to make the popper grow towards its top instead of\r\n // its bottom.\r\n var left = void 0,\r\n top = void 0;\r\n if (sideA === 'bottom') {\r\n // when offsetParent is the positioning is relative to the bottom of the screen (excluding the scrollbar)\r\n // and not the bottom of the html element\r\n if (offsetParent.nodeName === 'HTML') {\r\n top = -offsetParent.clientHeight + offsets.bottom;\r\n } else {\r\n top = -offsetParentRect.height + offsets.bottom;\r\n }\r\n } else {\r\n top = offsets.top;\r\n }\r\n if (sideB === 'right') {\r\n if (offsetParent.nodeName === 'HTML') {\r\n left = -offsetParent.clientWidth + offsets.right;\r\n } else {\r\n left = -offsetParentRect.width + offsets.right;\r\n }\r\n } else {\r\n left = offsets.left;\r\n }\r\n if (gpuAcceleration && prefixedProperty) {\r\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\r\n styles[sideA] = 0;\r\n styles[sideB] = 0;\r\n styles.willChange = 'transform';\r\n } else {\r\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\r\n var invertTop = sideA === 'bottom' ? -1 : 1;\r\n var invertLeft = sideB === 'right' ? -1 : 1;\r\n styles[sideA] = top * invertTop;\r\n styles[sideB] = left * invertLeft;\r\n styles.willChange = sideA + ', ' + sideB;\r\n }\r\n\r\n // Attributes\r\n var attributes = {\r\n 'x-placement': data.placement\r\n };\r\n\r\n // Update `data` attributes, styles and arrowStyles\r\n data.attributes = _extends({}, attributes, data.attributes);\r\n data.styles = _extends({}, styles, data.styles);\r\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * Helper used to know if the given modifier depends from another one.
\r\n * It checks if the needed modifier is listed and enabled.\r\n * @method\r\n * @memberof Popper.Utils\r\n * @param {Array} modifiers - list of modifiers\r\n * @param {String} requestingName - name of requesting modifier\r\n * @param {String} requestedName - name of requested modifier\r\n * @returns {Boolean}\r\n */\r\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\r\n var requesting = find(modifiers, function (_ref) {\r\n var name = _ref.name;\r\n return name === requestingName;\r\n });\r\n\r\n var isRequired = !!requesting && modifiers.some(function (modifier) {\r\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\r\n });\r\n\r\n if (!isRequired) {\r\n var _requesting = '`' + requestingName + '`';\r\n var requested = '`' + requestedName + '`';\r\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\r\n }\r\n return isRequired;\r\n}\r\n\r\n/**\r\n * @function\r\n * @memberof Modifiers\r\n * @argument {Object} data - The data object generated by update method\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @returns {Object} The data object, properly modified\r\n */\r\nfunction arrow(data, options) {\r\n var _data$offsets$arrow;\r\n\r\n // arrow depends on keepTogether in order to work\r\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\r\n return data;\r\n }\r\n\r\n var arrowElement = options.element;\r\n\r\n // if arrowElement is a string, suppose it's a CSS selector\r\n if (typeof arrowElement === 'string') {\r\n arrowElement = data.instance.popper.querySelector(arrowElement);\r\n\r\n // if arrowElement is not found, don't run the modifier\r\n if (!arrowElement) {\r\n return data;\r\n }\r\n } else {\r\n // if the arrowElement isn't a query selector we must check that the\r\n // provided DOM node is child of its popper node\r\n if (!data.instance.popper.contains(arrowElement)) {\r\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\r\n return data;\r\n }\r\n }\r\n\r\n var placement = data.placement.split('-')[0];\r\n var _data$offsets = data.offsets,\r\n popper = _data$offsets.popper,\r\n reference = _data$offsets.reference;\r\n\r\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\r\n\r\n var len = isVertical ? 'height' : 'width';\r\n var sideCapitalized = isVertical ? 'Top' : 'Left';\r\n var side = sideCapitalized.toLowerCase();\r\n var altSide = isVertical ? 'left' : 'top';\r\n var opSide = isVertical ? 'bottom' : 'right';\r\n var arrowElementSize = getOuterSizes(arrowElement)[len];\r\n\r\n //\r\n // extends keepTogether behavior making sure the popper and its\r\n // reference have enough pixels in conjunction\r\n //\r\n\r\n // top/left side\r\n if (reference[opSide] - arrowElementSize < popper[side]) {\r\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\r\n }\r\n // bottom/right side\r\n if (reference[side] + arrowElementSize > popper[opSide]) {\r\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\r\n }\r\n data.offsets.popper = getClientRect(data.offsets.popper);\r\n\r\n // compute center of the popper\r\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\r\n\r\n // Compute the sideValue using the updated popper offsets\r\n // take popper margin in account because we don't have this info available\r\n var css = getStyleComputedProperty(data.instance.popper);\r\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\r\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\r\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\r\n\r\n // prevent arrowElement from being placed not contiguously to its popper\r\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\r\n\r\n data.arrowElement = arrowElement;\r\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * Get the opposite placement variation of the given one\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {String} placement variation\r\n * @returns {String} flipped placement variation\r\n */\r\nfunction getOppositeVariation(variation) {\r\n if (variation === 'end') {\r\n return 'start';\r\n } else if (variation === 'start') {\r\n return 'end';\r\n }\r\n return variation;\r\n}\r\n\r\n/**\r\n * List of accepted placements to use as values of the `placement` option.
\r\n * Valid placements are:\r\n * - `auto`\r\n * - `top`\r\n * - `right`\r\n * - `bottom`\r\n * - `left`\r\n *\r\n * Each placement can have a variation from this list:\r\n * - `-start`\r\n * - `-end`\r\n *\r\n * Variations are interpreted easily if you think of them as the left to right\r\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\r\n * is right.
\r\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\r\n *\r\n * Some valid examples are:\r\n * - `top-end` (on top of reference, right aligned)\r\n * - `right-start` (on right of reference, top aligned)\r\n * - `bottom` (on bottom, centered)\r\n * - `auto-end` (on the side with more space available, alignment depends by placement)\r\n *\r\n * @static\r\n * @type {Array}\r\n * @enum {String}\r\n * @readonly\r\n * @method placements\r\n * @memberof Popper\r\n */\r\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\r\n\r\n// Get rid of `auto` `auto-start` and `auto-end`\r\nvar validPlacements = placements.slice(3);\r\n\r\n/**\r\n * Given an initial placement, returns all the subsequent placements\r\n * clockwise (or counter-clockwise).\r\n *\r\n * @method\r\n * @memberof Popper.Utils\r\n * @argument {String} placement - A valid placement (it accepts variations)\r\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\r\n * @returns {Array} placements including their variations\r\n */\r\nfunction clockwise(placement) {\r\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n\r\n var index = validPlacements.indexOf(placement);\r\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\r\n return counter ? arr.reverse() : arr;\r\n}\r\n\r\nvar BEHAVIORS = {\r\n FLIP: 'flip',\r\n CLOCKWISE: 'clockwise',\r\n COUNTERCLOCKWISE: 'counterclockwise'\r\n};\r\n\r\n/**\r\n * @function\r\n * @memberof Modifiers\r\n * @argument {Object} data - The data object generated by update method\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @returns {Object} The data object, properly modified\r\n */\r\nfunction flip(data, options) {\r\n // if `inner` modifier is enabled, we can't use the `flip` modifier\r\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\r\n return data;\r\n }\r\n\r\n if (data.flipped && data.placement === data.originalPlacement) {\r\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\r\n return data;\r\n }\r\n\r\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\r\n\r\n var placement = data.placement.split('-')[0];\r\n var placementOpposite = getOppositePlacement(placement);\r\n var variation = data.placement.split('-')[1] || '';\r\n\r\n var flipOrder = [];\r\n\r\n switch (options.behavior) {\r\n case BEHAVIORS.FLIP:\r\n flipOrder = [placement, placementOpposite];\r\n break;\r\n case BEHAVIORS.CLOCKWISE:\r\n flipOrder = clockwise(placement);\r\n break;\r\n case BEHAVIORS.COUNTERCLOCKWISE:\r\n flipOrder = clockwise(placement, true);\r\n break;\r\n default:\r\n flipOrder = options.behavior;\r\n }\r\n\r\n flipOrder.forEach(function (step, index) {\r\n if (placement !== step || flipOrder.length === index + 1) {\r\n return data;\r\n }\r\n\r\n placement = data.placement.split('-')[0];\r\n placementOpposite = getOppositePlacement(placement);\r\n\r\n var popperOffsets = data.offsets.popper;\r\n var refOffsets = data.offsets.reference;\r\n\r\n // using floor because the reference offsets may contain decimals we are not going to consider here\r\n var floor = Math.floor;\r\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\r\n\r\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\r\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\r\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\r\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\r\n\r\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\r\n\r\n // flip the variation if required\r\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\r\n var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\r\n\r\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\r\n // this boolean to detect any flip loop\r\n data.flipped = true;\r\n\r\n if (overlapsRef || overflowsBoundaries) {\r\n placement = flipOrder[index + 1];\r\n }\r\n\r\n if (flippedVariation) {\r\n variation = getOppositeVariation(variation);\r\n }\r\n\r\n data.placement = placement + (variation ? '-' + variation : '');\r\n\r\n // this object contains `position`, we want to preserve it along with\r\n // any additional property we may add in the future\r\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\r\n\r\n data = runModifiers(data.instance.modifiers, data, 'flip');\r\n }\r\n });\r\n return data;\r\n}\r\n\r\n/**\r\n * @function\r\n * @memberof Modifiers\r\n * @argument {Object} data - The data object generated by update method\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @returns {Object} The data object, properly modified\r\n */\r\nfunction keepTogether(data) {\r\n var _data$offsets = data.offsets,\r\n popper = _data$offsets.popper,\r\n reference = _data$offsets.reference;\r\n\r\n var placement = data.placement.split('-')[0];\r\n var floor = Math.floor;\r\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\r\n var side = isVertical ? 'right' : 'bottom';\r\n var opSide = isVertical ? 'left' : 'top';\r\n var measurement = isVertical ? 'width' : 'height';\r\n\r\n if (popper[side] < floor(reference[opSide])) {\r\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\r\n }\r\n if (popper[opSide] > floor(reference[side])) {\r\n data.offsets.popper[opSide] = floor(reference[side]);\r\n }\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * Converts a string containing value + unit into a px value number\r\n * @function\r\n * @memberof {modifiers~offset}\r\n * @private\r\n * @argument {String} str - Value + unit string\r\n * @argument {String} measurement - `height` or `width`\r\n * @argument {Object} popperOffsets\r\n * @argument {Object} referenceOffsets\r\n * @returns {Number|String}\r\n * Value in pixels, or original string if no values were extracted\r\n */\r\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\r\n // separate value from unit\r\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\r\n var value = +split[1];\r\n var unit = split[2];\r\n\r\n // If it's not a number it's an operator, I guess\r\n if (!value) {\r\n return str;\r\n }\r\n\r\n if (unit.indexOf('%') === 0) {\r\n var element = void 0;\r\n switch (unit) {\r\n case '%p':\r\n element = popperOffsets;\r\n break;\r\n case '%':\r\n case '%r':\r\n default:\r\n element = referenceOffsets;\r\n }\r\n\r\n var rect = getClientRect(element);\r\n return rect[measurement] / 100 * value;\r\n } else if (unit === 'vh' || unit === 'vw') {\r\n // if is a vh or vw, we calculate the size based on the viewport\r\n var size = void 0;\r\n if (unit === 'vh') {\r\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\r\n } else {\r\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\r\n }\r\n return size / 100 * value;\r\n } else {\r\n // if is an explicit pixel unit, we get rid of the unit and keep the value\r\n // if is an implicit unit, it's px, and we return just the value\r\n return value;\r\n }\r\n}\r\n\r\n/**\r\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\r\n * @function\r\n * @memberof {modifiers~offset}\r\n * @private\r\n * @argument {String} offset\r\n * @argument {Object} popperOffsets\r\n * @argument {Object} referenceOffsets\r\n * @argument {String} basePlacement\r\n * @returns {Array} a two cells array with x and y offsets in numbers\r\n */\r\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\r\n var offsets = [0, 0];\r\n\r\n // Use height if placement is left or right and index is 0 otherwise use width\r\n // in this way the first offset will use an axis and the second one\r\n // will use the other one\r\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\r\n\r\n // Split the offset string to obtain a list of values and operands\r\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\r\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\r\n return frag.trim();\r\n });\r\n\r\n // Detect if the offset string contains a pair of values or a single one\r\n // they could be separated by comma or space\r\n var divider = fragments.indexOf(find(fragments, function (frag) {\r\n return frag.search(/,|\\s/) !== -1;\r\n }));\r\n\r\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\r\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\r\n }\r\n\r\n // If divider is found, we divide the list of values and operands to divide\r\n // them by ofset X and Y.\r\n var splitRegex = /\\s*,\\s*|\\s+/;\r\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\r\n\r\n // Convert the values with units to absolute pixels to allow our computations\r\n ops = ops.map(function (op, index) {\r\n // Most of the units rely on the orientation of the popper\r\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\r\n var mergeWithPrevious = false;\r\n return op\r\n // This aggregates any `+` or `-` sign that aren't considered operators\r\n // e.g.: 10 + +5 => [10, +, +5]\r\n .reduce(function (a, b) {\r\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\r\n a[a.length - 1] = b;\r\n mergeWithPrevious = true;\r\n return a;\r\n } else if (mergeWithPrevious) {\r\n a[a.length - 1] += b;\r\n mergeWithPrevious = false;\r\n return a;\r\n } else {\r\n return a.concat(b);\r\n }\r\n }, [])\r\n // Here we convert the string values into number values (in px)\r\n .map(function (str) {\r\n return toValue(str, measurement, popperOffsets, referenceOffsets);\r\n });\r\n });\r\n\r\n // Loop trough the offsets arrays and execute the operations\r\n ops.forEach(function (op, index) {\r\n op.forEach(function (frag, index2) {\r\n if (isNumeric(frag)) {\r\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\r\n }\r\n });\r\n });\r\n return offsets;\r\n}\r\n\r\n/**\r\n * @function\r\n * @memberof Modifiers\r\n * @argument {Object} data - The data object generated by update method\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @argument {Number|String} options.offset=0\r\n * The offset value as described in the modifier description\r\n * @returns {Object} The data object, properly modified\r\n */\r\nfunction offset(data, _ref) {\r\n var offset = _ref.offset;\r\n var placement = data.placement,\r\n _data$offsets = data.offsets,\r\n popper = _data$offsets.popper,\r\n reference = _data$offsets.reference;\r\n\r\n var basePlacement = placement.split('-')[0];\r\n\r\n var offsets = void 0;\r\n if (isNumeric(+offset)) {\r\n offsets = [+offset, 0];\r\n } else {\r\n offsets = parseOffset(offset, popper, reference, basePlacement);\r\n }\r\n\r\n if (basePlacement === 'left') {\r\n popper.top += offsets[0];\r\n popper.left -= offsets[1];\r\n } else if (basePlacement === 'right') {\r\n popper.top += offsets[0];\r\n popper.left += offsets[1];\r\n } else if (basePlacement === 'top') {\r\n popper.left += offsets[0];\r\n popper.top -= offsets[1];\r\n } else if (basePlacement === 'bottom') {\r\n popper.left += offsets[0];\r\n popper.top += offsets[1];\r\n }\r\n\r\n data.popper = popper;\r\n return data;\r\n}\r\n\r\n/**\r\n * @function\r\n * @memberof Modifiers\r\n * @argument {Object} data - The data object generated by `update` method\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @returns {Object} The data object, properly modified\r\n */\r\nfunction preventOverflow(data, options) {\r\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\r\n\r\n // If offsetParent is the reference element, we really want to\r\n // go one step up and use the next offsetParent as reference to\r\n // avoid to make this modifier completely useless and look like broken\r\n if (data.instance.reference === boundariesElement) {\r\n boundariesElement = getOffsetParent(boundariesElement);\r\n }\r\n\r\n // NOTE: DOM access here\r\n // resets the popper's position so that the document size can be calculated excluding\r\n // the size of the popper element itself\r\n var transformProp = getSupportedPropertyName('transform');\r\n var popperStyles = data.instance.popper.style; // assignment to help minification\r\n var top = popperStyles.top,\r\n left = popperStyles.left,\r\n transform = popperStyles[transformProp];\r\n\r\n popperStyles.top = '';\r\n popperStyles.left = '';\r\n popperStyles[transformProp] = '';\r\n\r\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\r\n\r\n // NOTE: DOM access here\r\n // restores the original style properties after the offsets have been computed\r\n popperStyles.top = top;\r\n popperStyles.left = left;\r\n popperStyles[transformProp] = transform;\r\n\r\n options.boundaries = boundaries;\r\n\r\n var order = options.priority;\r\n var popper = data.offsets.popper;\r\n\r\n var check = {\r\n primary: function primary(placement) {\r\n var value = popper[placement];\r\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\r\n value = Math.max(popper[placement], boundaries[placement]);\r\n }\r\n return defineProperty({}, placement, value);\r\n },\r\n secondary: function secondary(placement) {\r\n var mainSide = placement === 'right' ? 'left' : 'top';\r\n var value = popper[mainSide];\r\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\r\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\r\n }\r\n return defineProperty({}, mainSide, value);\r\n }\r\n };\r\n\r\n order.forEach(function (placement) {\r\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\r\n popper = _extends({}, popper, check[side](placement));\r\n });\r\n\r\n data.offsets.popper = popper;\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * @function\r\n * @memberof Modifiers\r\n * @argument {Object} data - The data object generated by `update` method\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @returns {Object} The data object, properly modified\r\n */\r\nfunction shift(data) {\r\n var placement = data.placement;\r\n var basePlacement = placement.split('-')[0];\r\n var shiftvariation = placement.split('-')[1];\r\n\r\n // if shift shiftvariation is specified, run the modifier\r\n if (shiftvariation) {\r\n var _data$offsets = data.offsets,\r\n reference = _data$offsets.reference,\r\n popper = _data$offsets.popper;\r\n\r\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\r\n var side = isVertical ? 'left' : 'top';\r\n var measurement = isVertical ? 'width' : 'height';\r\n\r\n var shiftOffsets = {\r\n start: defineProperty({}, side, reference[side]),\r\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\r\n };\r\n\r\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\r\n }\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * @function\r\n * @memberof Modifiers\r\n * @argument {Object} data - The data object generated by update method\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @returns {Object} The data object, properly modified\r\n */\r\nfunction hide(data) {\r\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\r\n return data;\r\n }\r\n\r\n var refRect = data.offsets.reference;\r\n var bound = find(data.instance.modifiers, function (modifier) {\r\n return modifier.name === 'preventOverflow';\r\n }).boundaries;\r\n\r\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\r\n // Avoid unnecessary DOM access if visibility hasn't changed\r\n if (data.hide === true) {\r\n return data;\r\n }\r\n\r\n data.hide = true;\r\n data.attributes['x-out-of-boundaries'] = '';\r\n } else {\r\n // Avoid unnecessary DOM access if visibility hasn't changed\r\n if (data.hide === false) {\r\n return data;\r\n }\r\n\r\n data.hide = false;\r\n data.attributes['x-out-of-boundaries'] = false;\r\n }\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * @function\r\n * @memberof Modifiers\r\n * @argument {Object} data - The data object generated by `update` method\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @returns {Object} The data object, properly modified\r\n */\r\nfunction inner(data) {\r\n var placement = data.placement;\r\n var basePlacement = placement.split('-')[0];\r\n var _data$offsets = data.offsets,\r\n popper = _data$offsets.popper,\r\n reference = _data$offsets.reference;\r\n\r\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\r\n\r\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\r\n\r\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\r\n\r\n data.placement = getOppositePlacement(placement);\r\n data.offsets.popper = getClientRect(popper);\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * Modifier function, each modifier can have a function of this type assigned\r\n * to its `fn` property.
\r\n * These functions will be called on each update, this means that you must\r\n * make sure they are performant enough to avoid performance bottlenecks.\r\n *\r\n * @function ModifierFn\r\n * @argument {dataObject} data - The data object generated by `update` method\r\n * @argument {Object} options - Modifiers configuration and options\r\n * @returns {dataObject} The data object, properly modified\r\n */\r\n\r\n/**\r\n * Modifiers are plugins used to alter the behavior of your poppers.
\r\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\r\n * needed by the library.\r\n *\r\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\r\n * All the other properties are configurations that could be tweaked.\r\n * @namespace modifiers\r\n */\r\nvar modifiers = {\r\n /**\r\n * Modifier used to shift the popper on the start or end of its reference\r\n * element.
\r\n * It will read the variation of the `placement` property.
\r\n * It can be one either `-end` or `-start`.\r\n * @memberof modifiers\r\n * @inner\r\n */\r\n shift: {\r\n /** @prop {number} order=100 - Index used to define the order of execution */\r\n order: 100,\r\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\r\n enabled: true,\r\n /** @prop {ModifierFn} */\r\n fn: shift\r\n },\r\n\r\n /**\r\n * The `offset` modifier can shift your popper on both its axis.\r\n *\r\n * It accepts the following units:\r\n * - `px` or unit-less, interpreted as pixels\r\n * - `%` or `%r`, percentage relative to the length of the reference element\r\n * - `%p`, percentage relative to the length of the popper element\r\n * - `vw`, CSS viewport width unit\r\n * - `vh`, CSS viewport height unit\r\n *\r\n * For length is intended the main axis relative to the placement of the popper.
\r\n * This means that if the placement is `top` or `bottom`, the length will be the\r\n * `width`. In case of `left` or `right`, it will be the `height`.\r\n *\r\n * You can provide a single value (as `Number` or `String`), or a pair of values\r\n * as `String` divided by a comma or one (or more) white spaces.
\r\n * The latter is a deprecated method because it leads to confusion and will be\r\n * removed in v2.
\r\n * Additionally, it accepts additions and subtractions between different units.\r\n * Note that multiplications and divisions aren't supported.\r\n *\r\n * Valid examples are:\r\n * ```\r\n * 10\r\n * '10%'\r\n * '10, 10'\r\n * '10%, 10'\r\n * '10 + 10%'\r\n * '10 - 5vh + 3%'\r\n * '-10px + 5vh, 5px - 6%'\r\n * ```\r\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\r\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\r\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\r\n *\r\n * @memberof modifiers\r\n * @inner\r\n */\r\n offset: {\r\n /** @prop {number} order=200 - Index used to define the order of execution */\r\n order: 200,\r\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\r\n enabled: true,\r\n /** @prop {ModifierFn} */\r\n fn: offset,\r\n /** @prop {Number|String} offset=0\r\n * The offset value as described in the modifier description\r\n */\r\n offset: 0\r\n },\r\n\r\n /**\r\n * Modifier used to prevent the popper from being positioned outside the boundary.\r\n *\r\n * A scenario exists where the reference itself is not within the boundaries.
\r\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".
\r\n * In this case we need to decide whether the popper should either:\r\n *\r\n * - detach from the reference and remain \"trapped\" in the boundaries, or\r\n * - if it should ignore the boundary and \"escape with its reference\"\r\n *\r\n * When `escapeWithReference` is set to`true` and reference is completely\r\n * outside its boundaries, the popper will overflow (or completely leave)\r\n * the boundaries in order to remain attached to the edge of the reference.\r\n *\r\n * @memberof modifiers\r\n * @inner\r\n */\r\n preventOverflow: {\r\n /** @prop {number} order=300 - Index used to define the order of execution */\r\n order: 300,\r\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\r\n enabled: true,\r\n /** @prop {ModifierFn} */\r\n fn: preventOverflow,\r\n /**\r\n * @prop {Array} [priority=['left','right','top','bottom']]\r\n * Popper will try to prevent overflow following these priorities by default,\r\n * then, it could overflow on the left and on top of the `boundariesElement`\r\n */\r\n priority: ['left', 'right', 'top', 'bottom'],\r\n /**\r\n * @prop {number} padding=5\r\n * Amount of pixel used to define a minimum distance between the boundaries\r\n * and the popper. This makes sure the popper always has a little padding\r\n * between the edges of its container\r\n */\r\n padding: 5,\r\n /**\r\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\r\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\r\n * `viewport` or any DOM element.\r\n */\r\n boundariesElement: 'scrollParent'\r\n },\r\n\r\n /**\r\n * Modifier used to make sure the reference and its popper stay near each other\r\n * without leaving any gap between the two. Especially useful when the arrow is\r\n * enabled and you want to ensure that it points to its reference element.\r\n * It cares only about the first axis. You can still have poppers with margin\r\n * between the popper and its reference element.\r\n * @memberof modifiers\r\n * @inner\r\n */\r\n keepTogether: {\r\n /** @prop {number} order=400 - Index used to define the order of execution */\r\n order: 400,\r\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\r\n enabled: true,\r\n /** @prop {ModifierFn} */\r\n fn: keepTogether\r\n },\r\n\r\n /**\r\n * This modifier is used to move the `arrowElement` of the popper to make\r\n * sure it is positioned between the reference element and its popper element.\r\n * It will read the outer size of the `arrowElement` node to detect how many\r\n * pixels of conjunction are needed.\r\n *\r\n * It has no effect if no `arrowElement` is provided.\r\n * @memberof modifiers\r\n * @inner\r\n */\r\n arrow: {\r\n /** @prop {number} order=500 - Index used to define the order of execution */\r\n order: 500,\r\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\r\n enabled: true,\r\n /** @prop {ModifierFn} */\r\n fn: arrow,\r\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\r\n element: '[x-arrow]'\r\n },\r\n\r\n /**\r\n * Modifier used to flip the popper's placement when it starts to overlap its\r\n * reference element.\r\n *\r\n * Requires the `preventOverflow` modifier before it in order to work.\r\n *\r\n * **NOTE:** this modifier will interrupt the current update cycle and will\r\n * restart it if it detects the need to flip the placement.\r\n * @memberof modifiers\r\n * @inner\r\n */\r\n flip: {\r\n /** @prop {number} order=600 - Index used to define the order of execution */\r\n order: 600,\r\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\r\n enabled: true,\r\n /** @prop {ModifierFn} */\r\n fn: flip,\r\n /**\r\n * @prop {String|Array} behavior='flip'\r\n * The behavior used to change the popper's placement. It can be one of\r\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\r\n * placements (with optional variations)\r\n */\r\n behavior: 'flip',\r\n /**\r\n * @prop {number} padding=5\r\n * The popper will flip if it hits the edges of the `boundariesElement`\r\n */\r\n padding: 5,\r\n /**\r\n * @prop {String|HTMLElement} boundariesElement='viewport'\r\n * The element which will define the boundaries of the popper position.\r\n * The popper will never be placed outside of the defined boundaries\r\n * (except if `keepTogether` is enabled)\r\n */\r\n boundariesElement: 'viewport'\r\n },\r\n\r\n /**\r\n * Modifier used to make the popper flow toward the inner of the reference element.\r\n * By default, when this modifier is disabled, the popper will be placed outside\r\n * the reference element.\r\n * @memberof modifiers\r\n * @inner\r\n */\r\n inner: {\r\n /** @prop {number} order=700 - Index used to define the order of execution */\r\n order: 700,\r\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\r\n enabled: false,\r\n /** @prop {ModifierFn} */\r\n fn: inner\r\n },\r\n\r\n /**\r\n * Modifier used to hide the popper when its reference element is outside of the\r\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\r\n * be used to hide with a CSS selector the popper when its reference is\r\n * out of boundaries.\r\n *\r\n * Requires the `preventOverflow` modifier before it in order to work.\r\n * @memberof modifiers\r\n * @inner\r\n */\r\n hide: {\r\n /** @prop {number} order=800 - Index used to define the order of execution */\r\n order: 800,\r\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\r\n enabled: true,\r\n /** @prop {ModifierFn} */\r\n fn: hide\r\n },\r\n\r\n /**\r\n * Computes the style that will be applied to the popper element to gets\r\n * properly positioned.\r\n *\r\n * Note that this modifier will not touch the DOM, it just prepares the styles\r\n * so that `applyStyle` modifier can apply it. This separation is useful\r\n * in case you need to replace `applyStyle` with a custom implementation.\r\n *\r\n * This modifier has `850` as `order` value to maintain backward compatibility\r\n * with previous versions of Popper.js. Expect the modifiers ordering method\r\n * to change in future major versions of the library.\r\n *\r\n * @memberof modifiers\r\n * @inner\r\n */\r\n computeStyle: {\r\n /** @prop {number} order=850 - Index used to define the order of execution */\r\n order: 850,\r\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\r\n enabled: true,\r\n /** @prop {ModifierFn} */\r\n fn: computeStyle,\r\n /**\r\n * @prop {Boolean} gpuAcceleration=true\r\n * If true, it uses the CSS 3D transformation to position the popper.\r\n * Otherwise, it will use the `top` and `left` properties\r\n */\r\n gpuAcceleration: true,\r\n /**\r\n * @prop {string} [x='bottom']\r\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\r\n * Change this if your popper should grow in a direction different from `bottom`\r\n */\r\n x: 'bottom',\r\n /**\r\n * @prop {string} [x='left']\r\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\r\n * Change this if your popper should grow in a direction different from `right`\r\n */\r\n y: 'right'\r\n },\r\n\r\n /**\r\n * Applies the computed styles to the popper element.\r\n *\r\n * All the DOM manipulations are limited to this modifier. This is useful in case\r\n * you want to integrate Popper.js inside a framework or view library and you\r\n * want to delegate all the DOM manipulations to it.\r\n *\r\n * Note that if you disable this modifier, you must make sure the popper element\r\n * has its position set to `absolute` before Popper.js can do its work!\r\n *\r\n * Just disable this modifier and define your own to achieve the desired effect.\r\n *\r\n * @memberof modifiers\r\n * @inner\r\n */\r\n applyStyle: {\r\n /** @prop {number} order=900 - Index used to define the order of execution */\r\n order: 900,\r\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\r\n enabled: true,\r\n /** @prop {ModifierFn} */\r\n fn: applyStyle,\r\n /** @prop {Function} */\r\n onLoad: applyStyleOnLoad,\r\n /**\r\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\r\n * @prop {Boolean} gpuAcceleration=true\r\n * If true, it uses the CSS 3D transformation to position the popper.\r\n * Otherwise, it will use the `top` and `left` properties\r\n */\r\n gpuAcceleration: undefined\r\n }\r\n};\r\n\r\n/**\r\n * The `dataObject` is an object containing all the information used by Popper.js.\r\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\r\n * @name dataObject\r\n * @property {Object} data.instance The Popper.js instance\r\n * @property {String} data.placement Placement applied to popper\r\n * @property {String} data.originalPlacement Placement originally defined on init\r\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\r\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\r\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\r\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\r\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\r\n * @property {Object} data.boundaries Offsets of the popper boundaries\r\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\r\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\r\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\r\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\r\n */\r\n\r\n/**\r\n * Default options provided to Popper.js constructor.
\r\n * These can be overridden using the `options` argument of Popper.js.
\r\n * To override an option, simply pass an object with the same\r\n * structure of the `options` object, as the 3rd argument. For example:\r\n * ```\r\n * new Popper(ref, pop, {\r\n * modifiers: {\r\n * preventOverflow: { enabled: false }\r\n * }\r\n * })\r\n * ```\r\n * @type {Object}\r\n * @static\r\n * @memberof Popper\r\n */\r\nvar Defaults = {\r\n /**\r\n * Popper's placement.\r\n * @prop {Popper.placements} placement='bottom'\r\n */\r\n placement: 'bottom',\r\n\r\n /**\r\n * Set this to true if you want popper to position it self in 'fixed' mode\r\n * @prop {Boolean} positionFixed=false\r\n */\r\n positionFixed: false,\r\n\r\n /**\r\n * Whether events (resize, scroll) are initially enabled.\r\n * @prop {Boolean} eventsEnabled=true\r\n */\r\n eventsEnabled: true,\r\n\r\n /**\r\n * Set to true if you want to automatically remove the popper when\r\n * you call the `destroy` method.\r\n * @prop {Boolean} removeOnDestroy=false\r\n */\r\n removeOnDestroy: false,\r\n\r\n /**\r\n * Callback called when the popper is created.
\r\n * By default, it is set to no-op.
\r\n * Access Popper.js instance with `data.instance`.\r\n * @prop {onCreate}\r\n */\r\n onCreate: function onCreate() {},\r\n\r\n /**\r\n * Callback called when the popper is updated. This callback is not called\r\n * on the initialization/creation of the popper, but only on subsequent\r\n * updates.
\r\n * By default, it is set to no-op.
\r\n * Access Popper.js instance with `data.instance`.\r\n * @prop {onUpdate}\r\n */\r\n onUpdate: function onUpdate() {},\r\n\r\n /**\r\n * List of modifiers used to modify the offsets before they are applied to the popper.\r\n * They provide most of the functionalities of Popper.js.\r\n * @prop {modifiers}\r\n */\r\n modifiers: modifiers\r\n};\r\n\r\n/**\r\n * @callback onCreate\r\n * @param {dataObject} data\r\n */\r\n\r\n/**\r\n * @callback onUpdate\r\n * @param {dataObject} data\r\n */\r\n\r\n// Utils\r\n// Methods\r\nvar Popper = function () {\r\n /**\r\n * Creates a new Popper.js instance.\r\n * @class Popper\r\n * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\r\n * @param {HTMLElement} popper - The HTML element used as the popper\r\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\r\n * @return {Object} instance - The generated Popper.js instance\r\n */\r\n function Popper(reference, popper) {\r\n var _this = this;\r\n\r\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\r\n classCallCheck(this, Popper);\r\n\r\n this.scheduleUpdate = function () {\r\n return requestAnimationFrame(_this.update);\r\n };\r\n\r\n // make update() debounced, so that it only runs at most once-per-tick\r\n this.update = debounce(this.update.bind(this));\r\n\r\n // with {} we create a new object with the options inside it\r\n this.options = _extends({}, Popper.Defaults, options);\r\n\r\n // init state\r\n this.state = {\r\n isDestroyed: false,\r\n isCreated: false,\r\n scrollParents: []\r\n };\r\n\r\n // get reference and popper elements (allow jQuery wrappers)\r\n this.reference = reference && reference.jquery ? reference[0] : reference;\r\n this.popper = popper && popper.jquery ? popper[0] : popper;\r\n\r\n // Deep merge modifiers options\r\n this.options.modifiers = {};\r\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\r\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\r\n });\r\n\r\n // Refactoring modifiers' list (Object => Array)\r\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\r\n return _extends({\r\n name: name\r\n }, _this.options.modifiers[name]);\r\n })\r\n // sort the modifiers by order\r\n .sort(function (a, b) {\r\n return a.order - b.order;\r\n });\r\n\r\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\r\n // such code is executed in the same order of its modifier\r\n // they could add new properties to their options configuration\r\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\r\n this.modifiers.forEach(function (modifierOptions) {\r\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\r\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\r\n }\r\n });\r\n\r\n // fire the first update to position the popper in the right place\r\n this.update();\r\n\r\n var eventsEnabled = this.options.eventsEnabled;\r\n if (eventsEnabled) {\r\n // setup event listeners, they will take care of update the position in specific situations\r\n this.enableEventListeners();\r\n }\r\n\r\n this.state.eventsEnabled = eventsEnabled;\r\n }\r\n\r\n // We can't use class properties because they don't get listed in the\r\n // class prototype and break stuff like Sinon stubs\r\n\r\n\r\n createClass(Popper, [{\r\n key: 'update',\r\n value: function update$$1() {\r\n return update.call(this);\r\n }\r\n }, {\r\n key: 'destroy',\r\n value: function destroy$$1() {\r\n return destroy.call(this);\r\n }\r\n }, {\r\n key: 'enableEventListeners',\r\n value: function enableEventListeners$$1() {\r\n return enableEventListeners.call(this);\r\n }\r\n }, {\r\n key: 'disableEventListeners',\r\n value: function disableEventListeners$$1() {\r\n return disableEventListeners.call(this);\r\n }\r\n\r\n /**\r\n * Schedules an update. It will run on the next UI update available.\r\n * @method scheduleUpdate\r\n * @memberof Popper\r\n */\r\n\r\n\r\n /**\r\n * Collection of utilities useful when writing custom modifiers.\r\n * Starting from version 1.7, this method is available only if you\r\n * include `popper-utils.js` before `popper.js`.\r\n *\r\n * **DEPRECATION**: This way to access PopperUtils is deprecated\r\n * and will be removed in v2! Use the PopperUtils module directly instead.\r\n * Due to the high instability of the methods contained in Utils, we can't\r\n * guarantee them to follow semver. Use them at your own risk!\r\n * @static\r\n * @private\r\n * @type {Object}\r\n * @deprecated since version 1.8\r\n * @member Utils\r\n * @memberof Popper\r\n */\r\n\r\n }]);\r\n return Popper;\r\n}();\r\n\r\n/**\r\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\r\n * and lets you use it as replacement of a real DOM node.
\r\n * You can use this method to position a popper relatively to a set of coordinates\r\n * in case you don't have a DOM node to use as reference.\r\n *\r\n * ```\r\n * new Popper(referenceObject, popperNode);\r\n * ```\r\n *\r\n * NB: This feature isn't supported in Internet Explorer 10.\r\n * @name referenceObject\r\n * @property {Function} data.getBoundingClientRect\r\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\r\n * @property {number} data.clientWidth\r\n * An ES6 getter that will return the width of the virtual reference element.\r\n * @property {number} data.clientHeight\r\n * An ES6 getter that will return the height of the virtual reference element.\r\n */\r\n\r\n\r\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\r\nPopper.placements = placements;\r\nPopper.Defaults = Defaults;\r\n\r\nexport default Popper;\r\n//# sourceMappingURL=popper.js.map\r\n\r\n\r\n\r\n//////////////////\r\n// WEBPACK FOOTER\r\n// ./node_modules/popper.js/dist/esm/popper.js\r\n// module id = 42\r\n// module chunks = 0","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","/**\r\n * Used to ignore longer touches that are probably not\r\n * meant as a swipe by the user\r\n *\r\n * @constant ALLOWED_SWIPE_TIME\r\n */\r\nconst ALLOWED_SWIPE_TIME = 450;\r\n\r\nclass SwipeDetect {\r\n constructor(target, callback, threshold = 70) {\r\n this.target = target;\r\n this.callback = callback;\r\n this.threshold = threshold;\r\n\r\n this.enable();\r\n }\r\n\r\n /**\r\n * Adds the event listeners needed to record a swipe\r\n *\r\n * @name enable\r\n */\r\n enable() {\r\n this.target.addEventListener('touchstart', this.recordTouchStartValues.bind(this));\r\n this.target.addEventListener('touchend', this.detectSwipeDirection.bind(this));\r\n }\r\n\r\n /**\r\n * Destroys event listeners, to be used when\r\n * unmounting components using SwipeDetect\r\n *\r\n * @name disable\r\n */\r\n disable() {\r\n this.target.removeEventListener('touchstart', this.recordTouchStartValues.bind(this));\r\n this.target.removeEventListener('touchend', this.detectSwipeDirection.bind(this));\r\n }\r\n\r\n /**\r\n * When a User starts a touch, record the\r\n * values for later computation in detectSwipeDirection\r\n *\r\n * @name recordTouchStartValues\r\n * @param {Object} e [DOM Event object]\r\n */\r\n recordTouchStartValues(e) {\r\n const touch = e.changedTouches[0];\r\n\r\n this.startX = touch.pageX;\r\n this.startY = touch.pageY;\r\n this.startTime = new Date().getTime();\r\n }\r\n\r\n /**\r\n * When a user ends a touch, use the start and end\r\n * values to determine the direction of the swipe\r\n *\r\n * @name detectSwipeDirection\r\n * @param {Object} e [DOM Event object]\r\n */\r\n detectSwipeDirection(e) {\r\n const touch = e.changedTouches[0];\r\n const distX = touch.pageX - this.startX;\r\n const distY = touch.pageY - this.startY;\r\n const absX = Math.abs(distX);\r\n const absY = Math.abs(distY);\r\n const elapsedTime = new Date().getTime() - this.startTime;\r\n\r\n if (elapsedTime > ALLOWED_SWIPE_TIME) return;\r\n\r\n switch(true) {\r\n case absX >= this.threshold && absX > absY && distX < 0:\r\n this.callback('left');\r\n break;\r\n case absX >= this.threshold && absX > absY && distX > 0:\r\n this.callback('right');\r\n break;\r\n case absY >= this.threshold && absY > absX && distY < 0:\r\n this.callback('up');\r\n break;\r\n case absY >= this.threshold && absY > absX && distY > 0:\r\n this.callback('down');\r\n break;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Opens up the necessary event listeners on an element\r\n * to detect touch movement and then returns the direction\r\n * of that movement to the event handler\r\n *\r\n * @param {Object} target [DOM element for detection]\r\n * @param {function} callback [The function receiving direction]\r\n * @param {Int} threshold [the minimum pixels the swipe must have traveled to trigger detection]\r\n * @returns {Class}\r\n */\r\nexport default function(target, callback, threshold=150) {\r\n return new SwipeDetect(target, callback, threshold);\r\n}\r\n","export default class StepsStorage {\r\n constructor() {\r\n this.dom = {\r\n\r\n };\r\n\r\n this.ls = window.sessionStorage;\r\n\r\n this.init();\r\n }\r\n\r\n init() {\r\n\r\n }\r\n\r\n save(key, data) {\r\n this.ls.setItem(key, JSON.stringify(data));\r\n }\r\n\r\n get(key) {\r\n return JSON.parse(this.ls.getItem(key));\r\n }\r\n}\r\n","import noUiSlider from './noUiSlider';\r\nimport scss from 'scss';\r\nimport SwipeDetect from './swipe';\r\nimport { serializeToJSON } from './utils';\r\nimport StepsStorage from './steps-storage';\r\n\r\nexport default class CalcManager {\r\n constructor(thisCalc) {\r\n this.dom = {\r\n $window: $(window),\r\n $stickyFooter: $('.sticky-footer'),\r\n $thisCac: $(thisCalc),\r\n language: $('html').attr('lang'),\r\n btest: $('.btest').length > 0,\r\n isDip: $(thisCalc).hasClass('page-dip'),\r\n $offerNo: $(thisCalc).closest('.offer-slide').data('offer'),\r\n $DigStorage: {\r\n $amountName: $(thisCalc).find('.calc-details').data('calculator-cache-amount') == undefined ? 'digAmount' : $(thisCalc).find('.calc-details').data('calculator-cache-amount'),\r\n $prodidName: $(thisCalc).find('.calc-details').data('calculator-cache-prodid') == undefined ? 'digProdid' : $(thisCalc).find('.calc-details').data('calculator-cache-prodid'),\r\n $termName: $(thisCalc).find('.calc-details').data('calculator-cache-term') == undefined ? 'digTerm' : $(thisCalc).find('.calc-details').data('calculator-cache-term'),\r\n $calcDataName: $(thisCalc).find('.calc-details').data('calculator-cache-name') == undefined ? 'digCalcData' : $(thisCalc).find('.calc-details').data('calculator-cache-name'),\r\n $formDataName: $(thisCalc).find('.calc-details').data('calculator-cache-formData') == undefined ? 'digFormData' : $(thisCalc).find('.calc-details').data('calculator-cache-formData'),\r\n },\r\n $DipStorage: {\r\n $amountName: 'dipAmount',\r\n $prodidName: 'dipProdid',\r\n $termName: 'dipTerm',\r\n $calcDataName: 'dipCalcData',\r\n $formDataName: 'dipFormData',\r\n },\r\n $Storage: {},\r\n $calcFormContainer: $(thisCalc).find('.calc-form'),\r\n $dccCalcFormContainer: $(thisCalc).find('.dcc-calc-form'),\r\n $calcOfferSummaryRO: $('.calc-offer-summary-ro'),\r\n $calcPhoto: $(thisCalc).find('.calc-photo'),\r\n $rangeSlider: $(thisCalc).find('.calc-range-slider'),\r\n $offersWrap: $(thisCalc).find('.calc-offers-wrap'),\r\n $sliderRangeMin: $(thisCalc).find('.calc-range-slider-min-max .min span'),\r\n $sliderRangeMax: $(thisCalc).find('.calc-range-slider-min-max .max span'),\r\n $calcMonthWrapper: $(thisCalc).find('.calc-months-inner'),\r\n $submit: $(thisCalc).find('.js-calc-submit'),\r\n $calcOffers: $(thisCalc).find('.calc-offers-single'),\r\n $arrowSlider: $(thisCalc).find('.calc-offers-prev, .calc-offers-next'),\r\n $navigation: $(thisCalc).find('.calc-range-btn'),\r\n $insuranceSelect: $(\"input[name='insurance']\"),\r\n insuranceSelected: false,\r\n noUiSlider: '',\r\n $calcDetails: $(thisCalc).find('.calc-details'),\r\n $STLprodDetails: $(thisCalc).parent().find('a.calc-product-details[data-product-promotion-type^=\"STL\"]'),\r\n $calcOfferDetails: $(thisCalc).parent().find('.calc-offer-details'),\r\n $calcProdDetails: $(thisCalc).parent().find('.calc-product-details'),\r\n $calcInsurance: $(thisCalc).find('.calc-insurance'),\r\n $calcOfferCollect: $(thisCalc).find('.calc-offer-collect'),\r\n electonicallyCollected: false,\r\n $prodDataInput: {},\r\n calcObj: {},\r\n amountArray: [],\r\n termArray: [],\r\n amountList1: [],\r\n amountList2: [],\r\n termList: [],\r\n amount: '1200',\r\n term: '12',\r\n loanType: 'Money Transfer',\r\n rrso: '',\r\n interestRate: '',\r\n totalInterest: '',\r\n issueFee: '',\r\n homeCollectionFee: '',\r\n rate: '',\r\n tap: '',\r\n lia: '',\r\n ProductFeatureId: '',\r\n isOffer1: false,\r\n isOffer2: false,\r\n Offer1: {\r\n RV: parseInt($(\"input[name=RV1]\").val()),\r\n RT: parseInt($(\"input[name=RT1]\").val()),\r\n RR: parseInt($(\"input[name=RR1]\").val()),\r\n ReqType: $(\"input[name=ReqType1]\").val(),\r\n MOV: parseInt($(\"input[name=MOV1]\").val()),\r\n MOT: parseInt($(\"input[name=MOT1]\").val()),\r\n MOR: parseFloat($(\"input[name=MOR1]\").val() || $(\"input[name=DecOfferRate1]\").val()),\r\n FMOV: parseInt('0' + $(\"input[name=FMOV]\").val()),\r\n FMOT: parseInt('0' + $(\"input[name=FMOT]\").val()),\r\n FMOR: parseFloat('0' + $(\"input[name=FMOR]\").val()),\r\n Type: $(\"input[name=Offer1Type]\").val() || $(\"input[name=ServiceType1]\").val(),\r\n FinalOfferID: $(\"input[name=FOfferId]\").val(),\r\n FinalOfferType: $(\"input[name=FOfferType]\").val(),\r\n Code: $(\"input[name=Offer1Code]\").val() || $(\"input[name=ProductType1]\").val(),\r\n OfferType: $(\"input[name='OfferType1OfferNo']\").val(),\r\n NRV: parseInt($(\"input[name=RV1]\").val()),\r\n repayPeriod: ($('.hybridCalculator').length == 0) ? 'M' : $(\"input[name=RepaymentType1]\").val(),\r\n version: $(\"input[name=DecOfferProductVersionID1]\").val(),\r\n term: $(\"input[name=DecOfferTerm1]\").val(),\r\n rate: $(\"input[name=DecOfferWeeklyRate1]\").val(),\r\n DigitalOfferID: $(\"input[name=DigitalOfferId1]\").val()\r\n },\r\n Offer2: {\r\n RV: parseInt($(\"input[name=RV2]\").val()),\r\n RT: parseInt($(\"input[name=RT2]\").val()),\r\n RR: parseInt($(\"input[name=RR2]\").val()),\r\n ReqType: parseInt($(\"input[name=ReqType2]\").val()),\r\n MOV: parseInt($(\"input[name=MOV2]\").val()),\r\n MOT: parseInt($(\"input[name=MOT2]\").val()),\r\n MOR: parseFloat($(\"input[name=MOR2]\").val() || $(\"input[name=DecOfferRate2]\").val()),\r\n Type: $(\"input[name=Offer2Type]\").val() || $(\"input[name=ServiceType2]\").val(),\r\n Code: $(\"input[name=Offer2Code]\").val() || $(\"input[name=ProductType2]\").val(),\r\n OfferType: $(\"input[name='OfferType2OfferNo']\").val(),\r\n NRV: parseInt($(\"input[name=RV2]\").val()),\r\n repayPeriod: ($('.hybridCalculator').length == 0) ? 'M' : $(\"input[name=RepaymentType2]\").val(),\r\n version: $(\"input[name=DecOfferProductVersionID2]\").val(),\r\n term: $(\"input[name=DecOfferTerm2]\").val(),\r\n rate: $(\"input[name=DecOfferWeeklyRate2]\").val(),\r\n DigitalOfferID: $(\"input[name=DigitalOfferId2]\").val()\r\n },\r\n isFinalOfferRO: ($(\"input[id=isFinalOfferRO]\").length == 0) ? false : $(\"input[id=isFinalOfferRO]\").val(),\r\n repayAmount: ($(thisCalc).find('.calc-repay').length > 0 ? parseFloat('0' + $(thisCalc).find('.calc-repay').data('repay')) : 0)\r\n };\r\n\r\n //Check for single and dual Upsell/flat offers\r\n this.dom.isOffer1 = (this.dom.Offer1.OfferType != undefined && (this.dom.Offer1.OfferType.substr(0, 4) == \"Flex\" || this.dom.Offer1.OfferType.substr(0, 6) == \"Upsell\"))\r\n this.dom.isOffer2 = (this.dom.Offer2.OfferType != undefined && (this.dom.Offer2.OfferType.substr(0, 4) == \"Flex\" || this.dom.Offer2.OfferType.substr(0, 6) == \"Upsell\"))\r\n\r\n if (this.dom.$calcProdDetails.length == 1) this.dom.$calcOfferDetails.hide(); //if 1 product then hide button\r\n\r\n this.trackIsScrolledMobile = false;\r\n this.dom.$Storage = (this.dom.isDip ? this.dom.$DipStorage : this.dom.$DigStorage);\r\n this.storage = new StepsStorage();\r\n\r\n //Creaate separate storage for each offer\r\n if (this.dom.$offerNo != undefined) {\r\n this.dom.$Storage.$amountName = this.dom.$Storage.$amountName + this.dom.$offerNo;\r\n this.dom.$Storage.$prodidName = this.dom.$Storage.$prodidName + this.dom.$offerNo;\r\n this.dom.$Storage.$termName = this.dom.$Storage.$termName + this.dom.$offerNo;\r\n this.dom.$Storage.$calcDataName = this.dom.$Storage.$calcDataName + this.dom.$offerNo;\r\n this.dom.$Storage.$formDataName = this.dom.$Storage.$formDataName + this.dom.$offerNo;\r\n }\r\n\r\n if (this.dom.$calcFormContainer.length) {\r\n this.init();\r\n }\r\n\r\n // For DCC\r\n if (this.dom.language == 'pl' && this.dom.$dccCalcFormContainer.length) {\r\n this.dom.$submit = $(thisCalc).find('.js-dcc-calc-submit');\r\n this.eventSubmitDCCForm();\r\n }\r\n }\r\n\r\n init() {\r\n this.clearForm();\r\n this.loadImage();\r\n this.getBuildTermButtons();\r\n this.getCalculatorData();\r\n //this.appendMainSlider();\r\n this.toggleSwitchOffersMobile();\r\n this.eventSelectInsurance();\r\n if (!this.dom.btest) {\r\n this.eventSwitchOffers();\r\n }\r\n this.eventMonthScroll();\r\n this.eventMonthOfferChange();\r\n this.eventSliderMobile();\r\n this.eventScroll();\r\n this.eventSubmitForm();\r\n this.eventSwipeOffersMobile();\r\n this.eventNavigationClick();\r\n this.eventCollectClick();\r\n this.eventSetCalcClick();\r\n this.downloadPDFDIPClick();\r\n\r\n //this.goToOffer(this.dom.$calcDetails.data('tab-default'));\r\n let thisDom = this.dom;\r\n $(thisDom.$thisCac).find('.calc-value-input').on('keypress', (e) => {\r\n let key = e.which;\r\n if (key == 13) {\r\n $(e.currentTarget).trigger('change');\r\n return false;\r\n }\r\n });\r\n $(thisDom.$thisCac).find('.calc-value-input').on('change', (e) => {\r\n let inputVal = (Math.floor($(e.currentTarget).val().replace(/\\s/g, '') / 100) * 100);\r\n thisDom.amount = Math.min(inputVal, parseInt(thisDom.amountArray[thisDom.amountArray.length - 1])).toString();\r\n thisDom.noUiSlider.set($.inArray(thisDom.amount, thisDom.amountArray));\r\n });\r\n $(thisDom.$thisCac).find('.calc-value-input').on('click', (e) => {\r\n $(e.currentTarget).select();\r\n });\r\n\r\n if (this.dom.language == 'ro') {\r\n this.createApplicationForReserveOfferClick();\r\n }\r\n }\r\n\r\n clearForm() {\r\n let thisDom = this.dom;\r\n\r\n thisDom.$calcFormContainer[0].reset();\r\n\r\n if (thisDom.$calcOfferDetails.find('[data-prodid].active').length == 0) {\r\n thisDom.$calcOfferDetails.find('[data-prodid]').eq(0).addClass('active');\r\n }\r\n let $activeTab = thisDom.$calcOfferDetails.find('[data-prodid].active');\r\n if ($activeTab.data(\"product-refresh\") === \"True\") sessionStorage.clear();\r\n\r\n //Default active tab default amount or session term value\r\n if (this.storage.get(thisDom.$Storage.$prodidName) == null || $('.page-homepage').length == 0) {\r\n this.storage.save(thisDom.$Storage.$prodidName, thisDom.$calcDetails.data('tab-default') || \"1\");\r\n } else {\r\n //Leave other offers active\r\n if (thisDom.$offerNo != '2') {\r\n $activeTab.removeClass('active');\r\n thisDom.$calcOfferDetails.find(`[data-prodid=${this.storage.get(thisDom.$Storage.$prodidName)}]`).addClass('active');\r\n }\r\n }\r\n //Only show corresponding active terms\r\n thisDom.$thisCac.find('input.radio-month').closest('li').add(thisDom.$thisCac.find('.month-title')).toggle(thisDom.$calcOfferDetails.find('[data-prodid].active').data('product-term-type') == \"MO\");\r\n thisDom.$thisCac.find('input.radio-week').closest('li').add(thisDom.$thisCac.find('.week-title')).toggle(thisDom.$calcOfferDetails.find('[data-prodid].active').data('product-term-type') == \"WE\");\r\n\r\n thisDom.$rangeSlider.each((_, slider) => {\r\n noUiSlider.create(slider, {\r\n start: 1,\r\n connect: [true, false],\r\n step: 1,\r\n padding: 0,\r\n range: {\r\n min: 0,\r\n max: 1\r\n }\r\n });\r\n });\r\n }\r\n\r\n loadImage() {\r\n this.dom.$thisCac.find('.calc-photo-img[data-background]').each((id, photoObj) => { $(photoObj).css(\"background-image\", \"URL(\" + $(photoObj).data('background') + \")\"); });\r\n }\r\n\r\n getBuildTermButtons() {\r\n let thisDom = this.dom;\r\n let thisStorage = this.storage;\r\n\r\n let $termTemplate;\r\n //let $allowedTerms = thisDom.$calcOfferDetails.find('[data-prodid].active').data('product-allowed-terms');\r\n let weeklyTerms = [];\r\n\r\n thisDom.$calcProdDetails.each((key, prodTab) => {\r\n let productTerms = \"\" + $(prodTab).data('product-allowed-terms');\r\n if ($(prodTab).data('product-term-type') == \"WE\") {\r\n weeklyTerms = productTerms.split(',');\r\n if ($(prodTab).hasClass('active')) {\r\n thisDom.$thisCac.find('#termButtonTemplate li').hide();\r\n thisDom.$thisCac.find('#weekButtonTemplate li').show();\r\n }\r\n }\r\n\r\n //Build array of unique terms from available products\r\n $.each(productTerms.split(','), function (index, termVal) {\r\n if ($.inArray(termVal, thisDom.termArray) == -1) {\r\n thisDom.termArray.push(termVal);\r\n }\r\n });\r\n });\r\n\r\n //Order terms ascending\r\n thisDom.termArray.sort(function (a, b) {\r\n return parseInt(a) - parseInt(b);\r\n });\r\n\r\n let STLtermText = '';\r\n let STLttipText = '';\r\n if (thisDom.$STLprodDetails.length > 0) {\r\n let $STLtermText = $('#' + thisDom.$STLprodDetails.data('product-promotion-type').substr(0, 5) + 'term');\r\n if ($STLtermText.length > 0 && $STLtermText.val() != '') {\r\n STLtermText = $STLtermText.val();\r\n STLttipText = $STLtermText.data('content') || '';\r\n }\r\n }\r\n\r\n //Create term button markup from template\r\n $.each(thisDom.termArray, function (key, termVal) {\r\n //Create term button markup from template\r\n $termTemplate = thisDom.$thisCac.find($.inArray(termVal, weeklyTerms) == -1 ? '#termButtonTemplate li' : '#weekButtonTemplate li').eq(0).clone();\r\n if (termVal == '1' && STLtermText != '') {\r\n $termTemplate.find('input').val(termVal).next().text(STLtermText);\r\n if (STLttipText != '') $termTemplate.find('input').next().addClass('tooltip-trigger ').attr({ 'data-content': STLttipText, 'data-trigger': ('ontouchstart' in document.documentElement) ? 'click' : 'click mouseenter' });\r\n } else {\r\n $termTemplate.find('input').val(termVal).next().text(termVal);\r\n }\r\n\r\n thisDom.$calcMonthWrapper.find('.rounded-radio-wrap').append($termTemplate);\r\n });\r\n\r\n //Default to active tab default term or session term value\r\n let $activeTab = thisDom.$calcOfferDetails.find('[data-prodid].active');\r\n\r\n if (thisStorage.get(thisDom.$Storage.$termName) == null || $('.page-homepage').length == 0) {\r\n thisDom.term = $activeTab.data('product-default-term').toFixed(0);\r\n thisStorage.save(thisDom.$Storage.$termName, thisDom.term);\r\n thisStorage.save('term', thisDom.term);\r\n } else {\r\n thisDom.term = thisStorage.get(thisDom.$Storage.$termName);\r\n }\r\n thisDom.$calcMonthWrapper.find(`[value=${thisDom.term}]`).prop('checked', true);\r\n }\r\n\r\n getCalculatorData() {\r\n let thisDom = this.dom;\r\n let $this = this;\r\n let thisStorage = this.storage;\r\n let prodDataInput = {};\r\n prodDataInput.ProductConfigurations = [];\r\n\r\n //Build object list of all product data to be imported\r\n thisDom.$calcProdDetails.each((key, prodTab) => {\r\n\r\n //Check if this product has been added\r\n var filteredArr = $.grep(prodDataInput.ProductConfigurations, (thisProd, key) => {\r\n return thisProd.ProductCalculator === $(prodTab).data(\"product-calculator\") &&\r\n thisProd.ProductCalculatorType === $(prodTab).data(\"product-calculator\") &&\r\n thisProd.PricingTier === $(prodTab).data(\"product-tier\") &&\r\n thisProd.IsBallonProduct === $(prodTab).data(\"product-isballoon\").toUpperCase() &&\r\n thisProd.IsBalloonProduct === $(prodTab).data(\"product-isballoon\").toUpperCase() &&\r\n thisProd.ProductClassification === $(prodTab).data(\"product-classification\").toString() &&\r\n thisProd.ProductTermType === $(prodTab).data(\"product-term-type\") &&\r\n thisProd.ProductElectonicallyCollected === $(prodTab).data(\"product-electronicallycollected\").toUpperCase() &&\r\n thisProd.ProductElectonicallyIssued === $(prodTab).data(\"product-electronicallyissued\").toUpperCase() &&\r\n thisProd.ProductWithInsurance === $(prodTab).data(\"product-insurance\").toUpperCase() &&\r\n thisProd.PromotionType === $(prodTab).data(\"product-promotion-type\")\r\n });\r\n\r\n //If this product has not already added then add it\r\n if (filteredArr.length == 0) {\r\n prodDataInput.ProductConfigurations.push({\r\n ProductId: $(prodTab).data(\"prodid\"),\r\n ProductType: $(prodTab).data(\"product-type\"),\r\n ProductCalculator: $(prodTab).data(\"product-calculator\"),\r\n ProductCalculatorType: $(prodTab).data(\"product-calculator\"),\r\n PricingTier: $(prodTab).data(\"product-tier\"),\r\n IsBallonProduct: $(prodTab).data(\"product-isballoon\").toUpperCase(),\r\n IsBalloonProduct: $(prodTab).data(\"product-isballoon\").toUpperCase(),\r\n ProductClassification: $(prodTab).data(\"product-classification\").toString(),\r\n ProductTermType: $(prodTab).data(\"product-term-type\"),\r\n ProductElectonicallyCollected: $(prodTab).data(\"product-electronicallycollected\").toUpperCase(),\r\n ProductElectonicallyIssued: $(prodTab).data(\"product-electronicallyissued\").toUpperCase(),\r\n ProductWithInsurance: $(prodTab).data(\"product-insurance\").toUpperCase(),\r\n ProductInsuranceCost: $(prodTab).data(\"product-insurance-cost\"),\r\n PromotionType: $(prodTab).data(\"product-promotion-type\"),\r\n ProductMinAmount: ($(prodTab).data(\"product-min-amount\") == \"\" ? 0 : parseInt($(prodTab).data(\"product-min-amount\") || '0')),\r\n ProductMaxAmount: ($(prodTab).data(\"product-max-amount\") == \"\" ? 99999 : parseInt($(prodTab).data(\"product-max-amount\") || '99999')),\r\n OfferId: ($(prodTab).data(\"product-offer-id\") || '')\r\n });\r\n }\r\n\r\n this.dom.$prodDataInput = prodDataInput;\r\n\r\n });\r\n\r\n if (thisDom.language.substr(0, 2) == 'es') thisDom.language = 'es-MX';\r\n\r\n if (thisStorage.get(thisDom.$Storage.$calcDataName) == null || $('.page-homepage').length == 0 || $('.dual').length > 0) {\r\n cLog('get new data');\r\n var query = thisDom.isOffer1 || thisDom.isOffer2 ? \"?disablecache=true\" : \"\";\r\n\r\n switch (thisDom.language.substr(0, 2)) {\r\n case 'pl':\r\n getAjaxData(\"/msiapi/calculatorapi\" + query, \"POST\", true, thisDom.$prodDataInput, getCalculatorDataCallBack);\r\n break;\r\n case 'ro':\r\n getAjaxData(\"/msiapi/genericcalculatorapi\" + query, \"POST\", true, thisDom.$prodDataInput, getCalculatorDataCallBack);\r\n break;\r\n case 'es':\r\n getAjaxData(\"/msiapi/getcalculatorapi\" + query, \"POST\", true, thisDom.$prodDataInput, convertMXdata);\r\n\r\n function convertMXdata(calcMXjson) {\r\n //Convert MX 9.0 (Bolt) format data to 9.2 format\r\n let calcPLjson = { \"IsValid\": true, \"ErrorMessage\": \"\", \"ErrorCode\": \"\", \"Output\": { \"InstalmentTable\": [], \"IsSuccess\": true, \"ErrorCode\": null, \"ErrorMessage\": null, \"Token\": null } };\r\n\r\n //Convert MX 9.0 (Bolt) format data to 9.2 format\r\n //Iterate through entire calculator data structure building option lists of unique values\r\n $.each(calcMXjson.InstallmentTable, function (amountId, amountObj) {\r\n // Iterate through each Product\r\n $.each(amountObj, function (productId, productObj) {\r\n // Iterate through each Term\r\n $.each(productObj, function (termId, termObj) {\r\n // Iterate through each Service\r\n $.each(termObj, function (serviceId, serviceObj) {\r\n // Iterate through each package\r\n $.each(serviceObj, function (packageId, packageObj) {\r\n // Iterate through each Weekly Period\r\n $.each(packageObj, function (recordId, recordObj) {\r\n let tempObj = {}\r\n tempObj.Amount = parseInt(amountId);\r\n tempObj.Term = parseInt(recordObj.PRD);\r\n tempObj.InstalmentAmount = parseFloat(recordObj.RR);\r\n tempObj.RRSO = parseFloat(recordObj.AIN);\r\n tempObj.LastInstalmentAmount = 0;\r\n tempObj.InterestCV = 0;\r\n tempObj.HomeIssueFeeCV = 0;\r\n tempObj.HomeCollectionFeeCV = 0;\r\n tempObj.TotalAmountPayable = parseFloat(recordObj.TAP);\r\n tempObj.InterestRate = parseFloat(recordObj.APR);\r\n tempObj.IsBallonProduct = false;\r\n tempObj.ProductClassification = productId;\r\n if (termId == \"W\") tempObj.ProductTermType = \"WE\";\r\n if (termId == \"M\") tempObj.ProductTermType = \"MO\";\r\n tempObj.IsElectonicallyCollected = (serviceId == \"MT\");\r\n tempObj.IsElectonicallyIssued = (serviceId == \"MT\");\r\n tempObj.IsWithInsurance = (packageId != \"0\");\r\n tempObj.PricingTier = 'P0';\r\n tempObj.PromotionType = '';\r\n calcPLjson.Output.InstalmentTable.push(tempObj);\r\n });\r\n });\r\n });\r\n });\r\n });\r\n });\r\n getCalculatorDataCallBack(JSON.stringify(calcPLjson));\r\n }\r\n\r\n break;\r\n default:\r\n // code block\r\n }\r\n } else {\r\n //Get from session if available\r\n cLog('get session data');\r\n getCalculatorDataCallBack(thisStorage.get(thisDom.$Storage.$calcDataName));\r\n }\r\n\r\n function getCalculatorDataCallBack(cData) {\r\n if ($('.digital-calc-message').length > 0) {\r\n $('.digital-calc-message').hide();\r\n }\r\n\r\n //Store in session if not already\r\n if (thisStorage.get(thisDom.$Storage.$calcDataName) == null && $('.page-homepage').length > 0) {\r\n thisStorage.save(thisDom.$Storage.$calcDataName, cData);\r\n }\r\n let calcDataOp = JSON.parse(cData).Output;\r\n if (!calcDataOp.IsSuccess) {\r\n cLog(calcDataOp.ErrorCode + \": \" + calcDataOp.ErrorMessage);\r\n return false;\r\n }\r\n let calcData = calcDataOp.InstalmentTable;\r\n let dataMonthArray = [];\r\n let dataWeekArray = [];\r\n let maxMonthlyAmount = 0;\r\n //Loop through Calc data converting into new object\r\n $.each(calcData, function (index, thisObj) {\r\n //Only allow monthly MT and Weekly HS\r\n if (thisDom.language.substr(0, 2) == 'pl') {\r\n if ((thisObj.IsElectonicallyCollected && thisObj.ProductTermType === \"WE\") || (!thisObj.IsElectonicallyCollected && thisObj.ProductTermType === \"MO\")) {\r\n return true;\r\n }\r\n }\r\n\r\n let productType = $.grep(thisDom.$prodDataInput.ProductConfigurations, (thisProd, key) => {\r\n let adjustedAmount = thisObj.Amount;\r\n if (thisDom.language.substr(0, 2) == 'pl' && thisObj.IsWithInsurance) {\r\n adjustedAmount = thisObj.Amount - thisObj.Term * thisProd.ProductInsuranceCost;\r\n }\r\n return thisProd.PricingTier === thisObj.PricingTier &&\r\n (thisProd.IsBallonProduct === \"TRUE\") === thisObj.IsBallonProduct &&\r\n (thisProd.IsBalloonProduct === \"TRUE\") === thisObj.IsBallonProduct &&\r\n thisProd.ProductClassification === thisObj.ProductClassification &&\r\n thisProd.ProductTermType === thisObj.ProductTermType &&\r\n (thisProd.ProductElectonicallyCollected === \"BOTH\" || (thisProd.ProductElectonicallyCollected === \"TRUE\") === thisObj.IsElectonicallyCollected) &&\r\n (thisProd.ProductElectonicallyIssued === \"BOTH\" || (thisProd.ProductElectonicallyIssued === \"TRUE\") === thisObj.IsElectonicallyIssued) &&\r\n (thisProd.ProductWithInsurance === \"BOTH\" || (thisProd.ProductWithInsurance === \"TRUE\") === thisObj.IsWithInsurance) &&\r\n (thisProd.PromotionType == null ? \"\" : thisProd.PromotionType) === (thisObj.PromotionType == null ? \"\" : thisObj.PromotionType) &&\r\n parseInt(thisProd.ProductMinAmount) <= adjustedAmount &&\r\n parseInt(thisProd.ProductMaxAmount) >= adjustedAmount;\r\n })[0] || null;\r\n\r\n //Ignore records with products not configured in product tabs\r\n if (productType == null) {\r\n return true;\r\n } else {\r\n thisObj.ProductType = productType.ProductType;\r\n }\r\n\r\n //Ignore records with terms not configured in product tabs\r\n if ($.inArray(thisObj.Term.toFixed(0), thisDom.termArray) == -1) {\r\n return true;\r\n }\r\n\r\n //Calculate selected amount by removing insurance costs\r\n if (thisDom.language.substr(0, 2) == 'pl') {\r\n if (thisObj.IsWithInsurance) {\r\n thisObj.Amount = thisObj.Amount - (thisObj.Term * productType.ProductInsuranceCost);\r\n }\r\n\r\n //Ignore spurious amount values - queried with business ????\r\n if (thisObj.Amount % 100 != 0) {\r\n return true;\r\n }\r\n\r\n //For REF loan only allow values where CIH >= 50% loan value\r\n //Commented this as Cash In Hand rule is not required and minValue from Service will be used.\r\n //if (thisObj.ProductType != \"STL\" && thisObj.Amount < (thisDom.repayAmount * 2)) {\r\n // return true;\r\n //}\r\n\r\n //Get max monthy amount for PL\r\n if (productType.ProductTermType == \"MO\" && thisObj.Amount > maxMonthlyAmount) {\r\n maxMonthlyAmount = thisObj.Amount;\r\n }\r\n }\r\n\r\n if (!thisDom.isOffer1 ||\r\n (thisDom.isOffer1 && (thisDom.$offerNo == '1') && (thisObj.ProductType == thisDom.Offer1.Type)) ||\r\n (thisDom.isOffer2 && (thisDom.$offerNo == '2') && (thisObj.ProductType == thisDom.Offer2.Type))) {\r\n\r\n if (thisDom.calcObj[thisObj.ProductType] == undefined) {\r\n thisDom.calcObj[thisObj.ProductType] = {};\r\n }\r\n //Translate Calc data structure into amount.term.data heirachy\r\n if (thisDom.calcObj[thisObj.ProductType][thisObj.Amount] == undefined) {\r\n thisDom.calcObj[thisObj.ProductType][thisObj.Amount] = {};\r\n }\r\n\r\n let tempObj = { \"InstalmentAmount\": thisObj.InstalmentAmount, \"RRSO\": thisObj.RRSO, \"LastInstalmentAmount\": thisObj.LastInstalmentAmount, \"TotalAmountPayable\": thisObj.TotalAmountPayable, \"ComfortFee\": thisObj.ComfortFee, \"InterestRate\": thisObj.InterestRate, \"TotalCreditCost\": thisObj.TotalCreditCost, \"ProvisionFee\": thisObj.ProvisionFee, \"PenaltyFee\": thisObj.PenaltyFee, \"PaymentHolidays\": thisObj.PaymentHolidays, \"ProductFeatureId\": thisObj.ProductFeatureId, \"InterestCV\": thisObj.InterestCV, \"HomeIssueFeeCV\": thisObj.HomeIssueFeeCV, \"HomeCollectionFeeCV\": thisObj.HomeCollectionFeeCV };\r\n\r\n switch (thisDom.language.substr(0, 2)) {\r\n case 'pl':\r\n case 'es':\r\n //If insurance offered (DiP), create separate storage for this data\r\n thisDom.calcObj[thisObj.ProductType][thisObj.Amount][thisObj.Term + (thisObj.IsWithInsurance ? 'i' : '')] = tempObj;\r\n break;\r\n case 'ro':\r\n //If money transfer (DiP), create separate storage for this data\r\n thisDom.calcObj[thisObj.ProductType][thisObj.Amount][thisObj.Term + ((thisDom.$calcOfferCollect.length > 0 && thisObj.IsElectonicallyIssued) ? 'mt' : '')] = tempObj;\r\n break;\r\n default:\r\n // code block\r\n }\r\n\r\n //Add unique terms which are within allowed terms\r\n if ($.inArray(thisObj.Term.toFixed(0), thisDom.termArray) > -1) {\r\n switch (thisObj.ProductTermType) {\r\n case 'MO':\r\n if ($.inArray(thisObj.Term.toFixed(0), dataMonthArray) == -1) {\r\n dataMonthArray.push(thisObj.Term.toFixed(0));\r\n }\r\n break;\r\n case 'WE':\r\n if ($.inArray(thisObj.Term.toFixed(0), dataWeekArray) == -1) {\r\n dataWeekArray.push(thisObj.Term.toFixed(0));\r\n }\r\n break;\r\n default:\r\n // code block\r\n }\r\n }\r\n\r\n //Add unique amounts which correspond with allowed terms\r\n if ($.inArray(thisObj.Amount.toFixed(0), thisDom.amountArray) == -1 && $.inArray(thisObj.Term.toFixed(0), thisDom.termArray) > -1) {\r\n thisDom.amountArray.push(thisObj.Amount.toFixed(0));\r\n }\r\n }\r\n });\r\n if (thisDom.language.substr(0, 2) == 'pl') {\r\n //Cap Weekly referral amounts to same as monthly max value\r\n thisDom.amountArray = jQuery.grep(thisDom.amountArray, function (AmountValue) {\r\n return parseInt(AmountValue) <= maxMonthlyAmount;\r\n });\r\n }\r\n\r\n //Remove any month or Week term bubbles which we don't have data for\r\n $.each(thisDom.termArray, function (index, termValue) {\r\n if (dataMonthArray.length > 0 && $.inArray(termValue, dataMonthArray) == -1) {\r\n $('.rounded-radio-single .radio-month[value=\"' + termValue + '\"]').closest('li').remove();\r\n }\r\n if (dataWeekArray.length > 0 && $.inArray(termValue, dataWeekArray) == -1) {\r\n $('.rounded-radio-single .radio-week[value=\"' + termValue + '\"]').closest('li').remove();\r\n }\r\n });\r\n\r\n //Calulate NRV if offer 1 is either an Upsell or Flexi offer\r\n if (thisDom.isOffer1 && thisDom.$offerNo == '1') {\r\n thisDom.Offer1.NRV = getNRV(thisDom.calcObj[thisDom.Offer1.Type], thisDom.Offer1.RT, thisDom.Offer1.MOR);\r\n thisDom.calcObj[thisDom.Offer1.Type] = getUpsellData(thisDom.calcObj[thisDom.Offer1.Type], thisDom.Offer1);\r\n }\r\n //Calulate NRV if offer 2 is either an Upsell or Flexi offer\r\n if (thisDom.isOffer2 && thisDom.$offerNo == '2') {\r\n thisDom.Offer2.NRV = getNRV(thisDom.calcObj[thisDom.Offer2.Type], thisDom.Offer2.RT, thisDom.Offer2.MOR);;\r\n thisDom.calcObj[thisDom.Offer2.Type] = getUpsellData(thisDom.calcObj[thisDom.Offer2.Type], thisDom.Offer2);\r\n }\r\n\r\n //reorder amounts ascending\r\n thisDom.amountArray.sort(function (a, b) {\r\n return parseInt(a) - parseInt(b);\r\n });\r\n\r\n thisDom.$sliderRangeMin.text(parseInt(thisDom.amountArray[0]).toLocaleString(thisDom.language, { minimumFractionDigits: 0 }));\r\n thisDom.$sliderRangeMax.text(parseInt(thisDom.amountArray[thisDom.amountArray.length - 1]).toLocaleString(thisDom.language, { minimumFractionDigits: 0 }));\r\n\r\n //Create marker for top end of STL 0% if combined with NPP\r\n if (thisDom.calcObj['STL'] != undefined && thisDom.calcObj['NPP'] != undefined) {\r\n let maxSTLvalue = Object.keys(thisDom.calcObj['STL'])[Object.keys(thisDom.calcObj['STL']).length - 1];\r\n let leftSTLval = (100 * parseInt(maxSTLvalue - parseInt(thisDom.amountArray[0])) / (parseInt(thisDom.amountArray[thisDom.amountArray.length - 1]) - parseInt(thisDom.amountArray[0]))).toFixed(1);\r\n $('
').appendTo('.calc-range-slider');\r\n }\r\n\r\n $this.appendMainSlider();\r\n\r\n //Find NRV. Don't use RV for DP product\r\n function getNRV(AmountObj, RT, MOR) {\r\n var returnNRV = 0; //default to 0 as requested by Aga, also fix rouning error\r\n\r\n $.each(AmountObj, function (nValue, nObject) {\r\n if (nObject[RT] != undefined && parseFloat(nObject[RT].InstalmentAmount) > MOR) {\r\n return false;\r\n }\r\n returnNRV = parseInt(nValue);\r\n });\r\n\r\n return returnNRV;\r\n }\r\n\r\n function getUpsellData(calcData, offerObj) {\r\n var result = {};\r\n var RV = offerObj.RV;\r\n var RT = offerObj.RT;\r\n var RR = offerObj.RR;\r\n var MOV = offerObj.MOV;\r\n var MOT = offerObj.MOT;\r\n var MOR = offerObj.MOR;\r\n var NRV = Math.min(RV, offerObj.NRV); //Aga change to ensure NRV is never higher than RV\r\n var SV = 0;\r\n var ST = 0;\r\n var isBPP = (offerObj.Type.substr(offerObj.Type.length - 3, 3) == 'BPP' || offerObj.Type.substr(0, 3) == 'STL');\r\n\r\n if (offerObj.OfferType.substr(0, 4) == \"Flex\") { //Flexi offer\r\n $.each(calcData, function (PV, values) {\r\n PV = parseInt(PV);\r\n if (PV == '0') return true;\r\n var PR;\r\n\r\n $.each(values, function (PT, value) {\r\n\r\n //For START only use this term\r\n if (!(isBPP && PT != MOT)) {\r\n\r\n PR = parseFloat(value.InstalmentAmount);\r\n PT = parseInt(PT);\r\n\r\n if (PV <= MOV &&\r\n PT <= MOT &&\r\n PR <= MOR) {\r\n //Set flex2 defaults to requested values (or as close as possible higher)\r\n if (PV >= RV &&\r\n PT >= Math.min(RT, MOT) &&\r\n SV == 0) {\r\n SV = PV;\r\n ST = PT;\r\n }\r\n result = prepareResultObj(result, PT, PV, value);\r\n }\r\n }\r\n });\r\n });\r\n } else if (offerObj.OfferType.substr(0, 6) == \"Upsell\") {\r\n if (offerObj.RV >= MOV) {\r\n //scenario -1\r\n cLog('Scenario 1');\r\n return result;\r\n } else {\r\n $.each(calcData, function (PV, values) {\r\n PV = parseInt(PV);\r\n if (PV == '0') return true;\r\n var PR;\r\n\r\n $.each(values, function (PT, value) {\r\n\r\n //For START only use this term\r\n if (!(isBPP && PT != MOT)) {\r\n\r\n PR = parseFloat(value.InstalmentAmount);\r\n PT = parseInt(PT);\r\n\r\n if ((RR <= MOR) || isBPP) { //CST-9029 change to stop BPP dropping into scenario 3\r\n //scenario -2\r\n if (PV >= RV && PV <= MOV &&\r\n PT <= MOT &&\r\n PR <= MOR) {\r\n result = prepareResultObj(result, PT, PV, value);\r\n }\r\n } else {\r\n //scenario -3\r\n if (PV >= NRV && PV <= MOV &&\r\n PT >= RT && PT <= MOT &&\r\n PR <= MOR) {\r\n result = prepareResultObj(result, PT, PV, value);\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n function prepareResultObj(result, term, rValue, object) {\r\n if (!result[rValue]) {\r\n result[rValue] = {};\r\n }\r\n result[rValue][term] = object;\r\n return result;\r\n }\r\n\r\n if (!$.isEmptyObject(result)) {\r\n\r\n thisDom.amountArray = [];\r\n let termArray = [];\r\n\r\n //Build up new term and value arrays based on temporary offer table\r\n $.each(result, function (thisAmount, amountObj) {\r\n thisDom.amountArray.push(thisAmount);\r\n $.each(amountObj, function (thisTerm, thisObj) {\r\n if (($.inArray(thisTerm, termArray) == -1) && ($.inArray(thisTerm, thisDom.termArray) > -1)) {\r\n termArray.push(thisTerm);\r\n }\r\n });\r\n });\r\n //reorder terms ascending\r\n termArray.sort(function (a, b) {\r\n return parseInt(a) - parseInt(b);\r\n });\r\n\r\n //Remove terms not required\r\n thisDom.$calcMonthWrapper.find('input[type=radio]').each(function () {\r\n if ($.inArray($(this).val(), termArray) == -1) {\r\n $(this).closest('li').remove();\r\n }\r\n });\r\n\r\n //Get min term and amount\r\n thisDom.minLoanAmount = thisDom.amountArray[0];\r\n thisDom.minLoanTerm = termArray[0];\r\n\r\n //Get max term and amount\r\n thisDom.maxLoanAmount = thisDom.amountArray[thisDom.amountArray.length - 1];\r\n thisDom.maxLoanTerm = termArray[termArray.length - 1];\r\n\r\n if (offerObj.OfferType == 'Flexi2Offer' && result[SV] != undefined) {\r\n //Set to Requested values if possible\r\n thisDom.amount = SV.toString();\r\n if (result[thisDom.amount][ST] != undefined) thisDom.term = ST;\r\n\r\n } else {\r\n //Set to Max offer values if possible\r\n if (result[thisDom.maxLoanAmount] != undefined) thisDom.amount = thisDom.maxLoanAmount;\r\n if (result[thisDom.amount][thisDom.maxLoanTerm] != undefined) thisDom.term = thisDom.maxLoanTerm;\r\n }\r\n\r\n thisDom.$calcMonthWrapper.find(`[value=${thisDom.term}]`).prop('checked', true);\r\n }\r\n\r\n if (offerObj.OfferType.substr(0, 4) == \"Flex\" && thisDom.language.substr(0, 2) == 'ro') {\r\n if (thisDom.isFinalOfferRO === 'true') {\r\n if (parseInt(thisDom.maxLoanAmount) < parseInt(offerObj.RV)) {\r\n $('.reject-request-amount').show();\r\n }\r\n\r\n if (parseInt(thisDom.minLoanAmount) > parseInt(offerObj.RV)) {\r\n $('.offer-more-amount').show();\r\n }\r\n } else {\r\n if (parseInt(thisDom.amount) < parseInt(offerObj.RV)) {\r\n $('.reject-request-amount').show();\r\n }\r\n\r\n if (parseInt(thisDom.amount) > parseInt(offerObj.RV)) {\r\n $('.offer-more-amount').show();\r\n }\r\n }\r\n }\r\n\r\n calcData = result;\r\n return calcData;\r\n }\r\n }\r\n }\r\n\r\n appendMainSlider() {\r\n let thisDom = this.dom;\r\n let $this = this;\r\n let thisStorage = this.storage;\r\n let sliderPadding = 0;\r\n\r\n //Default to active tab default amount or session amount value\r\n let $activeTab = thisDom.$calcOfferDetails.find('[data-prodid].active');\r\n if (!thisDom.btest) {\r\n thisDom.$calcMonthWrapper.find('[value=1],[value=5]').closest('li').addClass('disabled').siblings().removeClass('disabled');\r\n }\r\n\r\n if (!this.dom.isOffer1 && !this.dom.isOffer2) {\r\n //Not an offer so get defaults from product tab attributes\r\n if (thisStorage.get(thisDom.$Storage.$amountName) == null) {\r\n thisDom.amount = $activeTab.data('product-default-amount').toFixed(0);\r\n //Save amount in session\r\n thisStorage.save(thisDom.$Storage.$amountName, thisDom.amount);\r\n thisStorage.save('amount', thisDom.amount);\r\n } else {\r\n thisDom.amount = thisStorage.get(thisDom.$Storage.$amountName);\r\n }\r\n }\r\n\r\n // update slider start value for RO when requested amount is lesser than maximum amount\r\n if (thisDom.language.substr(0, 2) == 'ro' && thisDom.Offer1.RV < parseInt(thisDom.amount)) {\r\n if (thisDom.isOffer1 && thisDom.$offerNo == '1' && thisDom.Offer1.OfferType.substr(0, 4) == \"Flex\") {\r\n thisDom.amount = thisDom.Offer1.RV.toString();\r\n thisStorage.save(thisDom.$Storage.$amountName, thisDom.amount);\r\n thisStorage.save('amount', thisDom.amount);\r\n } else if (thisDom.isOffer2 && thisDom.$offerNo == '2' && thisDom.Offer2.OfferType.substr(0, 4) == \"Flex\") {\r\n thisDom.amount = thisDom.Offer2.RV.toString();\r\n thisStorage.save(thisDom.$Storage.$amountName, thisDom.amount);\r\n thisStorage.save('amount', thisDom.amount);\r\n }\r\n }\r\n\r\n let startVal = $.inArray(thisDom.amount, thisDom.amountArray);\r\n\r\n if (thisDom.amountArray.length == 1) {\r\n //prevent slider script failing if only one possible offer\r\n thisDom.amountArray.push(thisDom.amountArray[0]);\r\n }\r\n thisDom.$rangeSlider.each((_, slider) => {\r\n slider.noUiSlider.updateOptions({\r\n start: startVal,\r\n range: {\r\n min: 0,\r\n max: thisDom.amountArray.length - 1\r\n }\r\n });\r\n\r\n slider.noUiSlider.on('update', (value, handle) => {\r\n let newVal = +thisDom.amountArray[parseInt(value[handle])];\r\n let valUp = (newVal >= parseInt(thisDom.amount));\r\n thisDom.amount = newVal.toFixed(0);\r\n thisStorage.save(thisDom.$Storage.$amountName, newVal.toFixed(0));\r\n thisStorage.save('amount', newVal.toFixed(0));\r\n\r\n let $activeTab = thisDom.$calcOfferDetails.find('[data-prodid].active');\r\n let activeProdType = $activeTab.data('product-type');\r\n let activeProdCode = $activeTab.data('product-code');\r\n\r\n $.each(thisDom.$calcOfferDetails.find('[data-prodid]'), function (index, thisProd) {\r\n if (thisDom.calcObj[$(thisProd).data('product-type')] == undefined) {\r\n $(thisProd).toggleClass('noclick', true);\r\n cLog($(thisProd).data('product-type') + ' data not found');\r\n } else {\r\n //$(thisProd).toggleClass('noclick', thisDom.calcObj[$(thisProd).data('product-type')][thisDom.amount] == undefined);\r\n }\r\n });\r\n\r\n //If value falls outside product range then look for product which has this value\r\n if (thisDom.calcObj[activeProdType][thisDom.amount] == undefined) {\r\n if (thisDom.term == '1' || thisDom.term == '5') {\r\n thisDom.term = '6';\r\n }\r\n $.each(thisDom.calcObj, function (thisProd, thisObj) {\r\n if (thisDom.calcObj[thisProd][thisDom.amount] != undefined) {\r\n activeProdType = thisProd;\r\n //Set to lowest available term\r\n if (thisDom.calcObj[thisProd][thisDom.amount][thisDom.term] == undefined) {\r\n thisDom.term = Object.keys(thisDom.calcObj[thisProd][thisDom.amount])[0];\r\n }\r\n //Store selected product in session\r\n $activeTab = thisDom.$calcOfferDetails.find(`[data-product-type=${thisProd}]`).eq(0);\r\n thisStorage.save(thisDom.$Storage.$prodidName, $activeTab.data('prodid'));\r\n return false;\r\n }\r\n });\r\n let newOffer = thisDom.$calcOfferDetails.find(`[data-product-type=${activeProdType}]`).data('prodid');\r\n this.goToOffer(newOffer);\r\n if ($('.tippy-popper').is(':visible')) $('body').trigger('click');\r\n\r\n } else if (activeProdType == \"NPP\" && thisDom.calcObj[\"STL\"] != undefined && thisDom.calcObj[\"STL\"][thisDom.amount] != undefined) {\r\n let oldTerm = this.storage.get(\"oldTerm\")\r\n if (oldTerm != '1') {\r\n activeProdType = \"STL\";\r\n let newOffer = thisDom.$calcOfferDetails.find(`[data-product-type=${activeProdType}]`).data('prodid');\r\n this.goToOffer(newOffer);\r\n thisDom.$calcFormContainer.find('.radio-month[value=\"1\"]').next('.rounded-radio-label').trigger('click');\r\n }\r\n }\r\n\r\n thisDom.$calcFormContainer.find('.calc-product-legal-text').html($activeTab.data('product-legal-text'));\r\n\r\n let valText = newVal.toLocaleString(thisDom.language, { minimumFractionDigits: 0 });\r\n thisDom.$calcFormContainer.find('.calc-slider .calc-value span, #calc-slider-value').html(`${valText}`);\r\n thisDom.$calcFormContainer.find('.calc-slider .calc-value-input').val(`${valText}`);\r\n thisDom.$calcFormContainer.find('[name=calcValue]').val(newVal);\r\n\r\n $('#selected-Product_Amount').val(newVal);\r\n\r\n let revTermArray = Array.from(thisDom.termArray).reverse();\r\n\r\n\r\n if (thisDom.calcObj[activeProdType][thisDom.amount][thisDom.term] == undefined) {\r\n\r\n //Find next term up or down which supports selected amount\r\n $.each(valUp ? thisDom.termArray : revTermArray, function (index, thisVal) {\r\n if (thisDom.calcObj[activeProdType][thisDom.amount][thisVal] != undefined) {\r\n thisDom.term = thisVal;\r\n //Store selected term in session\r\n thisStorage.save(thisDom.$Storage.$termName, thisVal);\r\n thisStorage.save('term', thisVal);\r\n thisDom.$calcMonthWrapper.find(`[value=${thisVal}]`).prop('checked', true);\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n //display results on screen\r\n $this.displayResults(activeProdType, activeProdCode);\r\n });\r\n\r\n slider.noUiSlider.on('change', (value) => {\r\n //let currentOffer = this.offerChangeByDragging(value);\r\n\r\n this.trackIsScrolledMobile = false;\r\n this.scrollToCalcMobile();\r\n //if (thisDom.$calcPhoto.find('.active').data('id') !== currentOffer) {\r\n // this.slideMobileOffer(thisDom.$calcOffers.filter(`[data-prodid=${currentOffer}]`));\r\n //}\r\n });\r\n\r\n thisDom.noUiSlider = slider.noUiSlider;\r\n });\r\n }\r\n\r\n changeOfferSlide() {\r\n let thisDom = this.dom;\r\n\r\n thisDom.slideMobileOffer();\r\n }\r\n\r\n goToOffer(offerID) {\r\n let thisDom = this.dom;\r\n\r\n let $allOffers = thisDom.$offersWrap.children();\r\n let $allPhotos = thisDom.$calcPhoto.children();\r\n\r\n if ($allOffers.length > 0) {\r\n let $active = $allOffers.add($allPhotos).removeClass('active').filter(`[data-prodid=${offerID}]`);\r\n\r\n $active.addClass('active');\r\n\r\n this.slideMobileOffer($active.filter('.calc-offers-single'), false);\r\n\r\n this.setCalcValue($active.filter('.calc-offers-single'));\r\n } else {\r\n let $active = thisDom.$calcProdDetails.filter(`[data-prodid=${offerID}]`);\r\n\r\n this.setCalcValue($active);\r\n }\r\n }\r\n\r\n setCalcValue($active) {\r\n let thisDom = this.dom;\r\n let thisStorage = this.storage;\r\n let $w = thisDom.$window;\r\n let id = +$active.data('prodid');\r\n let $activeTab = thisDom.$calcOfferDetails.find(`[data-prodid=${id}]`);\r\n let activeProdType = $activeTab.data('product-type');\r\n let defaultAmount = $activeTab.data('product-default-amount').toFixed(0);\r\n let defaultTerm = $activeTab.data('product-default-term').toFixed(0);\r\n\r\n //Change selected tab\r\n if ($activeTab.length > 0) {\r\n $activeTab.addClass('active').parent().siblings().find('[data-prodid].active').removeClass('active');\r\n } else {\r\n thisDom.$calcOfferDetails.find('[data-prodid].active').removeClass('active');\r\n }\r\n //Only show corresponding active terms\r\n thisDom.$thisCac.find('input.radio-month').closest('li').add(thisDom.$thisCac.find('.month-title')).toggle(thisDom.$calcOfferDetails.find('[data-prodid].active').data('product-term-type') == \"MO\");\r\n thisDom.$thisCac.find('input.radio-week').closest('li').add(thisDom.$thisCac.find('.week-title')).toggle(thisDom.$calcOfferDetails.find('[data-prodid].active').data('product-term-type') == \"WE\");\r\n\r\n //If new product not support amount then set default amount\r\n if (thisDom.calcObj[activeProdType][thisDom.amount] == undefined) {\r\n thisDom.amount = defaultAmount;\r\n thisDom.noUiSlider.set($.inArray(defaultAmount, thisDom.amountArray));\r\n }\r\n\r\n if (thisDom.calcObj[activeProdType][thisDom.amount][thisDom.term] == undefined) {\r\n let valUp = true;\r\n //Find next term up or down which supports selected amount\r\n $.each(valUp ? thisDom.termArray : revTermArray, function (index, thisVal) {\r\n if (thisDom.calcObj[activeProdType][thisDom.amount][thisVal] != undefined) {\r\n thisDom.term = thisVal;\r\n //Store selected term in session\r\n thisStorage.save(thisDom.$Storage.$termName, thisVal);\r\n thisStorage.save('term', thisVal);\r\n thisDom.$calcMonthWrapper.find(`[value=${thisVal}]`).prop('checked', true);\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n //If new product not support term then set default term\r\n if (defaultTerm == '1' || defaultTerm == '5' || activeProdType == 'DP' || (thisDom.term == '5') || (thisDom.calcObj[activeProdType][thisDom.amount][thisDom.term] == undefined)) {\r\n thisDom.term = defaultTerm;\r\n //Save term in session\r\n thisStorage.save(thisDom.$Storage.$termName, thisDom.term);\r\n thisStorage.save('term', thisDom.term);\r\n }\r\n\r\n thisDom.$calcMonthWrapper.find(`[value=${thisDom.term}]`).prop('checked', true);\r\n if (!thisDom.btest) {\r\n if (defaultTerm == '1' || defaultTerm == '5' || activeProdType == 'DP') {\r\n thisDom.$calcMonthWrapper.find(`[value=${defaultTerm}]`).closest('li').removeClass('disabled').siblings().addClass('disabled');\r\n } else {\r\n thisDom.$calcMonthWrapper.find('[value=1],[value=5]').closest('li').addClass('disabled').siblings().removeClass('disabled');\r\n }\r\n }\r\n\r\n if (thisDom.calcObj[activeProdType][thisDom.amount][thisDom.term] == undefined) {\r\n\r\n //Find next amount which supports selected term\r\n $.each(thisDom.amountArray, function (index, thisVal) {\r\n if (thisDom.calcObj[activeProdType][thisVal] != undefined && thisDom.calcObj[activeProdType][thisVal][thisDom.term] != undefined) {\r\n thisDom.amount = thisVal;\r\n //Save amount in session\r\n thisStorage.save(thisDom.$Storage.$amountName, thisVal);\r\n thisStorage.save('amount', thisVal);\r\n\r\n thisDom.noUiSlider.set($.inArray(thisVal, thisDom.amountArray));\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n //Refresh slider values\r\n //thisDom.noUiSlider.set();\r\n\r\n\r\n if ($w.width() <= parseInt(scss['$sm'])) {\r\n //Move product buttons to show active one\r\n var step = thisDom.$calcOfferDetails.find('[data-prodid].active').offset().left - 20;\r\n thisDom.$calcOfferDetails.stop().animate({ scrollLeft: `${step}` }, 800);\r\n }\r\n }\r\n\r\n toggleSwitchOffersMobile() {\r\n let thisDom = this.dom;\r\n let $w = thisDom.$window;\r\n\r\n if (thisDom.$stickyFooter.length > 0 && thisDom.$calcFormContainer.is(':visible')) {\r\n thisDom.$stickyFooter.toggleClass('visible', $w.scrollTop() > thisDom.$calcFormContainer.height());\r\n }\r\n\r\n if ($w.width() >= parseInt(scss['$md'])) {\r\n thisDom.$calcOfferDetails.removeClass('visible');\r\n return;\r\n }\r\n\r\n let scrollOffset = $('.main-header').height() - $('.main-header .container').height();\r\n let headerH = $('.calc-col-offer').height() + scrollOffset - 10;\r\n let barH = $('.main-header').height();\r\n\r\n thisDom.$calcOfferDetails.toggleClass('visible', $w.scrollTop() >= parseInt(headerH - barH));\r\n }\r\n\r\n eventSelectInsurance() {\r\n let thisDom = this.dom;\r\n let $this = this;\r\n\r\n if (thisDom.$insuranceSelect.length > 0) {\r\n thisDom.$insuranceSelect.on('change', (e) => {\r\n e.preventDefault();\r\n thisDom.insuranceSelected = $(e.currentTarget).is(':checked');\r\n let $activeTab = thisDom.$calcOfferDetails.find('[data-prodid].active');\r\n let activeProdType = $activeTab.data('product-type');\r\n let activeProdCode = $activeTab.data('product-code');\r\n\r\n //display results on screen\r\n $this.displayResults(activeProdType, activeProdCode);\r\n });\r\n }\r\n }\r\n\r\n scrollToCalcMobile() {\r\n let thisDom = this.dom;\r\n let $w = thisDom.$window;\r\n\r\n if ($w.width() > parseInt(scss['$md']) || this.trackIsScrolledMobile || $('.page-homepage').length == 0) {\r\n return;\r\n }\r\n\r\n let scrollOffset = $('.main-header').height() - $('.main-header .container').height();\r\n let headerH = $('.calc-col-offer').height() + scrollOffset - 8;\r\n let barH = $('.main-header').height();\r\n this.trackIsScrolledMobile = true;\r\n\r\n //if (this.dom.$offersWrap.is(':visible')) $('html, body').animate({ scrollTop: parseInt(headerH - barH) }, 300);\r\n }\r\n\r\n clearMobileArrows() {\r\n let thisDom = this.dom;\r\n let $slideActive = thisDom.$offersWrap.children('.active');\r\n\r\n thisDom.$arrowSlider.removeClass('hidden');\r\n\r\n if ($slideActive.is(':first-child')) {\r\n thisDom.$arrowSlider.filter('.calc-offers-prev').addClass('hidden');\r\n } else if ($slideActive.is(':last-child')) {\r\n thisDom.$arrowSlider.filter('.calc-offers-next').addClass('hidden');\r\n }\r\n }\r\n\r\n eventMonthScroll() {\r\n let thisDom = this.dom;\r\n\r\n thisDom.$calcMonthWrapper.on('click', '.rounded-radio-single', () => {\r\n this.trackIsScrolledMobile = false;\r\n this.scrollToCalcMobile();\r\n });\r\n }\r\n\r\n eventMonthOfferChange() {\r\n let thisDom = this.dom;\r\n let thisStorage = this.storage;\r\n let $this = this;\r\n\r\n thisDom.$calcMonthWrapper.on('change', '.radio-month, .radio-week', (e) => {\r\n let newVal = parseInt($(e.currentTarget).val());\r\n let $activeTab = thisDom.$calcOfferDetails.find('[data-prodid].active');\r\n let activeProdType = $activeTab.data('product-type');\r\n let activeProdCode = $activeTab.data('product-code');\r\n let defaultTerm = $activeTab.data('product-default-term').toFixed(0);\r\n\r\n let valUp = (newVal >= parseInt(thisDom.term));\r\n let oldTerm = thisDom.term;\r\n thisStorage.save('oldTerm', oldTerm);\r\n thisDom.term = newVal;\r\n //Store selected term in session\r\n thisStorage.save(thisDom.$Storage.$termName, newVal.toFixed(0));\r\n thisStorage.save('term', newVal.toFixed(0));\r\n\r\n let revSliderArray = Array.from(thisDom.amountArray).reverse();\r\n\r\n if (thisDom.calcObj[activeProdType][thisDom.amount][thisDom.term] == undefined) {\r\n\r\n //Find next amount which supports selected term - up or down\r\n $.each(valUp ? thisDom.amountArray : revSliderArray, function (index, thisVal) {\r\n if (thisDom.calcObj[activeProdType][thisVal] != undefined && thisDom.calcObj[activeProdType][thisVal][thisDom.term] != undefined) {\r\n thisDom.amount = thisVal;\r\n //Save amount in session\r\n thisStorage.save(thisDom.$Storage.$amountName, thisVal);\r\n thisStorage.save('amount', thisVal);\r\n\r\n thisDom.noUiSlider.set($.inArray(thisVal, thisDom.amountArray));\r\n return false;\r\n }\r\n });\r\n }\r\n //If value falls outside product range then look for product which has this value\r\n if (oldTerm == '1' || oldTerm == '5' || thisDom.calcObj[activeProdType][thisDom.amount] == undefined || thisDom.calcObj[activeProdType][thisDom.amount][thisDom.term] == undefined) {\r\n\r\n $.each(thisDom.calcObj, function (thisProd, thisObj) {\r\n if (thisProd != activeProdType) {\r\n if (thisDom.calcObj[thisProd][thisDom.amount] != undefined && thisDom.calcObj[thisProd][thisDom.amount][thisDom.term] != undefined) {\r\n activeProdType = thisProd;\r\n //Store selected product in session\r\n thisStorage.save(thisDom.$Storage.$prodidName, thisDom.$calcOfferDetails.find(`[data-product-type=${thisProd}]`).eq(0).data('prodid'));\r\n return false;\r\n } else {\r\n //Find next amount which supports this product and selected term - up or down\r\n $.each(valUp ? thisDom.amountArray : revSliderArray, function (index, thisVal) {\r\n if (thisDom.calcObj[thisProd][thisVal] != undefined && thisDom.calcObj[thisProd][thisVal][thisDom.term] != undefined) {\r\n activeProdType = thisProd;\r\n thisDom.amount = thisVal;\r\n //Store selected product and amount in session\r\n thisStorage.save(thisDom.$Storage.$prodidName, thisDom.$calcOfferDetails.find(`[data-product-type=${thisProd}]`).eq(0).data('prodid'));\r\n thisStorage.save(thisDom.$Storage.$amountName, thisVal);\r\n thisStorage.save('amount', thisVal);\r\n\r\n //thisDom.noUiSlider.set($.inArray(thisVal, thisDom.amountArray));\r\n return false;\r\n }\r\n });\r\n if (activeProdType == thisProd) return false;\r\n }\r\n }\r\n });\r\n let newOffer = thisDom.$calcOfferDetails.find(`[data-product-type=${activeProdType}]`).data('prodid');\r\n this.goToOffer(newOffer);\r\n thisDom.noUiSlider.set($.inArray(thisDom.amount, thisDom.amountArray));\r\n }\r\n\r\n //display results on screen\r\n $this.displayResults(activeProdType, activeProdCode);\r\n\r\n //if (newVal == '5') {\r\n // this.goToOffer(2);\r\n //}\r\n });\r\n }\r\n\r\n //Display results on screen\r\n displayResults(activeProd, activeCode) {\r\n let thisDom = this.dom;\r\n let thisTerm = thisDom.term;\r\n let thisSelection;\r\n\r\n switch (thisDom.language.substr(0, 2)) {\r\n case 'pl':\r\n case 'es':\r\n if (thisDom.$calcInsurance.length > 0) {\r\n if (thisDom.calcObj[activeProd][thisDom.amount][thisDom.term + 'i'] != undefined) {\r\n if (thisDom.calcObj[activeProd][thisDom.amount][thisDom.term] == undefined) {\r\n thisTerm = thisTerm + 'i';\r\n thisDom.$insuranceSelect.prop('checked', true);\r\n thisDom.$calcInsurance.addClass('noclick');\r\n } else {\r\n thisDom.$insuranceSelect.prop('checked', thisDom.insuranceSelected);\r\n thisTerm = thisTerm + (thisDom.insuranceSelected ? 'i' : '');\r\n thisDom.$calcInsurance.removeClass('noclick');\r\n }\r\n } else {\r\n thisDom.$insuranceSelect.prop('checked', false);\r\n thisDom.$calcInsurance.addClass('noclick');\r\n }\r\n }\r\n thisSelection = thisDom.calcObj[activeProd][thisDom.amount][thisTerm];\r\n break;\r\n case 'ro':\r\n if (thisDom.$calcOfferCollect.length > 0) {\r\n if (thisDom.calcObj[activeProd][thisDom.amount][thisDom.term + 'mt'] != undefined) {\r\n thisDom.$calcOfferCollect.find('a[data-collection=\"MT\"').toggleClass('active', thisDom.electonicallyCollected);\r\n thisDom.$calcOfferCollect.find('a[data-collection=\"HC\"').toggleClass('active', !thisDom.electonicallyCollected);\r\n thisDom.$calcFormContainer.find('#calc-home-collection-fee').closest('p').toggle(thisDom.$calcOfferCollect.find('a.active').data('collection') == 'HC');\r\n thisDom.$calcFormContainer.find('#included-rate').toggle(thisDom.$calcOfferCollect.find('a.active').data('collection') == 'HC');\r\n thisTerm = thisTerm + (thisDom.electonicallyCollected ? 'mt' : '');\r\n thisDom.$calcOfferCollect.find('a').removeClass('noclick');\r\n } else {\r\n if (thisDom.$calcOfferCollect.find('a.active').data('collection') == 'MT') {\r\n thisDom.$calcOfferCollect.find('a').toggleClass('active');\r\n thisDom.$calcFormContainer.find('#calc-home-collection-fee').closest('p').toggle(true);\r\n }\r\n thisDom.$calcOfferCollect.find('a[data-collection=\"MT\"').addClass('noclick');\r\n }\r\n thisDom.loanType = thisDom.$calcOfferCollect.find('a.active').data('collection') == \"MT\" ? \"Money Transfer\" : \"Home Service\";\r\n }\r\n thisSelection = thisDom.calcObj[activeProd][thisDom.amount][thisTerm];\r\n if (typeof (dataLayer) != \"undefined\") {\r\n var dataObj = {\r\n \"event\": \"Calculator Values Changed\",\r\n \"installment-type\": (thisDom.$calcOfferDetails.find('[data-prodid].active').data('product-term-type') == \"MO\" ? \"Monthly\" : \"Weekly\"),\r\n \"installment-amount\": thisSelection.InstalmentAmount,\r\n \"loan-amount\": \"\" + thisDom.amount,\r\n \"loan-term\": thisDom.term,\r\n \"loan-extra\": \"\",\r\n \"loan-type\": thisDom.loanType,\r\n \"total-amount\": thisSelection.TotalAmountPayable,\r\n };\r\n //Don't add again if data already added to dataLayer\r\n if (JSON.stringify(dataLayer[dataLayer.length - 1]) != JSON.stringify(dataObj)) {\r\n dataLayer.push(dataObj);\r\n }\r\n }\r\n break;\r\n default:\r\n // code block\r\n }\r\n\r\n let $offerBox = thisDom.$calcFormContainer.closest('.offer-slide');\r\n let showPH = (thisDom.term != '1' && thisDom.term != '3' && thisDom.term != '5');\r\n let isBPP = (activeProd.substr(activeProd.length - 3, 3) == 'BPP');\r\n let isSTL = (activeProd.substr(0, 3) == 'STL') || (activeProd.indexOf(\"STL61\") >= 0) || (activeProd.indexOf(\"STL30\") >= 0);\r\n\r\n thisDom.rrso = thisSelection.RRSO.toLocaleString(thisDom.language, { minimumFractionDigits: 2 });\r\n thisDom.interestRate = thisSelection.InterestRate.toLocaleString(thisDom.language, { minimumFractionDigits: 2 });\r\n thisDom.rate = thisSelection.InstalmentAmount.toLocaleString(thisDom.language, { minimumFractionDigits: (isSTL && thisSelection.RRSO == 0) ? 0 : 2 });\r\n thisDom.tap = thisSelection.TotalAmountPayable.toLocaleString(thisDom.language, { minimumFractionDigits: (isSTL && thisSelection.RRSO == 0) ? 0 : 2 });\r\n thisDom.lia = thisSelection.LastInstalmentAmount.toLocaleString(thisDom.language, { minimumFractionDigits: 2 });\r\n thisDom.ProductFeatureId = thisSelection.ProductFeatureId;\r\n thisDom.cih = (parseFloat(thisDom.amount) - thisDom.repayAmount).toLocaleString(thisDom.language, { minimumFractionDigits: 2, maximumFractionDigits: 2 });\r\n thisDom.repay = thisDom.repayAmount.toLocaleString(thisDom.language, { minimumFractionDigits: 2, maximumFractionDigits: 2 });\r\n thisDom.totalInterest = (thisSelection.InterestCV).toLocaleString(thisDom.language, { minimumFractionDigits: 2 });\r\n thisDom.issueFee = (thisSelection.HomeIssueFeeCV).toLocaleString(thisDom.language, { minimumFractionDigits: 2 });\r\n thisDom.homeCollectionFee = (thisSelection.HomeCollectionFeeCV).toLocaleString(thisDom.language, { minimumFractionDigits: 2 });\r\n\r\n thisDom.$calcFormContainer.find('.calc-summary-rrso .calc-value').toggleClass('zeroRRSO', thisSelection.RRSO == 0);\r\n thisDom.$calcFormContainer.find('[name=rrso]').val(thisSelection.RRSO);\r\n thisDom.$calcFormContainer.find('.calc-summary-rate .calc-value span, #calc-summary-rate-value').html(thisDom.rate);\r\n thisDom.$offersWrap.find('.calc-offers-single .calc-rate').html(thisDom.rate);\r\n thisDom.$calcFormContainer.find('[name=rate]').val(thisSelection.InstalmentAmount);\r\n thisDom.$calcFormContainer.find('#calc-summary-term-value').html(parseInt(thisTerm));\r\n thisDom.$calcFormContainer.find('#calc-total-interest').html(thisDom.totalInterest);\r\n thisDom.$calcFormContainer.find('.calc-interest-rate .calc-value span').html(thisDom.interestRate);\r\n thisDom.$calcFormContainer.find('#calc-home-collection-fee').html(thisDom.homeCollectionFee);\r\n thisDom.$calcFormContainer.find('.calc-cih').html(thisDom.cih);\r\n thisDom.$calcFormContainer.find('.calc-repay').html(thisDom.repay);\r\n thisDom.$calcFormContainer.find('.calc-summary-lia .calc-value span').html(thisDom.lia);\r\n\r\n thisDom.$calcFormContainer.find('.calc-summary-rrso .calc-value span, .calc-dae').html(thisDom.rrso);\r\n thisDom.$calcFormContainer.find('.calc-summary-bottom .calc-tap').html(thisDom.tap);\r\n thisDom.$calcFormContainer.find('#calc-issue-fee').html(thisDom.issueFee);\r\n thisDom.$calcFormContainer.find('#calc-total-interest').html(thisDom.totalInterest);\r\n\r\n if (thisDom.language.substr(0, 2) == 'ro' && thisDom.$calcOfferSummaryRO.length > 0) {\r\n thisDom.$calcOfferSummaryRO.find('.calc-dae').html(thisDom.rrso);\r\n thisDom.$calcOfferSummaryRO.find('.calc-total-interest').html(thisDom.totalInterest);\r\n thisDom.$calcOfferSummaryRO.find('.calc-issue-fee').html(thisDom.issueFee);\r\n thisDom.$calcOfferSummaryRO.find('.calc-tap').html(thisDom.tap);\r\n thisDom.$calcOfferSummaryRO.find('.calc-cih').html(thisDom.cih);\r\n }\r\n if (isSTL) {\r\n $('.cal-summary-tap-stl').hide();\r\n thisDom.$calcFormContainer.find('.advisor-section').toggle(false);\r\n }\r\n else {\r\n thisDom.$calcFormContainer.find('.advisor-section').toggle(true);\r\n }\r\n $offerBox.find('.calc-summary-tap span').html(thisDom.tap);\r\n //$offerBox.find('.ph').html(`${thisSelection.PaymentHolidays}`); //NOTE: PH is fixed with offer and does not vary with term\r\n //$offerBox.find('.ph').html(Math.floor(thisDom.term / thisDom.$calcDetails.data(\"phratio\")));\r\n //Hide PH text for 3 and 5 month term\r\n $offerBox.find('p .ph').closest('p').toggle(showPH);\r\n let $phPopup = $offerBox.find('.modal .ph').closest('.modal');\r\n if (!showPH) $($phPopup).hide();\r\n $('.kfcolumn[data-target=\"#' + $($phPopup).attr('id') + '\"]').toggle(showPH);\r\n thisDom.$calcFormContainer.find('.calc-slider .stl-title').toggle(isSTL);\r\n thisDom.$calcFormContainer.find('.calc-slider .npp-title').toggle(!isSTL);\r\n thisDom.$calcFormContainer.find('.calc-months .stl-title').toggle(isSTL);\r\n thisDom.$calcFormContainer.find('.calc-months .npp-title').toggle(!isSTL);\r\n thisDom.$calcFormContainer.find('.calc-summary-rate .stl-title').toggle(isSTL && !isBPP);\r\n thisDom.$calcFormContainer.find('.calc-summary-rate .bpp-title').toggle(isBPP && !isSTL);\r\n thisDom.$calcFormContainer.find('.calc-summary-rate .npp-title').toggle(!isBPP && !isSTL);\r\n if (isBPP) {\r\n thisDom.$calcFormContainer.find('.calc-summary-lia').show().insertAfter(thisDom.$calcFormContainer.find('.calc-summary-rate'));\r\n } else {\r\n thisDom.$calcFormContainer.find('.calc-summary-lia').hide().insertBefore(thisDom.$calcFormContainer.find('.calc-summary-rate'));\r\n }\r\n $('#product_Feature_Id').val(thisSelection.ProductFeatureId);\r\n $('#total-Paybale_Amount').val(thisSelection.TotalAmountPayable);\r\n\r\n if (thisDom.isOffer1) {\r\n $offerBox.find('#OfferSave1RequestAmount,#Offer1RequestAmount').val(thisDom.amount);\r\n $offerBox.find('#OfferSave1RequestedTerm,#Offer1RequestedTerm').val(thisDom.term);\r\n $offerBox.find('#OfferSave1ProductFeatureId,#Offer1ProductFeatureId').val(thisDom.ProductFeatureId);\r\n $offerBox.find('#OfferProductCode1').val(activeCode);\r\n $offerBox.find('#OfferRate1').val(thisDom.rate);\r\n }\r\n if (thisDom.isOffer2) {\r\n $offerBox.find('#OfferSave2RequestAmount,#Offer2RequestAmount').val(thisDom.amount);\r\n $offerBox.find('#OfferSave2RequestedTerm,#Offer2RequestedTerm').val(thisDom.term);\r\n $offerBox.find('#OfferSave2ProductFeatureId,#Offer2ProductFeatureId').val(thisDom.ProductFeatureId);\r\n $offerBox.find('#OfferProductCode2').val(activeCode);\r\n $offerBox.find('#OfferRate2').val(thisDom.rate);\r\n }\r\n //Check if final offer values available\r\n if (this.dom.Offer1.FMOV > 0) {\r\n let finalOffer = (parseInt(thisDom.amount) <= this.dom.Offer1.FMOV && parseInt(thisDom.term) <= this.dom.Offer1.FMOT && parseInt(thisDom.rate) <= this.dom.Offer1.FMOR);\r\n $('.fo-text, .fo-btn').toggle(finalOffer);\r\n $('.po-text, .po-btn').toggle(!finalOffer);\r\n if (this.dom.Offer1.FinalOfferID != undefined) $('#Offer1ID').val(finalOffer ? this.dom.Offer1.FinalOfferID : this.dom.Offer1.DigitalOfferID);\r\n if (this.dom.Offer1.FinalOfferType != undefined) $('#Offer1Type').val(finalOffer ? this.dom.Offer1.FinalOfferType : this.dom.Offer1.OfferType);\r\n $('#Offer1Provisional').val(finalOffer ? \"False\" : \"True\");\r\n }\r\n }\r\n\r\n slideMobileOffer($next, updateOffer = true) {\r\n let thisDom = this.dom;\r\n let step = 0;\r\n\r\n if (updateOffer) {\r\n this.goToOffer($next.attr('data-prodid'));\r\n }\r\n\r\n this.clearMobileArrows();\r\n\r\n if ($next.is(':first-child')) {\r\n step = 0;\r\n } else {\r\n step = 28 * $next.index(); //stop returning 2 or more\r\n }\r\n\r\n thisDom.$offersWrap.css('transform', `translate3d(-${step}%, 0, 0)`);\r\n }\r\n\r\n eventSwitchOffers() {\r\n let thisDom = this.dom;\r\n let thisStorage = this.storage;\r\n\r\n thisDom.$calcOfferDetails.find('[data-prodid]').on('click', (e) => {\r\n e.preventDefault();\r\n let $thisTab = $(e.currentTarget);\r\n let id = $thisTab.data('prodid');\r\n let defaultAmount = $thisTab.data('product-default-amount').toFixed(0);\r\n let defaultTerm = $thisTab.data('product-default-term').toFixed(0);\r\n $thisTab.addClass('active').parent().siblings().find('.active').removeClass('active');\r\n\r\n if (thisDom.language.substr(0, 2) == 'pl') {\r\n //Set to default product values\r\n thisDom.amount = defaultAmount;\r\n thisDom.term = defaultTerm;\r\n }\r\n\r\n thisDom.noUiSlider.set($.inArray(thisDom.amount, thisDom.amountArray));\r\n thisDom.$calcMonthWrapper.find(`[value=${thisDom.term}]`).prop('checked', true);\r\n\r\n //Store selected product in session\r\n thisStorage.save(thisDom.$Storage.$prodidName, id);\r\n thisStorage.save(thisDom.$Storage.$amountName, thisDom.amount);\r\n thisStorage.save('amount', thisDom.amount);\r\n thisStorage.save(thisDom.$Storage.$termName, thisDom.term);\r\n thisStorage.save('term', thisDom.term);\r\n\r\n if (thisDom.$offersWrap.length > 0 && thisDom.$window.width() < parseInt(scss['$md'])) {\r\n this.trackIsScrolledMobile = false;\r\n this.scrollToCalcMobile();\r\n this.slideMobileOffer(thisDom.$offersWrap.children(`[data-prodid=${id}]`));\r\n } else {\r\n this.goToOffer(id);\r\n }\r\n });\r\n\r\n //support dual STL tabbed calcuator\r\n $('.calc-form-tab:not(.active)').off('click').on('click', (e) => {\r\n $('.calc-slide').toggle();\r\n });\r\n }\r\n\r\n downloadPDFDIPClick() {\r\n var that = this;\r\n $('#print_information_form').on('click', (e) => {\r\n e.preventDefault();\r\n that.printInformationForm();\r\n })\r\n }\r\n\r\n eventSubmitForm() {\r\n let thisDom = this.dom;\r\n let thisStorage = this.storage;\r\n\r\n thisDom.$submit.on('click', (e) => {\r\n e.preventDefault();\r\n let formData = serializeToJSON(thisDom.$calcFormContainer.serializeArray());\r\n let isMonthly = (thisDom.$calcOfferDetails.find('[data-prodid]').length == 0 || thisDom.$calcOfferDetails.find('[data-prodid].active').data('product-term-type') == \"MO\");\r\n let isMoneyTransfer = (thisDom.$calcOfferCollect.length == 0 || thisDom.$calcOfferCollect.find('a.active').data('collection') == \"MT\");\r\n let isInsuranceChecked = (thisDom.$calcFormContainer.find(\".calc-insurance input[type='checkbox'][name='insurance']:checked\").length == 1);\r\n thisStorage.save(thisDom.$Storage.$formDataName, formData);\r\n $('.loading-screen').show();\r\n let sessionDataInput = {\r\n 'Amount': thisDom.amount,\r\n 'RequestedAmount': thisDom.amount,\r\n 'Period': thisDom.term,\r\n 'RequestedTerm': thisDom.term,\r\n 'APR': thisDom.rrso,\r\n 'TAP': thisDom.tap,\r\n 'MonthValue': (isMonthly ? thisDom.rate : \"\"),\r\n 'WeekValue': (!isMonthly ? thisDom.rate : \"\"),\r\n 'ProductTermTypeValue': (isMonthly ? \"Monthly\" : \"Weekly\"),\r\n 'CollectionMethod': (isMoneyTransfer ? \"Money Transfer\" : \"Home Service\"),\r\n 'ProductCode': thisDom.$calcOfferDetails.find('[data-prodid].active').data(\"product-code\"),\r\n 'ProductType': thisDom.$calcOfferDetails.find('[data-prodid].active').data(\"product-type\"),\r\n 'ProductCalculator': thisDom.$calcOfferDetails.find('[data-prodid].active').data(\"product-calculator\"),\r\n 'PricingTier': thisDom.$calcOfferDetails.find('[data-prodid].active').data(\"product-tier\"),\r\n 'IsBallonProduct': thisDom.$calcOfferDetails.find('[data-prodid].active').data(\"product-isballoon\"),\r\n 'ProductClassification': thisDom.$calcOfferDetails.find('[data-prodid].active').data(\"product-classification\"),\r\n 'ProductTermType': thisDom.$calcOfferDetails.find('[data-prodid].active').data(\"product-term-type\"),\r\n 'ProductElectonicallyCollected': thisDom.$calcOfferDetails.find('[data-prodid].active').data(\"product-electronicallycollected\"),\r\n 'ProductElectonicallyIssued': thisDom.$calcOfferDetails.find('[data-prodid].active').data(\"product-electronicallyissued\"),\r\n 'ProductWithInsurance': thisDom.$calcOfferDetails.find('[data-prodid].active').data(\"product-insurance\"),\r\n 'PromotionType': thisDom.$calcOfferDetails.find('[data-prodid].active').data(\"product-promotion-type\"),\r\n 'InterestRate': thisDom.interestRate,\r\n 'TotalInterest': thisDom.totalInterest,\r\n 'ProvisionFee': thisDom.analysisFee,\r\n 'ProductFeatureId': thisDom.ProductFeatureId,\r\n 'IsInsuranceChecked': (isInsuranceChecked ? 1 : 0)\r\n }\r\n\r\n //Save calculator data in session\r\n getAjaxData(\"/scapi/usercalcstatus\", \"POST\", false, sessionDataInput, postSessionDataCallBack);\r\n\r\n function postSessionDataCallBack(cbData, status) {\r\n cLog('push: ' + JSON.stringify(sessionDataInput));\r\n }\r\n\r\n //Get calculator data from session\r\n //getAjaxData(\"/scapi/usercalcstatus\", \"GET\", false, null, getSessionDataCallBack);\r\n\r\n function getSessionDataCallBack(cbData, status) {\r\n cLog('get: ' + JSON.stringify(cbData));\r\n }\r\n if ($('form.short-form').length == 0) {\r\n //DashboardOffer Save ApplicationType in Session\r\n\r\n if ($('input[name=\"ReserveApplicationType\"]').length != 0) {\r\n let applicationType = $(e.currentTarget).closest('.box-offer').find('input[name=\"ReserveApplicationType\"]').val();\r\n let DashboardTAP = thisDom.tap;\r\n $.ajax({\r\n url: '/api/sitecore/DashboardLoan/SetApplicationType',\r\n type: 'post',\r\n data: '{ \"ApplicationType\" : \"' + applicationType + '\",\"DashboardTAP\":\"' + DashboardTAP + '\"}',\r\n contentType: 'application/json; charset=utf-8',\r\n cache: false,\r\n async: false,\r\n success: function (result) {\r\n },\r\n complete: function (data) {\r\n //window.location = $(e.currentTarget).attr('href');\r\n }\r\n });\r\n }\r\n\r\n //Dashboard Save Ends\r\n\r\n window.location = $(e.currentTarget).attr('href');\r\n }\r\n\r\n });\r\n }\r\n\r\n eventSubmitDCCForm() {\r\n let thisDom = this.dom;\r\n let thisStorage = this.storage;\r\n\r\n let amount = $(\"#dcc-amount\").val() !== undefined ? ($(\"#dcc-amount\").val().length > 0 ? $(\"#dcc-amount\").val() : \"10000\") : \"10000\";\r\n let requestedAmount = $(\"#dcc-requested-amount\").val() !== undefined ? ($(\"#dcc-requested-amount\").val().length > 0 ? $(\"#dcc-requested-amount\").val() : \"10000\") : \"10000\";\r\n\r\n\r\n\r\n thisDom.$submit.on('click', (e) => {\r\n e.preventDefault();\r\n $('.loading-screen').show();\r\n let sessionDataInput = {\r\n \"Amount\": amount,\r\n \"RequestedAmount\": requestedAmount,\r\n \"Period\": \"11\",\r\n \"RequestedTerm\": \"11\",\r\n \"APR\": \"\",\r\n \"TAP\": \"\",\r\n \"MonthValue\": \"\",\r\n \"WeekValue\": \"\",\r\n \"ProductTermTypeValue\": \"\",\r\n \"CollectionMethod\": \"\",\r\n \"ProductCode\": \"\",\r\n \"ProductType\": \"\",\r\n \"ProductCalculator\": \"CATIE\",\r\n \"PricingTier\": \"P4\",\r\n \"IsBallonProduct\": \"False\",\r\n \"ProductClassification\": \"CL\",\r\n \"ProductTermType\": \"MO\",\r\n \"ProductElectonicallyCollected\": \"True\",\r\n \"ProductElectonicallyIssued\": \"True\",\r\n \"ProductWithInsurance\": \"False\",\r\n \"PromotionType\": null,\r\n \"InterestRate\": \"\",\r\n \"TotalInterest\": \"\",\r\n \"IsInsuranceChecked\": 0\r\n }\r\n\r\n //Save calculator data in session\r\n getAjaxData(\"/scapi/usercalcstatus\", \"POST\", false, sessionDataInput, postSessionDataCallBack);\r\n\r\n function postSessionDataCallBack(cbData, status) {\r\n cLog('push: ' + JSON.stringify(sessionDataInput));\r\n }\r\n\r\n window.location = $(e.currentTarget).attr('href');\r\n });\r\n }\r\n\r\n eventSliderMobile() {\r\n let thisDom = this.dom;\r\n let thisStorage = this.storage;\r\n\r\n thisDom.$arrowSlider.on('click', (e) => {\r\n e.preventDefault();\r\n let $slides = thisDom.$offersWrap.children();\r\n let direction = $(e.currentTarget).hasClass('calc-offers-prev') ? 'prev' : 'next';\r\n let $next = $slides.eq(direction === 'prev' ? $slides.filter('.active').index() - 1 : $slides.filter('.active').index() + 1);\r\n\r\n let id = $next.data('prodid')\r\n let $thisTab = thisDom.$calcProdDetails.filter(`[data-prodid=${id}]`);\r\n let defaultAmount = $thisTab.data('product-default-amount').toFixed(0);\r\n let defaultTerm = $thisTab.data('product-default-term').toFixed(0);\r\n $thisTab.addClass('active').parent().siblings().find('.active').removeClass('active');\r\n\r\n thisDom.amount = defaultAmount;\r\n thisDom.term = defaultTerm;\r\n thisStorage.save('oldTerm', defaultTerm);\r\n thisDom.noUiSlider.set($.inArray(defaultAmount, thisDom.amountArray));\r\n thisDom.$calcMonthWrapper.find(`[value=${defaultTerm}]`).prop('checked', true);\r\n\r\n //Store selected product in session\r\n thisStorage.save(thisDom.$Storage.$prodidName, id);\r\n thisStorage.save(thisDom.$Storage.$amountName, defaultAmount);\r\n thisStorage.save(thisDom.$Storage.$termName, defaultTerm);\r\n thisStorage.save('term', defaultTerm);\r\n\r\n this.slideMobileOffer($next);\r\n });\r\n }\r\n\r\n eventSwipeOffersMobile() {\r\n let thisDom = this.dom;\r\n if ($('.calc-col-offer').length > 0) {\r\n SwipeDetect($('.calc-col-offer')[0], (direction) => {\r\n let $arrow = thisDom.$arrowSlider.filter(`.calc-offers-${direction === 'right' ? 'prev' : 'next'}`);\r\n\r\n if (!$arrow.hasClass('hidden')) {\r\n $arrow.click();\r\n }\r\n }, 50);\r\n }\r\n }\r\n\r\n eventNavigationClick() {\r\n let thisDom = this.dom;\r\n\r\n thisDom.$navigation.on('click', (e) => {\r\n e.preventDefault();\r\n let $btn = $(e.currentTarget);\r\n let value = +thisDom.noUiSlider.get();\r\n\r\n value = value + ($btn.hasClass('increase') ? 1 : -1);\r\n\r\n thisDom.noUiSlider.set(value);\r\n });\r\n }\r\n\r\n eventScroll() {\r\n let thisDom = this.dom;\r\n if (thisDom.$window.width() < parseInt(scss['$lg']) && $('.page-homepage').length > 0 && $('.container_uwaga').length == 0) {\r\n $('.page-wrapper.page-homepage .main-content').addClass('noWarning');\r\n }\r\n\r\n thisDom.$window.on('scroll', () => {\r\n this.toggleSwitchOffersMobile();\r\n //this.scrollToCalcMobile();\r\n });\r\n }\r\n\r\n eventCollectClick() {\r\n let thisDom = this.dom;\r\n let $this = this;\r\n\r\n thisDom.$calcOfferCollect.on('click', 'a:not(.noclick)', (e) => {\r\n e.preventDefault();\r\n let $btn = $(e.currentTarget);\r\n thisDom.electonicallyCollected = ($btn.data('collection') == 'MT');\r\n\r\n $btn.addClass('active').parent().siblings().find('.active').removeClass('active');\r\n\r\n let $activeTab = thisDom.$calcOfferDetails.find('[data-prodid].active');\r\n let activeProdType = $activeTab.data('product-type');\r\n let activeProdCode = $activeTab.data('product-code');\r\n\r\n //display results on screen\r\n $this.displayResults(activeProdType, activeProdCode);\r\n });\r\n\r\n }\r\n\r\n eventSetCalcClick() {\r\n $('a[data-calcval]').on('click', (e) => {\r\n let newVal = $(e.currentTarget).data('calcval').toString();\r\n let arrayVal = $.inArray(newVal, this.dom.amountArray);\r\n if (arrayVal >= 0) {\r\n this.dom.noUiSlider.set($.inArray(newVal, this.dom.amountArray));\r\n }\r\n });\r\n }\r\n\r\n printInformationForm() {\r\n var medicalcheckboxstatus = $('.medicalInsurance').find('input').prop('checked');\r\n var totalPaybaleAmount = $('#total-Paybale_Amount').val();\r\n var productFeatureID = $('#product_Feature_Id').val();\r\n //var selectedAmount = $('#selected-Product_Amount').val();\r\n var url = '/custom/handlers/getfile.ashx?InsuranceType=' + medicalcheckboxstatus + '&content-type=pdf&file-type=eif&t=' + Math.random() + '&document-title=test' + '&totalPaybaleAmount=' + totalPaybaleAmount + '&product-feature-id=' + productFeatureID;\r\n var a = document.createElement('a');\r\n //For ios devices open in new tab\r\n if (/iphone|ipad|macintosh/i.test(navigator.userAgent)) {\r\n a.href = url;\r\n a.target = '_blank';\r\n a.style = \"display: none\";\r\n document.body.appendChild(a);\r\n setTimeout(function () { a.click(); }, 1000);\r\n } else {\r\n var dDate = new Date();\r\n var sDate = dDate.getDate() + '-' + (dDate.getMonth() + 1) + '-' + dDate.getFullYear();\r\n var filename = \"Formularz inf_\" + sDate + \".pdf\";\r\n var xhr = new XMLHttpRequest();\r\n xhr.open('GET', url, true);\r\n xhr.responseType = 'blob';\r\n\r\n xhr.onload = function (e) {\r\n if (this.status == 200) {\r\n var blob = this.response;\r\n if (navigator.appVersion.toString().indexOf('.NET') > 0) {\r\n //IE 10+\r\n window.navigator.msSaveBlob(blob, filename);\r\n //setTimeout(function () { location.reload(); }, 1000);\r\n } else {\r\n //Firefox, Chrome\r\n var blobUrl = window.URL.createObjectURL(new Blob([blob], { type: blob.type }));\r\n a.href = blobUrl;\r\n a.download = filename;\r\n a.style = \"display: none\";\r\n //document.body.appendChild(a);\r\n //a.onclick = function () {\r\n // location.reload();\r\n //}\r\n a.click();\r\n window.URL.revokeObjectURL(blobUrl, filename);\r\n }\r\n }\r\n };\r\n xhr.send();\r\n }\r\n }\r\n\r\n createApplicationForReserveOfferClick() {\r\n this.dom.$thisCac.find('.dashboardApplyRefinanceBtn, .dashboardApplyBtn').on('click', (e) => {\r\n e.preventDefault();\r\n $(\".loading-screen\").show();\r\n var parentControlId = $($(e)[0].target).parent().parent();\r\n var prodData = parentControlId.find('.calc-offer-details a').data();\r\n\r\n var model = {\r\n \"Pin\": parentControlId.find('input[name=\"pin\"]').val(),\r\n \"ApplicationType\": parentControlId.find('input[name=\"isRefinance\"]').val() ? \"ref\" : \"par\",\r\n \"reserveId\": $('input[name=\"ReserveId\"]').val(),\r\n \"analyticInformation\": {},\r\n \"productDetails\": {\r\n \"requestedAmount\": parseInt(parentControlId.find('.calc-slider input').val()),\r\n \"requestedTerm\": parseInt(parentControlId.find('input[type=\"radio\"]:checked').val()),\r\n \"productCalculator\": prodData.productCalculator.toString(),\r\n \"pricingTier\": prodData.productTier,\r\n \"isBallonProduct\": prodData.productIsballoon.toUpperCase(),\r\n \"productClassification\": prodData.productClassification,\r\n \"productTermType\": prodData.productTermType,\r\n \"productElectonicallyCollected\": prodData.productElectronicallycollected.toUpperCase(),\r\n \"productElectonicallyIssued\": prodData.productElectronicallyissued.toUpperCase(),\r\n \"productWithInsurance\": prodData.productInsurance.toUpperCase(),\r\n \"promotionType\": prodData.productPromotionType.toString()\r\n }\r\n }\r\n\r\n getAjaxData('/msiapi/applicationforreserveapi', \"POST\", true, model, function (result) {\r\n $(\".loading-screen\").hide();\r\n if (result.success) {\r\n $(location).attr('href', parentControlId.find('input[name=\"dashboardApplyURL\"]').val());\r\n } else {\r\n if (result.status == \"declined\") {\r\n $(location).attr('href', parentControlId.find('input[name=\"declined-page\"]').val());\r\n }\r\n else {\r\n $(location).attr('href', parentControlId.find('input[name=\"doc-error-page\"]').val());\r\n }\r\n }\r\n });\r\n });\r\n };\r\n}","export const serializeToJSON = (arr) => {\r\n let result = {};\r\n\r\n arr.forEach((item) => {\r\n result[item.name] = item.value;\r\n });\r\n\r\n return result;\r\n};\r\n","/**!\r\n* tippy.js v4.2.0\r\n* (c) 2017-2019 atomiks\r\n* MIT License\r\n*/\r\nimport Popper from './popper.js';\r\n\r\n//var css = \".tippy-iOS{cursor:pointer!important}.tippy-notransition{transition:none}.tippy-popper{transition-timing-function:cubic-bezier(.165,.84,.44,1);max-width:calc(100% - 8px);pointer-events:none;outline:0}.tippy-popper[x-placement^=top] .tippy-backdrop{border-radius:40% 40% 0 0}.tippy-popper[x-placement^=top] .tippy-roundarrow{bottom:-7px;bottom:-6.5px;-webkit-transform-origin:50% 0;transform-origin:50% 0;margin:0 3px}.tippy-popper[x-placement^=top] .tippy-roundarrow svg{position:absolute;left:0;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.tippy-popper[x-placement^=top] .tippy-arrow{border-top:8px solid #333;border-right:8px solid transparent;border-left:8px solid transparent;bottom:-7px;margin:0 3px;-webkit-transform-origin:50% 0;transform-origin:50% 0}.tippy-popper[x-placement^=top] .tippy-backdrop{-webkit-transform-origin:0 25%;transform-origin:0 25%}.tippy-popper[x-placement^=top] .tippy-backdrop[data-state=visible]{-webkit-transform:scale(1) translate(-50%,-55%);transform:scale(1) translate(-50%,-55%)}.tippy-popper[x-placement^=top] .tippy-backdrop[data-state=hidden]{-webkit-transform:scale(.2) translate(-50%,-45%);transform:scale(.2) translate(-50%,-45%);opacity:0}.tippy-popper[x-placement^=top] [data-animation=shift-toward][data-state=visible]{-webkit-transform:translateY(-10px);transform:translateY(-10px)}.tippy-popper[x-placement^=top] [data-animation=shift-toward][data-state=hidden]{opacity:0;-webkit-transform:translateY(-20px);transform:translateY(-20px)}.tippy-popper[x-placement^=top] [data-animation=perspective]{-webkit-transform-origin:bottom;transform-origin:bottom}.tippy-popper[x-placement^=top] [data-animation=perspective][data-state=visible]{-webkit-transform:perspective(700px) translateY(-10px) rotateX(0);transform:perspective(700px) translateY(-10px) rotateX(0)}.tippy-popper[x-placement^=top] [data-animation=perspective][data-state=hidden]{opacity:0;-webkit-transform:perspective(700px) translateY(0) rotateX(60deg);transform:perspective(700px) translateY(0) rotateX(60deg)}.tippy-popper[x-placement^=top] [data-animation=fade][data-state=visible]{-webkit-transform:translateY(-10px);transform:translateY(-10px)}.tippy-popper[x-placement^=top] [data-animation=fade][data-state=hidden]{opacity:0;-webkit-transform:translateY(-10px);transform:translateY(-10px)}.tippy-popper[x-placement^=top] [data-animation=shift-away][data-state=visible]{-webkit-transform:translateY(-10px);transform:translateY(-10px)}.tippy-popper[x-placement^=top] [data-animation=shift-away][data-state=hidden]{opacity:0;-webkit-transform:translateY(0);transform:translateY(0)}.tippy-popper[x-placement^=top] [data-animation=scale]{-webkit-transform-origin:bottom;transform-origin:bottom}.tippy-popper[x-placement^=top] [data-animation=scale][data-state=visible]{-webkit-transform:translateY(-10px) scale(1);transform:translateY(-10px) scale(1)}.tippy-popper[x-placement^=top] [data-animation=scale][data-state=hidden]{opacity:0;-webkit-transform:translateY(-10px) scale(.5);transform:translateY(-10px) scale(.5)}.tippy-popper[x-placement^=bottom] .tippy-backdrop{border-radius:0 0 30% 30%}.tippy-popper[x-placement^=bottom] .tippy-roundarrow{top:-7px;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;margin:0 3px}.tippy-popper[x-placement^=bottom] .tippy-roundarrow svg{position:absolute;left:0;-webkit-transform:rotate(0);transform:rotate(0)}.tippy-popper[x-placement^=bottom] .tippy-arrow{border-bottom:8px solid #333;border-right:8px solid transparent;border-left:8px solid transparent;top:-7px;margin:0 3px;-webkit-transform-origin:50% 100%;transform-origin:50% 100%}.tippy-popper[x-placement^=bottom] .tippy-backdrop{-webkit-transform-origin:0 -50%;transform-origin:0 -50%}.tippy-popper[x-placement^=bottom] .tippy-backdrop[data-state=visible]{-webkit-transform:scale(1) translate(-50%,-45%);transform:scale(1) translate(-50%,-45%)}.tippy-popper[x-placement^=bottom] .tippy-backdrop[data-state=hidden]{-webkit-transform:scale(.2) translate(-50%);transform:scale(.2) translate(-50%);opacity:0}.tippy-popper[x-placement^=bottom] [data-animation=shift-toward][data-state=visible]{-webkit-transform:translateY(10px);transform:translateY(10px)}.tippy-popper[x-placement^=bottom] [data-animation=shift-toward][data-state=hidden]{opacity:0;-webkit-transform:translateY(20px);transform:translateY(20px)}.tippy-popper[x-placement^=bottom] [data-animation=perspective]{-webkit-transform-origin:top;transform-origin:top}.tippy-popper[x-placement^=bottom] [data-animation=perspective][data-state=visible]{-webkit-transform:perspective(700px) translateY(10px) rotateX(0);transform:perspective(700px) translateY(10px) rotateX(0)}.tippy-popper[x-placement^=bottom] [data-animation=perspective][data-state=hidden]{opacity:0;-webkit-transform:perspective(700px) translateY(0) rotateX(-60deg);transform:perspective(700px) translateY(0) rotateX(-60deg)}.tippy-popper[x-placement^=bottom] [data-animation=fade][data-state=visible]{-webkit-transform:translateY(10px);transform:translateY(10px)}.tippy-popper[x-placement^=bottom] [data-animation=fade][data-state=hidden]{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px)}.tippy-popper[x-placement^=bottom] [data-animation=shift-away][data-state=visible]{-webkit-transform:translateY(10px);transform:translateY(10px)}.tippy-popper[x-placement^=bottom] [data-animation=shift-away][data-state=hidden]{opacity:0;-webkit-transform:translateY(0);transform:translateY(0)}.tippy-popper[x-placement^=bottom] [data-animation=scale]{-webkit-transform-origin:top;transform-origin:top}.tippy-popper[x-placement^=bottom] [data-animation=scale][data-state=visible]{-webkit-transform:translateY(10px) scale(1);transform:translateY(10px) scale(1)}.tippy-popper[x-placement^=bottom] [data-animation=scale][data-state=hidden]{opacity:0;-webkit-transform:translateY(10px) scale(.5);transform:translateY(10px) scale(.5)}.tippy-popper[x-placement^=left] .tippy-backdrop{border-radius:50% 0 0 50%}.tippy-popper[x-placement^=left] .tippy-roundarrow{right:-12px;-webkit-transform-origin:33.33333333% 50%;transform-origin:33.33333333% 50%;margin:3px 0}.tippy-popper[x-placement^=left] .tippy-roundarrow svg{position:absolute;left:0;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.tippy-popper[x-placement^=left] .tippy-arrow{border-left:8px solid #333;border-top:8px solid transparent;border-bottom:8px solid transparent;right:-7px;margin:3px 0;-webkit-transform-origin:0 50%;transform-origin:0 50%}.tippy-popper[x-placement^=left] .tippy-backdrop{-webkit-transform-origin:50% 0;transform-origin:50% 0}.tippy-popper[x-placement^=left] .tippy-backdrop[data-state=visible]{-webkit-transform:scale(1) translate(-50%,-50%);transform:scale(1) translate(-50%,-50%)}.tippy-popper[x-placement^=left] .tippy-backdrop[data-state=hidden]{-webkit-transform:scale(.2) translate(-75%,-50%);transform:scale(.2) translate(-75%,-50%);opacity:0}.tippy-popper[x-placement^=left] [data-animation=shift-toward][data-state=visible]{-webkit-transform:translateX(-10px);transform:translateX(-10px)}.tippy-popper[x-placement^=left] [data-animation=shift-toward][data-state=hidden]{opacity:0;-webkit-transform:translateX(-20px);transform:translateX(-20px)}.tippy-popper[x-placement^=left] [data-animation=perspective]{-webkit-transform-origin:right;transform-origin:right}.tippy-popper[x-placement^=left] [data-animation=perspective][data-state=visible]{-webkit-transform:perspective(700px) translateX(-10px) rotateY(0);transform:perspective(700px) translateX(-10px) rotateY(0)}.tippy-popper[x-placement^=left] [data-animation=perspective][data-state=hidden]{opacity:0;-webkit-transform:perspective(700px) translateX(0) rotateY(-60deg);transform:perspective(700px) translateX(0) rotateY(-60deg)}.tippy-popper[x-placement^=left] [data-animation=fade][data-state=visible]{-webkit-transform:translateX(-10px);transform:translateX(-10px)}.tippy-popper[x-placement^=left] [data-animation=fade][data-state=hidden]{opacity:0;-webkit-transform:translateX(-10px);transform:translateX(-10px)}.tippy-popper[x-placement^=left] [data-animation=shift-away][data-state=visible]{-webkit-transform:translateX(-10px);transform:translateX(-10px)}.tippy-popper[x-placement^=left] [data-animation=shift-away][data-state=hidden]{opacity:0;-webkit-transform:translateX(0);transform:translateX(0)}.tippy-popper[x-placement^=left] [data-animation=scale]{-webkit-transform-origin:right;transform-origin:right}.tippy-popper[x-placement^=left] [data-animation=scale][data-state=visible]{-webkit-transform:translateX(-10px) scale(1);transform:translateX(-10px) scale(1)}.tippy-popper[x-placement^=left] [data-animation=scale][data-state=hidden]{opacity:0;-webkit-transform:translateX(-10px) scale(.5);transform:translateX(-10px) scale(.5)}.tippy-popper[x-placement^=right] .tippy-backdrop{border-radius:0 50% 50% 0}.tippy-popper[x-placement^=right] .tippy-roundarrow{left:-12px;-webkit-transform-origin:66.66666666% 50%;transform-origin:66.66666666% 50%;margin:3px 0}.tippy-popper[x-placement^=right] .tippy-roundarrow svg{position:absolute;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.tippy-popper[x-placement^=right] .tippy-arrow{border-right:8px solid #333;border-top:8px solid transparent;border-bottom:8px solid transparent;left:-7px;margin:3px 0;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.tippy-popper[x-placement^=right] .tippy-backdrop{-webkit-transform-origin:-50% 0;transform-origin:-50% 0}.tippy-popper[x-placement^=right] .tippy-backdrop[data-state=visible]{-webkit-transform:scale(1) translate(-50%,-50%);transform:scale(1) translate(-50%,-50%)}.tippy-popper[x-placement^=right] .tippy-backdrop[data-state=hidden]{-webkit-transform:scale(.2) translate(-25%,-50%);transform:scale(.2) translate(-25%,-50%);opacity:0}.tippy-popper[x-placement^=right] [data-animation=shift-toward][data-state=visible]{-webkit-transform:translateX(10px);transform:translateX(10px)}.tippy-popper[x-placement^=right] [data-animation=shift-toward][data-state=hidden]{opacity:0;-webkit-transform:translateX(20px);transform:translateX(20px)}.tippy-popper[x-placement^=right] [data-animation=perspective]{-webkit-transform-origin:left;transform-origin:left}.tippy-popper[x-placement^=right] [data-animation=perspective][data-state=visible]{-webkit-transform:perspective(700px) translateX(10px) rotateY(0);transform:perspective(700px) translateX(10px) rotateY(0)}.tippy-popper[x-placement^=right] [data-animation=perspective][data-state=hidden]{opacity:0;-webkit-transform:perspective(700px) translateX(0) rotateY(60deg);transform:perspective(700px) translateX(0) rotateY(60deg)}.tippy-popper[x-placement^=right] [data-animation=fade][data-state=visible]{-webkit-transform:translateX(10px);transform:translateX(10px)}.tippy-popper[x-placement^=right] [data-animation=fade][data-state=hidden]{opacity:0;-webkit-transform:translateX(10px);transform:translateX(10px)}.tippy-popper[x-placement^=right] [data-animation=shift-away][data-state=visible]{-webkit-transform:translateX(10px);transform:translateX(10px)}.tippy-popper[x-placement^=right] [data-animation=shift-away][data-state=hidden]{opacity:0;-webkit-transform:translateX(0);transform:translateX(0)}.tippy-popper[x-placement^=right] [data-animation=scale]{-webkit-transform-origin:left;transform-origin:left}.tippy-popper[x-placement^=right] [data-animation=scale][data-state=visible]{-webkit-transform:translateX(10px) scale(1);transform:translateX(10px) scale(1)}.tippy-popper[x-placement^=right] [data-animation=scale][data-state=hidden]{opacity:0;-webkit-transform:translateX(10px) scale(.5);transform:translateX(10px) scale(.5)}.tippy-tooltip{position:relative;color:#fff;border-radius:.25rem;font-size:.875rem;padding:.3125rem .5625rem;line-height:1.4;text-align:center;background-color:#333}.tippy-tooltip[data-size=small]{padding:.1875rem .375rem;font-size:.75rem}.tippy-tooltip[data-size=large]{padding:.375rem .75rem;font-size:1rem}.tippy-tooltip[data-animatefill]{overflow:hidden;background-color:transparent}.tippy-tooltip[data-interactive],.tippy-tooltip[data-interactive] path{pointer-events:auto}.tippy-tooltip[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-tooltip[data-inertia][data-state=hidden]{transition-timing-function:ease}.tippy-arrow,.tippy-roundarrow{position:absolute;width:0;height:0}.tippy-roundarrow{width:18px;height:7px;fill:#333;pointer-events:none}.tippy-backdrop{position:absolute;background-color:#333;border-radius:50%;width:calc(110% + 2rem);left:50%;top:50%;z-index:-1;transition:all cubic-bezier(.46,.1,.52,.98);-webkit-backface-visibility:hidden;backface-visibility:hidden}.tippy-backdrop:after{content:\\\"\\\";float:left;padding-top:100%}.tippy-backdrop+.tippy-content{transition-property:opacity;will-change:opacity}.tippy-backdrop+.tippy-content[data-state=visible]{opacity:1}.tippy-backdrop+.tippy-content[data-state=hidden]{opacity:0}\";\r\n\r\nfunction _extends() {\r\n _extends = Object.assign || function (target) {\r\n for (var i = 1; i < arguments.length; i++) {\r\n var source = arguments[i];\r\n\r\n for (var key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n\r\n return target;\r\n };\r\n\r\n return _extends.apply(this, arguments);\r\n}\r\n\r\nvar version = \"4.2.0\";\r\n\r\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\r\nvar ua = isBrowser ? navigator.userAgent : '';\r\nvar isIE = /MSIE |Trident\\//.test(ua);\r\nvar isUCBrowser = /UCBrowser\\//.test(ua);\r\nvar isIOS = isBrowser && /iPhone|iPad|iPod/.test(navigator.platform) && !window.MSStream;\r\n\r\nvar defaultProps = {\r\n a11y: true,\r\n allowHTML: true,\r\n animateFill: true,\r\n animation: 'shift-away',\r\n appendTo: function appendTo() {\r\n return document.body;\r\n },\r\n aria: 'describedby',\r\n arrow: false,\r\n arrowType: 'sharp',\r\n boundary: 'scrollParent',\r\n content: '',\r\n delay: 0,\r\n distance: 10,\r\n duration: [325, 275],\r\n flip: true,\r\n flipBehavior: 'flip',\r\n flipOnUpdate: false,\r\n followCursor: false,\r\n hideOnClick: true,\r\n ignoreAttributes: false,\r\n inertia: false,\r\n interactive: false,\r\n interactiveBorder: 2,\r\n interactiveDebounce: 0,\r\n lazy: true,\r\n maxWidth: 350,\r\n multiple: false,\r\n offset: 0,\r\n onHidden: function onHidden() {},\r\n onHide: function onHide() {},\r\n onMount: function onMount() {},\r\n onShow: function onShow() {},\r\n onShown: function onShown() {},\r\n placement: 'top',\r\n popperOptions: {},\r\n role: 'tooltip',\r\n showOnInit: false,\r\n size: 'regular',\r\n sticky: false,\r\n target: '',\r\n theme: 'dark',\r\n touch: true,\r\n touchHold: false,\r\n trigger: 'mouseenter focus',\r\n updateDuration: 0,\r\n wait: null,\r\n zIndex: 10001\r\n /**\r\n * If the set() method encounters one of these, the popperInstance must be\r\n * recreated\r\n */\r\n\r\n};\r\nvar POPPER_INSTANCE_DEPENDENCIES = ['arrow', 'arrowType', 'boundary', 'distance', 'flip', 'flipBehavior', 'flipOnUpdate', 'offset', 'placement', 'popperOptions'];\r\n\r\nvar Selectors = {\r\n POPPER: '.tippy-popper',\r\n TOOLTIP: '.tippy-tooltip',\r\n CONTENT: '.tippy-content',\r\n BACKDROP: '.tippy-backdrop',\r\n ARROW: '.tippy-arrow',\r\n ROUND_ARROW: '.tippy-roundarrow'\r\n};\r\n\r\nvar elementProto = isBrowser ? Element.prototype : {};\r\nvar matches = elementProto.matches || elementProto.matchesSelector || elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector || elementProto.msMatchesSelector;\r\n/**\r\n * Ponyfill for Array.from - converts iterable values to an array\r\n */\r\n\r\nfunction arrayFrom(value) {\r\n return [].slice.call(value);\r\n}\r\n/**\r\n * Ponyfill for Element.prototype.closest\r\n */\r\n\r\nfunction closest(element, parentSelector) {\r\n return (elementProto.closest || function (selector) {\r\n // @ts-ignore\r\n var el = this;\r\n\r\n while (el) {\r\n if (matches.call(el, selector)) {\r\n return el;\r\n }\r\n\r\n el = el.parentElement;\r\n }\r\n }).call(element, parentSelector);\r\n}\r\n/**\r\n * Works like Element.prototype.closest, but uses a callback instead\r\n */\r\n\r\nfunction closestCallback(element, callback) {\r\n while (element) {\r\n if (callback(element)) {\r\n return element;\r\n }\r\n\r\n element = element.parentElement;\r\n }\r\n}\r\n\r\nvar PASSIVE = {\r\n passive: true\r\n};\r\nvar PADDING = 4;\r\n\r\nvar keys = Object.keys(defaultProps);\r\n/**\r\n * Returns an object of optional props from data-tippy-* attributes\r\n */\r\n\r\nfunction getDataAttributeOptions(reference) {\r\n return keys.reduce(function (acc, key) {\r\n var valueAsString = (reference.getAttribute(\"data-tippy-\".concat(key)) || '').trim();\r\n\r\n if (!valueAsString) {\r\n return acc;\r\n }\r\n\r\n if (key === 'content') {\r\n acc[key] = valueAsString;\r\n } else {\r\n try {\r\n acc[key] = JSON.parse(valueAsString);\r\n } catch (e) {\r\n acc[key] = valueAsString;\r\n }\r\n }\r\n\r\n return acc;\r\n }, {});\r\n}\r\n/**\r\n * Polyfills the virtual reference (plain object) with Element.prototype props\r\n * Mutating because DOM elements are mutated, adds `_tippy` property\r\n */\r\n\r\nfunction polyfillElementPrototypeProperties(virtualReference) {\r\n var polyfills = {\r\n isVirtual: true,\r\n attributes: virtualReference.attributes || {},\r\n setAttribute: function setAttribute(key, value) {\r\n virtualReference.attributes[key] = value;\r\n },\r\n getAttribute: function getAttribute(key) {\r\n return virtualReference.attributes[key];\r\n },\r\n removeAttribute: function removeAttribute(key) {\r\n delete virtualReference.attributes[key];\r\n },\r\n hasAttribute: function hasAttribute(key) {\r\n return key in virtualReference.attributes;\r\n },\r\n addEventListener: function addEventListener() {},\r\n removeEventListener: function removeEventListener() {},\r\n classList: {\r\n classNames: {},\r\n add: function add(key) {\r\n virtualReference.classList.classNames[key] = true;\r\n },\r\n remove: function remove(key) {\r\n delete virtualReference.classList.classNames[key];\r\n },\r\n contains: function contains(key) {\r\n return key in virtualReference.classList.classNames;\r\n }\r\n }\r\n };\r\n\r\n for (var key in polyfills) {\r\n virtualReference[key] = polyfills[key];\r\n }\r\n}\r\n\r\n/**\r\n * Determines if a value is a \"bare\" virtual element (before mutations done\r\n * by `polyfillElementPrototypeProperties()`). JSDOM elements show up as\r\n * [object Object], we can check if the value is \"element-like\" if it has\r\n * `addEventListener`\r\n */\r\n\r\nfunction isBareVirtualElement(value) {\r\n return {}.toString.call(value) === '[object Object]' && !value.addEventListener;\r\n}\r\n/**\r\n * Safe .hasOwnProperty check, for prototype-less objects\r\n */\r\n\r\nfunction hasOwnProperty(obj, key) {\r\n return {}.hasOwnProperty.call(obj, key);\r\n}\r\n/**\r\n * Returns an array of elements based on the value\r\n */\r\n\r\nfunction getArrayOfElements(value) {\r\n if (isSingular(value)) {\r\n // TODO: VirtualReference is not compatible to type Element\r\n return [value];\r\n }\r\n\r\n if (value instanceof NodeList) {\r\n return arrayFrom(value);\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n\r\n try {\r\n return arrayFrom(document.querySelectorAll(value));\r\n } catch (e) {\r\n return [];\r\n }\r\n}\r\n/**\r\n * Returns a value at a given index depending on if it's an array or number\r\n */\r\n\r\nfunction getValue(value, index, defaultValue) {\r\n if (Array.isArray(value)) {\r\n var v = value[index];\r\n return v == null ? defaultValue : v;\r\n }\r\n\r\n return value;\r\n}\r\n/**\r\n * Debounce utility\r\n */\r\n\r\nfunction debounce(fn, ms) {\r\n var timeoutId;\r\n return function () {\r\n var _this = this,\r\n _arguments = arguments;\r\n\r\n clearTimeout(timeoutId); // @ts-ignore\r\n\r\n timeoutId = setTimeout(function () {\r\n return fn.apply(_this, _arguments);\r\n }, ms);\r\n };\r\n}\r\n/**\r\n * Prevents errors from being thrown while accessing nested modifier objects\r\n * in `popperOptions`\r\n */\r\n\r\nfunction getModifier(obj, key) {\r\n return obj && obj.modifiers && obj.modifiers[key];\r\n}\r\n/**\r\n * Determines if an array or string includes a value\r\n */\r\n\r\nfunction includes(a, b) {\r\n return a.indexOf(b) > -1;\r\n}\r\n/**\r\n * Determines if the value is singular-like\r\n */\r\n\r\nfunction isSingular(value) {\r\n return !!(value && hasOwnProperty(value, 'isVirtual')) || value instanceof Element;\r\n}\r\n/**\r\n * Firefox extensions don't allow setting .innerHTML directly, this will trick it\r\n */\r\n\r\nfunction innerHTML() {\r\n return 'innerHTML';\r\n}\r\n/**\r\n * Evaluates a function if one, or returns the value\r\n */\r\n\r\nfunction evaluateValue(value, args) {\r\n return typeof value === 'function' ? value.apply(null, args) : value;\r\n}\r\n/**\r\n * Sets a popperInstance `flip` modifier's enabled state\r\n */\r\n\r\nfunction setFlipModifierEnabled(modifiers, value) {\r\n modifiers.filter(function (m) {\r\n return m.name === 'flip';\r\n })[0].enabled = value;\r\n}\r\n/**\r\n * Determines if an element can receive focus\r\n * Always returns true for virtual objects\r\n */\r\n\r\nfunction canReceiveFocus(element) {\r\n return element instanceof Element ? matches.call(element, 'a[href],area[href],button,details,input,textarea,select,iframe,[tabindex]') && !element.hasAttribute('disabled') : true;\r\n}\r\n/**\r\n * Returns a new `div` element\r\n */\r\n\r\nfunction div() {\r\n return document.createElement('div');\r\n}\r\n/**\r\n * Evaluates the props object by merging data attributes and\r\n * disabling conflicting options where necessary\r\n */\r\n\r\nfunction evaluateProps(reference, props) {\r\n var out = _extends({}, props, {\r\n content: evaluateValue(props.content, [reference])\r\n }, props.ignoreAttributes ? {} : getDataAttributeOptions(reference));\r\n\r\n if (out.arrow || isUCBrowser) {\r\n out.animateFill = false;\r\n }\r\n\r\n return out;\r\n}\r\n/**\r\n * Validates an object of options with the valid default props object\r\n */\r\n\r\nfunction validateOptions(options, defaultProps) {\r\n Object.keys(options).forEach(function (option) {\r\n if (!hasOwnProperty(defaultProps, option)) {\r\n throw new Error(\"[tippy]: `\".concat(option, \"` is not a valid option\"));\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Sets the innerHTML of an element\r\n */\r\n\r\nfunction setInnerHTML(element, html) {\r\n element[innerHTML()] = html instanceof Element ? html[innerHTML()] : html;\r\n}\r\n/**\r\n * Sets the content of a tooltip\r\n */\r\n\r\nfunction setContent(contentEl, props) {\r\n if (props.content instanceof Element) {\r\n setInnerHTML(contentEl, '');\r\n contentEl.appendChild(props.content);\r\n } else if (typeof props.content !== 'function') {\r\n var key = props.allowHTML ? 'innerHTML' : 'textContent';\r\n contentEl[key] = props.content;\r\n }\r\n}\r\n/**\r\n * Returns the child elements of a popper element\r\n */\r\n\r\nfunction getChildren(popper) {\r\n return {\r\n tooltip: popper.querySelector(Selectors.TOOLTIP),\r\n backdrop: popper.querySelector(Selectors.BACKDROP),\r\n content: popper.querySelector(Selectors.CONTENT),\r\n arrow: popper.querySelector(Selectors.ARROW) || popper.querySelector(Selectors.ROUND_ARROW)\r\n };\r\n}\r\n/**\r\n * Adds `data-inertia` attribute\r\n */\r\n\r\nfunction addInertia(tooltip) {\r\n tooltip.setAttribute('data-inertia', '');\r\n}\r\n/**\r\n * Removes `data-inertia` attribute\r\n */\r\n\r\nfunction removeInertia(tooltip) {\r\n tooltip.removeAttribute('data-inertia');\r\n}\r\n/**\r\n * Creates an arrow element and returns it\r\n */\r\n\r\nfunction createArrowElement(arrowType) {\r\n var arrow = div();\r\n\r\n if (arrowType === 'round') {\r\n arrow.className = 'tippy-roundarrow';\r\n setInnerHTML(arrow, '');\r\n } else {\r\n arrow.className = 'tippy-arrow';\r\n }\r\n\r\n return arrow;\r\n}\r\n/**\r\n * Creates a backdrop element and returns it\r\n */\r\n\r\nfunction createBackdropElement() {\r\n var backdrop = div();\r\n backdrop.className = 'tippy-backdrop';\r\n backdrop.setAttribute('data-state', 'hidden');\r\n return backdrop;\r\n}\r\n/**\r\n * Adds interactive-related attributes\r\n */\r\n\r\nfunction addInteractive(popper, tooltip) {\r\n popper.setAttribute('tabindex', '-1');\r\n tooltip.setAttribute('data-interactive', '');\r\n}\r\n/**\r\n * Removes interactive-related attributes\r\n */\r\n\r\nfunction removeInteractive(popper, tooltip) {\r\n popper.removeAttribute('tabindex');\r\n tooltip.removeAttribute('data-interactive');\r\n}\r\n/**\r\n * Applies a transition duration to a list of elements\r\n */\r\n\r\nfunction applyTransitionDuration(els, value) {\r\n els.forEach(function (el) {\r\n if (el) {\r\n el.style.transitionDuration = \"\".concat(value, \"ms\");\r\n }\r\n });\r\n}\r\n/**\r\n * Add/remove transitionend listener from tooltip\r\n */\r\n\r\nfunction toggleTransitionEndListener(tooltip, action, listener) {\r\n // UC Browser hasn't adopted the `transitionend` event despite supporting\r\n // unprefixed transitions...\r\n var eventName = isUCBrowser && document.body.style.webkitTransition !== undefined ? 'webkitTransitionEnd' : 'transitionend';\r\n tooltip[action + 'EventListener'](eventName, listener);\r\n}\r\n/**\r\n * Returns the popper's placement, ignoring shifting (top-start, etc)\r\n */\r\n\r\nfunction getPopperPlacement(popper) {\r\n var fullPlacement = popper.getAttribute('x-placement');\r\n return fullPlacement ? fullPlacement.split('-')[0] : '';\r\n}\r\n/**\r\n * Sets the visibility state to elements so they can begin to transition\r\n */\r\n\r\nfunction setVisibilityState(els, state) {\r\n els.forEach(function (el) {\r\n if (el) {\r\n el.setAttribute('data-state', state);\r\n }\r\n });\r\n}\r\n/**\r\n * Triggers reflow\r\n */\r\n\r\nfunction reflow(popper) {\r\n void popper.offsetHeight;\r\n}\r\n/**\r\n * Adds/removes theme from tooltip's classList\r\n */\r\n\r\nfunction toggleTheme(tooltip, action, theme) {\r\n theme.split(' ').forEach(function (themeName) {\r\n tooltip.classList[action](themeName + '-theme');\r\n });\r\n}\r\n/**\r\n * Constructs the popper element and returns it\r\n */\r\n\r\nfunction createPopperElement(id, props) {\r\n var popper = div();\r\n popper.className = 'tippy-popper';\r\n popper.id = \"tippy-\".concat(id);\r\n popper.style.zIndex = '' + props.zIndex;\r\n\r\n if (props.role) {\r\n popper.setAttribute('role', props.role);\r\n }\r\n\r\n var tooltip = div();\r\n tooltip.className = 'tippy-tooltip';\r\n tooltip.style.maxWidth = props.maxWidth + (typeof props.maxWidth === 'number' ? 'px' : '');\r\n tooltip.setAttribute('data-size', props.size);\r\n tooltip.setAttribute('data-animation', props.animation);\r\n tooltip.setAttribute('data-state', 'hidden');\r\n toggleTheme(tooltip, 'add', props.theme);\r\n var content = div();\r\n content.className = 'tippy-content';\r\n content.setAttribute('data-state', 'hidden');\r\n\r\n if (props.interactive) {\r\n addInteractive(popper, tooltip);\r\n }\r\n\r\n if (props.arrow) {\r\n tooltip.appendChild(createArrowElement(props.arrowType));\r\n }\r\n\r\n if (props.animateFill) {\r\n tooltip.appendChild(createBackdropElement());\r\n tooltip.setAttribute('data-animatefill', '');\r\n }\r\n\r\n if (props.inertia) {\r\n addInertia(tooltip);\r\n }\r\n\r\n setContent(content, props);\r\n tooltip.appendChild(content);\r\n popper.appendChild(tooltip);\r\n return popper;\r\n}\r\n/**\r\n * Updates the popper element based on the new props\r\n */\r\n\r\nfunction updatePopperElement(popper, prevProps, nextProps) {\r\n var _getChildren = getChildren(popper),\r\n tooltip = _getChildren.tooltip,\r\n content = _getChildren.content,\r\n backdrop = _getChildren.backdrop,\r\n arrow = _getChildren.arrow;\r\n\r\n popper.style.zIndex = '' + nextProps.zIndex;\r\n tooltip.setAttribute('data-size', nextProps.size);\r\n tooltip.setAttribute('data-animation', nextProps.animation);\r\n tooltip.style.maxWidth = nextProps.maxWidth + (typeof nextProps.maxWidth === 'number' ? 'px' : '');\r\n\r\n if (nextProps.role) {\r\n popper.setAttribute('role', nextProps.role);\r\n } else {\r\n popper.removeAttribute('role');\r\n }\r\n\r\n if (prevProps.content !== nextProps.content) {\r\n setContent(content, nextProps);\r\n } // animateFill\r\n\r\n\r\n if (!prevProps.animateFill && nextProps.animateFill) {\r\n tooltip.appendChild(createBackdropElement());\r\n tooltip.setAttribute('data-animatefill', '');\r\n } else if (prevProps.animateFill && !nextProps.animateFill) {\r\n tooltip.removeChild(backdrop);\r\n tooltip.removeAttribute('data-animatefill');\r\n } // arrow\r\n\r\n\r\n if (!prevProps.arrow && nextProps.arrow) {\r\n tooltip.appendChild(createArrowElement(nextProps.arrowType));\r\n } else if (prevProps.arrow && !nextProps.arrow) {\r\n tooltip.removeChild(arrow);\r\n } // arrowType\r\n\r\n\r\n if (prevProps.arrow && nextProps.arrow && prevProps.arrowType !== nextProps.arrowType) {\r\n tooltip.replaceChild(createArrowElement(nextProps.arrowType), arrow);\r\n } // interactive\r\n\r\n\r\n if (!prevProps.interactive && nextProps.interactive) {\r\n addInteractive(popper, tooltip);\r\n } else if (prevProps.interactive && !nextProps.interactive) {\r\n removeInteractive(popper, tooltip);\r\n } // inertia\r\n\r\n\r\n if (!prevProps.inertia && nextProps.inertia) {\r\n addInertia(tooltip);\r\n } else if (prevProps.inertia && !nextProps.inertia) {\r\n removeInertia(tooltip);\r\n } // theme\r\n\r\n\r\n if (prevProps.theme !== nextProps.theme) {\r\n toggleTheme(tooltip, 'remove', prevProps.theme);\r\n toggleTheme(tooltip, 'add', nextProps.theme);\r\n }\r\n}\r\n/**\r\n * Runs the callback after the popper's position has been updated\r\n * update() is debounced with Promise.resolve() or setTimeout()\r\n * scheduleUpdate() is update() wrapped in requestAnimationFrame()\r\n */\r\n\r\nfunction afterPopperPositionUpdates(popperInstance, callback) {\r\n var popper = popperInstance.popper,\r\n options = popperInstance.options;\r\n var onCreate = options.onCreate,\r\n onUpdate = options.onUpdate;\r\n\r\n options.onCreate = options.onUpdate = function (data) {\r\n reflow(popper);\r\n callback();\r\n\r\n if (onUpdate) {\r\n onUpdate(data);\r\n }\r\n\r\n options.onCreate = onCreate;\r\n options.onUpdate = onUpdate;\r\n };\r\n}\r\n/**\r\n * Hides all visible poppers on the document\r\n */\r\n\r\nfunction hideAll() {\r\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\r\n checkHideOnClick = _ref.checkHideOnClick,\r\n exclude = _ref.exclude,\r\n duration = _ref.duration;\r\n\r\n arrayFrom(document.querySelectorAll(Selectors.POPPER)).forEach(function (popper) {\r\n var instance = popper._tippy;\r\n\r\n if (instance && (checkHideOnClick ? instance.props.hideOnClick === true : true) && (!exclude || popper !== exclude.popper)) {\r\n instance.hide(duration);\r\n }\r\n });\r\n}\r\n/**\r\n * Determines if the mouse cursor is outside of the popper's interactive border\r\n * region\r\n */\r\n\r\nfunction isCursorOutsideInteractiveBorder(popperPlacement, popperRect, event, props) {\r\n if (!popperPlacement) {\r\n return true;\r\n }\r\n\r\n var x = event.clientX,\r\n y = event.clientY;\r\n var interactiveBorder = props.interactiveBorder,\r\n distance = props.distance;\r\n var exceedsTop = popperRect.top - y > (popperPlacement === 'top' ? interactiveBorder + distance : interactiveBorder);\r\n var exceedsBottom = y - popperRect.bottom > (popperPlacement === 'bottom' ? interactiveBorder + distance : interactiveBorder);\r\n var exceedsLeft = popperRect.left - x > (popperPlacement === 'left' ? interactiveBorder + distance : interactiveBorder);\r\n var exceedsRight = x - popperRect.right > (popperPlacement === 'right' ? interactiveBorder + distance : interactiveBorder);\r\n return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight;\r\n}\r\n/**\r\n * Returns the distance offset, taking into account the default offset due to\r\n * the transform: translate() rule (10px) in CSS\r\n */\r\n\r\nfunction getOffsetDistanceInPx(distance) {\r\n return -(distance - 10) + 'px';\r\n}\r\n\r\nvar isUsingTouch = false;\r\nfunction onDocumentTouch() {\r\n if (isUsingTouch) {\r\n return;\r\n }\r\n\r\n isUsingTouch = true;\r\n\r\n if (isIOS) {\r\n document.body.classList.add('tippy-iOS');\r\n }\r\n\r\n if (window.performance) {\r\n document.addEventListener('mousemove', onDocumentMouseMove);\r\n }\r\n}\r\nvar lastMouseMoveTime = 0;\r\nfunction onDocumentMouseMove() {\r\n var now = performance.now(); // Chrome 60+ is 1 mousemove per animation frame, use 20ms time difference\r\n\r\n if (now - lastMouseMoveTime < 20) {\r\n isUsingTouch = false;\r\n document.removeEventListener('mousemove', onDocumentMouseMove);\r\n\r\n if (!isIOS) {\r\n document.body.classList.remove('tippy-iOS');\r\n }\r\n }\r\n\r\n lastMouseMoveTime = now;\r\n}\r\nfunction onDocumentClick(event) {\r\n // Simulated events dispatched on the document\r\n if (!(event.target instanceof Element)) {\r\n return hideAll();\r\n } // Clicked on an interactive popper\r\n\r\n\r\n var popper = closest(event.target, Selectors.POPPER);\r\n\r\n if (popper && popper._tippy && popper._tippy.props.interactive) {\r\n return;\r\n } // Clicked on a reference\r\n\r\n\r\n var reference = closestCallback(event.target, function (el) {\r\n return el._tippy && el._tippy.reference === el;\r\n });\r\n\r\n if (reference) {\r\n var instance = reference._tippy;\r\n\r\n if (instance) {\r\n var isClickTrigger = includes(instance.props.trigger || '', 'click');\r\n\r\n if (isUsingTouch || isClickTrigger) {\r\n return hideAll({\r\n exclude: instance,\r\n checkHideOnClick: true\r\n });\r\n }\r\n\r\n if (instance.props.hideOnClick !== true || isClickTrigger) {\r\n return;\r\n }\r\n\r\n instance.clearDelayTimeouts();\r\n }\r\n }\r\n\r\n hideAll({\r\n checkHideOnClick: true\r\n });\r\n}\r\nfunction onWindowBlur() {\r\n var _document = document,\r\n activeElement = _document.activeElement;\r\n\r\n if (activeElement && activeElement.blur && activeElement._tippy) {\r\n activeElement.blur();\r\n }\r\n}\r\n/**\r\n * Adds the needed global event listeners\r\n */\r\n\r\nfunction bindGlobalEventListeners() {\r\n document.addEventListener('click', onDocumentClick, true);\r\n document.addEventListener('touchstart', onDocumentTouch, PASSIVE);\r\n window.addEventListener('blur', onWindowBlur);\r\n}\r\n\r\nvar idCounter = 1;\r\n/**\r\n * Creates and returns a Tippy object. We're using a closure pattern instead of\r\n * a class so that the exposed object API is clean without private members\r\n * prefixed with `_`.\r\n */\r\n\r\nfunction createTippy(reference, collectionProps) {\r\n var props = evaluateProps(reference, collectionProps); // If the reference shouldn't have multiple tippys, return null early\r\n\r\n if (!props.multiple && reference._tippy) {\r\n return null;\r\n }\r\n /* ======================= 🔒 Private members 🔒 ======================= */\r\n // The last trigger event type that caused the tippy to show\r\n\r\n\r\n var lastTriggerEventType; // The last mousemove event object created by the document mousemove event\r\n\r\n var lastMouseMoveEvent; // Timeout created by the show delay\r\n\r\n var showTimeoutId; // Timeout created by the hide delay\r\n\r\n var hideTimeoutId; // Frame created by scheduleHide()\r\n\r\n var animationFrameId; // Flag to determine if the tippy is scheduled to show due to the show timeout\r\n\r\n var isScheduledToShow = false; // The current `transitionend` callback reference\r\n\r\n var transitionEndListener; // Array of event listeners currently attached to the reference element\r\n\r\n var listeners = []; // Private onMouseMove handler reference, debounced or not\r\n\r\n var debouncedOnMouseMove = props.interactiveDebounce > 0 ? debounce(onMouseMove, props.interactiveDebounce) : onMouseMove; // Node the tippy is currently appended to\r\n\r\n var parentNode;\r\n /* ======================= 🔑 Public members 🔑 ======================= */\r\n // id used for the `aria-describedby` / `aria-labelledby` attribute\r\n\r\n var id = idCounter++; // Popper element reference\r\n\r\n var popper = createPopperElement(id, props); // Popper element children: { arrow, backdrop, content, tooltip }\r\n\r\n var popperChildren = getChildren(popper);\r\n var state = {\r\n // Is the instance currently enabled?\r\n isEnabled: true,\r\n // Is the tippy currently showing and not transitioning out?\r\n isVisible: false,\r\n // Has the instance been destroyed?\r\n isDestroyed: false,\r\n // Is the tippy currently mounted to the DOM?\r\n isMounted: false,\r\n // Has the tippy finished transitioning in?\r\n isShown: false // Popper.js instance for the tippy is lazily created\r\n\r\n };\r\n var popperInstance = null;\r\n var instance = {\r\n // properties\r\n id: id,\r\n reference: reference,\r\n popper: popper,\r\n popperChildren: popperChildren,\r\n popperInstance: popperInstance,\r\n props: props,\r\n state: state,\r\n // methods\r\n clearDelayTimeouts: clearDelayTimeouts,\r\n set: set,\r\n setContent: setContent$$1,\r\n show: show,\r\n hide: hide,\r\n enable: enable,\r\n disable: disable,\r\n destroy: destroy\r\n };\r\n addTriggersToReference();\r\n\r\n if (!props.lazy) {\r\n createPopperInstance();\r\n instance.popperInstance.disableEventListeners();\r\n }\r\n\r\n if (props.showOnInit) {\r\n scheduleShow();\r\n } // Ensure the reference element can receive focus (and is not a delegate)\r\n\r\n\r\n if (props.a11y && !props.target && !canReceiveFocus(reference)) {\r\n reference.setAttribute('tabindex', '0');\r\n } // Prevent a tippy with a delay from hiding if the cursor left then returned\r\n // before it started hiding\r\n\r\n\r\n popper.addEventListener('mouseenter', function (event) {\r\n if (instance.props.interactive && instance.state.isVisible && lastTriggerEventType === 'mouseenter') {\r\n scheduleShow(event);\r\n }\r\n });\r\n popper.addEventListener('mouseleave', function () {\r\n if (instance.props.interactive && lastTriggerEventType === 'mouseenter') {\r\n document.addEventListener('mousemove', debouncedOnMouseMove);\r\n }\r\n }); // Install shortcuts\r\n\r\n reference._tippy = instance;\r\n popper._tippy = instance;\r\n return instance;\r\n /* ======================= 🔒 Private methods 🔒 ======================= */\r\n\r\n /**\r\n * Positions the virtual reference near the cursor\r\n */\r\n\r\n function positionVirtualReferenceNearCursor(event) {\r\n var _lastMouseMoveEvent = lastMouseMoveEvent = event,\r\n clientX = _lastMouseMoveEvent.clientX,\r\n clientY = _lastMouseMoveEvent.clientY;\r\n\r\n if (!instance.popperInstance) {\r\n return;\r\n } // Ensure virtual reference is padded to prevent tooltip from\r\n // overflowing. Maybe Popper.js issue?\r\n\r\n\r\n var placement = getPopperPlacement(instance.popper);\r\n var padding = instance.props.arrow ? PADDING + (instance.props.arrowType === 'round' ? 18 : 16) : PADDING;\r\n var isVerticalPlacement = includes(['top', 'bottom'], placement);\r\n var isHorizontalPlacement = includes(['left', 'right'], placement); // Top / left boundary\r\n\r\n var x = isVerticalPlacement ? Math.max(padding, clientX) : clientX;\r\n var y = isHorizontalPlacement ? Math.max(padding, clientY) : clientY; // Bottom / right boundary\r\n\r\n if (isVerticalPlacement && x > padding) {\r\n x = Math.min(clientX, window.innerWidth - padding);\r\n }\r\n\r\n if (isHorizontalPlacement && y > padding) {\r\n y = Math.min(clientY, window.innerHeight - padding);\r\n }\r\n\r\n var rect = instance.reference.getBoundingClientRect();\r\n var followCursor = instance.props.followCursor;\r\n var isHorizontal = followCursor === 'horizontal';\r\n var isVertical = followCursor === 'vertical';\r\n instance.popperInstance.reference = _extends({}, instance.popperInstance.reference, {\r\n getBoundingClientRect: function getBoundingClientRect() {\r\n return {\r\n width: 0,\r\n height: 0,\r\n top: isHorizontal ? rect.top : y,\r\n bottom: isHorizontal ? rect.bottom : y,\r\n left: isVertical ? rect.left : x,\r\n right: isVertical ? rect.right : x\r\n };\r\n },\r\n clientWidth: 0,\r\n clientHeight: 0\r\n });\r\n instance.popperInstance.scheduleUpdate();\r\n\r\n if (followCursor === 'initial' && instance.state.isVisible) {\r\n removeFollowCursorListener();\r\n }\r\n }\r\n /**\r\n * Creates the tippy instance for a delegate when it's been triggered\r\n */\r\n\r\n\r\n function createDelegateChildTippy(event) {\r\n if (event) {\r\n var targetEl = closest(event.target, instance.props.target);\r\n\r\n if (targetEl && !targetEl._tippy) {\r\n createTippy(targetEl, _extends({}, instance.props, {\r\n content: evaluateValue(collectionProps.content, [targetEl]),\r\n appendTo: collectionProps.appendTo,\r\n target: '',\r\n showOnInit: true\r\n }));\r\n scheduleShow(event);\r\n }\r\n }\r\n }\r\n /**\r\n * Setup before show() is invoked (delays, etc.)\r\n */\r\n\r\n\r\n function scheduleShow(event) {\r\n clearDelayTimeouts();\r\n\r\n if (instance.state.isVisible) {\r\n return;\r\n } // Is a delegate, create an instance for the child target\r\n\r\n\r\n if (instance.props.target) {\r\n return createDelegateChildTippy(event);\r\n }\r\n\r\n isScheduledToShow = true;\r\n\r\n if (instance.props.wait) {\r\n return instance.props.wait(instance, event);\r\n } // If the tooltip has a delay, we need to be listening to the mousemove as\r\n // soon as the trigger event is fired, so that it's in the correct position\r\n // upon mount.\r\n // Edge case: if the tooltip is still mounted, but then scheduleShow() is\r\n // called, it causes a jump.\r\n\r\n\r\n if (hasFollowCursorBehavior() && !instance.state.isMounted) {\r\n document.addEventListener('mousemove', positionVirtualReferenceNearCursor);\r\n }\r\n\r\n var delay = getValue(instance.props.delay, 0, defaultProps.delay);\r\n\r\n if (delay) {\r\n showTimeoutId = setTimeout(function () {\r\n show();\r\n }, delay);\r\n } else {\r\n show();\r\n }\r\n }\r\n /**\r\n * Setup before hide() is invoked (delays, etc.)\r\n */\r\n\r\n\r\n function scheduleHide() {\r\n clearDelayTimeouts();\r\n\r\n if (!instance.state.isVisible) {\r\n return removeFollowCursorListener();\r\n }\r\n\r\n isScheduledToShow = false;\r\n var delay = getValue(instance.props.delay, 1, defaultProps.delay);\r\n\r\n if (delay) {\r\n hideTimeoutId = setTimeout(function () {\r\n if (instance.state.isVisible) {\r\n hide();\r\n }\r\n }, delay);\r\n } else {\r\n // Fixes a `transitionend` problem when it fires 1 frame too\r\n // late sometimes, we don't want hide() to be called.\r\n //animationFrameId = requestAnimationFrame(function () {\r\n // hide();\r\n //});\r\n }\r\n }\r\n /**\r\n * Removes the follow cursor listener\r\n */\r\n\r\n\r\n function removeFollowCursorListener() {\r\n document.removeEventListener('mousemove', positionVirtualReferenceNearCursor);\r\n }\r\n /**\r\n * Cleans up old listeners\r\n */\r\n\r\n\r\n function cleanupOldMouseListeners() {\r\n document.body.removeEventListener('mouseleave', scheduleHide);\r\n document.removeEventListener('mousemove', debouncedOnMouseMove);\r\n }\r\n /**\r\n * Event listener invoked upon trigger\r\n */\r\n\r\n\r\n function onTrigger(event) {\r\n if (!instance.state.isEnabled || isEventListenerStopped(event)) {\r\n return;\r\n }\r\n\r\n if (!instance.state.isVisible) {\r\n lastTriggerEventType = event.type;\r\n\r\n if (event instanceof MouseEvent) {\r\n lastMouseMoveEvent = event;\r\n }\r\n } // Toggle show/hide when clicking click-triggered tooltips\r\n\r\n\r\n if (event.type === 'click' && instance.props.hideOnClick !== false && instance.state.isVisible) {\r\n scheduleHide();\r\n } else {\r\n scheduleShow(event);\r\n }\r\n }\r\n /**\r\n * Event listener used for interactive tooltips to detect when they should\r\n * hide\r\n */\r\n\r\n\r\n function onMouseMove(event) {\r\n var referenceTheCursorIsOver = closestCallback(event.target, function (el) {\r\n return el._tippy;\r\n });\r\n var isCursorOverPopper = closest(event.target, Selectors.POPPER) === instance.popper;\r\n var isCursorOverReference = referenceTheCursorIsOver === instance.reference;\r\n\r\n if (isCursorOverPopper || isCursorOverReference) {\r\n return;\r\n }\r\n\r\n if (isCursorOutsideInteractiveBorder(getPopperPlacement(instance.popper), instance.popper.getBoundingClientRect(), event, instance.props)) {\r\n cleanupOldMouseListeners();\r\n scheduleHide();\r\n }\r\n }\r\n /**\r\n * Event listener invoked upon mouseleave\r\n */\r\n\r\n\r\n function onMouseLeave(event) {\r\n if (isEventListenerStopped(event)) {\r\n return;\r\n }\r\n\r\n if (instance.props.interactive) {\r\n document.body.addEventListener('mouseleave', scheduleHide);\r\n document.addEventListener('mousemove', debouncedOnMouseMove);\r\n return;\r\n }\r\n\r\n scheduleHide();\r\n }\r\n /**\r\n * Event listener invoked upon blur\r\n */\r\n\r\n\r\n function onBlur(event) {\r\n if (event.target !== instance.reference) {\r\n return;\r\n }\r\n\r\n if (instance.props.interactive && event.relatedTarget && instance.popper.contains(event.relatedTarget)) {\r\n return;\r\n }\r\n\r\n scheduleHide();\r\n }\r\n /**\r\n * Event listener invoked when a child target is triggered\r\n */\r\n\r\n\r\n function onDelegateShow(event) {\r\n if (closest(event.target, instance.props.target)) {\r\n scheduleShow(event);\r\n }\r\n }\r\n /**\r\n * Event listener invoked when a child target should hide\r\n */\r\n\r\n\r\n function onDelegateHide(event) {\r\n if (closest(event.target, instance.props.target)) {\r\n scheduleHide();\r\n }\r\n }\r\n /**\r\n * Determines if an event listener should stop further execution due to the\r\n * `touchHold` option\r\n */\r\n\r\n\r\n function isEventListenerStopped(event) {\r\n var supportsTouch = 'ontouchstart' in window;\r\n var isTouchEvent = includes(event.type, 'touch');\r\n var touchHold = instance.props.touchHold;\r\n return supportsTouch && isUsingTouch && touchHold && !isTouchEvent || isUsingTouch && !touchHold && isTouchEvent;\r\n }\r\n /**\r\n * Creates the popper instance for the instance\r\n */\r\n\r\n\r\n function createPopperInstance() {\r\n var popperOptions = instance.props.popperOptions;\r\n var _instance$popperChild = instance.popperChildren,\r\n tooltip = _instance$popperChild.tooltip,\r\n arrow = _instance$popperChild.arrow;\r\n var preventOverflowModifier = getModifier(popperOptions, 'preventOverflow');\r\n\r\n function applyMutations(data) {\r\n if (instance.props.flip && !instance.props.flipOnUpdate) {\r\n if (data.flipped) {\r\n instance.popperInstance.options.placement = data.placement;\r\n }\r\n\r\n setFlipModifierEnabled(instance.popperInstance.modifiers, false);\r\n }\r\n\r\n tooltip.setAttribute('x-placement', data.placement);\r\n var basePlacement = getPopperPlacement(instance.popper);\r\n var styles = tooltip.style; // Account for the `distance` offset\r\n\r\n styles.top = styles.bottom = styles.left = styles.right = '';\r\n styles[basePlacement] = getOffsetDistanceInPx(instance.props.distance);\r\n var padding = preventOverflowModifier && preventOverflowModifier.padding !== undefined ? preventOverflowModifier.padding : PADDING;\r\n var isPaddingNumber = typeof padding === 'number';\r\n\r\n var computedPadding = _extends({\r\n top: isPaddingNumber ? padding : padding.top,\r\n bottom: isPaddingNumber ? padding : padding.bottom,\r\n left: isPaddingNumber ? padding : padding.left,\r\n right: isPaddingNumber ? padding : padding.right\r\n }, !isPaddingNumber && padding);\r\n\r\n computedPadding[basePlacement] = isPaddingNumber ? padding + instance.props.distance : (padding[basePlacement] || 0) + instance.props.distance;\r\n instance.popperInstance.modifiers.filter(function (m) {\r\n return m.name === 'preventOverflow';\r\n })[0].padding = computedPadding;\r\n }\r\n\r\n var config = _extends({\r\n placement: instance.props.placement\r\n }, popperOptions, {\r\n modifiers: _extends({}, popperOptions ? popperOptions.modifiers : {}, {\r\n preventOverflow: _extends({\r\n boundariesElement: instance.props.boundary,\r\n padding: PADDING\r\n }, preventOverflowModifier),\r\n arrow: _extends({\r\n element: arrow,\r\n enabled: !!arrow\r\n }, getModifier(popperOptions, 'arrow')),\r\n flip: _extends({\r\n enabled: instance.props.flip,\r\n // The tooltip is offset by 10px from the popper in CSS,\r\n // we need to account for its distance\r\n padding: instance.props.distance + PADDING,\r\n behavior: instance.props.flipBehavior\r\n }, getModifier(popperOptions, 'flip')),\r\n offset: _extends({\r\n offset: instance.props.offset\r\n }, getModifier(popperOptions, 'offset'))\r\n }),\r\n // This gets invoked when calling `.set()` and updating a popper\r\n // instance dependency, since a new popper instance gets created\r\n onCreate: function onCreate(data) {\r\n applyMutations(data);\r\n\r\n if (popperOptions && popperOptions.onCreate) {\r\n popperOptions.onCreate(data);\r\n }\r\n },\r\n // This gets invoked on initial create and show()/scroll/resize update.\r\n // This is due to `afterPopperPositionUpdates` overwriting onCreate()\r\n // with onUpdate()\r\n onUpdate: function onUpdate(data) {\r\n applyMutations(data);\r\n\r\n if (popperOptions && popperOptions.onUpdate) {\r\n popperOptions.onUpdate(data);\r\n }\r\n }\r\n });\r\n\r\n instance.popperInstance = new Popper(instance.reference, instance.popper, config);\r\n }\r\n /**\r\n * Mounts the tooltip to the DOM, callback to show tooltip is run **after**\r\n * popper's position has updated\r\n */\r\n\r\n\r\n function mount(callback) {\r\n var shouldEnableListeners = !hasFollowCursorBehavior() && !(instance.props.followCursor === 'initial' && isUsingTouch);\r\n\r\n if (!instance.popperInstance) {\r\n createPopperInstance();\r\n\r\n if (!shouldEnableListeners) {\r\n instance.popperInstance.disableEventListeners();\r\n }\r\n } else {\r\n if (!hasFollowCursorBehavior()) {\r\n instance.popperInstance.scheduleUpdate();\r\n\r\n if (shouldEnableListeners) {\r\n instance.popperInstance.enableEventListeners();\r\n }\r\n }\r\n\r\n setFlipModifierEnabled(instance.popperInstance.modifiers, instance.props.flip);\r\n } // If the instance previously had followCursor behavior, it will be\r\n // positioned incorrectly if triggered by `focus` afterwards.\r\n // Update the reference back to the real DOM element\r\n\r\n\r\n instance.popperInstance.reference = instance.reference;\r\n var arrow = instance.popperChildren.arrow;\r\n\r\n if (hasFollowCursorBehavior()) {\r\n if (arrow) {\r\n arrow.style.margin = '0';\r\n }\r\n\r\n if (lastMouseMoveEvent) {\r\n positionVirtualReferenceNearCursor(lastMouseMoveEvent);\r\n }\r\n } else if (arrow) {\r\n arrow.style.margin = '';\r\n } // Allow followCursor: 'initial' on touch devices\r\n\r\n\r\n if (isUsingTouch && lastMouseMoveEvent && instance.props.followCursor === 'initial') {\r\n positionVirtualReferenceNearCursor(lastMouseMoveEvent);\r\n\r\n if (arrow) {\r\n arrow.style.margin = '0';\r\n }\r\n }\r\n\r\n afterPopperPositionUpdates(instance.popperInstance, callback);\r\n var appendTo = instance.props.appendTo;\r\n parentNode = appendTo === 'parent' ? instance.reference.parentNode : evaluateValue(appendTo, [instance.reference]);\r\n\r\n if (!parentNode.contains(instance.popper)) {\r\n parentNode.appendChild(instance.popper);\r\n instance.props.onMount(instance);\r\n instance.state.isMounted = true;\r\n }\r\n }\r\n /**\r\n * Determines if the instance is in `followCursor` mode\r\n */\r\n\r\n\r\n function hasFollowCursorBehavior() {\r\n return instance.props.followCursor && !isUsingTouch && lastTriggerEventType !== 'focus';\r\n }\r\n /**\r\n * Updates the tooltip's position on each animation frame\r\n */\r\n\r\n\r\n function makeSticky() {\r\n applyTransitionDuration([instance.popper], isIE ? 0 : instance.props.updateDuration);\r\n\r\n function updatePosition() {\r\n if (instance.popperInstance) {\r\n instance.popperInstance.scheduleUpdate();\r\n }\r\n\r\n if (instance.state.isMounted) {\r\n requestAnimationFrame(updatePosition);\r\n } else {\r\n applyTransitionDuration([instance.popper], 0);\r\n }\r\n }\r\n\r\n updatePosition();\r\n }\r\n /**\r\n * Invokes a callback once the tooltip has fully transitioned out\r\n */\r\n\r\n\r\n function onTransitionedOut(duration, callback) {\r\n onTransitionEnd(duration, function () {\r\n if (!instance.state.isVisible && parentNode && parentNode.contains(instance.popper)) {\r\n callback();\r\n }\r\n });\r\n }\r\n /**\r\n * Invokes a callback once the tooltip has fully transitioned in\r\n */\r\n\r\n\r\n function onTransitionedIn(duration, callback) {\r\n onTransitionEnd(duration, callback);\r\n }\r\n /**\r\n * Invokes a callback once the tooltip's CSS transition ends\r\n */\r\n\r\n\r\n function onTransitionEnd(duration, callback) {\r\n var tooltip = instance.popperChildren.tooltip;\r\n /**\r\n * Listener added as the `transitionend` handler\r\n */\r\n\r\n function listener(event) {\r\n if (event.target === tooltip) {\r\n toggleTransitionEndListener(tooltip, 'remove', listener);\r\n callback();\r\n }\r\n } // Make callback synchronous if duration is 0\r\n // `transitionend` won't fire otherwise\r\n\r\n\r\n if (duration === 0) {\r\n return callback();\r\n }\r\n\r\n toggleTransitionEndListener(tooltip, 'remove', transitionEndListener);\r\n toggleTransitionEndListener(tooltip, 'add', listener);\r\n transitionEndListener = listener;\r\n }\r\n /**\r\n * Adds an event listener to the reference and stores it in `listeners`\r\n */\r\n\r\n\r\n function on(eventType, handler) {\r\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\r\n instance.reference.addEventListener(eventType, handler, options);\r\n listeners.push({\r\n eventType: eventType,\r\n handler: handler,\r\n options: options\r\n });\r\n }\r\n /**\r\n * Adds event listeners to the reference based on the `trigger` prop\r\n */\r\n\r\n\r\n function addTriggersToReference() {\r\n if (instance.props.touchHold && !instance.props.target) {\r\n on('touchstart', onTrigger, PASSIVE);\r\n on('touchend', onMouseLeave, PASSIVE);\r\n }\r\n\r\n instance.props.trigger.trim().split(' ').forEach(function (eventType) {\r\n if (eventType === 'manual') {\r\n return;\r\n } // Non-delegates\r\n\r\n\r\n if (!instance.props.target) {\r\n on(eventType, onTrigger);\r\n\r\n switch (eventType) {\r\n case 'mouseenter':\r\n on('mouseleave', onMouseLeave);\r\n break;\r\n\r\n case 'focus':\r\n on(isIE ? 'focusout' : 'blur', onBlur);\r\n break;\r\n }\r\n } else {\r\n // Delegates\r\n switch (eventType) {\r\n case 'mouseenter':\r\n on('mouseover', onDelegateShow);\r\n on('mouseout', onDelegateHide);\r\n break;\r\n\r\n case 'focus':\r\n on('focusin', onDelegateShow);\r\n on('focusout', onDelegateHide);\r\n break;\r\n\r\n case 'click':\r\n on(eventType, onDelegateShow);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n /**\r\n * Removes event listeners from the reference\r\n */\r\n\r\n\r\n function removeTriggersFromReference() {\r\n listeners.forEach(function (_ref) {\r\n var eventType = _ref.eventType,\r\n handler = _ref.handler,\r\n options = _ref.options;\r\n instance.reference.removeEventListener(eventType, handler, options);\r\n });\r\n listeners = [];\r\n }\r\n /**\r\n * Returns inner elements used in show/hide methods\r\n */\r\n\r\n\r\n function getInnerElements() {\r\n return [instance.popperChildren.tooltip, instance.popperChildren.backdrop, instance.popperChildren.content];\r\n }\r\n /* ======================= 🔑 Public methods 🔑 ======================= */\r\n\r\n /**\r\n * Enables the instance to allow it to show or hide\r\n */\r\n\r\n\r\n function enable() {\r\n instance.state.isEnabled = true;\r\n }\r\n /**\r\n * Disables the instance to disallow it to show or hide\r\n */\r\n\r\n\r\n function disable() {\r\n instance.state.isEnabled = false;\r\n }\r\n /**\r\n * Clears pending timeouts related to the `delay` prop if any\r\n */\r\n\r\n\r\n function clearDelayTimeouts() {\r\n clearTimeout(showTimeoutId);\r\n clearTimeout(hideTimeoutId);\r\n cancelAnimationFrame(animationFrameId);\r\n }\r\n /**\r\n * Sets new props for the instance and redraws the tooltip\r\n */\r\n\r\n\r\n function set(options) {\r\n // Backwards-compatible after TypeScript change\r\n options = options || {};\r\n validateOptions(options, defaultProps);\r\n var prevProps = instance.props;\r\n var nextProps = evaluateProps(instance.reference, _extends({}, instance.props, options, {\r\n ignoreAttributes: true\r\n }));\r\n nextProps.ignoreAttributes = hasOwnProperty(options, 'ignoreAttributes') ? options.ignoreAttributes || false : prevProps.ignoreAttributes;\r\n instance.props = nextProps;\r\n\r\n if (hasOwnProperty(options, 'trigger') || hasOwnProperty(options, 'touchHold')) {\r\n removeTriggersFromReference();\r\n addTriggersToReference();\r\n }\r\n\r\n if (hasOwnProperty(options, 'interactiveDebounce')) {\r\n cleanupOldMouseListeners();\r\n debouncedOnMouseMove = debounce(onMouseMove, options.interactiveDebounce || 0);\r\n }\r\n\r\n updatePopperElement(instance.popper, prevProps, nextProps);\r\n instance.popperChildren = getChildren(instance.popper);\r\n\r\n if (instance.popperInstance) {\r\n instance.popperInstance.update();\r\n\r\n if (POPPER_INSTANCE_DEPENDENCIES.some(function (prop) {\r\n return hasOwnProperty(options, prop);\r\n })) {\r\n instance.popperInstance.destroy();\r\n createPopperInstance();\r\n\r\n if (!instance.state.isVisible) {\r\n instance.popperInstance.disableEventListeners();\r\n }\r\n\r\n if (instance.props.followCursor && lastMouseMoveEvent) {\r\n positionVirtualReferenceNearCursor(lastMouseMoveEvent);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Shortcut for .set({ content: newContent })\r\n */\r\n\r\n\r\n function setContent$$1(content) {\r\n set({\r\n content: content\r\n });\r\n }\r\n /**\r\n * Shows the tooltip\r\n */\r\n\r\n\r\n function show() {\r\n var duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getValue(instance.props.duration, 0, defaultProps.duration[1]);\r\n\r\n if (instance.state.isDestroyed || !instance.state.isEnabled || isUsingTouch && !instance.props.touch) {\r\n return;\r\n } // Destroy tooltip if the reference element is no longer on the DOM\r\n\r\n\r\n if (!hasOwnProperty(instance.reference, 'isVirtual') && !document.documentElement.contains(instance.reference)) {\r\n return destroy();\r\n } // Do not show tooltip if the reference element has a `disabled` attribute\r\n\r\n\r\n if (instance.reference.hasAttribute('disabled')) {\r\n return;\r\n }\r\n\r\n if (instance.props.onShow(instance) === false) {\r\n return;\r\n }\r\n\r\n instance.popper.style.visibility = 'visible';\r\n instance.state.isVisible = true;\r\n\r\n if (instance.props.interactive) {\r\n instance.reference.classList.add('tippy-active');\r\n } // Prevent a transition if the popper is at the opposite placement\r\n\r\n\r\n applyTransitionDuration([instance.popper, instance.popperChildren.tooltip, instance.popperChildren.backdrop], 0);\r\n mount(function () {\r\n if (!instance.state.isVisible) {\r\n return;\r\n } // Arrow will sometimes not be positioned correctly. Force another update\r\n\r\n\r\n if (!hasFollowCursorBehavior()) {\r\n instance.popperInstance.update();\r\n }\r\n\r\n applyTransitionDuration([instance.popper], props.updateDuration);\r\n applyTransitionDuration(getInnerElements(), duration);\r\n\r\n if (instance.popperChildren.backdrop) {\r\n instance.popperChildren.content.style.transitionDelay = Math.round(duration / 12) + 'ms';\r\n }\r\n\r\n if (instance.props.sticky) {\r\n makeSticky();\r\n }\r\n\r\n setVisibilityState(getInnerElements(), 'visible');\r\n onTransitionedIn(duration, function () {\r\n instance.popperChildren.tooltip.classList.add('tippy-notransition');\r\n\r\n if (instance.props.aria) {\r\n instance.reference.setAttribute(\"aria-\".concat(instance.props.aria), instance.popper.id);\r\n }\r\n\r\n instance.props.onShown(instance);\r\n instance.state.isShown = true;\r\n });\r\n });\r\n }\r\n /**\r\n * Hides the tooltip\r\n */\r\n\r\n\r\n function hide() {\r\n var duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getValue(instance.props.duration, 1, defaultProps.duration[1]);\r\n\r\n if (instance.state.isDestroyed || !instance.state.isEnabled) {\r\n return;\r\n }\r\n\r\n if (instance.props.onHide(instance) === false) {\r\n return;\r\n }\r\n\r\n instance.popperChildren.tooltip.classList.remove('tippy-notransition');\r\n\r\n if (instance.props.interactive) {\r\n instance.reference.classList.remove('tippy-active');\r\n }\r\n\r\n instance.popper.style.visibility = 'hidden';\r\n instance.state.isVisible = false;\r\n instance.state.isShown = false;\r\n applyTransitionDuration(getInnerElements(), duration);\r\n setVisibilityState(getInnerElements(), 'hidden');\r\n onTransitionedOut(duration, function () {\r\n if (!isScheduledToShow) {\r\n removeFollowCursorListener();\r\n }\r\n\r\n if (instance.props.aria) {\r\n instance.reference.removeAttribute(\"aria-\".concat(instance.props.aria));\r\n }\r\n\r\n instance.popperInstance.disableEventListeners();\r\n instance.popperInstance.options.placement = instance.props.placement;\r\n parentNode.removeChild(instance.popper);\r\n instance.props.onHidden(instance);\r\n instance.state.isMounted = false;\r\n });\r\n }\r\n /**\r\n * Destroys the tooltip\r\n */\r\n\r\n\r\n function destroy(destroyTargetInstances) {\r\n if (instance.state.isDestroyed) {\r\n return;\r\n } // If the popper is currently mounted to the DOM, we want to ensure it gets\r\n // hidden and unmounted instantly upon destruction\r\n\r\n\r\n if (instance.state.isMounted) {\r\n hide(0);\r\n }\r\n\r\n removeTriggersFromReference();\r\n delete instance.reference._tippy;\r\n\r\n if (instance.props.target && destroyTargetInstances) {\r\n arrayFrom(instance.reference.querySelectorAll(instance.props.target)).forEach(function (child) {\r\n if (child._tippy) {\r\n child._tippy.destroy();\r\n }\r\n });\r\n }\r\n\r\n if (instance.popperInstance) {\r\n instance.popperInstance.destroy();\r\n }\r\n\r\n instance.state.isDestroyed = true;\r\n }\r\n}\r\n\r\n/**\r\n * Groups an array of instances by taking control of their props during\r\n * certain lifecycles.\r\n */\r\n\r\nfunction group(instances) {\r\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\r\n _ref$delay = _ref.delay,\r\n delay = _ref$delay === void 0 ? instances[0].props.delay : _ref$delay,\r\n _ref$duration = _ref.duration,\r\n duration = _ref$duration === void 0 ? 0 : _ref$duration;\r\n\r\n // Already grouped. Cannot group instances more than once (yet) or stale lifecycle\r\n // closures will be invoked, causing a stack overflow\r\n if (instances.some(function (instance) {\r\n return hasOwnProperty(instance, '_originalProps');\r\n })) {\r\n return;\r\n }\r\n\r\n var isAnyTippyOpen = false;\r\n instances.forEach(function (instance) {\r\n instance._originalProps = _extends({}, instance.props);\r\n });\r\n\r\n function setIsAnyTippyOpen(value) {\r\n isAnyTippyOpen = value;\r\n updateInstances();\r\n }\r\n\r\n function onShow(instance) {\r\n instance._originalProps.onShow(instance);\r\n\r\n instances.forEach(function (instance) {\r\n instance.set({\r\n duration: duration\r\n });\r\n instance.hide();\r\n });\r\n setIsAnyTippyOpen(true);\r\n }\r\n\r\n function onHide(instance) {\r\n instance._originalProps.onHide(instance);\r\n\r\n setIsAnyTippyOpen(false);\r\n }\r\n\r\n function onShown(instance) {\r\n instance._originalProps.onShown(instance);\r\n\r\n instance.set({\r\n duration: instance._originalProps.duration\r\n });\r\n }\r\n\r\n function updateInstances() {\r\n instances.forEach(function (instance) {\r\n instance.set({\r\n onShow: onShow,\r\n onShown: onShown,\r\n onHide: onHide,\r\n delay: isAnyTippyOpen ? [0, Array.isArray(delay) ? delay[1] : delay] : delay,\r\n duration: isAnyTippyOpen ? duration : instance._originalProps.duration\r\n });\r\n });\r\n }\r\n\r\n updateInstances();\r\n}\r\n\r\nvar globalEventListenersBound = false;\r\n/**\r\n * Exported module\r\n */\r\n\r\nfunction tippy(targets, options) {\r\n validateOptions(options || {}, defaultProps);\r\n\r\n if (!globalEventListenersBound) {\r\n bindGlobalEventListeners();\r\n globalEventListenersBound = true;\r\n }\r\n\r\n var props = _extends({}, defaultProps, options); // If they are specifying a virtual positioning reference, we need to polyfill\r\n // some native DOM props\r\n\r\n\r\n if (isBareVirtualElement(targets)) {\r\n polyfillElementPrototypeProperties(targets);\r\n }\r\n\r\n var instances = getArrayOfElements(targets).reduce(function (acc, reference) {\r\n var instance = reference && createTippy(reference, props);\r\n\r\n if (instance) {\r\n acc.push(instance);\r\n }\r\n\r\n return acc;\r\n }, []);\r\n return isSingular(targets) ? instances[0] : instances;\r\n}\r\n/**\r\n * Static props\r\n */\r\n\r\n\r\ntippy.version = version;\r\ntippy.defaults = defaultProps;\r\n/**\r\n * Static methods\r\n */\r\n\r\ntippy.setDefaults = function (partialDefaults) {\r\n Object.keys(partialDefaults).forEach(function (key) {\r\n // @ts-ignore\r\n defaultProps[key] = partialDefaults[key];\r\n });\r\n};\r\n\r\ntippy.hideAll = hideAll;\r\ntippy.group = group;\r\n/**\r\n * Auto-init tooltips for elements with a `data-tippy=\"...\"` attribute\r\n */\r\n\r\nfunction autoInit() {\r\n arrayFrom(document.querySelectorAll('[data-tippy]')).forEach(function (el) {\r\n var content = el.getAttribute('data-tippy');\r\n\r\n if (content) {\r\n tippy(el, {\r\n content: content\r\n });\r\n }\r\n });\r\n}\r\n\r\nif (isBrowser) {\r\n setTimeout(autoInit);\r\n}\r\n\r\n/**\r\n * Injects a string of CSS styles to a style node in \r\n */\r\n\r\nfunction injectCSS(css) {\r\n if (isBrowser) {\r\n var style = document.createElement('style');\r\n style.type = 'text/css';\r\n style.textContent = css;\r\n var head = document.head;\r\n var firstChild = head.firstChild;\r\n\r\n if (firstChild) {\r\n head.insertBefore(style, firstChild);\r\n } else {\r\n head.appendChild(style);\r\n }\r\n }\r\n}\r\n\r\n//injectCSS(css);\r\n\r\nexport default tippy;\r\n//# sourceMappingURL=index.all.js.map\r\n\r\n\r\n\r\n//////////////////\r\n// WEBPACK FOOTER\r\n// ./node_modules/tippy.js/esm/index.all.js\r\n// module id = 41\r\n// module chunks = 0","/* eslint-disable no-undefined,no-param-reassign,no-shadow */\r\n\r\n/**\r\n * Throttle execution of a function. Especially useful for rate limiting\r\n * execution of handlers on events like resize and scroll.\r\n *\r\n * @param {Number} delay A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\r\n * @param {Boolean} [noTrailing] Optional, defaults to false. If noTrailing is true, callback will only execute every `delay` milliseconds while the\r\n * throttled-function is being called. If noTrailing is false or unspecified, callback will be executed one final time\r\n * after the last throttled-function call. (After the throttled-function has not been called for `delay` milliseconds,\r\n * the internal counter is reset)\r\n * @param {Function} callback A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\r\n * to `callback` when the throttled-function is executed.\r\n * @param {Boolean} [debounceMode] If `debounceMode` is true (at begin), schedule `clear` to execute after `delay` ms. If `debounceMode` is false (at end),\r\n * schedule `callback` to execute after `delay` ms.\r\n *\r\n * @return {Function} A new, throttled, function.\r\n */\r\nfunction throttle (delay, noTrailing, callback, debounceMode) {\r\n /*\r\n * After wrapper has stopped being called, this timeout ensures that\r\n * `callback` is executed at the proper times in `throttle` and `end`\r\n * debounce modes.\r\n */\r\n var timeoutID;\r\n var cancelled = false; // Keep track of the last time `callback` was executed.\r\n\r\n var lastExec = 0; // Function to clear existing timeout\r\n\r\n function clearExistingTimeout() {\r\n if (timeoutID) {\r\n clearTimeout(timeoutID);\r\n }\r\n } // Function to cancel next exec\r\n\r\n\r\n function cancel() {\r\n clearExistingTimeout();\r\n cancelled = true;\r\n } // `noTrailing` defaults to falsy.\r\n\r\n\r\n if (typeof noTrailing !== 'boolean') {\r\n debounceMode = callback;\r\n callback = noTrailing;\r\n noTrailing = undefined;\r\n }\r\n /*\r\n * The `wrapper` function encapsulates all of the throttling / debouncing\r\n * functionality and when executed will limit the rate at which `callback`\r\n * is executed.\r\n */\r\n\r\n\r\n function wrapper() {\r\n var self = this;\r\n var elapsed = Date.now() - lastExec;\r\n var args = arguments;\r\n\r\n if (cancelled) {\r\n return;\r\n } // Execute `callback` and update the `lastExec` timestamp.\r\n\r\n\r\n function exec() {\r\n lastExec = Date.now();\r\n callback.apply(self, args);\r\n }\r\n /*\r\n * If `debounceMode` is true (at begin) this is used to clear the flag\r\n * to allow future `callback` executions.\r\n */\r\n\r\n\r\n function clear() {\r\n timeoutID = undefined;\r\n }\r\n\r\n if (debounceMode && !timeoutID) {\r\n /*\r\n * Since `wrapper` is being called for the first time and\r\n * `debounceMode` is true (at begin), execute `callback`.\r\n */\r\n exec();\r\n }\r\n\r\n clearExistingTimeout();\r\n\r\n if (debounceMode === undefined && elapsed > delay) {\r\n /*\r\n * In throttle mode, if `delay` time has been exceeded, execute\r\n * `callback`.\r\n */\r\n exec();\r\n } else if (noTrailing !== true) {\r\n /*\r\n * In trailing throttle mode, since `delay` time has not been\r\n * exceeded, schedule `callback` to execute `delay` ms after most\r\n * recent execution.\r\n *\r\n * If `debounceMode` is true (at begin), schedule `clear` to execute\r\n * after `delay` ms.\r\n *\r\n * If `debounceMode` is false (at end), schedule `callback` to\r\n * execute after `delay` ms.\r\n */\r\n timeoutID = setTimeout(debounceMode ? clear : exec, debounceMode === undefined ? delay - elapsed : delay);\r\n }\r\n }\r\n\r\n wrapper.cancel = cancel; // Return the wrapper function.\r\n\r\n return wrapper;\r\n}\r\n\r\n/* eslint-disable no-undefined */\r\n/**\r\n * Debounce execution of a function. Debouncing, unlike throttling,\r\n * guarantees that a function is only executed a single time, either at the\r\n * very beginning of a series of calls, or at the very end.\r\n *\r\n * @param {Number} delay A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\r\n * @param {Boolean} [atBegin] Optional, defaults to false. If atBegin is false or unspecified, callback will only be executed `delay` milliseconds\r\n * after the last debounced-function call. If atBegin is true, callback will be executed only at the first debounced-function call.\r\n * (After the throttled-function has not been called for `delay` milliseconds, the internal counter is reset).\r\n * @param {Function} callback A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\r\n * to `callback` when the debounced-function is executed.\r\n *\r\n * @return {Function} A new, debounced function.\r\n */\r\n\r\nfunction debounce (delay, atBegin, callback) {\r\n return callback === undefined ? throttle(delay, atBegin, false) : throttle(delay, callback, atBegin !== false);\r\n}\r\n\r\nexport { throttle, debounce };\r\n\r\n\r\n\r\n//////////////////\r\n// WEBPACK FOOTER\r\n// ./node_modules/throttle-debounce/dist/index.esm.js\r\n// module id = 5\r\n// module chunks = 0","import tippy from './tippy.js';\r\nimport { debounce } from './throttle-debounce';\r\nimport scss from 'scss';\r\n\r\nexport default class Tooltips {\r\n constructor() {\r\n this.dom = {\r\n $: window.$,\r\n jQuery: window.$,\r\n $window: $(window),\r\n $body: $('body'),\r\n $trigger: $('.tooltip-trigger')\r\n };\r\n\r\n this.instances = [];\r\n\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.appendTooltips();\r\n this.events();\r\n this.onResizeCallback();\r\n }\r\n\r\n appendTooltips() {\r\n this.dom.$trigger.each((_, tt) => {\r\n let instance = tippy(tt, {\r\n trigger: ($(tt).data('trigger') || 'mouseenter'),\r\n theme: 'light-border',\r\n placement: 'top',\r\n arrow: true,\r\n offset: '0, 0',\r\n content: this.getHtml(tt),\r\n delay: 100,\r\n async onShow(instance) {\r\n if ($('.tooltip-trigger.tippy-active').length > 0) $('.tooltip-trigger.tippy-active')[0]._tippy.hide();\r\n }\r\n });\r\n\r\n this.instances.push(instance);\r\n });\r\n }\r\n\r\n getHtml(item) {\r\n let $layout = $('
').attr({\r\n class: 'tooltip-content'\r\n }).html(`\r\n X\r\n
${$(item).data('content')}
\r\n `);\r\n\r\n return $layout[0];\r\n }\r\n\r\n onResizeCallback() {\r\n this.instances.forEach((instance) => {\r\n if ($('.spike').length == 0 && this.dom.$window.width() < parseInt(scss['$very-lg'])) {\r\n instance.set({\r\n placement: 'right',\r\n offset: '10, 20'\r\n });\r\n }\r\n });\r\n }\r\n\r\n events() {\r\n this.dom.$body.on('click', '.tooltip-close', (e) => {\r\n e.preventDefault();\r\n if ($('.tooltip-trigger.tippy-active').length > 0) $('.tooltip-trigger.tippy-active')[0]._tippy.hide();\r\n });\r\n\r\n this.dom.$window.on('resize', debounce(200, this.onResizeCallback.bind(this)));\r\n }\r\n}\r\n","import CalcManager from './lib/calc-manager';\r\nimport Tooltips from './lib/tooltips';\r\n\r\nclass App {\r\n constructor() {\r\n this.dom = {\r\n $: window.$,\r\n $window: $(window),\r\n $calc: $('.calc')\r\n };\r\n\r\n if (this.dom.$calc.length) {\r\n this.init();\r\n }\r\n }\r\n\r\n init() {\r\n this.dom.$calc.each((calcId, calcObj) => new CalcManager(calcObj));\r\n new Tooltips();\r\n }\r\n}\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => new App());"],"sourceRoot":""}